Version 1.4.0-dev.0.0

svn merge -r 34408:34866 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@34920 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/.gitignore b/.gitignore
index 9590c6e..a5e796f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -65,7 +65,6 @@
 # Generated files.
 tools/out
 tools/xcodebuild
-pkg/shadow_dom/tool/node_modules
 editor/util/testing/mac/CodeLab.suite/Results
 editor/util/testing/mac/DartEditor.suite/Results
-editor/util/testing/mac/Samples.suite/Results
\ No newline at end of file
+editor/util/testing/mac/Samples.suite/Results
diff --git a/AUTHORS b/AUTHORS
index f89a112..dc0e928 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -27,4 +27,5 @@
 Nikolaus Graf <nik@blossom.io>
 Alexandre Ardhuin <alexandre.ardhuin@gmail.com>
 Victor Berchet <victor.berchet@gmail.com>
-Roel Spilker <r.spilker@gmail.com>
\ No newline at end of file
+Roel Spilker <r.spilker@gmail.com>
+Martin Charles <martincharles07@gmail.com>
\ No newline at end of file
diff --git a/create_sdk.gyp b/create_sdk.gyp
new file mode 100644
index 0000000..d12715e
--- /dev/null
+++ b/create_sdk.gyp
@@ -0,0 +1,48 @@
+# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+{
+  'targets': [
+    {
+      'target_name': 'create_sdk_internal',
+      'type': 'none',
+      'dependencies': [
+        'runtime/dart-runtime.gyp:dart',
+        'utils/compiler/compiler.gyp:dart2js',
+        'utils/pub/pub.gyp:pub',
+        'utils/dartfmt/dartfmt.gyp:dartfmt',
+        'editor/analyzer.gyp:analyzer',
+      ],
+      'actions': [
+        {
+          'action_name': 'create_sdk_py',
+          'inputs': [
+            '<!@(["python", "tools/list_files.py", "\\.dart$", "sdk/lib"])',
+            '<!@(["python", "tools/list_files.py", "", '
+                '"sdk/lib/_internal/lib/preambles"])',
+            '<!@(["python", "tools/list_files.py", "", "sdk/bin"])',
+            'tools/create_sdk.py',
+            '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
+            '<(SHARED_INTERMEDIATE_DIR)/dart2js.dart.snapshot',
+            '<(SHARED_INTERMEDIATE_DIR)/utils_wrapper.dart.snapshot',
+            '<(SHARED_INTERMEDIATE_DIR)/pub.dart.snapshot',
+            '<(PRODUCT_DIR)/dartanalyzer/dartanalyzer.jar',
+            '<(SHARED_INTERMEDIATE_DIR)/dartfmt.dart.snapshot',
+            'tools/VERSION'
+          ],
+          'outputs': [
+            '<(PRODUCT_DIR)/dart-sdk/README',
+          ],
+          'action': [
+            'python',
+            'tools/create_sdk.py',
+            '--sdk_output_dir', '<(PRODUCT_DIR)/dart-sdk',
+            '--snapshot_location', '<(SHARED_INTERMEDIATE_DIR)/'
+          ],
+          'message': 'Creating SDK.',
+        },
+      ],
+    },
+  ],
+}
diff --git a/dart.gyp b/dart.gyp
index 6723ce4..b34ab6b 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -37,40 +37,7 @@
       'target_name': 'create_sdk',
       'type': 'none',
       'dependencies': [
-        'runtime/dart-runtime.gyp:dart',
-        'utils/compiler/compiler.gyp:dart2js',
-        'utils/pub/pub.gyp:pub',
-        'dartfmt',
-        'analyzer',
-      ],
-      'actions': [
-        {
-          'action_name': 'create_sdk_py',
-          'inputs': [
-            '<!@(["python", "tools/list_files.py", "\\.dart$", "sdk/lib"])',
-            '<!@(["python", "tools/list_files.py", "", '
-                '"sdk/lib/_internal/lib/preambles"])',
-            '<!@(["python", "tools/list_files.py", "", "sdk/bin"])',
-            'tools/create_sdk.py',
-            '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
-            '<(SHARED_INTERMEDIATE_DIR)/dart2js.dart.snapshot',
-            '<(SHARED_INTERMEDIATE_DIR)/utils_wrapper.dart.snapshot',
-            '<(SHARED_INTERMEDIATE_DIR)/pub.dart.snapshot',
-            '<(PRODUCT_DIR)/dartanalyzer/dartanalyzer.jar',
-            '<(SHARED_INTERMEDIATE_DIR)/dartfmt.dart.snapshot',
-            'tools/VERSION'
-          ],
-          'outputs': [
-            '<(PRODUCT_DIR)/dart-sdk/README',
-          ],
-          'action': [
-            'python',
-            'tools/create_sdk.py',
-            '--sdk_output_dir', '<(PRODUCT_DIR)/dart-sdk',
-            '--snapshot_location', '<(SHARED_INTERMEDIATE_DIR)/'
-          ],
-          'message': 'Creating SDK.',
-        },
+        'create_sdk.gyp:create_sdk_internal',
       ],
     },
     {
@@ -125,6 +92,7 @@
       'dependencies': [
         'create_sdk',
         'packages',
+        'try',
       ],
     },
     {
@@ -140,8 +108,8 @@
       'dependencies': [
         'editor/build/generated/editor_deps.gyp:editor_deps',
 
-        # This dependency on create_sdk does not mean that the Editor
-        # is rebuilt if the SDK is. It only means that when you build
+        # This dependency on create_sdk does not mean that the
+        # Editor is rebuilt if the SDK is. It only means that when you build
         # the Editor, you should also build the SDK. If we wanted to
         # make sure that the editor is rebuilt when the SDK is, we
         # should list a *file* in PRODUCT_DIR which the action below
@@ -157,7 +125,8 @@
           'inputs': [
             'tools/create_editor.py',
             '<(SHARED_INTERMEDIATE_DIR)/editor_deps/editor.stamp',
-            '<!@(["python", "tools/list_files.py", "", "editor/tools/features/com.google.dart.tools.deploy.feature_releng"])',
+            '<!@(["python", "tools/list_files.py", "", "editor/tools/features/'
+            'com.google.dart.tools.deploy.feature_releng"])',
           ],
           'outputs': [
             '<(PRODUCT_DIR)/editor/VERSION',
@@ -196,7 +165,6 @@
       'target_name': 'try',
       'type': 'none',
       'dependencies': [
-        'create_sdk',
         'site/try/build_try.gyp:try_site',
       ],
     },
diff --git a/pkg/analysis_server/lib/http_server.dart b/pkg/analysis_server/lib/http_server.dart
index 029dc13..fb88f79 100644
--- a/pkg/analysis_server/lib/http_server.dart
+++ b/pkg/analysis_server/lib/http_server.dart
@@ -16,7 +16,7 @@
 /**
  * Instances of the class [HttpServer] implement a simple HTTP server. The
  * primary responsibility of this server is to listen for an UPGRADE request and
- * to start an analysis server
+ * to start an analysis server.
  */
 class HttpAnalysisServer {
   /**
diff --git a/pkg/analysis_server/lib/src/analysis_logger.dart b/pkg/analysis_server/lib/src/analysis_logger.dart
index 7245fde..8700cf3 100644
--- a/pkg/analysis_server/lib/src/analysis_logger.dart
+++ b/pkg/analysis_server/lib/src/analysis_logger.dart
@@ -28,11 +28,6 @@
   }
 
   @override
-  void logError3(Exception exception) {
-    baseLogger.severe("Exception", exception);
-  }
-
-  @override
   void logInformation(String message) {
     baseLogger.info(message);
   }
@@ -41,9 +36,4 @@
   void logInformation2(String message, Exception exception) {
     baseLogger.info(message, exception);
   }
-
-  @override
-  void logInformation3(String message, Exception exception) {
-    baseLogger.info(message, exception);
-  }
 }
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index afd6aff..1c9004f 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -66,8 +66,7 @@
   AnalysisServer(this.channel) {
     AnalysisEngine.instance.logger = new AnalysisLogger();
     running = true;
-    // TODO set running=false on done or error
-    channel.listen(handleRequest);
+    channel.listen(handleRequest, onDone: done, onError: error);
   }
 
   /**
@@ -92,7 +91,7 @@
    * There was an error related to the socket from which requests are being
    * read.
    */
-  void error() {
+  void error(argument) {
     running = false;
   }
 
@@ -102,9 +101,14 @@
   void handleRequest(Request request) {
     int count = handlers.length;
     for (int i = 0; i < count; i++) {
-      Response response = handlers[i].handleRequest(request);
-      if (response != null) {
-        channel.sendResponse(response);
+      try {
+        Response response = handlers[i].handleRequest(request);
+        if (response != null) {
+          channel.sendResponse(response);
+          return;
+        }
+      } on RequestFailure catch (exception) {
+        channel.sendResponse(exception.response);
         return;
       }
     }
diff --git a/pkg/analysis_server/lib/src/channel.dart b/pkg/analysis_server/lib/src/channel.dart
index 7fcaa12..6d60abd 100644
--- a/pkg/analysis_server/lib/src/channel.dart
+++ b/pkg/analysis_server/lib/src/channel.dart
@@ -12,11 +12,10 @@
 
 /**
  * The abstract class [ClientCommunicationChannel] defines the behavior of
- * objects that allows an object to send [Request]s to [AnalysisServer] and to
+ * objects that allow a client to send [Request]s to an [AnalysisServer] and to
  * receive both [Response]s and [Notification]s.
  */
 abstract class ClientCommunicationChannel {
-
   /**
    * The stream of notifications from the server.
    */
@@ -53,7 +52,7 @@
    * client, invoke the [onDone] function.
    * Only one listener is allowed per channel.
    */
-  void listen(void onRequest(Request request), {void onError(), void onDone()});
+  void listen(void onRequest(Request request), {Function onError, void onDone()});
 
   /**
    * Send the given [notification] to the client.
@@ -75,7 +74,7 @@
   /**
    * The socket being wrapped.
    */
-  final WebSocket _socket;
+  final WebSocket socket;
 
   @override
   Stream<Response> responseStream;
@@ -84,34 +83,34 @@
   Stream<Notification> notificationStream;
 
   /**
-   * Initialize a new [WebSocket] wrapper for the given [_socket].
+   * Initialize a new [WebSocket] wrapper for the given [socket].
    */
-  WebSocketClientChannel(this._socket) {
-    Stream jsonStream = _socket
+  WebSocketClientChannel(this.socket) {
+    Stream jsonStream = socket
         .where((data) => data is String)
-        .transform(new _JsonStreamDecoder())
+        .transform(new JsonStreamDecoder())
         .where((json) => json is Map)
         .asBroadcastStream();
     responseStream = jsonStream
         .where((json) => json[Notification.EVENT] == null)
-        .transform(new _ResponseConverter())
+        .transform(new ResponseConverter())
         .asBroadcastStream();
     notificationStream = jsonStream
         .where((json) => json[Notification.EVENT] != null)
-        .transform(new _NotificationConverter())
+        .transform(new NotificationConverter())
         .asBroadcastStream();
   }
 
   @override
   Future<Response> sendRequest(Request request) {
     String id = request.id;
-    _socket.add(JSON.encode(request.toJson()));
+    socket.add(JSON.encode(request.toJson()));
     return responseStream.firstWhere((Response response) => response.id == id);
   }
 
   @override
   Future close() {
-    return _socket.close();
+    return socket.close();
   }
 }
 
@@ -133,7 +132,7 @@
 
   @override
   void listen(void onRequest(Request request), {void onError(), void onDone()}) {
-    socket.listen((data) => _readRequest(data, onRequest), onError: onError,
+    socket.listen((data) => readRequest(data, onRequest), onError: onError,
         onDone: onDone);
   }
 
@@ -151,11 +150,7 @@
    * Read a request from the given [data] and use the given function to handle
    * the request.
    */
-  void _readRequest(Object data, void onRequest(Request request)) {
-    if (data is List<int>) {
-      sendResponse(new Response.invalidRequestFormat());
-      return;
-    }
+  void readRequest(Object data, void onRequest(Request request)) {
     if (data is String) {
       // Parse the string as a JSON descriptor and process the resulting
       // structure as a request.
@@ -165,66 +160,92 @@
         return;
       }
       onRequest(request);
+    } else if (data is List<int>) {
+      // TODO(brianwilkerson) Implement a more efficient protocol.
+      sendResponse(new Response.invalidRequestFormat());
+    } else {
+      sendResponse(new Response.invalidRequestFormat());
     }
   }
 }
 
 /**
- * Instances of [_JsonStreamDecoder] convert JSON strings to JSON maps
+ * Instances of the class [JsonStreamDecoder] convert JSON strings to JSON
+ * maps.
  */
-class _JsonStreamDecoder extends Converter<String, Map> {
-
+class JsonStreamDecoder extends Converter<String, Map> {
   @override
   Map convert(String text) => JSON.decode(text);
 
   @override
   ChunkedConversionSink startChunkedConversion(Sink sink) =>
-      new _ChannelChunkSink<String, Map>(this, sink);
+      new ChannelChunkSink<String, Map>(this, sink);
 }
 
 /**
- * Instances of [_ResponseConverter] convert JSON maps to [Response]s.
+ * Instances of the class [ResponseConverter] convert JSON maps to [Response]s.
  */
-class _ResponseConverter extends Converter<Map, Response> {
-
+class ResponseConverter extends Converter<Map, Response> {
   @override
   Response convert(Map json) => new Response.fromJson(json);
 
   @override
   ChunkedConversionSink startChunkedConversion(Sink sink) =>
-      new _ChannelChunkSink<Map, Response>(this, sink);
+      new ChannelChunkSink<Map, Response>(this, sink);
 }
 
 /**
- * Instances of [_NotificationConverter] convert JSON maps to [Notification]s.
+ * Instances of the class [NotificationConverter] convert JSON maps to
+ * [Notification]s.
  */
-class _NotificationConverter extends Converter<Map, Notification> {
-
+class NotificationConverter extends Converter<Map, Notification> {
   @override
   Notification convert(Map json) => new Notification.fromJson(json);
 
   @override
   ChunkedConversionSink startChunkedConversion(Sink sink) =>
-      new _ChannelChunkSink<Map, Notification>(this, sink);
+      new ChannelChunkSink<Map, Notification>(this, sink);
 }
 
 /**
- * A [_ChannelChunkSink] uses a [Converter] to translate chunks.
+ * Instances of the class [ChannelChunkSink] uses a [Converter] to translate
+ * chunks.
  */
-class _ChannelChunkSink<S, T> extends ChunkedConversionSink<S> {
-  final Converter<S, T> _converter;
-  final Sink _sink;
+class ChannelChunkSink<S, T> extends ChunkedConversionSink<S> {
+  /**
+   * The converter used to translate chunks.
+   */
+  final Converter<S, T> converter;
 
-  _ChannelChunkSink(this._converter, this._sink);
+  /**
+   * The sink to which the converted chunks are added.
+   */
+  final Sink sink;
+
+  /**
+   * A flag indicating whether the sink has been closed.
+   */
+  bool closed = false;
+
+  /**
+   * Initialize a newly create sink to use the given [converter] to convert
+   * chunks before adding them to the given [sink].
+   */
+  ChannelChunkSink(this.converter, this.sink);
 
   @override
   void add(S chunk) {
-    var convertedChunk = _converter.convert(chunk);
-    if (convertedChunk != null) {
-      _sink.add(convertedChunk);
+    if (!closed) {
+      T convertedChunk = converter.convert(chunk);
+      if (convertedChunk != null) {
+        sink.add(convertedChunk);
+      }
     }
   }
 
   @override
-  void close() => _sink.close();
+  void close() {
+    closed = true;
+    sink.close();
+  }
 }
diff --git a/pkg/analysis_server/lib/src/domain_context.dart b/pkg/analysis_server/lib/src/domain_context.dart
index acadd6f..0fc8759 100644
--- a/pkg/analysis_server/lib/src/domain_context.dart
+++ b/pkg/analysis_server/lib/src/domain_context.dart
@@ -20,6 +20,11 @@
   static const String APPLY_CHANGES_NAME = 'context.applyChanges';
 
   /**
+   * The name of the context.getFixes request.
+   */
+  static const String GET_FIXES_NAME = 'context.getFixes';
+
+  /**
    * The name of the context.setOptions request.
    */
   static const String SET_OPTIONS_NAME = 'context.setOptions';
@@ -30,6 +35,11 @@
   static const String SET_PRIORITY_SOURCES_NAME = 'context.setPrioritySources';
 
   /**
+   * The name of the added parameter.
+   */
+  static const String ADDED_PARAM = "added";
+
+  /**
    * The name of the changes parameter.
    */
   static const String CHANGES_PARAM = 'changes';
@@ -40,11 +50,21 @@
   static const String CONTEXT_ID_PARAM = 'contextId';
 
   /**
+   * The name of the modified parameter.
+   */
+  static const String MODIFIED_PARAM = "modified";
+
+  /**
    * The name of the options parameter.
    */
   static const String OPTIONS_PARAM = 'options';
 
   /**
+   * The name of the removed parameter.
+   */
+  static const String REMOVED_PARAM = "removed";
+
+  /**
    * The name of the sources parameter.
    */
   static const String SOURCES_PARAM = 'sources';
@@ -95,6 +115,8 @@
       String requestName = request.method;
       if (requestName == APPLY_CHANGES_NAME) {
         return applyChanges(request);
+      } else if (requestName == GET_FIXES_NAME) {
+        return getFixes(request);
       } else if (requestName == SET_OPTIONS_NAME) {
         return setOptions(request);
       } else if (requestName == SET_PRIORITY_SOURCES_NAME) {
@@ -114,7 +136,10 @@
   Response applyChanges(Request request) {
     AnalysisContext context = getAnalysisContext(request);
     Map<String, Object> changesData = request.getRequiredParameter(CHANGES_PARAM);
-    ChangeSet changeSet = createChangeSet(changesData);
+    ChangeSet changeSet = createChangeSet(
+        request,
+        context.sourceFactory,
+        changesData);
 
     context.applyChanges(changeSet);
     Response response = new Response(request.id);
@@ -122,11 +147,44 @@
   }
 
   /**
-   * Convert the given JSON object into a [ChangeSet].
+   * Convert the given JSON object into a [ChangeSet], using the given
+   * [sourceFactory] to convert the embedded strings into sources.
    */
-  ChangeSet createChangeSet(Map<String, Object> jsonData) {
+  ChangeSet createChangeSet(Request request, SourceFactory sourceFactory, Map<String, Object> jsonData) {
+    ChangeSet changeSet = new ChangeSet();
+    convertSources(request, sourceFactory, jsonData[ADDED_PARAM], (Source source) {
+      changeSet.addedSource(source);
+    });
+    convertSources(request, sourceFactory, jsonData[MODIFIED_PARAM], (Source source) {
+      changeSet.changedSource(source);
+    });
+    convertSources(request, sourceFactory, jsonData[REMOVED_PARAM], (Source source) {
+      changeSet.removedSource(source);
+    });
+    return changeSet;
+  }
+
+  /**
+   * If the given [sources] is a list of strings, use the given [sourceFactory]
+   * to convert each string into a source and pass the source to the given
+   * [handler]. Otherwise, throw an exception indicating that the data in the
+   * request was not valid.
+   */
+  void convertSources(Request request, SourceFactory sourceFactory, Object sources, void handler(Source source)) {
+    if (sources is! List<String>) {
+      throw new RequestFailure(new Response(request.id, new RequestError(1, 'Invalid sources')));
+    }
+    convertToSources(sourceFactory, sources).forEach(handler);
+  }
+
+  /**
+   * Return the list of fixes that are available for problems related to the
+   * given error in the specified context.
+   */
+  Response getFixes(Request request) {
     // TODO(brianwilkerson) Implement this.
-    return new ChangeSet();
+    Response response = new Response(request.id);
+    return response;
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/get_handler.dart b/pkg/analysis_server/lib/src/get_handler.dart
index 18a7d74..c93e9bb 100644
--- a/pkg/analysis_server/lib/src/get_handler.dart
+++ b/pkg/analysis_server/lib/src/get_handler.dart
@@ -1,3 +1,7 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 library get.handler;
 
 import 'dart:io';
@@ -7,7 +11,7 @@
 import 'package:analysis_server/src/analysis_server.dart';
 
 /**
- * Instances of the class [GetHandler] handle GET requests
+ * Instances of the class [GetHandler] handle GET requests.
  */
 class GetHandler {
   /**
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index 8fbec36..4b5a561 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -225,7 +225,7 @@
    * by a [request] that was expected to have a boolean-valued parameter but was
    * passed a non-boolean value.
    */
-  Response.expectedBoolean(Request request, String value)
+  Response.expectedBoolean(Request request, Object value)
     : this(request.id, new RequestError(-2, 'Expected a boolean value, but found "$value"'));
 
   /**
@@ -233,7 +233,7 @@
    * by a [request] that was expected to have a integer-valued parameter but was
    * passed a non-integer value.
    */
-  Response.expectedInteger(Request request, String value)
+  Response.expectedInteger(Request request, Object value)
     : this(request.id, new RequestError(-3, 'Expected an integer value, but found "$value"'));
 
   /**
@@ -327,8 +327,8 @@
 }
 
 /**
- * Instances of the class [RequestError] represent information about an error that
- * occurred while attempting to respond to a [Request].
+ * Instances of the class [RequestError] represent information about an error
+ * that occurred while attempting to respond to a [Request].
  */
 class RequestError {
   /**
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index e08a525..5af2c46 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -10,4 +10,4 @@
   args: any
   logging: any
 dev_dependencies:
-  unittest: any
+  unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index d0ebe75..d1cc597 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -9,12 +9,11 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:unittest/matcher.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
 
-main(List<String> args) {
+main() {
   group('AnalysisServer', () {
     setUp(AnalysisServerTest.setUp);
 //    test('createContext', AnalysisServerTest.createContext);
diff --git a/pkg/analysis_server/test/channel_test.dart b/pkg/analysis_server/test/channel_test.dart
index 95a34b7..6d58887 100644
--- a/pkg/analysis_server/test/channel_test.dart
+++ b/pkg/analysis_server/test/channel_test.dart
@@ -8,7 +8,6 @@
 
 import 'package:analysis_server/src/channel.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:unittest/matcher.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
diff --git a/pkg/analysis_server/test/domain_context_test.dart b/pkg/analysis_server/test/domain_context_test.dart
index 953f8eb..c66856e 100644
--- a/pkg/analysis_server/test/domain_context_test.dart
+++ b/pkg/analysis_server/test/domain_context_test.dart
@@ -5,11 +5,12 @@
 library test.domain.context;
 
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_context.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:unittest/matcher.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
@@ -17,6 +18,7 @@
 main() {
   group('ContextDomainHandlerTest', () {
     test('applyChanges', ContextDomainHandlerTest.applyChanges);
+    test('createChangeSet', ContextDomainHandlerTest.createChangeSet);
     test('setOptions', ContextDomainHandlerTest.setOptions);
     test('setPrioritySources_empty', ContextDomainHandlerTest.setPrioritySources_empty);
     test('setPrioritySources_nonEmpty', ContextDomainHandlerTest.setPrioritySources_nonEmpty);
@@ -32,9 +34,11 @@
 
     Request request = new Request('0', ContextDomainHandler.APPLY_CHANGES_NAME);
     request.setParameter(ContextDomainHandler.CONTEXT_ID_PARAM, contextId);
-    // TODO (danrubel) convert ChangeSet to Map
-//    request.setParameter(ContextDomainHandler.CHANGES_PARAM, changeSet);
-    request.setParameter(ContextDomainHandler.CHANGES_PARAM, new Map());
+    request.setParameter(ContextDomainHandler.CHANGES_PARAM, {
+      ContextDomainHandler.ADDED_PARAM : ['ffile:/one.dart'],
+      ContextDomainHandler.MODIFIED_PARAM : ['ffile:/two.dart'],
+      ContextDomainHandler.REMOVED_PARAM : ['ffile:/three.dart']
+    });
     Response response = handler.handleRequest(request);
     expect(response.toJson(), equals({
       Response.ID: '0',
@@ -42,6 +46,21 @@
     }));
   }
 
+  static void createChangeSet() {
+    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+    Request request = new Request('0', ContextDomainHandler.APPLY_CHANGES_NAME);
+    ContextDomainHandler handler = new ContextDomainHandler(server);
+    SourceFactory sourceFactory = new SourceFactory([new FileUriResolver()]);
+    ChangeSet changeSet = handler.createChangeSet(request, sourceFactory, {
+      ContextDomainHandler.ADDED_PARAM : ['ffile:/one.dart'],
+      ContextDomainHandler.MODIFIED_PARAM : [],
+      ContextDomainHandler.REMOVED_PARAM : ['ffile:/two.dart', 'ffile:/three.dart']
+    });
+    expect(changeSet.addedSources, hasLength(equals(1)));
+    expect(changeSet.changedSources, hasLength(equals(0)));
+    expect(changeSet.removedSources, hasLength(equals(2)));
+  }
+
   static void setOptions() {
     AnalysisServer server = new AnalysisServer(new MockServerChannel());
     String contextId = _createContext(server);
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index b1e3d23..84e290c 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -7,7 +7,6 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:unittest/matcher.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index d9cfbcc..f6e6452 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -7,10 +7,12 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel.dart';
 import 'package:analysis_server/src/protocol.dart';
-import 'package:unittest/matcher.dart';
+import 'package:matcher/matcher.dart';
 
 /**
  * Answer the absolute path the the SDK relative to the currently running
@@ -82,7 +84,7 @@
   }
 
   @override
-  void listen(void onRequest(Request request), {void onError(), void onDone()}) {
+  void listen(void onRequest(Request request), {Function onError, void onDone()}) {
     requestController.stream.listen(onRequest, onError: onError, onDone: onDone);
   }
 
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index ae5eac9..6597f11 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -4,11 +4,11 @@
 
 library test.protocol;
 
-import 'package:analysis_server/src/protocol.dart';
-import 'package:unittest/matcher.dart';
-import 'package:unittest/unittest.dart';
 import 'dart:convert';
 
+import 'package:analysis_server/src/protocol.dart';
+import 'package:unittest/unittest.dart';
+
 main() {
   group('Notification', () {
     test('getParameter_defined', NotificationTest.getParameter_defined);
@@ -26,13 +26,26 @@
     test('fromJson_invalidMethod', RequestTest.fromJson_invalidMethod);
     test('fromJson_invalidParams', RequestTest.fromJson_invalidParams);
     test('fromJson_withParams', RequestTest.fromJson_withParams);
+    test('toBool', RequestTest.toBool);
+    test('toInt', RequestTest.toInt);
     test('toJson', RequestTest.toJson);
     test('toJson_withParams', RequestTest.toJson_withParams);
   });
+  group('RequestError', () {
+    test('create', RequestErrorTest.create);
+    test('create_methodNotFound', RequestErrorTest.create_methodNotFound);
+    test('create_invalidParameters', RequestErrorTest.create_invalidParameters);
+    test('create_invalidRequest', RequestErrorTest.create_invalidRequest);
+    test('create_internalError', RequestErrorTest.create_internalError);
+    test('create_parseError', RequestErrorTest.create_parseError);
+    test('fromJson', RequestErrorTest.fromJson);
+    test('toJson', RequestErrorTest.toJson);
+  });
   group('Response', () {
     test('create_contextDoesNotExist', ResponseTest.create_contextDoesNotExist);
     test('create_invalidRequestFormat', ResponseTest.create_invalidRequestFormat);
     test('create_missingRequiredParameter', ResponseTest.create_missingRequiredParameter);
+    test('create_unknownAnalysisOption', ResponseTest.create_unknownAnalysisOption);
     test('create_unknownRequest', ResponseTest.create_unknownRequest);
     test('setResult', ResponseTest.setResult);
     test('fromJson', ResponseTest.fromJson);
@@ -108,7 +121,7 @@
   static void getRequiredParameter_undefined() {
     String name = 'name';
     Request request = new Request('0', '');
-    expect(() => request.getRequiredParameter(name), throwsA(new isInstanceOf<RequestFailure>()));
+    expect(() => request.getRequiredParameter(name), _throwsRequestFailure);
   }
 
   static void fromJson() {
@@ -147,6 +160,24 @@
     expect(request.getParameter('foo'), equals('bar'));
   }
 
+  static void toBool() {
+    Request request = new Request('0', '');
+    expect(request.toBool(true), isTrue);
+    expect(request.toBool(false), isFalse);
+    expect(request.toBool('true'), isTrue);
+    expect(request.toBool('false'), isFalse);
+    expect(request.toBool('abc'), isFalse);
+    expect(() => request.toBool(42), _throwsRequestFailure);
+  }
+
+  static void toInt() {
+    Request request = new Request('0', '');
+    expect(request.toInt(1), equals(1));
+    expect(request.toInt('2'), equals(2));
+    expect(() => request.toInt('xxx'), _throwsRequestFailure);
+    expect(() => request.toInt(request), _throwsRequestFailure);
+  }
+
   static void toJson() {
     Request request = new Request('one', 'aMethod');
     expect(request.toJson(), equals({
@@ -166,6 +197,72 @@
   }
 }
 
+class RequestErrorTest {
+  static void create() {
+    RequestError error = new RequestError(42, 'msg');
+    expect(error.code, 42);
+    expect(error.message, "msg");
+    expect(error.toJson(), equals({
+      RequestError.CODE: 42,
+      RequestError.MESSAGE: "msg"
+    }));
+  }
+
+  static void create_parseError() {
+    RequestError error = new RequestError.parseError();
+    expect(error.code, RequestError.CODE_PARSE_ERROR);
+    expect(error.message, "Parse error");
+  }
+
+  static void create_methodNotFound() {
+    RequestError error = new RequestError.methodNotFound();
+    expect(error.code, RequestError.CODE_METHOD_NOT_FOUND);
+    expect(error.message, "Method not found");
+  }
+
+  static void create_invalidParameters() {
+    RequestError error = new RequestError.invalidParameters();
+    expect(error.code, RequestError.CODE_INVALID_PARAMS);
+    expect(error.message, "Invalid parameters");
+  }
+
+  static void create_invalidRequest() {
+    RequestError error = new RequestError.invalidRequest();
+    expect(error.code, RequestError.CODE_INVALID_REQUEST);
+    expect(error.message, "Invalid request");
+  }
+
+  static void create_internalError() {
+    RequestError error = new RequestError.internalError();
+    expect(error.code, RequestError.CODE_INTERNAL_ERROR);
+    expect(error.message, "Internal error");
+  }
+
+  static void fromJson() {
+    var json = {
+        RequestError.CODE: RequestError.CODE_PARSE_ERROR,
+        RequestError.MESSAGE: 'foo',
+        RequestError.DATA: {'ints': [1, 2, 3]}
+    };
+    RequestError error = new RequestError.fromJson(json);
+    expect(error.code, RequestError.CODE_PARSE_ERROR);
+    expect(error.message, "foo");
+    expect(error.data['ints'], [1, 2, 3]);
+    expect(error.getData('ints'), [1, 2, 3]);
+  }
+
+  static void toJson() {
+    RequestError error = new RequestError(0, 'msg');
+    error.setData('answer', 42);
+    error.setData('question', 'unknown');
+    expect(error.toJson(), {
+        RequestError.CODE: 0,
+        RequestError.MESSAGE: 'msg',
+        RequestError.DATA: {'answer': 42, 'question': 'unknown'}
+    });
+  }
+}
+
 class ResponseTest {
   static void create_contextDoesNotExist() {
     Response response = new Response.contextDoesNotExist(new Request('0', ''));
@@ -197,6 +294,16 @@
     }));
   }
 
+  static void create_unknownAnalysisOption() {
+    Response response = new Response.unknownAnalysisOption(new Request('0', ''), 'x');
+    expect(response.id, equals('0'));
+    expect(response.error, isNotNull);
+    expect(response.toJson(), equals({
+      Response.ID: '0',
+      Response.ERROR: {'code': -6, 'message': 'Unknown analysis option: "x"'}
+    }));
+  }
+
   static void create_unknownRequest() {
     Response response = new Response.unknownRequest(new Request('0', ''));
     expect(response.id, equals('0'));
@@ -212,6 +319,7 @@
     String resultValue = 'value';
     Response response = new Response('0');
     response.setResult(resultName, resultValue);
+    expect(response.getResult(resultName), same(resultValue));
     expect(response.toJson(), equals({
       Response.ID: '0',
       Response.ERROR: null,
@@ -247,3 +355,5 @@
     expect(result['foo'], equals('bar'));
   }
 }
+
+Matcher _throwsRequestFailure = throwsA(new isInstanceOf<RequestFailure>());
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
new file mode 100644
index 0000000..e9a8ad7
--- /dev/null
+++ b/pkg/analysis_server/test/test_all.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:unittest/unittest.dart';
+
+import 'analysis_server_test.dart' as analysis_server_test;
+import 'channel_test.dart' as channel_test;
+import 'domain_context_test.dart' as domain_context_test;
+import 'domain_server_test.dart' as domain_server_test;
+import 'protocol_test.dart' as protocol_test;
+
+/// Utility for manually running all tests
+main() {
+  group('analysis_server', () {
+    analysis_server_test.main();
+    channel_test.main();
+    domain_context_test.main();
+    domain_server_test.main();
+    protocol_test.main();
+  });
+}
\ No newline at end of file
diff --git a/pkg/analyzer/bin/analyzer.dart b/pkg/analyzer/bin/analyzer.dart
index d1a22d9..a9333c0 100644
--- a/pkg/analyzer/bin/analyzer.dart
+++ b/pkg/analyzer/bin/analyzer.dart
@@ -30,7 +30,6 @@
 }
 
 _runAnalyzer(CommandLineOptions options, [bool async = true]) {
-  int startTime = JavaSystem.currentTimeMillis();
   if (!options.machineFormat) {
     stdout.writeln("Analyzing ${options.sourceFiles}...");
   }
@@ -50,6 +49,23 @@
     return ErrorSeverity.ERROR;
   }
   // do analyze
+  if (options.warmPerf) {
+    int startTime = JavaSystem.currentTimeMillis();
+    AnalyzerImpl analyzer = new AnalyzerImpl(sourcePath, options, startTime);
+    analyzer.analyzeSync(printMode: 2);
+
+    for (int i = 0; i < 8; i++) {
+      startTime = JavaSystem.currentTimeMillis();
+      analyzer = new AnalyzerImpl(sourcePath, options, startTime);
+      analyzer.analyzeSync(printMode: 0);
+    }
+
+    PerformanceStatistics.reset();
+    startTime = JavaSystem.currentTimeMillis();
+    analyzer = new AnalyzerImpl(sourcePath, options, startTime);
+    return analyzer.analyzeSync();
+  }
+  int startTime = JavaSystem.currentTimeMillis();
   AnalyzerImpl analyzer = new AnalyzerImpl(sourcePath, options, startTime);
   if (async) {
     return analyzer.analyzeAsync();
diff --git a/pkg/analyzer/lib/options.dart b/pkg/analyzer/lib/options.dart
index 3aa4dd3..0922223 100644
--- a/pkg/analyzer/lib/options.dart
+++ b/pkg/analyzer/lib/options.dart
@@ -39,6 +39,9 @@
   /** Whether to show SDK warnings */
   final bool showSdkWarnings;
 
+  /** Whether to show both cold and hot performance statistics */
+  final bool warmPerf;
+
   /** Whether to treat warnings as fatal */
   final bool warningsAreFatal;
 
@@ -66,6 +69,7 @@
       perf = args['perf'],
       showPackageWarnings = args['show-package-warnings'] || args['package-warnings'],
       showSdkWarnings = args['show-sdk-warnings'] || args['warnings'],
+      warmPerf = args['warm-perf'],
       warningsAreFatal = args['fatal-warnings'],
       dartSdkPath = args['dart-sdk'],
       packageRootPath = args['package-root'],
@@ -127,6 +131,9 @@
       ..addFlag('perf',
           help: 'Show performance statistics',
           defaultsTo: false, negatable: false)
+      ..addFlag('warm-perf',
+          help: 'Show both cold and warm performance statistics',
+          defaultsTo: false, negatable: false, hide: true)
       ..addFlag('warnings', help: 'Show warnings from SDK imports',
           defaultsTo: false, negatable: false)
       ..addFlag('show-sdk-warnings', help: 'Show warnings from SDK imports (deprecated)',
diff --git a/pkg/analyzer/lib/src/analyzer_impl.dart b/pkg/analyzer/lib/src/analyzer_impl.dart
index 92f4fa8..e25cee5 100644
--- a/pkg/analyzer/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer/lib/src/analyzer_impl.dart
@@ -59,11 +59,14 @@
 
   /**
    * Treats the [sourcePath] as the top level library and analyzes it using a
-   * synchronous algorithm over the analysis engine.
+   * synchronous algorithm over the analysis engine. If [printMode] is `0`,
+   * then no error or performance information is printed. If [printMode] is `1`,
+   * then both will be printed. If [printMode] is `2`, then only performance
+   * information will be printed, and it will be marked as being for a cold VM.
    */
-  ErrorSeverity analyzeSync() {
+  ErrorSeverity analyzeSync({int printMode : 1}) {
     setupForAnalysis();
-    return _analyzeSync();
+    return _analyzeSync(printMode);
   }
 
   /**
@@ -92,8 +95,8 @@
     prepareAnalysisContext(sourceFile, librarySource);
   }
 
-  /// The sync version of analysis
-  ErrorSeverity _analyzeSync() {
+  /// The sync version of analysis.
+  ErrorSeverity _analyzeSync(int printMode) {
     // don't try to analyze parts
     if (context.computeKindOf(librarySource) == SourceKind.PART) {
       print("Only libraries can be analyzed.");
@@ -107,7 +110,11 @@
     prepareErrors();
 
     // print errors and performance numbers
-    _printErrorsAndPerf();
+    if (printMode == 1) {
+      _printErrorsAndPerf();
+    } else if (printMode == 2) {
+      _printColdPerf();
+    }
 
     // compute max severity and set exitCode
     ErrorSeverity status = maxErrorSeverity;
@@ -169,7 +176,7 @@
     formatter.formatErrors(errorInfos);
 
     // print performance numbers
-    if (options.perf) {
+    if (options.perf || options.warmPerf) {
       int totalTime = JavaSystem.currentTimeMillis() - startTime;
       int ioTime = PerformanceStatistics.io.result;
       int scanTime = PerformanceStatistics.scan.result;
@@ -192,6 +199,29 @@
    }
   }
 
+  _printColdPerf() {
+    // print cold VM performance numbers
+    int totalTime = JavaSystem.currentTimeMillis() - startTime;
+    int ioTime = PerformanceStatistics.io.result;
+    int scanTime = PerformanceStatistics.scan.result;
+    int parseTime = PerformanceStatistics.parse.result;
+    int resolveTime = PerformanceStatistics.resolve.result;
+    int errorsTime = PerformanceStatistics.errors.result;
+    int hintsTime = PerformanceStatistics.hints.result;
+    int angularTime = PerformanceStatistics.angular.result;
+    stdout.writeln("io-cold:$ioTime");
+    stdout.writeln("scan-cold:$scanTime");
+    stdout.writeln("parse-cold:$parseTime");
+    stdout.writeln("resolve-cold:$resolveTime");
+    stdout.writeln("errors-cold:$errorsTime");
+    stdout.writeln("hints-cold:$hintsTime");
+    stdout.writeln("angular-cold:$angularTime");
+    stdout.writeln("other-cold:${totalTime
+        - (ioTime + scanTime + parseTime + resolveTime + errorsTime + hintsTime
+        + angularTime)}");
+    stdout.writeln("total-cold:$totalTime");
+  }
+
   /// Returns the maximal [ErrorSeverity] of the recorded errors.
   ErrorSeverity get maxErrorSeverity {
     var status = ErrorSeverity.NONE;
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 23b04c2..52c4124 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -270,10 +270,8 @@
    * @param arguments the arguments to the constructor being invoked, or `null` if this
    *          annotation is not the invocation of a constructor
    */
-  Annotation(Token atSign, Identifier name, Token period, SimpleIdentifier constructorName, ArgumentList arguments) {
-    this.atSign = atSign;
+  Annotation(this.atSign, Identifier name, this.period, SimpleIdentifier constructorName, ArgumentList arguments) {
     this._name = becomeParentOf(name);
-    this.period = period;
     this._constructorName = becomeParentOf(constructorName);
     this._arguments = becomeParentOf(arguments);
   }
@@ -404,8 +402,7 @@
    * @param question the token representing the question mark
    * @param identifier the identifier representing the argument being tested
    */
-  ArgumentDefinitionTest(Token question, SimpleIdentifier identifier) {
-    this.question = question;
+  ArgumentDefinitionTest(this.question, SimpleIdentifier identifier) {
     this._identifier = becomeParentOf(identifier);
   }
 
@@ -775,12 +772,8 @@
    * @param rightParenthesis the right parenthesis
    * @param semicolon the semicolon terminating the statement
    */
-  AssertStatement(Token keyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Token semicolon) {
-    this.keyword = keyword;
-    this.leftParenthesis = leftParenthesis;
+  AssertStatement(this.keyword, this.leftParenthesis, Expression condition, this.rightParenthesis, this.semicolon) {
     this._condition = becomeParentOf(condition);
-    this.rightParenthesis = rightParenthesis;
-    this.semicolon = semicolon;
   }
 
   @override
@@ -859,9 +852,8 @@
    * @param operator the assignment operator being applied
    * @param rightHandSide the expression used to compute the right hand side
    */
-  AssignmentExpression(Expression leftHandSide, Token operator, Expression rightHandSide) {
+  AssignmentExpression(Expression leftHandSide, this.operator, Expression rightHandSide) {
     this._leftHandSide = becomeParentOf(leftHandSide);
-    this.operator = operator;
     this._rightHandSide = becomeParentOf(rightHandSide);
   }
 
@@ -1506,9 +1498,8 @@
    * @param operator the binary operator being applied
    * @param rightOperand the expression used to compute the right operand
    */
-  BinaryExpression(Expression leftOperand, Token operator, Expression rightOperand) {
+  BinaryExpression(Expression leftOperand, this.operator, Expression rightOperand) {
     this._leftOperand = becomeParentOf(leftOperand);
-    this.operator = operator;
     this._rightOperand = becomeParentOf(rightOperand);
   }
 
@@ -1692,11 +1683,9 @@
    * @param statements the statements contained in the block
    * @param rightBracket the right curly bracket
    */
-  Block(Token leftBracket, List<Statement> statements, Token rightBracket) {
+  Block(this.leftBracket, List<Statement> statements, this.rightBracket) {
     this._statements = new NodeList<Statement>(this);
-    this.leftBracket = leftBracket;
     this._statements.addAll(statements);
-    this.rightBracket = rightBracket;
   }
 
   @override
@@ -1801,10 +1790,7 @@
    * @param literal the token representing the literal
    * @param value the value of the literal
    */
-  BooleanLiteral(Token literal, bool value) {
-    this.literal = literal;
-    this.value = value;
-  }
+  BooleanLiteral(this.literal, this.value);
 
   @override
   accept(AstVisitor visitor) => visitor.visitBooleanLiteral(this);
@@ -1854,10 +1840,8 @@
    * @param label the label associated with the statement
    * @param semicolon the semicolon terminating the statement
    */
-  BreakStatement(Token keyword, SimpleIdentifier label, Token semicolon) {
-    this.keyword = keyword;
+  BreakStatement(this.keyword, SimpleIdentifier label, this.semicolon) {
     this._label = becomeParentOf(label);
-    this.semicolon = semicolon;
   }
 
   @override
@@ -2048,13 +2032,10 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the catch block
    */
-  CatchClause(Token onKeyword, TypeName exceptionType, Token catchKeyword, Token leftParenthesis, SimpleIdentifier exceptionParameter, Token comma, SimpleIdentifier stackTraceParameter, Token rightParenthesis, Block body) {
-    this.onKeyword = onKeyword;
+  CatchClause(this.onKeyword, TypeName exceptionType, this.catchKeyword, Token leftParenthesis, SimpleIdentifier exceptionParameter, this.comma, SimpleIdentifier stackTraceParameter, Token rightParenthesis, Block body) {
     this.exceptionType = becomeParentOf(exceptionType);
-    this.catchKeyword = catchKeyword;
     this._leftParenthesis = leftParenthesis;
     this._exceptionParameter = becomeParentOf(exceptionParameter);
-    this.comma = comma;
     this._stackTraceParameter = becomeParentOf(stackTraceParameter);
     this._rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
@@ -2251,18 +2232,14 @@
    * @param members the members defined by the class
    * @param rightBracket the right curly bracket
    */
-  ClassDeclaration(Comment comment, List<Annotation> metadata, Token abstractKeyword, Token classKeyword, SimpleIdentifier name, TypeParameterList typeParameters, ExtendsClause extendsClause, WithClause withClause, ImplementsClause implementsClause, Token leftBracket, List<ClassMember> members, Token rightBracket) : super(comment, metadata) {
+  ClassDeclaration(Comment comment, List<Annotation> metadata, this.abstractKeyword, this.classKeyword, SimpleIdentifier name, TypeParameterList typeParameters, ExtendsClause extendsClause, WithClause withClause, ImplementsClause implementsClause, this.leftBracket, List<ClassMember> members, this.rightBracket) : super(comment, metadata) {
     this._members = new NodeList<ClassMember>(this);
-    this.abstractKeyword = abstractKeyword;
-    this.classKeyword = classKeyword;
     this._name = becomeParentOf(name);
     this.typeParameters = becomeParentOf(typeParameters);
     this._extendsClause = becomeParentOf(extendsClause);
     this._withClause = becomeParentOf(withClause);
     this._implementsClause = becomeParentOf(implementsClause);
-    this.leftBracket = leftBracket;
     this._members.addAll(members);
-    this.rightBracket = rightBracket;
   }
 
   @override
@@ -2509,11 +2486,9 @@
    * @param implementsClause the implements clause for this class
    * @param semicolon the semicolon terminating the declaration
    */
-  ClassTypeAlias(Comment comment, List<Annotation> metadata, Token keyword, SimpleIdentifier name, TypeParameterList typeParameters, Token equals, Token abstractKeyword, TypeName superclass, WithClause withClause, ImplementsClause implementsClause, Token semicolon) : super(comment, metadata, keyword, semicolon) {
+  ClassTypeAlias(Comment comment, List<Annotation> metadata, Token keyword, SimpleIdentifier name, TypeParameterList typeParameters, this.equals, this.abstractKeyword, TypeName superclass, WithClause withClause, ImplementsClause implementsClause, Token semicolon) : super(comment, metadata, keyword, semicolon) {
     this._name = becomeParentOf(name);
     this._typeParameters = becomeParentOf(typeParameters);
-    this.equals = equals;
-    this.abstractKeyword = abstractKeyword;
     this._superclass = becomeParentOf(superclass);
     this._withClause = becomeParentOf(withClause);
     this._implementsClause = becomeParentOf(implementsClause);
@@ -2639,9 +2614,7 @@
    * @param keyword the keyword specifying what kind of processing is to be done on the imported
    *          names
    */
-  Combinator(Token keyword) {
-    this.keyword = keyword;
-  }
+  Combinator(this.keyword);
 
   @override
   Token get beginToken => keyword;
@@ -2704,12 +2677,12 @@
   /**
    * The tokens representing the comment.
    */
-  List<Token> tokens;
+  final List<Token> tokens;
 
   /**
    * The type of the comment.
    */
-  CommentType _type;
+  final CommentType _type;
 
   /**
    * The references embedded within the documentation comment. This list will be empty unless this
@@ -2724,10 +2697,8 @@
    * @param type the type of the comment
    * @param references the references embedded within the documentation comment
    */
-  Comment(List<Token> tokens, CommentType type, List<CommentReference> references) {
+  Comment(this.tokens, this._type, List<CommentReference> references) {
     this._references = new NodeList<CommentReference>(this);
-    this.tokens = tokens;
-    this._type = type;
     this._references.addAll(references);
   }
 
@@ -2752,21 +2723,21 @@
    *
    * @return `true` if this is a block comment
    */
-  bool get isBlock => identical(_type, CommentType.BLOCK);
+  bool get isBlock => _type == CommentType.BLOCK;
 
   /**
    * Return `true` if this is a documentation comment.
    *
    * @return `true` if this is a documentation comment
    */
-  bool get isDocumentation => identical(_type, CommentType.DOCUMENTATION);
+  bool get isDocumentation => _type == CommentType.DOCUMENTATION;
 
   /**
    * Return `true` if this is an end-of-line comment.
    *
    * @return `true` if this is an end-of-line comment
    */
-  bool get isEndOfLine => identical(_type, CommentType.END_OF_LINE);
+  bool get isEndOfLine => _type == CommentType.END_OF_LINE;
 
   @override
   void visitChildren(AstVisitor visitor) {
@@ -2782,21 +2753,21 @@
   /**
    * An end-of-line comment.
    */
-  static final CommentType END_OF_LINE = new CommentType('END_OF_LINE', 0);
+  static const CommentType END_OF_LINE = const CommentType('END_OF_LINE', 0);
 
   /**
    * A block comment.
    */
-  static final CommentType BLOCK = new CommentType('BLOCK', 1);
+  static const CommentType BLOCK = const CommentType('BLOCK', 1);
 
   /**
    * A documentation comment.
    */
-  static final CommentType DOCUMENTATION = new CommentType('DOCUMENTATION', 2);
+  static const CommentType DOCUMENTATION = const CommentType('DOCUMENTATION', 2);
 
-  static final List<CommentType> values = [END_OF_LINE, BLOCK, DOCUMENTATION];
+  static const List<CommentType> values = const [END_OF_LINE, BLOCK, DOCUMENTATION];
 
-  CommentType(String name, int ordinal) : super(name, ordinal);
+  const CommentType(String name, int ordinal) : super(name, ordinal);
 }
 
 /**
@@ -2825,8 +2796,7 @@
    * @param newKeyword the token representing the 'new' keyword
    * @param identifier the identifier being referenced
    */
-  CommentReference(Token newKeyword, Identifier identifier) {
-    this.newKeyword = newKeyword;
+  CommentReference(this.newKeyword, Identifier identifier) {
     this._identifier = becomeParentOf(identifier);
   }
 
@@ -2889,7 +2859,7 @@
   /**
    * The first token in the token stream that was parsed to form this compilation unit.
    */
-  Token beginToken;
+  final Token beginToken;
 
   /**
    * The script tag at the beginning of the compilation unit, or `null` if there is no script
@@ -2911,7 +2881,7 @@
    * The last token in the token stream that was parsed to form this compilation unit. This token
    * should always have a type of [TokenType.EOF].
    */
-  Token endToken;
+  final Token endToken;
 
   /**
    * The element associated with this compilation unit, or `null` if the AST structure has not
@@ -2933,14 +2903,12 @@
    * @param declarations the declarations contained in this compilation unit
    * @param endToken the last token in the token stream
    */
-  CompilationUnit(Token beginToken, ScriptTag scriptTag, List<Directive> directives, List<CompilationUnitMember> declarations, Token endToken) {
+  CompilationUnit(this.beginToken, ScriptTag scriptTag, List<Directive> directives, List<CompilationUnitMember> declarations, this.endToken) {
     this._directives = new NodeList<Directive>(this);
     this._declarations = new NodeList<CompilationUnitMember>(this);
-    this.beginToken = beginToken;
     this._scriptTag = becomeParentOf(scriptTag);
     this._directives.addAll(directives);
     this._declarations.addAll(declarations);
-    this.endToken = endToken;
   }
 
   @override
@@ -3102,11 +3070,9 @@
    * @param elseExpression the expression that is executed if the condition evaluates to
    *          `false`
    */
-  ConditionalExpression(Expression condition, Token question, Expression thenExpression, Token colon, Expression elseExpression) {
+  ConditionalExpression(Expression condition, this.question, Expression thenExpression, this.colon, Expression elseExpression) {
     this._condition = becomeParentOf(condition);
-    this.question = question;
     this._thenExpression = becomeParentOf(thenExpression);
-    this.colon = colon;
     this._elseExpression = becomeParentOf(elseExpression);
   }
 
@@ -3290,16 +3256,11 @@
    *          redirected
    * @param body the body of the constructor
    */
-  ConstructorDeclaration(Comment comment, List<Annotation> metadata, Token externalKeyword, Token constKeyword, Token factoryKeyword, Identifier returnType, Token period, SimpleIdentifier name, FormalParameterList parameters, Token separator, List<ConstructorInitializer> initializers, ConstructorName redirectedConstructor, FunctionBody body) : super(comment, metadata) {
+  ConstructorDeclaration(Comment comment, List<Annotation> metadata, this.externalKeyword, this.constKeyword, this.factoryKeyword, Identifier returnType, this.period, SimpleIdentifier name, FormalParameterList parameters, this.separator, List<ConstructorInitializer> initializers, ConstructorName redirectedConstructor, FunctionBody body) : super(comment, metadata) {
     this._initializers = new NodeList<ConstructorInitializer>(this);
-    this.externalKeyword = externalKeyword;
-    this.constKeyword = constKeyword;
-    this.factoryKeyword = factoryKeyword;
     this._returnType = becomeParentOf(returnType);
-    this.period = period;
     this._name = becomeParentOf(name);
     this._parameters = becomeParentOf(parameters);
-    this.separator = separator;
     this._initializers.addAll(initializers);
     this._redirectedConstructor = becomeParentOf(redirectedConstructor);
     this._body = becomeParentOf(body);
@@ -3496,11 +3457,8 @@
    * @param equals the token for the equal sign between the field name and the expression
    * @param expression the expression computing the value to which the field will be initialized
    */
-  ConstructorFieldInitializer(Token keyword, Token period, SimpleIdentifier fieldName, Token equals, Expression expression) {
-    this.keyword = keyword;
-    this.period = period;
+  ConstructorFieldInitializer(this.keyword, this.period, SimpleIdentifier fieldName, this.equals, Expression expression) {
     this._fieldName = becomeParentOf(fieldName);
-    this.equals = equals;
     this._expression = becomeParentOf(expression);
   }
 
@@ -3611,9 +3569,8 @@
    * @param period the token for the period before the constructor name
    * @param name the name of the constructor
    */
-  ConstructorName(TypeName type, Token period, SimpleIdentifier name) {
+  ConstructorName(TypeName type, this.period, SimpleIdentifier name) {
     this._type = becomeParentOf(type);
-    this.period = period;
     this._name = becomeParentOf(name);
   }
 
@@ -3721,10 +3678,8 @@
    * @param label the label associated with the statement
    * @param semicolon the semicolon terminating the statement
    */
-  ContinueStatement(Token keyword, SimpleIdentifier label, Token semicolon) {
-    this.keyword = keyword;
+  ContinueStatement(this.keyword, SimpleIdentifier label, this.semicolon) {
     this._label = becomeParentOf(label);
-    this.semicolon = semicolon;
   }
 
   @override
@@ -3816,8 +3771,7 @@
    * @param type the name of the declared type of the parameter
    * @param identifier the name of the parameter being declared
    */
-  DeclaredIdentifier(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata) {
-    this.keyword = keyword;
+  DeclaredIdentifier(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata) {
     this._type = becomeParentOf(type);
     this._identifier = becomeParentOf(identifier);
   }
@@ -3857,7 +3811,7 @@
    *
    * @return `true` if this variable was declared with the 'const' modifier
    */
-  bool get isConst => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.CONST);
+  bool get isConst => (keyword is KeywordToken) && (keyword as KeywordToken).keyword == Keyword.CONST;
 
   /**
    * Return `true` if this variable was declared with the 'final' modifier. Variables that are
@@ -3866,7 +3820,7 @@
    *
    * @return `true` if this variable was declared with the 'final' modifier
    */
-  bool get isFinal => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.FINAL);
+  bool get isFinal => (keyword is KeywordToken) && (keyword as KeywordToken).keyword == Keyword.FINAL;
 
   /**
    * Set the name of the declared type of the parameter to the given type name.
@@ -3939,10 +3893,8 @@
    * @param separator the token separating the parameter from the default value
    * @param defaultValue the expression computing the default value for the parameter
    */
-  DefaultFormalParameter(NormalFormalParameter parameter, ParameterKind kind, Token separator, Expression defaultValue) {
+  DefaultFormalParameter(NormalFormalParameter parameter, this.kind, this.separator, Expression defaultValue) {
     this._parameter = becomeParentOf(parameter);
-    this.kind = kind;
-    this.separator = separator;
     this._defaultValue = becomeParentOf(defaultValue);
   }
 
@@ -4119,14 +4071,11 @@
    * @param rightParenthesis the right parenthesis
    * @param semicolon the semicolon terminating the statement
    */
-  DoStatement(Token doKeyword, Statement body, Token whileKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Token semicolon) {
-    this.doKeyword = doKeyword;
+  DoStatement(this.doKeyword, Statement body, this.whileKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, this.semicolon) {
     this._body = becomeParentOf(body);
-    this.whileKeyword = whileKeyword;
     this._leftParenthesis = leftParenthesis;
     this._condition = becomeParentOf(condition);
     this._rightParenthesis = rightParenthesis;
-    this.semicolon = semicolon;
   }
 
   @override
@@ -4238,10 +4187,7 @@
    * @param literal the token representing the literal
    * @param value the value of the literal
    */
-  DoubleLiteral(Token literal, double value) {
-    this.literal = literal;
-    this.value = value;
-  }
+  DoubleLiteral(this.literal, this.value);
 
   @override
   accept(AstVisitor visitor) => visitor.visitDoubleLiteral(this);
@@ -4277,9 +4223,7 @@
    *
    * @param semicolon the token representing the semicolon that marks the end of the function body
    */
-  EmptyFunctionBody(Token semicolon) {
-    this.semicolon = semicolon;
-  }
+  EmptyFunctionBody(this.semicolon);
 
   @override
   accept(AstVisitor visitor) => visitor.visitEmptyFunctionBody(this);
@@ -4314,9 +4258,7 @@
    *
    * @param semicolon the semicolon terminating the statement
    */
-  EmptyStatement(Token semicolon) {
-    this.semicolon = semicolon;
-  }
+  EmptyStatement(this.semicolon);
 
   @override
   accept(AstVisitor visitor) => visitor.visitEmptyStatement(this);
@@ -4574,10 +4516,8 @@
    * @param expression the expression representing the body of the function
    * @param semicolon the semicolon terminating the statement
    */
-  ExpressionFunctionBody(Token functionDefinition, Expression expression, Token semicolon) {
-    this.functionDefinition = functionDefinition;
+  ExpressionFunctionBody(this.functionDefinition, Expression expression, this.semicolon) {
     this._expression = becomeParentOf(expression);
-    this.semicolon = semicolon;
   }
 
   @override
@@ -4642,9 +4582,8 @@
    * @param expression the expression that comprises the statement
    * @param semicolon the semicolon terminating the statement
    */
-  ExpressionStatement(Expression expression, Token semicolon) {
+  ExpressionStatement(Expression expression, this.semicolon) {
     this._expression = becomeParentOf(expression);
-    this.semicolon = semicolon;
   }
 
   @override
@@ -4712,8 +4651,7 @@
    * @param keyword the token representing the 'extends' keyword
    * @param superclass the name of the class that is being extended
    */
-  ExtendsClause(Token keyword, TypeName superclass) {
-    this.keyword = keyword;
+  ExtendsClause(this.keyword, TypeName superclass) {
     this._superclass = becomeParentOf(superclass);
   }
 
@@ -4782,10 +4720,8 @@
    * @param fieldList the fields being declared
    * @param semicolon the semicolon terminating the declaration
    */
-  FieldDeclaration(Comment comment, List<Annotation> metadata, Token staticKeyword, VariableDeclarationList fieldList, Token semicolon) : super(comment, metadata) {
-    this.staticKeyword = staticKeyword;
+  FieldDeclaration(Comment comment, List<Annotation> metadata, this.staticKeyword, VariableDeclarationList fieldList, this.semicolon) : super(comment, metadata) {
     this._fieldList = becomeParentOf(fieldList);
-    this.semicolon = semicolon;
   }
 
   @override
@@ -4885,11 +4821,8 @@
    * @param parameters the parameters of the function-typed parameter, or `null` if this is
    *          not a function-typed field formal parameter
    */
-  FieldFormalParameter(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, Token thisToken, Token period, SimpleIdentifier identifier, FormalParameterList parameters) : super(comment, metadata, identifier) {
-    this.keyword = keyword;
+  FieldFormalParameter(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, this.thisToken, this.period, SimpleIdentifier identifier, FormalParameterList parameters) : super(comment, metadata, identifier) {
     this._type = becomeParentOf(type);
-    this.thisToken = thisToken;
-    this.period = period;
     this._parameters = becomeParentOf(parameters);
   }
 
@@ -4927,10 +4860,10 @@
   TypeName get type => _type;
 
   @override
-  bool get isConst => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.CONST);
+  bool get isConst => (keyword is KeywordToken) && (keyword as KeywordToken).keyword == Keyword.CONST;
 
   @override
-  bool get isFinal => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.FINAL);
+  bool get isFinal => (keyword is KeywordToken) && (keyword as KeywordToken).keyword == Keyword.FINAL;
 
   /**
    * Set the parameters of the function-typed parameter to the given parameters.
@@ -5020,13 +4953,9 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the loop
    */
-  ForEachStatement.con1(Token forKeyword, Token leftParenthesis, DeclaredIdentifier loopVariable, Token inKeyword, Expression iterator, Token rightParenthesis, Statement body) {
-    this.forKeyword = forKeyword;
-    this.leftParenthesis = leftParenthesis;
+  ForEachStatement.con1(this.forKeyword, this.leftParenthesis, DeclaredIdentifier loopVariable, this.inKeyword, Expression iterator, this.rightParenthesis, Statement body) {
     this._loopVariable = becomeParentOf(loopVariable);
-    this.inKeyword = inKeyword;
     this._iterator = becomeParentOf(iterator);
-    this.rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
 
@@ -5040,13 +4969,9 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the loop
    */
-  ForEachStatement.con2(Token forKeyword, Token leftParenthesis, SimpleIdentifier identifier, Token inKeyword, Expression iterator, Token rightParenthesis, Statement body) {
-    this.forKeyword = forKeyword;
-    this.leftParenthesis = leftParenthesis;
+  ForEachStatement.con2(this.forKeyword, this.leftParenthesis, SimpleIdentifier identifier, this.inKeyword, Expression iterator, this.rightParenthesis, Statement body) {
     this._identifier = becomeParentOf(identifier);
-    this.inKeyword = inKeyword;
     this._iterator = becomeParentOf(iterator);
-    this.rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
 
@@ -5218,17 +5143,12 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the loop
    */
-  ForStatement(Token forKeyword, Token leftParenthesis, VariableDeclarationList variableList, Expression initialization, Token leftSeparator, Expression condition, Token rightSeparator, List<Expression> updaters, Token rightParenthesis, Statement body) {
+  ForStatement(this.forKeyword, this.leftParenthesis, VariableDeclarationList variableList, Expression initialization, this.leftSeparator, Expression condition, this.rightSeparator, List<Expression> updaters, this.rightParenthesis, Statement body) {
     this._updaters = new NodeList<Expression>(this);
-    this.forKeyword = forKeyword;
-    this.leftParenthesis = leftParenthesis;
     this._variableList = becomeParentOf(variableList);
     this._initialization = becomeParentOf(initialization);
-    this.leftSeparator = leftSeparator;
     this._condition = becomeParentOf(condition);
-    this.rightSeparator = rightSeparator;
     this._updaters.addAll(updaters);
-    this.rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
 
@@ -5627,10 +5547,8 @@
    * @param name the name of the function
    * @param functionExpression the function expression being wrapped
    */
-  FunctionDeclaration(Comment comment, List<Annotation> metadata, Token externalKeyword, TypeName returnType, Token propertyKeyword, SimpleIdentifier name, FunctionExpression functionExpression) : super(comment, metadata) {
-    this.externalKeyword = externalKeyword;
+  FunctionDeclaration(Comment comment, List<Annotation> metadata, this.externalKeyword, TypeName returnType, this.propertyKeyword, SimpleIdentifier name, FunctionExpression functionExpression) : super(comment, metadata) {
     this._returnType = becomeParentOf(returnType);
-    this.propertyKeyword = propertyKeyword;
     this._name = becomeParentOf(name);
     this._functionExpression = becomeParentOf(functionExpression);
   }
@@ -5670,14 +5588,14 @@
    *
    * @return `true` if this function declares a getter
    */
-  bool get isGetter => propertyKeyword != null && identical((propertyKeyword as KeywordToken).keyword, Keyword.GET);
+  bool get isGetter => propertyKeyword != null && (propertyKeyword as KeywordToken).keyword == Keyword.GET;
 
   /**
    * Return `true` if this function declares a setter.
    *
    * @return `true` if this function declares a setter
    */
-  bool get isSetter => propertyKeyword != null && identical((propertyKeyword as KeywordToken).keyword, Keyword.SET);
+  bool get isSetter => propertyKeyword != null && (propertyKeyword as KeywordToken).keyword == Keyword.SET;
 
   /**
    * Set the function expression being wrapped to the given function expression.
@@ -6412,13 +6330,9 @@
    * @param elseKeyword the token representing the 'else' keyword
    * @param elseStatement the statement that is executed if the condition evaluates to `false`
    */
-  IfStatement(Token ifKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Statement thenStatement, Token elseKeyword, Statement elseStatement) {
-    this.ifKeyword = ifKeyword;
-    this.leftParenthesis = leftParenthesis;
+  IfStatement(this.ifKeyword, this.leftParenthesis, Expression condition, this.rightParenthesis, Statement thenStatement, this.elseKeyword, Statement elseStatement) {
     this._condition = becomeParentOf(condition);
-    this.rightParenthesis = rightParenthesis;
     this._thenStatement = becomeParentOf(thenStatement);
-    this.elseKeyword = elseKeyword;
     this._elseStatement = becomeParentOf(elseStatement);
   }
 
@@ -6522,9 +6436,8 @@
    * @param keyword the token representing the 'implements' keyword
    * @param interfaces the interfaces that are being implemented
    */
-  ImplementsClause(Token keyword, List<TypeName> interfaces) {
+  ImplementsClause(this.keyword, List<TypeName> interfaces) {
     this._interfaces = new NodeList<TypeName>(this);
-    this.keyword = keyword;
     this._interfaces.addAll(interfaces);
   }
 
@@ -6673,8 +6586,7 @@
    * @param combinators the combinators used to control how names are imported
    * @param semicolon the semicolon terminating the directive
    */
-  ImportDirective(Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, Token asToken, SimpleIdentifier prefix, List<Combinator> combinators, Token semicolon) : super(comment, metadata, keyword, libraryUri, combinators, semicolon) {
-    this.asToken = asToken;
+  ImportDirective(Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, this.asToken, SimpleIdentifier prefix, List<Combinator> combinators, Token semicolon) : super(comment, metadata, keyword, libraryUri, combinators, semicolon) {
     this._prefix = becomeParentOf(prefix);
   }
 
@@ -6798,8 +6710,7 @@
    * @param index the expression used to compute the index
    * @param rightBracket the right square bracket
    */
-  IndexExpression.forCascade(Token period, Token leftBracket, Expression index, Token rightBracket) {
-    this.period = period;
+  IndexExpression.forCascade(this.period, Token leftBracket, Expression index, Token rightBracket) {
     this._leftBracket = leftBracket;
     this._index = becomeParentOf(index);
     this._rightBracket = rightBracket;
@@ -6924,7 +6835,7 @@
     AstNode parent = this.parent;
     if (parent is AssignmentExpression) {
       AssignmentExpression assignment = parent;
-      if (identical(assignment.leftHandSide, this) && identical(assignment.operator.type, TokenType.EQ)) {
+      if (identical(assignment.leftHandSide, this) && assignment.operator.type == TokenType.EQ) {
         return false;
       }
     }
@@ -7108,8 +7019,7 @@
    * @param constructorName the name of the constructor to be invoked
    * @param argumentList the list of arguments to the constructor
    */
-  InstanceCreationExpression(Token keyword, ConstructorName constructorName, ArgumentList argumentList) {
-    this.keyword = keyword;
+  InstanceCreationExpression(this.keyword, ConstructorName constructorName, ArgumentList argumentList) {
     this.constructorName = becomeParentOf(constructorName);
     this._argumentList = becomeParentOf(argumentList);
   }
@@ -7138,7 +7048,7 @@
    *
    * @return `true` if this creation expression is used to invoke a constant constructor
    */
-  bool get isConst => keyword is KeywordToken && identical((keyword as KeywordToken).keyword, Keyword.CONST);
+  bool get isConst => keyword is KeywordToken && (keyword as KeywordToken).keyword == Keyword.CONST;
 
   /**
    * Set the list of arguments to the constructor to the given list.
@@ -7189,10 +7099,7 @@
    * @param literal the token representing the literal
    * @param value the value of the literal
    */
-  IntegerLiteral(Token literal, int value) {
-    this.literal = literal;
-    this.value = value;
-  }
+  IntegerLiteral(this.literal, this.value);
 
   @override
   accept(AstVisitor visitor) => visitor.visitIntegerLiteral(this);
@@ -7255,10 +7162,8 @@
    * @param expression the expression to be evaluated for the value to be converted into a string
    * @param rightBracket the right curly bracket
    */
-  InterpolationExpression(Token leftBracket, Expression expression, Token rightBracket) {
-    this.leftBracket = leftBracket;
+  InterpolationExpression(this.leftBracket, Expression expression, this.rightBracket) {
     this._expression = becomeParentOf(expression);
-    this.rightBracket = rightBracket;
   }
 
   @override
@@ -7412,10 +7317,8 @@
    * @param notOperator the not operator, or `null` if the sense of the test is not negated
    * @param type the name of the type being tested for
    */
-  IsExpression(Expression expression, Token isOperator, Token notOperator, TypeName type) {
+  IsExpression(Expression expression, this.isOperator, this.notOperator, TypeName type) {
     this._expression = becomeParentOf(expression);
-    this.isOperator = isOperator;
-    this.notOperator = notOperator;
     this._type = becomeParentOf(type);
   }
 
@@ -7496,9 +7399,8 @@
    * @param label the label being applied
    * @param colon the colon that separates the label from whatever follows
    */
-  Label(SimpleIdentifier label, Token colon) {
+  Label(SimpleIdentifier label, this.colon) {
     this._label = becomeParentOf(label);
-    this.colon = colon;
   }
 
   @override
@@ -7641,10 +7543,8 @@
    * @param name the name of the library being defined
    * @param semicolon the semicolon terminating the directive
    */
-  LibraryDirective(Comment comment, List<Annotation> metadata, Token libraryToken, LibraryIdentifier name, Token semicolon) : super(comment, metadata) {
-    this.libraryToken = libraryToken;
+  LibraryDirective(Comment comment, List<Annotation> metadata, this.libraryToken, LibraryIdentifier name, this.semicolon) : super(comment, metadata) {
     this._name = becomeParentOf(name);
-    this.semicolon = semicolon;
   }
 
   @override
@@ -8019,9 +7919,8 @@
    * @param separator the colon that separates the key from the value
    * @param value the expression computing the value that will be associated with the key
    */
-  MapLiteralEntry(Expression key, Token separator, Expression value) {
+  MapLiteralEntry(Expression key, this.separator, Expression value) {
     this._key = becomeParentOf(key);
-    this.separator = separator;
     this._value = becomeParentOf(value);
   }
 
@@ -8150,12 +8049,8 @@
    *          declares a getter
    * @param body the body of the method
    */
-  MethodDeclaration(Comment comment, List<Annotation> metadata, Token externalKeyword, Token modifierKeyword, TypeName returnType, Token propertyKeyword, Token operatorKeyword, SimpleIdentifier name, FormalParameterList parameters, FunctionBody body) : super(comment, metadata) {
-    this.externalKeyword = externalKeyword;
-    this.modifierKeyword = modifierKeyword;
+  MethodDeclaration(Comment comment, List<Annotation> metadata, this.externalKeyword, this.modifierKeyword, TypeName returnType, this.propertyKeyword, this.operatorKeyword, SimpleIdentifier name, FormalParameterList parameters, FunctionBody body) : super(comment, metadata) {
     this._returnType = becomeParentOf(returnType);
-    this.propertyKeyword = propertyKeyword;
-    this.operatorKeyword = operatorKeyword;
     this._name = becomeParentOf(name);
     this._parameters = becomeParentOf(parameters);
     this._body = becomeParentOf(body);
@@ -8219,7 +8114,7 @@
    *
    * @return `true` if this method declares a getter
    */
-  bool get isGetter => propertyKeyword != null && identical((propertyKeyword as KeywordToken).keyword, Keyword.GET);
+  bool get isGetter => propertyKeyword != null && (propertyKeyword as KeywordToken).keyword == Keyword.GET;
 
   /**
    * Return `true` if this method declares an operator.
@@ -8233,14 +8128,14 @@
    *
    * @return `true` if this method declares a setter
    */
-  bool get isSetter => propertyKeyword != null && identical((propertyKeyword as KeywordToken).keyword, Keyword.SET);
+  bool get isSetter => propertyKeyword != null && (propertyKeyword as KeywordToken).keyword == Keyword.SET;
 
   /**
    * Return `true` if this method is declared to be a static method.
    *
    * @return `true` if this method is declared to be a static method
    */
-  bool get isStatic => modifierKeyword != null && identical((modifierKeyword as KeywordToken).keyword, Keyword.STATIC);
+  bool get isStatic => modifierKeyword != null && (modifierKeyword as KeywordToken).keyword == Keyword.STATIC;
 
   /**
    * Set the body of the method to the given function body.
@@ -8345,9 +8240,8 @@
    * @param methodName the name of the method being invoked
    * @param argumentList the list of arguments to the method
    */
-  MethodInvocation(Expression target, Token period, SimpleIdentifier methodName, ArgumentList argumentList) {
+  MethodInvocation(Expression target, this.period, SimpleIdentifier methodName, ArgumentList argumentList) {
     this._target = becomeParentOf(target);
-    this.period = period;
     this._methodName = becomeParentOf(methodName);
     this._argumentList = becomeParentOf(argumentList);
   }
@@ -8425,7 +8319,7 @@
    *
    * @return `true` if this expression is cascaded
    */
-  bool get isCascaded => period != null && identical(period.type, TokenType.PERIOD_PERIOD);
+  bool get isCascaded => period != null && period.type == TokenType.PERIOD_PERIOD;
 
   /**
    * Set the list of arguments to the method to the given list.
@@ -8595,11 +8489,9 @@
    * @param combinators the combinators used to control which names are imported or exported
    * @param semicolon the semicolon terminating the directive
    */
-  NamespaceDirective(Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, List<Combinator> combinators, Token semicolon) : super(comment, metadata, libraryUri) {
+  NamespaceDirective(Comment comment, List<Annotation> metadata, this.keyword, StringLiteral libraryUri, List<Combinator> combinators, this.semicolon) : super(comment, metadata, libraryUri) {
     this._combinators = new NodeList<Combinator>(this);
-    this.keyword = keyword;
     this._combinators.addAll(combinators);
-    this.semicolon = semicolon;
   }
 
   /**
@@ -8645,10 +8537,7 @@
    * @param keyword the token representing the 'native' keyword
    * @param name the name of the native object that implements the class.
    */
-  NativeClause(Token keyword, StringLiteral name) {
-    this.keyword = keyword;
-    this.name = name;
-  }
+  NativeClause(this.keyword, this.name);
 
   @override
   accept(AstVisitor visitor) => visitor.visitNativeClause(this);
@@ -8678,7 +8567,7 @@
   /**
    * The token representing 'native' that marks the start of the function body.
    */
-  Token nativeToken;
+  final Token nativeToken;
 
   /**
    * The string literal, after the 'native' token.
@@ -8688,7 +8577,7 @@
   /**
    * The token representing the semicolon that marks the end of the function body.
    */
-  Token semicolon;
+  final Token semicolon;
 
   /**
    * Initialize a newly created function body consisting of the 'native' token, a string literal,
@@ -8698,10 +8587,8 @@
    * @param stringLiteral the string literal
    * @param semicolon the token representing the semicolon that marks the end of the function body
    */
-  NativeFunctionBody(Token nativeToken, StringLiteral stringLiteral, Token semicolon) {
-    this.nativeToken = nativeToken;
+  NativeFunctionBody(this.nativeToken, StringLiteral stringLiteral, this.semicolon) {
     this._stringLiteral = becomeParentOf(stringLiteral);
-    this.semicolon = semicolon;
   }
 
   @override
@@ -9027,10 +8914,7 @@
    * @param partUri the URI of the part being included
    * @param semicolon the semicolon terminating the directive
    */
-  PartDirective(Comment comment, List<Annotation> metadata, Token partToken, StringLiteral partUri, Token semicolon) : super(comment, metadata, partUri) {
-    this.partToken = partToken;
-    this.semicolon = semicolon;
-  }
+  PartDirective(Comment comment, List<Annotation> metadata, this.partToken, StringLiteral partUri, this.semicolon) : super(comment, metadata, partUri);
 
   @override
   accept(AstVisitor visitor) => visitor.visitPartDirective(this);
@@ -9087,11 +8971,8 @@
    * @param libraryName the name of the library that the containing compilation unit is part of
    * @param semicolon the semicolon terminating the directive
    */
-  PartOfDirective(Comment comment, List<Annotation> metadata, Token partToken, Token ofToken, LibraryIdentifier libraryName, Token semicolon) : super(comment, metadata) {
-    this.partToken = partToken;
-    this.ofToken = ofToken;
+  PartOfDirective(Comment comment, List<Annotation> metadata, this.partToken, this.ofToken, LibraryIdentifier libraryName, this.semicolon) : super(comment, metadata) {
     this._libraryName = becomeParentOf(libraryName);
-    this.semicolon = semicolon;
   }
 
   @override
@@ -9168,9 +9049,8 @@
    * @param operand the expression computing the operand for the operator
    * @param operator the postfix operator being applied to the operand
    */
-  PostfixExpression(Expression operand, Token operator) {
+  PostfixExpression(Expression operand, this.operator) {
     this._operand = becomeParentOf(operand);
-    this.operator = operator;
   }
 
   @override
@@ -9344,8 +9224,7 @@
    * @param operator the prefix operator being applied to the operand
    * @param operand the expression computing the operand for the operator
    */
-  PrefixExpression(Token operator, Expression operand) {
-    this.operator = operator;
+  PrefixExpression(this.operator, Expression operand) {
     this._operand = becomeParentOf(operand);
   }
 
@@ -9514,9 +9393,8 @@
    * @param period the period used to separate the prefix from the identifier
    * @param identifier the prefix associated with the library in which the identifier is defined
    */
-  PrefixedIdentifier(SimpleIdentifier prefix, Token period, SimpleIdentifier identifier) {
+  PrefixedIdentifier(SimpleIdentifier prefix, this.period, SimpleIdentifier identifier) {
     this._prefix = becomeParentOf(prefix);
-    this.period = period;
     this._identifier = becomeParentOf(identifier);
   }
 
@@ -9634,9 +9512,8 @@
    * @param operator the property access operator
    * @param propertyName the name of the property being accessed
    */
-  PropertyAccess(Expression target, Token operator, SimpleIdentifier propertyName) {
+  PropertyAccess(Expression target, this.operator, SimpleIdentifier propertyName) {
     this._target = becomeParentOf(target);
-    this.operator = operator;
     this._propertyName = becomeParentOf(propertyName);
   }
 
@@ -9706,7 +9583,7 @@
    *
    * @return `true` if this expression is cascaded
    */
-  bool get isCascaded => operator != null && identical(operator.type, TokenType.PERIOD_PERIOD);
+  bool get isCascaded => operator != null && operator.type == TokenType.PERIOD_PERIOD;
 
   /**
    * Set the name of the property being accessed to the given identifier.
@@ -9781,9 +9658,7 @@
    * @param constructorName the name of the constructor that is being invoked
    * @param argumentList the list of arguments to the constructor
    */
-  RedirectingConstructorInvocation(Token keyword, Token period, SimpleIdentifier constructorName, ArgumentList argumentList) {
-    this.keyword = keyword;
-    this.period = period;
+  RedirectingConstructorInvocation(this.keyword, this.period, SimpleIdentifier constructorName, ArgumentList argumentList) {
     this._constructorName = becomeParentOf(constructorName);
     this._argumentList = becomeParentOf(argumentList);
   }
@@ -9856,9 +9731,7 @@
    *
    * @param keyword the token representing the 'rethrow' keyword
    */
-  RethrowExpression(Token keyword) {
-    this.keyword = keyword;
-  }
+  RethrowExpression(this.keyword);
 
   @override
   accept(AstVisitor visitor) => visitor.visitRethrowExpression(this);
@@ -9909,10 +9782,8 @@
    * @param expression the expression computing the value to be returned
    * @param semicolon the semicolon terminating the statement
    */
-  ReturnStatement(Token keyword, Expression expression, Token semicolon) {
-    this.keyword = keyword;
+  ReturnStatement(this.keyword, Expression expression, this.semicolon) {
     this._expression = becomeParentOf(expression);
-    this.semicolon = semicolon;
   }
 
   @override
@@ -9967,9 +9838,7 @@
    *
    * @param scriptTag the token representing this script tag
    */
-  ScriptTag(Token scriptTag) {
-    this.scriptTag = scriptTag;
-  }
+  ScriptTag(this.scriptTag);
 
   @override
   accept(AstVisitor visitor) => visitor.visitScriptTag(this);
@@ -10060,8 +9929,7 @@
    * @param type the name of the declared type of the parameter
    * @param identifier the name of the parameter being declared
    */
-  SimpleFormalParameter(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata, identifier) {
-    this.keyword = keyword;
+  SimpleFormalParameter(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata, identifier) {
     this._type = becomeParentOf(type);
   }
 
@@ -10090,10 +9958,10 @@
   TypeName get type => _type;
 
   @override
-  bool get isConst => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.CONST);
+  bool get isConst => (keyword is KeywordToken) && (keyword as KeywordToken).keyword == Keyword.CONST;
 
   @override
-  bool get isFinal => (keyword is KeywordToken) && identical((keyword as KeywordToken).keyword, Keyword.FINAL);
+  bool get isFinal => (keyword is KeywordToken) && (keyword as KeywordToken).keyword == Keyword.FINAL;
 
   /**
    * Set the name of the declared type of the parameter to the given type name.
@@ -10155,9 +10023,7 @@
    *
    * @param token the token representing the identifier
    */
-  SimpleIdentifier(Token token) {
-    this.token = token;
-  }
+  SimpleIdentifier(this.token);
 
   @override
   accept(AstVisitor visitor) => visitor.visitSimpleIdentifier(this);
@@ -10259,7 +10125,7 @@
     // analyze usage
     if (parent is AssignmentExpression) {
       AssignmentExpression expr = parent as AssignmentExpression;
-      if (identical(expr.leftHandSide, target) && identical(expr.operator.type, TokenType.EQ)) {
+      if (identical(expr.leftHandSide, target) && expr.operator.type == TokenType.EQ) {
         return false;
       }
     }
@@ -10432,8 +10298,7 @@
    * @param literal the token representing the literal
    * @param value the value of the literal
    */
-  SimpleStringLiteral(Token literal, String value) {
-    this.literal = literal;
+  SimpleStringLiteral(this.literal, String value) {
     this._value = StringUtilities.intern(value);
   }
 
@@ -10690,9 +10555,7 @@
    * @param constructorName the name of the constructor that is being invoked
    * @param argumentList the list of arguments to the constructor
    */
-  SuperConstructorInvocation(Token keyword, Token period, SimpleIdentifier constructorName, ArgumentList argumentList) {
-    this.keyword = keyword;
-    this.period = period;
+  SuperConstructorInvocation(this.keyword, this.period, SimpleIdentifier constructorName, ArgumentList argumentList) {
     this._constructorName = becomeParentOf(constructorName);
     this._argumentList = becomeParentOf(argumentList);
   }
@@ -10765,9 +10628,7 @@
    *
    * @param keyword the token representing the keyword
    */
-  SuperExpression(Token keyword) {
-    this.keyword = keyword;
-  }
+  SuperExpression(this.keyword);
 
   @override
   accept(AstVisitor visitor) => visitor.visitSuperExpression(this);
@@ -10908,12 +10769,10 @@
    * @param colon the colon separating the keyword or the expression from the statements
    * @param statements the statements that will be executed if this switch member is selected
    */
-  SwitchMember(List<Label> labels, Token keyword, Token colon, List<Statement> statements) {
+  SwitchMember(List<Label> labels, this.keyword, this.colon, List<Statement> statements) {
     this._labels = new NodeList<Label>(this);
     this._statements = new NodeList<Statement>(this);
     this._labels.addAll(labels);
-    this.keyword = keyword;
-    this.colon = colon;
     this._statements.addAll(statements);
   }
 
@@ -11003,15 +10862,10 @@
    * @param members the switch members that can be selected by the expression
    * @param rightBracket the right curly bracket
    */
-  SwitchStatement(Token keyword, Token leftParenthesis, Expression expression, Token rightParenthesis, Token leftBracket, List<SwitchMember> members, Token rightBracket) {
+  SwitchStatement(this.keyword, this.leftParenthesis, Expression expression, this.rightParenthesis, this.leftBracket, List<SwitchMember> members, this.rightBracket) {
     this._members = new NodeList<SwitchMember>(this);
-    this.keyword = keyword;
-    this.leftParenthesis = leftParenthesis;
     this._expression = becomeParentOf(expression);
-    this.rightParenthesis = rightParenthesis;
-    this.leftBracket = leftBracket;
     this._members.addAll(members);
-    this.rightBracket = rightBracket;
   }
 
   @override
@@ -11071,7 +10925,7 @@
   /**
    * The components of the literal.
    */
-  List<Token> components;
+  final List<Token> components;
 
   /**
    * Initialize a newly created symbol literal.
@@ -11079,10 +10933,7 @@
    * @param poundSign the token introducing the literal
    * @param components the components of the literal
    */
-  SymbolLiteral(Token poundSign, List<Token> components) {
-    this.poundSign = poundSign;
-    this.components = components;
-  }
+  SymbolLiteral(this.poundSign, this.components);
 
   @override
   accept(AstVisitor visitor) => visitor.visitSymbolLiteral(this);
@@ -11117,9 +10968,7 @@
    *
    * @param keyword the token representing the keyword
    */
-  ThisExpression(Token keyword) {
-    this.keyword = keyword;
-  }
+  ThisExpression(this.keyword);
 
   @override
   accept(AstVisitor visitor) => visitor.visitThisExpression(this);
@@ -11163,8 +11012,7 @@
    * @param keyword the token representing the 'throw' keyword
    * @param expression the expression computing the exception to be thrown
    */
-  ThrowExpression(Token keyword, Expression expression) {
-    this.keyword = keyword;
+  ThrowExpression(this.keyword, Expression expression) {
     this._expression = becomeParentOf(expression);
   }
 
@@ -11236,9 +11084,8 @@
    * @param variableList the top-level variables being declared
    * @param semicolon the semicolon terminating the declaration
    */
-  TopLevelVariableDeclaration(Comment comment, List<Annotation> metadata, VariableDeclarationList variableList, Token semicolon) : super(comment, metadata) {
+  TopLevelVariableDeclaration(Comment comment, List<Annotation> metadata, VariableDeclarationList variableList, this.semicolon) : super(comment, metadata) {
     this._variableList = becomeParentOf(variableList);
-    this.semicolon = semicolon;
   }
 
   @override
@@ -11324,12 +11171,10 @@
    * @param finallyKeyword the token representing the 'finally' keyword
    * @param finallyBlock the finally block contained in the try statement
    */
-  TryStatement(Token tryKeyword, Block body, List<CatchClause> catchClauses, Token finallyKeyword, Block finallyBlock) {
+  TryStatement(this.tryKeyword, Block body, List<CatchClause> catchClauses, this.finallyKeyword, Block finallyBlock) {
     this._catchClauses = new NodeList<CatchClause>(this);
-    this.tryKeyword = tryKeyword;
     this._body = becomeParentOf(body);
     this._catchClauses.addAll(catchClauses);
-    this.finallyKeyword = finallyKeyword;
     this._finallyBlock = becomeParentOf(finallyBlock);
   }
 
@@ -11430,10 +11275,7 @@
    * @param keyword the token representing the 'typedef' keyword
    * @param semicolon the semicolon terminating the declaration
    */
-  TypeAlias(Comment comment, List<Annotation> metadata, Token keyword, Token semicolon) : super(comment, metadata) {
-    this.keyword = keyword;
-    this.semicolon = semicolon;
-  }
+  TypeAlias(Comment comment, List<Annotation> metadata, this.keyword, this.semicolon) : super(comment, metadata);
 
   @override
   Token get endToken => semicolon;
@@ -11473,11 +11315,9 @@
    * @param arguments the type arguments associated with the type
    * @param rightBracket the right bracket
    */
-  TypeArgumentList(Token leftBracket, List<TypeName> arguments, Token rightBracket) {
+  TypeArgumentList(this.leftBracket, List<TypeName> arguments, this.rightBracket) {
     this._arguments = new NodeList<TypeName>(this);
-    this.leftBracket = leftBracket;
     this._arguments.addAll(arguments);
-    this.rightBracket = rightBracket;
   }
 
   @override
@@ -11631,9 +11471,8 @@
    * @param keyword the token representing the 'extends' keyword
    * @param bound the name of the upper bound for legal arguments
    */
-  TypeParameter(Comment comment, List<Annotation> metadata, SimpleIdentifier name, Token keyword, TypeName bound) : super(comment, metadata) {
+  TypeParameter(Comment comment, List<Annotation> metadata, SimpleIdentifier name, this.keyword, TypeName bound) : super(comment, metadata) {
     this._name = becomeParentOf(name);
-    this.keyword = keyword;
     this._bound = becomeParentOf(bound);
   }
 
@@ -11707,7 +11546,7 @@
   /**
    * The left angle bracket.
    */
-  Token leftBracket;
+  final Token leftBracket;
 
   /**
    * The type parameters in the list.
@@ -11717,7 +11556,7 @@
   /**
    * The right angle bracket.
    */
-  Token rightBracket;
+  final Token rightBracket;
 
   /**
    * Initialize a newly created list of type parameters.
@@ -11726,11 +11565,9 @@
    * @param typeParameters the type parameters in the list
    * @param rightBracket the right angle bracket
    */
-  TypeParameterList(Token leftBracket, List<TypeParameter> typeParameters, Token rightBracket) {
+  TypeParameterList(this.leftBracket, List<TypeParameter> typeParameters, this.rightBracket) {
     this._typeParameters = new NodeList<TypeParameter>(this);
-    this.leftBracket = leftBracket;
     this._typeParameters.addAll(typeParameters);
-    this.rightBracket = rightBracket;
   }
 
   @override
@@ -11784,8 +11621,7 @@
    * @param typeArguments the type argument associated with this literal, or `null` if no type
    *          arguments were declared
    */
-  TypedLiteral(Token constKeyword, TypeArgumentList typeArguments) {
-    this.constKeyword = constKeyword;
+  TypedLiteral(this.constKeyword, TypeArgumentList typeArguments) {
     this.typeArguments = becomeParentOf(typeArguments);
   }
 
@@ -11902,9 +11738,8 @@
    * @param equals the equal sign separating the variable name from the initial value
    * @param initializer the expression used to compute the initial value for the variable
    */
-  VariableDeclaration(Comment comment, List<Annotation> metadata, SimpleIdentifier name, Token equals, Expression initializer) : super(comment, metadata) {
+  VariableDeclaration(Comment comment, List<Annotation> metadata, SimpleIdentifier name, this.equals, Expression initializer) : super(comment, metadata) {
     this._name = becomeParentOf(name);
-    this.equals = equals;
     this._initializer = becomeParentOf(initializer);
   }
 
@@ -12047,9 +11882,8 @@
    * @param type the type of the variables being declared
    * @param variables a list containing the individual variables being declared
    */
-  VariableDeclarationList(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, List<VariableDeclaration> variables) : super(comment, metadata) {
+  VariableDeclarationList(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, List<VariableDeclaration> variables) : super(comment, metadata) {
     this._variables = new NodeList<VariableDeclaration>(this);
-    this.keyword = keyword;
     this._type = becomeParentOf(type);
     this._variables.addAll(variables);
   }
@@ -12079,7 +11913,7 @@
    *
    * @return `true` if the variables in this list were declared with the 'const' modifier
    */
-  bool get isConst => keyword is KeywordToken && identical((keyword as KeywordToken).keyword, Keyword.CONST);
+  bool get isConst => keyword is KeywordToken && (keyword as KeywordToken).keyword == Keyword.CONST;
 
   /**
    * Return `true` if the variables in this list were declared with the 'final' modifier.
@@ -12088,7 +11922,7 @@
    *
    * @return `true` if the variables in this list were declared with the 'final' modifier
    */
-  bool get isFinal => keyword is KeywordToken && identical((keyword as KeywordToken).keyword, Keyword.FINAL);
+  bool get isFinal => keyword is KeywordToken && (keyword as KeywordToken).keyword == Keyword.FINAL;
 
   /**
    * Set the type of the variables being declared to the given type name.
@@ -12142,9 +11976,8 @@
    * @param variableList the fields being declared
    * @param semicolon the semicolon terminating the statement
    */
-  VariableDeclarationStatement(VariableDeclarationList variableList, Token semicolon) {
+  VariableDeclarationStatement(VariableDeclarationList variableList, this.semicolon) {
     this._variableList = becomeParentOf(variableList);
-    this.semicolon = semicolon;
   }
 
   @override
@@ -12221,11 +12054,8 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the loop
    */
-  WhileStatement(Token keyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Statement body) {
-    this.keyword = keyword;
-    this.leftParenthesis = leftParenthesis;
+  WhileStatement(this.keyword, this.leftParenthesis, Expression condition, this.rightParenthesis, Statement body) {
     this._condition = becomeParentOf(condition);
-    this.rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
 
@@ -12518,7 +12348,7 @@
       } else if (node.operator.type == TokenType.EQ_EQ) {
         // numeric, string, boolean, or {@code null}
         if (leftOperand is bool && rightOperand is bool) {
-          return identical(leftOperand, rightOperand);
+          return leftOperand == rightOperand;
         } else if (leftOperand is int && rightOperand is int) {
           return leftOperand == rightOperand;
         } else if (leftOperand is double && rightOperand is double) {
@@ -14362,7 +14192,7 @@
   /**
    * The writer to which the source is to be written.
    */
-  PrintWriter _writer;
+  final PrintWriter _writer;
 
   /**
    * Initialize a newly created visitor to write source code representing the visited nodes to the
@@ -14370,9 +14200,7 @@
    *
    * @param writer the writer to which the source is to be written
    */
-  ToSourceVisitor(PrintWriter writer) {
-    this._writer = writer;
-  }
+  ToSourceVisitor(this._writer);
 
   @override
   Object visitAdjacentStrings(AdjacentStrings node) {
@@ -14722,7 +14550,7 @@
         _writer.print(", ");
       }
       if (groupEnd == null && parameter is DefaultFormalParameter) {
-        if (identical(parameter.kind, ParameterKind.NAMED)) {
+        if (parameter.kind == ParameterKind.NAMED) {
           groupEnd = "}";
           _writer.print('{');
         } else {
@@ -16224,7 +16052,7 @@
   @override
   bool visitBooleanLiteral(BooleanLiteral node) {
     BooleanLiteral other = this._other as BooleanLiteral;
-    return _isEqualTokens(node.literal, other.literal) && identical(node.value, other.value);
+    return _isEqualTokens(node.literal, other.literal) && node.value == other.value;
   }
 
   @override
@@ -16314,7 +16142,7 @@
   @override
   bool visitDefaultFormalParameter(DefaultFormalParameter node) {
     DefaultFormalParameter other = this._other as DefaultFormalParameter;
-    return _isEqualNodes(node.parameter, other.parameter) && identical(node.kind, other.kind) && _isEqualTokens(node.separator, other.separator) && _isEqualNodes(node.defaultValue, other.defaultValue);
+    return _isEqualNodes(node.parameter, other.parameter) && node.kind == other.kind && _isEqualTokens(node.separator, other.separator) && _isEqualNodes(node.defaultValue, other.defaultValue);
   }
 
   @override
@@ -16874,17 +16702,17 @@
   /**
    * The node to be replaced during the cloning process.
    */
-  AstNode _oldNode;
+  final AstNode _oldNode;
 
   /**
    * The replacement node used during the cloning process.
    */
-  AstNode _newNode;
+  final AstNode _newNode;
 
   /**
    * A mapping of old tokens to new tokens used during the cloning process.
    */
-  TokenMap _tokenMap;
+  final TokenMap _tokenMap;
 
   /**
    * Construct a new instance that will replace `oldNode` with `newNode` in the process
@@ -16894,11 +16722,7 @@
    * @param newNode the replacement node
    * @param tokenMap a mapping of old tokens to new tokens (not `null`)
    */
-  IncrementalAstCloner(AstNode oldNode, AstNode newNode, TokenMap tokenMap) {
-    this._oldNode = oldNode;
-    this._newNode = newNode;
-    this._tokenMap = tokenMap;
-  }
+  IncrementalAstCloner(this._oldNode, this._newNode, this._tokenMap);
 
   @override
   AdjacentStrings visitAdjacentStrings(AdjacentStrings node) => new AdjacentStrings(_cloneNodeList(node.strings));
@@ -17513,13 +17337,11 @@
 
   Map<String, SimpleIdentifier> _locals = new Map<String, SimpleIdentifier>();
 
-  int _position = 0;
+  final int _position;
 
   bool _referenceIsWithinLocalFunction = false;
 
-  ScopedNameFinder(int position) {
-    this._position = position;
-  }
+  ScopedNameFinder(this._position);
 
   Declaration get declaration => _declarationNode;
 
@@ -17540,7 +17362,7 @@
 
   @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    if (_immediateChild != node.parameters) {
+    if (!identical(_immediateChild, node.parameters)) {
       _addParameters(node.parameters.parameters);
     }
     _declarationNode = node;
@@ -17564,7 +17386,7 @@
 
   @override
   Object visitForStatement(ForStatement node) {
-    if (_immediateChild != node.variables && node.variables != null) {
+    if (!identical(_immediateChild, node.variables) && node.variables != null) {
       _addVariables(node.variables.variables);
     }
     return super.visitForStatement(node);
@@ -17587,7 +17409,7 @@
 
   @override
   Object visitFunctionExpression(FunctionExpression node) {
-    if (node.parameters != null && _immediateChild != node.parameters) {
+    if (node.parameters != null && !identical(_immediateChild, node.parameters)) {
       _addParameters(node.parameters.parameters);
     }
     return super.visitFunctionExpression(node);
@@ -17599,7 +17421,7 @@
     if (node.parameters == null) {
       return null;
     }
-    if (_immediateChild != node.parameters) {
+    if (!identical(_immediateChild, node.parameters)) {
       _addParameters(node.parameters.parameters);
     }
     return null;
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index a63eda8..e7aeff2 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -66,12 +66,12 @@
   /**
    * The source containing the expression(s) that will be evaluated.
    */
-  Source _source;
+  final Source _source;
 
   /**
    * The type provider used to access the known types.
    */
-  TypeProvider _typeProvider;
+  final TypeProvider _typeProvider;
 
   /**
    * Initialize a newly created evaluator to evaluate expressions in the given source.
@@ -79,10 +79,7 @@
    * @param source the source containing the expression(s) that will be evaluated
    * @param typeProvider the type provider used to access known types
    */
-  ConstantEvaluator(Source source, TypeProvider typeProvider) {
-    this._source = source;
-    this._typeProvider = typeProvider;
-  }
+  ConstantEvaluator(this._source, this._typeProvider);
 
   EvaluationResult evaluate(Expression expression) {
     EvaluationResultImpl result = expression.accept(new ConstantVisitor(_typeProvider));
@@ -206,12 +203,12 @@
   /**
    * The value of the expression.
    */
-  DartObject value;
+  final DartObject value;
 
   /**
    * The errors that should be reported for the expression(s) that were evaluated.
    */
-  List<AnalysisError> _errors;
+  final List<AnalysisError> _errors;
 
   /**
    * Initialize a newly created result object with the given state. Clients should use one of the
@@ -220,10 +217,7 @@
    * @param value the value of the expression
    * @param errors the errors that should be reported for the expression(s) that were evaluated
    */
-  EvaluationResult(DartObject value, List<AnalysisError> errors) {
-    this.value = value;
-    this._errors = errors;
-  }
+  EvaluationResult(this.value, this._errors);
 
   /**
    * Return an array containing the errors that should be reported for the expression(s) that were
@@ -278,7 +272,7 @@
   /**
    * The type provider used to access the known types.
    */
-  TypeProvider _typeProvider;
+  final TypeProvider _typeProvider;
 
   /**
    * The object used to find constant variables in the compilation units that were added.
@@ -301,9 +295,7 @@
    *
    * @param typeProvider the type provider used to access known types
    */
-  ConstantValueComputer(TypeProvider typeProvider) {
-    this._typeProvider = typeProvider;
-  }
+  ConstantValueComputer(this._typeProvider);
 
   /**
    * Add the constant variables in the given compilation unit to the list of constant variables
@@ -438,7 +430,7 @@
   /**
    * The type provider used to access the known types.
    */
-  TypeProvider _typeProvider;
+  final TypeProvider _typeProvider;
 
   /**
    * An shared object representing the value 'null'.
@@ -450,9 +442,7 @@
    *
    * @param typeProvider the type provider used to access known types
    */
-  ConstantVisitor(TypeProvider typeProvider) {
-    this._typeProvider = typeProvider;
-  }
+  ConstantVisitor(this._typeProvider);
 
   @override
   EvaluationResultImpl visitAdjacentStrings(AdjacentStrings node) {
@@ -601,14 +591,17 @@
       for (int i = 0; i < parameterCount; i++) {
         ParameterElement parameter = parameters[i];
         if (parameter.isInitializingFormal) {
-          String fieldName = (parameter as FieldFormalParameterElement).field.name;
-          if (identical(parameter.parameterKind, ParameterKind.NAMED)) {
-            DartObjectImpl argumentValue = namedArgumentValues[parameter.name];
-            if (argumentValue != null) {
-              fieldMap[fieldName] = argumentValue;
+          FieldElement field = (parameter as FieldFormalParameterElement).field;
+          if (field != null) {
+            String fieldName = field.name;
+            if (parameter.parameterKind == ParameterKind.NAMED) {
+              DartObjectImpl argumentValue = namedArgumentValues[parameter.name];
+              if (argumentValue != null) {
+                fieldMap[fieldName] = argumentValue;
+              }
+            } else if (i < argumentCount) {
+              fieldMap[fieldName] = argumentValues[i];
             }
-          } else if (i < argumentCount) {
-            fieldMap[fieldName] = argumentValues[i];
           }
         }
       }
@@ -1127,12 +1120,12 @@
   /**
    * The node against which the error should be reported.
    */
-  AstNode node;
+  final AstNode node;
 
   /**
    * The error code for the error to be generated.
    */
-  ErrorCode errorCode;
+  final ErrorCode errorCode;
 
   /**
    * Initialize a newly created data holder to represent the error with the given code reported
@@ -1141,10 +1134,7 @@
    * @param node the node against which the error should be reported
    * @param errorCode the error code for the error to be generated
    */
-  ErrorResult_ErrorData(AstNode node, ErrorCode errorCode) {
-    this.node = node;
-    this.errorCode = errorCode;
-  }
+  ErrorResult_ErrorData(this.node, this.errorCode);
 }
 
 /**
@@ -1300,13 +1290,13 @@
   /**
    * The element representing the variable whose initializer will be visited.
    */
-  VariableElement _source;
+  final VariableElement _source;
 
   /**
    * A graph in which the nodes are the constant variables and the edges are from each variable to
    * the other constant variables that are referenced in the head's initializer.
    */
-  DirectedGraph<VariableElement> _referenceGraph;
+  final DirectedGraph<VariableElement> _referenceGraph;
 
   /**
    * Initialize a newly created reference finder to find references from the given variable to other
@@ -1316,10 +1306,7 @@
    * @param referenceGraph a graph recording which variables (heads) reference which other variables
    *          (tails) in their initializers
    */
-  ReferenceFinder(VariableElement source, DirectedGraph<VariableElement> referenceGraph) {
-    this._source = source;
-    this._referenceGraph = referenceGraph;
-  }
+  ReferenceFinder(this._source, this._referenceGraph);
 
   @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
@@ -1345,16 +1332,14 @@
   /**
    * The value of the expression.
    */
-  DartObjectImpl value;
+  final DartObjectImpl value;
 
   /**
    * Initialize a newly created result to represent the given value.
    *
    * @param value the value of the expression
    */
-  ValidResult(DartObjectImpl value) {
-    this.value = value;
-  }
+  ValidResult(this.value);
 
   @override
   EvaluationResultImpl add(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToValid(typeProvider, node, this);
@@ -1792,7 +1777,7 @@
   /**
    * The value of this instance.
    */
-  bool value = false;
+  final bool value;
 
   /**
    * An instance representing the boolean value 'false'.
@@ -1822,9 +1807,7 @@
    *
    * @param value the value of this instance
    */
-  BoolState(bool value) {
-    this.value = value;
-  }
+  BoolState(this.value);
 
   @override
   BoolState convertToBool() => this;
@@ -1915,12 +1898,12 @@
   /**
    * The run-time type of this object.
    */
-  InterfaceType type;
+  final InterfaceType type;
 
   /**
    * The state of the object.
    */
-  InstanceState _state;
+  final InstanceState _state;
 
   /**
    * Initialize a newly created object to have the given type and state.
@@ -1928,10 +1911,7 @@
    * @param type the run-time type of this object
    * @param state the state of the object
    */
-  DartObjectImpl(InterfaceType type, InstanceState state) {
-    this.type = type;
-    this._state = state;
-  }
+  DartObjectImpl(this.type, this._state);
 
   /**
    * Return the result of invoking the '+' operator on this object with the given argument.
@@ -2365,7 +2345,7 @@
   /**
    * The value of this instance.
    */
-  double value = 0.0;
+  final double value;
 
   /**
    * A state that can be used to represent a double whose value is not known.
@@ -2377,9 +2357,7 @@
    *
    * @param value the value of this instance
    */
-  DoubleState(double value) {
-    this.value = value;
-  }
+  DoubleState(this.value);
 
   @override
   NumState add(InstanceState rightOperand) {
@@ -2855,16 +2833,14 @@
   /**
    * The error code associated with the exception.
    */
-  ErrorCode errorCode;
+  final ErrorCode errorCode;
 
   /**
    * Initialize a newly created exception to have the given error code.
    *
    * @param errorCode the error code associated with the exception
    */
-  EvaluationException(ErrorCode errorCode) {
-    this.errorCode = errorCode;
-  }
+  EvaluationException(this.errorCode);
 }
 
 /**
@@ -2875,16 +2851,14 @@
   /**
    * The element representing the function being modeled.
    */
-  ExecutableElement _element;
+  final ExecutableElement _element;
 
   /**
    * Initialize a newly created state to represent the given function.
    *
    * @param element the element representing the function being modeled
    */
-  FunctionState(ExecutableElement element) {
-    this._element = element;
-  }
+  FunctionState(this._element);
 
   @override
   StringState convertToString() {
@@ -2932,7 +2906,7 @@
   /**
    * The values of the fields of this instance.
    */
-  Map<String, DartObjectImpl> _fieldMap = new Map<String, DartObjectImpl>();
+  final Map<String, DartObjectImpl> _fieldMap;
 
   /**
    * A state that can be used to represent an object whose state is not known.
@@ -2944,9 +2918,7 @@
    *
    * @param fieldMap the values of the fields of this instance
    */
-  GenericState(Map<String, DartObjectImpl> fieldMap) {
-    this._fieldMap = fieldMap;
-  }
+  GenericState(this._fieldMap);
 
   @override
   StringState convertToString() => StringState.UNKNOWN_VALUE;
@@ -3400,7 +3372,7 @@
   /**
    * The value of this instance.
    */
-  int value = 0;
+  final int value;
 
   /**
    * A state that can be used to represent an int whose value is not known.
@@ -3412,9 +3384,7 @@
    *
    * @param value the value of this instance
    */
-  IntState(int value) {
-    this.value = value;
-  }
+  IntState(this.value);
 
   @override
   NumState add(InstanceState rightOperand) {
@@ -3847,16 +3817,14 @@
   /**
    * The elements of the list.
    */
-  List<DartObjectImpl> _elements;
+  final List<DartObjectImpl> _elements;
 
   /**
    * Initialize a newly created state to represent a list with the given elements.
    *
    * @param elements the elements of the list
    */
-  ListState(List<DartObjectImpl> elements) {
-    this._elements = elements;
-  }
+  ListState(this._elements);
 
   @override
   StringState convertToString() => StringState.UNKNOWN_VALUE;
@@ -3937,16 +3905,14 @@
   /**
    * The entries in the map.
    */
-  Map<DartObjectImpl, DartObjectImpl> _entries;
+  final Map<DartObjectImpl, DartObjectImpl> _entries;
 
   /**
    * Initialize a newly created state to represent a map with the given entries.
    *
    * @param entries the entries in the map
    */
-  MapState(Map<DartObjectImpl, DartObjectImpl> entries) {
-    this._entries = entries;
-  }
+  MapState(this._entries);
 
   @override
   StringState convertToString() => StringState.UNKNOWN_VALUE;
@@ -4186,7 +4152,7 @@
   /**
    * The value of this instance.
    */
-  String value;
+  final String value;
 
   /**
    * A state that can be used to represent a double whose value is not known.
@@ -4198,9 +4164,7 @@
    *
    * @param value the value of this instance
    */
-  StringState(String value) {
-    this.value = value;
-  }
+  StringState(this.value);
 
   @override
   StringState concatenate(InstanceState rightOperand) {
@@ -4267,16 +4231,14 @@
   /**
    * The value of this instance.
    */
-  String value;
+  final String value;
 
   /**
    * Initialize a newly created state to represent the given value.
    *
    * @param value the value of this instance
    */
-  SymbolState(String value) {
-    this.value = value;
-  }
+  SymbolState(this.value);
 
   @override
   StringState convertToString() {
@@ -4327,16 +4289,14 @@
   /**
    * The element representing the type being modeled.
    */
-  Element _element;
+  final Element _element;
 
   /**
    * Initialize a newly created state to represent the given value.
    *
    * @param element the element representing the type being modeled
    */
-  TypeState(Element element) {
-    this._element = element;
-  }
+  TypeState(this._element);
 
   @override
   StringState convertToString() {
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index b54f1a9..85c655f 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -731,73 +731,73 @@
  * The enumeration `ElementKind` defines the various kinds of elements in the element model.
  */
 class ElementKind extends Enum<ElementKind> {
-  static final ElementKind ANGULAR_FILTER = new ElementKind('ANGULAR_FILTER', 0, "Angular filter");
+  static const ElementKind ANGULAR_FILTER = const ElementKind('ANGULAR_FILTER', 0, "Angular filter");
 
-  static final ElementKind ANGULAR_COMPONENT = new ElementKind('ANGULAR_COMPONENT', 1, "Angular component");
+  static const ElementKind ANGULAR_COMPONENT = const ElementKind('ANGULAR_COMPONENT', 1, "Angular component");
 
-  static final ElementKind ANGULAR_CONTROLLER = new ElementKind('ANGULAR_CONTROLLER', 2, "Angular controller");
+  static const ElementKind ANGULAR_CONTROLLER = const ElementKind('ANGULAR_CONTROLLER', 2, "Angular controller");
 
-  static final ElementKind ANGULAR_DIRECTIVE = new ElementKind('ANGULAR_DIRECTIVE', 3, "Angular directive");
+  static const ElementKind ANGULAR_DIRECTIVE = const ElementKind('ANGULAR_DIRECTIVE', 3, "Angular directive");
 
-  static final ElementKind ANGULAR_PROPERTY = new ElementKind('ANGULAR_PROPERTY', 4, "Angular property");
+  static const ElementKind ANGULAR_PROPERTY = const ElementKind('ANGULAR_PROPERTY', 4, "Angular property");
 
-  static final ElementKind ANGULAR_SCOPE_PROPERTY = new ElementKind('ANGULAR_SCOPE_PROPERTY', 5, "Angular scope property");
+  static const ElementKind ANGULAR_SCOPE_PROPERTY = const ElementKind('ANGULAR_SCOPE_PROPERTY', 5, "Angular scope property");
 
-  static final ElementKind ANGULAR_SELECTOR = new ElementKind('ANGULAR_SELECTOR', 6, "Angular selector");
+  static const ElementKind ANGULAR_SELECTOR = const ElementKind('ANGULAR_SELECTOR', 6, "Angular selector");
 
-  static final ElementKind ANGULAR_VIEW = new ElementKind('ANGULAR_VIEW', 7, "Angular view");
+  static const ElementKind ANGULAR_VIEW = const ElementKind('ANGULAR_VIEW', 7, "Angular view");
 
-  static final ElementKind CLASS = new ElementKind('CLASS', 8, "class");
+  static const ElementKind CLASS = const ElementKind('CLASS', 8, "class");
 
-  static final ElementKind COMPILATION_UNIT = new ElementKind('COMPILATION_UNIT', 9, "compilation unit");
+  static const ElementKind COMPILATION_UNIT = const ElementKind('COMPILATION_UNIT', 9, "compilation unit");
 
-  static final ElementKind CONSTRUCTOR = new ElementKind('CONSTRUCTOR', 10, "constructor");
+  static const ElementKind CONSTRUCTOR = const ElementKind('CONSTRUCTOR', 10, "constructor");
 
-  static final ElementKind DYNAMIC = new ElementKind('DYNAMIC', 11, "<dynamic>");
+  static const ElementKind DYNAMIC = const ElementKind('DYNAMIC', 11, "<dynamic>");
 
-  static final ElementKind EMBEDDED_HTML_SCRIPT = new ElementKind('EMBEDDED_HTML_SCRIPT', 12, "embedded html script");
+  static const ElementKind EMBEDDED_HTML_SCRIPT = const ElementKind('EMBEDDED_HTML_SCRIPT', 12, "embedded html script");
 
-  static final ElementKind ERROR = new ElementKind('ERROR', 13, "<error>");
+  static const ElementKind ERROR = const ElementKind('ERROR', 13, "<error>");
 
-  static final ElementKind EXPORT = new ElementKind('EXPORT', 14, "export directive");
+  static const ElementKind EXPORT = const ElementKind('EXPORT', 14, "export directive");
 
-  static final ElementKind EXTERNAL_HTML_SCRIPT = new ElementKind('EXTERNAL_HTML_SCRIPT', 15, "external html script");
+  static const ElementKind EXTERNAL_HTML_SCRIPT = const ElementKind('EXTERNAL_HTML_SCRIPT', 15, "external html script");
 
-  static final ElementKind FIELD = new ElementKind('FIELD', 16, "field");
+  static const ElementKind FIELD = const ElementKind('FIELD', 16, "field");
 
-  static final ElementKind FUNCTION = new ElementKind('FUNCTION', 17, "function");
+  static const ElementKind FUNCTION = const ElementKind('FUNCTION', 17, "function");
 
-  static final ElementKind GETTER = new ElementKind('GETTER', 18, "getter");
+  static const ElementKind GETTER = const ElementKind('GETTER', 18, "getter");
 
-  static final ElementKind HTML = new ElementKind('HTML', 19, "html");
+  static const ElementKind HTML = const ElementKind('HTML', 19, "html");
 
-  static final ElementKind IMPORT = new ElementKind('IMPORT', 20, "import directive");
+  static const ElementKind IMPORT = const ElementKind('IMPORT', 20, "import directive");
 
-  static final ElementKind LABEL = new ElementKind('LABEL', 21, "label");
+  static const ElementKind LABEL = const ElementKind('LABEL', 21, "label");
 
-  static final ElementKind LIBRARY = new ElementKind('LIBRARY', 22, "library");
+  static const ElementKind LIBRARY = const ElementKind('LIBRARY', 22, "library");
 
-  static final ElementKind LOCAL_VARIABLE = new ElementKind('LOCAL_VARIABLE', 23, "local variable");
+  static const ElementKind LOCAL_VARIABLE = const ElementKind('LOCAL_VARIABLE', 23, "local variable");
 
-  static final ElementKind METHOD = new ElementKind('METHOD', 24, "method");
+  static const ElementKind METHOD = const ElementKind('METHOD', 24, "method");
 
-  static final ElementKind NAME = new ElementKind('NAME', 25, "<name>");
+  static const ElementKind NAME = const ElementKind('NAME', 25, "<name>");
 
-  static final ElementKind PARAMETER = new ElementKind('PARAMETER', 26, "parameter");
+  static const ElementKind PARAMETER = const ElementKind('PARAMETER', 26, "parameter");
 
-  static final ElementKind PREFIX = new ElementKind('PREFIX', 27, "import prefix");
+  static const ElementKind PREFIX = const ElementKind('PREFIX', 27, "import prefix");
 
-  static final ElementKind SETTER = new ElementKind('SETTER', 28, "setter");
+  static const ElementKind SETTER = const ElementKind('SETTER', 28, "setter");
 
-  static final ElementKind TOP_LEVEL_VARIABLE = new ElementKind('TOP_LEVEL_VARIABLE', 29, "top level variable");
+  static const ElementKind TOP_LEVEL_VARIABLE = const ElementKind('TOP_LEVEL_VARIABLE', 29, "top level variable");
 
-  static final ElementKind FUNCTION_TYPE_ALIAS = new ElementKind('FUNCTION_TYPE_ALIAS', 30, "function type alias");
+  static const ElementKind FUNCTION_TYPE_ALIAS = const ElementKind('FUNCTION_TYPE_ALIAS', 30, "function type alias");
 
-  static final ElementKind TYPE_PARAMETER = new ElementKind('TYPE_PARAMETER', 31, "type parameter");
+  static const ElementKind TYPE_PARAMETER = const ElementKind('TYPE_PARAMETER', 31, "type parameter");
 
-  static final ElementKind UNIVERSE = new ElementKind('UNIVERSE', 32, "<universe>");
+  static const ElementKind UNIVERSE = const ElementKind('UNIVERSE', 32, "<universe>");
 
-  static final List<ElementKind> values = [
+  static const List<ElementKind> values = const [
       ANGULAR_FILTER,
       ANGULAR_COMPONENT,
       ANGULAR_CONTROLLER,
@@ -849,16 +849,14 @@
   /**
    * The name displayed in the UI for this kind of element.
    */
-  String displayName;
+  final String displayName;
 
   /**
    * Initialize a newly created element kind to have the given display name.
    *
    * @param displayName the name displayed in the UI for this kind of element
    */
-  ElementKind(String name, int ordinal, String displayName) : super(name, ordinal) {
-    this.displayName = displayName;
-  }
+  const ElementKind(String name, int ordinal, this.displayName) : super(name, ordinal);
 }
 
 /**
@@ -1987,35 +1985,35 @@
    * interpolated if it contains binding {{}} syntax and assigned to the expression. (cost: 0
    * watches)
    */
-  static final AngularPropertyKind ATTR = new AngularPropertyKind('ATTR', 0);
+  static const AngularPropertyKind ATTR = const AngularPropertyKind('ATTR', 0);
 
   /**
    * `&` - Treat the DOM attribute value as an expression. Assign a closure function into the field.
    * This allows the component to control the invocation of the closure. This is useful for passing
    * expressions into controllers which act like callbacks. (cost: 0 watches)
    */
-  static final AngularPropertyKind CALLBACK = new AngularPropertyKind('CALLBACK', 1);
+  static const AngularPropertyKind CALLBACK = const AngularPropertyKind('CALLBACK', 1);
 
   /**
    * `=>` - Treat the DOM attribute value as an expression. Set up a watch, which will read the
    * expression in the attribute and assign the value to destination expression. (cost: 1 watch)
    */
-  static final AngularPropertyKind ONE_WAY = new AngularPropertyKind('ONE_WAY', 2);
+  static const AngularPropertyKind ONE_WAY = const AngularPropertyKind('ONE_WAY', 2);
 
   /**
    * `=>!` - Treat the DOM attribute value as an expression. Set up a one time watch on expression.
    * Once the expression turns not null it will no longer update. (cost: 1 watches until not null,
    * then 0 watches)
    */
-  static final AngularPropertyKind ONE_WAY_ONE_TIME = new AngularPropertyKind('ONE_WAY_ONE_TIME', 3);
+  static const AngularPropertyKind ONE_WAY_ONE_TIME = const AngularPropertyKind('ONE_WAY_ONE_TIME', 3);
 
   /**
    * `<=>` - Treat the DOM attribute value as an expression. Set up a watch on both outside as well
    * as component scope to keep the source and destination in sync. (cost: 2 watches)
    */
-  static final AngularPropertyKind TWO_WAY = new AngularPropertyKind_TWO_WAY('TWO_WAY', 4);
+  static const AngularPropertyKind TWO_WAY = const AngularPropertyKind_TWO_WAY('TWO_WAY', 4);
 
-  static final List<AngularPropertyKind> values = [ATTR, CALLBACK, ONE_WAY, ONE_WAY_ONE_TIME, TWO_WAY];
+  static const List<AngularPropertyKind> values = const [ATTR, CALLBACK, ONE_WAY, ONE_WAY_ONE_TIME, TWO_WAY];
 
   /**
    * Returns `true` if property of this kind calls field getter.
@@ -2027,11 +2025,11 @@
    */
   bool callsSetter() => true;
 
-  AngularPropertyKind(String name, int ordinal) : super(name, ordinal);
+  const AngularPropertyKind(String name, int ordinal) : super(name, ordinal);
 }
 
 class AngularPropertyKind_TWO_WAY extends AngularPropertyKind {
-  AngularPropertyKind_TWO_WAY(String name, int ordinal) : super(name, ordinal);
+  const AngularPropertyKind_TWO_WAY(String name, int ordinal) : super(name, ordinal);
 
   @override
   bool callsGetter() => true;
@@ -2567,13 +2565,13 @@
    * The element based on propagated type information, or `null` if the AST structure has not
    * been resolved or if this identifier could not be resolved.
    */
-  ExecutableElement propagatedElement;
+  final ExecutableElement propagatedElement;
 
   /**
    * The element associated with this identifier based on static type information, or `null`
    * if the AST structure has not been resolved or if this identifier could not be resolved.
    */
-  ExecutableElement staticElement;
+  final ExecutableElement staticElement;
 
   /**
    * Create the [AuxiliaryElements] with a static and propagated [ExecutableElement].
@@ -2581,10 +2579,7 @@
    * @param staticElement the static element
    * @param propagatedElement the propagated element
    */
-  AuxiliaryElements(ExecutableElement staticElement, ExecutableElement propagatedElement) {
-    this.staticElement = staticElement;
-    this.propagatedElement = propagatedElement;
-  }
+  AuxiliaryElements(this.staticElement, this.propagatedElement);
 }
 
 /**
@@ -3095,7 +3090,7 @@
       ClassElement currentElement = currentType.element;
       if (!visitedClasses.contains(currentElement)) {
         visitedClasses.add(currentElement);
-        if (currentType != this.type) {
+        if (!identical(currentType, this.type)) {
           supertypes.add(currentType);
         }
         InterfaceType supertype = currentType.superclass;
@@ -3532,7 +3527,7 @@
     }
     // no required parameters
     for (ParameterElement parameter in parameters) {
-      if (identical(parameter.parameterKind, ParameterKind.REQUIRED)) {
+      if (parameter.parameterKind == ParameterKind.REQUIRED) {
         return false;
       }
     }
@@ -3668,7 +3663,7 @@
   /**
    * The element representing the field, variable, or constructor being used as an annotation.
    */
-  Element element;
+  final Element element;
 
   /**
    * An empty array of annotations.
@@ -3702,9 +3697,7 @@
    * @param element the element representing the field, variable, or constructor being used as an
    *          annotation
    */
-  ElementAnnotationImpl(Element element) {
-    this.element = element;
-  }
+  ElementAnnotationImpl(this.element);
 
   @override
   bool get isDeprecated {
@@ -3805,9 +3798,8 @@
    * @param nameOffset the offset of the name of this element in the file that contains the
    *          declaration of this element
    */
-  ElementImpl(String name, int nameOffset) {
+  ElementImpl(String name, this.nameOffset) {
     this._name = StringUtilities.intern(name);
-    this.nameOffset = nameOffset;
   }
 
   @override
@@ -4270,12 +4262,12 @@
   /**
    * The first [Element]
    */
-  Element _first;
+  final Element _first;
 
   /**
    * The second [Element]
    */
-  Element _second;
+  final Element _second;
 
   /**
    * The sole constructor for this class, taking two [Element]s.
@@ -4283,10 +4275,7 @@
    * @param first the first element
    * @param second the second element
    */
-  ElementPair(Element first, Element second) {
-    this._first = first;
-    this._second = second;
-  }
+  ElementPair(this._first, this._second);
 
   @override
   bool operator ==(Object object) {
@@ -4530,10 +4519,10 @@
           if (closing != null) {
             builder.append(closing);
           }
-          if (identical(parameterKind, ParameterKind.POSITIONAL)) {
+          if (parameterKind == ParameterKind.POSITIONAL) {
             builder.append("[");
             closing = "]";
-          } else if (identical(parameterKind, ParameterKind.NAMED)) {
+          } else if (parameterKind == ParameterKind.NAMED) {
             builder.append("{");
             closing = "}";
           } else {
@@ -4961,7 +4950,7 @@
   /**
    * The analysis context in which this library is defined.
    */
-  AnalysisContext context;
+  final AnalysisContext context;
 
   /**
    * The scripts contained in or referenced from script tags in the HTML file.
@@ -4985,9 +4974,7 @@
    * @param context the analysis context in which the HTML file is defined
    * @param name the name of this element
    */
-  HtmlElementImpl(AnalysisContext context, String name) : super(name, -1) {
-    this.context = context;
-  }
+  HtmlElementImpl(this.context, String name) : super(name, -1);
 
   @override
   accept(ElementVisitor visitor) => visitor.visitHtmlElement(this);
@@ -5123,13 +5110,13 @@
   /**
    * A flag indicating whether this label is associated with a `switch` statement.
    */
-  bool _onSwitchStatement = false;
+  final bool _onSwitchStatement;
 
   /**
    * A flag indicating whether this label is associated with a `switch` member (`case`
    * or `default`).
    */
-  bool _onSwitchMember = false;
+  final bool _onSwitchMember;
 
   /**
    * An empty array of label elements.
@@ -5144,10 +5131,7 @@
    *          statement
    * @param onSwitchMember `true` if this label is associated with a `switch` member
    */
-  LabelElementImpl(Identifier name, bool onSwitchStatement, bool onSwitchMember) : super.forNode(name) {
-    this._onSwitchStatement = onSwitchStatement;
-    this._onSwitchMember = onSwitchMember;
-  }
+  LabelElementImpl(Identifier name, this._onSwitchStatement, this._onSwitchMember) : super.forNode(name);
 
   @override
   accept(ElementVisitor visitor) => visitor.visitLabelElement(this);
@@ -5223,7 +5207,7 @@
   /**
    * The analysis context in which this library is defined.
    */
-  AnalysisContext context;
+  final AnalysisContext context;
 
   /**
    * The compilation unit that defines this library.
@@ -5262,9 +5246,7 @@
    * @param context the analysis context in which the library is defined
    * @param name the name of this element
    */
-  LibraryElementImpl(AnalysisContext context, LibraryIdentifier name) : super.forNode(name) {
-    this.context = context;
-  }
+  LibraryElementImpl(this.context, LibraryIdentifier name) : super.forNode(name);
 
   @override
   accept(ElementVisitor visitor) => visitor.visitLibraryElement(this);
@@ -5762,58 +5744,58 @@
   /**
    * Indicates that the modifier 'abstract' was applied to the element.
    */
-  static final Modifier ABSTRACT = new Modifier('ABSTRACT', 0);
+  static const Modifier ABSTRACT = const Modifier('ABSTRACT', 0);
 
   /**
    * Indicates that the modifier 'const' was applied to the element.
    */
-  static final Modifier CONST = new Modifier('CONST', 1);
+  static const Modifier CONST = const Modifier('CONST', 1);
 
   /**
    * Indicates that the modifier 'factory' was applied to the element.
    */
-  static final Modifier FACTORY = new Modifier('FACTORY', 2);
+  static const Modifier FACTORY = const Modifier('FACTORY', 2);
 
   /**
    * Indicates that the modifier 'final' was applied to the element.
    */
-  static final Modifier FINAL = new Modifier('FINAL', 3);
+  static const Modifier FINAL = const Modifier('FINAL', 3);
 
   /**
    * Indicates that the pseudo-modifier 'get' was applied to the element.
    */
-  static final Modifier GETTER = new Modifier('GETTER', 4);
+  static const Modifier GETTER = const Modifier('GETTER', 4);
 
   /**
    * A flag used for libraries indicating that the defining compilation unit contains at least one
    * import directive whose URI uses the "dart-ext" scheme.
    */
-  static final Modifier HAS_EXT_URI = new Modifier('HAS_EXT_URI', 5);
+  static const Modifier HAS_EXT_URI = const Modifier('HAS_EXT_URI', 5);
 
-  static final Modifier MIXIN = new Modifier('MIXIN', 6);
+  static const Modifier MIXIN = const Modifier('MIXIN', 6);
 
-  static final Modifier REFERENCES_SUPER = new Modifier('REFERENCES_SUPER', 7);
+  static const Modifier REFERENCES_SUPER = const Modifier('REFERENCES_SUPER', 7);
 
   /**
    * Indicates that the pseudo-modifier 'set' was applied to the element.
    */
-  static final Modifier SETTER = new Modifier('SETTER', 8);
+  static const Modifier SETTER = const Modifier('SETTER', 8);
 
   /**
    * Indicates that the modifier 'static' was applied to the element.
    */
-  static final Modifier STATIC = new Modifier('STATIC', 9);
+  static const Modifier STATIC = const Modifier('STATIC', 9);
 
   /**
    * Indicates that the element does not appear in the source code but was implicitly created. For
    * example, if a class does not define any constructors, an implicit zero-argument constructor
    * will be created and it will be marked as being synthetic.
    */
-  static final Modifier SYNTHETIC = new Modifier('SYNTHETIC', 10);
+  static const Modifier SYNTHETIC = const Modifier('SYNTHETIC', 10);
 
-  static final Modifier TYPEDEF = new Modifier('TYPEDEF', 11);
+  static const Modifier TYPEDEF = const Modifier('TYPEDEF', 11);
 
-  static final List<Modifier> values = [
+  static const List<Modifier> values = const [
       ABSTRACT,
       CONST,
       FACTORY,
@@ -5827,7 +5809,7 @@
       SYNTHETIC,
       TYPEDEF];
 
-  Modifier(String name, int ordinal) : super(name, ordinal);
+  const Modifier(String name, int ordinal) : super(name, ordinal);
 }
 
 /**
@@ -5889,7 +5871,7 @@
   /**
    * The analysis context in which the multiply defined elements are defined.
    */
-  AnalysisContext context;
+  final AnalysisContext context;
 
   /**
    * The name of the conflicting elements.
@@ -5899,7 +5881,7 @@
   /**
    * A list containing all of the elements that conflict.
    */
-  List<Element> conflictingElements;
+  final List<Element> conflictingElements;
 
   /**
    * Initialize a newly created element to represent a list of conflicting elements.
@@ -5907,10 +5889,8 @@
    * @param context the analysis context in which the multiply defined elements are defined
    * @param conflictingElements the elements that conflict
    */
-  MultiplyDefinedElementImpl(AnalysisContext context, List<Element> conflictingElements) {
-    this.context = context;
+  MultiplyDefinedElementImpl(this.context, this.conflictingElements) {
     _name = conflictingElements[0].name;
-    this.conflictingElements = conflictingElements;
   }
 
   @override
@@ -6339,7 +6319,7 @@
   accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
 
   @override
-  bool operator ==(Object object) => super == object && identical(isGetter, (object as PropertyAccessorElement).isGetter);
+  bool operator ==(Object object) => super == object && isGetter == (object as PropertyAccessorElement).isGetter;
 
   @override
   PropertyAccessorElement get correspondingGetter {
@@ -6774,20 +6754,15 @@
  * Information about Angular application.
  */
 class AngularApplication {
-  Source entryPoint;
+  final Source entryPoint;
 
-  Set<Source> _librarySources;
+  final Set<Source> _librarySources;
 
-  List<AngularElement> elements;
+  final List<AngularElement> elements;
 
-  List<Source> elementSources;
+  final List<Source> elementSources;
 
-  AngularApplication(Source entryPoint, Set<Source> librarySources, List<AngularElement> elements, List<Source> elementSources) {
-    this.entryPoint = entryPoint;
-    this._librarySources = librarySources;
-    this.elements = elements;
-    this.elementSources = elementSources;
-  }
+  AngularApplication(this.entryPoint, this._librarySources, this.elements, this.elementSources);
 
   /**
    * Checks if this application depends on the library with the given [Source].
@@ -6802,7 +6777,7 @@
   /**
    * The offset of the defining <code>NgComponent</code> annotation.
    */
-  int _annotationOffset = 0;
+  final int _annotationOffset;
 
   /**
    * The array containing all of the properties declared by this component.
@@ -6846,9 +6821,7 @@
    * @param nameOffset the offset of the name of this element in the file that contains the
    *          declaration of this element
    */
-  AngularComponentElementImpl(String name, int nameOffset, int annotationOffset) : super(name, nameOffset) {
-    this._annotationOffset = annotationOffset;
-  }
+  AngularComponentElementImpl(String name, int nameOffset, this._annotationOffset) : super(name, nameOffset);
 
   @override
   accept(ElementVisitor visitor) => visitor.visitAngularComponentElement(this);
@@ -6924,7 +6897,7 @@
   /**
    * The offset of the annotation that defines this directive.
    */
-  int _offset = 0;
+  final int _offset;
 
   /**
    * The array containing all of the properties declared by this directive.
@@ -6936,9 +6909,7 @@
    *
    * @param offset the offset of the annotation that defines this directive
    */
-  AngularDirectiveElementImpl(int offset) : super(null, -1) {
-    this._offset = offset;
-  }
+  AngularDirectiveElementImpl(this._offset) : super(null, -1);
 
   @override
   accept(ElementVisitor visitor) => visitor.visitAngularDirectiveElement(this);
@@ -7136,7 +7107,7 @@
   /**
    * The type of the property
    */
-  DartType type;
+  final DartType type;
 
   /**
    * Initialize a newly created Angular scope property to have the given name.
@@ -7145,9 +7116,7 @@
    * @param nameOffset the offset of the name of this element in the file that contains the
    *          declaration of this element
    */
-  AngularScopePropertyElementImpl(String name, int nameOffset, DartType type) : super(name, nameOffset) {
-    this.type = type;
-  }
+  AngularScopePropertyElementImpl(String name, int nameOffset, this.type) : super(name, nameOffset);
 
   @override
   accept(ElementVisitor visitor) => visitor.visitAngularScopePropertyElement(this);
@@ -7199,12 +7168,12 @@
   /**
    * The HTML template URI.
    */
-  String templateUri;
+  final String templateUri;
 
   /**
    * The offset of the [templateUri] in the [getSource].
    */
-  int templateUriOffset = 0;
+  final int templateUriOffset;
 
   /**
    * The HTML template source.
@@ -7214,10 +7183,7 @@
   /**
    * Initialize a newly created Angular view.
    */
-  AngularViewElementImpl(String templateUri, int templateUriOffset) : super(null, -1) {
-    this.templateUri = templateUri;
-    this.templateUriOffset = templateUriOffset;
-  }
+  AngularViewElementImpl(this.templateUri, this.templateUriOffset) : super(null, -1);
 
   @override
   accept(ElementVisitor visitor) => visitor.visitAngularViewElement(this);
@@ -7253,14 +7219,11 @@
  * Combination of [AngularTagSelectorElementImpl] and [HasAttributeSelectorElementImpl].
  */
 class IsTagHasAttributeSelectorElementImpl extends AngularSelectorElementImpl {
-  String tagName;
+  final String tagName;
 
-  String attributeName;
+  final String attributeName;
 
-  IsTagHasAttributeSelectorElementImpl(String tagName, String attributeName) : super(null, -1) {
-    this.tagName = tagName;
-    this.attributeName = attributeName;
-  }
+  IsTagHasAttributeSelectorElementImpl(this.tagName, this.attributeName) : super(null, -1);
 
   @override
   bool apply(XmlTagNode node) => node.tag == tagName && node.getAttribute(attributeName) != null;
@@ -7534,12 +7497,12 @@
   /**
    * The element on which the parameterized element was created.
    */
-  Element _baseElement;
+  final Element _baseElement;
 
   /**
    * The type in which the element is defined.
    */
-  ParameterizedType _definingType;
+  final ParameterizedType _definingType;
 
   /**
    * Initialize a newly created element to represent the member of the given parameterized type.
@@ -7547,10 +7510,7 @@
    * @param baseElement the element on which the parameterized element was created
    * @param definingType the type in which the element is defined
    */
-  Member(Element baseElement, ParameterizedType definingType) {
-    this._baseElement = baseElement;
-    this._definingType = definingType;
-  }
+  Member(this._baseElement, this._definingType);
 
   @override
   String computeDocumentationComment() => _baseElement.computeDocumentationComment();
@@ -8295,7 +8255,7 @@
     }
     List<DartType> typeParameters = TypeParameterTypeImpl.getTypes(this.typeParameters);
     for (ParameterElement parameter in parameters) {
-      if (identical(parameter.parameterKind, ParameterKind.NAMED)) {
+      if (parameter.parameterKind == ParameterKind.NAMED) {
         namedParameterTypes[parameter.name] = parameter.type.substitute2(typeArguments, typeParameters);
       }
     }
@@ -8311,7 +8271,7 @@
     List<DartType> typeParameters = TypeParameterTypeImpl.getTypes(this.typeParameters);
     List<DartType> types = new List<DartType>();
     for (ParameterElement parameter in parameters) {
-      if (identical(parameter.parameterKind, ParameterKind.REQUIRED)) {
+      if (parameter.parameterKind == ParameterKind.REQUIRED) {
         types.add(parameter.type.substitute2(typeArguments, typeParameters));
       }
     }
@@ -8327,7 +8287,7 @@
     List<DartType> typeParameters = TypeParameterTypeImpl.getTypes(this.typeParameters);
     List<DartType> types = new List<DartType>();
     for (ParameterElement parameter in parameters) {
-      if (identical(parameter.parameterKind, ParameterKind.POSITIONAL)) {
+      if (parameter.parameterKind == ParameterKind.POSITIONAL) {
         types.add(parameter.type.substitute2(typeArguments, typeParameters));
       }
     }
@@ -9529,12 +9489,12 @@
    * The element representing the declaration of this type, or `null` if the type has not, or
    * cannot, be associated with an element.
    */
-  Element _element;
+  final Element _element;
 
   /**
    * The name of this type, or `null` if the type does not have a name.
    */
-  String name;
+  final String name;
 
   /**
    * An empty array of types.
@@ -9547,10 +9507,7 @@
    * @param element the element representing the declaration of the type
    * @param name the name of the type
    */
-  TypeImpl(Element element, String name) {
-    this._element = element;
-    this.name = name;
-  }
+  TypeImpl(this._element, this.name);
 
   @override
   String get displayName => name;
@@ -9676,16 +9633,13 @@
 }
 
 class TypeImpl_TypePair {
-  DartType _firstType;
+  final DartType _firstType;
 
-  DartType _secondType;
+  final DartType _secondType;
 
   int _cachedHashCode = 0;
 
-  TypeImpl_TypePair(DartType firstType, DartType secondType) {
-    this._firstType = firstType;
-    this._secondType = secondType;
-  }
+  TypeImpl_TypePair(this._firstType, this._secondType);
 
   @override
   bool operator ==(Object object) {
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index cd17f76..b16d920 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -879,22 +879,22 @@
    * The change notices associated with this result, or `null` if there were no changes and
    * there is no more work to be done.
    */
-  List<ChangeNotice> _notices;
+  final List<ChangeNotice> _notices;
 
   /**
    * The number of milliseconds required to determine which task was to be performed.
    */
-  int getTime = 0;
+  final int getTime;
 
   /**
    * The name of the class of the task that was performed.
    */
-  String taskClassName;
+  final String taskClassName;
 
   /**
    * The number of milliseconds required to perform the task.
    */
-  int performTime = 0;
+  final int performTime;
 
   /**
    * Initialize a newly created analysis result to have the given values.
@@ -904,12 +904,7 @@
    * @param taskClassName the name of the class of the task that was performed
    * @param performTime the number of milliseconds required to perform the task
    */
-  AnalysisResult(List<ChangeNotice> notices, int getTime, String taskClassName, int performTime) {
-    this._notices = notices;
-    this.getTime = getTime;
-    this.taskClassName = taskClassName;
-    this.performTime = performTime;
-  }
+  AnalysisResult(this._notices, this.getTime, this.taskClassName, this.performTime);
 
   /**
    * Return the change notices associated with this result, or `null` if there were no changes
@@ -1149,7 +1144,7 @@
   /**
    * The policy used to determine which pieces of data to remove from the cache.
    */
-  CacheRetentionPolicy _retentionPolicy;
+  final CacheRetentionPolicy _retentionPolicy;
 
   /**
    * A list containing the most recently accessed sources with the most recently used at the end of
@@ -1167,9 +1162,8 @@
    * @param retentionPolicy the policy used to determine which pieces of data to remove from the
    *          cache
    */
-  AnalysisCache(int maxCacheSize, CacheRetentionPolicy retentionPolicy) {
+  AnalysisCache(int maxCacheSize, this._retentionPolicy) {
     this._maxCacheSize = maxCacheSize;
-    this._retentionPolicy = retentionPolicy;
     _recentlyUsed = new List<Source>();
   }
 
@@ -1315,9 +1309,9 @@
     for (int i = 0; i < _recentlyUsed.length; i++) {
       Source source = _recentlyUsed[i];
       RetentionPriority priority = _retentionPolicy.getAstPriority(source, _sourceMap[source]);
-      if (identical(priority, RetentionPriority.LOW)) {
+      if (priority == RetentionPriority.LOW) {
         return _recentlyUsed.removeAt(i);
-      } else if (identical(priority, RetentionPriority.MEDIUM) && sourceToRemove < 0) {
+      } else if (priority == RetentionPriority.MEDIUM && sourceToRemove < 0) {
         sourceToRemove = i;
       }
     }
@@ -1354,7 +1348,7 @@
    * Valid Transitions:
    * * [INVALID] if a source was modified that might cause the data to be computable
    */
-  static final CacheState ERROR = new CacheState('ERROR', 0);
+  static const CacheState ERROR = const CacheState('ERROR', 0);
 
   /**
    * The data is not in the cache because it was flushed from the cache in order to control memory
@@ -1364,7 +1358,7 @@
    * * [IN_PROCESS] if the data is being recomputed
    * * [INVALID] if a source was modified that causes the data to need to be recomputed
    */
-  static final CacheState FLUSHED = new CacheState('FLUSHED', 1);
+  static const CacheState FLUSHED = const CacheState('FLUSHED', 1);
 
   /**
    * The data might or might not be in the cache but is in the process of being recomputed.
@@ -1373,7 +1367,7 @@
    * * [ERROR] if an exception occurred while trying to compute the data
    * * [VALID] if the data was successfully computed and stored in the cache
    */
-  static final CacheState IN_PROCESS = new CacheState('IN_PROCESS', 2);
+  static const CacheState IN_PROCESS = const CacheState('IN_PROCESS', 2);
 
   /**
    * The data is not in the cache and needs to be recomputed so that results can be reported.
@@ -1381,7 +1375,7 @@
    * Valid Transitions:
    * * [IN_PROCESS] if an attempt is being made to recompute the data
    */
-  static final CacheState INVALID = new CacheState('INVALID', 3);
+  static const CacheState INVALID = const CacheState('INVALID', 3);
 
   /**
    * The data is in the cache and up-to-date.
@@ -1390,11 +1384,11 @@
    * * [FLUSHED] if the data is removed in order to manage memory usage
    * * [INVALID] if a source was modified in such a way as to invalidate the previous data
    */
-  static final CacheState VALID = new CacheState('VALID', 4);
+  static const CacheState VALID = const CacheState('VALID', 4);
 
-  static final List<CacheState> values = [ERROR, FLUSHED, IN_PROCESS, INVALID, VALID];
+  static const List<CacheState> values = const [ERROR, FLUSHED, IN_PROCESS, INVALID, VALID];
 
-  CacheState(String name, int ordinal) : super(name, ordinal);
+  const CacheState(String name, int ordinal) : super(name, ordinal);
 }
 
 /**
@@ -1712,26 +1706,21 @@
   CacheState _launchableState = CacheState.INVALID;
 
   /**
-   * An integer holding bit masks such as [LAUNCHABLE] and [CLIENT_CODE].
-   */
-  int _bitmask = 0;
-
-  /**
    * The error produced while performing Angular resolution, or an empty array if there are no
    * errors if the error are not currently cached.
    */
   List<AnalysisError> _angularErrors = AnalysisError.NO_ERRORS;
 
   /**
-   * The index of the bit in the [bitmask] indicating that this library is launchable: that
-   * the file has a main method.
+   * The index of the flag indicating whether this library is launchable (whether the file has a
+   * main method).
    */
   static int _LAUNCHABLE_INDEX = 1;
 
   /**
-   * The index of the bit in the [bitmask] indicating that the library is client code: that
-   * the library depends on the html library. If the library is not "client code", then it is
-   * referred to as "server code".
+   * The index of the flag indicating whether the library is client code (whether the library
+   * depends on the html library). If the library is not "client code", then it is referred to as
+   * "server code".
    */
   static int _CLIENT_CODE_INDEX = 2;
 
@@ -1749,11 +1738,11 @@
    * Flush any AST structures being maintained by this entry.
    */
   void flushAstStructures() {
-    if (identical(_tokenStreamState, CacheState.VALID)) {
+    if (_tokenStreamState == CacheState.VALID) {
       _tokenStreamState = CacheState.FLUSHED;
       _tokenStream = null;
     }
-    if (identical(_parsedUnitState, CacheState.VALID)) {
+    if (_parsedUnitState == CacheState.VALID) {
       _parsedUnitState = CacheState.FLUSHED;
       _parsedUnitAccessed = false;
       _parsedUnit = null;
@@ -1782,7 +1771,7 @@
 
   @override
   CompilationUnit get anyParsedCompilationUnit {
-    if (identical(_parsedUnitState, CacheState.VALID)) {
+    if (_parsedUnitState == CacheState.VALID) {
       _parsedUnitAccessed = true;
       return _parsedUnit;
     }
@@ -1793,7 +1782,7 @@
   CompilationUnit get anyResolvedCompilationUnit {
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
-      if (identical(state._resolvedUnitState, CacheState.VALID)) {
+      if (state._resolvedUnitState == CacheState.VALID) {
         return state._resolvedUnit;
       }
       state = state._nextState;
@@ -1802,6 +1791,13 @@
     return null;
   }
 
+  /**
+   * Return a list containing the libraries that are known to contain this part.
+   *
+   * @return a list containing the libraries that are known to contain this part
+   */
+  List<Source> get containingLibraries => _containingLibraries;
+
   @override
   SourceKind get kind => _sourceKind;
 
@@ -1827,7 +1823,7 @@
    * @return a compilation unit that can be modified by the reconciler
    */
   CompilationUnit get resolvableCompilationUnit {
-    if (identical(_parsedUnitState, CacheState.VALID)) {
+    if (_parsedUnitState == CacheState.VALID) {
       if (_parsedUnitAccessed) {
         return _parsedUnit.accept(new AstCloner()) as CompilationUnit;
       }
@@ -1839,7 +1835,7 @@
     }
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
-      if (identical(state._resolvedUnitState, CacheState.VALID)) {
+      if (state._resolvedUnitState == CacheState.VALID) {
         return state._resolvedUnit.accept(new AstCloner()) as CompilationUnit;
       }
       state = state._nextState;
@@ -1921,9 +1917,9 @@
     } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
       return _includedParts;
     } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
-      return BooleanArray.get(_bitmask, _CLIENT_CODE_INDEX);
+      return getFlag(_CLIENT_CODE_INDEX);
     } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
-      return BooleanArray.get(_bitmask, _LAUNCHABLE_INDEX);
+      return getFlag(_LAUNCHABLE_INDEX);
     } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
       return _parseErrors;
     } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
@@ -1980,56 +1976,56 @@
   @override
   bool hasInvalidData(DataDescriptor descriptor) {
     if (identical(descriptor, DartEntry.ELEMENT)) {
-      return identical(_elementState, CacheState.INVALID);
+      return _elementState == CacheState.INVALID;
     } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
-      return identical(_exportedLibrariesState, CacheState.INVALID);
+      return _exportedLibrariesState == CacheState.INVALID;
     } else if (identical(descriptor, DartEntry.IMPORTED_LIBRARIES)) {
-      return identical(_importedLibrariesState, CacheState.INVALID);
+      return _importedLibrariesState == CacheState.INVALID;
     } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
-      return identical(_includedPartsState, CacheState.INVALID);
+      return _includedPartsState == CacheState.INVALID;
     } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
-      return identical(_clientServerState, CacheState.INVALID);
+      return _clientServerState == CacheState.INVALID;
     } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
-      return identical(_launchableState, CacheState.INVALID);
+      return _launchableState == CacheState.INVALID;
     } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
-      return identical(_parseErrorsState, CacheState.INVALID);
+      return _parseErrorsState == CacheState.INVALID;
     } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
-      return identical(_parsedUnitState, CacheState.INVALID);
+      return _parsedUnitState == CacheState.INVALID;
     } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
-      return identical(_publicNamespaceState, CacheState.INVALID);
+      return _publicNamespaceState == CacheState.INVALID;
     } else if (identical(descriptor, DartEntry.SCAN_ERRORS)) {
-      return identical(_scanErrorsState, CacheState.INVALID);
+      return _scanErrorsState == CacheState.INVALID;
     } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
-      return identical(_sourceKindState, CacheState.INVALID);
+      return _sourceKindState == CacheState.INVALID;
     } else if (identical(descriptor, DartEntry.TOKEN_STREAM)) {
-      return identical(_tokenStreamState, CacheState.INVALID);
+      return _tokenStreamState == CacheState.INVALID;
     } else if (identical(descriptor, DartEntry.RESOLUTION_ERRORS) || identical(descriptor, DartEntry.RESOLVED_UNIT) || identical(descriptor, DartEntry.VERIFICATION_ERRORS) || identical(descriptor, DartEntry.HINTS)) {
       DartEntryImpl_ResolutionState state = _resolutionState;
       while (state != null) {
         if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
-          return identical(state._resolutionErrorsState, CacheState.INVALID);
+          return state._resolutionErrorsState == CacheState.INVALID;
         } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
-          return identical(state._resolvedUnitState, CacheState.INVALID);
+          return state._resolvedUnitState == CacheState.INVALID;
         } else if (identical(descriptor, DartEntry.VERIFICATION_ERRORS)) {
-          return identical(state._verificationErrorsState, CacheState.INVALID);
+          return state._verificationErrorsState == CacheState.INVALID;
         } else if (identical(descriptor, DartEntry.HINTS)) {
-          return identical(state._hintsState, CacheState.INVALID);
+          return state._hintsState == CacheState.INVALID;
         }
       }
       return false;
     } else {
-      return identical(super.getState(descriptor), CacheState.INVALID);
+      return super.getState(descriptor) == CacheState.INVALID;
     }
   }
 
   @override
   bool get hasResolvableCompilationUnit {
-    if (identical(_parsedUnitState, CacheState.VALID)) {
+    if (_parsedUnitState == CacheState.VALID) {
       return true;
     }
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
-      if (identical(state._resolvedUnitState, CacheState.VALID)) {
+      if (state._resolvedUnitState == CacheState.VALID) {
         return true;
       }
       state = state._nextState;
@@ -2065,10 +2061,10 @@
    * Invalidate all of the resolution information associated with the compilation unit.
    */
   void invalidateAllResolutionInformation() {
-    if (identical(_parsedUnitState, CacheState.FLUSHED)) {
+    if (_parsedUnitState == CacheState.FLUSHED) {
       DartEntryImpl_ResolutionState state = _resolutionState;
       while (state != null) {
-        if (identical(state._resolvedUnitState, CacheState.VALID)) {
+        if (state._resolvedUnitState == CacheState.VALID) {
           _parsedUnit = state._resolvedUnit;
           _parsedUnitAccessed = true;
           _parsedUnitState = CacheState.VALID;
@@ -2151,25 +2147,25 @@
    * invalidated before they could be recorded.
    */
   void recordParseNotInProcess() {
-    if (identical(getState(SourceEntry.LINE_INFO), CacheState.IN_PROCESS)) {
+    if (getState(SourceEntry.LINE_INFO) == CacheState.IN_PROCESS) {
       setState(SourceEntry.LINE_INFO, CacheState.INVALID);
     }
-    if (identical(_sourceKindState, CacheState.IN_PROCESS)) {
+    if (_sourceKindState == CacheState.IN_PROCESS) {
       _sourceKindState = CacheState.INVALID;
     }
-    if (identical(_parseErrorsState, CacheState.IN_PROCESS)) {
+    if (_parseErrorsState == CacheState.IN_PROCESS) {
       _parseErrorsState = CacheState.INVALID;
     }
-    if (identical(_parsedUnitState, CacheState.IN_PROCESS)) {
+    if (_parsedUnitState == CacheState.IN_PROCESS) {
       _parsedUnitState = CacheState.INVALID;
     }
-    if (identical(_exportedLibrariesState, CacheState.IN_PROCESS)) {
+    if (_exportedLibrariesState == CacheState.IN_PROCESS) {
       _exportedLibrariesState = CacheState.INVALID;
     }
-    if (identical(_importedLibrariesState, CacheState.IN_PROCESS)) {
+    if (_importedLibrariesState == CacheState.IN_PROCESS) {
       _importedLibrariesState = CacheState.INVALID;
     }
-    if (identical(_includedPartsState, CacheState.IN_PROCESS)) {
+    if (_includedPartsState == CacheState.IN_PROCESS) {
       _includedPartsState = CacheState.INVALID;
     }
   }
@@ -2182,7 +2178,7 @@
   void recordResolutionError() {
     _element = null;
     _elementState = CacheState.ERROR;
-    _bitmask = 0;
+    clearFlags([_LAUNCHABLE_INDEX, _CLIENT_CODE_INDEX]);
     _clientServerState = CacheState.ERROR;
     _launchableState = CacheState.ERROR;
     _publicNamespace = null;
@@ -2195,16 +2191,16 @@
    * invalidated before they could be recorded.
    */
   void recordResolutionNotInProcess() {
-    if (identical(_elementState, CacheState.IN_PROCESS)) {
+    if (_elementState == CacheState.IN_PROCESS) {
       _elementState = CacheState.INVALID;
     }
-    if (identical(_clientServerState, CacheState.IN_PROCESS)) {
+    if (_clientServerState == CacheState.IN_PROCESS) {
       _clientServerState = CacheState.INVALID;
     }
-    if (identical(_launchableState, CacheState.IN_PROCESS)) {
+    if (_launchableState == CacheState.IN_PROCESS) {
       _launchableState = CacheState.INVALID;
     }
-    if (identical(_publicNamespaceState, CacheState.IN_PROCESS)) {
+    if (_publicNamespaceState == CacheState.IN_PROCESS) {
       _publicNamespaceState = CacheState.INVALID;
     }
     _resolutionState.recordResolutionNotInProcess();
@@ -2245,13 +2241,13 @@
    * invalidated before they could be recorded.
    */
   void recordScanNotInProcess() {
-    if (identical(getState(SourceEntry.LINE_INFO), CacheState.IN_PROCESS)) {
+    if (getState(SourceEntry.LINE_INFO) == CacheState.IN_PROCESS) {
       setState(SourceEntry.LINE_INFO, CacheState.INVALID);
     }
-    if (identical(_scanErrorsState, CacheState.IN_PROCESS)) {
+    if (_scanErrorsState == CacheState.IN_PROCESS) {
       _scanErrorsState = CacheState.INVALID;
     }
-    if (identical(_tokenStreamState, CacheState.IN_PROCESS)) {
+    if (_tokenStreamState == CacheState.IN_PROCESS) {
       _tokenStreamState = CacheState.INVALID;
     }
   }
@@ -2322,17 +2318,17 @@
       _includedParts = updatedValue(state, _includedParts, Source.EMPTY_ARRAY);
       _includedPartsState = state;
     } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
-      _bitmask = _updatedValueOfFlag(state, _bitmask, _CLIENT_CODE_INDEX);
+      _updateValueOfFlag(_CLIENT_CODE_INDEX, state);
       _clientServerState = state;
     } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
-      _bitmask = _updatedValueOfFlag(state, _bitmask, _LAUNCHABLE_INDEX);
+      _updateValueOfFlag(_LAUNCHABLE_INDEX, state);
       _launchableState = state;
     } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
       _parseErrors = updatedValue(state, _parseErrors, AnalysisError.NO_ERRORS);
       _parseErrorsState = state;
     } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
       CompilationUnit newUnit = updatedValue(state, _parsedUnit, null);
-      if (newUnit != _parsedUnit) {
+      if (!identical(newUnit, _parsedUnit)) {
         _parsedUnitAccessed = false;
       }
       _parsedUnit = newUnit;
@@ -2399,10 +2395,10 @@
       _includedParts = value == null ? Source.EMPTY_ARRAY : (value as List<Source>);
       _includedPartsState = CacheState.VALID;
     } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
-      _bitmask = BooleanArray.set(_bitmask, _CLIENT_CODE_INDEX, value as bool);
+      setFlag(_CLIENT_CODE_INDEX, value as bool);
       _clientServerState = CacheState.VALID;
     } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
-      _bitmask = BooleanArray.set(_bitmask, _LAUNCHABLE_INDEX, value as bool);
+      setFlag(_LAUNCHABLE_INDEX, value as bool);
       _launchableState = CacheState.VALID;
     } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
       _parseErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
@@ -2483,12 +2479,11 @@
     _publicNamespace = other._publicNamespace;
     _clientServerState = other._clientServerState;
     _launchableState = other._launchableState;
-    _bitmask = other._bitmask;
     _angularErrors = other._angularErrors;
   }
 
   @override
-  bool get hasErrorState => super.hasErrorState || identical(_scanErrorsState, CacheState.ERROR) || identical(_tokenStreamState, CacheState.ERROR) || identical(_sourceKindState, CacheState.ERROR) || identical(_parsedUnitState, CacheState.ERROR) || identical(_parseErrorsState, CacheState.ERROR) || identical(_importedLibrariesState, CacheState.ERROR) || identical(_exportedLibrariesState, CacheState.ERROR) || identical(_includedPartsState, CacheState.ERROR) || identical(_elementState, CacheState.ERROR) || identical(_publicNamespaceState, CacheState.ERROR) || identical(_clientServerState, CacheState.ERROR) || identical(_launchableState, CacheState.ERROR) || _resolutionState.hasErrorState;
+  bool get hasErrorState => super.hasErrorState || _scanErrorsState == CacheState.ERROR || _tokenStreamState == CacheState.ERROR || _sourceKindState == CacheState.ERROR || _parsedUnitState == CacheState.ERROR || _parseErrorsState == CacheState.ERROR || _importedLibrariesState == CacheState.ERROR || _exportedLibrariesState == CacheState.ERROR || _includedPartsState == CacheState.ERROR || _elementState == CacheState.ERROR || _publicNamespaceState == CacheState.ERROR || _clientServerState == CacheState.ERROR || _launchableState == CacheState.ERROR || _resolutionState.hasErrorState;
 
   @override
   void writeOn(JavaStringBuilder builder) {
@@ -2530,7 +2525,7 @@
   void _discardCachedResolutionInformation() {
     _element = null;
     _elementState = CacheState.INVALID;
-    _bitmask = 0;
+    clearFlags([_LAUNCHABLE_INDEX, _CLIENT_CODE_INDEX]);
     _clientServerState = CacheState.INVALID;
     _launchableState = CacheState.INVALID;
     _publicNamespace = null;
@@ -2563,24 +2558,22 @@
   }
 
   /**
-   * Given that one of the flags is being transitioned to the given state, return the value of the
-   * flags that should be kept in the cache.
+   * Given that the specified flag is being transitioned to the given state, set the value of the
+   * flag to the value that should be kept in the cache.
    *
-   * @param state the state to which the data is being transitioned
-   * @param currentValue the value of the flags before the transition
-   * @param bitMask the mask used to access the bit whose state is being set
-   * @return the value of the data that should be kept in the cache
+   * @param index the index of the flag whose state is being set
+   * @param state the state to which the value is being transitioned
    */
-  int _updatedValueOfFlag(CacheState state, int currentValue, int bitIndex) {
-    if (identical(state, CacheState.VALID)) {
+  void _updateValueOfFlag(int index, CacheState state) {
+    if (state == CacheState.VALID) {
       throw new IllegalArgumentException("Use setValue() to set the state to VALID");
-    } else if (identical(state, CacheState.IN_PROCESS)) {
+    } else if (state != CacheState.IN_PROCESS) {
       //
-      // We can leave the current value in the cache for any 'get' methods to access.
+      // If the value is in process, we can leave the current value in the cache for any 'get'
+      // methods to access.
       //
-      return currentValue;
+      setFlag(index, false);
     }
-    return BooleanArray.set(currentValue, bitIndex, false);
   }
 }
 
@@ -2671,7 +2664,7 @@
    * Flush any AST structures being maintained by this state.
    */
   void flushAstStructures() {
-    if (identical(_resolvedUnitState, CacheState.VALID)) {
+    if (_resolvedUnitState == CacheState.VALID) {
       _resolvedUnitState = CacheState.FLUSHED;
       _resolvedUnit = null;
     }
@@ -2680,7 +2673,7 @@
     }
   }
 
-  bool get hasErrorState => identical(_resolvedUnitState, CacheState.ERROR) || identical(_resolutionErrorsState, CacheState.ERROR) || identical(_verificationErrorsState, CacheState.ERROR) || identical(_hintsState, CacheState.ERROR) || (_nextState != null && _nextState.hasErrorState);
+  bool get hasErrorState => _resolvedUnitState == CacheState.ERROR || _resolutionErrorsState == CacheState.ERROR || _verificationErrorsState == CacheState.ERROR || _hintsState == CacheState.ERROR || (_nextState != null && _nextState.hasErrorState);
 
   /**
    * Invalidate all of the resolution information associated with the compilation unit.
@@ -2722,16 +2715,16 @@
    * were invalidated before they could be recorded.
    */
   void recordResolutionNotInProcess() {
-    if (identical(_resolvedUnitState, CacheState.IN_PROCESS)) {
+    if (_resolvedUnitState == CacheState.IN_PROCESS) {
       _resolvedUnitState = CacheState.INVALID;
     }
-    if (identical(_resolutionErrorsState, CacheState.IN_PROCESS)) {
+    if (_resolutionErrorsState == CacheState.IN_PROCESS) {
       _resolutionErrorsState = CacheState.INVALID;
     }
-    if (identical(_verificationErrorsState, CacheState.IN_PROCESS)) {
+    if (_verificationErrorsState == CacheState.IN_PROCESS) {
       _verificationErrorsState = CacheState.INVALID;
     }
-    if (identical(_hintsState, CacheState.IN_PROCESS)) {
+    if (_hintsState == CacheState.IN_PROCESS) {
       _hintsState = CacheState.INVALID;
     }
     if (_nextState != null) {
@@ -2770,16 +2763,14 @@
   /**
    * The name of the descriptor, used for debugging purposes.
    */
-  String _name;
+  final String _name;
 
   /**
    * Initialize a newly created descriptor to have the given name.
    *
    * @param name the name of the descriptor
    */
-  DataDescriptor(String name) {
-    this._name = name;
-  }
+  DataDescriptor(this._name);
 
   @override
   String toString() => _name;
@@ -2990,18 +2981,18 @@
    * Flush any AST structures being maintained by this entry.
    */
   void flushAstStructures() {
-    if (identical(_parsedUnitState, CacheState.VALID)) {
+    if (_parsedUnitState == CacheState.VALID) {
       _parsedUnitState = CacheState.FLUSHED;
       _parsedUnit = null;
     }
-    if (identical(_resolvedUnitState, CacheState.VALID)) {
+    if (_resolvedUnitState == CacheState.VALID) {
       _resolvedUnitState = CacheState.FLUSHED;
       _resolvedUnit = null;
     }
-    if (identical(_angularEntryState, CacheState.VALID)) {
+    if (_angularEntryState == CacheState.VALID) {
       _angularEntryState = CacheState.FLUSHED;
     }
-    if (identical(_angularErrorsState, CacheState.VALID)) {
+    if (_angularErrorsState == CacheState.VALID) {
       _angularErrorsState = CacheState.FLUSHED;
     }
   }
@@ -3037,11 +3028,11 @@
 
   @override
   ht.HtmlUnit get anyParsedUnit {
-    if (identical(_parsedUnitState, CacheState.VALID)) {
+    if (_parsedUnitState == CacheState.VALID) {
       //      parsedUnitAccessed = true;
       return _parsedUnit;
     }
-    if (identical(_resolvedUnitState, CacheState.VALID)) {
+    if (_resolvedUnitState == CacheState.VALID) {
       //      resovledUnitAccessed = true;
       return _resolvedUnit;
     }
@@ -3283,7 +3274,7 @@
   }
 
   @override
-  bool get hasErrorState => super.hasErrorState || identical(_parsedUnitState, CacheState.ERROR) || identical(_resolvedUnitState, CacheState.ERROR) || identical(_parseErrorsState, CacheState.ERROR) || identical(_resolutionErrorsState, CacheState.ERROR) || identical(_referencedLibrariesState, CacheState.ERROR) || identical(_elementState, CacheState.ERROR) || identical(_angularErrorsState, CacheState.ERROR) || identical(_hintsState, CacheState.ERROR);
+  bool get hasErrorState => super.hasErrorState || _parsedUnitState == CacheState.ERROR || _resolvedUnitState == CacheState.ERROR || _parseErrorsState == CacheState.ERROR || _resolutionErrorsState == CacheState.ERROR || _referencedLibrariesState == CacheState.ERROR || _elementState == CacheState.ERROR || _angularErrorsState == CacheState.ERROR || _hintsState == CacheState.ERROR;
 
   @override
   void writeOn(JavaStringBuilder builder) {
@@ -3321,24 +3312,24 @@
    * A priority indicating that a given piece of data can be removed from the cache without
    * reservation.
    */
-  static final RetentionPriority LOW = new RetentionPriority('LOW', 0);
+  static const RetentionPriority LOW = const RetentionPriority('LOW', 0);
 
   /**
    * A priority indicating that a given piece of data should not be removed from the cache unless
    * there are no sources for which the corresponding data has a lower priority. Currently used for
    * data that is needed in order to finish some outstanding analysis task.
    */
-  static final RetentionPriority MEDIUM = new RetentionPriority('MEDIUM', 1);
+  static const RetentionPriority MEDIUM = const RetentionPriority('MEDIUM', 1);
 
   /**
    * A priority indicating that a given piece of data should not be removed from the cache.
    * Currently used for data related to a priority source.
    */
-  static final RetentionPriority HIGH = new RetentionPriority('HIGH', 2);
+  static const RetentionPriority HIGH = const RetentionPriority('HIGH', 2);
 
-  static final List<RetentionPriority> values = [LOW, MEDIUM, HIGH];
+  static const List<RetentionPriority> values = const [LOW, MEDIUM, HIGH];
 
-  RetentionPriority(String name, int ordinal) : super(name, ordinal);
+  const RetentionPriority(String name, int ordinal) : super(name, ordinal);
 }
 
 /**
@@ -3368,6 +3359,14 @@
   AnalysisException get exception;
 
   /**
+   * Return `true` if the source was explicitly added to the context or `false` if the
+   * source was implicitly added because it was referenced by another source.
+   *
+   * @return `true` if the source was explicitly added to the context
+   */
+  bool get explicitlyAdded;
+
+  /**
    * Return the kind of the source, or `null` if the kind is not currently cached.
    *
    * @return the kind of the source
@@ -3420,6 +3419,11 @@
   int _modificationTime = 0;
 
   /**
+   * A bit-encoding of boolean flags associated with this element.
+   */
+  int _flags = 0;
+
+  /**
    * The exception that caused one or more values to have a state of [CacheState#ERROR].
    */
   AnalysisException exception;
@@ -3446,6 +3450,12 @@
   LineInfo _lineInfo;
 
   /**
+   * The index of the flag indicating whether the source was explicitly added to the context or
+   * whether the source was implicitly added because it was referenced by another source.
+   */
+  static int _EXPLICITLY_ADDED_FLAG = 0;
+
+  /**
    * Fix the state of the [exception] to match the current state of the entry.
    */
   void fixExceptionState() {
@@ -3462,6 +3472,15 @@
     }
   }
 
+  /**
+   * Return `true` if the source was explicitly added to the context or `false` if the
+   * source was implicitly added because it was referenced by another source.
+   *
+   * @return `true` if the source was explicitly added to the context
+   */
+  @override
+  bool get explicitlyAdded => getFlag(_EXPLICITLY_ADDED_FLAG);
+
   @override
   int get modificationTime => _modificationTime;
 
@@ -3508,6 +3527,15 @@
   }
 
   /**
+   * Set whether the source was explicitly added to the context to match the given value.
+   *
+   * @param explicitlyAdded `true` if the source was explicitly added to the context
+   */
+  void set explicitlyAdded(bool explicitlyAdded) {
+    setFlag(_EXPLICITLY_ADDED_FLAG, explicitlyAdded);
+  }
+
+  /**
    * Set the most recent time at which the state of the source matched the state represented by this
    * entry to the given time.
    *
@@ -3561,12 +3589,24 @@
   }
 
   /**
+   * Set the value of all of the flags with the given indexes to false.
+   *
+   * @param indexes the indexes of the flags whose value is to be set to false
+   */
+  void clearFlags(List<int> indexes) {
+    for (int i = 0; i < indexes.length; i++) {
+      _flags = BooleanArray.set(_flags, indexes[i], false);
+    }
+  }
+
+  /**
    * Copy the information from the given cache entry.
    *
    * @param entry the cache entry from which information will be copied
    */
   void copyFrom(SourceEntryImpl entry) {
     _modificationTime = entry._modificationTime;
+    _flags = entry._flags;
     exception = entry.exception;
     _contentState = entry._contentState;
     _content = entry._content;
@@ -3575,11 +3615,29 @@
   }
 
   /**
+   * Return the value of the flag with the given index.
+   *
+   * @param index the index of the flag whose value is to be returned
+   * @return the value of the flag with the given index
+   */
+  bool getFlag(int index) => BooleanArray.get(_flags, index);
+
+  /**
    * Return `true` if the state of any data value is [CacheState#ERROR].
    *
    * @return `true` if the state of any data value is [CacheState#ERROR]
    */
-  bool get hasErrorState => identical(_contentState, CacheState.ERROR) || identical(_lineInfoState, CacheState.ERROR);
+  bool get hasErrorState => _contentState == CacheState.ERROR || _lineInfoState == CacheState.ERROR;
+
+  /**
+   * Set the value of the flag with the given index to the given value.
+   *
+   * @param index the index of the flag whose value is to be returned
+   * @param value the value of the flag with the given index
+   */
+  void setFlag(int index, bool value) {
+    _flags = BooleanArray.set(_flags, index, value);
+  }
 
   /**
    * Given that some data is being transitioned to the given state, return the value that should be
@@ -3591,9 +3649,9 @@
    * @return the value of the data that should be kept in the cache
    */
   Object updatedValue(CacheState state, Object currentValue, Object defaultValue) {
-    if (identical(state, CacheState.VALID)) {
+    if (state == CacheState.VALID) {
       throw new IllegalArgumentException("Use setValue() to set the state to VALID");
-    } else if (identical(state, CacheState.IN_PROCESS)) {
+    } else if (state == CacheState.IN_PROCESS) {
       //
       // We can leave the current value in the cache for any 'get' methods to access.
       //
@@ -3660,7 +3718,7 @@
       _dataMap[rowName] = row;
     }
     row._incState(state);
-    if (identical(state, CacheState.ERROR)) {
+    if (state == CacheState.ERROR) {
       AnalysisException exception = dartEntry.exception;
       if (exception != null) {
         _exceptions.add(exception);
@@ -3670,7 +3728,7 @@
 }
 
 class AnalysisContentStatisticsImpl_CacheRowImpl implements AnalysisContentStatistics_CacheRow {
-  String name;
+  final String name;
 
   int _errorCount = 0;
 
@@ -3682,9 +3740,7 @@
 
   int _validCount = 0;
 
-  AnalysisContentStatisticsImpl_CacheRowImpl(String name) {
-    this.name = name;
-  }
+  AnalysisContentStatisticsImpl_CacheRowImpl(this.name);
 
   @override
   bool operator ==(Object obj) => obj is AnalysisContentStatisticsImpl_CacheRowImpl && obj.name == name;
@@ -3708,19 +3764,19 @@
   int get hashCode => name.hashCode;
 
   void _incState(CacheState state) {
-    if (identical(state, CacheState.ERROR)) {
+    if (state == CacheState.ERROR) {
       _errorCount++;
     }
-    if (identical(state, CacheState.FLUSHED)) {
+    if (state == CacheState.FLUSHED) {
       _flushedCount++;
     }
-    if (identical(state, CacheState.IN_PROCESS)) {
+    if (state == CacheState.IN_PROCESS) {
       _inProcessCount++;
     }
-    if (identical(state, CacheState.INVALID)) {
+    if (state == CacheState.INVALID) {
       _invalidCount++;
     }
-    if (identical(state, CacheState.VALID)) {
+    if (state == CacheState.VALID) {
       _validCount++;
     }
   }
@@ -3901,9 +3957,9 @@
         _cache.put(source, dartCopy);
         SourcePriority priority = SourcePriority.UNKNOWN;
         SourceKind kind = dartCopy.kind;
-        if (identical(kind, SourceKind.LIBRARY)) {
+        if (kind == SourceKind.LIBRARY) {
           priority = SourcePriority.LIBRARY;
-        } else if (identical(kind, SourceKind.PART)) {
+        } else if (kind == SourceKind.PART) {
           priority = SourcePriority.NORMAL_PART;
         }
         _workManager.add(source, priority);
@@ -3959,7 +4015,7 @@
         dartEntry = _getReadableDartEntry(source);
         ListUtilities.addAll(errors, _getDartParseData(source, dartEntry, DartEntry.PARSE_ERRORS));
         dartEntry = _getReadableDartEntry(source);
-        if (identical(dartEntry.getValue(DartEntry.SOURCE_KIND), SourceKind.LIBRARY)) {
+        if (dartEntry.getValue(DartEntry.SOURCE_KIND) == SourceKind.LIBRARY) {
           ListUtilities.addAll(errors, _getDartResolutionData(source, source, dartEntry, DartEntry.RESOLUTION_ERRORS));
           dartEntry = _getReadableDartEntry(source);
           ListUtilities.addAll(errors, _getDartVerificationData(source, source, dartEntry, DartEntry.VERIFICATION_ERRORS));
@@ -4187,7 +4243,7 @@
         List<Source> librarySources = getLibrariesContaining(source);
         for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
           SourceEntry sourceEntry = entry.getValue();
-          if (identical(sourceEntry.kind, SourceKind.HTML)) {
+          if (sourceEntry.kind == SourceKind.HTML) {
             List<Source> referencedLibraries = (sourceEntry as HtmlEntry).getValue(HtmlEntry.REFERENCED_LIBRARIES);
             if (_containsAny(referencedLibraries, librarySources)) {
               htmlSources.add(entry.getKey());
@@ -4223,7 +4279,7 @@
     for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
       Source source = entry.getKey();
       SourceEntry sourceEntry = entry.getValue();
-      if (identical(sourceEntry.kind, SourceKind.LIBRARY) && !source.isInSystemLibrary) {
+      if (sourceEntry.kind == SourceKind.LIBRARY && !source.isInSystemLibrary) {
         //          DartEntry dartEntry = (DartEntry) sourceEntry;
         //          if (dartEntry.getValue(DartEntry.IS_LAUNCHABLE) && dartEntry.getValue(DartEntry.IS_CLIENT)) {
         sources.add(source);
@@ -4240,7 +4296,7 @@
     for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
       Source source = entry.getKey();
       SourceEntry sourceEntry = entry.getValue();
-      if (identical(sourceEntry.kind, SourceKind.LIBRARY) && !source.isInSystemLibrary) {
+      if (sourceEntry.kind == SourceKind.LIBRARY && !source.isInSystemLibrary) {
         //          DartEntry dartEntry = (DartEntry) sourceEntry;
         //          if (dartEntry.getValue(DartEntry.IS_LAUNCHABLE) && !dartEntry.getValue(DartEntry.IS_CLIENT)) {
         sources.add(source);
@@ -4263,7 +4319,7 @@
     List<Source> dependentLibraries = new List<Source>();
     for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
       SourceEntry sourceEntry = entry.getValue();
-      if (identical(sourceEntry.kind, SourceKind.LIBRARY)) {
+      if (sourceEntry.kind == SourceKind.LIBRARY) {
         if (_contains((sourceEntry as DartEntry).getValue(DartEntry.EXPORTED_LIBRARIES), librarySource)) {
           dependentLibraries.add(entry.getKey());
         }
@@ -4433,7 +4489,7 @@
         statistics.putCacheItem(dartEntry, DartEntry.PARSE_ERRORS);
         statistics.putCacheItem(dartEntry, DartEntry.PARSED_UNIT);
         statistics.putCacheItem(dartEntry, DartEntry.SOURCE_KIND);
-        if (identical(kind, SourceKind.LIBRARY)) {
+        if (kind == SourceKind.LIBRARY) {
           statistics.putCacheItem(dartEntry, DartEntry.ELEMENT);
           statistics.putCacheItem(dartEntry, DartEntry.EXPORTED_LIBRARIES);
           statistics.putCacheItem(dartEntry, DartEntry.IMPORTED_LIBRARIES);
@@ -4789,11 +4845,9 @@
             if (source == unitSource) {
               unitEntry = dartCopy;
             }
-            if (_generateSdkErrors || !source.isInSystemLibrary) {
-              ChangeNoticeImpl notice = _getNotice(source);
-              notice.compilationUnit = unit;
-              notice.setErrors(dartCopy.allErrors, lineInfo);
-            }
+            ChangeNoticeImpl notice = _getNotice(source);
+            notice.compilationUnit = unit;
+            notice.setErrors(dartCopy.allErrors, lineInfo);
           }
         }
       } else {
@@ -4916,11 +4970,9 @@
             if (source == unitSource) {
               unitEntry = dartCopy;
             }
-            if (_generateSdkErrors || !source.isInSystemLibrary) {
-              ChangeNoticeImpl notice = _getNotice(source);
-              notice.compilationUnit = unit;
-              notice.setErrors(dartCopy.allErrors, lineInfo);
-            }
+            ChangeNoticeImpl notice = _getNotice(source);
+            notice.compilationUnit = unit;
+            notice.setErrors(dartCopy.allErrors, lineInfo);
           }
         }
       } else {
@@ -5370,23 +5422,25 @@
 
   /**
    * Create a [GenerateDartErrorsTask] for the given source, marking the verification errors
-   * as being in-process.
+   * as being in-process. The compilation unit and the library can be the same if the compilation
+   * unit is the defining compilation unit of the library.
    *
-   * @param source the source whose content is to be verified
-   * @param dartEntry the entry for the source
-   * @param librarySource the source for the library containing the source
+   * @param unitSource the source for the compilation unit to be verified
+   * @param unitEntry the entry for the compilation unit
+   * @param librarySource the source for the library containing the compilation unit
    * @param libraryEntry the entry for the library
    * @return task data representing the created task
    */
-  AnalysisContextImpl_TaskData _createGenerateDartErrorsTask(Source source, DartEntry dartEntry, Source librarySource, SourceEntry libraryEntry) {
-    if (dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) != CacheState.VALID || libraryEntry.getState(DartEntry.ELEMENT) != CacheState.VALID) {
+  AnalysisContextImpl_TaskData _createGenerateDartErrorsTask(Source unitSource, DartEntry unitEntry, Source librarySource, DartEntry libraryEntry) {
+    if (unitEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) != CacheState.VALID || libraryEntry.getState(DartEntry.ELEMENT) != CacheState.VALID) {
+      return _createResolveDartLibraryTask(librarySource, libraryEntry);
     }
-    CompilationUnit unit = dartEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
+    CompilationUnit unit = unitEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
     LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
-    DartEntryImpl dartCopy = dartEntry.writableCopy;
+    DartEntryImpl dartCopy = unitEntry.writableCopy;
     dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.IN_PROCESS);
-    _cache.put(source, dartCopy);
-    return new AnalysisContextImpl_TaskData(new GenerateDartErrorsTask(this, source, dartCopy.modificationTime, unit, libraryElement), false);
+    _cache.put(unitSource, dartCopy);
+    return new AnalysisContextImpl_TaskData(new GenerateDartErrorsTask(this, unitSource, dartCopy.modificationTime, unit, libraryElement), false);
   }
 
   /**
@@ -5585,18 +5639,21 @@
    * object that was created, or `null` if the source should not be tracked by this context.
    *
    * @param source the source for which an information object is being created
+   * @param explicitlyAdded `true` if the source was explicitly added to the context
    * @return the source information object that was created
    */
-  SourceEntry _createSourceEntry(Source source) {
+  SourceEntry _createSourceEntry(Source source, bool explicitlyAdded) {
     String name = source.shortName;
     if (AnalysisEngine.isHtmlFileName(name)) {
       HtmlEntryImpl htmlEntry = new HtmlEntryImpl();
       htmlEntry.modificationTime = getModificationStamp(source);
+      htmlEntry.explicitlyAdded = explicitlyAdded;
       _cache.put(source, htmlEntry);
       return htmlEntry;
     } else {
       DartEntryImpl dartEntry = new DartEntryImpl();
       dartEntry.modificationTime = getModificationStamp(source);
+      dartEntry.explicitlyAdded = explicitlyAdded;
       _cache.put(source, dartEntry);
       return dartEntry;
     }
@@ -5935,7 +5992,7 @@
         if (sourceEntry is DartEntry) {
           DartEntry dartEntry = sourceEntry;
           if (!dartEntry.hasResolvableCompilationUnit) {
-            if (identical(dartEntry.getState(DartEntry.PARSED_UNIT), CacheState.ERROR)) {
+            if (dartEntry.getState(DartEntry.PARSED_UNIT) == CacheState.ERROR) {
               sourcesToRemove.add(source);
             } else {
               AnalysisContextImpl_TaskData taskData = _createParseDartTask(source, dartEntry);
@@ -6016,24 +6073,24 @@
       return new AnalysisContextImpl_TaskData(null, false);
     }
     CacheState contentState = sourceEntry.getState(SourceEntry.CONTENT);
-    if (identical(contentState, CacheState.INVALID)) {
+    if (contentState == CacheState.INVALID) {
       return _createGetContentTask(source, sourceEntry);
-    } else if (identical(contentState, CacheState.IN_PROCESS)) {
+    } else if (contentState == CacheState.IN_PROCESS) {
       // We are already in the process of getting the content. There's nothing else we can do with
       // this source until that's complete.
       return new AnalysisContextImpl_TaskData(null, true);
-    } else if (identical(contentState, CacheState.ERROR)) {
+    } else if (contentState == CacheState.ERROR) {
       // We have done all of the analysis we can for this source because we cannot get its content.
       return new AnalysisContextImpl_TaskData(null, false);
     }
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
       CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS);
-      if (identical(scanErrorsState, CacheState.INVALID) || (isPriority && identical(scanErrorsState, CacheState.FLUSHED))) {
+      if (scanErrorsState == CacheState.INVALID || (isPriority && scanErrorsState == CacheState.FLUSHED)) {
         return _createScanDartTask(source, dartEntry);
       }
       CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS);
-      if (identical(parseErrorsState, CacheState.INVALID) || (isPriority && identical(parseErrorsState, CacheState.FLUSHED))) {
+      if (parseErrorsState == CacheState.INVALID || (isPriority && parseErrorsState == CacheState.FLUSHED)) {
         return _createParseDartTask(source, dartEntry);
       }
       if (isPriority && parseErrorsState != CacheState.ERROR) {
@@ -6042,20 +6099,21 @@
         }
       }
       SourceKind kind = dartEntry.getValue(DartEntry.SOURCE_KIND);
-      if (identical(kind, SourceKind.UNKNOWN)) {
+      if (kind == SourceKind.UNKNOWN) {
         return _createParseDartTask(source, dartEntry);
-      } else if (identical(kind, SourceKind.LIBRARY)) {
+      } else if (kind == SourceKind.LIBRARY) {
         CacheState elementState = dartEntry.getState(DartEntry.ELEMENT);
-        if (identical(elementState, CacheState.INVALID)) {
+        if (elementState == CacheState.INVALID) {
           return _createResolveDartLibraryTask(source, dartEntry);
         }
       }
       List<Source> librariesContaining = dartEntry.getValue(DartEntry.CONTAINING_LIBRARIES);
       for (Source librarySource in librariesContaining) {
-        SourceEntry libraryEntry = _cache.get(librarySource);
-        if (libraryEntry is DartEntry) {
+        SourceEntry librarySourceEntry = _cache.get(librarySource);
+        if (librarySourceEntry is DartEntry) {
+          DartEntry libraryEntry = librarySourceEntry;
           CacheState elementState = libraryEntry.getState(DartEntry.ELEMENT);
-          if (identical(elementState, CacheState.INVALID) || (isPriority && identical(elementState, CacheState.FLUSHED))) {
+          if (elementState == CacheState.INVALID || (isPriority && elementState == CacheState.FLUSHED)) {
             //return createResolveDartLibraryTask(librarySource, (DartEntry) libraryEntry);
             DartEntryImpl libraryCopy = libraryEntry.writableCopy;
             libraryCopy.setState(DartEntry.ELEMENT, CacheState.IN_PROCESS);
@@ -6063,7 +6121,7 @@
             return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false);
           }
           CacheState resolvedUnitState = dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
-          if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
+          if (resolvedUnitState == CacheState.INVALID || (isPriority && resolvedUnitState == CacheState.FLUSHED)) {
             //
             // The commented out lines below are an optimization that doesn't quite work yet. The
             // problem is that if the source was not resolved because it wasn't part of any library,
@@ -6081,12 +6139,12 @@
           }
           if (_generateSdkErrors || !source.isInSystemLibrary) {
             CacheState verificationErrorsState = dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource);
-            if (identical(verificationErrorsState, CacheState.INVALID) || (isPriority && identical(verificationErrorsState, CacheState.FLUSHED))) {
+            if (verificationErrorsState == CacheState.INVALID || (isPriority && verificationErrorsState == CacheState.FLUSHED)) {
               return _createGenerateDartErrorsTask(source, dartEntry, librarySource, libraryEntry);
             }
             if (hintsEnabled) {
               CacheState hintsState = dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource);
-              if (identical(hintsState, CacheState.INVALID) || (isPriority && identical(hintsState, CacheState.FLUSHED))) {
+              if (hintsState == CacheState.INVALID || (isPriority && hintsState == CacheState.FLUSHED)) {
                 return _createGenerateDartHintsTask(source, dartEntry, librarySource, libraryEntry);
               }
             }
@@ -6096,7 +6154,7 @@
     } else if (sourceEntry is HtmlEntry) {
       HtmlEntry htmlEntry = sourceEntry;
       CacheState parseErrorsState = htmlEntry.getState(HtmlEntry.PARSE_ERRORS);
-      if (identical(parseErrorsState, CacheState.INVALID) || (isPriority && identical(parseErrorsState, CacheState.FLUSHED))) {
+      if (parseErrorsState == CacheState.INVALID || (isPriority && parseErrorsState == CacheState.FLUSHED)) {
         return _createParseHtmlTask(source, htmlEntry);
       }
       if (isPriority && parseErrorsState != CacheState.ERROR) {
@@ -6106,7 +6164,7 @@
         }
       }
       CacheState resolvedUnitState = htmlEntry.getState(HtmlEntry.RESOLVED_UNIT);
-      if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
+      if (resolvedUnitState == CacheState.INVALID || (isPriority && resolvedUnitState == CacheState.FLUSHED)) {
         return _createResolveHtmlTask(source, htmlEntry);
       }
       //
@@ -6115,12 +6173,12 @@
       if (_options.analyzeAngular) {
         // Try to resolve the HTML as an Angular entry point.
         CacheState angularEntryState = htmlEntry.getState(HtmlEntry.ANGULAR_ENTRY);
-        if (identical(angularEntryState, CacheState.INVALID) || (isPriority && identical(angularEntryState, CacheState.FLUSHED))) {
+        if (angularEntryState == CacheState.INVALID || (isPriority && angularEntryState == CacheState.FLUSHED)) {
           return _createResolveAngularEntryHtmlTask(source, htmlEntry);
         }
         // Try to resolve the HTML as an Angular application part.
         CacheState angularErrorsState = htmlEntry.getState(HtmlEntry.ANGULAR_ERRORS);
-        if (identical(angularErrorsState, CacheState.INVALID) || (isPriority && identical(angularErrorsState, CacheState.FLUSHED))) {
+        if (angularErrorsState == CacheState.INVALID || (isPriority && angularErrorsState == CacheState.FLUSHED)) {
           return _createResolveAngularComponentTemplateTask(source, htmlEntry);
         }
       }
@@ -6153,7 +6211,7 @@
   DartEntry _getReadableDartEntry(Source source) {
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
-      sourceEntry = _createSourceEntry(source);
+      sourceEntry = _createSourceEntry(source, false);
     }
     if (sourceEntry is DartEntry) {
       return sourceEntry as DartEntry;
@@ -6171,7 +6229,7 @@
   HtmlEntry _getReadableHtmlEntry(Source source) {
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
-      sourceEntry = _createSourceEntry(source);
+      sourceEntry = _createSourceEntry(source, false);
     }
     if (sourceEntry is HtmlEntry) {
       return sourceEntry as HtmlEntry;
@@ -6188,7 +6246,7 @@
   SourceEntry _getReadableSourceEntry(Source source) {
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
-      sourceEntry = _createSourceEntry(source);
+      sourceEntry = _createSourceEntry(source, false);
     }
     return sourceEntry;
   }
@@ -6214,7 +6272,7 @@
     SourceEntry sourceEntry = _cache.get(element.source);
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
-      if (identical(dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource), CacheState.VALID)) {
+      if (dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) == CacheState.VALID) {
         return new TimestampedData<CompilationUnit>(dartEntry.modificationTime, dartEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource));
       }
     }
@@ -6230,7 +6288,7 @@
   List<Source> _getSources(SourceKind kind) {
     List<Source> sources = new List<Source>();
     for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
-      if (identical(entry.getValue().kind, kind)) {
+      if (entry.getValue().kind == kind) {
         sources.add(entry.getKey());
       }
     }
@@ -6256,12 +6314,12 @@
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
       CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS);
-      if (identical(scanErrorsState, CacheState.INVALID) || (isPriority && identical(scanErrorsState, CacheState.FLUSHED))) {
+      if (scanErrorsState == CacheState.INVALID || (isPriority && scanErrorsState == CacheState.FLUSHED)) {
         sources.add(source);
         return;
       }
       CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS);
-      if (identical(parseErrorsState, CacheState.INVALID) || (isPriority && identical(parseErrorsState, CacheState.FLUSHED))) {
+      if (parseErrorsState == CacheState.INVALID || (isPriority && parseErrorsState == CacheState.FLUSHED)) {
         sources.add(source);
         return;
       }
@@ -6275,12 +6333,12 @@
         SourceEntry libraryEntry = _cache.get(librarySource);
         if (libraryEntry is DartEntry) {
           CacheState elementState = libraryEntry.getState(DartEntry.ELEMENT);
-          if (identical(elementState, CacheState.INVALID) || (isPriority && identical(elementState, CacheState.FLUSHED))) {
+          if (elementState == CacheState.INVALID || (isPriority && elementState == CacheState.FLUSHED)) {
             sources.add(source);
             return;
           }
           CacheState resolvedUnitState = dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
-          if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
+          if (resolvedUnitState == CacheState.INVALID || (isPriority && resolvedUnitState == CacheState.FLUSHED)) {
             LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
             if (libraryElement != null) {
               sources.add(source);
@@ -6288,7 +6346,7 @@
             }
           }
           CacheState verificationErrorsState = dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource);
-          if (identical(verificationErrorsState, CacheState.INVALID) || (isPriority && identical(verificationErrorsState, CacheState.FLUSHED))) {
+          if (verificationErrorsState == CacheState.INVALID || (isPriority && verificationErrorsState == CacheState.FLUSHED)) {
             LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
             if (libraryElement != null) {
               sources.add(source);
@@ -6297,7 +6355,7 @@
           }
           if (hintsEnabled) {
             CacheState hintsState = dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource);
-            if (identical(hintsState, CacheState.INVALID) || (isPriority && identical(hintsState, CacheState.FLUSHED))) {
+            if (hintsState == CacheState.INVALID || (isPriority && hintsState == CacheState.FLUSHED)) {
               LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
               if (libraryElement != null) {
                 sources.add(source);
@@ -6310,19 +6368,19 @@
     } else if (sourceEntry is HtmlEntry) {
       HtmlEntry htmlEntry = sourceEntry;
       CacheState parsedUnitState = htmlEntry.getState(HtmlEntry.PARSED_UNIT);
-      if (identical(parsedUnitState, CacheState.INVALID) || (isPriority && identical(parsedUnitState, CacheState.FLUSHED))) {
+      if (parsedUnitState == CacheState.INVALID || (isPriority && parsedUnitState == CacheState.FLUSHED)) {
         sources.add(source);
         return;
       }
       CacheState resolvedUnitState = htmlEntry.getState(HtmlEntry.RESOLVED_UNIT);
-      if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
+      if (resolvedUnitState == CacheState.INVALID || (isPriority && resolvedUnitState == CacheState.FLUSHED)) {
         sources.add(source);
         return;
       }
       // Angular
       if (_options.analyzeAngular) {
         CacheState angularErrorsState = htmlEntry.getState(HtmlEntry.ANGULAR_ERRORS);
-        if (identical(angularErrorsState, CacheState.INVALID) || (isPriority && identical(angularErrorsState, CacheState.FLUSHED))) {
+        if (angularErrorsState == CacheState.INVALID || (isPriority && angularErrorsState == CacheState.FLUSHED)) {
           AngularApplication entryInfo = htmlEntry.getValue(HtmlEntry.ANGULAR_ENTRY);
           if (entryInfo != null) {
             sources.add(source);
@@ -6347,6 +6405,7 @@
    * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
    */
   void _invalidateAllResolutionInformation() {
+    Map<Source, List<Source>> oldPartMap = new Map<Source, List<Source>>();
     for (MapEntry<Source, SourceEntry> mapEntry in _cache.entrySet()) {
       Source source = mapEntry.getKey();
       SourceEntry sourceEntry = mapEntry.getValue();
@@ -6356,13 +6415,14 @@
         mapEntry.setValue(htmlCopy);
       } else if (sourceEntry is DartEntry) {
         DartEntry dartEntry = sourceEntry;
-        _removeFromParts(source, dartEntry);
+        oldPartMap[source] = dartEntry.getValue(DartEntry.INCLUDED_PARTS);
         DartEntryImpl dartCopy = dartEntry.writableCopy;
         dartCopy.invalidateAllResolutionInformation();
         mapEntry.setValue(dartCopy);
         _workManager.add(source, SourcePriority.UNKNOWN);
       }
     }
+    _removeFromPartsUsingMap(oldPartMap);
   }
 
   /**
@@ -6409,10 +6469,8 @@
       dartCopy.setValue(DartEntry.ANGULAR_ERRORS, AnalysisError.NO_ERRORS);
       _cache.put(elementSource, dartCopy);
       // notify about (disappeared) Angular errors
-      if (_generateSdkErrors || !elementSource.isInSystemLibrary) {
-        ChangeNoticeImpl notice = _getNotice(elementSource);
-        notice.setErrors(dartCopy.allErrors, dartEntry.getValue(SourceEntry.LINE_INFO));
-      }
+      ChangeNoticeImpl notice = _getNotice(elementSource);
+      notice.setErrors(dartCopy.allErrors, dartEntry.getValue(SourceEntry.LINE_INFO));
     }
   }
 
@@ -6426,33 +6484,22 @@
    * re-accessed after this method returns.
    *
    * @param librarySource the source of the library being invalidated
-   * @param writer the writer to which debugging information should be written
    */
-  void _invalidateLibraryResolution(Source librarySource, PrintStringWriter writer) {
-    // TODO(brianwilkerson) This could be optimized. There's no need to flush all of these caches if
-    // the public namespace hasn't changed, which will be a fairly common case. The question is
+  void _invalidateLibraryResolution(Source librarySource) {
+    // TODO(brianwilkerson) This could be optimized. There's no need to flush all of these entries
+    // if the public namespace hasn't changed, which will be a fairly common case. The question is
     // whether we can afford the time to compute the namespace to look for differences.
     DartEntry libraryEntry = _getReadableDartEntry(librarySource);
     if (libraryEntry != null) {
       List<Source> includedParts = libraryEntry.getValue(DartEntry.INCLUDED_PARTS);
       DartEntryImpl libraryCopy = libraryEntry.writableCopy;
-      //      long oldTime = libraryCopy.getModificationTime();
       libraryCopy.invalidateAllResolutionInformation();
       _cache.put(librarySource, libraryCopy);
       _workManager.add(librarySource, SourcePriority.LIBRARY);
-      //      if (writer != null) {
-      //        writer.println("  Invalidated library source: " + debuggingString(librarySource)
-      //            + " (previously modified at " + oldTime + ")");
-      //      }
       for (Source partSource in includedParts) {
         SourceEntry partEntry = _cache.get(partSource);
         if (partEntry is DartEntry) {
           DartEntryImpl partCopy = partEntry.writableCopy;
-          //          oldTime = partCopy.getModificationTime();
-          if (partEntry != libraryCopy) {
-            partCopy.removeContainingLibrary(librarySource);
-            _workManager.add(librarySource, SourcePriority.NORMAL_PART);
-          }
           partCopy.invalidateAllResolutionInformation();
           _cache.put(partSource, partCopy);
         }
@@ -6562,10 +6609,8 @@
         dartCopy.setValue(DartEntry.ANGULAR_ERRORS, task.getErrors(elementSource));
         _cache.put(elementSource, dartCopy);
         // notify about Dart errors
-        if (_generateSdkErrors || !elementSource.isInSystemLibrary) {
-          ChangeNoticeImpl notice = _getNotice(elementSource);
-          notice.setErrors(dartCopy.allErrors, computeLineInfo(elementSource));
-        }
+        ChangeNoticeImpl notice = _getNotice(elementSource);
+        notice.setErrors(dartCopy.allErrors, computeLineInfo(elementSource));
       }
     }
     // remember Angular entry point
@@ -6624,10 +6669,8 @@
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       if (thrownException == null) {
         dartCopy.setValueInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, task.errors);
-        if (_generateSdkErrors || !source.isInSystemLibrary) {
-          ChangeNoticeImpl notice = _getNotice(source);
-          notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
-        }
+        ChangeNoticeImpl notice = _getNotice(source);
+        notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
       } else {
         dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.ERROR);
       }
@@ -6726,10 +6769,8 @@
         DartEntryImpl dartCopy = dartEntry.writableCopy;
         if (thrownException == null) {
           dartCopy.setValueInLibrary(DartEntry.HINTS, librarySource, results.data);
-          if (_generateSdkErrors || !unitSource.isInSystemLibrary) {
-            ChangeNoticeImpl notice = _getNotice(unitSource);
-            notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
-          }
+          ChangeNoticeImpl notice = _getNotice(unitSource);
+          notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
         } else {
           dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.ERROR);
         }
@@ -6738,7 +6779,7 @@
         dartEntry = dartCopy;
       } else {
         _logInformation2("Generated hints discarded for ${_debuggingString(unitSource)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
-        if (identical(dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource), CacheState.IN_PROCESS)) {
+        if (dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource) == CacheState.IN_PROCESS) {
           DartEntryImpl dartCopy = dartEntry.writableCopy;
           if (thrownException == null || resultTime >= 0) {
             //
@@ -6816,10 +6857,8 @@
   DartEntry _recordIncrementalAnalysisTaskResults(IncrementalAnalysisTask task) {
     CompilationUnit unit = task.compilationUnit;
     if (unit != null) {
-      if (_generateSdkErrors || !task.source.isInSystemLibrary) {
-        ChangeNoticeImpl notice = _getNotice(task.source);
-        notice.compilationUnit = unit;
-      }
+      ChangeNoticeImpl notice = _getNotice(task.source);
+      notice.compilationUnit = unit;
       _incrementalAnalysisCache = IncrementalAnalysisCache.cacheResult(task.cache, unit);
     }
     return null;
@@ -6860,21 +6899,35 @@
       _removeFromParts(source, dartEntry);
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       if (thrownException == null) {
-        if (task.hasPartOfDirective && !task.hasLibraryDirective) {
+        if (task.hasNonPartOfDirective) {
+          dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
+          dartCopy.containingLibrary = source;
+          _workManager.add(source, SourcePriority.LIBRARY);
+        } else if (task.hasPartOfDirective) {
           dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.PART);
           dartCopy.removeContainingLibrary(source);
           _workManager.add(source, SourcePriority.NORMAL_PART);
         } else {
-          dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
-          dartCopy.containingLibrary = source;
-          _workManager.add(source, SourcePriority.LIBRARY);
+          // The file contains no directives.
+          List<Source> containingLibraries = dartCopy.containingLibraries;
+          if (containingLibraries.length > 1 || (containingLibraries.length == 1 && containingLibraries[0] != source)) {
+            dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.PART);
+            dartCopy.removeContainingLibrary(source);
+            _workManager.add(source, SourcePriority.NORMAL_PART);
+          } else {
+            dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
+            dartCopy.containingLibrary = source;
+            _workManager.add(source, SourcePriority.LIBRARY);
+          }
         }
         List<Source> newParts = task.includedSources;
         for (int i = 0; i < newParts.length; i++) {
           Source partSource = newParts[i];
           DartEntry partEntry = _getReadableDartEntry(partSource);
-          if (partEntry != null && partEntry != dartEntry) {
+          if (partEntry != null && !identical(partEntry, dartEntry)) {
             DartEntryImpl partCopy = partEntry.writableCopy;
+            // TODO(brianwilkerson) Change the kind of the "part" if it was marked as a library
+            // and it has no directives.
             partCopy.addContainingLibrary(source);
             _cache.put(partSource, partCopy);
           }
@@ -6885,10 +6938,8 @@
         dartCopy.setValue(DartEntry.IMPORTED_LIBRARIES, task.importedSources);
         dartCopy.setValue(DartEntry.INCLUDED_PARTS, newParts);
         _cache.storedAst(source);
-        if (_generateSdkErrors || !source.isInSystemLibrary) {
-          ChangeNoticeImpl notice = _getNotice(source);
-          notice.setErrors(dartCopy.allErrors, task.lineInfo);
-        }
+        ChangeNoticeImpl notice = _getNotice(source);
+        notice.setErrors(dartCopy.allErrors, task.lineInfo);
         // Verify that the incrementally parsed and resolved unit in the incremental cache
         // is structurally equivalent to the fully parsed unit
         _incrementalAnalysisCache = IncrementalAnalysisCache.verifyStructure(_incrementalAnalysisCache, source, task.compilationUnit);
@@ -6973,10 +7024,8 @@
         htmlCopy.setValue(HtmlEntry.PARSE_ERRORS, task.errors);
         htmlCopy.setValue(HtmlEntry.REFERENCED_LIBRARIES, task.referencedLibraries);
         _cache.storedAst(source);
-        if (_generateSdkErrors || !source.isInSystemLibrary) {
-          ChangeNoticeImpl notice = _getNotice(source);
-          notice.setErrors(htmlCopy.allErrors, lineInfo);
-        }
+        ChangeNoticeImpl notice = _getNotice(source);
+        notice.setErrors(htmlCopy.allErrors, lineInfo);
       } else {
         htmlCopy.recordParseError();
         _cache.removedAst(source);
@@ -7060,11 +7109,9 @@
       if (thrownException == null) {
         htmlCopy.setValue(HtmlEntry.ANGULAR_ERRORS, task.resolutionErrors);
         // notify about errors
-        if (_generateSdkErrors || !source.isInSystemLibrary) {
-          ChangeNoticeImpl notice = _getNotice(source);
-          notice.htmlUnit = task.resolvedUnit;
-          notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
-        }
+        ChangeNoticeImpl notice = _getNotice(source);
+        notice.htmlUnit = task.resolvedUnit;
+        notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
       } else {
         htmlCopy.recordResolutionError();
       }
@@ -7144,11 +7191,9 @@
         htmlCopy.setValue(HtmlEntry.RESOLVED_UNIT, task.resolvedUnit);
         _recordAngularEntryPoint(htmlCopy, task);
         _cache.storedAst(source);
-        if (_generateSdkErrors || !source.isInSystemLibrary) {
-          ChangeNoticeImpl notice = _getNotice(source);
-          notice.htmlUnit = task.resolvedUnit;
-          notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
-        }
+        ChangeNoticeImpl notice = _getNotice(source);
+        notice.htmlUnit = task.resolvedUnit;
+        notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
       } else {
         htmlCopy.recordResolutionError();
       }
@@ -7309,11 +7354,9 @@
         htmlCopy.setValue(HtmlEntry.ELEMENT, task.element);
         htmlCopy.setValue(HtmlEntry.RESOLUTION_ERRORS, task.resolutionErrors);
         _cache.storedAst(source);
-        if (_generateSdkErrors || !source.isInSystemLibrary) {
-          ChangeNoticeImpl notice = _getNotice(source);
-          notice.htmlUnit = task.resolvedUnit;
-          notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
-        }
+        ChangeNoticeImpl notice = _getNotice(source);
+        notice.htmlUnit = task.resolvedUnit;
+        notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_INFO));
       } else {
         htmlCopy.recordResolutionError();
         _cache.removedAst(source);
@@ -7396,10 +7439,8 @@
         dartCopy.setValue(DartEntry.SCAN_ERRORS, task.errors);
         _cache.storedAst(source);
         _workManager.add(source, SourcePriority.NORMAL_PART);
-        if (_generateSdkErrors || !source.isInSystemLibrary) {
-          ChangeNoticeImpl notice = _getNotice(source);
-          notice.setErrors(dartEntry.allErrors, lineInfo);
-        }
+        ChangeNoticeImpl notice = _getNotice(source);
+        notice.setErrors(dartEntry.allErrors, lineInfo);
       } else {
         _removeFromParts(source, dartEntry);
         dartCopy.recordScanError();
@@ -7454,10 +7495,10 @@
     for (int i = 0; i < oldParts.length; i++) {
       Source partSource = oldParts[i];
       DartEntry partEntry = _getReadableDartEntry(partSource);
-      if (partEntry != null && partEntry != dartEntry) {
+      if (partEntry != null && !identical(partEntry, dartEntry)) {
         DartEntryImpl partCopy = partEntry.writableCopy;
         partCopy.removeContainingLibrary(librarySource);
-        if (partCopy.librariesContaining.length == 0 && !exists(partSource)) {
+        if (partCopy.containingLibraries.length == 0 && !exists(partSource)) {
           _cache.remove(partSource);
         } else {
           _cache.put(partSource, partCopy);
@@ -7467,6 +7508,36 @@
   }
 
   /**
+   * Remove the given libraries that are keys in the given map from the list of containing libraries
+   * for each of the parts in the corresponding value.
+   *
+   * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
+   *
+   * @param oldPartMap the table containing the parts associated with each library
+   */
+  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();
+      for (int i = 0; i < oldParts.length; i++) {
+        Source partSource = oldParts[i];
+        if (partSource != librarySource) {
+          DartEntry partEntry = _getReadableDartEntry(partSource);
+          if (partEntry != null) {
+            DartEntryImpl partCopy = partEntry.writableCopy;
+            partCopy.removeContainingLibrary(librarySource);
+            if (partCopy.containingLibraries.length == 0 && !exists(partSource)) {
+              _cache.remove(partSource);
+            } else {
+              _cache.put(partSource, partCopy);
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /**
    * Remove the given source from the priority order if it is in the list.
    *
    * @param source the source to be removed
@@ -7496,12 +7567,13 @@
   bool _sourceAvailable(Source source) {
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry == null) {
-      sourceEntry = _createSourceEntry(source);
+      sourceEntry = _createSourceEntry(source, true);
     } else {
       SourceEntryImpl sourceCopy = sourceEntry.writableCopy;
-      //      long oldTime = sourceCopy.getModificationTime();
-      sourceCopy.modificationTime = getModificationStamp(source);
-      // TODO(brianwilkerson) Understand why we're not invalidating the cache.
+      int newTime = getModificationStamp(source);
+      sourceCopy.modificationTime = newTime;
+      sourceCopy.explicitlyAdded = true;
+      // TODO(brianwilkerson) Understand why we're not invalidating the cached data.
       _cache.put(source, sourceCopy);
     }
     if (sourceEntry is HtmlEntry) {
@@ -7522,16 +7594,10 @@
     if (sourceEntry == null || sourceEntry.modificationTime == getModificationStamp(source)) {
       // Either we have removed this source, in which case we don't care that it is changed, or we
       // have already invalidated the cache and don't need to invalidate it again.
-      //      if (sourceEntry == null) {
-      //        logInformation("Modified source, but there is no entry: " + debuggingString(source));
-      //      } else {
-      //        logInformation("Modified source, but modification time matches: " + debuggingString(source));
-      //      }
       return;
     }
     if (sourceEntry is HtmlEntry) {
       HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
-      //      long oldTime = htmlCopy.getModificationTime();
       htmlCopy.modificationTime = getModificationStamp(source);
       _invalidateAngularResolution(htmlCopy);
       htmlCopy.invalidateAllInformation();
@@ -7547,10 +7613,9 @@
           librariesToInvalidate.add(dependentLibrary);
         }
       }
-      PrintStringWriter writer = new PrintStringWriter();
       for (Source library in librariesToInvalidate) {
         //    for (Source library : containingLibraries) {
-        _invalidateLibraryResolution(library, writer);
+        _invalidateLibraryResolution(library);
       }
       _removeFromParts(source, _cache.get(source) as DartEntry);
       DartEntryImpl dartCopy = (_cache.get(source) as DartEntry).writableCopy;
@@ -7568,7 +7633,6 @@
    * @param source the source that has been deleted
    */
   void _sourceRemoved(Source source) {
-    PrintStringWriter writer = new PrintStringWriter();
     SourceEntry sourceEntry = _cache.get(source);
     if (sourceEntry is HtmlEntry) {
       HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
@@ -7582,7 +7646,7 @@
         }
       }
       for (Source librarySource in libraries) {
-        _invalidateLibraryResolution(librarySource, writer);
+        _invalidateLibraryResolution(librarySource);
       }
     }
     _cache.remove(source);
@@ -8216,7 +8280,7 @@
       return Source.EMPTY_ARRAY;
     }
     CacheState exportState = dartEntry.getState(descriptor);
-    if (identical(exportState, CacheState.ERROR)) {
+    if (exportState == CacheState.ERROR) {
       return Source.EMPTY_ARRAY;
     } else if (exportState != CacheState.VALID) {
       if (_taskData == null) {
@@ -8243,13 +8307,13 @@
   /**
    * The task that is to be performed.
    */
-  AnalysisTask task;
+  final AnalysisTask task;
 
   /**
    * A flag indicating whether the associated source is blocked waiting for its contents to be
    * loaded.
    */
-  bool _blocked = false;
+  final bool _blocked;
 
   /**
    * Initialize a newly created data holder.
@@ -8258,10 +8322,7 @@
    * @param blocked `true` if the associated source is blocked waiting for its contents to
    *          be loaded
    */
-  AnalysisContextImpl_TaskData(AnalysisTask task, bool blocked) {
-    this.task = task;
-    this._blocked = blocked;
-  }
+  AnalysisContextImpl_TaskData(this.task, this._blocked);
 
   /**
    * Return `true` if the associated source is blocked waiting for its contents to be
@@ -8289,12 +8350,12 @@
   /**
    * The analysis errors associated with a source, or `null` if there are no errors.
    */
-  List<AnalysisError> errors;
+  final List<AnalysisError> errors;
 
   /**
    * The line information associated with the errors, or `null` if there are no errors.
    */
-  LineInfo lineInfo;
+  final LineInfo lineInfo;
 
   /**
    * Initialize an newly created error info with the errors and line information
@@ -8302,10 +8363,7 @@
    * @param errors the errors as a result of analysis
    * @param lineinfo the line info for the errors
    */
-  AnalysisErrorInfoImpl(List<AnalysisError> errors, LineInfo lineInfo) {
-    this.errors = errors;
-    this.lineInfo = lineInfo;
-  }
+  AnalysisErrorInfoImpl(this.errors, this.lineInfo);
 }
 
 /**
@@ -8401,7 +8459,7 @@
   /**
    * The source for which the result is being reported.
    */
-  Source source;
+  final Source source;
 
   /**
    * The fully resolved AST that changed as a result of the analysis, or `null` if the AST was
@@ -8436,9 +8494,7 @@
    *
    * @param source the source for which the change is being reported
    */
-  ChangeNoticeImpl(Source source) {
-    this.source = source;
-  }
+  ChangeNoticeImpl(this.source);
 
   @override
   List<AnalysisError> get errors => _errors;
@@ -8891,13 +8947,13 @@
     return cache;
   }
 
-  Source librarySource;
+  final Source librarySource;
 
-  Source source;
+  final Source source;
 
-  String oldContents;
+  final String oldContents;
 
-  CompilationUnit resolvedUnit;
+  final CompilationUnit resolvedUnit;
 
   String _newContents;
 
@@ -8907,11 +8963,7 @@
 
   int _newLength = 0;
 
-  IncrementalAnalysisCache(Source librarySource, Source source, CompilationUnit resolvedUnit, String oldContents, String newContents, int offset, int oldLength, int newLength) {
-    this.librarySource = librarySource;
-    this.source = source;
-    this.resolvedUnit = resolvedUnit;
-    this.oldContents = oldContents;
+  IncrementalAnalysisCache(this.librarySource, this.source, this.resolvedUnit, this.oldContents, String newContents, int offset, int oldLength, int newLength) {
     this._newContents = newContents;
     this._offset = offset;
     this._oldLength = oldLength;
@@ -9817,6 +9869,19 @@
    * The [TimeCounter] for time spent in hints generator.
    */
   static TimeCounter hints = new TimeCounter();
+
+  /**
+   * Reset all of the time counters to zero.
+   */
+  static void reset() {
+    io = new TimeCounter();
+    scan = new TimeCounter();
+    parse = new TimeCounter();
+    resolve = new TimeCounter();
+    angular = new TimeCounter();
+    errors = new TimeCounter();
+    hints = new TimeCounter();
+  }
 }
 
 /**
@@ -10006,7 +10071,7 @@
   /**
    * The source of the compilation unit.
    */
-  Source _source;
+  final Source source;
 
   /**
    * Initialize a newly created holder to hold the given values.
@@ -10014,7 +10079,7 @@
    * @param modificationTime the modification time of the source from which the AST was created
    * @param unit the AST that was created from the source
    */
-  ResolvableCompilationUnit.con1(int modificationTime, CompilationUnit unit) : super(modificationTime, unit);
+  ResolvableCompilationUnit.con1(int modificationTime, CompilationUnit unit) : this.con2(modificationTime, unit, null);
 
   /**
    * Initialize a newly created holder to hold the given values.
@@ -10023,9 +10088,7 @@
    * @param unit the AST that was created from the source
    * @param source the source of the compilation unit
    */
-  ResolvableCompilationUnit.con2(int modificationTime, CompilationUnit unit, Source source) : super(modificationTime, unit) {
-    this._source = source;
-  }
+  ResolvableCompilationUnit.con2(int modificationTime, CompilationUnit unit, this.source) : super(modificationTime, unit);
 
   /**
    * Return the AST that was created from the source.
@@ -10033,13 +10096,6 @@
    * @return the AST that was created from the source
    */
   CompilationUnit get compilationUnit => data;
-
-  /**
-   * Return the source of the compilation unit.
-   *
-   * @return the source of the compilation unit
-   */
-  Source get source => _source;
 }
 
 /**
@@ -10074,31 +10130,31 @@
    * resolved. These parts are given a higher priority because there is a high probability that
    * their AST structure is still in the cache and therefore would not need to be re-created.
    */
-  static final SourcePriority PRIORITY_PART = new SourcePriority('PRIORITY_PART', 0);
+  static const SourcePriority PRIORITY_PART = const SourcePriority('PRIORITY_PART', 0);
 
   /**
    * Used for a Dart source that is known to be a library.
    */
-  static final SourcePriority LIBRARY = new SourcePriority('LIBRARY', 1);
+  static const SourcePriority LIBRARY = const SourcePriority('LIBRARY', 1);
 
   /**
    * Used for a Dart source whose kind is unknown.
    */
-  static final SourcePriority UNKNOWN = new SourcePriority('UNKNOWN', 2);
+  static const SourcePriority UNKNOWN = const SourcePriority('UNKNOWN', 2);
 
   /**
    * Used for a Dart source that is known to be a part but whose library has not yet been resolved.
    */
-  static final SourcePriority NORMAL_PART = new SourcePriority('NORMAL_PART', 3);
+  static const SourcePriority NORMAL_PART = const SourcePriority('NORMAL_PART', 3);
 
   /**
    * Used for an HTML source.
    */
-  static final SourcePriority HTML = new SourcePriority('HTML', 4);
+  static const SourcePriority HTML = const SourcePriority('HTML', 4);
 
-  static final List<SourcePriority> values = [PRIORITY_PART, LIBRARY, UNKNOWN, NORMAL_PART, HTML];
+  static const List<SourcePriority> values = const [PRIORITY_PART, LIBRARY, UNKNOWN, NORMAL_PART, HTML];
 
-  SourcePriority(String name, int ordinal) : super(name, ordinal);
+  const SourcePriority(String name, int ordinal) : super(name, ordinal);
 }
 
 /**
@@ -10109,12 +10165,12 @@
   /**
    * The modification time of the source from which the data was created.
    */
-  int modificationTime = 0;
+  final int modificationTime;
 
   /**
    * The data that was created from the source.
    */
-  E data;
+  final E data;
 
   /**
    * Initialize a newly created holder to hold the given values.
@@ -10122,10 +10178,7 @@
    * @param modificationTime the modification time of the source from which the data was created
    * @param unit the data that was created from the source
    */
-  TimestampedData(int modificationTime, E data) {
-    this.modificationTime = modificationTime;
-    this.data = data;
-  }
+  TimestampedData(this.modificationTime, this.data);
 }
 
 /**
@@ -10318,17 +10371,14 @@
   /**
    * The [Expression] to apply filters to.
    */
-  Expression expression;
+  final Expression expression;
 
   /**
    * The filters to apply.
    */
-  List<AngularFilterNode> filters;
+  final List<AngularFilterNode> filters;
 
-  AngularExpression(Expression expression, List<AngularFilterNode> filters) {
-    this.expression = expression;
-    this.filters = filters;
-  }
+  AngularExpression(this.expression, this.filters);
 
   /**
    * Return the offset of the character immediately following the last character of this node's
@@ -10382,22 +10432,19 @@
   /**
    * The [TokenType#COLON] token.
    */
-  Token token;
+  final Token token;
 
   /**
    * The argument expression.
    */
-  Expression expression;
+  final Expression expression;
 
   /**
    * The optional sub-[Expression]s.
    */
   List<Expression> subExpressions = Expression.EMPTY_ARRAY;
 
-  AngularFilterArgument(Token token, Expression expression) {
-    this.token = token;
-    this.expression = expression;
-  }
+  AngularFilterArgument(this.token, this.expression);
 }
 
 /**
@@ -10407,23 +10454,19 @@
   /**
    * The [TokenType#BAR] token.
    */
-  Token token;
+  final Token token;
 
   /**
    * The name of the filter.
    */
-  SimpleIdentifier name;
+  final SimpleIdentifier name;
 
   /**
    * The arguments for this filter.
    */
-  List<AngularFilterArgument> arguments;
+  final List<AngularFilterArgument> arguments;
 
-  AngularFilterNode(Token token, SimpleIdentifier name, List<AngularFilterArgument> arguments) {
-    this.token = token;
-    this.name = name;
-    this.arguments = arguments;
-  }
+  AngularFilterNode(this.token, this.name, this.arguments);
 }
 
 /**
@@ -10544,17 +10587,17 @@
     return sources;
   }
 
-  InternalAnalysisContext _context;
+  final InternalAnalysisContext _context;
 
   TypeProvider _typeProvider;
 
   AngularHtmlUnitResolver_FilteringAnalysisErrorListener _errorListener;
 
-  Source _source;
+  final Source _source;
 
-  LineInfo _lineInfo;
+  final LineInfo _lineInfo;
 
-  ht.HtmlUnit _unit;
+  final ht.HtmlUnit _unit;
 
   List<AngularElement> _angularElements;
 
@@ -10578,13 +10621,9 @@
 
   Scope _nameScope;
 
-  AngularHtmlUnitResolver(InternalAnalysisContext context, AnalysisErrorListener errorListener, Source source, LineInfo lineInfo, ht.HtmlUnit unit) {
-    this._context = context;
-    this._typeProvider = context.typeProvider;
+  AngularHtmlUnitResolver(this._context, AnalysisErrorListener errorListener, this._source, this._lineInfo, this._unit) {
+    this._typeProvider = _context.typeProvider;
     this._errorListener = new AngularHtmlUnitResolver_FilteringAnalysisErrorListener(errorListener);
-    this._source = source;
-    this._lineInfo = lineInfo;
-    this._unit = unit;
   }
 
   /**
@@ -10795,7 +10834,7 @@
       while (filterToken.type != TokenType.EOF) {
         // skip ":"
         Token colonToken = filterToken;
-        if (identical(colonToken.type, TokenType.COLON)) {
+        if (colonToken.type == TokenType.COLON) {
           filterToken = filterToken.next;
         } else {
           _reportErrorForToken(AngularCode.MISSING_FILTER_COLON, colonToken, []);
@@ -10988,7 +11027,7 @@
     ht.Token token = node.attributeEnd;
     ht.Token endToken = node.endToken;
     bool inChild = false;
-    while (token != endToken) {
+    while (!identical(token, endToken)) {
       for (ht.XmlTagNode child in node.tagNodes) {
         if (identical(token, child.beginToken)) {
           inChild = true;
@@ -10999,7 +11038,7 @@
           break;
         }
       }
-      if (!inChild && identical(token.type, ht.TokenType.TEXT)) {
+      if (!inChild && token.type == ht.TokenType.TEXT) {
         _parseEmbeddedExpressions(expressions, token);
       }
       token = token.next;
@@ -11098,7 +11137,7 @@
     List<Token> tokens = [];
     tokens.add(token);
     while (token.type != TokenType.EOF) {
-      if (identical(token.type, TokenType.BAR)) {
+      if (token.type == TokenType.BAR) {
         tokens.add(token);
         Token eofToken = new Token(TokenType.EOF, 0);
         token.previous.setNext(eofToken);
@@ -11119,11 +11158,9 @@
 }
 
 class AngularHtmlUnitResolver_FilteringAnalysisErrorListener implements AnalysisErrorListener {
-  AnalysisErrorListener _listener;
+  final AnalysisErrorListener _listener;
 
-  AngularHtmlUnitResolver_FilteringAnalysisErrorListener(AnalysisErrorListener listener) {
-    this._listener = listener;
-  }
+  AngularHtmlUnitResolver_FilteringAnalysisErrorListener(this._listener);
 
   @override
   void onError(AnalysisError error) {
@@ -11183,17 +11220,14 @@
   /**
    * The offset of the first character of the opening delimiter.
    */
-  int _openingOffset = 0;
+  final int _openingOffset;
 
   /**
    * The offset of the first character of the closing delimiter.
    */
-  int _closingOffset = 0;
+  final int _closingOffset;
 
-  AngularMoustacheXmlExpression(int openingOffset, int closingOffset, AngularExpression expression) : super(expression) {
-    this._openingOffset = openingOffset;
-    this._closingOffset = closingOffset;
-  }
+  AngularMoustacheXmlExpression(this._openingOffset, this._closingOffset, AngularExpression expression) : super(expression);
 
   @override
   int get end => _closingOffset + CLOSING_DELIMITER_LENGTH;
@@ -11229,11 +11263,9 @@
   /**
    * The expression that is enclosed between the delimiters.
    */
-  AngularExpression expression;
+  final AngularExpression expression;
 
-  AngularXmlExpression(AngularExpression expression) {
-    this.expression = expression;
-  }
+  AngularXmlExpression(this.expression);
 
   @override
   ht.XmlExpression_Reference getReference(int offset) {
@@ -11322,11 +11354,9 @@
  * attributes as expressions.
  */
 class NgComponentElementProcessor extends NgDirectiveProcessor {
-  AngularComponentElement _element;
+  final AngularComponentElement _element;
 
-  NgComponentElementProcessor(AngularComponentElement element) {
-    this._element = element;
-  }
+  NgComponentElementProcessor(this._element);
 
   @override
   void apply(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) {
@@ -11354,11 +11384,9 @@
  * [NgControllerElementProcessor] applies [AngularControllerElement].
  */
 class NgControllerElementProcessor extends NgProcessor {
-  AngularControllerElement _element;
+  final AngularControllerElement _element;
 
-  NgControllerElementProcessor(AngularControllerElement element) {
-    this._element = element;
-  }
+  NgControllerElementProcessor(this._element);
 
   @override
   void apply(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) {
@@ -11378,11 +11406,9 @@
  * attributes as expressions.
  */
 class NgDirectiveElementProcessor extends NgDirectiveProcessor {
-  AngularDirectiveElement _element;
+  final AngularDirectiveElement _element;
 
-  NgDirectiveElementProcessor(AngularDirectiveElement element) {
-    this._element = element;
-  }
+  NgDirectiveElementProcessor(this._element);
 
   @override
   void apply(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) {
@@ -11576,7 +11602,7 @@
   /**
    * The context in which the task is to be performed.
    */
-  InternalAnalysisContext context;
+  final InternalAnalysisContext context;
 
   /**
    * The exception that was thrown while performing this task, or `null` if the task completed
@@ -11589,9 +11615,7 @@
    *
    * @param context the context in which the task is to be performed
    */
-  AnalysisTask(InternalAnalysisContext context) {
-    this.context = context;
-  }
+  AnalysisTask(this.context);
 
   /**
    * Use the given visitor to visit this task.
@@ -11793,22 +11817,22 @@
   /**
    * The source for which errors and warnings are to be produced.
    */
-  Source source;
+  final Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  int modificationTime = 0;
+  final int modificationTime;
 
   /**
    * The compilation unit used to resolve the dependencies.
    */
-  CompilationUnit _unit;
+  final CompilationUnit _unit;
 
   /**
    * The element model for the library containing the source.
    */
-  LibraryElement libraryElement;
+  final LibraryElement libraryElement;
 
   /**
    * The errors that were generated for the source.
@@ -11824,12 +11848,7 @@
    * @param unit the compilation unit used to resolve the dependencies
    * @param libraryElement the element model for the library containing the source
    */
-  GenerateDartErrorsTask(InternalAnalysisContext context, Source source, int modificationTime, CompilationUnit unit, LibraryElement libraryElement) : super(context) {
-    this.source = source;
-    this.modificationTime = modificationTime;
-    this._unit = unit;
-    this.libraryElement = libraryElement;
-  }
+  GenerateDartErrorsTask(InternalAnalysisContext context, this.source, this.modificationTime, this._unit, this.libraryElement) : super(context);
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartErrorsTask(this);
@@ -11877,12 +11896,12 @@
    * The compilation units that comprise the library, with the defining compilation unit appearing
    * first in the array.
    */
-  List<TimestampedData<CompilationUnit>> _units;
+  final List<TimestampedData<CompilationUnit>> _units;
 
   /**
    * The element model for the library being analyzed.
    */
-  LibraryElement libraryElement;
+  final LibraryElement libraryElement;
 
   /**
    * A table mapping the sources that were analyzed to the hints that were generated for the
@@ -11898,10 +11917,7 @@
    *          unit appearing first in the array
    * @param libraryElement the element model for the library being analyzed
    */
-  GenerateDartHintsTask(InternalAnalysisContext context, List<TimestampedData<CompilationUnit>> units, LibraryElement libraryElement) : super(context) {
-    this._units = units;
-    this.libraryElement = libraryElement;
-  }
+  GenerateDartHintsTask(InternalAnalysisContext context, this._units, this.libraryElement) : super(context);
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartHintsTask(this);
@@ -11961,7 +11977,7 @@
   /**
    * The source to be read.
    */
-  Source source;
+  final Source source;
 
   /**
    * A flag indicating whether this task is complete.
@@ -11985,11 +12001,10 @@
    * @param source the source to be parsed
    * @param contentData the time-stamped contents of the source
    */
-  GetContentTask(InternalAnalysisContext context, Source source) : super(context) {
+  GetContentTask(InternalAnalysisContext context, this.source) : super(context) {
     if (source == null) {
       throw new IllegalArgumentException("Cannot get contents of null source");
     }
-    this.source = source;
   }
 
   @override
@@ -12045,7 +12060,7 @@
   /**
    * The information used to perform incremental analysis.
    */
-  IncrementalAnalysisCache cache;
+  final IncrementalAnalysisCache cache;
 
   /**
    * The compilation unit that was produced by incrementally updating the existing unit.
@@ -12058,9 +12073,7 @@
    * @param context the context in which the task is to be performed
    * @param cache the incremental analysis cache used to perform the analysis
    */
-  IncrementalAnalysisTask(InternalAnalysisContext context, IncrementalAnalysisCache cache) : super(context) {
-    this.cache = cache;
-  }
+  IncrementalAnalysisTask(InternalAnalysisContext context, this.cache) : super(context);
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitIncrementalAnalysisTask(this);
@@ -12137,24 +12150,60 @@
  */
 class ParseDartTask extends AnalysisTask {
   /**
+   * Return the result of resolving the URI of the given URI-based directive against the URI of the
+   * given library, or `null` if the URI is not valid.
+   *
+   * @param context the context in which the resolution is to be performed
+   * @param librarySource the source representing the library containing the directive
+   * @param directive the directive which URI should be resolved
+   * @param errorListener the error listener to which errors should be reported
+   * @return the result of resolving the URI against the URI of the library
+   */
+  static Source resolveSource(AnalysisContext analysisContext, Source librarySource, UriBasedDirective directive, AnalysisErrorListener errorListener) {
+    StringLiteral uriLiteral = directive.uri;
+    if (uriLiteral is StringInterpolation) {
+      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, []));
+      return null;
+    }
+    String uriContent = uriLiteral.stringValue.trim();
+    directive.uriContent = uriContent;
+    if (directive is ImportDirective && uriContent.startsWith(_DART_EXT_SCHEME)) {
+      return null;
+    }
+    try {
+      String encodedUriContent = Uri.encodeFull(uriContent);
+      parseUriWithException(encodedUriContent);
+      Source source = analysisContext.sourceFactory.resolveUri(librarySource, encodedUriContent);
+      if (!analysisContext.exists(source)) {
+        errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent]));
+      }
+      directive.source = source;
+      return source;
+    } on URISyntaxException catch (exception) {
+      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
+    }
+    return null;
+  }
+
+  /**
    * The source to be parsed.
    */
-  Source source;
+  final Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  int modificationTime = 0;
+  final int modificationTime;
 
   /**
    * The head of the token stream used for parsing.
    */
-  Token _tokenStream;
+  final Token _tokenStream;
 
   /**
    * The line information associated with the source.
    */
-  LineInfo lineInfo;
+  final LineInfo lineInfo;
 
   /**
    * The compilation unit that was produced by parsing the source.
@@ -12162,16 +12211,16 @@
   CompilationUnit _unit;
 
   /**
-   * A flag indicating whether the source contains a 'library' directive.
-   */
-  bool _containsLibraryDirective = false;
-
-  /**
    * A flag indicating whether the source contains a 'part of' directive.
    */
   bool _containsPartOfDirective = false;
 
   /**
+   * A flag indicating whether the source contains any directive other than a 'part of' directive.
+   */
+  bool _containsNonPartOfDirective = false;
+
+  /**
    * A set containing the sources referenced by 'export' directives.
    */
   Set<Source> _exportedSources = new Set<Source>();
@@ -12205,12 +12254,7 @@
    * @param tokenStream the head of the token stream used for parsing
    * @param lineInfo the line information associated with the source
    */
-  ParseDartTask(InternalAnalysisContext context, Source source, int modificationTime, Token tokenStream, LineInfo lineInfo) : super(context) {
-    this.source = source;
-    this.modificationTime = modificationTime;
-    this._tokenStream = tokenStream;
-    this.lineInfo = lineInfo;
-  }
+  ParseDartTask(InternalAnalysisContext context, this.source, this.modificationTime, this._tokenStream, this.lineInfo) : super(context);
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitParseDartTask(this);
@@ -12256,12 +12300,12 @@
   List<Source> get includedSources => _toArray(_includedSources);
 
   /**
-   * Return `true` if the source contains a 'library' directive, or `false` if the task
-   * has not yet been performed or if an exception occurred.
+   * Return `true` if the source contains any directive other than a 'part of' directive, or
+   * `false` if the task has not yet been performed or if an exception occurred.
    *
-   * @return `true` if the source contains a 'library' directive
+   * @return `true` if the source contains any directive other than a 'part of' directive
    */
-  bool get hasLibraryDirective => _containsLibraryDirective;
+  bool get hasNonPartOfDirective => _containsNonPartOfDirective;
 
   /**
    * Return `true` if the source contains a 'part of' directive, or `false` if the task
@@ -12291,71 +12335,37 @@
       parser.parseFunctionBodies = context.analysisOptions.analyzeFunctionBodies;
       _unit = parser.parseCompilationUnit(_tokenStream);
       _unit.lineInfo = lineInfo;
-      _errors = errorListener.getErrorsForSource(source);
+      AnalysisContext analysisContext = context;
       for (Directive directive in _unit.directives) {
-        if (directive is ExportDirective) {
-          Source exportSource = _resolveSource(source, directive, errorListener);
-          if (exportSource != null) {
-            _exportedSources.add(exportSource);
-          }
-        } else if (directive is ImportDirective) {
-          Source importSource = _resolveSource(source, directive, errorListener);
-          if (importSource != null) {
-            _importedSources.add(importSource);
-          }
-        } else if (directive is LibraryDirective) {
-          _containsLibraryDirective = true;
-        } else if (directive is PartDirective) {
-          Source partSource = _resolveSource(source, directive, errorListener);
-          if (partSource != null && partSource != source) {
-            _includedSources.add(partSource);
-          }
-        } else if (directive is PartOfDirective) {
+        if (directive is PartOfDirective) {
           _containsPartOfDirective = true;
+        } else {
+          _containsNonPartOfDirective = true;
+          if (directive is ExportDirective) {
+            Source exportSource = resolveSource(analysisContext, source, directive, errorListener);
+            if (exportSource != null) {
+              _exportedSources.add(exportSource);
+            }
+          } else if (directive is ImportDirective) {
+            Source importSource = resolveSource(analysisContext, source, directive, errorListener);
+            if (importSource != null) {
+              _importedSources.add(importSource);
+            }
+          } else if (directive is PartDirective) {
+            Source partSource = resolveSource(analysisContext, source, directive, errorListener);
+            if (partSource != null && partSource != source) {
+              _includedSources.add(partSource);
+            }
+          }
         }
       }
+      _errors = errorListener.getErrorsForSource(source);
     } finally {
       timeCounterParse.stop();
     }
   }
 
   /**
-   * Return the result of resolving the URI of the given URI-based directive against the URI of the
-   * given library, or `null` if the URI is not valid.
-   *
-   * @param librarySource the source representing the library containing the directive
-   * @param directive the directive which URI should be resolved
-   * @param errorListener the error listener to which errors should be reported
-   * @return the result of resolving the URI against the URI of the library
-   */
-  Source _resolveSource(Source librarySource, UriBasedDirective directive, AnalysisErrorListener errorListener) {
-    StringLiteral uriLiteral = directive.uri;
-    if (uriLiteral is StringInterpolation) {
-      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, []));
-      return null;
-    }
-    String uriContent = uriLiteral.stringValue.trim();
-    directive.uriContent = uriContent;
-    if (directive is ImportDirective && uriContent.startsWith(_DART_EXT_SCHEME)) {
-      return null;
-    }
-    try {
-      String encodedUriContent = Uri.encodeFull(uriContent);
-      parseUriWithException(encodedUriContent);
-      AnalysisContext analysisContext = context;
-      Source source = analysisContext.sourceFactory.resolveUri(librarySource, encodedUriContent);
-      if (!analysisContext.exists(source)) {
-        errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent]));
-      }
-      directive.source = source;
-      return source;
-    } on URISyntaxException catch (exception) {
-      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
-    }
-    return null;
-  }
-
-  /**
    * Efficiently convert the given set of sources to an array.
    *
    * @param sources the set to be converted
@@ -12377,17 +12387,17 @@
   /**
    * The source to be parsed.
    */
-  Source source;
+  final Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  int modificationTime = 0;
+  final int modificationTime;
 
   /**
    * The contents of the source.
    */
-  String _content;
+  final String _content;
 
   /**
    * The line information that was produced.
@@ -12427,11 +12437,7 @@
    * @param modificationTime the time at which the contents of the source were last modified
    * @param content the contents of the source
    */
-  ParseHtmlTask(InternalAnalysisContext context, Source source, int modificationTime, String content) : super(context) {
-    this.source = source;
-    this.modificationTime = modificationTime;
-    this._content = content;
-  }
+  ParseHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, this._content) : super(context);
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitParseHtmlTask(this);
@@ -12483,6 +12489,7 @@
       _lineInfo = new LineInfo(scanner.lineStarts);
       RecordingErrorListener errorListener = new RecordingErrorListener();
       _unit = new ht.HtmlParser(source, errorListener).parse(token, _lineInfo);
+      _unit.accept(new RecursiveXmlVisitor_ParseHtmlTask_internalPerform(this, errorListener));
       _errors = errorListener.getErrorsForSource(source);
       _referencedLibraries = librarySources;
     } on JavaException catch (exception) {
@@ -12503,6 +12510,39 @@
     }
     return new List.from(libraries);
   }
+
+  /**
+   * Resolves directives in the given [CompilationUnit].
+   */
+  void _resolveScriptDirectives(CompilationUnit script, AnalysisErrorListener errorListener) {
+    if (script == null) {
+      return;
+    }
+    AnalysisContext analysisContext = context;
+    for (Directive directive in script.directives) {
+      if (directive is ExportDirective) {
+        ParseDartTask.resolveSource(analysisContext, source, directive, errorListener);
+      } else if (directive is ImportDirective) {
+        ParseDartTask.resolveSource(analysisContext, source, directive, errorListener);
+      } else if (directive is PartDirective) {
+        ParseDartTask.resolveSource(analysisContext, source, directive, errorListener);
+      }
+    }
+  }
+}
+
+class RecursiveXmlVisitor_ParseHtmlTask_internalPerform extends ht.RecursiveXmlVisitor<Object> {
+  final ParseHtmlTask ParseHtmlTask_this;
+
+  RecordingErrorListener errorListener;
+
+  RecursiveXmlVisitor_ParseHtmlTask_internalPerform(this.ParseHtmlTask_this, this.errorListener) : super();
+
+  @override
+  Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) {
+    ParseHtmlTask_this._resolveScriptDirectives(node.script, errorListener);
+    return null;
+  }
 }
 
 class RecursiveXmlVisitor_ParseHtmlTask_getLibrarySources extends ht.RecursiveXmlVisitor<Object> {
@@ -12543,27 +12583,27 @@
   /**
    * The source to be resolved.
    */
-  Source source;
+  final Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  int modificationTime = 0;
+  final int modificationTime;
 
   /**
    * The HTML unit to be resolved.
    */
-  ht.HtmlUnit _unit;
+  final ht.HtmlUnit _unit;
 
   /**
    * The [AngularComponentElement] to resolve template for.
    */
-  AngularComponentElement _component;
+  final AngularComponentElement _component;
 
   /**
    * The Angular application to resolve in context of.
    */
-  AngularApplication _application;
+  final AngularApplication _application;
 
   /**
    * The [HtmlUnit] that was resolved by this task.
@@ -12585,13 +12625,7 @@
    * @param component the component that uses this HTML template, not `null`
    * @param application the Angular application to resolve in context of
    */
-  ResolveAngularComponentTemplateTask(InternalAnalysisContext context, Source source, int modificationTime, ht.HtmlUnit unit, AngularComponentElement component, AngularApplication application) : super(context) {
-    this.source = source;
-    this.modificationTime = modificationTime;
-    this._unit = unit;
-    this._component = component;
-    this._application = application;
-  }
+  ResolveAngularComponentTemplateTask(InternalAnalysisContext context, this.source, this.modificationTime, this._unit, this._component, this._application) : super(context);
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveAngularComponentTemplateTask(this);
@@ -12638,17 +12672,17 @@
   /**
    * The source to be resolved.
    */
-  Source source;
+  final Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  int modificationTime = 0;
+  final int modificationTime;
 
   /**
    * The HTML unit to be resolved.
    */
-  ht.HtmlUnit _unit;
+  final ht.HtmlUnit _unit;
 
   /**
    * The listener to record errors.
@@ -12678,11 +12712,7 @@
    * @param modificationTime the time at which the contents of the source were last modified
    * @param unit the HTML unit to be resolved
    */
-  ResolveAngularEntryHtmlTask(InternalAnalysisContext context, Source source, int modificationTime, ht.HtmlUnit unit) : super(context) {
-    this.source = source;
-    this.modificationTime = modificationTime;
-    this._unit = unit;
-  }
+  ResolveAngularEntryHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, this._unit) : super(context);
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveAngularEntryHtmlTask(this);
@@ -12751,17 +12781,17 @@
    * The source representing the file whose compilation unit is to be returned. TODO(brianwilkerson)
    * This should probably be removed, but is being left in for now to ease the transition.
    */
-  Source unitSource;
+  final Source unitSource;
 
   /**
    * The source representing the library to be resolved.
    */
-  Source librarySource;
+  final Source librarySource;
 
   /**
    * The libraries that are part of the cycle containing the library to be resolved.
    */
-  List<ResolvableLibrary> _librariesInCycle;
+  final List<ResolvableLibrary> _librariesInCycle;
 
   /**
    * The library resolver holding information about the libraries that were resolved.
@@ -12777,11 +12807,7 @@
    * @param librariesInCycle the libraries that are part of the cycle containing the library to be
    *          resolved
    */
-  ResolveDartLibraryCycleTask(InternalAnalysisContext context, Source unitSource, Source librarySource, List<ResolvableLibrary> librariesInCycle) : super(context) {
-    this.unitSource = unitSource;
-    this.librarySource = librarySource;
-    this._librariesInCycle = librariesInCycle;
-  }
+  ResolveDartLibraryCycleTask(InternalAnalysisContext context, this.unitSource, this.librarySource, this._librariesInCycle) : super(context);
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartLibraryCycleTask(this);
@@ -12815,12 +12841,12 @@
   /**
    * The source representing the file whose compilation unit is to be returned.
    */
-  Source unitSource;
+  final Source unitSource;
 
   /**
    * The source representing the library to be resolved.
    */
-  Source librarySource;
+  final Source librarySource;
 
   /**
    * The library resolver holding information about the libraries that were resolved.
@@ -12834,10 +12860,7 @@
    * @param unitSource the source representing the file whose compilation unit is to be returned
    * @param librarySource the source representing the library to be resolved
    */
-  ResolveDartLibraryTask(InternalAnalysisContext context, Source unitSource, Source librarySource) : super(context) {
-    this.unitSource = unitSource;
-    this.librarySource = librarySource;
-  }
+  ResolveDartLibraryTask(InternalAnalysisContext context, this.unitSource, this.librarySource) : super(context);
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartLibraryTask(this);
@@ -12872,12 +12895,12 @@
   /**
    * The source that is to be resolved.
    */
-  Source source;
+  final Source source;
 
   /**
    * The element model for the library containing the source.
    */
-  LibraryElement _libraryElement;
+  final LibraryElement _libraryElement;
 
   /**
    * The time at which the contents of the source were last modified.
@@ -12896,10 +12919,7 @@
    * @param source the source to be parsed
    * @param libraryElement the element model for the library containing the source
    */
-  ResolveDartUnitTask(InternalAnalysisContext context, Source source, LibraryElement libraryElement) : super(context) {
-    this.source = source;
-    this._libraryElement = libraryElement;
-  }
+  ResolveDartUnitTask(InternalAnalysisContext context, this.source, this._libraryElement) : super(context);
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartUnitTask(this);
@@ -13015,17 +13035,17 @@
   /**
    * The source to be resolved.
    */
-  Source source;
+  final Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  int modificationTime = 0;
+  final int modificationTime;
 
   /**
    * The HTML unit to be resolved.
    */
-  ht.HtmlUnit _unit;
+  final ht.HtmlUnit _unit;
 
   /**
    * The [HtmlUnit] that was resolved by this task.
@@ -13050,11 +13070,7 @@
    * @param modificationTime the time at which the contents of the source were last modified
    * @param unit the HTML unit to be resolved
    */
-  ResolveHtmlTask(InternalAnalysisContext context, Source source, int modificationTime, ht.HtmlUnit unit) : super(context) {
-    this.source = source;
-    this.modificationTime = modificationTime;
-    this._unit = unit;
-  }
+  ResolveHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, this._unit) : super(context);
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveHtmlTask(this);
@@ -13104,17 +13120,17 @@
   /**
    * The source to be scanned.
    */
-  Source source;
+  final Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  int modificationTime = 0;
+  final int modificationTime;
 
   /**
    * The contents of the source.
    */
-  String _content;
+  final String _content;
 
   /**
    * The token stream that was produced by scanning the source.
@@ -13139,11 +13155,7 @@
    * @param modificationTime the time at which the contents of the source were last modified
    * @param content the contents of the source
    */
-  ScanDartTask(InternalAnalysisContext context, Source source, int modificationTime, String content) : super(context) {
-    this.source = source;
-    this.modificationTime = modificationTime;
-    this._content = content;
-  }
+  ScanDartTask(InternalAnalysisContext context, this.source, this.modificationTime, this._content) : super(context);
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitScanDartTask(this);
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 9f10197..ace8cf6 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -22,35 +22,35 @@
    * The severity representing a non-error. This is never used for any error code, but is useful for
    * clients.
    */
-  static final ErrorSeverity NONE = new ErrorSeverity('NONE', 0, " ", "none");
+  static const ErrorSeverity NONE = const ErrorSeverity('NONE', 0, " ", "none");
 
   /**
    * The severity representing an informational level analysis issue.
    */
-  static final ErrorSeverity INFO = new ErrorSeverity('INFO', 1, "I", "info");
+  static const ErrorSeverity INFO = const ErrorSeverity('INFO', 1, "I", "info");
 
   /**
    * The severity representing a warning. Warnings can become errors if the `-Werror` command
    * line flag is specified.
    */
-  static final ErrorSeverity WARNING = new ErrorSeverity('WARNING', 2, "W", "warning");
+  static const ErrorSeverity WARNING = const ErrorSeverity('WARNING', 2, "W", "warning");
 
   /**
    * The severity representing an error.
    */
-  static final ErrorSeverity ERROR = new ErrorSeverity('ERROR', 3, "E", "error");
+  static const ErrorSeverity ERROR = const ErrorSeverity('ERROR', 3, "E", "error");
 
-  static final List<ErrorSeverity> values = [NONE, INFO, WARNING, ERROR];
+  static const List<ErrorSeverity> values = const [NONE, INFO, WARNING, ERROR];
 
   /**
    * The name of the severity used when producing machine output.
    */
-  String machineCode;
+  final String machineCode;
 
   /**
    * The name of the severity used when producing readable output.
    */
-  String displayName;
+  final String displayName;
 
   /**
    * Initialize a newly created severity with the given names.
@@ -58,10 +58,7 @@
    * @param machineCode the name of the severity used when producing machine output
    * @param displayName the name of the severity used when producing readable output
    */
-  ErrorSeverity(String name, int ordinal, String machineCode, String displayName) : super(name, ordinal) {
-    this.machineCode = machineCode;
-    this.displayName = displayName;
-  }
+  const ErrorSeverity(String name, int ordinal, this.machineCode, this.displayName) : super(name, ordinal);
 
   /**
    * Return the severity constant that represents the greatest severity.
@@ -144,35 +141,35 @@
  * The enumeration `AngularCode` defines Angular specific problems.
  */
 class AngularCode extends Enum<AngularCode> implements ErrorCode {
-  static final AngularCode CANNOT_PARSE_SELECTOR = new AngularCode.con1('CANNOT_PARSE_SELECTOR', 0, "The selector '%s' cannot be parsed");
+  static const AngularCode CANNOT_PARSE_SELECTOR = const AngularCode('CANNOT_PARSE_SELECTOR', 0, "The selector '%s' cannot be parsed");
 
-  static final AngularCode INVALID_PROPERTY_KIND = new AngularCode.con2('INVALID_PROPERTY_KIND', 1, "Unknown property binding kind '%s', use one of the '@', '=>', '=>!' or '<=>'", ErrorSeverity.ERROR);
+  static const AngularCode INVALID_PROPERTY_KIND = const AngularCode('INVALID_PROPERTY_KIND', 1, "Unknown property binding kind '%s', use one of the '@', '=>', '=>!' or '<=>'");
 
-  static final AngularCode INVALID_PROPERTY_FIELD = new AngularCode.con1('INVALID_PROPERTY_FIELD', 2, "Unknown property field '%s'");
+  static const AngularCode INVALID_PROPERTY_FIELD = const AngularCode('INVALID_PROPERTY_FIELD', 2, "Unknown property field '%s'");
 
-  static final AngularCode INVALID_PROPERTY_MAP = new AngularCode.con1('INVALID_PROPERTY_MAP', 3, "Argument 'map' must be a constant map literal");
+  static const AngularCode INVALID_PROPERTY_MAP = const AngularCode('INVALID_PROPERTY_MAP', 3, "Argument 'map' must be a constant map literal");
 
-  static final AngularCode INVALID_PROPERTY_NAME = new AngularCode.con1('INVALID_PROPERTY_NAME', 4, "Property name must be a string literal");
+  static const AngularCode INVALID_PROPERTY_NAME = const AngularCode('INVALID_PROPERTY_NAME', 4, "Property name must be a string literal");
 
-  static final AngularCode INVALID_PROPERTY_SPEC = new AngularCode.con1('INVALID_PROPERTY_SPEC', 5, "Property binding specification must be a string literal");
+  static const AngularCode INVALID_PROPERTY_SPEC = const AngularCode('INVALID_PROPERTY_SPEC', 5, "Property binding specification must be a string literal");
 
-  static final AngularCode INVALID_REPEAT_SYNTAX = new AngularCode.con1('INVALID_REPEAT_SYNTAX', 6, "Expected statement in form '_item_ in _collection_ [tracked by _id_]'");
+  static const AngularCode INVALID_REPEAT_SYNTAX = const AngularCode('INVALID_REPEAT_SYNTAX', 6, "Expected statement in form '_item_ in _collection_ [tracked by _id_]'");
 
-  static final AngularCode INVALID_REPEAT_ITEM_SYNTAX = new AngularCode.con1('INVALID_REPEAT_ITEM_SYNTAX', 7, "Item must by identifier or in '(_key_, _value_)' pair.");
+  static const AngularCode INVALID_REPEAT_ITEM_SYNTAX = const AngularCode('INVALID_REPEAT_ITEM_SYNTAX', 7, "Item must by identifier or in '(_key_, _value_)' pair.");
 
-  static final AngularCode INVALID_URI = new AngularCode.con2('INVALID_URI', 8, "Invalid URI syntax: '%s'", ErrorSeverity.ERROR);
+  static const AngularCode INVALID_URI = const AngularCode('INVALID_URI', 8, "Invalid URI syntax: '%s'");
 
-  static final AngularCode MISSING_FILTER_COLON = new AngularCode.con1('MISSING_FILTER_COLON', 9, "Missing ':' before filter argument");
+  static const AngularCode MISSING_FILTER_COLON = const AngularCode('MISSING_FILTER_COLON', 9, "Missing ':' before filter argument");
 
-  static final AngularCode MISSING_NAME = new AngularCode.con1('MISSING_NAME', 10, "Argument 'name' must be provided");
+  static const AngularCode MISSING_NAME = const AngularCode('MISSING_NAME', 10, "Argument 'name' must be provided");
 
-  static final AngularCode MISSING_PUBLISH_AS = new AngularCode.con1('MISSING_PUBLISH_AS', 11, "Argument 'publishAs' must be provided");
+  static const AngularCode MISSING_PUBLISH_AS = const AngularCode('MISSING_PUBLISH_AS', 11, "Argument 'publishAs' must be provided");
 
-  static final AngularCode MISSING_SELECTOR = new AngularCode.con1('MISSING_SELECTOR', 12, "Argument 'selector' must be provided");
+  static const AngularCode MISSING_SELECTOR = const AngularCode('MISSING_SELECTOR', 12, "Argument 'selector' must be provided");
 
-  static final AngularCode URI_DOES_NOT_EXIST = new AngularCode.con1('URI_DOES_NOT_EXIST', 13, "Target of URI does not exist: '%s'");
+  static const AngularCode URI_DOES_NOT_EXIST = const AngularCode('URI_DOES_NOT_EXIST', 13, "Target of URI does not exist: '%s'");
 
-  static final List<AngularCode> values = [
+  static const List<AngularCode> values = const [
       CANNOT_PARSE_SELECTOR,
       INVALID_PROPERTY_KIND,
       INVALID_PROPERTY_FIELD,
@@ -191,39 +188,20 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  String _message;
-
-  /**
-   * The severity of the problem.
-   */
-  ErrorSeverity _severity;
+  final String message;
 
   /**
    * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  AngularCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, ErrorSeverity.WARNING);
-
-  /**
-   * Initialize a newly created error code to have the given message.
-   *
-   * @param message the message template used to create the message to be displayed for the error
-   * @param severity the severity of the problem
-   */
-  AngularCode.con2(String name, int ordinal, String message, ErrorSeverity severity) : super(name, ordinal) {
-    this._message = message;
-    this._severity = ErrorSeverity.INFO;
-  }
+  const AngularCode(String name, int ordinal, this.message) : super(name, ordinal);
 
   @override
   String get correction => null;
 
   @override
-  ErrorSeverity get errorSeverity => _severity;
-
-  @override
-  String get message => _message;
+  ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
 
   @override
   ErrorType get type => ErrorType.ANGULAR;
@@ -237,12 +215,12 @@
   /**
    * The error listener to which errors will be reported.
    */
-  AnalysisErrorListener _errorListener;
+  final AnalysisErrorListener _errorListener;
 
   /**
    * The default source to be used when reporting errors.
    */
-  Source _defaultSource;
+  final Source _defaultSource;
 
   /**
    * The source to be used when reporting errors.
@@ -255,15 +233,13 @@
    * @param errorListener the error listener to which errors will be reported
    * @param defaultSource the default source to be used when reporting errors
    */
-  ErrorReporter(AnalysisErrorListener errorListener, Source defaultSource) {
-    if (errorListener == null) {
+  ErrorReporter(this._errorListener, this._defaultSource) {
+    if (_errorListener == null) {
       throw new IllegalArgumentException("An error listener must be provided");
-    } else if (defaultSource == null) {
+    } else if (_defaultSource == null) {
       throw new IllegalArgumentException("A default source must be provided");
     }
-    this._errorListener = errorListener;
-    this._defaultSource = defaultSource;
-    this._source = defaultSource;
+    this._source = _defaultSource;
   }
 
   /**
@@ -379,7 +355,7 @@
   /**
    * The error code associated with the error.
    */
-  ErrorCode errorCode;
+  final ErrorCode errorCode;
 
   /**
    * The localized error message.
@@ -422,9 +398,7 @@
    * @param errorCode the error code to be associated with this error
    * @param arguments the arguments used to build the error message
    */
-  AnalysisError.con1(Source source, ErrorCode errorCode, List<Object> arguments) {
-    this.source = source;
-    this.errorCode = errorCode;
+  AnalysisError.con1(this.source, this.errorCode, List<Object> arguments) {
     this._message = JavaString.format(errorCode.message, arguments);
   }
 
@@ -437,11 +411,9 @@
    * @param errorCode the error code to be associated with this error
    * @param arguments the arguments used to build the error message
    */
-  AnalysisError.con2(Source source, int offset, int length, ErrorCode errorCode, List<Object> arguments) {
-    this.source = source;
+  AnalysisError.con2(this.source, int offset, int length, this.errorCode, List<Object> arguments) {
     this._offset = offset;
     this._length = length;
-    this.errorCode = errorCode;
     this._message = JavaString.format(errorCode.message, arguments);
     String correctionTemplate = errorCode.correction;
     if (correctionTemplate != null) {
@@ -460,7 +432,7 @@
     }
     AnalysisError other = obj as AnalysisError;
     // Quick checks.
-    if (errorCode != other.errorCode) {
+    if (!identical(errorCode, other.errorCode)) {
       return false;
     }
     if (_offset != other._offset || _length != other._length) {
@@ -553,11 +525,11 @@
    * A property whose value is an array of [ExecutableElement] that should
    * be but are not implemented by a concrete class.
    */
-  static final ErrorProperty UNIMPLEMENTED_METHODS = new ErrorProperty('UNIMPLEMENTED_METHODS', 0);
+  static const ErrorProperty UNIMPLEMENTED_METHODS = const ErrorProperty('UNIMPLEMENTED_METHODS', 0);
 
-  static final List<ErrorProperty> values = [UNIMPLEMENTED_METHODS];
+  static const List<ErrorProperty> values = const [UNIMPLEMENTED_METHODS];
 
-  ErrorProperty(String name, int ordinal) : super(name, ordinal);
+  const ErrorProperty(String name, int ordinal) : super(name, ordinal);
 }
 
 /**
@@ -567,9 +539,9 @@
   /**
    * The single enum of TodoCode.
    */
-  static final TodoCode TODO = new TodoCode('TODO', 0);
+  static const TodoCode TODO = const TodoCode('TODO', 0);
 
-  static final List<TodoCode> values = [TODO];
+  static const List<TodoCode> values = const [TODO];
 
   /**
    * This matches the two common Dart task styles
@@ -586,7 +558,7 @@
    */
   static RegExp TODO_REGEX = new RegExp("([\\s/\\*])((TODO[^\\w\\d][^\\r\\n]*)|(TODO:?\$))");
 
-  TodoCode(String name, int ordinal) : super(name, ordinal);
+  const TodoCode(String name, int ordinal) : super(name, ordinal);
 
   @override
   String get correction => null;
@@ -615,19 +587,19 @@
    * @param expectedType the name of the expected type
    * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
    */
-  static final HintCode ARGUMENT_TYPE_NOT_ASSIGNABLE = new HintCode.con1('ARGUMENT_TYPE_NOT_ASSIGNABLE', 0, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message);
+  static const HintCode ARGUMENT_TYPE_NOT_ASSIGNABLE = const HintCode.con1('ARGUMENT_TYPE_NOT_ASSIGNABLE', 0, "The argument type '%s' cannot be assigned to the parameter type '%s'");
 
   /**
    * Dead code is code that is never reached, this can happen for instance if a statement follows a
    * return statement.
    */
-  static final HintCode DEAD_CODE = new HintCode.con1('DEAD_CODE', 1, "Dead code");
+  static const HintCode DEAD_CODE = const HintCode.con1('DEAD_CODE', 1, "Dead code");
 
   /**
    * Dead code is code that is never reached. This case covers cases where the user has catch
    * clauses after `catch (e)` or `on Object catch (e)`.
    */
-  static final HintCode DEAD_CODE_CATCH_FOLLOWING_CATCH = new HintCode.con1('DEAD_CODE_CATCH_FOLLOWING_CATCH', 2, "Dead code, catch clauses after a 'catch (e)' or an 'on Object catch (e)' are never reached");
+  static const HintCode DEAD_CODE_CATCH_FOLLOWING_CATCH = const HintCode.con1('DEAD_CODE_CATCH_FOLLOWING_CATCH', 2, "Dead code, catch clauses after a 'catch (e)' or an 'on Object catch (e)' are never reached");
 
   /**
    * Dead code is code that is never reached. This case covers cases where the user has an on-catch
@@ -636,44 +608,44 @@
    * @param subtypeName name of the subtype
    * @param supertypeName name of the supertype
    */
-  static final HintCode DEAD_CODE_ON_CATCH_SUBTYPE = new HintCode.con1('DEAD_CODE_ON_CATCH_SUBTYPE', 3, "Dead code, this on-catch block will never be executed since '%s' is a subtype of '%s'");
+  static const HintCode DEAD_CODE_ON_CATCH_SUBTYPE = const HintCode.con1('DEAD_CODE_ON_CATCH_SUBTYPE', 3, "Dead code, this on-catch block will never be executed since '%s' is a subtype of '%s'");
 
   /**
    * Deprecated members should not be invoked or used.
    *
    * @param memberName the name of the member
    */
-  static final HintCode DEPRECATED_MEMBER_USE = new HintCode.con1('DEPRECATED_MEMBER_USE', 4, "'%s' is deprecated");
+  static const HintCode DEPRECATED_MEMBER_USE = const HintCode.con1('DEPRECATED_MEMBER_USE', 4, "'%s' is deprecated");
 
   /**
    * Duplicate imports.
    */
-  static final HintCode DUPLICATE_IMPORT = new HintCode.con1('DUPLICATE_IMPORT', 5, "Duplicate import");
+  static const HintCode DUPLICATE_IMPORT = const HintCode.con1('DUPLICATE_IMPORT', 5, "Duplicate import");
 
   /**
    * Hint to use the ~/ operator.
    */
-  static final HintCode DIVISION_OPTIMIZATION = new HintCode.con1('DIVISION_OPTIMIZATION', 6, "The operator x ~/ y is more efficient than (x / y).toInt()");
+  static const HintCode DIVISION_OPTIMIZATION = const HintCode.con1('DIVISION_OPTIMIZATION', 6, "The operator x ~/ y is more efficient than (x / y).toInt()");
 
   /**
    * Hint for the `x is double` type checks.
    */
-  static final HintCode IS_DOUBLE = new HintCode.con1('IS_DOUBLE', 7, "When compiled to JS, this test might return true when the left hand side is an int");
+  static const HintCode IS_DOUBLE = const HintCode.con1('IS_DOUBLE', 7, "When compiled to JS, this test might return true when the left hand side is an int");
 
   /**
    * Hint for the `x is int` type checks.
    */
-  static final HintCode IS_INT = new HintCode.con1('IS_INT', 8, "When compiled to JS, this test might return true when the left hand side is a double");
+  static const HintCode IS_INT = const HintCode.con1('IS_INT', 8, "When compiled to JS, this test might return true when the left hand side is a double");
 
   /**
    * Hint for the `x is! double` type checks.
    */
-  static final HintCode IS_NOT_DOUBLE = new HintCode.con1('IS_NOT_DOUBLE', 9, "When compiled to JS, this test might return false when the left hand side is an int");
+  static const HintCode IS_NOT_DOUBLE = const HintCode.con1('IS_NOT_DOUBLE', 9, "When compiled to JS, this test might return false when the left hand side is an int");
 
   /**
    * Hint for the `x is! int` type checks.
    */
-  static final HintCode IS_NOT_INT = new HintCode.con1('IS_NOT_INT', 10, "When compiled to JS, this test might return false when the left hand side is a double");
+  static const HintCode IS_NOT_INT = const HintCode.con1('IS_NOT_INT', 10, "When compiled to JS, this test might return false when the left hand side is a double");
 
   /**
    * Generate a hint for methods or functions that have a return type, but do not have a non-void
@@ -682,22 +654,22 @@
    *
    * @param returnType the name of the declared return type
    */
-  static final HintCode MISSING_RETURN = new HintCode.con2('MISSING_RETURN', 11, "This function declares a return type of '%s', but does not end with a return statement", "Either add a return statement or change the return type to 'void'");
+  static const HintCode MISSING_RETURN = const HintCode.con2('MISSING_RETURN', 11, "This function declares a return type of '%s', but does not end with a return statement", "Either add a return statement or change the return type to 'void'");
 
   /**
    * A getter with the override annotation does not override an existing getter.
    */
-  static final HintCode OVERRIDE_ON_NON_OVERRIDING_GETTER = new HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_GETTER', 12, "Getter does not override an inherited getter");
+  static const HintCode OVERRIDE_ON_NON_OVERRIDING_GETTER = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_GETTER', 12, "Getter does not override an inherited getter");
 
   /**
    * A method with the override annotation does not override an existing method.
    */
-  static final HintCode OVERRIDE_ON_NON_OVERRIDING_METHOD = new HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_METHOD', 13, "Method does not override an inherited method");
+  static const HintCode OVERRIDE_ON_NON_OVERRIDING_METHOD = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_METHOD', 13, "Method does not override an inherited method");
 
   /**
    * A setter with the override annotation does not override an existing setter.
    */
-  static final HintCode OVERRIDE_ON_NON_OVERRIDING_SETTER = new HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_SETTER', 14, "Setter does not override an inherited setter");
+  static const HintCode OVERRIDE_ON_NON_OVERRIDING_SETTER = const HintCode.con1('OVERRIDE_ON_NON_OVERRIDING_SETTER', 14, "Setter does not override an inherited setter");
 
   /**
    * It is not in best practice to declare a private method that happens to override the method in a
@@ -708,24 +680,24 @@
    * @param memberName some private member name
    * @param className the class name where the member is overriding the functionality
    */
-  static final HintCode OVERRIDDING_PRIVATE_MEMBER = new HintCode.con1('OVERRIDDING_PRIVATE_MEMBER', 15, "The %s '%s' does not override the definition from '%s' because it is private and in a different library");
+  static const HintCode OVERRIDDING_PRIVATE_MEMBER = const HintCode.con1('OVERRIDDING_PRIVATE_MEMBER', 15, "The %s '%s' does not override the definition from '%s' because it is private and in a different library");
 
   /**
    * Hint for classes that override equals, but not hashCode.
    *
    * @param className the name of the current class
    */
-  static final HintCode OVERRIDE_EQUALS_BUT_NOT_HASH_CODE = new HintCode.con1('OVERRIDE_EQUALS_BUT_NOT_HASH_CODE', 16, "The class '%s' overrides 'operator==', but not 'get hashCode'");
+  static const HintCode OVERRIDE_EQUALS_BUT_NOT_HASH_CODE = const HintCode.con1('OVERRIDE_EQUALS_BUT_NOT_HASH_CODE', 16, "The class '%s' overrides 'operator==', but not 'get hashCode'");
 
   /**
    * Type checks of the type `x is! Null` should be done with `x != null`.
    */
-  static final HintCode TYPE_CHECK_IS_NOT_NULL = new HintCode.con1('TYPE_CHECK_IS_NOT_NULL', 17, "Tests for non-null should be done with '!= null'");
+  static const HintCode TYPE_CHECK_IS_NOT_NULL = const HintCode.con1('TYPE_CHECK_IS_NOT_NULL', 17, "Tests for non-null should be done with '!= null'");
 
   /**
    * Type checks of the type `x is Null` should be done with `x == null`.
    */
-  static final HintCode TYPE_CHECK_IS_NULL = new HintCode.con1('TYPE_CHECK_IS_NULL', 18, "Tests for null should be done with '== null'");
+  static const HintCode TYPE_CHECK_IS_NULL = const HintCode.con1('TYPE_CHECK_IS_NULL', 18, "Tests for null should be done with '== null'");
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_GETTER] or
@@ -737,7 +709,7 @@
    * @see StaticTypeWarningCode#UNDEFINED_GETTER
    * @see StaticWarningCode#UNDEFINED_GETTER
    */
-  static final HintCode UNDEFINED_GETTER = new HintCode.con1('UNDEFINED_GETTER', 19, StaticTypeWarningCode.UNDEFINED_GETTER.message);
+  static const HintCode UNDEFINED_GETTER = const HintCode.con1('UNDEFINED_GETTER', 19, "There is no such getter '%s' in '%s'");
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_METHOD] would
@@ -747,7 +719,7 @@
    * @param typeName the resolved type name that the method lookup is happening on
    * @see StaticTypeWarningCode#UNDEFINED_METHOD
    */
-  static final HintCode UNDEFINED_METHOD = new HintCode.con1('UNDEFINED_METHOD', 20, StaticTypeWarningCode.UNDEFINED_METHOD.message);
+  static const HintCode UNDEFINED_METHOD = const HintCode.con1('UNDEFINED_METHOD', 20, "The method '%s' is not defined for the class '%s'");
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_OPERATOR]
@@ -757,7 +729,7 @@
    * @param enclosingType the name of the enclosing type where the operator is being looked for
    * @see StaticTypeWarningCode#UNDEFINED_OPERATOR
    */
-  static final HintCode UNDEFINED_OPERATOR = new HintCode.con1('UNDEFINED_OPERATOR', 21, StaticTypeWarningCode.UNDEFINED_OPERATOR.message);
+  static const HintCode UNDEFINED_OPERATOR = const HintCode.con1('UNDEFINED_OPERATOR', 21, "There is no such operator '%s' in '%s'");
 
   /**
    * This hint is generated anywhere where the [StaticTypeWarningCode#UNDEFINED_SETTER] or
@@ -769,27 +741,27 @@
    * @see StaticTypeWarningCode#UNDEFINED_SETTER
    * @see StaticWarningCode#UNDEFINED_SETTER
    */
-  static final HintCode UNDEFINED_SETTER = new HintCode.con1('UNDEFINED_SETTER', 22, StaticTypeWarningCode.UNDEFINED_SETTER.message);
+  static const HintCode UNDEFINED_SETTER = const HintCode.con1('UNDEFINED_SETTER', 22, "There is no such setter '%s' in '%s'");
 
   /**
    * Unnecessary cast.
    */
-  static final HintCode UNNECESSARY_CAST = new HintCode.con1('UNNECESSARY_CAST', 23, "Unnecessary cast");
+  static const HintCode UNNECESSARY_CAST = const HintCode.con1('UNNECESSARY_CAST', 23, "Unnecessary cast");
 
   /**
    * Unnecessary type checks, the result is always true.
    */
-  static final HintCode UNNECESSARY_TYPE_CHECK_FALSE = new HintCode.con1('UNNECESSARY_TYPE_CHECK_FALSE', 24, "Unnecessary type check, the result is always false");
+  static const HintCode UNNECESSARY_TYPE_CHECK_FALSE = const HintCode.con1('UNNECESSARY_TYPE_CHECK_FALSE', 24, "Unnecessary type check, the result is always false");
 
   /**
    * Unnecessary type checks, the result is always false.
    */
-  static final HintCode UNNECESSARY_TYPE_CHECK_TRUE = new HintCode.con1('UNNECESSARY_TYPE_CHECK_TRUE', 25, "Unnecessary type check, the result is always true");
+  static const HintCode UNNECESSARY_TYPE_CHECK_TRUE = const HintCode.con1('UNNECESSARY_TYPE_CHECK_TRUE', 25, "Unnecessary type check, the result is always true");
 
   /**
    * Unused imports are imports which are never not used.
    */
-  static final HintCode UNUSED_IMPORT = new HintCode.con1('UNUSED_IMPORT', 26, "Unused import");
+  static const HintCode UNUSED_IMPORT = const HintCode.con1('UNUSED_IMPORT', 26, "Unused import");
 
   /**
    * Hint for cases where the source expects a method or function to return a non-void result, but
@@ -797,9 +769,9 @@
    *
    * @param name the name of the method or function that returns void
    */
-  static final HintCode USE_OF_VOID_RESULT = new HintCode.con1('USE_OF_VOID_RESULT', 27, "The result of '%s' is being used, even though it is declared to be 'void'");
+  static const HintCode USE_OF_VOID_RESULT = const HintCode.con1('USE_OF_VOID_RESULT', 27, "The result of '%s' is being used, even though it is declared to be 'void'");
 
-  static final List<HintCode> values = [
+  static const List<HintCode> values = const [
       ARGUMENT_TYPE_NOT_ASSIGNABLE,
       DEAD_CODE,
       DEAD_CODE_CATCH_FOLLOWING_CATCH,
@@ -832,22 +804,20 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  String message;
+  final String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
    * there is no correction information for this error.
    */
-  String correction3;
+  final String correction;
 
   /**
    * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  HintCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
-    this.message = message;
-  }
+  const HintCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -855,13 +825,7 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  HintCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
-    this.message = message;
-    this.correction3 = correction;
-  }
-
-  @override
-  String get correction => correction3;
+  const HintCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
 
   @override
   ErrorSeverity get errorSeverity => ErrorType.HINT.severity;
@@ -918,49 +882,49 @@
   /**
    * Task (todo) comments in user code.
    */
-  static final ErrorType TODO = new ErrorType('TODO', 0, ErrorSeverity.INFO);
+  static const ErrorType TODO = const ErrorType('TODO', 0, ErrorSeverity.INFO);
 
   /**
    * Extra analysis run over the code to follow best practices, which are not in the Dart Language
    * Specification.
    */
-  static final ErrorType HINT = new ErrorType('HINT', 1, ErrorSeverity.INFO);
+  static const ErrorType HINT = const ErrorType('HINT', 1, ErrorSeverity.INFO);
 
   /**
    * Compile-time errors are errors that preclude execution. A compile time error must be reported
    * by a Dart compiler before the erroneous code is executed.
    */
-  static final ErrorType COMPILE_TIME_ERROR = new ErrorType('COMPILE_TIME_ERROR', 2, ErrorSeverity.ERROR);
+  static const ErrorType COMPILE_TIME_ERROR = const ErrorType('COMPILE_TIME_ERROR', 2, ErrorSeverity.ERROR);
 
   /**
    * Suggestions made in situations where the user has deviated from recommended pub programming
    * practices.
    */
-  static final ErrorType PUB_SUGGESTION = new ErrorType('PUB_SUGGESTION', 3, ErrorSeverity.WARNING);
+  static const ErrorType PUB_SUGGESTION = const ErrorType('PUB_SUGGESTION', 3, ErrorSeverity.WARNING);
 
   /**
    * Static warnings are those warnings reported by the static checker. They have no effect on
    * execution. Static warnings must be provided by Dart compilers used during development.
    */
-  static final ErrorType STATIC_WARNING = new ErrorType('STATIC_WARNING', 4, ErrorSeverity.WARNING);
+  static const ErrorType STATIC_WARNING = const ErrorType('STATIC_WARNING', 4, ErrorSeverity.WARNING);
 
   /**
    * Many, but not all, static warnings relate to types, in which case they are known as static type
    * warnings.
    */
-  static final ErrorType STATIC_TYPE_WARNING = new ErrorType('STATIC_TYPE_WARNING', 5, ErrorSeverity.WARNING);
+  static const ErrorType STATIC_TYPE_WARNING = const ErrorType('STATIC_TYPE_WARNING', 5, ErrorSeverity.WARNING);
 
   /**
    * Syntactic errors are errors produced as a result of input that does not conform to the grammar.
    */
-  static final ErrorType SYNTACTIC_ERROR = new ErrorType('SYNTACTIC_ERROR', 6, ErrorSeverity.ERROR);
+  static const ErrorType SYNTACTIC_ERROR = const ErrorType('SYNTACTIC_ERROR', 6, ErrorSeverity.ERROR);
 
   /**
    * Angular specific semantic problems.
    */
-  static final ErrorType ANGULAR = new ErrorType('ANGULAR', 7, ErrorSeverity.INFO);
+  static const ErrorType ANGULAR = const ErrorType('ANGULAR', 7, ErrorSeverity.INFO);
 
-  static final List<ErrorType> values = [
+  static const List<ErrorType> values = const [
       TODO,
       HINT,
       COMPILE_TIME_ERROR,
@@ -973,16 +937,14 @@
   /**
    * The severity of this type of error.
    */
-  ErrorSeverity severity;
+  final ErrorSeverity severity;
 
   /**
    * Initialize a newly created error type to have the given severity.
    *
    * @param severity the severity of this type of error
    */
-  ErrorType(String name, int ordinal, ErrorSeverity severity) : super(name, ordinal) {
-    this.severity = severity;
-  }
+  const ErrorType(String name, int ordinal, this.severity) : super(name, ordinal);
 
   String get displayName => name.toLowerCase().replaceAll('_', ' ');
 }
@@ -1003,7 +965,7 @@
    * @param firstLibraryName the name of the first library that the type is found
    * @param secondLibraryName the name of the second library that the type is found
    */
-  static final CompileTimeErrorCode AMBIGUOUS_EXPORT = new CompileTimeErrorCode.con1('AMBIGUOUS_EXPORT', 0, "The element '%s' is defined in the libraries '%s' and '%s'");
+  static const CompileTimeErrorCode AMBIGUOUS_EXPORT = const CompileTimeErrorCode.con1('AMBIGUOUS_EXPORT', 0, "The element '%s' is defined in the libraries '%s' and '%s'");
 
   /**
    * 12.33 Argument Definition Test: It is a compile time error if <i>v</i> does not denote a formal
@@ -1011,57 +973,57 @@
    *
    * @param the name of the identifier in the argument definition test that is not a parameter
    */
-  static final CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER = new CompileTimeErrorCode.con1('ARGUMENT_DEFINITION_TEST_NON_PARAMETER', 1, "'%s' is not a parameter");
+  static const CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER = const CompileTimeErrorCode.con1('ARGUMENT_DEFINITION_TEST_NON_PARAMETER', 1, "'%s' is not a parameter");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error to use a built-in identifier other than
    * dynamic as a type annotation.
    */
-  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE = new CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE', 2, "The built-in identifier '%s' cannot be as a type");
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE', 2, "The built-in identifier '%s' cannot be as a type");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_NAME = new CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_NAME', 3, "The built-in identifier '%s' cannot be used as a type name");
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_NAME', 3, "The built-in identifier '%s' cannot be used as a type name");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME = new CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME', 4, "The built-in identifier '%s' cannot be used as a type alias name");
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME', 4, "The built-in identifier '%s' cannot be used as a type alias name");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static final CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME = new CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME', 5, "The built-in identifier '%s' cannot be used as a type parameter name");
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME', 5, "The built-in identifier '%s' cannot be used as a type parameter name");
 
   /**
    * 13.9 Switch: It is a compile-time error if the class <i>C</i> implements the operator
    * <i>==</i>.
    */
-  static final CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = new CompileTimeErrorCode.con1('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 6, "The switch case expression type '%s' cannot override the == operator");
+  static const CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 6, "The switch case expression type '%s' cannot override the == operator");
 
   /**
    * 12.1 Constants: It is a compile-time error if evaluation of a compile-time constant would raise
    * an exception.
    */
-  static final CompileTimeErrorCode COMPILE_TIME_CONSTANT_RAISES_EXCEPTION = new CompileTimeErrorCode.con1('COMPILE_TIME_CONSTANT_RAISES_EXCEPTION', 7, "");
+  static const CompileTimeErrorCode COMPILE_TIME_CONSTANT_RAISES_EXCEPTION = const CompileTimeErrorCode.con1('COMPILE_TIME_CONSTANT_RAISES_EXCEPTION', 7, "");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
    * name. This restriction holds regardless of whether the getter is defined explicitly or
    * implicitly, or whether the getter or the method are inherited or not.
    */
-  static final CompileTimeErrorCode CONFLICTING_GETTER_AND_METHOD = new CompileTimeErrorCode.con1('CONFLICTING_GETTER_AND_METHOD', 8, "Class '%s' cannot have both getter '%s.%s' and method with the same name");
+  static const CompileTimeErrorCode CONFLICTING_GETTER_AND_METHOD = const CompileTimeErrorCode.con1('CONFLICTING_GETTER_AND_METHOD', 8, "Class '%s' cannot have both getter '%s.%s' and method with the same name");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
    * name. This restriction holds regardless of whether the getter is defined explicitly or
    * implicitly, or whether the getter or the method are inherited or not.
    */
-  static final CompileTimeErrorCode CONFLICTING_METHOD_AND_GETTER = new CompileTimeErrorCode.con1('CONFLICTING_METHOD_AND_GETTER', 9, "Class '%s' cannot have both method '%s.%s' and getter with the same name");
+  static const CompileTimeErrorCode CONFLICTING_METHOD_AND_GETTER = const CompileTimeErrorCode.con1('CONFLICTING_METHOD_AND_GETTER', 9, "Class '%s' cannot have both method '%s.%s' and getter with the same name");
 
   /**
    * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
@@ -1069,7 +1031,7 @@
    * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
    * class.
    */
-  static final CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD = new CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD', 10, "'%s' cannot be used to name a constructor and a field in this class");
+  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD = const CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD', 10, "'%s' cannot be used to name a constructor and a field in this class");
 
   /**
    * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
@@ -1077,32 +1039,32 @@
    * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
    * class.
    */
-  static final CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD = new CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD', 11, "'%s' cannot be used to name a constructor and a method in this class");
+  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD = const CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD', 11, "'%s' cannot be used to name a constructor and a method in this class");
 
   /**
    * 7. Classes: It is a compile time error if a generic class declares a type variable with the
    * same name as the class or any of its members or constructors.
    */
-  static final CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_CLASS = new CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_CLASS', 12, "'%s' cannot be used to name a type varaible in a class with the same name");
+  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_CLASS = const CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_CLASS', 12, "'%s' cannot be used to name a type varaible in a class with the same name");
 
   /**
    * 7. Classes: It is a compile time error if a generic class declares a type variable with the
    * same name as the class or any of its members or constructors.
    */
-  static final CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_MEMBER = new CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_MEMBER', 13, "'%s' cannot be used to name a type varaible and member in this class");
+  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_MEMBER = const CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_MEMBER', 13, "'%s' cannot be used to name a type varaible and member in this class");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static final CompileTimeErrorCode CONST_CONSTRUCTOR_THROWS_EXCEPTION = new CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_THROWS_EXCEPTION', 14, "'const' constructors cannot throw exceptions");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_THROWS_EXCEPTION', 14, "'const' constructors cannot throw exceptions");
 
   /**
    * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly or implicitly, in
    * the initializer list of a constant constructor must specify a constant constructor of the
    * superclass of the immediately enclosing class or a compile-time error occurs.
    */
-  static final CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER = new CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER', 15, "Constant constructor cannot call non-constant super constructor");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER', 15, "Constant constructor cannot call non-constant super constructor");
 
   /**
    * 7.6.3 Constant Constructors: It is a compile-time error if a constant constructor is declared
@@ -1110,7 +1072,7 @@
    *
    * The above refers to both locally declared and inherited instance variables.
    */
-  static final CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = new CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 16, "Cannot define the 'const' constructor for a class with non-final fields");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 16, "Cannot define the 'const' constructor for a class with non-final fields");
 
   /**
    * 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error if o is not
@@ -1123,32 +1085,32 @@
    * @param initializerType the name of the type of the initializer expression
    * @param fieldType the name of the type of the field
    */
-  static final CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = new CompileTimeErrorCode.con1('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 17, "The initializer type '%s' cannot be assigned to the field type '%s'");
+  static const CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 17, "The initializer type '%s' cannot be assigned to the field type '%s'");
 
   /**
    * 6.2 Formal Parameters: It is a compile-time error if a formal parameter is declared as a
    * constant variable.
    */
-  static final CompileTimeErrorCode CONST_FORMAL_PARAMETER = new CompileTimeErrorCode.con1('CONST_FORMAL_PARAMETER', 18, "Parameters cannot be 'const'");
+  static const CompileTimeErrorCode CONST_FORMAL_PARAMETER = const CompileTimeErrorCode.con1('CONST_FORMAL_PARAMETER', 18, "Parameters cannot be 'const'");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant or a
    * compile-time error occurs.
    */
-  static final CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = new CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 19, "'const' variables must be constant value");
+  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 19, "'const' variables must be constant value");
 
   /**
    * 7.5 Instance Variables: It is a compile-time error if an instance variable is declared to be
    * constant.
    */
-  static final CompileTimeErrorCode CONST_INSTANCE_FIELD = new CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 20, "Only static fields can be declared as 'const'");
+  static const CompileTimeErrorCode CONST_INSTANCE_FIELD = const CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 20, "Only static fields can be declared as 'const'");
 
   /**
    * 12.8 Maps: It is a compile-time error if the key of an entry in a constant map literal is an
    * instance of a class that implements the operator <i>==</i> unless the key is a string or
    * integer.
    */
-  static final CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = new CompileTimeErrorCode.con1('CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 21, "The constant map entry key expression type '%s' cannot override the == operator");
+  static const CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 21, "The constant map entry key expression type '%s' cannot override the == operator");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant (12.1) or a
@@ -1156,45 +1118,45 @@
    *
    * @param name the name of the uninitialized final variable
    */
-  static final CompileTimeErrorCode CONST_NOT_INITIALIZED = new CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 22, "The const variable '%s' must be initialized");
+  static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 22, "The const variable '%s' must be initialized");
 
   /**
    * 12.11.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2, where e, e1 and e2
    * are constant expressions that evaluate to a boolean value.
    */
-  static final CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = new CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 23, "An expression of type 'bool' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 23, "An expression of type 'bool' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms e1 == e2 or e1 != e2 where e1 and e2 are
    * constant expressions that evaluate to a numeric, string or boolean value or to null.
    */
-  static final CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = new CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 24, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 24, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms ~e, e1 ^ e2, e1 & e2, e1 | e2, e1 >> e2 or e1
    * << e2, where e, e1 and e2 are constant expressions that evaluate to an integer value or to
    * null.
    */
-  static final CompileTimeErrorCode CONST_EVAL_TYPE_INT = new CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 25, "An expression of type 'int' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_INT = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 25, "An expression of type 'int' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms e, e1 + e2, e1 - e2, e1 * e2, e1 / e2, e1 ~/
    * e2, e1 > e2, e1 < e2, e1 >= e2, e1 <= e2 or e1 % e2, where e, e1 and e2 are constant
    * expressions that evaluate to a numeric value or to null..
    */
-  static final CompileTimeErrorCode CONST_EVAL_TYPE_NUM = new CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 26, "An expression of type 'num' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_NUM = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 26, "An expression of type 'num' was expected");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static final CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = new CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 27, "Evaluation of this constant expression causes exception");
+  static const CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 27, "Evaluation of this constant expression causes exception");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static final CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = new CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 28, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
+  static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 28, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
 
   /**
    * 12.11.2 Const: If <i>T</i> is a parameterized type <i>S&lt;U<sub>1</sub>, &hellip;,
@@ -1207,7 +1169,7 @@
    * @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
    * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
    */
-  static final CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = new CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 29, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 29, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   /**
    * 12.11.2 Const: If <i>e</i> is of the form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
@@ -1215,13 +1177,13 @@
    * compile-time error if the type <i>T</i> does not declare a constant constructor with the same
    * name as the declaration of <i>T</i>.
    */
-  static final CompileTimeErrorCode CONST_WITH_NON_CONST = new CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 30, "The constructor being called is not a 'const' constructor");
+  static const CompileTimeErrorCode CONST_WITH_NON_CONST = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 30, "The constructor being called is not a 'const' constructor");
 
   /**
    * 12.11.2 Const: In all of the above cases, it is a compile-time error if <i>a<sub>i</sub>, 1
    * &lt;= i &lt;= n + k</i>, is not a compile-time constant expression.
    */
-  static final CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = new CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 31, "Arguments of a constant creation must be constant expressions");
+  static const CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 31, "Arguments of a constant creation must be constant expressions");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
@@ -1234,12 +1196,12 @@
    *
    * @param name the name of the non-type element
    */
-  static final CompileTimeErrorCode CONST_WITH_NON_TYPE = new CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 32, "The name '%s' is not a class");
+  static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 32, "The name '%s' is not a class");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> includes any type parameters.
    */
-  static final CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = new CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 33, "The constant creation cannot use a type parameter");
+  static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 33, "The constant creation cannot use a type parameter");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -1248,7 +1210,7 @@
    * @param typeName the name of the type
    * @param constructorName the name of the requested constant constructor
    */
-  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = new CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 34, "The class '%s' does not have a constant constructor '%s'");
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 34, "The class '%s' does not have a constant constructor '%s'");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -1256,32 +1218,32 @@
    *
    * @param typeName the name of the type
    */
-  static final CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 35, "The class '%s' does not have a default constant constructor");
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 35, "The class '%s' does not have a default constant constructor");
 
   /**
    * 15.3.1 Typedef: It is a compile-time error if any default values are specified in the signature
    * of a function type alias.
    */
-  static final CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = new CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 36, "Default values aren't allowed in typedefs");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 36, "Default values aren't allowed in typedefs");
 
   /**
    * 6.2.1 Required Formals: By means of a function signature that names the parameter and describes
    * its type as a function type. It is a compile-time error if any default values are specified in
    * the signature of such a function type.
    */
-  static final CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = new CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 37, "Default values aren't allowed in function type parameters");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 37, "Default values aren't allowed in function type parameters");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> explicitly specifies a default value
    * for an optional parameter.
    */
-  static final CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = new CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR', 38, "Default values aren't allowed in factory constructors that redirect to another constructor");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR', 38, "Default values aren't allowed in factory constructors that redirect to another constructor");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
    * declared in the same scope.
    */
-  static final CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = new CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 39, "The default constructor is already defined");
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 39, "The default constructor is already defined");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -1289,7 +1251,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static final CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = new CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 40, "The constructor with name '%s' is already defined");
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 40, "The constructor with name '%s' is already defined");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -1302,7 +1264,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static final CompileTimeErrorCode DUPLICATE_DEFINITION = new CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 41, "The name '%s' is already defined");
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 41, "The name '%s' is already defined");
 
   /**
    * 7. Classes: It is a compile-time error if a class has an instance member and a static member
@@ -1314,21 +1276,21 @@
    * @param name the name of the conflicting members
    * @see #DUPLICATE_DEFINITION
    */
-  static final CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = new CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 42, "The name '%s' is already defined in '%s'");
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 42, "The name '%s' is already defined in '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a compile-time error if <i>q<sub>i</sub> =
    * q<sub>j</sub></i> for any <i>i != j</i> [where <i>q<sub>i</sub></i> is the label for a named
    * argument].
    */
-  static final CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = new CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 43, "The argument for the named parameter '%s' was already specified");
+  static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = const CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 43, "The argument for the named parameter '%s' was already specified");
 
   /**
    * SDK implementation libraries can be exported only by other SDK libraries.
    *
    * @param uri the uri pointing to a library
    */
-  static final CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = new CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 44, "The library '%s' is internal and cannot be exported");
+  static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 44, "The library '%s' is internal and cannot be exported");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1336,7 +1298,7 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static final CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = new CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 45, "The exported library '%s' must not have a part-of directive");
+  static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 45, "The exported library '%s' must not have a part-of directive");
 
   /**
    * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
@@ -1344,7 +1306,7 @@
    *
    * @param typeName the name of the superclass that was not found
    */
-  static final CompileTimeErrorCode EXTENDS_NON_CLASS = new CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 46, "Classes can only extend other classes");
+  static const CompileTimeErrorCode EXTENDS_NON_CLASS = const CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 46, "Classes can only extend other classes");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -1363,7 +1325,7 @@
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
    */
-  static final CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = new CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 47, "Classes cannot extend '%s'");
+  static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 47, "Classes cannot extend '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -1375,21 +1337,21 @@
    * @param requiredCount the maximum number of positional arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static final CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = new CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 48, "%d positional arguments expected, but %d found");
+  static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = const CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 48, "%d positional arguments expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if more than one initializer corresponding to a given instance variable appears in
    * <i>k</i>'s list.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = new CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 49, "The field '%s' cannot be initialized twice in the same constructor");
+  static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 49, "The field '%s' cannot be initialized twice in the same constructor");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if <i>k</i>'s initializer list contains an initializer for a variable that is initialized
    * by means of an initializing formal of <i>k</i>.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = new CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 50, "Fields cannot be initialized in both the parameter list and the initializers");
+  static const CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 50, "Fields cannot be initialized in both the parameter list and the initializers");
 
   /**
    * 5 Variables: It is a compile-time error if a final instance variable that has is initialized by
@@ -1398,19 +1360,19 @@
    *
    * @param name the name of the field in question
    */
-  static final CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = new CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 51, "'%s' is a final field and so can only be set once");
+  static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = const CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 51, "'%s' is a final field and so can only be set once");
 
   /**
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = new CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 52, "Initializing formal fields cannot be used in factory constructors");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 52, "Initializing formal fields cannot be used in factory constructors");
 
   /**
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = new CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 53, "Initializing formal fields can only be used in constructors");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 53, "Initializing formal fields can only be used in constructors");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1419,7 +1381,7 @@
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static final CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 54, "The redirecting constructor cannot have a field initializer");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 54, "The redirecting constructor cannot have a field initializer");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -1427,7 +1389,7 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static final CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = new CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 55, "'%s' cannot be used to name a getter, there is already a method with the same name");
+  static const CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = const CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 55, "'%s' cannot be used to name a getter, there is already a method with the same name");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -1446,13 +1408,13 @@
    * @param typeName the name of the type that cannot be implemented
    * @see #EXTENDS_DISALLOWED_CLASS
    */
-  static final CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = new CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 56, "Classes cannot implement '%s'");
+  static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 56, "Classes cannot implement '%s'");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class includes
    * type dynamic.
    */
-  static final CompileTimeErrorCode IMPLEMENTS_DYNAMIC = new CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 57, "Classes cannot implement 'dynamic'");
+  static const CompileTimeErrorCode IMPLEMENTS_DYNAMIC = const CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 57, "Classes cannot implement 'dynamic'");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
@@ -1461,7 +1423,7 @@
    *
    * @param typeName the name of the interface that was not found
    */
-  static final CompileTimeErrorCode IMPLEMENTS_NON_CLASS = new CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 58, "Classes can only implement other classes");
+  static const CompileTimeErrorCode IMPLEMENTS_NON_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 58, "Classes can only implement other classes");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if a type <i>T</i> appears more than once in
@@ -1469,7 +1431,7 @@
    *
    * @param className the name of the class that is implemented more than once
    */
-  static final CompileTimeErrorCode IMPLEMENTS_REPEATED = new CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 59, "'%s' can only be implemented once");
+  static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 59, "'%s' can only be implemented once");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the superclass of a class <i>C</i> appears
@@ -1477,7 +1439,7 @@
    *
    * @param className the name of the class that appears in both "extends" and "implements" clauses
    */
-  static final CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = new CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 60, "'%s' cannot be used in both 'extends' and 'implements' clauses");
+  static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 60, "'%s' cannot be used in both 'extends' and 'implements' clauses");
 
   /**
    * 7.6.1 Generative Constructors: Note that <b>this</b> is not in scope on the right hand side of
@@ -1489,14 +1451,14 @@
    *
    * @param name the name of the type in question
    */
-  static final CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = new CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 61, "Only static members can be accessed in initializers");
+  static const CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = const CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 61, "Only static members can be accessed in initializers");
 
   /**
    * SDK implementation libraries can be imported only by other SDK libraries.
    *
    * @param uri the uri pointing to a library
    */
-  static final CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = new CompileTimeErrorCode.con1('IMPORT_INTERNAL_LIBRARY', 62, "The library '%s' is internal and cannot be imported");
+  static const CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_INTERNAL_LIBRARY', 62, "The library '%s' is internal and cannot be imported");
 
   /**
    * 14.1 Imports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1504,7 +1466,7 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static final CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = new CompileTimeErrorCode.con1('IMPORT_OF_NON_LIBRARY', 63, "The imported library '%s' must not have a part-of directive");
+  static const CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_OF_NON_LIBRARY', 63, "The imported library '%s' must not have a part-of directive");
 
   /**
    * 13.9 Switch: It is a compile-time error if values of the expressions <i>e<sub>k</sub></i> are
@@ -1513,7 +1475,7 @@
    * @param expressionSource the expression source code that is the unexpected type
    * @param expectedType the name of the expected type
    */
-  static final CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = new CompileTimeErrorCode.con1('INCONSISTENT_CASE_EXPRESSION_TYPES', 64, "Case expressions must have the same types, '%s' is not a %s'");
+  static const CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = const CompileTimeErrorCode.con1('INCONSISTENT_CASE_EXPRESSION_TYPES', 64, "Case expressions must have the same types, '%s' is not a %s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
@@ -1524,7 +1486,7 @@
    *          immediately enclosing class
    * @see #INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode.con1('INITIALIZER_FOR_NON_EXISTANT_FIELD', 65, "'%s' is not a variable in the enclosing class");
+  static const CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_NON_EXISTANT_FIELD', 65, "'%s' is not a variable in the enclosing class");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
@@ -1535,7 +1497,7 @@
    *          enclosing class
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = new CompileTimeErrorCode.con1('INITIALIZER_FOR_STATIC_FIELD', 66, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+  static const CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_STATIC_FIELD', 66, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -1547,7 +1509,7 @@
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    * @see #INITIALIZER_FOR_NON_EXISTANT_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = new CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 67, "'%s' is not a variable in the enclosing class");
+  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 67, "'%s' is not a variable in the enclosing class");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -1558,20 +1520,20 @@
    *          enclosing class
    * @see #INITIALIZER_FOR_STATIC_FIELD
    */
-  static final CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = new CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 68, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 68, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
 
   /**
    * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
    * <b>this</b>.<i>id</i>.
    */
-  static final CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = new CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 69, "Instance member cannot be accessed from static method");
+  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 69, "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 final CompileTimeErrorCode INVALID_ANNOTATION = new CompileTimeErrorCode.con1('INVALID_ANNOTATION', 70, "Annotation can be only constant variable or constant constructor invocation");
+  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 70, "Annotation can be only constant variable or constant constructor invocation");
 
   /**
    * TODO(brianwilkerson) Remove this when we have decided on how to report errors in compile-time
@@ -1579,26 +1541,26 @@
    *
    * See TODOs in ConstantVisitor
    */
-  static final CompileTimeErrorCode INVALID_CONSTANT = new CompileTimeErrorCode.con1('INVALID_CONSTANT', 71, "Invalid constant value");
+  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 71, "Invalid constant value");
 
   /**
    * 7.6 Constructors: It is a compile-time error if the name of a constructor is not a constructor
    * name.
    */
-  static final CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = new CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 72, "Invalid constructor name");
+  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 72, "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 final CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = new CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 73, "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', 73, "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 final CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = new CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 74, "Invalid reference to 'this' expression");
+  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 74, "Invalid reference to 'this' expression");
 
   /**
    * 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
@@ -1606,7 +1568,7 @@
    *
    * @name the name of the type parameter
    */
-  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = new CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 75, "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', 75, "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
@@ -1614,7 +1576,7 @@
    *
    * @name the name of the type parameter
    */
-  static final CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = new CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 76, "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', 76, "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
@@ -1629,7 +1591,7 @@
    * @param uri the URI that is invalid
    * @see #URI_DOES_NOT_EXIST
    */
-  static final CompileTimeErrorCode INVALID_URI = new CompileTimeErrorCode.con1('INVALID_URI', 77, "Invalid URI syntax: '%s'");
+  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 77, "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
@@ -1640,7 +1602,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static final CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = new CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 78, "Cannot reference label '%s' declared in an outer method");
+  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 78, "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
@@ -1651,7 +1613,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static final CompileTimeErrorCode LABEL_UNDEFINED = new CompileTimeErrorCode.con1('LABEL_UNDEFINED', 79, "Cannot reference undefined label '%s'");
+  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 79, "Cannot reference undefined label '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -1665,7 +1627,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 final CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 80, "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', 80, "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> :
@@ -1679,7 +1641,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 final CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 81, "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', 81, "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> :
@@ -1693,13 +1655,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 final CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = new CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 82, "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', 82, "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 final CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = new CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 83, "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', 83, "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
@@ -1707,17 +1669,17 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static final CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = new CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 84, "'%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', 84, "'%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 final CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = new CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 85, "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', 85, "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 final CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = new CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 86, "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', 86, "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
@@ -1725,7 +1687,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static final CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = new CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 87, "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', 87, "The class '%s' cannot be used as a mixin because it declares a constructor");
 
   /**
    * 9 Mixins: It is a compile-time error if a mixin is derived from a class whose superclass is not
@@ -1733,7 +1695,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static final CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = new CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 88, "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', 88, "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.
@@ -1752,43 +1714,43 @@
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
    */
-  static final CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = new CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 89, "Classes cannot mixin '%s'");
+  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 89, "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 final CompileTimeErrorCode MIXIN_OF_NON_CLASS = new CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 90, "Classes can only mixin other classes");
+  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 90, "Classes can only mixin other classes");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin refers to super.
    */
-  static final CompileTimeErrorCode MIXIN_REFERENCES_SUPER = new CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 91, "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', 91, "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 final CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = new CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 92, "Mixin can only be applied to class");
+  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 92, "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 final CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = new CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 93, "Constructor may have at most one 'this' redirection");
+  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 93, "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 final CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = new CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 94, "Constructor may have at most one 'super' initializer");
+  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 94, "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 final CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = new CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 95, "Annotation creation must have arguments");
+  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 95, "Annotation creation must have arguments");
 
   /**
    * 7.6.1 Generative Constructors: If no superinitializer is provided, an implicit superinitializer
@@ -1798,7 +1760,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 final CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = new CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 96, "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', 96, "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
@@ -1807,13 +1769,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 final CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = new CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 97, "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', 97, "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 final CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = new CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 98, "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', 98, "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;
@@ -1824,44 +1786,44 @@
    * 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 final CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = new CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 99, "Case expressions must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 99, "Case expressions must be constant");
 
   /**
    * 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 final CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = new CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 100, "Default values of an optional parameter must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 100, "Default values of an optional parameter must be constant");
 
   /**
    * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
    * compile-time constant.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = new CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 101, "'const' lists must have all constant values");
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 101, "'const' lists must have all constant values");
 
   /**
    * 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 final CompileTimeErrorCode NON_CONSTANT_MAP_KEY = new CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 102, "The keys in a map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 102, "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
    * literal is not a compile-time constant.
    */
-  static final CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = new CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 103, "The values in a 'const' map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 103, "The values in a 'const' map must be constant");
 
   /**
    * 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 final CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = new CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 104, "Annotation creation can use only 'const' constructor");
+  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 104, "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 final CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = new CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 105, "Initializer expressions in constant constructors must be constants");
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 105, "Initializer expressions in constant constructors must be constants");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
@@ -1872,7 +1834,7 @@
    * @param requiredCount the expected number of required arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static final CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 106, "%d required argument(s) expected, but %d found");
+  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 106, "%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
@@ -1880,17 +1842,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 final CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 107, "The generative constructor '%s' expected, but factory found");
+  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 107, "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 final CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = new CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 108, "");
+  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 108, "");
 
   /**
    * 7.1.1 Operators: It is a compile-time error to declare an optional parameter in an operator.
    */
-  static final CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = new CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 109, "Optional parameters are not allowed when defining an operator");
+  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 109, "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
@@ -1898,25 +1860,25 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static final CompileTimeErrorCode PART_OF_NON_PART = new CompileTimeErrorCode.con1('PART_OF_NON_PART', 110, "The included part '%s' must have a part-of directive");
+  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 110, "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 final CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = new CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 111, "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', 111, "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 final CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = new CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 112, "Named optional parameters cannot start with an underscore");
+  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 112, "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 final CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = new CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 113, "");
+  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 113, "");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1927,13 +1889,13 @@
    *
    * https://code.google.com/p/dart/issues/detail?id=954
    */
-  static final CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = new CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 114, "Cycle in redirecting generative constructors");
+  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 114, "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 final CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = new CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 115, "Cycle in redirecting factory constructors");
+  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 115, "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
@@ -1946,7 +1908,7 @@
    * @param className the name of the class that implements itself recursively
    * @param strImplementsPath a string representation of the implements loop
    */
-  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = new CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 116, "'%s' cannot be a superinterface of itself: %s");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 116, "'%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
@@ -1958,7 +1920,7 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = new CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 117, "'%s' cannot extend itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 117, "'%s' cannot extend itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1970,43 +1932,43 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static final CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = new CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 118, "'%s' cannot implement itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 118, "'%s' cannot implement itself");
 
   /**
    * 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 final CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = new CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 119, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 119, "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 final CompileTimeErrorCode REDIRECT_TO_NON_CLASS = new CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 120, "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', 120, "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 final CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = new CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 121, "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', 121, "Constant factory constructor cannot delegate to a non-constant 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 final CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = new CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 122, "Local variables cannot be referenced before they are declared");
+  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 122, "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 final CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = new CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 123, "rethrow must be inside of a catch clause");
+  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 123, "rethrow must be inside of a catch clause");
 
   /**
-   * 13.11 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
+   * 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 final CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = new CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 124, "Constructors cannot return a value");
+  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 124, "Constructors cannot return a value");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -2016,19 +1978,19 @@
    * initializer list, in class Object, in a factory constructor, or in a static method or variable
    * initializer.
    */
-  static final CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = new CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 125, "Invalid context for 'super' invocation");
+  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 125, "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 final CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = new CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 126, "The redirecting constructor cannot have a 'super' initializer");
+  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 126, "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 final CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = new CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 127, "");
+  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 127, "");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -2047,19 +2009,19 @@
    * @param boundingTypeName the name of the bounding type
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  static final CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = new CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 128, "'%s' does not extend '%s'");
+  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 128, "'%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 final CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = new CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 129, "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', 129, "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 final CompileTimeErrorCode UNDEFINED_CLASS = new CompileTimeErrorCode.con1('UNDEFINED_CLASS', 130, "Undefined class '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 130, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -2067,7 +2029,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 final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = new CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 131, "The class '%s' does not have a generative constructor '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 131, "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
@@ -2075,7 +2037,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 final CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = new CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 132, "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', 132, "The class '%s' does not have a default generative constructor");
 
   /**
    * 12.14.3 Unqualified Invocation: If there exists a lexically visible declaration named
@@ -2085,7 +2047,7 @@
    *
    * @param methodName the name of the method that is undefined
    */
-  static final CompileTimeErrorCode UNDEFINED_FUNCTION = new CompileTimeErrorCode.con1('UNDEFINED_FUNCTION', 133, "The function '%s' is not defined");
+  static const CompileTimeErrorCode UNDEFINED_FUNCTION = const CompileTimeErrorCode.con1('UNDEFINED_FUNCTION', 133, "The function '%s' is not defined");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -2097,7 +2059,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static final CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = new CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 134, "The named parameter '%s' is not defined");
+  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 134, "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
@@ -2112,7 +2074,7 @@
    * @param uri the URI pointing to a non-existent file
    * @see #INVALID_URI
    */
-  static final CompileTimeErrorCode URI_DOES_NOT_EXIST = new CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 135, "Target of URI does not exist: '%s'");
+  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 135, "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
@@ -2124,7 +2086,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 final CompileTimeErrorCode URI_WITH_INTERPOLATION = new CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 136, "URIs cannot use string interpolation");
+  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 136, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
@@ -2137,7 +2099,7 @@
    * @param expectedNumberOfParameters the number of parameters expected
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 137, "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', 137, "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
@@ -2145,15 +2107,15 @@
    *
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 138, "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', 138, "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 final CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = new CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 139, "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', 139, "Setters should declare exactly one required parameter");
 
-  static final List<CompileTimeErrorCode> values = [
+  static const List<CompileTimeErrorCode> values = const [
       AMBIGUOUS_EXPORT,
       ARGUMENT_DEFINITION_TEST_NON_PARAMETER,
       BUILT_IN_IDENTIFIER_AS_TYPE,
@@ -2298,22 +2260,20 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  String message;
+  final String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
    * there is no correction information for this error.
    */
-  String correction2;
+  final String correction;
 
   /**
    * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  CompileTimeErrorCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
-    this.message = message;
-  }
+  const CompileTimeErrorCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -2321,13 +2281,7 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  CompileTimeErrorCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
-    this.message = message;
-    this.correction2 = correction;
-  }
-
-  @override
-  String get correction => correction2;
+  const CompileTimeErrorCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
 
   @override
   ErrorSeverity get errorSeverity => ErrorType.COMPILE_TIME_ERROR.severity;
@@ -2349,7 +2303,7 @@
    * contain a directive such as `import '../web/some.dart'` which references a file outside
    * the lib directory.
    */
-  static final PubSuggestionCode FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE = new PubSuggestionCode.con1('FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE', 0, "A file in the 'lib' directory hierarchy should not reference a file outside that hierarchy");
+  static const PubSuggestionCode FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE = const PubSuggestionCode.con1('FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE', 0, "A file in the 'lib' directory hierarchy should not reference a file outside that hierarchy");
 
   /**
    * It is a bad practice for a source file ouside a package "lib" directory hierarchy to traverse
@@ -2357,16 +2311,16 @@
    * contain a directive such as `import '../lib/some.dart'` which references a file inside
    * the lib directory.
    */
-  static final PubSuggestionCode FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE = new PubSuggestionCode.con1('FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE', 1, "A file outside the 'lib' directory hierarchy should not reference a file inside that hierarchy. Use a package: reference instead.");
+  static const PubSuggestionCode FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE = const PubSuggestionCode.con1('FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE', 1, "A file outside the 'lib' directory hierarchy should not reference a file inside that hierarchy. Use a package: reference instead.");
 
   /**
    * It is a bad practice for a package import to reference anything outside the given package, or
    * more generally, it is bad practice for a package import to contain a "..". For example, a
    * source file should not contain a directive such as `import 'package:foo/../some.dart'`.
    */
-  static final PubSuggestionCode PACKAGE_IMPORT_CONTAINS_DOT_DOT = new PubSuggestionCode.con1('PACKAGE_IMPORT_CONTAINS_DOT_DOT', 2, "A package import should not contain '..'");
+  static const PubSuggestionCode PACKAGE_IMPORT_CONTAINS_DOT_DOT = const PubSuggestionCode.con1('PACKAGE_IMPORT_CONTAINS_DOT_DOT', 2, "A package import should not contain '..'");
 
-  static final List<PubSuggestionCode> values = [
+  static const List<PubSuggestionCode> values = const [
       FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE,
       FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE,
       PACKAGE_IMPORT_CONTAINS_DOT_DOT];
@@ -2374,22 +2328,20 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  String message;
+  final String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
    * there is no correction information for this error.
    */
-  String correction5;
+  final String correction;
 
   /**
    * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  PubSuggestionCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
-    this.message = message;
-  }
+  const PubSuggestionCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -2397,13 +2349,7 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  PubSuggestionCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
-    this.message = message;
-    this.correction5 = correction;
-  }
-
-  @override
-  String get correction => correction5;
+  const PubSuggestionCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
 
   @override
   ErrorSeverity get errorSeverity => ErrorType.PUB_SUGGESTION.severity;
@@ -2433,7 +2379,7 @@
    * @param firstLibraryName the name of the first library that the type is found
    * @param secondLibraryName the name of the second library that the type is found
    */
-  static final StaticWarningCode AMBIGUOUS_IMPORT = new StaticWarningCode.con1('AMBIGUOUS_IMPORT', 0, "The type '%s' is defined in the libraries '%s' and '%s'");
+  static const StaticWarningCode AMBIGUOUS_IMPORT = const StaticWarningCode.con1('AMBIGUOUS_IMPORT', 0, "The type '%s' is defined in the libraries '%s' and '%s'");
 
   /**
    * 12.11.1 New: It is a static warning if the static type of <i>a<sub>i</sub>, 1 &lt;= i &lt;= n+
@@ -2459,7 +2405,7 @@
    * @param actualType the name of the actual argument type
    * @param expectedType the name of the expected type
    */
-  static final StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('ARGUMENT_TYPE_NOT_ASSIGNABLE', 1, "The argument type '%s' cannot be assigned to the parameter type '%s'");
+  static const StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('ARGUMENT_TYPE_NOT_ASSIGNABLE', 1, "The argument type '%s' cannot be assigned to the parameter type '%s'");
 
   /**
    * 5 Variables: Attempting to assign to a final variable elsewhere will cause a NoSuchMethodError
@@ -2468,38 +2414,38 @@
    *
    * A constant variable is always implicitly final.
    */
-  static final StaticWarningCode ASSIGNMENT_TO_CONST = new StaticWarningCode.con1('ASSIGNMENT_TO_CONST', 2, "Constant variables cannot be assigned a value");
+  static const StaticWarningCode ASSIGNMENT_TO_CONST = const StaticWarningCode.con1('ASSIGNMENT_TO_CONST', 2, "Constant variables cannot be assigned a value");
 
   /**
    * 5 Variables: Attempting to assign to a final variable elsewhere will cause a NoSuchMethodError
    * to be thrown, because no setter is defined for it. The assignment will also give rise to a
    * static warning for the same reason.
    */
-  static final StaticWarningCode ASSIGNMENT_TO_FINAL = new StaticWarningCode.con1('ASSIGNMENT_TO_FINAL', 3, "'%s' cannot be used as a setter, it is final");
+  static const StaticWarningCode ASSIGNMENT_TO_FINAL = const StaticWarningCode.con1('ASSIGNMENT_TO_FINAL', 3, "'%s' cannot be used as a setter, it is final");
 
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
    * warning if <i>T</i> does not have an accessible instance setter named <i>v =</i>.
    */
-  static final StaticWarningCode ASSIGNMENT_TO_METHOD = new StaticWarningCode.con1('ASSIGNMENT_TO_METHOD', 4, "Methods cannot be assigned a value");
+  static const StaticWarningCode ASSIGNMENT_TO_METHOD = const StaticWarningCode.con1('ASSIGNMENT_TO_METHOD', 4, "Methods cannot be assigned a value");
 
   /**
    * 13.9 Switch: It is a static warning if the last statement of the statement sequence
    * <i>s<sub>k</sub></i> is not a break, continue, return or throw statement.
    */
-  static final StaticWarningCode CASE_BLOCK_NOT_TERMINATED = new StaticWarningCode.con1('CASE_BLOCK_NOT_TERMINATED', 5, "The last statement of the 'case' should be 'break', 'continue', 'return' or 'throw'");
+  static const StaticWarningCode CASE_BLOCK_NOT_TERMINATED = const StaticWarningCode.con1('CASE_BLOCK_NOT_TERMINATED', 5, "The last statement of the 'case' should be 'break', 'continue', 'return' or 'throw'");
 
   /**
    * 12.32 Type Cast: It is a static warning if <i>T</i> does not denote a type available in the
    * current lexical scope.
    */
-  static final StaticWarningCode CAST_TO_NON_TYPE = new StaticWarningCode.con1('CAST_TO_NON_TYPE', 6, "The name '%s' is not a type and cannot be used in an 'as' expression");
+  static const StaticWarningCode CAST_TO_NON_TYPE = const StaticWarningCode.con1('CAST_TO_NON_TYPE', 6, "The name '%s' is not a type and cannot be used in an 'as' expression");
 
   /**
    * 7.4 Abstract Instance Members: It is a static warning if an abstract member is declared or
    * inherited in a concrete class.
    */
-  static final StaticWarningCode CONCRETE_CLASS_WITH_ABSTRACT_MEMBER = new StaticWarningCode.con1('CONCRETE_CLASS_WITH_ABSTRACT_MEMBER', 7, "'%s' must have a method body because '%s' is not abstract");
+  static const StaticWarningCode CONCRETE_CLASS_WITH_ABSTRACT_MEMBER = const StaticWarningCode.con1('CONCRETE_CLASS_WITH_ABSTRACT_MEMBER', 7, "'%s' must have a method body because '%s' is not abstract");
 
   /**
    * 14.1 Imports: If a name <i>N</i> is referenced by a library <i>L</i> and <i>N</i> would be
@@ -2512,7 +2458,7 @@
    * @param sdkLibraryName the name of the dart: library that the element is found
    * @param otherLibraryName the name of the non-dart: library that the element is found
    */
-  static final StaticWarningCode CONFLICTING_DART_IMPORT = new StaticWarningCode.con1('CONFLICTING_DART_IMPORT', 8, "Element '%s' from SDK library '%s' is implicitly hidden by '%s'");
+  static const StaticWarningCode CONFLICTING_DART_IMPORT = const StaticWarningCode.con1('CONFLICTING_DART_IMPORT', 8, "Element '%s' from SDK library '%s' is implicitly hidden by '%s'");
 
   /**
    * 7.2 Getters: It is a static warning if a class <i>C</i> declares an instance getter named
@@ -2521,19 +2467,19 @@
    *
    * @param superName the name of the super class declaring a static member
    */
-  static final StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode.con1('CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER', 9, "Superclass '%s' declares static member with the same name");
+  static const StaticWarningCode CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER', 9, "Superclass '%s' declares static member with the same name");
 
   /**
    * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
    * named <i>n</i> and has a setter named <i>n=</i>.
    */
-  static final StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER = new StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER', 10, "Class '%s' declares instance method '%s', but also has a setter with the same name from '%s'");
+  static const StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER', 10, "Class '%s' declares instance method '%s', but also has a setter with the same name from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
    * named <i>n</i> and has a setter named <i>n=</i>.
    */
-  static final StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER2 = new StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER2', 11, "Class '%s' declares the setter '%s', but also has an instance method in the same class");
+  static const StaticWarningCode CONFLICTING_INSTANCE_METHOD_SETTER2 = const StaticWarningCode.con1('CONFLICTING_INSTANCE_METHOD_SETTER2', 11, "Class '%s' declares the setter '%s', but also has an instance method in the same class");
 
   /**
    * 7.3 Setters: It is a static warning if a class <i>C</i> declares an instance setter named
@@ -2542,31 +2488,31 @@
    *
    * @param superName the name of the super class declaring a static member
    */
-  static final StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = new StaticWarningCode.con1('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 12, "Superclass '%s' declares static member with the same name");
+  static const StaticWarningCode CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER = const StaticWarningCode.con1('CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER', 12, "Superclass '%s' declares static member with the same name");
 
   /**
    * 7.2 Getters: It is a static warning if a class declares a static getter named <i>v</i> and also
    * has a non-static setter named <i>v=</i>.
    */
-  static final StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = new StaticWarningCode.con1('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 13, "Class '%s' declares non-static setter with the same name");
+  static const StaticWarningCode CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER = const StaticWarningCode.con1('CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER', 13, "Class '%s' declares non-static setter with the same name");
 
   /**
    * 7.3 Setters: It is a static warning if a class declares a static setter named <i>v=</i> and
    * also has a non-static member named <i>v</i>.
    */
-  static final StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = new StaticWarningCode.con1('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 14, "Class '%s' declares non-static member with the same name");
+  static const StaticWarningCode CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER = const StaticWarningCode.con1('CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER', 14, "Class '%s' declares non-static member with the same name");
 
   /**
    * 12.11.2 Const: Given an instance creation expression of the form <i>const q(a<sub>1</sub>,
    * &hellip; a<sub>n</sub>)</i> it is a static warning if <i>q</i> is the constructor of an
    * abstract class but <i>q</i> is not a factory constructor.
    */
-  static final StaticWarningCode CONST_WITH_ABSTRACT_CLASS = new StaticWarningCode.con1('CONST_WITH_ABSTRACT_CLASS', 15, "Abstract classes cannot be created with a 'const' expression");
+  static const StaticWarningCode CONST_WITH_ABSTRACT_CLASS = const StaticWarningCode.con1('CONST_WITH_ABSTRACT_CLASS', 15, "Abstract classes cannot be created with a 'const' expression");
 
   /**
    * 12.7 Maps: It is a static warning if the values of any two keys in a map literal are equal.
    */
-  static final StaticWarningCode EQUAL_KEYS_IN_MAP = new StaticWarningCode.con1('EQUAL_KEYS_IN_MAP', 16, "Keys in a map cannot be equal");
+  static const StaticWarningCode EQUAL_KEYS_IN_MAP = const StaticWarningCode.con1('EQUAL_KEYS_IN_MAP', 16, "Keys in a map cannot be equal");
 
   /**
    * 14.2 Exports: It is a static warning to export two different libraries with the same name.
@@ -2575,7 +2521,7 @@
    * @param uri2 the uri pointing to a second library
    * @param name the shared name of the exported libraries
    */
-  static final StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode.con1('EXPORT_DUPLICATED_LIBRARY_NAME', 17, "The exported libraries '%s' and '%s' should not have the same name '%s'");
+  static const StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAME = const StaticWarningCode.con1('EXPORT_DUPLICATED_LIBRARY_NAME', 17, "The exported libraries '%s' and '%s' should not have the same name '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -2585,13 +2531,13 @@
    * @param argumentCount the actual number of positional arguments given
    * @see #NOT_ENOUGH_REQUIRED_ARGUMENTS
    */
-  static final StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = new StaticWarningCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 18, "%d positional arguments expected, but %d found");
+  static const StaticWarningCode EXTRA_POSITIONAL_ARGUMENTS = const StaticWarningCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 18, "%d positional arguments expected, but %d found");
 
   /**
    * 5. Variables: It is a static warning if a final instance variable that has been initialized at
    * its point of declaration is also initialized in a constructor.
    */
-  static final StaticWarningCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = new StaticWarningCode.con1('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 19, "Values cannot be set in the constructor if they are final, and have already been set");
+  static const StaticWarningCode FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION = const StaticWarningCode.con1('FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION', 19, "Values cannot be set in the constructor if they are final, and have already been set");
 
   /**
    * 5. Variables: It is a static warning if a final instance variable that has been initialized at
@@ -2599,7 +2545,7 @@
    *
    * @param name the name of the field in question
    */
-  static final StaticWarningCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = new StaticWarningCode.con1('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 20, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
+  static const StaticWarningCode FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR = const StaticWarningCode.con1('FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR', 20, "'%s' is final and was given a value when it was declared, so it cannot be set to a new value");
 
   /**
    * 7.6.1 Generative Constructors: Execution of an initializer of the form <b>this</b>.<i>v</i> =
@@ -2616,7 +2562,7 @@
    * @param initializerType the name of the type of the initializer expression
    * @param fieldType the name of the type of the field
    */
-  static final StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = new StaticWarningCode.con1('FIELD_INITIALIZER_NOT_ASSIGNABLE', 21, "The initializer type '%s' cannot be assigned to the field type '%s'");
+  static const StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE = const StaticWarningCode.con1('FIELD_INITIALIZER_NOT_ASSIGNABLE', 21, "The initializer type '%s' cannot be assigned to the field type '%s'");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -2625,7 +2571,7 @@
    * @param parameterType the name of the type of the field formal parameter
    * @param fieldType the name of the type of the field
    */
-  static final StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = new StaticWarningCode.con1('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 22, "The parameter type '%s' is incompatable with the field type '%s'");
+  static const StaticWarningCode FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE = const StaticWarningCode.con1('FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE', 22, "The parameter type '%s' is incompatable with the field type '%s'");
 
   /**
    * 5 Variables: It is a static warning if a library, static or local variable <i>v</i> is final
@@ -2640,13 +2586,13 @@
    *
    * @param name the name of the uninitialized final variable
    */
-  static final StaticWarningCode FINAL_NOT_INITIALIZED = new StaticWarningCode.con1('FINAL_NOT_INITIALIZED', 23, "The final variable '%s' must be initialized");
+  static const StaticWarningCode FINAL_NOT_INITIALIZED = const StaticWarningCode.con1('FINAL_NOT_INITIALIZED', 23, "The final variable '%s' must be initialized");
 
   /**
    * 15.5 Function Types: It is a static warning if a concrete class implements Function and does
    * not have a concrete method named call().
    */
-  static final StaticWarningCode FUNCTION_WITHOUT_CALL = new StaticWarningCode.con1('FUNCTION_WITHOUT_CALL', 24, "Concrete classes that implement Function must implement the method call()");
+  static const StaticWarningCode FUNCTION_WITHOUT_CALL = const StaticWarningCode.con1('FUNCTION_WITHOUT_CALL', 24, "Concrete classes that implement Function must implement the method call()");
 
   /**
    * 14.1 Imports: It is a static warning to import two different libraries with the same name.
@@ -2655,7 +2601,7 @@
    * @param uri2 the uri pointing to a second library
    * @param name the shared name of the imported libraries
    */
-  static final StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = new StaticWarningCode.con1('IMPORT_DUPLICATED_LIBRARY_NAME', 25, "The imported libraries '%s' and '%s' should not have the same name '%s'");
+  static const StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAME = const StaticWarningCode.con1('IMPORT_DUPLICATED_LIBRARY_NAME', 25, "The imported libraries '%s' and '%s' should not have the same name '%s'");
 
   /**
    * 8.1.1 Inheritance and Overriding: However, if there are multiple members <i>m<sub>1</sub>,
@@ -2667,7 +2613,7 @@
    * not all of the <i>m<sub>i</sub></i> are setters, none of the <i>m<sub>i</sub></i> are
    * inherited, and a static warning is issued.
    */
-  static final StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = new StaticWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 26, "'%s' is inherited as a getter and also a method");
+  static const StaticWarningCode INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD = const StaticWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD', 26, "'%s' is inherited as a getter and also a method");
 
   /**
    * 7.1 Instance Methods: It is a static warning if a class <i>C</i> declares an instance method
@@ -2677,7 +2623,7 @@
    * @param memberName the name of the member with the name conflict
    * @param superclassName the name of the enclosing class that has the static member
    */
-  static final StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = new StaticWarningCode.con1('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 27, "'%s' collides with a static member in the superclass '%s'");
+  static const StaticWarningCode INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC = const StaticWarningCode.con1('INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC', 27, "'%s' collides with a static member in the superclass '%s'");
 
   /**
    * 7.2 Getters: It is a static warning if a getter <i>m1</i> overrides a getter <i>m2</i> and the
@@ -2689,7 +2635,7 @@
    * @param className the name of the class where the overridden getter is declared
    * @see #INVALID_METHOD_OVERRIDE_RETURN_TYPE
    */
-  static final StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE = new StaticWarningCode.con1('INVALID_GETTER_OVERRIDE_RETURN_TYPE', 28, "The return type '%s' is not assignable to '%s' as required by the getter it is overriding from '%s'");
+  static const StaticWarningCode INVALID_GETTER_OVERRIDE_RETURN_TYPE = const StaticWarningCode.con1('INVALID_GETTER_OVERRIDE_RETURN_TYPE', 28, "The return type '%s' is not assignable to '%s' as required by the getter it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2700,7 +2646,7 @@
    *          actualParamTypeName
    * @param className the name of the class where the overridden method is declared
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE', 29, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE', 29, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2712,7 +2658,7 @@
    * @param className the name of the class where the overridden method is declared
    * @see #INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE', 30, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE', 30, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2723,7 +2669,7 @@
    *          actualParamTypeName
    * @param className the name of the class where the overridden method is declared
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE', 31, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE', 31, "The parameter type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2735,7 +2681,7 @@
    * @param className the name of the class where the overridden method is declared
    * @see #INVALID_GETTER_OVERRIDE_RETURN_TYPE
    */
-  static final StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE = new StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_RETURN_TYPE', 32, "The return type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
+  static const StaticWarningCode INVALID_METHOD_OVERRIDE_RETURN_TYPE = const StaticWarningCode.con1('INVALID_METHOD_OVERRIDE_RETURN_TYPE', 32, "The return type '%s' is not assignable to '%s' as required by the method it is overriding from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2743,7 +2689,7 @@
    * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
    * for <i>p</i>.
    */
-  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = new StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 33, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
+  static const StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = const StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED', 33, "Parameters cannot override default values, this method overrides '%s.%s' where '%s' has a different value");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2751,7 +2697,7 @@
    * a formal parameter <i>p</i> and the signature of <i>m1</i> specifies a different default value
    * for <i>p</i>.
    */
-  static final StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = new StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 34, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
+  static const StaticWarningCode INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL = const StaticWarningCode.con1('INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL', 34, "Parameters cannot override default values, this method overrides '%s.%s' where this positional parameter has a different value");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2761,7 +2707,7 @@
    * @param paramCount the number of named parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static final StaticWarningCode INVALID_OVERRIDE_NAMED = new StaticWarningCode.con1('INVALID_OVERRIDE_NAMED', 35, "Missing the named parameter '%s' to match the overridden method from '%s'");
+  static const StaticWarningCode INVALID_OVERRIDE_NAMED = const StaticWarningCode.con1('INVALID_OVERRIDE_NAMED', 35, "Missing the named parameter '%s' to match the overridden method from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2770,7 +2716,7 @@
    * @param paramCount the number of positional parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static final StaticWarningCode INVALID_OVERRIDE_POSITIONAL = new StaticWarningCode.con1('INVALID_OVERRIDE_POSITIONAL', 36, "Must have at least %d parameters to match the overridden method from '%s'");
+  static const StaticWarningCode INVALID_OVERRIDE_POSITIONAL = const StaticWarningCode.con1('INVALID_OVERRIDE_POSITIONAL', 36, "Must have at least %d parameters to match the overridden method from '%s'");
 
   /**
    * 7.1 Instance Methods: It is a static warning if an instance method <i>m1</i> overrides an
@@ -2780,7 +2726,7 @@
    * @param paramCount the number of required parameters in the overridden member
    * @param className the name of the class from the overridden method
    */
-  static final StaticWarningCode INVALID_OVERRIDE_REQUIRED = new StaticWarningCode.con1('INVALID_OVERRIDE_REQUIRED', 37, "Must have %d required parameters or less to match the overridden method from '%s'");
+  static const StaticWarningCode INVALID_OVERRIDE_REQUIRED = const StaticWarningCode.con1('INVALID_OVERRIDE_REQUIRED', 37, "Must have %d required parameters or less to match the overridden method from '%s'");
 
   /**
    * 7.3 Setters: It is a static warning if a setter <i>m1</i> overrides a setter <i>m2</i> and the
@@ -2792,7 +2738,7 @@
    * @param className the name of the class where the overridden setter is declared
    * @see #INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
    */
-  static final StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = new StaticWarningCode.con1('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 38, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
+  static const StaticWarningCode INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE = const StaticWarningCode.con1('INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE', 38, "The parameter type '%s' is not assignable to '%s' as required by the setter it is overriding from '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -2806,7 +2752,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 final StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 39, "The element type '%s' cannot be assigned to the list type '%s'");
+  static const StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 39, "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> :
@@ -2820,7 +2766,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 final StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 40, "The element type '%s' cannot be assigned to the map key type '%s'");
+  static const StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 40, "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> :
@@ -2834,33 +2780,33 @@
    * 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 final StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = new StaticWarningCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 41, "The element type '%s' cannot be assigned to the map value type '%s'");
+  static const StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const StaticWarningCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 41, "The element type '%s' cannot be assigned to the map value type '%s'");
 
   /**
    * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
    * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
    * assigned to <i>S</i>.
    */
-  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = new StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES', 42, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s')");
+  static const StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES = const StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES', 42, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s')");
 
   /**
    * 7.3 Setters: It is a static warning if a class has a setter named <i>v=</i> with argument type
    * <i>T</i> and a getter named <i>v</i> with return type <i>S</i>, and <i>T</i> may not be
    * assigned to <i>S</i>.
    */
-  static final StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE = new StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE', 43, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s'), from superclass '%s'");
+  static const StaticWarningCode MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE = const StaticWarningCode.con1('MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE', 43, "The parameter type for setter '%s' is '%s' which is not assignable to its getter (of type '%s'), from superclass '%s'");
 
   /**
    * 13.12 Return: It is a static warning if a function contains both one or more return statements
    * of the form <i>return;</i> and one or more return statements of the form <i>return e;</i>.
    */
-  static final StaticWarningCode MIXED_RETURN_TYPES = new StaticWarningCode.con1('MIXED_RETURN_TYPES', 44, "Methods and functions cannot use return both with and without values");
+  static const StaticWarningCode MIXED_RETURN_TYPES = const StaticWarningCode.con1('MIXED_RETURN_TYPES', 44, "Methods and functions cannot use return both with and without values");
 
   /**
    * 12.11.1 New: It is a static warning if <i>q</i> is a constructor of an abstract class and
    * <i>q</i> is not a factory constructor.
    */
-  static final StaticWarningCode NEW_WITH_ABSTRACT_CLASS = new StaticWarningCode.con1('NEW_WITH_ABSTRACT_CLASS', 45, "Abstract classes cannot be created with a 'new' expression");
+  static const StaticWarningCode NEW_WITH_ABSTRACT_CLASS = const StaticWarningCode.con1('NEW_WITH_ABSTRACT_CLASS', 45, "Abstract classes cannot be created with a 'new' expression");
 
   /**
    * 15.8 Parameterized Types: Any use of a malbounded type gives rise to a static warning.
@@ -2871,7 +2817,7 @@
    * @see CompileTimeErrorCode#CONST_WITH_INVALID_TYPE_PARAMETERS
    * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
    */
-  static final StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS = new StaticWarningCode.con1('NEW_WITH_INVALID_TYPE_PARAMETERS', 46, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static const StaticWarningCode NEW_WITH_INVALID_TYPE_PARAMETERS = const StaticWarningCode.con1('NEW_WITH_INVALID_TYPE_PARAMETERS', 46, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   /**
    * 12.11.1 New: It is a static warning if <i>T</i> is not a class accessible in the current scope,
@@ -2879,7 +2825,7 @@
    *
    * @param name the name of the non-type element
    */
-  static final StaticWarningCode NEW_WITH_NON_TYPE = new StaticWarningCode.con1('NEW_WITH_NON_TYPE', 47, "The name '%s' is not a class");
+  static const StaticWarningCode NEW_WITH_NON_TYPE = const StaticWarningCode.con1('NEW_WITH_NON_TYPE', 47, "The name '%s' is not a class");
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
@@ -2890,7 +2836,7 @@
    * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
    * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
    */
-  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = new StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR', 48, "The class '%s' does not have a constructor '%s'");
+  static const StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR = const StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR', 48, "The class '%s' does not have a constructor '%s'");
 
   /**
    * 12.11.1 New: If <i>T</i> is a class or parameterized type accessible in the current scope then:
@@ -2901,7 +2847,7 @@
    * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+kM/sub>)</i> it is a static warning if the
    * type <i>T</i> does not declare a constructor with the same name as the declaration of <i>T</i>.
    */
-  static final StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = new StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 49, "The class '%s' does not have a default constructor");
+  static const StaticWarningCode NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const StaticWarningCode.con1('NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 49, "The class '%s' does not have a default constructor");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2921,7 +2867,7 @@
    * @param memberName the name of the fourth member
    * @param additionalCount the number of additional missing members that aren't listed
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 50, "Missing concrete implementation of '%s', '%s', '%s', '%s' and %d more");
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS', 50, "Missing concrete implementation of %s, %s, %s, %s and %d more");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2940,7 +2886,7 @@
    * @param memberName the name of the third member
    * @param memberName the name of the fourth member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 51, "Missing concrete implementation of '%s', '%s', '%s' and '%s'");
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR', 51, "Missing concrete implementation of %s, %s, %s and %s");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2956,7 +2902,7 @@
    *
    * @param memberName the name of the member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 52, "Missing concrete implementation of '%s'");
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE', 52, "Missing concrete implementation of %s");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2974,7 +2920,7 @@
    * @param memberName the name of the second member
    * @param memberName the name of the third member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 53, "Missing concrete implementation of '%s', '%s' and '%s'");
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE', 53, "Missing concrete implementation of %s, %s and %s");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract class inherits an
@@ -2991,7 +2937,7 @@
    * @param memberName the name of the first member
    * @param memberName the name of the second member
    */
-  static final StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = new StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 54, "Missing concrete implementation of '%s' and '%s'");
+  static const StaticWarningCode NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = const StaticWarningCode.con1('NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO', 54, "Missing concrete implementation of %s and %s");
 
   /**
    * 13.11 Try: An on-catch clause of the form <i>on T catch (p<sub>1</sub>, p<sub>2</sub>) s</i> or
@@ -3001,18 +2947,18 @@
    *
    * @param name the name of the non-type element
    */
-  static final StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = new StaticWarningCode.con1('NON_TYPE_IN_CATCH_CLAUSE', 55, "The name '%s' is not a type and cannot be used in an on-catch clause");
+  static const StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE = const StaticWarningCode.con1('NON_TYPE_IN_CATCH_CLAUSE', 55, "The name '%s' is not a type and cannot be used in an on-catch clause");
 
   /**
    * 7.1.1 Operators: It is a static warning if the return type of the user-declared operator []= is
    * explicitly declared and not void.
    */
-  static final StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = new StaticWarningCode.con1('NON_VOID_RETURN_FOR_OPERATOR', 56, "The return type of the operator []= must be 'void'");
+  static const StaticWarningCode NON_VOID_RETURN_FOR_OPERATOR = const StaticWarningCode.con1('NON_VOID_RETURN_FOR_OPERATOR', 56, "The return type of the operator []= must be 'void'");
 
   /**
    * 7.3 Setters: It is a static warning if a setter declares a return type other than void.
    */
-  static final StaticWarningCode NON_VOID_RETURN_FOR_SETTER = new StaticWarningCode.con1('NON_VOID_RETURN_FOR_SETTER', 57, "The return type of the setter must be 'void'");
+  static const StaticWarningCode NON_VOID_RETURN_FOR_SETTER = const StaticWarningCode.con1('NON_VOID_RETURN_FOR_SETTER', 57, "The return type of the setter must be 'void'");
 
   /**
    * 15.1 Static Types: A type <i>T</i> is malformed iff: * <i>T</i> has the form <i>id</i> or the
@@ -3025,7 +2971,7 @@
    *
    * @param nonTypeName the name that is not a type
    */
-  static final StaticWarningCode NOT_A_TYPE = new StaticWarningCode.con1('NOT_A_TYPE', 58, "%s is not a type");
+  static const StaticWarningCode NOT_A_TYPE = const StaticWarningCode.con1('NOT_A_TYPE', 58, "%s is not a type");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -3035,7 +2981,7 @@
    * @param argumentCount the actual number of positional arguments given
    * @see #EXTRA_POSITIONAL_ARGUMENTS
    */
-  static final StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = new StaticWarningCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 59, "%d required argument(s) expected, but %d found");
+  static const StaticWarningCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const StaticWarningCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 59, "%d required argument(s) expected, but %d found");
 
   /**
    * 14.3 Parts: It is a static warning if the referenced part declaration <i>p</i> names a library
@@ -3044,7 +2990,7 @@
    * @param expectedLibraryName the name of expected library name
    * @param actualLibraryName the non-matching actual library name from the "part of" declaration
    */
-  static final StaticWarningCode PART_OF_DIFFERENT_LIBRARY = new StaticWarningCode.con1('PART_OF_DIFFERENT_LIBRARY', 60, "Expected this library to be part of '%s', not '%s'");
+  static const StaticWarningCode PART_OF_DIFFERENT_LIBRARY = const StaticWarningCode.con1('PART_OF_DIFFERENT_LIBRARY', 60, "Expected this library to be part of '%s', not '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -3053,7 +2999,7 @@
    * @param redirectedName the name of the redirected constructor
    * @param redirectingName the name of the redirecting constructor
    */
-  static final StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = new StaticWarningCode.con1('REDIRECT_TO_INVALID_FUNCTION_TYPE', 61, "The redirected constructor '%s' has incompatible parameters with '%s'");
+  static const StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE = const StaticWarningCode.con1('REDIRECT_TO_INVALID_FUNCTION_TYPE', 61, "The redirected constructor '%s' has incompatible parameters with '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i> is not a subtype of
@@ -3062,31 +3008,31 @@
    * @param redirectedName the name of the redirected constructor return type
    * @param redirectingName the name of the redirecting constructor return type
    */
-  static final StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = new StaticWarningCode.con1('REDIRECT_TO_INVALID_RETURN_TYPE', 62, "The return type '%s' of the redirected constructor is not assignable to '%s'");
+  static const StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE = const StaticWarningCode.con1('REDIRECT_TO_INVALID_RETURN_TYPE', 62, "The return type '%s' of the redirected constructor is not assignable to '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static final StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = new StaticWarningCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 63, "The constructor '%s' could not be found in '%s'");
+  static const StaticWarningCode REDIRECT_TO_MISSING_CONSTRUCTOR = const StaticWarningCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 63, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class accessible in the
    * current scope; if type does denote such a class <i>C</i> it is a static warning if the
    * referenced constructor (be it <i>type</i> or <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static final StaticWarningCode REDIRECT_TO_NON_CLASS = new StaticWarningCode.con1('REDIRECT_TO_NON_CLASS', 64, "The name '%s' is not a type and cannot be used in a redirected constructor");
+  static const StaticWarningCode REDIRECT_TO_NON_CLASS = const StaticWarningCode.con1('REDIRECT_TO_NON_CLASS', 64, "The name '%s' is not a type and cannot be used in a redirected constructor");
 
   /**
-   * 13.11 Return: Let <i>f</i> be the function immediately enclosing a return statement of the form
+   * 13.12 Return: Let <i>f</i> be the function immediately enclosing a return statement of the form
    * <i>return;</i> It is a static warning if both of the following conditions hold:
    * <ol>
    * * <i>f</i> is not a generative constructor.
    * * The return type of <i>f</i> may not be assigned to void.
    * </ol>
    */
-  static final StaticWarningCode RETURN_WITHOUT_VALUE = new StaticWarningCode.con1('RETURN_WITHOUT_VALUE', 65, "Missing return value after 'return'");
+  static const StaticWarningCode RETURN_WITHOUT_VALUE = const StaticWarningCode.con1('RETURN_WITHOUT_VALUE', 65, "Missing return value after 'return'");
 
   /**
    * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
@@ -3094,19 +3040,19 @@
    *
    * @param memberName the name of the instance member
    */
-  static final StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = new StaticWarningCode.con1('STATIC_ACCESS_TO_INSTANCE_MEMBER', 66, "Instance member '%s' cannot be accessed using static access");
+  static const StaticWarningCode STATIC_ACCESS_TO_INSTANCE_MEMBER = const StaticWarningCode.con1('STATIC_ACCESS_TO_INSTANCE_MEMBER', 66, "Instance member '%s' cannot be accessed using static access");
 
   /**
    * 13.9 Switch: It is a static warning if the type of <i>e</i> may not be assigned to the type of
    * <i>e<sub>k</sub></i>.
    */
-  static final StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = new StaticWarningCode.con1('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 67, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
+  static const StaticWarningCode SWITCH_EXPRESSION_NOT_ASSIGNABLE = const StaticWarningCode.con1('SWITCH_EXPRESSION_NOT_ASSIGNABLE', 67, "Type '%s' of the switch expression is not assignable to the type '%s' of case expressions");
 
   /**
    * 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type available in the
    * current lexical scope.
    */
-  static final StaticWarningCode TYPE_TEST_NON_TYPE = new StaticWarningCode.con1('TYPE_TEST_NON_TYPE', 68, "The name '%s' is not a type and cannot be used in an 'is' expression");
+  static const StaticWarningCode TYPE_TEST_NON_TYPE = const StaticWarningCode.con1('TYPE_TEST_NON_TYPE', 68, "The name '%s' is not a type and cannot be used in an 'is' expression");
 
   /**
    * 10 Generics: However, a type parameter is considered to be a malformed type when referenced by
@@ -3115,7 +3061,7 @@
    * 15.1 Static Types: Any use of a malformed type gives rise to a static warning. A malformed type
    * is then interpreted as dynamic by the static type checker and the runtime.
    */
-  static final StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC = new StaticWarningCode.con1('TYPE_PARAMETER_REFERENCED_BY_STATIC', 69, "Static members cannot reference type parameters");
+  static const StaticWarningCode TYPE_PARAMETER_REFERENCED_BY_STATIC = const StaticWarningCode.con1('TYPE_PARAMETER_REFERENCED_BY_STATIC', 69, "Static members cannot reference type parameters");
 
   /**
    * 12.16.3 Static Invocation: A static method invocation <i>i</i> has the form
@@ -3125,12 +3071,12 @@
    *
    * @param undefinedClassName the name of the undefined class
    */
-  static final StaticWarningCode UNDEFINED_CLASS = new StaticWarningCode.con1('UNDEFINED_CLASS', 70, "Undefined class '%s'");
+  static const StaticWarningCode UNDEFINED_CLASS = const StaticWarningCode.con1('UNDEFINED_CLASS', 70, "Undefined class '%s'");
 
   /**
    * Same as [UNDEFINED_CLASS], but to catch using "boolean" instead of "bool".
    */
-  static final StaticWarningCode UNDEFINED_CLASS_BOOLEAN = new StaticWarningCode.con1('UNDEFINED_CLASS_BOOLEAN', 71, "Undefined class 'boolean'; did you mean 'bool'?");
+  static const StaticWarningCode UNDEFINED_CLASS_BOOLEAN = const StaticWarningCode.con1('UNDEFINED_CLASS_BOOLEAN', 71, "Undefined class 'boolean'; did you mean 'bool'?");
 
   /**
    * 12.17 Getter Invocation: It is a static warning if there is no class <i>C</i> in the enclosing
@@ -3140,7 +3086,7 @@
    * @param getterName the name of the getter
    * @param enclosingType the name of the enclosing type where the getter is being looked for
    */
-  static final StaticWarningCode UNDEFINED_GETTER = new StaticWarningCode.con1('UNDEFINED_GETTER', 72, "There is no such getter '%s' in '%s'");
+  static const StaticWarningCode UNDEFINED_GETTER = const StaticWarningCode.con1('UNDEFINED_GETTER', 72, "There is no such getter '%s' in '%s'");
 
   /**
    * 12.30 Identifier Reference: It is as static warning if an identifier expression of the form
@@ -3150,7 +3096,7 @@
    *
    * @param name the name of the identifier
    */
-  static final StaticWarningCode UNDEFINED_IDENTIFIER = new StaticWarningCode.con1('UNDEFINED_IDENTIFIER', 73, "Undefined name '%s'");
+  static const StaticWarningCode UNDEFINED_IDENTIFIER = const StaticWarningCode.con1('UNDEFINED_IDENTIFIER', 73, "Undefined name '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -3159,7 +3105,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static final StaticWarningCode UNDEFINED_NAMED_PARAMETER = new StaticWarningCode.con1('UNDEFINED_NAMED_PARAMETER', 74, "The named parameter '%s' is not defined");
+  static const StaticWarningCode UNDEFINED_NAMED_PARAMETER = const StaticWarningCode.con1('UNDEFINED_NAMED_PARAMETER', 74, "The named parameter '%s' is not defined");
 
   /**
    * 12.18 Assignment: It is as static warning if an assignment of the form <i>v = e</i> occurs
@@ -3174,7 +3120,7 @@
    * @param setterName the name of the getter
    * @param enclosingType the name of the enclosing type where the setter is being looked for
    */
-  static final StaticWarningCode UNDEFINED_SETTER = new StaticWarningCode.con1('UNDEFINED_SETTER', 75, "There is no such setter '%s' in '%s'");
+  static const StaticWarningCode UNDEFINED_SETTER = const StaticWarningCode.con1('UNDEFINED_SETTER', 75, "There is no such setter '%s' in '%s'");
 
   /**
    * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not declare a static method
@@ -3183,9 +3129,14 @@
    * @param methodName the name of the method
    * @param enclosingType the name of the enclosing type where the method is being looked for
    */
-  static final StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = new StaticWarningCode.con1('UNDEFINED_STATIC_METHOD_OR_GETTER', 76, "There is no such static method, getter or setter '%s' in '%s'");
+  static const StaticWarningCode UNDEFINED_STATIC_METHOD_OR_GETTER = const StaticWarningCode.con1('UNDEFINED_STATIC_METHOD_OR_GETTER', 76, "There is no such static method, getter or setter '%s' in '%s'");
 
-  static final List<StaticWarningCode> values = [
+  /**
+   * 7.2 Getters: It is a static warning if the return type of a getter is void.
+   */
+  static const StaticWarningCode VOID_RETURN_FOR_GETTER = const StaticWarningCode.con1('VOID_RETURN_FOR_GETTER', 77, "The return type of the getter must not be 'void'");
+
+  static const List<StaticWarningCode> values = const [
       AMBIGUOUS_IMPORT,
       ARGUMENT_TYPE_NOT_ASSIGNABLE,
       ASSIGNMENT_TO_CONST,
@@ -3262,27 +3213,26 @@
       UNDEFINED_IDENTIFIER,
       UNDEFINED_NAMED_PARAMETER,
       UNDEFINED_SETTER,
-      UNDEFINED_STATIC_METHOD_OR_GETTER];
+      UNDEFINED_STATIC_METHOD_OR_GETTER,
+      VOID_RETURN_FOR_GETTER];
 
   /**
    * The template used to create the message to be displayed for this error.
    */
-  String message;
+  final String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
    * there is no correction information for this error.
    */
-  String correction7;
+  final String correction;
 
   /**
    * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  StaticWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
-    this.message = message;
-  }
+  const StaticWarningCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -3290,13 +3240,7 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  StaticWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
-    this.message = message;
-    this.correction7 = correction;
-  }
-
-  @override
-  String get correction => correction7;
+  const StaticWarningCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
 
   @override
   ErrorSeverity get errorSeverity => ErrorType.STATIC_WARNING.severity;
@@ -3342,7 +3286,7 @@
    *
    * @param uri the URI that is invalid
    */
-  static final HtmlWarningCode INVALID_URI = new HtmlWarningCode.con1('INVALID_URI', 0, "Invalid URI syntax: '%s'");
+  static const HtmlWarningCode INVALID_URI = const HtmlWarningCode.con1('INVALID_URI', 0, "Invalid URI syntax: '%s'");
 
   /**
    * An error code indicating that the value of the 'src' attribute of a Dart script tag references
@@ -3350,29 +3294,27 @@
    *
    * @param uri the URI pointing to a non-existent file
    */
-  static final HtmlWarningCode URI_DOES_NOT_EXIST = new HtmlWarningCode.con1('URI_DOES_NOT_EXIST', 1, "Target of URI does not exist: '%s'");
+  static const HtmlWarningCode URI_DOES_NOT_EXIST = const HtmlWarningCode.con1('URI_DOES_NOT_EXIST', 1, "Target of URI does not exist: '%s'");
 
-  static final List<HtmlWarningCode> values = [INVALID_URI, URI_DOES_NOT_EXIST];
+  static const List<HtmlWarningCode> values = const [INVALID_URI, URI_DOES_NOT_EXIST];
 
   /**
    * The template used to create the message to be displayed for this error.
    */
-  String message;
+  final String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
    * there is no correction information for this error.
    */
-  String correction4;
+  final String correction;
 
   /**
    * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  HtmlWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
-    this.message = message;
-  }
+  const HtmlWarningCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -3380,13 +3322,7 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  HtmlWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
-    this.message = message;
-    this.correction4 = correction;
-  }
-
-  @override
-  String get correction => correction4;
+  const HtmlWarningCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
 
   @override
   ErrorSeverity get errorSeverity => ErrorSeverity.WARNING;
@@ -3408,7 +3344,7 @@
    *
    * @param numTypeArgument the number of provided type arguments
    */
-  static final StaticTypeWarningCode EXPECTED_ONE_LIST_TYPE_ARGUMENTS = new StaticTypeWarningCode.con1('EXPECTED_ONE_LIST_TYPE_ARGUMENTS', 0, "List literal requires exactly one type arguments or none, but %d found");
+  static const StaticTypeWarningCode EXPECTED_ONE_LIST_TYPE_ARGUMENTS = const StaticTypeWarningCode.con1('EXPECTED_ONE_LIST_TYPE_ARGUMENTS', 0, "List literal requires exactly one type arguments or none, but %d found");
 
   /**
    * 12.8 Maps: A fresh instance (7.6.1) <i>m</i>, of size <i>n</i>, whose class implements the
@@ -3416,7 +3352,7 @@
    *
    * @param numTypeArgument the number of provided type arguments
    */
-  static final StaticTypeWarningCode EXPECTED_TWO_MAP_TYPE_ARGUMENTS = new StaticTypeWarningCode.con1('EXPECTED_TWO_MAP_TYPE_ARGUMENTS', 1, "Map literal requires exactly two type arguments or none, but %d found");
+  static const StaticTypeWarningCode EXPECTED_TWO_MAP_TYPE_ARGUMENTS = const StaticTypeWarningCode.con1('EXPECTED_TWO_MAP_TYPE_ARGUMENTS', 1, "Map literal requires exactly two type arguments or none, but %d found");
 
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
@@ -3424,7 +3360,7 @@
    *
    * @see #UNDEFINED_SETTER
    */
-  static final StaticTypeWarningCode INACCESSIBLE_SETTER = new StaticTypeWarningCode.con1('INACCESSIBLE_SETTER', 2, "");
+  static const StaticTypeWarningCode INACCESSIBLE_SETTER = const StaticTypeWarningCode.con1('INACCESSIBLE_SETTER', 2, "");
 
   /**
    * 8.1.1 Inheritance and Overriding: However, if there are multiple members <i>m<sub>1</sub>,
@@ -3446,7 +3382,7 @@
    * * Otherwise none of the members <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i> is inherited.
    * </ol>
    */
-  static final StaticTypeWarningCode INCONSISTENT_METHOD_INHERITANCE = new StaticTypeWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE', 3, "'%s' is inherited by at least two interfaces inconsistently, from %s");
+  static const StaticTypeWarningCode INCONSISTENT_METHOD_INHERITANCE = const StaticTypeWarningCode.con1('INCONSISTENT_METHOD_INHERITANCE', 3, "'%s' is inherited by at least two interfaces inconsistently, from %s");
 
   /**
    * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does not have an
@@ -3455,7 +3391,7 @@
    * @param memberName the name of the static member
    * @see UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
    */
-  static final StaticTypeWarningCode INSTANCE_ACCESS_TO_STATIC_MEMBER = new StaticTypeWarningCode.con1('INSTANCE_ACCESS_TO_STATIC_MEMBER', 4, "Static member '%s' cannot be accessed using instance access");
+  static const StaticTypeWarningCode INSTANCE_ACCESS_TO_STATIC_MEMBER = const StaticTypeWarningCode.con1('INSTANCE_ACCESS_TO_STATIC_MEMBER', 4, "Static member '%s' cannot be accessed using instance access");
 
   /**
    * 12.18 Assignment: It is a static type warning if the static type of <i>e</i> may not be
@@ -3472,7 +3408,7 @@
    * @param rhsTypeName the name of the right hand side type
    * @param lhsTypeName the name of the left hand side type
    */
-  static final StaticTypeWarningCode INVALID_ASSIGNMENT = new StaticTypeWarningCode.con1('INVALID_ASSIGNMENT', 5, "A value of type '%s' cannot be assigned to a variable of type '%s'");
+  static const StaticTypeWarningCode INVALID_ASSIGNMENT = const StaticTypeWarningCode.con1('INVALID_ASSIGNMENT', 5, "A value of type '%s' cannot be assigned to a variable of type '%s'");
 
   /**
    * 12.15.1 Ordinary Invocation: An ordinary method invocation <i>i</i> has the form
@@ -3494,7 +3430,7 @@
    *
    * @param nonFunctionIdentifier the name of the identifier that is not a function type
    */
-  static final StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION = new StaticTypeWarningCode.con1('INVOCATION_OF_NON_FUNCTION', 6, "'%s' is not a method");
+  static const StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION = const StaticTypeWarningCode.con1('INVOCATION_OF_NON_FUNCTION', 6, "'%s' is not a method");
 
   /**
    * 12.14.4 Function Expression Invocation: A function expression invocation <i>i</i> has the form
@@ -3504,7 +3440,7 @@
    * It is a static type warning if the static type <i>F</i> of <i>e<sub>f</sub></i> may not be
    * assigned to a function type.
    */
-  static final StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION_EXPRESSION = new StaticTypeWarningCode.con1('INVOCATION_OF_NON_FUNCTION_EXPRESSION', 7, "Cannot invoke a non-function");
+  static const StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION_EXPRESSION = const StaticTypeWarningCode.con1('INVOCATION_OF_NON_FUNCTION_EXPRESSION', 7, "Cannot invoke a non-function");
 
   /**
    * 12.20 Conditional: It is a static type warning if the type of <i>e<sub>1</sub></i> may not be
@@ -3517,13 +3453,13 @@
    *
    * 13.8 Do: It is a static type warning if the type of <i>e</i> cannot be assigned to bool.
    */
-  static final StaticTypeWarningCode NON_BOOL_CONDITION = new StaticTypeWarningCode.con1('NON_BOOL_CONDITION', 8, "Conditions must have a static type of 'bool'");
+  static const StaticTypeWarningCode NON_BOOL_CONDITION = const StaticTypeWarningCode.con1('NON_BOOL_CONDITION', 8, "Conditions must have a static type of 'bool'");
 
   /**
    * 13.15 Assert: It is a static type warning if the type of <i>e</i> may not be assigned to either
    * bool or () &rarr; bool
    */
-  static final StaticTypeWarningCode NON_BOOL_EXPRESSION = new StaticTypeWarningCode.con1('NON_BOOL_EXPRESSION', 9, "Assertions must be on either a 'bool' or '() -> bool'");
+  static const StaticTypeWarningCode NON_BOOL_EXPRESSION = const StaticTypeWarningCode.con1('NON_BOOL_EXPRESSION', 9, "Assertions must be on either a 'bool' or '() -> bool'");
 
   /**
    * 12.28 Unary Expressions: The expression !<i>e</i> is equivalent to the expression
@@ -3532,13 +3468,13 @@
    * 12.20 Conditional: It is a static type warning if the type of <i>e<sub>1</sub></i> may not be
    * assigned to bool.
    */
-  static final StaticTypeWarningCode NON_BOOL_NEGATION_EXPRESSION = new StaticTypeWarningCode.con1('NON_BOOL_NEGATION_EXPRESSION', 10, "Negation argument must have a static type of 'bool'");
+  static const StaticTypeWarningCode NON_BOOL_NEGATION_EXPRESSION = const StaticTypeWarningCode.con1('NON_BOOL_NEGATION_EXPRESSION', 10, "Negation argument must have a static type of 'bool'");
 
   /**
    * 15.8 Parameterized Types: It is a static type warning if <i>A<sub>i</sub>, 1 &lt;= i &lt;=
    * n</i> does not denote a type in the enclosing lexical scope.
    */
-  static final StaticTypeWarningCode NON_TYPE_AS_TYPE_ARGUMENT = new StaticTypeWarningCode.con1('NON_TYPE_AS_TYPE_ARGUMENT', 11, "The name '%s' is not a type and cannot be used as a parameterized type");
+  static const StaticTypeWarningCode NON_TYPE_AS_TYPE_ARGUMENT = const StaticTypeWarningCode.con1('NON_TYPE_AS_TYPE_ARGUMENT', 11, "The name '%s' is not a type and cannot be used as a parameterized type");
 
   /**
    * 13.11 Return: It is a static type warning if the type of <i>e</i> may not be assigned to the
@@ -3548,7 +3484,7 @@
    * @param expectedReturnType the expected return type as defined by the method
    * @param methodName the name of the method
    */
-  static final StaticTypeWarningCode RETURN_OF_INVALID_TYPE = new StaticTypeWarningCode.con1('RETURN_OF_INVALID_TYPE', 12, "The return type '%s' is not a '%s', as defined by the method '%s'");
+  static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE = const StaticTypeWarningCode.con1('RETURN_OF_INVALID_TYPE', 12, "The return type '%s' is not a '%s', as defined by the method '%s'");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -3572,7 +3508,7 @@
    * @param boundingTypeName the name of the bounding type
    * @see #TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND
    */
-  static final StaticTypeWarningCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = new StaticTypeWarningCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 13, "'%s' does not extend '%s'");
+  static const StaticTypeWarningCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const StaticTypeWarningCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 13, "'%s' does not extend '%s'");
 
   /**
    * 10 Generics: It is a static type warning if a type parameter is a supertype of its upper bound.
@@ -3580,7 +3516,7 @@
    * @param typeParameterName the name of the type parameter
    * @see #TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  static final StaticTypeWarningCode TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND = new StaticTypeWarningCode.con1('TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND', 14, "'%s' cannot be a supertype of its upper bound");
+  static const StaticTypeWarningCode TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND = const StaticTypeWarningCode.con1('TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND', 14, "'%s' cannot be a supertype of its upper bound");
 
   /**
    * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is a static type
@@ -3589,7 +3525,7 @@
    * @param getterName the name of the getter
    * @param enclosingType the name of the enclosing type where the getter is being looked for
    */
-  static final StaticTypeWarningCode UNDEFINED_GETTER = new StaticTypeWarningCode.con1('UNDEFINED_GETTER', 15, "There is no such getter '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_GETTER = const StaticTypeWarningCode.con1('UNDEFINED_GETTER', 15, "There is no such getter '%s' in '%s'");
 
   /**
    * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>. It is a static type
@@ -3598,7 +3534,7 @@
    * @param methodName the name of the method that is undefined
    * @param typeName the resolved type name that the method lookup is happening on
    */
-  static final StaticTypeWarningCode UNDEFINED_METHOD = new StaticTypeWarningCode.con1('UNDEFINED_METHOD', 16, "The method '%s' is not defined for the class '%s'");
+  static const StaticTypeWarningCode UNDEFINED_METHOD = const StaticTypeWarningCode.con1('UNDEFINED_METHOD', 16, "The method '%s' is not defined for the class '%s'");
 
   /**
    * 12.18 Assignment: Evaluation of an assignment of the form
@@ -3616,7 +3552,7 @@
    * @param operator the name of the operator
    * @param enclosingType the name of the enclosing type where the operator is being looked for
    */
-  static final StaticTypeWarningCode UNDEFINED_OPERATOR = new StaticTypeWarningCode.con1('UNDEFINED_OPERATOR', 17, "There is no such operator '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_OPERATOR = const StaticTypeWarningCode.con1('UNDEFINED_OPERATOR', 17, "There is no such operator '%s' in '%s'");
 
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
@@ -3626,7 +3562,7 @@
    * @param enclosingType the name of the enclosing type where the setter is being looked for
    * @see #INACCESSIBLE_SETTER
    */
-  static final StaticTypeWarningCode UNDEFINED_SETTER = new StaticTypeWarningCode.con1('UNDEFINED_SETTER', 18, "There is no such setter '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_SETTER = const StaticTypeWarningCode.con1('UNDEFINED_SETTER', 18, "There is no such setter '%s' in '%s'");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -3637,7 +3573,7 @@
    * @param methodName the name of the method that is undefined
    * @param typeName the resolved type name that the method lookup is happening on
    */
-  static final StaticTypeWarningCode UNDEFINED_SUPER_METHOD = new StaticTypeWarningCode.con1('UNDEFINED_SUPER_METHOD', 19, "There is no such method '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_SUPER_METHOD = const StaticTypeWarningCode.con1('UNDEFINED_SUPER_METHOD', 19, "There is no such method '%s' in '%s'");
 
   /**
    * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does not have an
@@ -3647,7 +3583,7 @@
    * able to find the name defined in a supertype. It exists to provide a more informative error
    * message.
    */
-  static final StaticTypeWarningCode UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER = new StaticTypeWarningCode.con1('UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER', 20, "Static members from supertypes must be qualified by the name of the defining type");
+  static const StaticTypeWarningCode UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER = const StaticTypeWarningCode.con1('UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER', 20, "Static members from supertypes must be qualified by the name of the defining type");
 
   /**
    * 15.8 Parameterized Types: It is a static type warning if <i>G</i> is not a generic type with
@@ -3659,9 +3595,9 @@
    * @see CompileTimeErrorCode#CONST_WITH_INVALID_TYPE_PARAMETERS
    * @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
    */
-  static final StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = new StaticTypeWarningCode.con1('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 21, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static const StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = const StaticTypeWarningCode.con1('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 21, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
-  static final List<StaticTypeWarningCode> values = [
+  static const List<StaticTypeWarningCode> values = const [
       EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
       EXPECTED_TWO_MAP_TYPE_ARGUMENTS,
       INACCESSIBLE_SETTER,
@@ -3688,22 +3624,20 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  String message;
+  final String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
    * there is no correction information for this error.
    */
-  String correction6;
+  final String correction;
 
   /**
    * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  StaticTypeWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
-    this.message = message;
-  }
+  const StaticTypeWarningCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -3711,13 +3645,7 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  StaticTypeWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
-    this.message = message;
-    this.correction6 = correction;
-  }
-
-  @override
-  String get correction => correction6;
+  const StaticTypeWarningCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
 
   @override
   ErrorSeverity get errorSeverity => ErrorType.STATIC_TYPE_WARNING.severity;
diff --git a/pkg/analyzer/lib/src/generated/html.dart b/pkg/analyzer/lib/src/generated/html.dart
index 12d0e2e..7777598 100644
--- a/pkg/analyzer/lib/src/generated/html.dart
+++ b/pkg/analyzer/lib/src/generated/html.dart
@@ -26,7 +26,7 @@
   /**
    * The offset from the beginning of the file to the first character in the token.
    */
-  int _offset = 0;
+  final int offset;
 
   /**
    * The previous token in the token stream.
@@ -41,7 +41,7 @@
   /**
    * The type of the token.
    */
-  TokenType _type;
+  final TokenType type;
 
   /**
    * The lexeme represented by this token.
@@ -63,10 +63,8 @@
    * @param offset the offset from the beginning of the file to the first character in the token
    * @param value the lexeme represented by this token (not `null`)
    */
-  Token.con2(TokenType type, int offset, String value) {
-    this._type = type;
+  Token.con2(this.type, this.offset, String value) {
     this._value = StringUtilities.intern(value);
-    this._offset = offset;
   }
 
   /**
@@ -76,7 +74,7 @@
    * @return the offset from the beginning of the file to the first character after last character
    *         of the token
    */
-  int get end => _offset + length;
+  int get end => offset + length;
 
   /**
    * Return the number of characters in the node's source range.
@@ -100,20 +98,6 @@
   Token get next => _next;
 
   /**
-   * Return the offset from the beginning of the file to the first character in the token.
-   *
-   * @return the offset from the beginning of the file to the first character in the token
-   */
-  int get offset => _offset;
-
-  /**
-   * Answer the token type for the receiver.
-   *
-   * @return the token type (not `null`)
-   */
-  TokenType get type => _type;
-
-  /**
    * Return `true` if this token is a synthetic token. A synthetic token is a token that was
    * introduced by the parser in order to recover from an error in the code. Synthetic tokens always
    * have a length of zero (`0`).
@@ -144,11 +128,9 @@
  * characters.
  */
 class RawXmlExpression extends XmlExpression {
-  Expression expression;
+  final Expression expression;
 
-  RawXmlExpression(Expression expression) {
-    this.expression = expression;
-  }
+  RawXmlExpression(this.expression);
 
   @override
   int get end => expression.end;
@@ -621,7 +603,7 @@
     builder.append("Attempt to create recursive structure: ");
     XmlNode current = newParent;
     while (current != null) {
-      if (current != newParent) {
+      if (!identical(current, newParent)) {
         builder.append(" -> ");
       }
       if (identical(current, this)) {
@@ -684,7 +666,7 @@
   /**
    * The source being scanned.
    */
-  Source source;
+  final Source source;
 
   /**
    * The token pointing to the head of the linked list of tokens.
@@ -711,8 +693,7 @@
    *
    * @param source the source being scanned
    */
-  AbstractScanner(Source source) {
-    this.source = source;
+  AbstractScanner(this.source) {
     _tokens = new Token.con1(TokenType.EOF, -1);
     _tokens.setNext(_tokens);
     _tail = _tokens;
@@ -1002,7 +983,7 @@
   /**
    * The string from which characters will be read.
    */
-  String _string;
+  final String _string;
 
   /**
    * The number of characters in the string.
@@ -1020,9 +1001,8 @@
    * @param source the source being scanned
    * @param string the string from which characters will be read
    */
-  StringScanner(Source source, String string) : super(source) {
-    this._string = string;
-    this._stringLength = string.length;
+  StringScanner(Source source, this._string) : super(source) {
+    this._stringLength = _string.length;
     this._charOffset = -1;
   }
 
@@ -1062,7 +1042,7 @@
   /**
    * The writer to which the source is to be written.
    */
-  PrintWriter _writer;
+  final PrintWriter _writer;
 
   /**
    * Initialize a newly created visitor to write source code representing the visited nodes to the
@@ -1070,9 +1050,7 @@
    *
    * @param writer the writer to which the source is to be written
    */
-  ToSourceVisitor(PrintWriter writer) {
-    this._writer = writer;
-  }
+  ToSourceVisitor(this._writer);
 
   @override
   Object visitHtmlScriptTagNode(HtmlScriptTagNode node) => visitXmlTagNode(node);
@@ -1144,31 +1122,31 @@
   /**
    * The type of the token that marks the end of the input.
    */
-  static final TokenType EOF = new TokenType_EOF('EOF', 0, "");
+  static const TokenType EOF = const TokenType_EOF('EOF', 0, "");
 
-  static final TokenType EQ = new TokenType('EQ', 1, "=");
+  static const TokenType EQ = const TokenType('EQ', 1, "=");
 
-  static final TokenType GT = new TokenType('GT', 2, ">");
+  static const TokenType GT = const TokenType('GT', 2, ">");
 
-  static final TokenType LT_SLASH = new TokenType('LT_SLASH', 3, "</");
+  static const TokenType LT_SLASH = const TokenType('LT_SLASH', 3, "</");
 
-  static final TokenType LT = new TokenType('LT', 4, "<");
+  static const TokenType LT = const TokenType('LT', 4, "<");
 
-  static final TokenType SLASH_GT = new TokenType('SLASH_GT', 5, "/>");
+  static const TokenType SLASH_GT = const TokenType('SLASH_GT', 5, "/>");
 
-  static final TokenType COMMENT = new TokenType('COMMENT', 6, null);
+  static const TokenType COMMENT = const TokenType('COMMENT', 6, null);
 
-  static final TokenType DECLARATION = new TokenType('DECLARATION', 7, null);
+  static const TokenType DECLARATION = const TokenType('DECLARATION', 7, null);
 
-  static final TokenType DIRECTIVE = new TokenType('DIRECTIVE', 8, null);
+  static const TokenType DIRECTIVE = const TokenType('DIRECTIVE', 8, null);
 
-  static final TokenType STRING = new TokenType('STRING', 9, null);
+  static const TokenType STRING = const TokenType('STRING', 9, null);
 
-  static final TokenType TAG = new TokenType('TAG', 10, null);
+  static const TokenType TAG = const TokenType('TAG', 10, null);
 
-  static final TokenType TEXT = new TokenType('TEXT', 11, null);
+  static const TokenType TEXT = const TokenType('TEXT', 11, null);
 
-  static final List<TokenType> values = [
+  static const List<TokenType> values = const [
       EOF,
       EQ,
       GT,
@@ -1186,15 +1164,13 @@
    * The lexeme that defines this type of token, or `null` if there is more than one possible
    * lexeme for this type of token.
    */
-  String lexeme;
+  final String lexeme;
 
-  TokenType(String name, int ordinal, String lexeme) : super(name, ordinal) {
-    this.lexeme = lexeme;
-  }
+  const TokenType(String name, int ordinal, this.lexeme) : super(name, ordinal);
 }
 
 class TokenType_EOF extends TokenType {
-  TokenType_EOF(String name, int ordinal, String arg0) : super(name, ordinal, arg0);
+  const TokenType_EOF(String name, int ordinal, String arg0) : super(name, ordinal, arg0);
 
   @override
   String toString() => "-eof-";
@@ -1204,11 +1180,11 @@
  * Instances of `XmlAttributeNode` represent name/value pairs owned by an [XmlTagNode].
  */
 class XmlAttributeNode extends XmlNode {
-  Token _name;
+  final Token _name;
 
-  Token equals;
+  final Token equals;
 
-  Token _value;
+  final Token _value;
 
   List<XmlExpression> expressions = XmlExpression.EMPTY_ARRAY;
 
@@ -1220,11 +1196,7 @@
    * @param equals the equals sign or `null` if none
    * @param value the value token (not `null`)
    */
-  XmlAttributeNode(Token name, Token equals, Token value) {
-    this._name = name;
-    this.equals = equals;
-    this._value = value;
-  }
+  XmlAttributeNode(this._name, this.equals, this._value);
 
   @override
   accept(XmlVisitor visitor) => visitor.visitXmlAttributeNode(this);
@@ -1374,7 +1346,7 @@
   /**
    * The source being parsed.
    */
-  Source source;
+  final Source source;
 
   /**
    * The next token to be parsed.
@@ -1386,9 +1358,7 @@
    *
    * @param source the source being parsed
    */
-  XmlParser(Source source) {
-    this.source = source;
-  }
+  XmlParser(this.source);
 
   /**
    * Create a node representing an attribute.
@@ -1435,9 +1405,9 @@
     List<XmlTagNode> tagNodes = new List<XmlTagNode>();
     TokenType type = _currentToken.type;
     while (type != TokenType.EOF) {
-      if (identical(type, TokenType.LT)) {
+      if (type == TokenType.LT) {
         tagNodes.add(_parseTagNode());
-      } else if (identical(type, TokenType.DECLARATION) || identical(type, TokenType.DIRECTIVE) || identical(type, TokenType.COMMENT)) {
+      } else if (type == TokenType.DECLARATION || type == TokenType.DIRECTIVE || type == TokenType.COMMENT) {
         // ignored tokens
         _currentToken = _currentToken.next;
       } else {
@@ -1481,7 +1451,7 @@
     _currentToken = _currentToken.next;
     // Equals sign
     Token equals;
-    if (identical(_currentToken.type, TokenType.EQ)) {
+    if (_currentToken.type == TokenType.EQ) {
       equals = _currentToken;
       _currentToken = _currentToken.next;
     } else {
@@ -1490,7 +1460,7 @@
     }
     // String value
     Token value;
-    if (identical(_currentToken.type, TokenType.STRING)) {
+    if (_currentToken.type == TokenType.STRING) {
       value = _currentToken;
       _currentToken = _currentToken.next;
     } else {
@@ -1508,12 +1478,12 @@
    */
   List<XmlAttributeNode> _parseAttributes() {
     TokenType type = _currentToken.type;
-    if (identical(type, TokenType.GT) || identical(type, TokenType.SLASH_GT) || identical(type, TokenType.EOF)) {
+    if (type == TokenType.GT || type == TokenType.SLASH_GT || type == TokenType.EOF) {
       return XmlTagNode.NO_ATTRIBUTES;
     }
     List<XmlAttributeNode> attributes = new List<XmlAttributeNode>();
     while (type != TokenType.GT && type != TokenType.SLASH_GT && type != TokenType.EOF) {
-      if (identical(type, TokenType.TAG)) {
+      if (type == TokenType.TAG) {
         attributes.add(_parseAttribute());
       } else {
         _reportUnexpectedToken();
@@ -1532,14 +1502,14 @@
    */
   List<XmlTagNode> _parseChildTagNodes() {
     TokenType type = _currentToken.type;
-    if (identical(type, TokenType.LT_SLASH) || identical(type, TokenType.EOF)) {
+    if (type == TokenType.LT_SLASH || type == TokenType.EOF) {
       return XmlTagNode.NO_TAG_NODES;
     }
     List<XmlTagNode> nodes = new List<XmlTagNode>();
     while (type != TokenType.LT_SLASH && type != TokenType.EOF) {
-      if (identical(type, TokenType.LT)) {
+      if (type == TokenType.LT) {
         nodes.add(_parseTagNode());
-      } else if (identical(type, TokenType.COMMENT)) {
+      } else if (type == TokenType.COMMENT) {
         // ignored token
         _currentToken = _currentToken.next;
       } else {
@@ -1563,7 +1533,7 @@
     _currentToken = _currentToken.next;
     // Get the tag or create a synthetic tag and report an error
     Token tag;
-    if (identical(_currentToken.type, TokenType.TAG)) {
+    if (_currentToken.type == TokenType.TAG) {
       tag = _currentToken;
       _currentToken = _currentToken.next;
     } else {
@@ -1574,7 +1544,7 @@
     List<XmlAttributeNode> attributes = _parseAttributes();
     // Token ending attribute list
     Token attributeEnd;
-    if (identical(_currentToken.type, TokenType.GT) || identical(_currentToken.type, TokenType.SLASH_GT)) {
+    if (_currentToken.type == TokenType.GT || _currentToken.type == TokenType.SLASH_GT) {
       attributeEnd = _currentToken;
       _currentToken = _currentToken.next;
     } else {
@@ -1582,14 +1552,14 @@
       attributeEnd = _insertSyntheticToken(TokenType.SLASH_GT);
     }
     // If the node has no children, then return the node
-    if (identical(attributeEnd.type, TokenType.SLASH_GT) || isSelfClosing(tag)) {
+    if (attributeEnd.type == TokenType.SLASH_GT || isSelfClosing(tag)) {
       return createTagNode(nodeStart, tag, attributes, attributeEnd, XmlTagNode.NO_TAG_NODES, _currentToken, null, attributeEnd);
     }
     // Parse the child tag nodes
     List<XmlTagNode> tagNodes = _parseChildTagNodes();
     // Token ending child tag nodes
     Token contentEnd;
-    if (identical(_currentToken.type, TokenType.LT_SLASH)) {
+    if (_currentToken.type == TokenType.LT_SLASH) {
       contentEnd = _currentToken;
       _currentToken = _currentToken.next;
     } else {
@@ -1600,7 +1570,7 @@
     }
     // Closing tag
     Token closingTag;
-    if (identical(_currentToken.type, TokenType.TAG)) {
+    if (_currentToken.type == TokenType.TAG) {
       closingTag = _currentToken;
       _currentToken = _currentToken.next;
     } else {
@@ -1609,7 +1579,7 @@
     }
     // Token ending node
     Token nodeEnd;
-    if (identical(_currentToken.type, TokenType.GT)) {
+    if (_currentToken.type == TokenType.GT) {
       nodeEnd = _currentToken;
       _currentToken = _currentToken.next;
     } else {
@@ -1644,12 +1614,12 @@
   /**
    * The starting [TokenType#LT] token (not `null`).
    */
-  Token nodeStart;
+  final Token nodeStart;
 
   /**
    * The [TokenType#TAG] token after the starting '&lt;' (not `null`).
    */
-  Token _tag;
+  final Token _tag;
 
   /**
    * The attributes contained by the receiver (not `null`, contains no `null`s).
@@ -1661,7 +1631,7 @@
    * `null`). The token may be the same token as [nodeEnd] if there are no child
    * [tagNodes].
    */
-  Token attributeEnd;
+  final Token attributeEnd;
 
   /**
    * The tag nodes contained in the receiver (not `null`, contains no `null`s).
@@ -1677,18 +1647,18 @@
    * the stream [TokenType#LT_SLASH] token after the content, or `null` if there is no
    * content and the attributes ended with [TokenType#SLASH_GT].
    */
-  Token contentEnd;
+  final Token contentEnd;
 
   /**
    * The closing [TokenType#TAG] after the child elements or `null` if there is no
    * content and the attributes ended with [TokenType#SLASH_GT]
    */
-  Token closingTag;
+  final Token closingTag;
 
   /**
    * The ending [TokenType#GT] or [TokenType#SLASH_GT] token (not `null`).
    */
-  Token nodeEnd;
+  final Token nodeEnd;
 
   /**
    * The expressions that are embedded in the tag's content.
@@ -1719,15 +1689,9 @@
    * @param nodeEnd the ending [TokenType#GT] or [TokenType#SLASH_GT] token (not
    *          `null`)
    */
-  XmlTagNode(Token nodeStart, Token tag, List<XmlAttributeNode> attributes, Token attributeEnd, List<XmlTagNode> tagNodes, Token contentEnd, Token closingTag, Token nodeEnd) {
-    this.nodeStart = nodeStart;
-    this._tag = tag;
+  XmlTagNode(this.nodeStart, this._tag, List<XmlAttributeNode> attributes, this.attributeEnd, List<XmlTagNode> tagNodes, this.contentEnd, this.closingTag, this.nodeEnd) {
     this._attributes = becomeParentOfAll(attributes, ifEmpty: NO_ATTRIBUTES);
-    this.attributeEnd = attributeEnd;
     this._tagNodes = becomeParentOfAll(tagNodes, ifEmpty: NO_TAG_NODES);
-    this.contentEnd = contentEnd;
-    this.closingTag = closingTag;
-    this.nodeEnd = nodeEnd;
   }
 
   @override
@@ -1791,7 +1755,7 @@
       return content;
     }
     JavaStringBuilder buffer = new JavaStringBuilder();
-    while (token != contentEnd) {
+    while (!identical(token, contentEnd)) {
       buffer.append(token.lexeme);
       token = token.next;
     }
@@ -1867,7 +1831,7 @@
   /**
    * The error listener to which errors will be reported.
    */
-  AnalysisErrorListener _errorListener;
+  final AnalysisErrorListener _errorListener;
 
   static String _APPLICATION_DART_IN_DOUBLE_QUOTES = "\"application/dart\"";
 
@@ -1917,9 +1881,7 @@
    * @param source the source being parsed
    * @param errorListener the error listener to which errors will be reported
    */
-  HtmlParser(Source source, AnalysisErrorListener errorListener) : super(source) {
-    this._errorListener = errorListener;
-  }
+  HtmlParser(Source source, this._errorListener) : super(source);
 
   /**
    * Parse the given tokens.
@@ -1991,13 +1953,13 @@
   /**
    * The first token in the token stream that was parsed to form this HTML unit.
    */
-  Token beginToken;
+  final Token beginToken;
 
   /**
    * The last token in the token stream that was parsed to form this compilation unit. This token
    * should always have a type of [TokenType.EOF].
    */
-  Token endToken;
+  final Token endToken;
 
   /**
    * The tag nodes contained in the receiver (not `null`, contains no `null`s).
@@ -2012,10 +1974,8 @@
    * @param endToken the last token in the token stream which should be of type
    *          [TokenType.EOF]
    */
-  HtmlUnit(Token beginToken, List<XmlTagNode> tagNodes, Token endToken) {
-    this.beginToken = beginToken;
+  HtmlUnit(this.beginToken, List<XmlTagNode> tagNodes, this.endToken) {
     this._tagNodes = becomeParentOfAll(tagNodes);
-    this.endToken = endToken;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/index.dart b/pkg/analyzer/lib/src/generated/index.dart
index 7d60cd8..544f582 100644
--- a/pkg/analyzer/lib/src/generated/index.dart
+++ b/pkg/analyzer/lib/src/generated/index.dart
@@ -26,17 +26,17 @@
   /**
    * The index store against which this operation is being run.
    */
-  IndexStore _indexStore;
+  final IndexStore _indexStore;
 
   /**
    * The context in which source being removed.
    */
-  AnalysisContext _context;
+  final AnalysisContext _context;
 
   /**
    * The source being removed.
    */
-  Source source;
+  final Source source;
 
   /**
    * Initialize a newly created operation that will remove the specified resource.
@@ -45,11 +45,7 @@
    * @param context the [AnalysisContext] to remove source in
    * @param source the [Source] to remove from index
    */
-  RemoveSourceOperation(IndexStore indexStore, AnalysisContext context, Source source) {
-    this._indexStore = indexStore;
-    this._context = context;
-    this.source = source;
-  }
+  RemoveSourceOperation(this._indexStore, this._context, this.source);
 
   @override
   bool get isQuery => false;
@@ -536,20 +532,17 @@
 }
 
 class MemoryIndexStoreImpl_ElementRelationKey {
-  Element _element;
+  final Element _element;
 
-  Relationship _relationship;
+  final Relationship _relationship;
 
-  MemoryIndexStoreImpl_ElementRelationKey(Element element, Relationship relationship) {
-    this._element = element;
-    this._relationship = relationship;
-  }
+  MemoryIndexStoreImpl_ElementRelationKey(this._element, this._relationship);
 
   @override
   bool operator ==(Object obj) {
     MemoryIndexStoreImpl_ElementRelationKey other = obj as MemoryIndexStoreImpl_ElementRelationKey;
     Element otherElement = other._element;
-    return identical(other._relationship, _relationship) && otherElement.nameOffset == _element.nameOffset && identical(otherElement.kind, _element.kind) && otherElement.displayName == _element.displayName && otherElement.source == _element.source;
+    return identical(other._relationship, _relationship) && otherElement.nameOffset == _element.nameOffset && otherElement.kind == _element.kind && otherElement.displayName == _element.displayName && otherElement.source == _element.source;
   }
 
   @override
@@ -565,14 +558,11 @@
 }
 
 class MemoryIndexStoreImpl_Source2 {
-  Source _librarySource;
+  final Source _librarySource;
 
-  Source _unitSource;
+  final Source _unitSource;
 
-  MemoryIndexStoreImpl_Source2(Source librarySource, Source unitSource) {
-    this._librarySource = librarySource;
-    this._unitSource = unitSource;
-  }
+  MemoryIndexStoreImpl_Source2(this._librarySource, this._unitSource);
 
   @override
   bool operator ==(Object obj) {
@@ -601,17 +591,17 @@
   /**
    * The index store against which this operation is being run.
    */
-  IndexStore _indexStore;
+  final IndexStore _indexStore;
 
   /**
    * The context in which compilation unit was resolved.
    */
-  AnalysisContext _context;
+  final AnalysisContext _context;
 
   /**
    * The compilation unit being indexed.
    */
-  CompilationUnit unit;
+  final CompilationUnit unit;
 
   /**
    * The element of the compilation unit being indexed.
@@ -630,10 +620,7 @@
    * @param context the context in which compilation unit was resolved
    * @param unit the fully resolved AST structure
    */
-  IndexUnitOperation(IndexStore indexStore, AnalysisContext context, CompilationUnit unit) {
-    this._indexStore = indexStore;
-    this._context = context;
-    this.unit = unit;
+  IndexUnitOperation(this._indexStore, this._context, this.unit) {
     this._unitElement = unit.element;
     this._source = _unitElement.source;
   }
@@ -718,7 +705,7 @@
   /**
    * The unique identifier for this relationship.
    */
-  String _uniqueId;
+  final String _uniqueId;
 
   /**
    * A table mapping relationship identifiers to relationships.
@@ -750,9 +737,7 @@
    *
    * @param uniqueId the unique identifier for this relationship
    */
-  Relationship(String uniqueId) {
-    this._uniqueId = uniqueId;
-  }
+  Relationship(this._uniqueId);
 
   /**
    * Return the unique identifier for this relationship.
@@ -773,17 +758,17 @@
   /**
    * The index store against which this operation is being run.
    */
-  IndexStore _indexStore;
+  final IndexStore _indexStore;
 
   /**
    * The context to remove container.
    */
-  AnalysisContext _context;
+  final AnalysisContext _context;
 
   /**
    * The source container to remove.
    */
-  SourceContainer container;
+  final SourceContainer container;
 
   /**
    * Initialize a newly created operation that will remove the specified resource.
@@ -792,11 +777,7 @@
    * @param context the [AnalysisContext] to remove container in
    * @param container the [SourceContainer] to remove from index
    */
-  RemoveSourcesOperation(IndexStore indexStore, AnalysisContext context, SourceContainer container) {
-    this._indexStore = indexStore;
-    this._context = context;
-    this.container = container;
-  }
+  RemoveSourcesOperation(this._indexStore, this._context, this.container);
 
   @override
   bool get isQuery => false;
@@ -829,26 +810,26 @@
   /**
    * The processor is ready to be run (has not been run before).
    */
-  static final ProcessorState READY = new ProcessorState('READY', 0);
+  static const ProcessorState READY = const ProcessorState('READY', 0);
 
   /**
    * The processor is currently performing operations.
    */
-  static final ProcessorState RUNNING = new ProcessorState('RUNNING', 1);
+  static const ProcessorState RUNNING = const ProcessorState('RUNNING', 1);
 
   /**
    * The processor is currently performing operations but has been asked to stop.
    */
-  static final ProcessorState STOP_REQESTED = new ProcessorState('STOP_REQESTED', 2);
+  static const ProcessorState STOP_REQESTED = const ProcessorState('STOP_REQESTED', 2);
 
   /**
    * The processor has stopped performing operations and cannot be used again.
    */
-  static final ProcessorState STOPPED = new ProcessorState('STOPPED', 3);
+  static const ProcessorState STOPPED = const ProcessorState('STOPPED', 3);
 
-  static final List<ProcessorState> values = [READY, RUNNING, STOP_REQESTED, STOPPED];
+  static const List<ProcessorState> values = const [READY, RUNNING, STOP_REQESTED, STOPPED];
 
-  ProcessorState(String name, int ordinal) : super(name, ordinal);
+  const ProcessorState(String name, int ordinal) : super(name, ordinal);
 }
 
 /**
@@ -1003,7 +984,7 @@
   /**
    * The [IndexStore] to record relations into.
    */
-  IndexStore _store;
+  final IndexStore _store;
 
   /**
    * The index contributor used to index Dart [Expression]s.
@@ -1017,9 +998,8 @@
    *
    * @param store the [IndexStore] to record relations into.
    */
-  AngularHtmlIndexContributor(IndexStore store) {
-    this._store = store;
-    _indexContributor = new IndexContributor_AngularHtmlIndexContributor(store, this);
+  AngularHtmlIndexContributor(this._store) {
+    _indexContributor = new IndexContributor_AngularHtmlIndexContributor(_store, this);
   }
 
   @override
@@ -1568,7 +1548,7 @@
     return false;
   }
 
-  IndexStore _store;
+  final IndexStore _store;
 
   LibraryElement _libraryElement;
 
@@ -1580,9 +1560,7 @@
    */
   Queue<Element> _elementStack = new Queue();
 
-  IndexContributor(IndexStore store) {
-    this._store = store;
-  }
+  IndexContributor(this._store);
 
   /**
    * Enter a new scope represented by the given [Element].
@@ -2194,11 +2172,9 @@
  * [IndexStore].
  */
 class AngularDartIndexContributor extends GeneralizingAstVisitor<Object> {
-  IndexStore _store;
+  final IndexStore _store;
 
-  AngularDartIndexContributor(IndexStore store) {
-    this._store = store;
-  }
+  AngularDartIndexContributor(this._store);
 
   @override
   Object visitClassDeclaration(ClassDeclaration node) {
@@ -2270,12 +2246,12 @@
   /**
    * The index store against which this operation is being run.
    */
-  IndexStore _indexStore;
+  final IndexStore _indexStore;
 
   /**
    * The context being removed.
    */
-  AnalysisContext context;
+  final AnalysisContext context;
 
   /**
    * Initialize a newly created operation that will remove the specified resource.
@@ -2283,10 +2259,7 @@
    * @param indexStore the index store against which this operation is being run
    * @param context the [AnalysisContext] to remove
    */
-  RemoveContextOperation(IndexStore indexStore, AnalysisContext context) {
-    this._indexStore = indexStore;
-    this.context = context;
-  }
+  RemoveContextOperation(this._indexStore, this.context);
 
   @override
   bool get isQuery => false;
@@ -2311,17 +2284,17 @@
   /**
    * The index store against which this operation is being run.
    */
-  IndexStore _indexStore;
+  final IndexStore _indexStore;
 
   /**
    * The context in which [HtmlUnit] was resolved.
    */
-  AnalysisContext _context;
+  final AnalysisContext _context;
 
   /**
    * The [HtmlUnit] being indexed.
    */
-  ht.HtmlUnit unit;
+  final ht.HtmlUnit unit;
 
   /**
    * The element of the [HtmlUnit] being indexed.
@@ -2340,10 +2313,7 @@
    * @param context the context in which [HtmlUnit] was resolved
    * @param unit the fully resolved [HtmlUnit]
    */
-  IndexHtmlUnitOperation(IndexStore indexStore, AnalysisContext context, ht.HtmlUnit unit) {
-    this._indexStore = indexStore;
-    this._context = context;
-    this.unit = unit;
+  IndexHtmlUnitOperation(this._indexStore, this._context, this.unit) {
     this._htmlElement = unit.element;
     this._source = _htmlElement.source;
   }
@@ -2391,17 +2361,17 @@
   /**
    * The element containing this location.
    */
-  Element element;
+  final Element element;
 
   /**
    * The offset of this location within the resource containing the element.
    */
-  int offset = 0;
+  final int offset;
 
   /**
    * The length of this location.
    */
-  int length = 0;
+  final int length;
 
   /**
    * Internal field used to hold a key that is referenced at this location.
@@ -2416,13 +2386,10 @@
    * @param offset the offset of this location within the resource containing the element
    * @param length the length of this location
    */
-  Location(Element element, int offset, int length) {
+  Location(this.element, this.offset, this.length) {
     if (element == null) {
       throw new IllegalArgumentException("element location cannot be null");
     }
-    this.element = element;
-    this.offset = offset;
-    this.length = length;
   }
 
   /**
@@ -2446,24 +2413,19 @@
  * locations that have a specified relationship with a specified element.
  */
 class GetRelationshipsOperation implements IndexOperation {
-  IndexStore _indexStore;
+  final IndexStore _indexStore;
 
-  Element element;
+  final Element element;
 
-  Relationship relationship;
+  final Relationship relationship;
 
-  RelationshipCallback callback;
+  final RelationshipCallback callback;
 
   /**
    * Initialize a newly created operation that will access the locations that have a specified
    * relationship with a specified element.
    */
-  GetRelationshipsOperation(IndexStore indexStore, Element element, Relationship relationship, RelationshipCallback callback) {
-    this._indexStore = indexStore;
-    this.element = element;
-    this.relationship = relationship;
-    this.callback = callback;
-  }
+  GetRelationshipsOperation(this._indexStore, this.element, this.relationship, this.callback);
 
   @override
   bool get isQuery => true;
@@ -2486,15 +2448,11 @@
  * [Location] with attached data.
  */
 class LocationWithData<D> extends Location {
-  D data;
+  final D data;
 
-  LocationWithData.con1(Location location, D data) : super(location.element, location.offset, location.length) {
-    this.data = data;
-  }
+  LocationWithData.con1(Location location, this.data) : super(location.element, location.offset, location.length);
 
-  LocationWithData.con2(Element element, int offset, int length, D data) : super(element, offset, length) {
-    this.data = data;
-  }
+  LocationWithData.con2(Element element, int offset, int length, this.data) : super(element, offset, length);
 
   @override
   Location newClone() => new LocationWithData<D>.con2(element, offset, length, data);
diff --git a/pkg/analyzer/lib/src/generated/instrumentation.dart b/pkg/analyzer/lib/src/generated/instrumentation.dart
index 73d6214..caec028 100644
--- a/pkg/analyzer/lib/src/generated/instrumentation.dart
+++ b/pkg/analyzer/lib/src/generated/instrumentation.dart
@@ -284,15 +284,15 @@
  */
 class InstrumentationLevel extends Enum<InstrumentationLevel> {
   /** Recording all instrumented information */
-  static final InstrumentationLevel EVERYTHING = new InstrumentationLevel('EVERYTHING', 0);
+  static const InstrumentationLevel EVERYTHING = const InstrumentationLevel('EVERYTHING', 0);
 
   /** Recording only metrics */
-  static final InstrumentationLevel METRICS = new InstrumentationLevel('METRICS', 1);
+  static const InstrumentationLevel METRICS = const InstrumentationLevel('METRICS', 1);
 
   /** Nothing recorded */
-  static final InstrumentationLevel OFF = new InstrumentationLevel('OFF', 2);
+  static const InstrumentationLevel OFF = const InstrumentationLevel('OFF', 2);
 
-  static final List<InstrumentationLevel> values = [EVERYTHING, METRICS, OFF];
+  static const List<InstrumentationLevel> values = const [EVERYTHING, METRICS, OFF];
 
   static InstrumentationLevel fromString(String str) {
     if (str == "EVERYTHING") {
@@ -307,7 +307,7 @@
     throw new IllegalArgumentException("Unrecognised InstrumentationLevel");
   }
 
-  InstrumentationLevel(String name, int ordinal) : super(name, ordinal);
+  const InstrumentationLevel(String name, int ordinal) : super(name, ordinal);
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index a6282eb..a075ca8 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -386,6 +386,10 @@
   return a && b;
 }
 
+int javaByte(Object o) {
+  return (o as int) & 0xFF;
+}
+
 class JavaStringBuilder {
   StringBuffer sb = new StringBuffer();
   String toString() => sb.toString();
@@ -421,7 +425,7 @@
   final String name;
   /// The position in the enum declaration.
   final int ordinal;
-  Enum(this.name, this.ordinal);
+  const Enum(this.name, this.ordinal);
   int get hashCode => ordinal;
   String toString() => name;
   int compareTo(E other) => ordinal - other.ordinal;
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 16a7bc1..9b9dc17 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -26,12 +26,12 @@
   /**
    * The documentation comment that was parsed, or `null` if none was given.
    */
-  Comment comment;
+  final Comment comment;
 
   /**
    * The metadata that was parsed.
    */
-  List<Annotation> metadata;
+  final List<Annotation> metadata;
 
   /**
    * Initialize a newly created holder with the given data.
@@ -39,10 +39,7 @@
    * @param comment the documentation comment that was parsed
    * @param metadata the metadata that was parsed
    */
-  CommentAndMetadata(Comment comment, List<Annotation> metadata) {
-    this.comment = comment;
-    this.metadata = metadata;
-  }
+  CommentAndMetadata(this.comment, this.metadata);
 }
 
 /**
@@ -53,12 +50,12 @@
   /**
    * The 'final', 'const' or 'var' keyword, or `null` if none was given.
    */
-  Token keyword;
+  final Token keyword;
 
   /**
    * The type, of `null` if no type was specified.
    */
-  TypeName type;
+  final TypeName type;
 
   /**
    * Initialize a newly created holder with the given data.
@@ -66,10 +63,7 @@
    * @param keyword the 'final', 'const' or 'var' keyword
    * @param type the type
    */
-  FinalConstVarOrType(Token keyword, TypeName type) {
-    this.keyword = keyword;
-    this.type = type;
-  }
+  FinalConstVarOrType(this.keyword, this.type);
 }
 
 /**
@@ -157,12 +151,12 @@
   /**
    * The parser used to parse the replacement for the node.
    */
-  Parser _parser;
+  final Parser _parser;
 
   /**
    * The node that is to be replaced.
    */
-  AstNode _oldNode;
+  final AstNode _oldNode;
 
   /**
    * Initialize a newly created dispatcher to parse a single node that will replace the given node.
@@ -170,10 +164,7 @@
    * @param parser the parser used to parse the replacement for the node
    * @param oldNode the node that is to be replaced
    */
-  IncrementalParseDispatcher(Parser parser, AstNode oldNode) {
-    this._parser = parser;
-    this._oldNode = oldNode;
-  }
+  IncrementalParseDispatcher(this._parser, this._oldNode);
 
   @override
   AstNode visitAdjacentStrings(AdjacentStrings node) {
@@ -1249,17 +1240,17 @@
   /**
    * The source being parsed.
    */
-  Source _source;
+  final Source _source;
 
   /**
    * A map from old tokens to new tokens used during the cloning process.
    */
-  TokenMap _tokenMap;
+  final TokenMap _tokenMap;
 
   /**
    * The error listener that will be informed of any errors that are found during the parse.
    */
-  AnalysisErrorListener _errorListener;
+  final AnalysisErrorListener _errorListener;
 
   /**
    * The node in the AST structure that contains the revised content.
@@ -1275,11 +1266,7 @@
    * @param errorListener the error listener that will be informed of any errors that are found
    *          during the parse
    */
-  IncrementalParser(Source source, TokenMap tokenMap, AnalysisErrorListener errorListener) {
-    this._source = source;
-    this._tokenMap = tokenMap;
-    this._errorListener = errorListener;
-  }
+  IncrementalParser(this._source, this._tokenMap, this._errorListener);
 
   /**
    * Return the node in the AST structure that contains the revised content.
@@ -1439,12 +1426,12 @@
   /**
    * The source being parsed.
    */
-  Source _source;
+  final Source _source;
 
   /**
    * The error listener that will be informed of any errors that are found during the parse.
    */
-  AnalysisErrorListener _errorListener;
+  final AnalysisErrorListener _errorListener;
 
   /**
    * An [errorListener] lock, if more than `0`, then errors are not reported.
@@ -1488,10 +1475,7 @@
    * @param errorListener the error listener that will be informed of any errors that are found
    *          during the parse
    */
-  Parser(Source source, AnalysisErrorListener errorListener) {
-    this._source = source;
-    this._errorListener = errorListener;
-  }
+  Parser(this._source, this._errorListener);
 
   /**
    * Parse a compilation unit, starting with the given token.
@@ -2046,9 +2030,9 @@
     //
     Expression expression = parseConditionalExpression();
     TokenType tokenType = _currentToken.type;
-    if (identical(tokenType, TokenType.PERIOD_PERIOD)) {
+    if (tokenType == TokenType.PERIOD_PERIOD) {
       List<Expression> cascadeSections = new List<Expression>();
-      while (identical(tokenType, TokenType.PERIOD_PERIOD)) {
+      while (tokenType == TokenType.PERIOD_PERIOD) {
         Expression section = _parseCascadeSection();
         if (section != null) {
           cascadeSections.add(section);
@@ -2212,7 +2196,7 @@
       FormalParameter parameter = _parseFormalParameter(kind);
       parameters.add(parameter);
       currentParameters.add(parameter);
-      if (identical(kind, ParameterKind.REQUIRED) && wasOptionalParameter) {
+      if (kind == ParameterKind.REQUIRED && wasOptionalParameter) {
         _reportErrorForNode(ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS, parameter, []);
       }
       //
@@ -2246,7 +2230,7 @@
         }
         kind = ParameterKind.REQUIRED;
       }
-    } while (!_matches(TokenType.CLOSE_PAREN) && initialToken != _currentToken);
+    } while (!_matches(TokenType.CLOSE_PAREN) && !identical(initialToken, _currentToken));
     Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
     //
     // Check that the groups were closed correctly.
@@ -2792,7 +2776,7 @@
    */
   SimpleIdentifier _createSyntheticIdentifier() {
     Token syntheticToken;
-    if (identical(_currentToken.type, TokenType.KEYWORD)) {
+    if (_currentToken.type == TokenType.KEYWORD) {
       // Consider current keyword token as an identifier.
       // It is not always true, e.g. "^is T" where "^" is place the place for synthetic identifier.
       // By creating SyntheticStringToken we can distinguish a real identifier from synthetic.
@@ -2862,7 +2846,7 @@
     }
     // Remove uses of this method in favor of matches?
     // Pass in the error code to use to report the error?
-    if (identical(type, TokenType.SEMICOLON)) {
+    if (type == TokenType.SEMICOLON) {
       _reportErrorForToken(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, [type.lexeme]);
     } else {
       _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TOKEN, [type.lexeme]);
@@ -3156,7 +3140,7 @@
       return false;
     }
     TokenType type = token.type;
-    return identical(type, TokenType.EQ) || identical(type, TokenType.COMMA) || identical(type, TokenType.SEMICOLON) || _tokenMatchesKeyword(token, Keyword.IN);
+    return type == TokenType.EQ || type == TokenType.COMMA || type == TokenType.SEMICOLON || _tokenMatchesKeyword(token, Keyword.IN);
   }
 
   /**
@@ -3203,7 +3187,7 @@
       return false;
     }
     // Token "=" means that it is actually field initializer.
-    if (identical(startToken.type, TokenType.EQ)) {
+    if (startToken.type == TokenType.EQ) {
       return false;
     }
     // Consume all operator tokens.
@@ -3225,9 +3209,9 @@
     while (_tokenMatches(token, TokenType.IDENTIFIER) && _tokenMatches(token.next, TokenType.COLON)) {
       token = token.next.next;
     }
-    if (identical(token.type, TokenType.KEYWORD)) {
+    if (token.type == TokenType.KEYWORD) {
       Keyword keyword = (token as KeywordToken).keyword;
-      return identical(keyword, Keyword.CASE) || identical(keyword, Keyword.DEFAULT);
+      return keyword == Keyword.CASE || keyword == Keyword.DEFAULT;
     }
     return false;
   }
@@ -3291,7 +3275,7 @@
    * @param type the type of token that can optionally appear in the current location
    * @return `true` if the current token has the given type
    */
-  bool _matches(TokenType type) => identical(_currentToken.type, type);
+  bool _matches(TokenType type) => _currentToken.type == type;
 
   /**
    * Return `true` if the current token has a type of [TokenType#GT]. Note that this
@@ -3303,9 +3287,9 @@
    */
   bool _matchesGt() {
     TokenType currentType = _currentToken.type;
-    if (identical(currentType, TokenType.GT)) {
+    if (currentType == TokenType.GT) {
       return true;
-    } else if (identical(currentType, TokenType.GT_GT)) {
+    } else if (currentType == TokenType.GT_GT) {
       int offset = _currentToken.offset;
       Token first = new Token(TokenType.GT, offset);
       Token second = new Token(TokenType.GT, offset + 1);
@@ -3314,7 +3298,7 @@
       _currentToken.previous.setNext(first);
       _currentToken = first;
       return true;
-    } else if (identical(currentType, TokenType.GT_EQ)) {
+    } else if (currentType == TokenType.GT_EQ) {
       int offset = _currentToken.offset;
       Token first = new Token(TokenType.GT, offset);
       Token second = new Token(TokenType.EQ, offset + 1);
@@ -3323,7 +3307,7 @@
       _currentToken.previous.setNext(first);
       _currentToken = first;
       return true;
-    } else if (identical(currentType, TokenType.GT_GT_EQ)) {
+    } else if (currentType == TokenType.GT_GT_EQ) {
       int offset = _currentToken.offset;
       Token first = new Token(TokenType.GT, offset);
       Token second = new Token(TokenType.GT, offset + 1);
@@ -3360,7 +3344,7 @@
    * @param identifier the identifier that can optionally appear in the current location
    * @return `true` if the current token matches the given identifier
    */
-  bool _matchesString(String identifier) => identical(_currentToken.type, TokenType.IDENTIFIER) && _currentToken.lexeme == identifier;
+  bool _matchesString(String identifier) => _currentToken.type == TokenType.IDENTIFIER && _currentToken.lexeme == identifier;
 
   /**
    * If the current token has the given type, then advance to the next token and return `true`
@@ -3631,7 +3615,7 @@
     SimpleIdentifier functionName = null;
     if (_matchesIdentifier()) {
       functionName = parseSimpleIdentifier();
-    } else if (identical(_currentToken.type, TokenType.OPEN_SQUARE_BRACKET)) {
+    } else if (_currentToken.type == TokenType.OPEN_SQUARE_BRACKET) {
       Token leftBracket = andAdvance;
       Expression index = parseExpression2();
       Token rightBracket = _expect(TokenType.CLOSE_SQUARE_BRACKET);
@@ -3641,8 +3625,8 @@
       _reportErrorForToken(ParserErrorCode.MISSING_IDENTIFIER, _currentToken, [_currentToken.lexeme]);
       functionName = _createSyntheticIdentifier();
     }
-    if (identical(_currentToken.type, TokenType.OPEN_PAREN)) {
-      while (identical(_currentToken.type, TokenType.OPEN_PAREN)) {
+    if (_currentToken.type == TokenType.OPEN_PAREN) {
+      while (_currentToken.type == TokenType.OPEN_PAREN) {
         if (functionName != null) {
           expression = new MethodInvocation(expression, period, functionName, parseArgumentList());
           period = null;
@@ -3662,10 +3646,10 @@
     while (progress) {
       progress = false;
       Expression selector = _parseAssignableSelector(expression, true);
-      if (selector != expression) {
+      if (!identical(selector, expression)) {
         expression = selector;
         progress = true;
-        while (identical(_currentToken.type, TokenType.OPEN_PAREN)) {
+        while (_currentToken.type == TokenType.OPEN_PAREN) {
           if (expression is PropertyAccess) {
             PropertyAccess propertyAccess = expression as PropertyAccess;
             expression = new MethodInvocation(propertyAccess.target, propertyAccess.operator, propertyAccess.propertyName, parseArgumentList());
@@ -4253,9 +4237,9 @@
     Token equals = _expect(TokenType.EQ);
     Expression expression = parseConditionalExpression();
     TokenType tokenType = _currentToken.type;
-    if (identical(tokenType, TokenType.PERIOD_PERIOD)) {
+    if (tokenType == TokenType.PERIOD_PERIOD) {
       List<Expression> cascadeSections = new List<Expression>();
-      while (identical(tokenType, TokenType.PERIOD_PERIOD)) {
+      while (tokenType == TokenType.PERIOD_PERIOD) {
         Expression section = _parseCascadeSection();
         if (section != null) {
           cascadeSections.add(section);
@@ -4338,7 +4322,7 @@
     List<Token> commentTokens = new List<Token>();
     Token commentToken = _currentToken.precedingComments;
     while (commentToken != null) {
-      if (identical(commentToken.type, TokenType.SINGLE_LINE_COMMENT)) {
+      if (commentToken.type == TokenType.SINGLE_LINE_COMMENT) {
         if (StringUtilities.startsWith3(commentToken.lexeme, 0, 0x2F, 0x2F, 0x2F)) {
           if (commentTokens.length == 1 && StringUtilities.startsWith3(commentTokens[0].lexeme, 0, 0x2F, 0x2A, 0x2A)) {
             commentTokens.clear();
@@ -4523,18 +4507,18 @@
     if (_matches(TokenType.EQ)) {
       Token seperator = andAdvance;
       Expression defaultValue = parseExpression2();
-      if (identical(kind, ParameterKind.NAMED)) {
+      if (kind == ParameterKind.NAMED) {
         _reportErrorForToken(ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER, seperator, []);
-      } else if (identical(kind, ParameterKind.REQUIRED)) {
+      } else if (kind == ParameterKind.REQUIRED) {
         _reportErrorForNode(ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP, parameter, []);
       }
       return new DefaultFormalParameter(parameter, kind, seperator, defaultValue);
     } else if (_matches(TokenType.COLON)) {
       Token seperator = andAdvance;
       Expression defaultValue = parseExpression2();
-      if (identical(kind, ParameterKind.POSITIONAL)) {
+      if (kind == ParameterKind.POSITIONAL) {
         _reportErrorForToken(ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER, seperator, []);
-      } else if (identical(kind, ParameterKind.REQUIRED)) {
+      } else if (kind == ParameterKind.REQUIRED) {
         _reportErrorForNode(ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP, parameter, []);
       }
       return new DefaultFormalParameter(parameter, kind, seperator, defaultValue);
@@ -4786,7 +4770,7 @@
     FunctionDeclaration declaration = _parseFunctionDeclaration(commentAndMetadata, null, returnType);
     Token propertyKeyword = declaration.propertyKeyword;
     if (propertyKeyword != null) {
-      if (identical((propertyKeyword as KeywordToken).keyword, Keyword.GET)) {
+      if ((propertyKeyword as KeywordToken).keyword == Keyword.GET) {
         _reportErrorForToken(ParserErrorCode.GETTER_IN_FUNCTION, propertyKeyword, []);
       } else {
         _reportErrorForToken(ParserErrorCode.SETTER_IN_FUNCTION, propertyKeyword, []);
@@ -5367,7 +5351,7 @@
     if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
       if (_tokenMatches(_peek(), TokenType.STRING)) {
         Token afterString = _skipStringLiteral(_currentToken.next);
-        if (afterString != null && identical(afterString.type, TokenType.COLON)) {
+        if (afterString != null && afterString.type == TokenType.COLON) {
           return new ExpressionStatement(parseExpression2(), _expect(TokenType.SEMICOLON));
         }
       }
@@ -5375,33 +5359,33 @@
     } else if (_matches(TokenType.KEYWORD) && !(_currentToken as KeywordToken).keyword.isPseudoKeyword) {
       Keyword keyword = (_currentToken as KeywordToken).keyword;
       // TODO(jwren) compute some metrics to figure out a better order for this if-then sequence to optimize performance
-      if (identical(keyword, Keyword.ASSERT)) {
+      if (keyword == Keyword.ASSERT) {
         return _parseAssertStatement();
-      } else if (identical(keyword, Keyword.BREAK)) {
+      } else if (keyword == Keyword.BREAK) {
         return _parseBreakStatement();
-      } else if (identical(keyword, Keyword.CONTINUE)) {
+      } else if (keyword == Keyword.CONTINUE) {
         return _parseContinueStatement();
-      } else if (identical(keyword, Keyword.DO)) {
+      } else if (keyword == Keyword.DO) {
         return _parseDoStatement();
-      } else if (identical(keyword, Keyword.FOR)) {
+      } else if (keyword == Keyword.FOR) {
         return _parseForStatement();
-      } else if (identical(keyword, Keyword.IF)) {
+      } else if (keyword == Keyword.IF) {
         return _parseIfStatement();
-      } else if (identical(keyword, Keyword.RETHROW)) {
+      } else if (keyword == Keyword.RETHROW) {
         return new ExpressionStatement(_parseRethrowExpression(), _expect(TokenType.SEMICOLON));
-      } else if (identical(keyword, Keyword.RETURN)) {
+      } else if (keyword == Keyword.RETURN) {
         return _parseReturnStatement();
-      } else if (identical(keyword, Keyword.SWITCH)) {
+      } else if (keyword == Keyword.SWITCH) {
         return _parseSwitchStatement();
-      } else if (identical(keyword, Keyword.THROW)) {
+      } else if (keyword == Keyword.THROW) {
         return new ExpressionStatement(_parseThrowExpression(), _expect(TokenType.SEMICOLON));
-      } else if (identical(keyword, Keyword.TRY)) {
+      } else if (keyword == Keyword.TRY) {
         return _parseTryStatement();
-      } else if (identical(keyword, Keyword.WHILE)) {
+      } else if (keyword == Keyword.WHILE) {
         return _parseWhileStatement();
-      } else if (identical(keyword, Keyword.VAR) || identical(keyword, Keyword.FINAL)) {
+      } else if (keyword == Keyword.VAR || keyword == Keyword.FINAL) {
         return _parseVariableDeclarationStatementAfterMetadata(commentAndMetadata);
-      } else if (identical(keyword, Keyword.VOID)) {
+      } else if (keyword == Keyword.VOID) {
         TypeName returnType = parseReturnType();
         if (_matchesIdentifier() && _peek().matchesAny([
             TokenType.OPEN_PAREN,
@@ -5431,7 +5415,7 @@
           // TODO(brianwilkerson) Recover from this error.
           return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON));
         }
-      } else if (identical(keyword, Keyword.CONST)) {
+      } else if (keyword == Keyword.CONST) {
         if (_peek().matchesAny([
             TokenType.LT,
             TokenType.OPEN_CURLY_BRACKET,
@@ -5447,7 +5431,7 @@
           }
         }
         return _parseVariableDeclarationStatementAfterMetadata(commentAndMetadata);
-      } else if (identical(keyword, Keyword.NEW) || identical(keyword, Keyword.TRUE) || identical(keyword, Keyword.FALSE) || identical(keyword, Keyword.NULL) || identical(keyword, Keyword.SUPER) || identical(keyword, Keyword.THIS)) {
+      } else if (keyword == Keyword.NEW || keyword == Keyword.TRUE || keyword == Keyword.FALSE || keyword == Keyword.NULL || keyword == Keyword.SUPER || keyword == Keyword.THIS) {
         return new ExpressionStatement(parseExpression2(), _expect(TokenType.SEMICOLON));
       } else {
         //
@@ -6234,7 +6218,7 @@
         // we can (and therefore must) interpret "--super" as semantically equivalent to "-(-super)".
         // Unfortunately, we cannot do the same for "++super" because "+super" is also not valid.
         //
-        if (identical(operator.type, TokenType.MINUS_MINUS)) {
+        if (operator.type == TokenType.MINUS_MINUS) {
           int offset = operator.offset;
           Token firstOperator = new Token(TokenType.MINUS, offset);
           Token secondOperator = new Token(TokenType.MINUS, offset + 1);
@@ -6690,8 +6674,8 @@
   Token _skipStringInterpolation(Token startToken) {
     Token token = startToken;
     TokenType type = token.type;
-    while (identical(type, TokenType.STRING_INTERPOLATION_EXPRESSION) || identical(type, TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
-      if (identical(type, TokenType.STRING_INTERPOLATION_EXPRESSION)) {
+    while (type == TokenType.STRING_INTERPOLATION_EXPRESSION || type == TokenType.STRING_INTERPOLATION_IDENTIFIER) {
+      if (type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
         token = token.next;
         type = token.type;
         //
@@ -6701,13 +6685,13 @@
         //
         int bracketNestingLevel = 1;
         while (bracketNestingLevel > 0) {
-          if (identical(type, TokenType.EOF)) {
+          if (type == TokenType.EOF) {
             return null;
-          } else if (identical(type, TokenType.OPEN_CURLY_BRACKET)) {
+          } else if (type == TokenType.OPEN_CURLY_BRACKET) {
             bracketNestingLevel++;
-          } else if (identical(type, TokenType.CLOSE_CURLY_BRACKET)) {
+          } else if (type == TokenType.CLOSE_CURLY_BRACKET) {
             bracketNestingLevel--;
-          } else if (identical(type, TokenType.STRING)) {
+          } else if (type == TokenType.STRING) {
             token = _skipStringLiteral(token);
             if (token == null) {
               return null;
@@ -6727,7 +6711,7 @@
         token = token.next;
       }
       type = token.type;
-      if (identical(type, TokenType.STRING)) {
+      if (type == TokenType.STRING) {
         token = token.next;
         type = token.type;
       }
@@ -6756,7 +6740,7 @@
     while (token != null && _tokenMatches(token, TokenType.STRING)) {
       token = token.next;
       TokenType type = token.type;
-      if (identical(type, TokenType.STRING_INTERPOLATION_EXPRESSION) || identical(type, TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
+      if (type == TokenType.STRING_INTERPOLATION_EXPRESSION || type == TokenType.STRING_INTERPOLATION_IDENTIFIER) {
         token = _skipStringInterpolation(token);
       }
     }
@@ -6799,9 +6783,9 @@
         return null;
       }
     }
-    if (identical(token.type, TokenType.GT)) {
+    if (token.type == TokenType.GT) {
       return token.next;
-    } else if (identical(token.type, TokenType.GT_GT)) {
+    } else if (token.type == TokenType.GT_GT) {
       Token second = new Token(TokenType.GT, token.offset + 1);
       second.setNextWithoutSettingPrevious(token.next);
       return second;
@@ -6899,7 +6883,7 @@
    * @param type the type of token that is being tested for
    * @return `true` if the given token has the given type
    */
-  bool _tokenMatches(Token token, TokenType type) => identical(token.type, type);
+  bool _tokenMatches(Token token, TokenType type) => token.type == type;
 
   /**
    * Return `true` if the given token is a valid identifier. Valid identifiers include
@@ -6916,7 +6900,7 @@
    * @param keyword the keyword that is being tested for
    * @return `true` if the given token matches the given keyword
    */
-  bool _tokenMatchesKeyword(Token token, Keyword keyword) => identical(token.type, TokenType.KEYWORD) && identical((token as KeywordToken).keyword, keyword);
+  bool _tokenMatchesKeyword(Token token, Keyword keyword) => token.type == TokenType.KEYWORD && (token as KeywordToken).keyword == keyword;
 
   /**
    * Translate the characters at the given index in the given string, appending the translated
@@ -7351,271 +7335,271 @@
  * when appropriate, how the problem can be corrected.
  */
 class ParserErrorCode extends Enum<ParserErrorCode> implements ErrorCode {
-  static final ParserErrorCode ABSTRACT_CLASS_MEMBER = new ParserErrorCode.con3('ABSTRACT_CLASS_MEMBER', 0, "Members of classes cannot be declared to be 'abstract'");
+  static const ParserErrorCode ABSTRACT_CLASS_MEMBER = const ParserErrorCode.con3('ABSTRACT_CLASS_MEMBER', 0, "Members of classes cannot be declared to be 'abstract'");
 
-  static final ParserErrorCode ABSTRACT_STATIC_METHOD = new ParserErrorCode.con3('ABSTRACT_STATIC_METHOD', 1, "Static methods cannot be declared to be 'abstract'");
+  static const ParserErrorCode ABSTRACT_STATIC_METHOD = const ParserErrorCode.con3('ABSTRACT_STATIC_METHOD', 1, "Static methods cannot be declared to be 'abstract'");
 
-  static final ParserErrorCode ABSTRACT_TOP_LEVEL_FUNCTION = new ParserErrorCode.con3('ABSTRACT_TOP_LEVEL_FUNCTION', 2, "Top-level functions cannot be declared to be 'abstract'");
+  static const ParserErrorCode ABSTRACT_TOP_LEVEL_FUNCTION = const ParserErrorCode.con3('ABSTRACT_TOP_LEVEL_FUNCTION', 2, "Top-level functions cannot be declared to be 'abstract'");
 
-  static final ParserErrorCode ABSTRACT_TOP_LEVEL_VARIABLE = new ParserErrorCode.con3('ABSTRACT_TOP_LEVEL_VARIABLE', 3, "Top-level variables cannot be declared to be 'abstract'");
+  static const ParserErrorCode ABSTRACT_TOP_LEVEL_VARIABLE = const ParserErrorCode.con3('ABSTRACT_TOP_LEVEL_VARIABLE', 3, "Top-level variables cannot be declared to be 'abstract'");
 
-  static final ParserErrorCode ABSTRACT_TYPEDEF = new ParserErrorCode.con3('ABSTRACT_TYPEDEF', 4, "Type aliases cannot be declared to be 'abstract'");
+  static const ParserErrorCode ABSTRACT_TYPEDEF = const ParserErrorCode.con3('ABSTRACT_TYPEDEF', 4, "Type aliases cannot be declared to be 'abstract'");
 
-  static final ParserErrorCode ASSERT_DOES_NOT_TAKE_ASSIGNMENT = new ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_ASSIGNMENT', 5, "Assert cannot be called on an assignment");
+  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_ASSIGNMENT = const ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_ASSIGNMENT', 5, "Assert cannot be called on an assignment");
 
-  static final ParserErrorCode ASSERT_DOES_NOT_TAKE_CASCADE = new ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_CASCADE', 6, "Assert cannot be called on cascade");
+  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_CASCADE = const ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_CASCADE', 6, "Assert cannot be called on cascade");
 
-  static final ParserErrorCode ASSERT_DOES_NOT_TAKE_THROW = new ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_THROW', 7, "Assert cannot be called on throws");
+  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_THROW = const ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_THROW', 7, "Assert cannot be called on throws");
 
-  static final ParserErrorCode ASSERT_DOES_NOT_TAKE_RETHROW = new ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_RETHROW', 8, "Assert cannot be called on rethrows");
+  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_RETHROW = const ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_RETHROW', 8, "Assert cannot be called on rethrows");
 
-  static final ParserErrorCode BREAK_OUTSIDE_OF_LOOP = new ParserErrorCode.con3('BREAK_OUTSIDE_OF_LOOP', 9, "A break statement cannot be used outside of a loop or switch statement");
+  static const ParserErrorCode BREAK_OUTSIDE_OF_LOOP = const ParserErrorCode.con3('BREAK_OUTSIDE_OF_LOOP', 9, "A break statement cannot be used outside of a loop or switch statement");
 
-  static final ParserErrorCode CONST_AND_FINAL = new ParserErrorCode.con3('CONST_AND_FINAL', 10, "Members cannot be declared to be both 'const' and 'final'");
+  static const ParserErrorCode CONST_AND_FINAL = const ParserErrorCode.con3('CONST_AND_FINAL', 10, "Members cannot be declared to be both 'const' and 'final'");
 
-  static final ParserErrorCode CONST_AND_VAR = new ParserErrorCode.con3('CONST_AND_VAR', 11, "Members cannot be declared to be both 'const' and 'var'");
+  static const ParserErrorCode CONST_AND_VAR = const ParserErrorCode.con3('CONST_AND_VAR', 11, "Members cannot be declared to be both 'const' and 'var'");
 
-  static final ParserErrorCode CONST_CLASS = new ParserErrorCode.con3('CONST_CLASS', 12, "Classes cannot be declared to be 'const'");
+  static const ParserErrorCode CONST_CLASS = const ParserErrorCode.con3('CONST_CLASS', 12, "Classes cannot be declared to be 'const'");
 
-  static final ParserErrorCode CONST_CONSTRUCTOR_WITH_BODY = new ParserErrorCode.con3('CONST_CONSTRUCTOR_WITH_BODY', 13, "'const' constructors cannot have a body");
+  static const ParserErrorCode CONST_CONSTRUCTOR_WITH_BODY = const ParserErrorCode.con3('CONST_CONSTRUCTOR_WITH_BODY', 13, "'const' constructors cannot have a body");
 
-  static final ParserErrorCode CONST_FACTORY = new ParserErrorCode.con3('CONST_FACTORY', 14, "Only redirecting factory constructors can be declared to be 'const'");
+  static const ParserErrorCode CONST_FACTORY = const ParserErrorCode.con3('CONST_FACTORY', 14, "Only redirecting factory constructors can be declared to be 'const'");
 
-  static final ParserErrorCode CONST_METHOD = new ParserErrorCode.con3('CONST_METHOD', 15, "Getters, setters and methods cannot be declared to be 'const'");
+  static const ParserErrorCode CONST_METHOD = const ParserErrorCode.con3('CONST_METHOD', 15, "Getters, setters and methods cannot be declared to be 'const'");
 
-  static final ParserErrorCode CONST_TYPEDEF = new ParserErrorCode.con3('CONST_TYPEDEF', 16, "Type aliases cannot be declared to be 'const'");
+  static const ParserErrorCode CONST_TYPEDEF = const ParserErrorCode.con3('CONST_TYPEDEF', 16, "Type aliases cannot be declared to be 'const'");
 
-  static final ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE = new ParserErrorCode.con3('CONSTRUCTOR_WITH_RETURN_TYPE', 17, "Constructors cannot have a return type");
+  static const ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE = const ParserErrorCode.con3('CONSTRUCTOR_WITH_RETURN_TYPE', 17, "Constructors cannot have a return type");
 
-  static final ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP = new ParserErrorCode.con3('CONTINUE_OUTSIDE_OF_LOOP', 18, "A continue statement cannot be used outside of a loop or switch statement");
+  static const ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP = const ParserErrorCode.con3('CONTINUE_OUTSIDE_OF_LOOP', 18, "A continue statement cannot be used outside of a loop or switch statement");
 
-  static final ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = new ParserErrorCode.con3('CONTINUE_WITHOUT_LABEL_IN_CASE', 19, "A continue statement in a switch statement must have a label as a target");
+  static const ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = const ParserErrorCode.con3('CONTINUE_WITHOUT_LABEL_IN_CASE', 19, "A continue statement in a switch statement must have a label as a target");
 
-  static final ParserErrorCode DEPRECATED_ARGUMENT_DEFINITION_TEST = new ParserErrorCode.con3('DEPRECATED_ARGUMENT_DEFINITION_TEST', 20, "The argument definition test ('?' operator) has been deprecated");
+  static const ParserErrorCode DEPRECATED_ARGUMENT_DEFINITION_TEST = const ParserErrorCode.con3('DEPRECATED_ARGUMENT_DEFINITION_TEST', 20, "The argument definition test ('?' operator) has been deprecated");
 
-  static final ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS = new ParserErrorCode.con3('DEPRECATED_CLASS_TYPE_ALIAS', 21, "The 'typedef' mixin application was replaced with 'class'");
+  static const ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS = const ParserErrorCode.con3('DEPRECATED_CLASS_TYPE_ALIAS', 21, "The 'typedef' mixin application was replaced with 'class'");
 
-  static final ParserErrorCode DIRECTIVE_AFTER_DECLARATION = new ParserErrorCode.con3('DIRECTIVE_AFTER_DECLARATION', 22, "Directives must appear before any declarations");
+  static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION = const ParserErrorCode.con3('DIRECTIVE_AFTER_DECLARATION', 22, "Directives must appear before any declarations");
 
-  static final ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = new ParserErrorCode.con3('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 23, "The label %s was already used in this switch statement");
+  static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = const ParserErrorCode.con3('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 23, "The label %s was already used in this switch statement");
 
-  static final ParserErrorCode DUPLICATED_MODIFIER = new ParserErrorCode.con3('DUPLICATED_MODIFIER', 24, "The modifier '%s' was already specified.");
+  static const ParserErrorCode DUPLICATED_MODIFIER = const ParserErrorCode.con3('DUPLICATED_MODIFIER', 24, "The modifier '%s' was already specified.");
 
-  static final ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = new ParserErrorCode.con3('EQUALITY_CANNOT_BE_EQUALITY_OPERAND', 25, "Equality expression cannot be operand of another equality expression.");
+  static const ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = const ParserErrorCode.con3('EQUALITY_CANNOT_BE_EQUALITY_OPERAND', 25, "Equality expression cannot be operand of another equality expression.");
 
-  static final ParserErrorCode EXPECTED_CASE_OR_DEFAULT = new ParserErrorCode.con3('EXPECTED_CASE_OR_DEFAULT', 26, "Expected 'case' or 'default'");
+  static const ParserErrorCode EXPECTED_CASE_OR_DEFAULT = const ParserErrorCode.con3('EXPECTED_CASE_OR_DEFAULT', 26, "Expected 'case' or 'default'");
 
-  static final ParserErrorCode EXPECTED_CLASS_MEMBER = new ParserErrorCode.con3('EXPECTED_CLASS_MEMBER', 27, "Expected a class member");
+  static const ParserErrorCode EXPECTED_CLASS_MEMBER = const ParserErrorCode.con3('EXPECTED_CLASS_MEMBER', 27, "Expected a class member");
 
-  static final ParserErrorCode EXPECTED_EXECUTABLE = new ParserErrorCode.con3('EXPECTED_EXECUTABLE', 28, "Expected a method, getter, setter or operator declaration");
+  static const ParserErrorCode EXPECTED_EXECUTABLE = const ParserErrorCode.con3('EXPECTED_EXECUTABLE', 28, "Expected a method, getter, setter or operator declaration");
 
-  static final ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = new ParserErrorCode.con3('EXPECTED_LIST_OR_MAP_LITERAL', 29, "Expected a list or map literal");
+  static const ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = const ParserErrorCode.con3('EXPECTED_LIST_OR_MAP_LITERAL', 29, "Expected a list or map literal");
 
-  static final ParserErrorCode EXPECTED_STRING_LITERAL = new ParserErrorCode.con3('EXPECTED_STRING_LITERAL', 30, "Expected a string literal");
+  static const ParserErrorCode EXPECTED_STRING_LITERAL = const ParserErrorCode.con3('EXPECTED_STRING_LITERAL', 30, "Expected a string literal");
 
-  static final ParserErrorCode EXPECTED_TOKEN = new ParserErrorCode.con3('EXPECTED_TOKEN', 31, "Expected to find '%s'");
+  static const ParserErrorCode EXPECTED_TOKEN = const ParserErrorCode.con3('EXPECTED_TOKEN', 31, "Expected to find '%s'");
 
-  static final ParserErrorCode EXPECTED_TYPE_NAME = new ParserErrorCode.con3('EXPECTED_TYPE_NAME', 32, "Expected a type name");
+  static const ParserErrorCode EXPECTED_TYPE_NAME = const ParserErrorCode.con3('EXPECTED_TYPE_NAME', 32, "Expected a type name");
 
-  static final ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = new ParserErrorCode.con3('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 33, "Export directives must preceed part directives");
+  static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 33, "Export directives must preceed part directives");
 
-  static final ParserErrorCode EXTERNAL_AFTER_CONST = new ParserErrorCode.con3('EXTERNAL_AFTER_CONST', 34, "The modifier 'external' should be before the modifier 'const'");
+  static const ParserErrorCode EXTERNAL_AFTER_CONST = const ParserErrorCode.con3('EXTERNAL_AFTER_CONST', 34, "The modifier 'external' should be before the modifier 'const'");
 
-  static final ParserErrorCode EXTERNAL_AFTER_FACTORY = new ParserErrorCode.con3('EXTERNAL_AFTER_FACTORY', 35, "The modifier 'external' should be before the modifier 'factory'");
+  static const ParserErrorCode EXTERNAL_AFTER_FACTORY = const ParserErrorCode.con3('EXTERNAL_AFTER_FACTORY', 35, "The modifier 'external' should be before the modifier 'factory'");
 
-  static final ParserErrorCode EXTERNAL_AFTER_STATIC = new ParserErrorCode.con3('EXTERNAL_AFTER_STATIC', 36, "The modifier 'external' should be before the modifier 'static'");
+  static const ParserErrorCode EXTERNAL_AFTER_STATIC = const ParserErrorCode.con3('EXTERNAL_AFTER_STATIC', 36, "The modifier 'external' should be before the modifier 'static'");
 
-  static final ParserErrorCode EXTERNAL_CLASS = new ParserErrorCode.con3('EXTERNAL_CLASS', 37, "Classes cannot be declared to be 'external'");
+  static const ParserErrorCode EXTERNAL_CLASS = const ParserErrorCode.con3('EXTERNAL_CLASS', 37, "Classes cannot be declared to be 'external'");
 
-  static final ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_CONSTRUCTOR_WITH_BODY', 38, "External constructors cannot have a body");
+  static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_CONSTRUCTOR_WITH_BODY', 38, "External constructors cannot have a body");
 
-  static final ParserErrorCode EXTERNAL_FIELD = new ParserErrorCode.con3('EXTERNAL_FIELD', 39, "Fields cannot be declared to be 'external'");
+  static const ParserErrorCode EXTERNAL_FIELD = const ParserErrorCode.con3('EXTERNAL_FIELD', 39, "Fields cannot be declared to be 'external'");
 
-  static final ParserErrorCode EXTERNAL_GETTER_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_GETTER_WITH_BODY', 40, "External getters cannot have a body");
+  static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_GETTER_WITH_BODY', 40, "External getters cannot have a body");
 
-  static final ParserErrorCode EXTERNAL_METHOD_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_METHOD_WITH_BODY', 41, "External methods cannot have a body");
+  static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_METHOD_WITH_BODY', 41, "External methods cannot have a body");
 
-  static final ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_OPERATOR_WITH_BODY', 42, "External operators cannot have a body");
+  static const ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_OPERATOR_WITH_BODY', 42, "External operators cannot have a body");
 
-  static final ParserErrorCode EXTERNAL_SETTER_WITH_BODY = new ParserErrorCode.con3('EXTERNAL_SETTER_WITH_BODY', 43, "External setters cannot have a body");
+  static const ParserErrorCode EXTERNAL_SETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_SETTER_WITH_BODY', 43, "External setters cannot have a body");
 
-  static final ParserErrorCode EXTERNAL_TYPEDEF = new ParserErrorCode.con3('EXTERNAL_TYPEDEF', 44, "Type aliases cannot be declared to be 'external'");
+  static const ParserErrorCode EXTERNAL_TYPEDEF = const ParserErrorCode.con3('EXTERNAL_TYPEDEF', 44, "Type aliases cannot be declared to be 'external'");
 
-  static final ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = new ParserErrorCode.con3('FACTORY_TOP_LEVEL_DECLARATION', 45, "Top-level declarations cannot be declared to be 'factory'");
+  static const ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = const ParserErrorCode.con3('FACTORY_TOP_LEVEL_DECLARATION', 45, "Top-level declarations cannot be declared to be 'factory'");
 
-  static final ParserErrorCode FACTORY_WITHOUT_BODY = new ParserErrorCode.con3('FACTORY_WITHOUT_BODY', 46, "A non-redirecting 'factory' constructor must have a body");
+  static const ParserErrorCode FACTORY_WITHOUT_BODY = const ParserErrorCode.con3('FACTORY_WITHOUT_BODY', 46, "A non-redirecting 'factory' constructor must have a body");
 
-  static final ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = new ParserErrorCode.con3('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 47, "Field initializers can only be used in a constructor");
+  static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const ParserErrorCode.con3('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 47, "Field initializers can only be used in a constructor");
 
-  static final ParserErrorCode FINAL_AND_VAR = new ParserErrorCode.con3('FINAL_AND_VAR', 48, "Members cannot be declared to be both 'final' and 'var'");
+  static const ParserErrorCode FINAL_AND_VAR = const ParserErrorCode.con3('FINAL_AND_VAR', 48, "Members cannot be declared to be both 'final' and 'var'");
 
-  static final ParserErrorCode FINAL_CLASS = new ParserErrorCode.con3('FINAL_CLASS', 49, "Classes cannot be declared to be 'final'");
+  static const ParserErrorCode FINAL_CLASS = const ParserErrorCode.con3('FINAL_CLASS', 49, "Classes cannot be declared to be 'final'");
 
-  static final ParserErrorCode FINAL_CONSTRUCTOR = new ParserErrorCode.con3('FINAL_CONSTRUCTOR', 50, "A constructor cannot be declared to be 'final'");
+  static const ParserErrorCode FINAL_CONSTRUCTOR = const ParserErrorCode.con3('FINAL_CONSTRUCTOR', 50, "A constructor cannot be declared to be 'final'");
 
-  static final ParserErrorCode FINAL_METHOD = new ParserErrorCode.con3('FINAL_METHOD', 51, "Getters, setters and methods cannot be declared to be 'final'");
+  static const ParserErrorCode FINAL_METHOD = const ParserErrorCode.con3('FINAL_METHOD', 51, "Getters, setters and methods cannot be declared to be 'final'");
 
-  static final ParserErrorCode FINAL_TYPEDEF = new ParserErrorCode.con3('FINAL_TYPEDEF', 52, "Type aliases cannot be declared to be 'final'");
+  static const ParserErrorCode FINAL_TYPEDEF = const ParserErrorCode.con3('FINAL_TYPEDEF', 52, "Type aliases cannot be declared to be 'final'");
 
-  static final ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = new ParserErrorCode.con3('FUNCTION_TYPED_PARAMETER_VAR', 53, "Function typed parameters cannot specify 'const', 'final' or 'var' instead of return type");
+  static const ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = const ParserErrorCode.con3('FUNCTION_TYPED_PARAMETER_VAR', 53, "Function typed parameters cannot specify 'const', 'final' or 'var' instead of return type");
 
-  static final ParserErrorCode GETTER_IN_FUNCTION = new ParserErrorCode.con3('GETTER_IN_FUNCTION', 54, "Getters cannot be defined within methods or functions");
+  static const ParserErrorCode GETTER_IN_FUNCTION = const ParserErrorCode.con3('GETTER_IN_FUNCTION', 54, "Getters cannot be defined within methods or functions");
 
-  static final ParserErrorCode GETTER_WITH_PARAMETERS = new ParserErrorCode.con3('GETTER_WITH_PARAMETERS', 55, "Getter should be declared without a parameter list");
+  static const ParserErrorCode GETTER_WITH_PARAMETERS = const ParserErrorCode.con3('GETTER_WITH_PARAMETERS', 55, "Getter should be declared without a parameter list");
 
-  static final ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = new ParserErrorCode.con3('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 56, "Illegal assignment to non-assignable expression");
+  static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = const ParserErrorCode.con3('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 56, "Illegal assignment to non-assignable expression");
 
-  static final ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = new ParserErrorCode.con3('IMPLEMENTS_BEFORE_EXTENDS', 57, "The extends clause must be before the implements clause");
+  static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_EXTENDS', 57, "The extends clause must be before the implements clause");
 
-  static final ParserErrorCode IMPLEMENTS_BEFORE_WITH = new ParserErrorCode.con3('IMPLEMENTS_BEFORE_WITH', 58, "The with clause must be before the implements clause");
+  static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_WITH', 58, "The with clause must be before the implements clause");
 
-  static final ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = new ParserErrorCode.con3('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 59, "Import directives must preceed part directives");
+  static const ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 59, "Import directives must preceed part directives");
 
-  static final ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = new ParserErrorCode.con3('INITIALIZED_VARIABLE_IN_FOR_EACH', 60, "The loop variable in a for-each loop cannot be initialized");
+  static const ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = const ParserErrorCode.con3('INITIALIZED_VARIABLE_IN_FOR_EACH', 60, "The loop variable in a for-each loop cannot be initialized");
 
-  static final ParserErrorCode INVALID_CODE_POINT = new ParserErrorCode.con3('INVALID_CODE_POINT', 61, "The escape sequence '%s' is not a valid code point");
+  static const ParserErrorCode INVALID_CODE_POINT = const ParserErrorCode.con3('INVALID_CODE_POINT', 61, "The escape sequence '%s' is not a valid code point");
 
-  static final ParserErrorCode INVALID_COMMENT_REFERENCE = new ParserErrorCode.con3('INVALID_COMMENT_REFERENCE', 62, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
+  static const ParserErrorCode INVALID_COMMENT_REFERENCE = const ParserErrorCode.con3('INVALID_COMMENT_REFERENCE', 62, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
 
-  static final ParserErrorCode INVALID_HEX_ESCAPE = new ParserErrorCode.con3('INVALID_HEX_ESCAPE', 63, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
+  static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode.con3('INVALID_HEX_ESCAPE', 63, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
 
-  static final ParserErrorCode INVALID_OPERATOR = new ParserErrorCode.con3('INVALID_OPERATOR', 64, "The string '%s' is not a valid operator");
+  static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode.con3('INVALID_OPERATOR', 64, "The string '%s' is not a valid operator");
 
-  static final ParserErrorCode INVALID_OPERATOR_FOR_SUPER = new ParserErrorCode.con3('INVALID_OPERATOR_FOR_SUPER', 65, "The operator '%s' cannot be used with 'super'");
+  static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER = const ParserErrorCode.con3('INVALID_OPERATOR_FOR_SUPER', 65, "The operator '%s' cannot be used with 'super'");
 
-  static final ParserErrorCode INVALID_UNICODE_ESCAPE = new ParserErrorCode.con3('INVALID_UNICODE_ESCAPE', 66, "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
+  static const ParserErrorCode INVALID_UNICODE_ESCAPE = const ParserErrorCode.con3('INVALID_UNICODE_ESCAPE', 66, "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
 
-  static final ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = new ParserErrorCode.con3('LIBRARY_DIRECTIVE_NOT_FIRST', 67, "The library directive must appear before all other directives");
+  static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = const ParserErrorCode.con3('LIBRARY_DIRECTIVE_NOT_FIRST', 67, "The library directive must appear before all other directives");
 
-  static final ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = new ParserErrorCode.con3('LOCAL_FUNCTION_DECLARATION_MODIFIER', 68, "Local function declarations cannot specify any modifier");
+  static const ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = const ParserErrorCode.con3('LOCAL_FUNCTION_DECLARATION_MODIFIER', 68, "Local function declarations cannot specify any modifier");
 
-  static final ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = new ParserErrorCode.con3('MISSING_ASSIGNABLE_SELECTOR', 69, "Missing selector such as \".<identifier>\" or \"[0]\"");
+  static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = const ParserErrorCode.con3('MISSING_ASSIGNABLE_SELECTOR', 69, "Missing selector such as \".<identifier>\" or \"[0]\"");
 
-  static final ParserErrorCode MISSING_CATCH_OR_FINALLY = new ParserErrorCode.con3('MISSING_CATCH_OR_FINALLY', 70, "A try statement must have either a catch or finally clause");
+  static const ParserErrorCode MISSING_CATCH_OR_FINALLY = const ParserErrorCode.con3('MISSING_CATCH_OR_FINALLY', 70, "A try statement must have either a catch or finally clause");
 
-  static final ParserErrorCode MISSING_CLASS_BODY = new ParserErrorCode.con3('MISSING_CLASS_BODY', 71, "A class definition must have a body, even if it is empty");
+  static const ParserErrorCode MISSING_CLASS_BODY = const ParserErrorCode.con3('MISSING_CLASS_BODY', 71, "A class definition must have a body, even if it is empty");
 
-  static final ParserErrorCode MISSING_CLOSING_PARENTHESIS = new ParserErrorCode.con3('MISSING_CLOSING_PARENTHESIS', 72, "The closing parenthesis is missing");
+  static const ParserErrorCode MISSING_CLOSING_PARENTHESIS = const ParserErrorCode.con3('MISSING_CLOSING_PARENTHESIS', 72, "The closing parenthesis is missing");
 
-  static final ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = new ParserErrorCode.con3('MISSING_CONST_FINAL_VAR_OR_TYPE', 73, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
+  static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = const ParserErrorCode.con3('MISSING_CONST_FINAL_VAR_OR_TYPE', 73, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
 
-  static final ParserErrorCode MISSING_EXPRESSION_IN_THROW = new ParserErrorCode.con3('MISSING_EXPRESSION_IN_THROW', 74, "Throw expressions must compute the object to be thrown");
+  static const ParserErrorCode MISSING_EXPRESSION_IN_THROW = const ParserErrorCode.con3('MISSING_EXPRESSION_IN_THROW', 74, "Throw expressions must compute the object to be thrown");
 
-  static final ParserErrorCode MISSING_FUNCTION_BODY = new ParserErrorCode.con3('MISSING_FUNCTION_BODY', 75, "A function body must be provided");
+  static const ParserErrorCode MISSING_FUNCTION_BODY = const ParserErrorCode.con3('MISSING_FUNCTION_BODY', 75, "A function body must be provided");
 
-  static final ParserErrorCode MISSING_FUNCTION_PARAMETERS = new ParserErrorCode.con3('MISSING_FUNCTION_PARAMETERS', 76, "Functions must have an explicit list of parameters");
+  static const ParserErrorCode MISSING_FUNCTION_PARAMETERS = const ParserErrorCode.con3('MISSING_FUNCTION_PARAMETERS', 76, "Functions must have an explicit list of parameters");
 
-  static final ParserErrorCode MISSING_IDENTIFIER = new ParserErrorCode.con3('MISSING_IDENTIFIER', 77, "Expected an identifier");
+  static const ParserErrorCode MISSING_IDENTIFIER = const ParserErrorCode.con3('MISSING_IDENTIFIER', 77, "Expected an identifier");
 
-  static final ParserErrorCode MISSING_KEYWORD_OPERATOR = new ParserErrorCode.con3('MISSING_KEYWORD_OPERATOR', 78, "Operator declarations must be preceeded by the keyword 'operator'");
+  static const ParserErrorCode MISSING_KEYWORD_OPERATOR = const ParserErrorCode.con3('MISSING_KEYWORD_OPERATOR', 78, "Operator declarations must be preceeded by the keyword 'operator'");
 
-  static final ParserErrorCode MISSING_NAME_IN_LIBRARY_DIRECTIVE = new ParserErrorCode.con3('MISSING_NAME_IN_LIBRARY_DIRECTIVE', 79, "Library directives must include a library name");
+  static const ParserErrorCode MISSING_NAME_IN_LIBRARY_DIRECTIVE = const ParserErrorCode.con3('MISSING_NAME_IN_LIBRARY_DIRECTIVE', 79, "Library directives must include a library name");
 
-  static final ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE = new ParserErrorCode.con3('MISSING_NAME_IN_PART_OF_DIRECTIVE', 80, "Library directives must include a library name");
+  static const ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE = const ParserErrorCode.con3('MISSING_NAME_IN_PART_OF_DIRECTIVE', 80, "Library directives must include a library name");
 
-  static final ParserErrorCode MISSING_STATEMENT = new ParserErrorCode.con3('MISSING_STATEMENT', 81, "Expected a statement");
+  static const ParserErrorCode MISSING_STATEMENT = const ParserErrorCode.con3('MISSING_STATEMENT', 81, "Expected a statement");
 
-  static final ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con3('MISSING_TERMINATOR_FOR_PARAMETER_GROUP', 82, "There is no '%s' to close the parameter group");
+  static const ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('MISSING_TERMINATOR_FOR_PARAMETER_GROUP', 82, "There is no '%s' to close the parameter group");
 
-  static final ParserErrorCode MISSING_TYPEDEF_PARAMETERS = new ParserErrorCode.con3('MISSING_TYPEDEF_PARAMETERS', 83, "Type aliases for functions must have an explicit list of parameters");
+  static const ParserErrorCode MISSING_TYPEDEF_PARAMETERS = const ParserErrorCode.con3('MISSING_TYPEDEF_PARAMETERS', 83, "Type aliases for functions must have an explicit list of parameters");
 
-  static final ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = new ParserErrorCode.con3('MISSING_VARIABLE_IN_FOR_EACH', 84, "A loop variable must be declared in a for-each loop before the 'in', but none were found");
+  static const ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = const ParserErrorCode.con3('MISSING_VARIABLE_IN_FOR_EACH', 84, "A loop variable must be declared in a for-each loop before the 'in', but none were found");
 
-  static final ParserErrorCode MIXED_PARAMETER_GROUPS = new ParserErrorCode.con3('MIXED_PARAMETER_GROUPS', 85, "Cannot have both positional and named parameters in a single parameter list");
+  static const ParserErrorCode MIXED_PARAMETER_GROUPS = const ParserErrorCode.con3('MIXED_PARAMETER_GROUPS', 85, "Cannot have both positional and named parameters in a single parameter list");
 
-  static final ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = new ParserErrorCode.con3('MULTIPLE_EXTENDS_CLAUSES', 86, "Each class definition can have at most one extends clause");
+  static const ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = const ParserErrorCode.con3('MULTIPLE_EXTENDS_CLAUSES', 86, "Each class definition can have at most one extends clause");
 
-  static final ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = new ParserErrorCode.con3('MULTIPLE_IMPLEMENTS_CLAUSES', 87, "Each class definition can have at most one implements clause");
+  static const ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = const ParserErrorCode.con3('MULTIPLE_IMPLEMENTS_CLAUSES', 87, "Each class definition can have at most one implements clause");
 
-  static final ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES = new ParserErrorCode.con3('MULTIPLE_LIBRARY_DIRECTIVES', 88, "Only one library directive may be declared in a file");
+  static const ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES = const ParserErrorCode.con3('MULTIPLE_LIBRARY_DIRECTIVES', 88, "Only one library directive may be declared in a file");
 
-  static final ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS = new ParserErrorCode.con3('MULTIPLE_NAMED_PARAMETER_GROUPS', 89, "Cannot have multiple groups of named parameters in a single parameter list");
+  static const ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS = const ParserErrorCode.con3('MULTIPLE_NAMED_PARAMETER_GROUPS', 89, "Cannot have multiple groups of named parameters in a single parameter list");
 
-  static final ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES = new ParserErrorCode.con3('MULTIPLE_PART_OF_DIRECTIVES', 90, "Only one part-of directive may be declared in a file");
+  static const ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES = const ParserErrorCode.con3('MULTIPLE_PART_OF_DIRECTIVES', 90, "Only one part-of directive may be declared in a file");
 
-  static final ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS = new ParserErrorCode.con3('MULTIPLE_POSITIONAL_PARAMETER_GROUPS', 91, "Cannot have multiple groups of positional parameters in a single parameter list");
+  static const ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS = const ParserErrorCode.con3('MULTIPLE_POSITIONAL_PARAMETER_GROUPS', 91, "Cannot have multiple groups of positional parameters in a single parameter list");
 
-  static final ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH = new ParserErrorCode.con3('MULTIPLE_VARIABLES_IN_FOR_EACH', 92, "A single loop variable must be declared in a for-each loop before the 'in', but %s were found");
+  static const ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH = const ParserErrorCode.con3('MULTIPLE_VARIABLES_IN_FOR_EACH', 92, "A single loop variable must be declared in a for-each loop before the 'in', but %s were found");
 
-  static final ParserErrorCode MULTIPLE_WITH_CLAUSES = new ParserErrorCode.con3('MULTIPLE_WITH_CLAUSES', 93, "Each class definition can have at most one with clause");
+  static const ParserErrorCode MULTIPLE_WITH_CLAUSES = const ParserErrorCode.con3('MULTIPLE_WITH_CLAUSES', 93, "Each class definition can have at most one with clause");
 
-  static final ParserErrorCode NAMED_FUNCTION_EXPRESSION = new ParserErrorCode.con3('NAMED_FUNCTION_EXPRESSION', 94, "Function expressions cannot be named");
+  static const ParserErrorCode NAMED_FUNCTION_EXPRESSION = const ParserErrorCode.con3('NAMED_FUNCTION_EXPRESSION', 94, "Function expressions cannot be named");
 
-  static final ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con3('NAMED_PARAMETER_OUTSIDE_GROUP', 95, "Named parameters must be enclosed in curly braces ('{' and '}')");
+  static const ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP = const ParserErrorCode.con3('NAMED_PARAMETER_OUTSIDE_GROUP', 95, "Named parameters must be enclosed in curly braces ('{' and '}')");
 
-  static final ParserErrorCode NATIVE_CLAUSE_IN_NON_SDK_CODE = new ParserErrorCode.con3('NATIVE_CLAUSE_IN_NON_SDK_CODE', 96, "Native clause can only be used in the SDK and code that is loaded through native extensions");
+  static const ParserErrorCode NATIVE_CLAUSE_IN_NON_SDK_CODE = const ParserErrorCode.con3('NATIVE_CLAUSE_IN_NON_SDK_CODE', 96, "Native clause can only be used in the SDK and code that is loaded through native extensions");
 
-  static final ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = new ParserErrorCode.con3('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', 97, "Native functions can only be declared in the SDK and code that is loaded through native extensions");
+  static const ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = const ParserErrorCode.con3('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', 97, "Native functions can only be declared in the SDK and code that is loaded through native extensions");
 
-  static final ParserErrorCode NON_CONSTRUCTOR_FACTORY = new ParserErrorCode.con3('NON_CONSTRUCTOR_FACTORY', 98, "Only constructors can be declared to be a 'factory'");
+  static const ParserErrorCode NON_CONSTRUCTOR_FACTORY = const ParserErrorCode.con3('NON_CONSTRUCTOR_FACTORY', 98, "Only constructors can be declared to be a 'factory'");
 
-  static final ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = new ParserErrorCode.con3('NON_IDENTIFIER_LIBRARY_NAME', 99, "The name of a library must be an identifier");
+  static const ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = const ParserErrorCode.con3('NON_IDENTIFIER_LIBRARY_NAME', 99, "The name of a library must be an identifier");
 
-  static final ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = new ParserErrorCode.con3('NON_PART_OF_DIRECTIVE_IN_PART', 100, "The part-of directive must be the only directive in a part");
+  static const ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = const ParserErrorCode.con3('NON_PART_OF_DIRECTIVE_IN_PART', 100, "The part-of directive must be the only directive in a part");
 
-  static final ParserErrorCode NON_USER_DEFINABLE_OPERATOR = new ParserErrorCode.con3('NON_USER_DEFINABLE_OPERATOR', 101, "The operator '%s' is not user definable");
+  static const ParserErrorCode NON_USER_DEFINABLE_OPERATOR = const ParserErrorCode.con3('NON_USER_DEFINABLE_OPERATOR', 101, "The operator '%s' is not user definable");
 
-  static final ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = new ParserErrorCode.con3('NORMAL_BEFORE_OPTIONAL_PARAMETERS', 102, "Normal parameters must occur before optional parameters");
+  static const ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = const ParserErrorCode.con3('NORMAL_BEFORE_OPTIONAL_PARAMETERS', 102, "Normal parameters must occur before optional parameters");
 
-  static final ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = new ParserErrorCode.con3('POSITIONAL_AFTER_NAMED_ARGUMENT', 103, "Positional arguments must occur before named arguments");
+  static const ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = const ParserErrorCode.con3('POSITIONAL_AFTER_NAMED_ARGUMENT', 103, "Positional arguments must occur before named arguments");
 
-  static final ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = new ParserErrorCode.con3('POSITIONAL_PARAMETER_OUTSIDE_GROUP', 104, "Positional parameters must be enclosed in square brackets ('[' and ']')");
+  static const ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = const ParserErrorCode.con3('POSITIONAL_PARAMETER_OUTSIDE_GROUP', 104, "Positional parameters must be enclosed in square brackets ('[' and ']')");
 
-  static final ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR = new ParserErrorCode.con3('REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR', 105, "Only factory constructor can specify '=' redirection.");
+  static const ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR = const ParserErrorCode.con3('REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR', 105, "Only factory constructor can specify '=' redirection.");
 
-  static final ParserErrorCode SETTER_IN_FUNCTION = new ParserErrorCode.con3('SETTER_IN_FUNCTION', 106, "Setters cannot be defined within methods or functions");
+  static const ParserErrorCode SETTER_IN_FUNCTION = const ParserErrorCode.con3('SETTER_IN_FUNCTION', 106, "Setters cannot be defined within methods or functions");
 
-  static final ParserErrorCode STATIC_AFTER_CONST = new ParserErrorCode.con3('STATIC_AFTER_CONST', 107, "The modifier 'static' should be before the modifier 'const'");
+  static const ParserErrorCode STATIC_AFTER_CONST = const ParserErrorCode.con3('STATIC_AFTER_CONST', 107, "The modifier 'static' should be before the modifier 'const'");
 
-  static final ParserErrorCode STATIC_AFTER_FINAL = new ParserErrorCode.con3('STATIC_AFTER_FINAL', 108, "The modifier 'static' should be before the modifier 'final'");
+  static const ParserErrorCode STATIC_AFTER_FINAL = const ParserErrorCode.con3('STATIC_AFTER_FINAL', 108, "The modifier 'static' should be before the modifier 'final'");
 
-  static final ParserErrorCode STATIC_AFTER_VAR = new ParserErrorCode.con3('STATIC_AFTER_VAR', 109, "The modifier 'static' should be before the modifier 'var'");
+  static const ParserErrorCode STATIC_AFTER_VAR = const ParserErrorCode.con3('STATIC_AFTER_VAR', 109, "The modifier 'static' should be before the modifier 'var'");
 
-  static final ParserErrorCode STATIC_CONSTRUCTOR = new ParserErrorCode.con3('STATIC_CONSTRUCTOR', 110, "Constructors cannot be static");
+  static const ParserErrorCode STATIC_CONSTRUCTOR = const ParserErrorCode.con3('STATIC_CONSTRUCTOR', 110, "Constructors cannot be static");
 
-  static final ParserErrorCode STATIC_GETTER_WITHOUT_BODY = new ParserErrorCode.con3('STATIC_GETTER_WITHOUT_BODY', 111, "A 'static' getter must have a body");
+  static const ParserErrorCode STATIC_GETTER_WITHOUT_BODY = const ParserErrorCode.con3('STATIC_GETTER_WITHOUT_BODY', 111, "A 'static' getter must have a body");
 
-  static final ParserErrorCode STATIC_OPERATOR = new ParserErrorCode.con3('STATIC_OPERATOR', 112, "Operators cannot be static");
+  static const ParserErrorCode STATIC_OPERATOR = const ParserErrorCode.con3('STATIC_OPERATOR', 112, "Operators cannot be static");
 
-  static final ParserErrorCode STATIC_SETTER_WITHOUT_BODY = new ParserErrorCode.con3('STATIC_SETTER_WITHOUT_BODY', 113, "A 'static' setter must have a body");
+  static const ParserErrorCode STATIC_SETTER_WITHOUT_BODY = const ParserErrorCode.con3('STATIC_SETTER_WITHOUT_BODY', 113, "A 'static' setter must have a body");
 
-  static final ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = new ParserErrorCode.con3('STATIC_TOP_LEVEL_DECLARATION', 114, "Top-level declarations cannot be declared to be 'static'");
+  static const ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = const ParserErrorCode.con3('STATIC_TOP_LEVEL_DECLARATION', 114, "Top-level declarations cannot be declared to be 'static'");
 
-  static final ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = new ParserErrorCode.con3('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', 115, "The 'default' case should be the last case in a switch statement");
+  static const ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = const ParserErrorCode.con3('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', 115, "The 'default' case should be the last case in a switch statement");
 
-  static final ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = new ParserErrorCode.con3('SWITCH_HAS_MULTIPLE_DEFAULT_CASES', 116, "The 'default' case can only be declared once");
+  static const ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = const ParserErrorCode.con3('SWITCH_HAS_MULTIPLE_DEFAULT_CASES', 116, "The 'default' case can only be declared once");
 
-  static final ParserErrorCode TOP_LEVEL_OPERATOR = new ParserErrorCode.con3('TOP_LEVEL_OPERATOR', 117, "Operators must be declared within a class");
+  static const ParserErrorCode TOP_LEVEL_OPERATOR = const ParserErrorCode.con3('TOP_LEVEL_OPERATOR', 117, "Operators must be declared within a class");
 
-  static final ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con3('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', 118, "There is no '%s' to open a parameter group");
+  static const ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', 118, "There is no '%s' to open a parameter group");
 
-  static final ParserErrorCode UNEXPECTED_TOKEN = new ParserErrorCode.con3('UNEXPECTED_TOKEN', 119, "Unexpected token '%s'");
+  static const ParserErrorCode UNEXPECTED_TOKEN = const ParserErrorCode.con3('UNEXPECTED_TOKEN', 119, "Unexpected token '%s'");
 
-  static final ParserErrorCode WITH_BEFORE_EXTENDS = new ParserErrorCode.con3('WITH_BEFORE_EXTENDS', 120, "The extends clause must be before the with clause");
+  static const ParserErrorCode WITH_BEFORE_EXTENDS = const ParserErrorCode.con3('WITH_BEFORE_EXTENDS', 120, "The extends clause must be before the with clause");
 
-  static final ParserErrorCode WITH_WITHOUT_EXTENDS = new ParserErrorCode.con3('WITH_WITHOUT_EXTENDS', 121, "The with clause cannot be used without an extends clause");
+  static const ParserErrorCode WITH_WITHOUT_EXTENDS = const ParserErrorCode.con3('WITH_WITHOUT_EXTENDS', 121, "The with clause cannot be used without an extends clause");
 
-  static final ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = new ParserErrorCode.con3('WRONG_SEPARATOR_FOR_NAMED_PARAMETER', 122, "The default value of a named parameter should be preceeded by ':'");
+  static const ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = const ParserErrorCode.con3('WRONG_SEPARATOR_FOR_NAMED_PARAMETER', 122, "The default value of a named parameter should be preceeded by ':'");
 
-  static final ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = new ParserErrorCode.con3('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', 123, "The default value of a positional parameter should be preceeded by '='");
+  static const ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = const ParserErrorCode.con3('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', 123, "The default value of a positional parameter should be preceeded by '='");
 
-  static final ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = new ParserErrorCode.con3('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', 124, "Expected '%s' to close parameter group");
+  static const ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', 124, "Expected '%s' to close parameter group");
 
-  static final ParserErrorCode VAR_AND_TYPE = new ParserErrorCode.con3('VAR_AND_TYPE', 125, "Variables cannot be declared using both 'var' and a type name; remove the 'var'");
+  static const ParserErrorCode VAR_AND_TYPE = const ParserErrorCode.con3('VAR_AND_TYPE', 125, "Variables cannot be declared using both 'var' and a type name; remove the 'var'");
 
-  static final ParserErrorCode VAR_AS_TYPE_NAME = new ParserErrorCode.con3('VAR_AS_TYPE_NAME', 126, "The keyword 'var' cannot be used as a type name");
+  static const ParserErrorCode VAR_AS_TYPE_NAME = const ParserErrorCode.con3('VAR_AS_TYPE_NAME', 126, "The keyword 'var' cannot be used as a type name");
 
-  static final ParserErrorCode VAR_CLASS = new ParserErrorCode.con3('VAR_CLASS', 127, "Classes cannot be declared to be 'var'");
+  static const ParserErrorCode VAR_CLASS = const ParserErrorCode.con3('VAR_CLASS', 127, "Classes cannot be declared to be 'var'");
 
-  static final ParserErrorCode VAR_RETURN_TYPE = new ParserErrorCode.con3('VAR_RETURN_TYPE', 128, "The return type cannot be 'var'");
+  static const ParserErrorCode VAR_RETURN_TYPE = const ParserErrorCode.con3('VAR_RETURN_TYPE', 128, "The return type cannot be 'var'");
 
-  static final ParserErrorCode VAR_TYPEDEF = new ParserErrorCode.con3('VAR_TYPEDEF', 129, "Type aliases cannot be declared to be 'var'");
+  static const ParserErrorCode VAR_TYPEDEF = const ParserErrorCode.con3('VAR_TYPEDEF', 129, "Type aliases cannot be declared to be 'var'");
 
-  static final ParserErrorCode VOID_PARAMETER = new ParserErrorCode.con3('VOID_PARAMETER', 130, "Parameters cannot have a type of 'void'");
+  static const ParserErrorCode VOID_PARAMETER = const ParserErrorCode.con3('VOID_PARAMETER', 130, "Parameters cannot have a type of 'void'");
 
-  static final ParserErrorCode VOID_VARIABLE = new ParserErrorCode.con3('VOID_VARIABLE', 131, "Variables cannot have a type of 'void'");
+  static const ParserErrorCode VOID_VARIABLE = const ParserErrorCode.con3('VOID_VARIABLE', 131, "Variables cannot have a type of 'void'");
 
-  static final List<ParserErrorCode> values = [
+  static const List<ParserErrorCode> values = const [
       ABSTRACT_CLASS_MEMBER,
       ABSTRACT_STATIC_METHOD,
       ABSTRACT_TOP_LEVEL_FUNCTION,
@@ -7752,58 +7736,42 @@
   /**
    * The severity of this error.
    */
-  ErrorSeverity _severity;
+  final ErrorSeverity errorSeverity;
 
   /**
    * The template used to create the message to be displayed for this error.
    */
-  String _message;
+  final String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
    * there is no correction information for this error.
    */
-  String correction8;
+  final String correction;
 
   /**
    * Initialize a newly created error code to have the given severity and message.
    *
-   * @param severity the severity of the error
+   * @param errorSeverity the severity of the error
    * @param message the message template used to create the message to be displayed for the error
    */
-  ParserErrorCode.con1(String name, int ordinal, ErrorSeverity severity, String message) : super(name, ordinal) {
-    this._severity = severity;
-    this._message = message;
-  }
+  const ParserErrorCode.con1(String name, int ordinal, ErrorSeverity errorSeverity, String message) : this.con2(name, ordinal, errorSeverity, message, null);
 
   /**
    * Initialize a newly created error code to have the given severity, message and correction.
    *
-   * @param severity the severity of the error
+   * @param errorSeverity the severity of the error
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  ParserErrorCode.con2(String name, int ordinal, ErrorSeverity severity, String message, String correction) : super(name, ordinal) {
-    this._severity = severity;
-    this._message = message;
-    this.correction8 = correction;
-  }
+  const ParserErrorCode.con2(String name, int ordinal, this.errorSeverity, this.message, this.correction) : super(name, ordinal);
 
   /**
    * Initialize a newly created error code to have the given message and a severity of ERROR.
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  ParserErrorCode.con3(String name, int ordinal, String message) : this.con1(name, ordinal, ErrorSeverity.ERROR, message);
-
-  @override
-  String get correction => correction8;
-
-  @override
-  ErrorSeverity get errorSeverity => _severity;
-
-  @override
-  String get message => _message;
+  const ParserErrorCode.con3(String name, int ordinal, String message) : this.con2(name, ordinal, ErrorSeverity.ERROR, message, null);
 
   @override
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
@@ -7923,7 +7891,7 @@
   @override
   bool visitBooleanLiteral(BooleanLiteral node) {
     BooleanLiteral toNode = this._toNode as BooleanLiteral;
-    if (javaBooleanAnd(_isEqualTokens(node.literal, toNode.literal), identical(node.value, toNode.value))) {
+    if (javaBooleanAnd(_isEqualTokens(node.literal, toNode.literal), node.value == toNode.value)) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8040,7 +8008,7 @@
   @override
   bool visitDefaultFormalParameter(DefaultFormalParameter node) {
     DefaultFormalParameter toNode = this._toNode as DefaultFormalParameter;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.parameter, toNode.parameter), identical(node.kind, toNode.kind)), _isEqualTokens(node.separator, toNode.separator)), _isEqualNodes(node.defaultValue, toNode.defaultValue));
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.parameter, toNode.parameter), node.kind == toNode.kind), _isEqualTokens(node.separator, toNode.separator)), _isEqualNodes(node.defaultValue, toNode.defaultValue));
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index ff1e7ee..44dcd88 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -219,17 +219,17 @@
   /**
    * The listener to which errors will be reported.
    */
-  AnalysisErrorListener _errorListener;
+  final AnalysisErrorListener _errorListener;
 
   /**
    * The source containing the unit that will be analyzed.
    */
-  Source _source;
+  final Source _source;
 
   /**
    * The compilation unit with built Dart element models.
    */
-  CompilationUnit _unit;
+  final CompilationUnit _unit;
 
   /**
    * The [ClassDeclaration] that is currently being analyzed.
@@ -258,11 +258,7 @@
    * @param source the source containing the unit that will be analyzed
    * @param unit the compilation unit with built Dart element models
    */
-  AngularCompilationUnitBuilder(AnalysisErrorListener errorListener, Source source, CompilationUnit unit) {
-    this._errorListener = errorListener;
-    this._source = source;
-    this._unit = unit;
-  }
+  AngularCompilationUnitBuilder(this._errorListener, this._source, this._unit);
 
   /**
    * Builds Angular specific element models and adds them to the existing Dart elements.
@@ -1558,7 +1554,7 @@
    * @param keyword the keyword being tested for
    * @return `true` if the given token is a token for the given keyword
    */
-  bool _matches(sc.Token token, sc.Keyword keyword) => token != null && identical(token.type, sc.TokenType.KEYWORD) && identical((token as sc.KeywordToken).keyword, keyword);
+  bool _matches(sc.Token token, sc.Keyword keyword) => token != null && token.type == sc.TokenType.KEYWORD && (token as sc.KeywordToken).keyword == keyword;
 
   /**
    * Sets the visible source range for formal parameter.
@@ -1981,7 +1977,7 @@
   /**
    * The analysis context in which the element model will be built.
    */
-  InternalAnalysisContext _context;
+  final InternalAnalysisContext _context;
 
   /**
    * The error listener to which errors will be reported.
@@ -2018,8 +2014,7 @@
    *
    * @param context the analysis context in which the element model will be built
    */
-  HtmlUnitBuilder(InternalAnalysisContext context) {
-    this._context = context;
+  HtmlUnitBuilder(this._context) {
     this._errorListener = new RecordingErrorListener();
   }
 
@@ -2067,7 +2062,7 @@
       Source htmlSource = _htmlElement.source;
       ht.XmlAttributeNode scriptAttribute = _getScriptSourcePath(node);
       String scriptSourcePath = scriptAttribute == null ? null : scriptAttribute.text;
-      if (identical(node.attributeEnd.type, ht.TokenType.GT) && scriptSourcePath == null) {
+      if (node.attributeEnd.type == ht.TokenType.GT && scriptSourcePath == null) {
         EmbeddedHtmlScriptElementImpl script = new EmbeddedHtmlScriptElementImpl(node);
         try {
           LibraryResolver resolver = new LibraryResolver(_context);
@@ -2254,16 +2249,14 @@
   /**
    * The error reporter by which errors will be reported.
    */
-  ErrorReporter _errorReporter;
+  final ErrorReporter _errorReporter;
 
   /**
    * Create a new instance of the [BestPracticesVerifier].
    *
    * @param errorReporter the error reporter
    */
-  BestPracticesVerifier(ErrorReporter errorReporter) {
-    this._errorReporter = errorReporter;
-  }
+  BestPracticesVerifier(this._errorReporter);
 
   @override
   Object visitArgumentList(ArgumentList node) {
@@ -2809,7 +2802,7 @@
   /**
    * The error reporter by which errors will be reported.
    */
-  ErrorReporter _errorReporter;
+  final ErrorReporter _errorReporter;
 
   /**
    * The name of the `double` type.
@@ -2821,9 +2814,7 @@
    *
    * @param errorReporter the error reporter
    */
-  Dart2JSVerifier(ErrorReporter errorReporter) {
-    this._errorReporter = errorReporter;
-  }
+  Dart2JSVerifier(this._errorReporter);
 
   @override
   Object visitIsExpression(IsExpression node) {
@@ -2879,22 +2870,20 @@
   /**
    * The error reporter by which errors will be reported.
    */
-  ErrorReporter _errorReporter;
+  final ErrorReporter _errorReporter;
 
   /**
    * Create a new instance of the [DeadCodeVerifier].
    *
    * @param errorReporter the error reporter
    */
-  DeadCodeVerifier(ErrorReporter errorReporter) {
-    this._errorReporter = errorReporter;
-  }
+  DeadCodeVerifier(this._errorReporter);
 
   @override
   Object visitBinaryExpression(BinaryExpression node) {
     sc.Token operator = node.operator;
-    bool isAmpAmp = identical(operator.type, sc.TokenType.AMPERSAND_AMPERSAND);
-    bool isBarBar = identical(operator.type, sc.TokenType.BAR_BAR);
+    bool isAmpAmp = operator.type == sc.TokenType.AMPERSAND_AMPERSAND;
+    bool isBarBar = operator.type == sc.TokenType.BAR_BAR;
     if (isAmpAmp || isBarBar) {
       Expression lhsCondition = node.leftOperand;
       if (!_isDebugConstant(lhsCondition)) {
@@ -3179,7 +3168,7 @@
     // binary expression.
     // TODO(jwren) Do we want to take constant expressions into account, evaluate if(false) {}
     // differently than if(<condition>), when <condition> evaluates to a constant false value?
-    if (identical(operatorType, sc.TokenType.BAR_BAR)) {
+    if (operatorType == sc.TokenType.BAR_BAR) {
       if (lhsExpression is BooleanLiteral) {
         BooleanLiteral booleanLiteral = lhsExpression;
         if (!booleanLiteral.value) {
@@ -3189,7 +3178,7 @@
     }
     // If the operator is && and the left hand side is true literal, don't consider the RHS of the
     // binary expression.
-    if (identical(operatorType, sc.TokenType.AMPERSAND_AMPERSAND)) {
+    if (operatorType == sc.TokenType.AMPERSAND_AMPERSAND) {
       if (lhsExpression is BooleanLiteral) {
         BooleanLiteral booleanLiteral = lhsExpression;
         if (booleanLiteral.value) {
@@ -3197,7 +3186,8 @@
         }
       }
     }
-    return lhsExpression.accept(this) || node.rightOperand.accept(this);
+    Expression rhsExpression = node.rightOperand;
+    return (lhsExpression != null && lhsExpression.accept(this)) || (rhsExpression != null && rhsExpression.accept(this));
   }
 
   @override
@@ -3563,11 +3553,11 @@
  * @see HintCode
  */
 class HintGenerator {
-  List<CompilationUnit> _compilationUnits;
+  final List<CompilationUnit> _compilationUnits;
 
-  AnalysisContext _context;
+  final AnalysisContext _context;
 
-  AnalysisErrorListener _errorListener;
+  final AnalysisErrorListener _errorListener;
 
   ImportsVerifier _importsVerifier;
 
@@ -3578,14 +3568,11 @@
    */
   InheritanceManager _manager;
 
-  HintGenerator(List<CompilationUnit> compilationUnits, AnalysisContext context, AnalysisErrorListener errorListener) {
-    this._compilationUnits = compilationUnits;
-    this._context = context;
-    this._errorListener = errorListener;
-    LibraryElement library = compilationUnits[0].element.library;
+  HintGenerator(this._compilationUnits, this._context, this._errorListener) {
+    LibraryElement library = _compilationUnits[0].element.library;
     _importsVerifier = new ImportsVerifier(library);
-    _enableDart2JSHints = context.analysisOptions.dart2jsHint;
-    _manager = new InheritanceManager(compilationUnits[0].element.library);
+    _enableDart2JSHints = _context.analysisOptions.dart2jsHint;
+    _manager = new InheritanceManager(_compilationUnits[0].element.library);
   }
 
   void generateForLibrary() {
@@ -3980,12 +3967,12 @@
   /**
    * The inheritance manager used to find overridden methods.
    */
-  InheritanceManager _manager;
+  final InheritanceManager _manager;
 
   /**
    * The error reporter used to report errors.
    */
-  ErrorReporter _errorReporter;
+  final ErrorReporter _errorReporter;
 
   /**
    * Initialize a newly created verifier to look for inappropriate uses of the override annotation.
@@ -3993,10 +3980,7 @@
    * @param manager the inheritance manager used to find overridden methods
    * @param errorReporter the error reporter used to report errors
    */
-  OverrideVerifier(InheritanceManager manager, ErrorReporter errorReporter) {
-    this._manager = manager;
-    this._errorReporter = errorReporter;
-  }
+  OverrideVerifier(this._manager, this._errorReporter);
 
   @override
   Object visitMethodDeclaration(MethodDeclaration node) {
@@ -4054,17 +4038,14 @@
   /**
    * The analysis context containing the sources to be analyzed
    */
-  AnalysisContext _context;
+  final AnalysisContext _context;
 
   /**
    * The error reporter by which errors will be reported.
    */
-  ErrorReporter _errorReporter;
+  final ErrorReporter _errorReporter;
 
-  PubVerifier(AnalysisContext context, ErrorReporter errorReporter) {
-    this._context = context;
-    this._errorReporter = errorReporter;
-  }
+  PubVerifier(this._context, this._errorReporter);
 
   @override
   Object visitImportDirective(ImportDirective directive) {
@@ -4213,16 +4194,14 @@
   /**
    * The error reporter by which to-do comments will be reported.
    */
-  ErrorReporter _errorReporter;
+  final ErrorReporter _errorReporter;
 
   /**
    * Initialize a newly created to-do finder to report to-do comments to the given reporter.
    *
    * @param errorReporter the error reporter by which to-do comments will be reported
    */
-  ToDoFinder(ErrorReporter errorReporter) {
-    this._errorReporter = errorReporter;
-  }
+  ToDoFinder(this._errorReporter);
 
   /**
    * Search the comments in the given compilation unit for to-do comments and report an error for
@@ -4244,7 +4223,7 @@
     while (token != null && token.type != sc.TokenType.EOF) {
       sc.Token commentToken = token.precedingComments;
       while (commentToken != null) {
-        if (identical(commentToken.type, sc.TokenType.SINGLE_LINE_COMMENT) || identical(commentToken.type, sc.TokenType.MULTI_LINE_COMMENT)) {
+        if (commentToken.type == sc.TokenType.SINGLE_LINE_COMMENT || commentToken.type == sc.TokenType.MULTI_LINE_COMMENT) {
           _scrapeTodoComment(commentToken);
         }
         commentToken = commentToken.next;
@@ -4485,7 +4464,7 @@
         }
       } else {
         PropertyAccessorElement accessor = _findIdentifier(_enclosingUnit.accessors, functionName);
-        if (identical((property as sc.KeywordToken).keyword, sc.Keyword.SET)) {
+        if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) {
           accessor = accessor.variable.setter;
         }
         _enclosingExecutable = accessor;
@@ -4580,7 +4559,7 @@
         methodName.staticElement = _enclosingExecutable;
       } else {
         PropertyAccessorElement accessor = _findIdentifier(_enclosingClass.accessors, methodName);
-        if (identical((property as sc.KeywordToken).keyword, sc.Keyword.SET)) {
+        if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) {
           accessor = accessor.variable.setter;
           methodName.staticElement = accessor;
         }
@@ -5083,7 +5062,7 @@
         }
       } else {
         PropertyAccessorElement accessor = _findIdentifier(_enclosingUnit.accessors, functionName);
-        if (identical((property as sc.KeywordToken).keyword, sc.Keyword.SET)) {
+        if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) {
           accessor = accessor.variable.setter;
           functionName.staticElement = accessor;
         }
@@ -5181,7 +5160,7 @@
         methodName.staticElement = _enclosingExecutable;
       } else {
         PropertyAccessorElement accessor = _findIdentifier(_enclosingClass.accessors, methodName);
-        if (identical((property as sc.KeywordToken).keyword, sc.Keyword.SET)) {
+        if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) {
           accessor = accessor.variable.setter;
           methodName.staticElement = accessor;
         }
@@ -5565,7 +5544,7 @@
   /**
    * The resolver driving this participant.
    */
-  ResolverVisitor _resolver;
+  final ResolverVisitor _resolver;
 
   /**
    * The element for the library containing the compilation unit being visited.
@@ -5614,15 +5593,14 @@
    *
    * @param resolver the resolver driving this participant
    */
-  ElementResolver(ResolverVisitor resolver) {
-    this._resolver = resolver;
-    this._definingLibrary = resolver.definingLibrary;
+  ElementResolver(this._resolver) {
+    this._definingLibrary = _resolver.definingLibrary;
     AnalysisOptions options = _definingLibrary.context.analysisOptions;
     _enableHints = options.hint;
-    _dynamicType = resolver.typeProvider.dynamicType;
-    _typeType = resolver.typeProvider.typeType;
+    _dynamicType = _resolver.typeProvider.dynamicType;
+    _typeType = _resolver.typeProvider.typeType;
     _subtypeManager = new SubtypeManager();
-    _promoteManager = resolver.promoteManager;
+    _promoteManager = _resolver.promoteManager;
   }
 
   @override
@@ -6230,7 +6208,7 @@
   Object visitPrefixExpression(PrefixExpression node) {
     sc.Token operator = node.operator;
     sc.TokenType operatorType = operator.type;
-    if (operatorType.isUserDefinableOperator || identical(operatorType, sc.TokenType.PLUS_PLUS) || identical(operatorType, sc.TokenType.MINUS_MINUS)) {
+    if (operatorType.isUserDefinableOperator || operatorType == sc.TokenType.PLUS_PLUS || operatorType == sc.TokenType.MINUS_MINUS) {
       Expression operand = node.operand;
       String methodName = _getPrefixOperator(node);
       DartType staticType = _getStaticType(operand);
@@ -6323,9 +6301,9 @@
     //
     Element element = _resolveSimpleIdentifier(node);
     ClassElement enclosingClass = _resolver.enclosingClass;
-    if (_isFactoryConstructorReturnType(node) && element != enclosingClass) {
+    if (_isFactoryConstructorReturnType(node) && !identical(element, enclosingClass)) {
       _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS, node, []);
-    } else if (_isConstructorReturnType(node) && element != enclosingClass) {
+    } else if (_isConstructorReturnType(node) && !identical(element, enclosingClass)) {
       _resolver.reportErrorForNode(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
       element = null;
     } else if (element == null || (element is PrefixElement && !_isValidAsPrefix(node))) {
@@ -6649,7 +6627,7 @@
    * @param node the postfix expression being invoked
    * @return the name of the method invoked by the expression
    */
-  String _getPostfixOperator(PostfixExpression node) => (identical(node.operator.type, sc.TokenType.PLUS_PLUS)) ? sc.TokenType.PLUS.lexeme : sc.TokenType.MINUS.lexeme;
+  String _getPostfixOperator(PostfixExpression node) => (node.operator.type == sc.TokenType.PLUS_PLUS) ? sc.TokenType.PLUS.lexeme : sc.TokenType.MINUS.lexeme;
 
   /**
    * Return the name of the method invoked by the given postfix expression.
@@ -6660,11 +6638,11 @@
   String _getPrefixOperator(PrefixExpression node) {
     sc.Token operator = node.operator;
     sc.TokenType operatorType = operator.type;
-    if (identical(operatorType, sc.TokenType.PLUS_PLUS)) {
+    if (operatorType == sc.TokenType.PLUS_PLUS) {
       return sc.TokenType.PLUS.lexeme;
-    } else if (identical(operatorType, sc.TokenType.MINUS_MINUS)) {
+    } else if (operatorType == sc.TokenType.MINUS_MINUS) {
       return sc.TokenType.MINUS.lexeme;
-    } else if (identical(operatorType, sc.TokenType.MINUS)) {
+    } else if (operatorType == sc.TokenType.MINUS) {
       return "unary-";
     } else {
       return operator.lexeme;
@@ -6959,7 +6937,7 @@
     }
     if (labelElement != null) {
       ExecutableElement labelContainer = labelElement.getAncestor((element) => element is ExecutableElement);
-      if (labelContainer != _resolver.enclosingFunction) {
+      if (!identical(labelContainer, _resolver.enclosingFunction)) {
         _resolver.reportErrorForNode(CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE, labelNode, [labelNode.name]);
         labelElement = null;
       }
@@ -7346,9 +7324,9 @@
     Map<String, ParameterElement> namedParameters = new Map<String, ParameterElement>();
     for (ParameterElement parameter in parameters) {
       ParameterKind kind = parameter.parameterKind;
-      if (identical(kind, ParameterKind.REQUIRED)) {
+      if (kind == ParameterKind.REQUIRED) {
         requiredParameters.add(parameter);
-      } else if (identical(kind, ParameterKind.POSITIONAL)) {
+      } else if (kind == ParameterKind.POSITIONAL) {
         positionalParameters.add(parameter);
       } else {
         namedParameters[parameter.name] = parameter;
@@ -7773,16 +7751,14 @@
   /**
    * The name of the synthetic identifier.
    */
-  String name;
+  final String name;
 
   /**
    * Initialize a newly created synthetic identifier to have the given name.
    *
    * @param name the name of the synthetic identifier
    */
-  ElementResolver_SyntheticIdentifier(String name) {
-    this.name = name;
-  }
+  ElementResolver_SyntheticIdentifier(this.name);
 
   @override
   accept(AstVisitor visitor) => null;
@@ -7818,22 +7794,22 @@
   /**
    * The element for the library containing the compilation unit being visited.
    */
-  LibraryElement _definingLibrary;
+  final LibraryElement _definingLibrary;
 
   /**
    * The source representing the compilation unit being visited.
    */
-  Source _source;
+  final Source _source;
 
   /**
    * The object used to access the types from the core library.
    */
-  TypeProvider _typeProvider;
+  final TypeProvider _typeProvider;
 
   /**
    * The error listener that will be informed of any errors that are found during resolution.
    */
-  AnalysisErrorListener _errorListener;
+  final AnalysisErrorListener _errorListener;
 
   /**
    * Initialize a newly created incremental resolver to resolve a node in the given source in the
@@ -7846,12 +7822,7 @@
    * @param errorListener the error listener that will be informed of any errors that are found
    *          during resolution
    */
-  IncrementalResolver(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
-    this._definingLibrary = definingLibrary;
-    this._source = source;
-    this._typeProvider = typeProvider;
-    this._errorListener = errorListener;
-  }
+  IncrementalResolver(this._definingLibrary, this._source, this._typeProvider, this._errorListener);
 
   /**
    * Resolve the given node, reporting any errors or warnings to the given listener.
@@ -8052,7 +8023,7 @@
     List<ParameterElement> parameters = executableElement.parameters;
     for (int i = 0; i < parameters.length; i++) {
       ParameterElement parameterElement = parameters[i];
-      if (identical(parameterElement.parameterKind, ParameterKind.NAMED)) {
+      if (parameterElement.parameterKind == ParameterKind.NAMED) {
         namedParameterNames.add(parameterElement.name);
       }
     }
@@ -8067,7 +8038,7 @@
     List<ParameterElement> parameters = executableElement.parameters;
     for (int i = 0; i < parameters.length; i++) {
       ParameterElement parameterElement = parameters[i];
-      if (identical(parameterElement.parameterKind, parameterKind)) {
+      if (parameterElement.parameterKind == parameterKind) {
         parameterCount++;
       }
     }
@@ -8596,7 +8567,7 @@
           bool isMethod1 = newExecutableElementEntry is MethodElement;
           for (ExecutableElement executableElementInList in list) {
             bool isMethod2 = executableElementInList is MethodElement;
-            if (identical(isMethod1, isMethod2) && executableElementInList.type == newExecutableElementEntry.type) {
+            if (isMethod1 == isMethod2 && executableElementInList.type == newExecutableElementEntry.type) {
               alreadyInList = true;
               break;
             }
@@ -8820,7 +8791,7 @@
   /**
    * The analysis context in which this library is being analyzed.
    */
-  InternalAnalysisContext _analysisContext;
+  final InternalAnalysisContext _analysisContext;
 
   /**
    * The inheritance manager which is used for this member lookups in this library.
@@ -8830,12 +8801,12 @@
   /**
    * The listener to which analysis errors will be reported.
    */
-  AnalysisErrorListener _errorListener;
+  final AnalysisErrorListener _errorListener;
 
   /**
    * The source specifying the defining compilation unit of this library.
    */
-  Source librarySource;
+  final Source librarySource;
 
   /**
    * The library element representing this library.
@@ -8890,11 +8861,8 @@
    * @param errorListener the listener to which analysis errors will be reported
    * @param librarySource the source specifying the defining compilation unit of this library
    */
-  Library(InternalAnalysisContext analysisContext, AnalysisErrorListener errorListener, Source librarySource) {
-    this._analysisContext = analysisContext;
-    this._errorListener = errorListener;
-    this.librarySource = librarySource;
-    this._libraryElement = analysisContext.getLibraryElement(librarySource) as LibraryElementImpl;
+  Library(this._analysisContext, this._errorListener, this.librarySource) {
+    this._libraryElement = _analysisContext.getLibraryElement(librarySource) as LibraryElementImpl;
   }
 
   /**
@@ -9127,12 +9095,12 @@
   /**
    * The analysis context in which the element model will be built.
    */
-  InternalAnalysisContext _analysisContext;
+  final InternalAnalysisContext _analysisContext;
 
   /**
    * The listener to which errors will be reported.
    */
-  AnalysisErrorListener _errorListener;
+  final AnalysisErrorListener _errorListener;
 
   /**
    * The name of the function used as an entry point.
@@ -9145,10 +9113,7 @@
    * @param analysisContext the analysis context in which the element model will be built
    * @param errorListener the listener to which errors will be reported
    */
-  LibraryElementBuilder(InternalAnalysisContext analysisContext, AnalysisErrorListener errorListener) {
-    this._analysisContext = analysisContext;
-    this._errorListener = errorListener;
-  }
+  LibraryElementBuilder(this._analysisContext, this._errorListener);
 
   /**
    * Build the library element for the given library.
@@ -9183,14 +9148,14 @@
       } else if (directive is PartDirective) {
         PartDirective partDirective = directive;
         StringLiteral partUri = partDirective.uri;
-        Source partSource = library.getSource(partDirective);
+        Source partSource = partDirective.source;
         if (_analysisContext.exists(partSource)) {
           hasPartDirective = true;
           CompilationUnit partUnit = library.getAST(partSource);
           CompilationUnitElementImpl part = builder.buildCompilationUnit(partSource, partUnit);
           part.uriOffset = partUri.offset;
           part.uriEnd = partUri.end;
-          part.uri = library.getUri(partDirective);
+          part.uri = partDirective.uriContent;
           //
           // Validate that the part contains a part-of directive with the same name as the library.
           //
@@ -9408,7 +9373,7 @@
   /**
    * The analysis context in which the libraries are being analyzed.
    */
-  InternalAnalysisContext analysisContext;
+  final InternalAnalysisContext analysisContext;
 
   /**
    * The listener to which analysis errors will be reported, this error listener is either
@@ -9447,8 +9412,7 @@
    *
    * @param analysisContext the analysis context in which the library is being analyzed
    */
-  LibraryResolver(InternalAnalysisContext analysisContext) {
-    this.analysisContext = analysisContext;
+  LibraryResolver(this.analysisContext) {
     this._errorListener = new RecordingErrorListener();
     _coreLibrarySource = analysisContext.sourceFactory.forUri(DartSdk.DART_CORE);
   }
@@ -9702,7 +9666,7 @@
         _addDependencyToMap(dependencyMap, library, referencedLibrary);
         _addToDependencyMap(referencedLibrary, dependencyMap, visitedLibraries);
       }
-      if (!library.explicitlyImportsCore && library != _coreLibrary) {
+      if (!library.explicitlyImportsCore && !identical(library, _coreLibrary)) {
         _addDependencyToMap(dependencyMap, library, _coreLibrary);
       }
     }
@@ -9747,7 +9711,11 @@
       for (Directive directive in library.definingCompilationUnit.directives) {
         if (directive is ImportDirective) {
           ImportDirective importDirective = directive;
-          Source importedSource = library.getSource(importDirective);
+          String uriContent = importDirective.uriContent;
+          if (DartUriResolver.isDartExtUri(uriContent)) {
+            library.libraryElement.hasExtUri = true;
+          }
+          Source importedSource = importDirective.source;
           if (importedSource != null) {
             // The imported source will be null if the URI in the import directive was invalid.
             Library importedLibrary = _libraryMap[importedSource];
@@ -9756,7 +9724,7 @@
               StringLiteral uriLiteral = importDirective.uri;
               importElement.uriOffset = uriLiteral.offset;
               importElement.uriEnd = uriLiteral.end;
-              importElement.uri = library.getUri(importDirective);
+              importElement.uri = uriContent;
               importElement.combinators = _buildCombinators(importDirective);
               LibraryElement importedLibraryElement = importedLibrary.libraryElement;
               if (importedLibraryElement != null) {
@@ -9783,7 +9751,7 @@
           }
         } else if (directive is ExportDirective) {
           ExportDirective exportDirective = directive;
-          Source exportedSource = library.getSource(exportDirective);
+          Source exportedSource = exportDirective.source;
           if (exportedSource != null) {
             // The exported source will be null if the URI in the export directive was invalid.
             Library exportedLibrary = _libraryMap[exportedSource];
@@ -9792,7 +9760,7 @@
               StringLiteral uriLiteral = exportDirective.uri;
               exportElement.uriOffset = uriLiteral.offset;
               exportElement.uriEnd = uriLiteral.end;
-              exportElement.uri = library.getUri(exportDirective);
+              exportElement.uri = exportDirective.uriContent;
               exportElement.combinators = _buildCombinators(exportDirective);
               LibraryElement exportedLibraryElement = exportedLibrary.libraryElement;
               if (exportedLibraryElement != null) {
@@ -10138,7 +10106,7 @@
   /**
    * The analysis context in which the libraries are being analyzed.
    */
-  InternalAnalysisContext analysisContext;
+  final InternalAnalysisContext analysisContext;
 
   /**
    * The listener to which analysis errors will be reported, this error listener is either
@@ -10177,8 +10145,7 @@
    *
    * @param analysisContext the analysis context in which the library is being analyzed
    */
-  LibraryResolver2(InternalAnalysisContext analysisContext) {
-    this.analysisContext = analysisContext;
+  LibraryResolver2(this.analysisContext) {
     this._errorListener = new RecordingErrorListener();
     _coreLibrarySource = analysisContext.sourceFactory.forUri(DartSdk.DART_CORE);
   }
@@ -10313,6 +10280,10 @@
       for (Directive directive in library.definingCompilationUnit.directives) {
         if (directive is ImportDirective) {
           ImportDirective importDirective = directive;
+          String uriContent = importDirective.uriContent;
+          if (DartUriResolver.isDartExtUri(uriContent)) {
+            library.libraryElement.hasExtUri = true;
+          }
           Source importedSource = importDirective.source;
           if (importedSource != null && analysisContext.exists(importedSource)) {
             // The imported source will be null if the URI in the import directive was invalid.
@@ -10324,7 +10295,7 @@
                 importElement.uriOffset = uriLiteral.offset;
                 importElement.uriEnd = uriLiteral.end;
               }
-              importElement.uri = importDirective.uriContent;
+              importElement.uri = uriContent;
               importElement.combinators = _buildCombinators(importDirective);
               LibraryElement importedLibraryElement = importedLibrary.libraryElement;
               if (importedLibraryElement != null) {
@@ -10714,12 +10685,12 @@
    * The enclosing [ClassElement], this is what will determine if the error code should, or
    * should not, be generated on the source.
    */
-  Element _enclosingElement;
+  final Element _enclosingElement;
 
   /**
    * The conditional analysis error.
    */
-  AnalysisError analysisError;
+  final AnalysisError analysisError;
 
   /**
    * Instantiate a new [ProxyConditionalAnalysisError] with some enclosing element and the
@@ -10728,10 +10699,7 @@
    * @param enclosingElement the enclosing element
    * @param analysisError the conditional analysis error
    */
-  ProxyConditionalAnalysisError(Element enclosingElement, AnalysisError analysisError) {
-    this._enclosingElement = enclosingElement;
-    this.analysisError = analysisError;
-  }
+  ProxyConditionalAnalysisError(this._enclosingElement, this.analysisError);
 
   /**
    * Return `true` iff the enclosing class has the proxy annotation.
@@ -10755,7 +10723,7 @@
   /**
    * The source specifying the defining compilation unit of this library.
    */
-  Source librarySource;
+  final Source librarySource;
 
   /**
    * A list containing all of the libraries that are imported into this library.
@@ -10809,9 +10777,7 @@
    * @param librarySource the source specifying the defining compilation unit of this library
    * @param errorListener the listener to which analysis errors will be reported
    */
-  ResolvableLibrary(Source librarySource) {
-    this.librarySource = librarySource;
-  }
+  ResolvableLibrary(this.librarySource);
 
   /**
    * Return the AST structure associated with the given source, or `null` if the source does
@@ -11158,7 +11124,7 @@
     sc.TokenType operatorType = node.operator.type;
     Expression leftOperand = node.leftOperand;
     Expression rightOperand = node.rightOperand;
-    if (identical(operatorType, sc.TokenType.AMPERSAND_AMPERSAND)) {
+    if (operatorType == sc.TokenType.AMPERSAND_AMPERSAND) {
       safelyVisit(leftOperand);
       if (rightOperand != null) {
         try {
@@ -11177,7 +11143,7 @@
           _promoteManager.exitScope();
         }
       }
-    } else if (identical(operatorType, sc.TokenType.BAR_BAR)) {
+    } else if (operatorType == sc.TokenType.BAR_BAR) {
       safelyVisit(leftOperand);
       if (rightOperand != null) {
         try {
@@ -11236,7 +11202,7 @@
   @override
   Object visitComment(Comment node) {
     if (node.parent is FunctionDeclaration || node.parent is ConstructorDeclaration || node.parent is MethodDeclaration) {
-      if (node != _commentBeforeFunction) {
+      if (!identical(node, _commentBeforeFunction)) {
         _commentBeforeFunction = node;
         return null;
       }
@@ -11774,10 +11740,10 @@
       return null;
     }
     ElementKind kind = element.kind;
-    if (identical(kind, ElementKind.LOCAL_VARIABLE)) {
+    if (kind == ElementKind.LOCAL_VARIABLE) {
       return element as VariableElement;
     }
-    if (identical(kind, ElementKind.PARAMETER)) {
+    if (kind == ElementKind.PARAMETER) {
       return element as VariableElement;
     }
     return null;
@@ -12168,7 +12134,7 @@
   void _promoteTypes(Expression condition) {
     if (condition is BinaryExpression) {
       BinaryExpression binary = condition;
-      if (identical(binary.operator.type, sc.TokenType.AMPERSAND_AMPERSAND)) {
+      if (binary.operator.type == sc.TokenType.AMPERSAND_AMPERSAND) {
         Expression left = binary.leftOperand;
         Expression right = binary.rightOperand;
         _promoteTypes(left);
@@ -12194,7 +12160,7 @@
   void _propagateFalseState(Expression condition) {
     if (condition is BinaryExpression) {
       BinaryExpression binary = condition;
-      if (identical(binary.operator.type, sc.TokenType.BAR_BAR)) {
+      if (binary.operator.type == sc.TokenType.BAR_BAR) {
         _propagateFalseState(binary.leftOperand);
         _propagateFalseState(binary.rightOperand);
       }
@@ -12205,7 +12171,7 @@
       }
     } else if (condition is PrefixExpression) {
       PrefixExpression prefix = condition;
-      if (identical(prefix.operator.type, sc.TokenType.BANG)) {
+      if (prefix.operator.type == sc.TokenType.BANG) {
         _propagateTrueState(prefix.operand);
       }
     } else if (condition is ParenthesizedExpression) {
@@ -12231,7 +12197,7 @@
   void _propagateTrueState(Expression condition) {
     if (condition is BinaryExpression) {
       BinaryExpression binary = condition;
-      if (identical(binary.operator.type, sc.TokenType.AMPERSAND_AMPERSAND)) {
+      if (binary.operator.type == sc.TokenType.AMPERSAND_AMPERSAND) {
         _propagateTrueState(binary.leftOperand);
         _propagateTrueState(binary.rightOperand);
       }
@@ -12242,7 +12208,7 @@
       }
     } else if (condition is PrefixExpression) {
       PrefixExpression prefix = condition;
-      if (identical(prefix.operator.type, sc.TokenType.BANG)) {
+      if (prefix.operator.type == sc.TokenType.BANG) {
         _propagateFalseState(prefix.operand);
       }
     } else if (condition is ParenthesizedExpression) {
@@ -12349,7 +12315,7 @@
   /**
    * The source representing the compilation unit being visited.
    */
-  Source source;
+  final Source source;
 
   /**
    * The error listener that will be informed of any errors that are found during resolution.
@@ -12364,7 +12330,7 @@
   /**
    * The object used to access the types from the core library.
    */
-  TypeProvider typeProvider;
+  final TypeProvider typeProvider;
 
   /**
    * The scope used to resolve labels for `break` and `continue` statements, or
@@ -12379,13 +12345,11 @@
    * @param source the source representing the compilation unit being visited
    * @param typeProvider the object used to access the types from the core library
    */
-  ScopedVisitor.con1(Library library, Source source, TypeProvider typeProvider) {
+  ScopedVisitor.con1(Library library, this.source, this.typeProvider) {
     this._definingLibrary = library.libraryElement;
-    this.source = source;
     LibraryScope libraryScope = library.libraryScope;
     this._errorListener = libraryScope.errorListener;
     this._nameScope = libraryScope;
-    this.typeProvider = typeProvider;
   }
 
   /**
@@ -12398,12 +12362,10 @@
    * @param errorListener the error listener that will be informed of any errors that are found
    *          during resolution
    */
-  ScopedVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
+  ScopedVisitor.con2(LibraryElement definingLibrary, this.source, this.typeProvider, AnalysisErrorListener errorListener) {
     this._definingLibrary = definingLibrary;
-    this.source = source;
     this._errorListener = errorListener;
     this._nameScope = new LibraryScope(definingLibrary, errorListener);
-    this.typeProvider = typeProvider;
   }
 
   /**
@@ -12417,12 +12379,10 @@
    * @param errorListener the error listener that will be informed of any errors that are found
    *          during resolution
    */
-  ScopedVisitor.con3(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, Scope nameScope, AnalysisErrorListener errorListener) {
+  ScopedVisitor.con3(LibraryElement definingLibrary, this.source, this.typeProvider, Scope nameScope, AnalysisErrorListener errorListener) {
     this._definingLibrary = definingLibrary;
-    this.source = source;
     this._errorListener = errorListener;
     this._nameScope = nameScope;
-    this.typeProvider = typeProvider;
   }
 
   /**
@@ -12432,13 +12392,11 @@
    * @param source the source representing the compilation unit being visited
    * @param typeProvider the object used to access the types from the core library
    */
-  ScopedVisitor.con4(ResolvableLibrary library, Source source, TypeProvider typeProvider) {
+  ScopedVisitor.con4(ResolvableLibrary library, this.source, this.typeProvider) {
     this._definingLibrary = library.libraryElement;
-    this.source = source;
     LibraryScope libraryScope = library.libraryScope;
     this._errorListener = libraryScope.errorListener;
     this._nameScope = libraryScope;
-    this.typeProvider = typeProvider;
   }
 
   /**
@@ -13047,7 +13005,7 @@
   /**
    * The resolver driving the resolution and type analysis.
    */
-  ResolverVisitor _resolver;
+  final ResolverVisitor _resolver;
 
   /**
    * The object providing access to the types defined by the language.
@@ -13091,12 +13049,11 @@
    *
    * @param resolver the resolver driving this participant
    */
-  StaticTypeAnalyzer(ResolverVisitor resolver) {
-    this._resolver = resolver;
-    _typeProvider = resolver.typeProvider;
+  StaticTypeAnalyzer(this._resolver) {
+    _typeProvider = _resolver.typeProvider;
     _dynamicType = _typeProvider.dynamicType;
-    _overrideManager = resolver.overrideManager;
-    _promoteManager = resolver.promoteManager;
+    _overrideManager = _resolver.overrideManager;
+    _promoteManager = _resolver.promoteManager;
   }
 
   /**
@@ -13184,7 +13141,7 @@
   @override
   Object visitAssignmentExpression(AssignmentExpression node) {
     sc.TokenType operator = node.operator.type;
-    if (identical(operator, sc.TokenType.EQ)) {
+    if (operator == sc.TokenType.EQ) {
       Expression rightHandSide = node.rightHandSide;
       DartType staticType = _getStaticType(rightHandSide);
       _recordStaticType(node, staticType);
@@ -13202,7 +13159,7 @@
       DartType staticType = _computeStaticReturnType(staticMethodElement);
       _recordStaticType(node, staticType);
       MethodElement propagatedMethodElement = node.propagatedElement;
-      if (propagatedMethodElement != staticMethodElement) {
+      if (!identical(propagatedMethodElement, staticMethodElement)) {
         DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
         if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
           _recordPropagatedType(node, propagatedType);
@@ -13256,7 +13213,7 @@
     staticType = _refineBinaryExpressionType(node, staticType);
     _recordStaticType(node, staticType);
     MethodElement propagatedMethodElement = node.propagatedElement;
-    if (propagatedMethodElement != staticMethodElement) {
+    if (!identical(propagatedMethodElement, staticMethodElement)) {
       DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
       if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
         _recordPropagatedType(node, propagatedType);
@@ -13417,7 +13374,7 @@
       _recordPropagatedType(node, staticPropagatedType);
     }
     ExecutableElement propagatedMethodElement = node.propagatedElement;
-    if (propagatedMethodElement != staticMethodElement) {
+    if (!identical(propagatedMethodElement, staticMethodElement)) {
       // Record static return type of the propagated element.
       DartType propagatedStaticType = _computeStaticReturnType(propagatedMethodElement);
       if (propagatedStaticType != null && (staticStaticType == null || propagatedStaticType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedStaticType.isMoreSpecificThan(staticPropagatedType))) {
@@ -13444,7 +13401,7 @@
       DartType staticType = _computeArgumentType(staticMethodElement);
       _recordStaticType(node, staticType);
       MethodElement propagatedMethodElement = node.propagatedElement;
-      if (propagatedMethodElement != staticMethodElement) {
+      if (!identical(propagatedMethodElement, staticMethodElement)) {
         DartType propagatedType = _computeArgumentType(propagatedMethodElement);
         if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
           _recordPropagatedType(node, propagatedType);
@@ -13455,7 +13412,7 @@
       DartType staticType = _computeStaticReturnType(staticMethodElement);
       _recordStaticType(node, staticType);
       MethodElement propagatedMethodElement = node.propagatedElement;
-      if (propagatedMethodElement != staticMethodElement) {
+      if (!identical(propagatedMethodElement, staticMethodElement)) {
         DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
         if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
           _recordPropagatedType(node, propagatedType);
@@ -13789,7 +13746,7 @@
       }
     } else {
       Element propagatedElement = methodNameNode.propagatedElement;
-      if (propagatedElement != staticMethodElement) {
+      if (!identical(propagatedElement, staticMethodElement)) {
         // Record static return type of the propagated element.
         DartType propagatedStaticType = _computeStaticReturnType(propagatedElement);
         if (propagatedStaticType != null && (staticStaticType == null || propagatedStaticType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedStaticType.isMoreSpecificThan(staticPropagatedType))) {
@@ -13862,7 +13819,7 @@
     Expression operand = node.operand;
     DartType staticType = _getStaticType(operand);
     sc.TokenType operator = node.operator.type;
-    if (identical(operator, sc.TokenType.MINUS_MINUS) || identical(operator, sc.TokenType.PLUS_PLUS)) {
+    if (operator == sc.TokenType.MINUS_MINUS || operator == sc.TokenType.PLUS_PLUS) {
       DartType intType = _typeProvider.intType;
       if (identical(_getStaticType(node.operand), intType)) {
         staticType = intType;
@@ -13946,13 +13903,13 @@
   @override
   Object visitPrefixExpression(PrefixExpression node) {
     sc.TokenType operator = node.operator.type;
-    if (identical(operator, sc.TokenType.BANG)) {
+    if (operator == sc.TokenType.BANG) {
       _recordStaticType(node, _typeProvider.boolType);
     } else {
       // The other cases are equivalent to invoking a method.
       ExecutableElement staticMethodElement = node.staticElement;
       DartType staticType = _computeStaticReturnType(staticMethodElement);
-      if (identical(operator, sc.TokenType.MINUS_MINUS) || identical(operator, sc.TokenType.PLUS_PLUS)) {
+      if (operator == sc.TokenType.MINUS_MINUS || operator == sc.TokenType.PLUS_PLUS) {
         DartType intType = _typeProvider.intType;
         if (identical(_getStaticType(node.operand), intType)) {
           staticType = intType;
@@ -13960,7 +13917,7 @@
       }
       _recordStaticType(node, staticType);
       MethodElement propagatedMethodElement = node.propagatedElement;
-      if (propagatedMethodElement != staticMethodElement) {
+      if (!identical(propagatedMethodElement, staticMethodElement)) {
         DartType propagatedType = _computeStaticReturnType(propagatedMethodElement);
         if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
           _recordPropagatedType(node, propagatedType);
@@ -14615,20 +14572,20 @@
   DartType _refineBinaryExpressionType(BinaryExpression node, DartType staticType) {
     sc.TokenType operator = node.operator.type;
     // bool
-    if (identical(operator, sc.TokenType.AMPERSAND_AMPERSAND) || identical(operator, sc.TokenType.BAR_BAR) || identical(operator, sc.TokenType.EQ_EQ) || identical(operator, sc.TokenType.BANG_EQ)) {
+    if (operator == sc.TokenType.AMPERSAND_AMPERSAND || operator == sc.TokenType.BAR_BAR || operator == sc.TokenType.EQ_EQ || operator == sc.TokenType.BANG_EQ) {
       return _typeProvider.boolType;
     }
     DartType intType = _typeProvider.intType;
     if (_getStaticType(node.leftOperand) == intType) {
       // int op double
-      if (identical(operator, sc.TokenType.MINUS) || identical(operator, sc.TokenType.PERCENT) || identical(operator, sc.TokenType.PLUS) || identical(operator, sc.TokenType.STAR)) {
+      if (operator == sc.TokenType.MINUS || operator == sc.TokenType.PERCENT || operator == sc.TokenType.PLUS || operator == sc.TokenType.STAR) {
         DartType doubleType = _typeProvider.doubleType;
         if (_getStaticType(node.rightOperand) == doubleType) {
           return doubleType;
         }
       }
       // int op int
-      if (identical(operator, sc.TokenType.MINUS) || identical(operator, sc.TokenType.PERCENT) || identical(operator, sc.TokenType.PLUS) || identical(operator, sc.TokenType.STAR) || identical(operator, sc.TokenType.TILDE_SLASH)) {
+      if (operator == sc.TokenType.MINUS || operator == sc.TokenType.PERCENT || operator == sc.TokenType.PLUS || operator == sc.TokenType.STAR || operator == sc.TokenType.TILDE_SLASH) {
         if (_getStaticType(node.rightOperand) == intType) {
           staticType = intType;
         }
@@ -14925,7 +14882,7 @@
   /**
    * The outer scope in which types might be overridden.
    */
-  TypeOverrideManager_TypeOverrideScope _outerScope;
+  final TypeOverrideManager_TypeOverrideScope _outerScope;
 
   /**
    * A table mapping elements to the overridden type of that element.
@@ -14937,9 +14894,7 @@
    *
    * @param outerScope the outer scope in which types might be overridden
    */
-  TypeOverrideManager_TypeOverrideScope(TypeOverrideManager_TypeOverrideScope outerScope) {
-    this._outerScope = outerScope;
-  }
+  TypeOverrideManager_TypeOverrideScope(this._outerScope);
 
   /**
    * Apply a set of overrides that were previously captured.
@@ -15095,7 +15050,7 @@
   /**
    * The outer scope in which types might be promoter.
    */
-  TypePromotionManager_TypePromoteScope _outerScope;
+  final TypePromotionManager_TypePromoteScope _outerScope;
 
   /**
    * A table mapping elements to the promoted type of that element.
@@ -15107,9 +15062,7 @@
    *
    * @param outerScope the outer scope in which types might be promoted
    */
-  TypePromotionManager_TypePromoteScope(TypePromotionManager_TypePromoteScope outerScope) {
-    this._outerScope = outerScope;
-  }
+  TypePromotionManager_TypePromoteScope(this._outerScope);
 
   /**
    * Returns the elements with promoted types.
@@ -15462,7 +15415,7 @@
    */
   static bool _isBuiltInIdentifier(TypeName node) {
     sc.Token token = node.name.beginToken;
-    return identical(token.type, sc.TokenType.KEYWORD);
+    return token.type == sc.TokenType.KEYWORD;
   }
 
   /**
@@ -15580,14 +15533,14 @@
     if (extendsClause != null) {
       ErrorCode errorCode = (node.withClause == null ? CompileTimeErrorCode.EXTENDS_NON_CLASS : CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS);
       superclassType = _resolveType(extendsClause.superclass, errorCode, errorCode);
-      if (superclassType != typeProvider.objectType) {
+      if (!identical(superclassType, typeProvider.objectType)) {
         classElement.validMixin = false;
       }
     }
     if (classElement != null) {
       if (superclassType == null) {
         InterfaceType objectType = typeProvider.objectType;
-        if (classElement.type != objectType) {
+        if (!identical(classElement.type, objectType)) {
           superclassType = objectType;
         }
       }
@@ -15636,11 +15589,14 @@
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     super.visitConstructorDeclaration(node);
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
-    ClassElement definingClass = element.enclosingElement as ClassElement;
-    element.returnType = definingClass.type;
-    FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
-    type.typeArguments = definingClass.type.typeArguments;
-    element.type = type;
+    if (element != null) {
+      // TODO(brianwilkerson) Figure out how the element could ever be null.
+      ClassElement definingClass = element.enclosingElement as ClassElement;
+      element.returnType = definingClass.type;
+      FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
+      type.typeArguments = definingClass.type.typeArguments;
+      element.type = type;
+    }
     return null;
   }
 
@@ -15874,7 +15830,7 @@
       } else if (_isTypeNameInIsExpression(node)) {
         reportErrorForNode(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
       } else if ((redirectingConstructorKind = _getRedirectingConstructorKind(node)) != null) {
-        ErrorCode errorCode = (identical(redirectingConstructorKind, RedirectingConstructorKind.CONST) ? CompileTimeErrorCode.REDIRECT_TO_NON_CLASS : StaticWarningCode.REDIRECT_TO_NON_CLASS) as ErrorCode;
+        ErrorCode errorCode = (redirectingConstructorKind == RedirectingConstructorKind.CONST ? CompileTimeErrorCode.REDIRECT_TO_NON_CLASS : StaticWarningCode.REDIRECT_TO_NON_CLASS) as ErrorCode;
         reportErrorForNode(errorCode, typeName, [typeName.name]);
       } else if (_isTypeNameInTypeArgumentList(node)) {
         reportErrorForNode(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [typeName.name]);
@@ -15921,7 +15877,7 @@
       } else if (_isTypeNameInIsExpression(node)) {
         reportErrorForNode(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
       } else if ((redirectingConstructorKind = _getRedirectingConstructorKind(node)) != null) {
-        ErrorCode errorCode = (identical(redirectingConstructorKind, RedirectingConstructorKind.CONST) ? CompileTimeErrorCode.REDIRECT_TO_NON_CLASS : StaticWarningCode.REDIRECT_TO_NON_CLASS) as ErrorCode;
+        ErrorCode errorCode = (redirectingConstructorKind == RedirectingConstructorKind.CONST ? CompileTimeErrorCode.REDIRECT_TO_NON_CLASS : StaticWarningCode.REDIRECT_TO_NON_CLASS) as ErrorCode;
         reportErrorForNode(errorCode, typeName, [typeName.name]);
       } else if (_isTypeNameInTypeArgumentList(node)) {
         reportErrorForNode(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [typeName.name]);
@@ -16523,13 +16479,13 @@
  * Kind of the redirecting constructor.
  */
 class RedirectingConstructorKind extends Enum<RedirectingConstructorKind> {
-  static final RedirectingConstructorKind CONST = new RedirectingConstructorKind('CONST', 0);
+  static const RedirectingConstructorKind CONST = const RedirectingConstructorKind('CONST', 0);
 
-  static final RedirectingConstructorKind NORMAL = new RedirectingConstructorKind('NORMAL', 1);
+  static const RedirectingConstructorKind NORMAL = const RedirectingConstructorKind('NORMAL', 1);
 
-  static final List<RedirectingConstructorKind> values = [CONST, NORMAL];
+  static const List<RedirectingConstructorKind> values = const [CONST, NORMAL];
 
-  RedirectingConstructorKind(String name, int ordinal) : super(name, ordinal);
+  const RedirectingConstructorKind(String name, int ordinal) : super(name, ordinal);
 }
 
 class UnifyingAstVisitor_TypeResolverVisitor_visitClassDeclarationInScope extends UnifyingAstVisitor<Object> {
@@ -16652,7 +16608,7 @@
     }
     // Must be local or parameter.
     ElementKind kind = element.kind;
-    if (identical(kind, ElementKind.LOCAL_VARIABLE)) {
+    if (kind == ElementKind.LOCAL_VARIABLE) {
       node.staticElement = element;
       if (node.inSetterContext()) {
         LocalVariableElementImpl variableImpl = element as LocalVariableElementImpl;
@@ -16661,7 +16617,7 @@
           variableImpl.markPotentiallyMutatedInClosure();
         }
       }
-    } else if (identical(kind, ElementKind.PARAMETER)) {
+    } else if (kind == ElementKind.PARAMETER) {
       node.staticElement = element;
       if (node.inSetterContext()) {
         ParameterElementImpl parameterImpl = element as ParameterElementImpl;
@@ -16741,7 +16697,7 @@
   /**
    * The scope in which this scope is lexically enclosed.
    */
-  Scope enclosingScope;
+  final Scope enclosingScope;
 
   /**
    * A table mapping names that will be defined in this scope, but right now are not initialized.
@@ -16760,9 +16716,7 @@
    *
    * @param enclosingScope the scope in which this scope is lexically enclosed
    */
-  EnclosedScope(Scope enclosingScope) {
-    this.enclosingScope = enclosingScope;
-  }
+  EnclosedScope(this.enclosingScope);
 
   @override
   AnalysisErrorListener get errorListener => enclosingScope.errorListener;
@@ -16807,7 +16761,7 @@
  * Instances of the class `FunctionScope` implement the scope defined by a function.
  */
 class FunctionScope extends EnclosedScope {
-  ExecutableElement _functionElement;
+  final ExecutableElement _functionElement;
 
   bool _parametersDefined = false;
 
@@ -16817,11 +16771,10 @@
    * @param enclosingScope the scope in which this scope is lexically enclosed
    * @param functionElement the element representing the type represented by this scope
    */
-  FunctionScope(Scope enclosingScope, ExecutableElement functionElement) : super(new EnclosedScope(enclosingScope)) {
-    if (functionElement == null) {
+  FunctionScope(Scope enclosingScope, this._functionElement) : super(new EnclosedScope(enclosingScope)) {
+    if (_functionElement == null) {
       throw new IllegalArgumentException("function element cannot be null");
     }
-    this._functionElement = functionElement;
   }
 
   /**
@@ -16852,7 +16805,7 @@
  * alias.
  */
 class FunctionTypeScope extends EnclosedScope {
-  FunctionTypeAliasElement _typeElement;
+  final FunctionTypeAliasElement _typeElement;
 
   bool _parametersDefined = false;
 
@@ -16862,8 +16815,7 @@
    * @param enclosingScope the scope in which this scope is lexically enclosed
    * @param typeElement the element representing the type alias represented by this scope
    */
-  FunctionTypeScope(Scope enclosingScope, FunctionTypeAliasElement typeElement) : super(new EnclosedScope(enclosingScope)) {
-    this._typeElement = typeElement;
+  FunctionTypeScope(Scope enclosingScope, this._typeElement) : super(new EnclosedScope(enclosingScope)) {
     _defineTypeParameters();
   }
 
@@ -16902,17 +16854,17 @@
   /**
    * The label scope enclosing this label scope.
    */
-  LabelScope _outerScope;
+  final LabelScope _outerScope;
 
   /**
    * The label defined in this scope.
    */
-  String _label;
+  final String _label;
 
   /**
    * The element to which the label resolves.
    */
-  LabelElement _element;
+  final LabelElement _element;
 
   /**
    * The marker used to look up a label element for an unlabeled `break` or `continue`.
@@ -16943,11 +16895,7 @@
    * @param label the label defined in this scope
    * @param element the element to which the label resolves
    */
-  LabelScope.con2(LabelScope outerScope, String label, LabelElement element) {
-    this._outerScope = outerScope;
-    this._label = label;
-    this._element = element;
-  }
+  LabelScope.con2(this._outerScope, this._label, this._element);
 
   /**
    * Return the label element corresponding to the given label, or `null` if the given label
@@ -16975,12 +16923,12 @@
   /**
    * The element representing the library in which this scope is enclosed.
    */
-  LibraryElement _definingLibrary;
+  final LibraryElement _definingLibrary;
 
   /**
    * The listener that is to be informed when an error is encountered.
    */
-  AnalysisErrorListener errorListener;
+  final AnalysisErrorListener errorListener;
 
   /**
    * A list of the namespaces representing the names that are available in this scope from imported
@@ -16995,10 +16943,8 @@
    *          this scope
    * @param errorListener the listener that is to be informed when an error is encountered
    */
-  LibraryImportScope(LibraryElement definingLibrary, AnalysisErrorListener errorListener) {
-    this._definingLibrary = definingLibrary;
-    this.errorListener = errorListener;
-    _createImportedNamespaces(definingLibrary);
+  LibraryImportScope(this._definingLibrary, this.errorListener) {
+    _createImportedNamespaces(_definingLibrary);
   }
 
   @override
@@ -17019,7 +16965,7 @@
       if (element != null) {
         if (foundElement == null) {
           foundElement = element;
-        } else if (foundElement != element) {
+        } else if (!identical(foundElement, element)) {
           foundElement = MultiplyDefinedElementImpl.fromElements(_definingLibrary.context, foundElement, element);
         }
       }
@@ -17201,7 +17147,7 @@
    * A table mapping names that are defined in this namespace to the element representing the thing
    * declared with that name.
    */
-  Map<String, Element> _definedNames;
+  final Map<String, Element> _definedNames;
 
   /**
    * An empty namespace.
@@ -17214,9 +17160,7 @@
    * @param definedNames the mapping from names that are defined in this namespace to the
    *          corresponding elements
    */
-  Namespace(Map<String, Element> definedNames) {
-    this._definedNames = definedNames;
-  }
+  Namespace(this._definedNames);
 
   /**
    * Return the element in this namespace that is available to the containing scope using the given
@@ -17689,7 +17633,7 @@
   /**
    * The listener to which analysis errors will be reported.
    */
-  AnalysisErrorListener _errorListener;
+  final AnalysisErrorListener _errorListener;
 
   /**
    * Initialize a newly created scope builder to generate a scope that will report errors to the
@@ -17697,9 +17641,7 @@
    *
    * @param errorListener the listener to which analysis errors will be reported
    */
-  ScopeBuilder(AnalysisErrorListener errorListener) {
-    this._errorListener = errorListener;
-  }
+  ScopeBuilder(this._errorListener);
 
   /**
    * Return the scope in which the given AST structure should be resolved.
@@ -17785,12 +17727,12 @@
   /**
    * The error reporter by which errors will be reported.
    */
-  ErrorReporter _errorReporter;
+  final ErrorReporter _errorReporter;
 
   /**
    * The type provider used to access the known types.
    */
-  TypeProvider _typeProvider;
+  final TypeProvider _typeProvider;
 
   /**
    * The type representing the type 'bool'.
@@ -17817,13 +17759,11 @@
    *
    * @param errorReporter the error reporter by which errors will be reported
    */
-  ConstantVerifier(ErrorReporter errorReporter, TypeProvider typeProvider) {
-    this._errorReporter = errorReporter;
-    this._typeProvider = typeProvider;
-    this._boolType = typeProvider.boolType;
-    this._intType = typeProvider.intType;
-    this._numType = typeProvider.numType;
-    this._stringType = typeProvider.stringType;
+  ConstantVerifier(this._errorReporter, this._typeProvider) {
+    this._boolType = _typeProvider.boolType;
+    this._intType = _typeProvider.intType;
+    this._numType = _typeProvider.numType;
+    this._stringType = _typeProvider.stringType;
   }
 
   @override
@@ -18148,12 +18088,12 @@
   /**
    * The error reporter by which errors will be reported.
    */
-  ErrorReporter _errorReporter;
+  final ErrorReporter _errorReporter;
 
   /**
    * The current library that is being analyzed.
    */
-  LibraryElement _currentLibrary;
+  final LibraryElement _currentLibrary;
 
   /**
    * The type representing the type 'dynamic'.
@@ -18173,12 +18113,12 @@
   /**
    * The object providing access to the types defined by the language.
    */
-  TypeProvider _typeProvider;
+  final TypeProvider _typeProvider;
 
   /**
    * The manager for the inheritance mappings.
    */
-  InheritanceManager _inheritanceManager;
+  final InheritanceManager _inheritanceManager;
 
   /**
    * This is set to `true` iff the visitor is currently visiting children nodes of a
@@ -18263,6 +18203,15 @@
   bool _hasExtUri = false;
 
   /**
+   * This is set to `false` on the entry of every [BlockFunctionBody], and is restored
+   * to the enclosing value on exit. The value is used in
+   * [checkForMixedReturns] to prevent both
+   * [StaticWarningCode#MIXED_RETURN_TYPES] and [StaticWarningCode#RETURN_WITHOUT_VALUE]
+   * from being generated in the same function body.
+   */
+  bool _hasReturnWithoutValue = false;
+
+  /**
    * The class containing the AST nodes being visited, or `null` if we are not in the scope of
    * a class.
    */
@@ -18328,13 +18277,30 @@
    */
   List<InterfaceType> _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT;
 
-  ErrorVerifier(ErrorReporter errorReporter, LibraryElement currentLibrary, TypeProvider typeProvider, InheritanceManager inheritanceManager) {
-    this._errorReporter = errorReporter;
-    this._currentLibrary = currentLibrary;
-    this._isInSystemLibrary = currentLibrary.source.isInSystemLibrary;
-    this._hasExtUri = currentLibrary.hasExtUri;
-    this._typeProvider = typeProvider;
-    this._inheritanceManager = inheritanceManager;
+  /**
+   * Static final string with value `"getter "` used in the construction of the
+   * [StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], and similar, error
+   * code messages.
+   *
+   * @see #checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration)
+   */
+  static String _GETTER_SPACE = "getter ";
+
+  /**
+   * Static final string with value `"setter "` used in the construction of the
+   * [StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], and similar, error
+   * code messages.
+   *
+   * @see #checkForNonAbstractClassInheritsAbstractMember(ClassDeclaration)
+   */
+  static String _SETTER_SPACE = "setter ";
+
+  /**
+   * Initialize the [ErrorVerifier] visitor.
+   */
+  ErrorVerifier(this._errorReporter, this._currentLibrary, this._typeProvider, this._inheritanceManager) {
+    this._isInSystemLibrary = _currentLibrary.source.isInSystemLibrary;
+    this._hasExtUri = _currentLibrary.hasExtUri;
     _isEnclosingConstructorConst = false;
     _isInCatchClause = false;
     _isInStaticVariableDeclaration = false;
@@ -18342,16 +18308,16 @@
     _isInInstanceVariableInitializer = false;
     _isInConstructorInitializer = false;
     _isInStaticMethod = false;
-    _boolType = typeProvider.boolType;
-    _intType = typeProvider.intType;
-    _dynamicType = typeProvider.dynamicType;
+    _dynamicType = _typeProvider.dynamicType;
+    _boolType = _typeProvider.boolType;
+    _intType = _typeProvider.intType;
     _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT = <InterfaceType> [
-        typeProvider.nullType,
-        typeProvider.numType,
+        _typeProvider.nullType,
+        _typeProvider.numType,
         _intType,
-        typeProvider.doubleType,
+        _typeProvider.doubleType,
         _boolType,
-        typeProvider.stringType];
+        _typeProvider.stringType];
   }
 
   @override
@@ -18370,7 +18336,7 @@
   Object visitAssignmentExpression(AssignmentExpression node) {
     sc.Token operator = node.operator;
     sc.TokenType operatorType = operator.type;
-    if (identical(operatorType, sc.TokenType.EQ)) {
+    if (operatorType == sc.TokenType.EQ) {
       _checkForInvalidAssignment(node.leftHandSide, node.rightHandSide);
     } else {
       _checkForInvalidCompoundAssignment(node);
@@ -18388,6 +18354,8 @@
 
   @override
   Object visitBlockFunctionBody(BlockFunctionBody node) {
+    bool previousHasReturnWithoutValue = _hasReturnWithoutValue;
+    _hasReturnWithoutValue = false;
     List<ReturnStatement> previousReturnsWith = _returnsWith;
     List<ReturnStatement> previousReturnsWithout = _returnsWithout;
     try {
@@ -18398,6 +18366,7 @@
     } finally {
       _returnsWith = previousReturnsWith;
       _returnsWithout = previousReturnsWithout;
+      _hasReturnWithoutValue = previousHasReturnWithoutValue;
     }
     return null;
   }
@@ -18785,6 +18754,7 @@
         _checkForMismatchedAccessorTypes(node, methodName);
       }
       if (node.isGetter) {
+        _checkForVoidReturnType(node);
         _checkForConflictingStaticGetterAndInstanceSetter(node);
       } else if (node.isSetter) {
         _checkForWrongNumberOfParametersForSetter(node.name, node.parameters);
@@ -18855,7 +18825,7 @@
   Object visitPrefixExpression(PrefixExpression node) {
     sc.TokenType operatorType = node.operator.type;
     Expression operand = node.operand;
-    if (identical(operatorType, sc.TokenType.BANG)) {
+    if (operatorType == sc.TokenType.BANG) {
       _checkForNonBoolNegationExpression(operand);
     } else if (operatorType.isIncrementOperator) {
       _checkForAssignmentToFinal(operand);
@@ -19057,14 +19027,14 @@
       if (parameter is FieldFormalParameter) {
         FieldElement fieldElement = (parameter.element as FieldFormalParameterElementImpl).field;
         INIT_STATE state = fieldElementsMap[fieldElement];
-        if (identical(state, INIT_STATE.NOT_INIT)) {
+        if (state == INIT_STATE.NOT_INIT) {
           fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL;
-        } else if (identical(state, INIT_STATE.INIT_IN_DECLARATION)) {
+        } else if (state == INIT_STATE.INIT_IN_DECLARATION) {
           if (fieldElement.isFinal || fieldElement.isConst) {
             _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, formalParameter.identifier, [fieldElement.displayName]);
             foundError = true;
           }
-        } else if (identical(state, INIT_STATE.INIT_IN_FIELD_FORMAL)) {
+        } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
           if (fieldElement.isFinal || fieldElement.isConst) {
             _errorReporter.reportErrorForNode(CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES, formalParameter.identifier, [fieldElement.displayName]);
             foundError = true;
@@ -19085,17 +19055,17 @@
         if (element is FieldElement) {
           FieldElement fieldElement = element;
           INIT_STATE state = fieldElementsMap[fieldElement];
-          if (identical(state, INIT_STATE.NOT_INIT)) {
+          if (state == INIT_STATE.NOT_INIT) {
             fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_INITIALIZERS;
-          } else if (identical(state, INIT_STATE.INIT_IN_DECLARATION)) {
+          } else if (state == INIT_STATE.INIT_IN_DECLARATION) {
             if (fieldElement.isFinal || fieldElement.isConst) {
               _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION, fieldName, []);
               foundError = true;
             }
-          } else if (identical(state, INIT_STATE.INIT_IN_FIELD_FORMAL)) {
+          } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
             _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER, fieldName, []);
             foundError = true;
-          } else if (identical(state, INIT_STATE.INIT_IN_INITIALIZERS)) {
+          } else if (state == INIT_STATE.INIT_IN_INITIALIZERS) {
             _errorReporter.reportErrorForNode(CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, fieldName, [fieldElement.displayName]);
             foundError = true;
           }
@@ -19104,7 +19074,7 @@
     }
     // Visit all of the states in the map to ensure that none were never initialized.
     for (MapEntry<FieldElement, INIT_STATE> entry in getMapEntrySet(fieldElementsMap)) {
-      if (identical(entry.getValue(), INIT_STATE.NOT_INIT)) {
+      if (entry.getValue() == INIT_STATE.NOT_INIT) {
         FieldElement fieldElement = entry.getKey();
         if (fieldElement.isConst) {
           _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_NOT_INITIALIZED, node.returnType, [fieldElement.name]);
@@ -19294,7 +19264,7 @@
         AstNode parameterLocationToSelect = null;
         for (int i = 0; i < parameters.length; i++) {
           ParameterElement parameter = parameters[i];
-          if (identical(parameter.parameterKind, ParameterKind.NAMED) && overriddenNamedPTEntry.getKey() == parameter.name) {
+          if (parameter.parameterKind == ParameterKind.NAMED && overriddenNamedPTEntry.getKey() == parameter.name) {
             parameterToSelect = parameter;
             parameterLocationToSelect = parameterLocations[i];
             break;
@@ -19339,7 +19309,7 @@
     // parameter elements.
     //
     if (parameterElts.length > 0) {
-      if (identical(parameterElts[0].parameterKind, ParameterKind.NAMED)) {
+      if (parameterElts[0].parameterKind == ParameterKind.NAMED) {
         // Named parameters, consider the names when matching the parameterElts to the overriddenParameterElts
         for (int i = 0; i < parameterElts.length; i++) {
           ParameterElementImpl parameterElt = parameterElts[i];
@@ -19614,6 +19584,7 @@
       if (VoidTypeImpl.instance.isAssignableTo(expectedReturnType)) {
         return false;
       }
+      _hasReturnWithoutValue = true;
       _errorReporter.reportErrorForNode(StaticWarningCode.RETURN_WITHOUT_VALUE, node, []);
       return true;
     }
@@ -19762,11 +19733,16 @@
   bool _checkForAssignmentToFinal(Expression expression) {
     // prepare element
     Element element = null;
+    AstNode highlightedNode = expression;
     if (expression is Identifier) {
       element = expression.staticElement;
-    }
-    if (expression is PropertyAccess) {
-      element = expression.propertyName.staticElement;
+      if (expression is PrefixedIdentifier) {
+        highlightedNode = expression.identifier;
+      }
+    } else if (expression is PropertyAccess) {
+      PropertyAccess propertyAccess = expression;
+      element = propertyAccess.propertyName.staticElement;
+      highlightedNode = propertyAccess.propertyName;
     }
     // check if element is assignable
     if (element is PropertyAccessorElement) {
@@ -19780,7 +19756,7 @@
         return true;
       }
       if (variable.isFinal) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL, expression, [variable.name]);
+        _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL, highlightedNode, [variable.name]);
         return true;
       }
       return false;
@@ -19809,7 +19785,7 @@
    */
   bool _checkForBuiltInIdentifierAsName(SimpleIdentifier identifier, ErrorCode errorCode) {
     sc.Token token = identifier.token;
-    if (identical(token.type, sc.TokenType.KEYWORD)) {
+    if (token.type == sc.TokenType.KEYWORD) {
       _errorReporter.reportErrorForNode(errorCode, identifier, [identifier.name]);
       return true;
     }
@@ -20311,7 +20287,7 @@
       return false;
     }
     // default constructor is not 'const', report problem
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, node, []);
+    _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, node.returnType, []);
     return true;
   }
 
@@ -20411,7 +20387,7 @@
     if (type.element.isAbstract) {
       ConstructorElement element = node.staticElement;
       if (element != null && !element.isFactory) {
-        if (identical((node.keyword as sc.KeywordToken).keyword, sc.Keyword.CONST)) {
+        if ((node.keyword as sc.KeywordToken).keyword == sc.Keyword.CONST) {
           _errorReporter.reportErrorForNode(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName, []);
         } else {
           _errorReporter.reportErrorForNode(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName, []);
@@ -21502,6 +21478,9 @@
    * @see StaticWarningCode#MIXED_RETURN_TYPES
    */
   bool _checkForMixedReturns(BlockFunctionBody node) {
+    if (_hasReturnWithoutValue) {
+      return false;
+    }
     int withCount = _returnsWith.length;
     int withoutCount = _returnsWithout.length;
     if (withCount > 0 && withoutCount > 0) {
@@ -21774,14 +21753,22 @@
     List<String> stringMembersArrayListSet = new List<String>();
     for (int i = 0; i < missingOverridesArray.length; i++) {
       String newStrMember;
-      if (missingOverridesArray[i].enclosingElement != null) {
-        newStrMember = "${missingOverridesArray[i].enclosingElement.displayName}.${missingOverridesArray[i].displayName}";
+      Element enclosingElement = missingOverridesArray[i].enclosingElement;
+      String prefix = StringUtilities.EMPTY;
+      if (missingOverridesArray[i] is PropertyAccessorElement) {
+        PropertyAccessorElement propertyAccessorElement = missingOverridesArray[i] as PropertyAccessorElement;
+        if (propertyAccessorElement.isGetter) {
+          prefix = _GETTER_SPACE;
+        } else {
+          prefix = _SETTER_SPACE;
+        }
+      }
+      if (enclosingElement != null) {
+        newStrMember = "${prefix}'${enclosingElement.displayName}.${missingOverridesArray[i].displayName}'";
       } else {
-        newStrMember = missingOverridesArray[i].displayName;
+        newStrMember = "${prefix}'${missingOverridesArray[i].displayName}'";
       }
-      if (!stringMembersArrayListSet.contains(newStrMember)) {
-        stringMembersArrayListSet.add(newStrMember);
-      }
+      stringMembersArrayListSet.add(newStrMember);
     }
     List<String> stringMembersArray = new List.from(stringMembersArrayListSet);
     AnalysisErrorWithProperties analysisError;
@@ -21896,7 +21883,7 @@
       return false;
     }
     // OK, statement does not start with map
-    if (statement.beginToken != node.beginToken) {
+    if (!identical(statement.beginToken, node.beginToken)) {
       return false;
     }
     // report problem
@@ -22538,6 +22525,22 @@
   }
 
   /**
+   * This verifies that the given getter does not have a return type of 'void'.
+   *
+   * @param node the method declaration to evaluate
+   * @return `true` if and only if an error code is generated on the passed node
+   * @see StaticWarningCode#VOID_RETURN_FOR_GETTER
+   */
+  bool _checkForVoidReturnType(MethodDeclaration node) {
+    TypeName returnType = node.returnType;
+    if (returnType == null || returnType.name.name != "void") {
+      return false;
+    }
+    _errorReporter.reportErrorForNode(StaticWarningCode.VOID_RETURN_FOR_GETTER, returnType, []);
+    return true;
+  }
+
+  /**
    * This verifies the passed operator-method declaration, has correct number of parameters.
    *
    * This method assumes that the method declaration was tested to be an operator declaration before
@@ -22850,7 +22853,7 @@
    * @return `true` iff the passed member is found in the passed class element
    */
   bool _isMemberInClassOrMixin(ExecutableElement executableElt, ClassElement classElt) {
-    ExecutableElement foundElt;
+    ExecutableElement foundElt = null;
     String executableName = executableElt.name;
     if (executableElt is MethodElement) {
       foundElt = classElt.getMethod(executableName);
@@ -22865,8 +22868,11 @@
         return true;
       }
     } else if (executableElt is PropertyAccessorElement) {
-      foundElt = classElt.getGetter(executableElt.name);
-      if (foundElt == null) {
+      PropertyAccessorElement propertyAccessorElement = executableElt;
+      if (propertyAccessorElement.isGetter) {
+        foundElt = classElt.getGetter(executableName);
+      }
+      if (foundElt == null && propertyAccessorElement.isSetter) {
         foundElt = classElt.getSetter(executableName);
       }
       if (foundElt != null) {
@@ -23005,21 +23011,21 @@
  * formal, and finally, initialized in the initializers list.
  */
 class INIT_STATE extends Enum<INIT_STATE> {
-  static final INIT_STATE NOT_INIT = new INIT_STATE('NOT_INIT', 0);
+  static const INIT_STATE NOT_INIT = const INIT_STATE('NOT_INIT', 0);
 
-  static final INIT_STATE INIT_IN_DECLARATION = new INIT_STATE('INIT_IN_DECLARATION', 1);
+  static const INIT_STATE INIT_IN_DECLARATION = const INIT_STATE('INIT_IN_DECLARATION', 1);
 
-  static final INIT_STATE INIT_IN_FIELD_FORMAL = new INIT_STATE('INIT_IN_FIELD_FORMAL', 2);
+  static const INIT_STATE INIT_IN_FIELD_FORMAL = const INIT_STATE('INIT_IN_FIELD_FORMAL', 2);
 
-  static final INIT_STATE INIT_IN_INITIALIZERS = new INIT_STATE('INIT_IN_INITIALIZERS', 3);
+  static const INIT_STATE INIT_IN_INITIALIZERS = const INIT_STATE('INIT_IN_INITIALIZERS', 3);
 
-  static final List<INIT_STATE> values = [
+  static const List<INIT_STATE> values = const [
       NOT_INIT,
       INIT_IN_DECLARATION,
       INIT_IN_FIELD_FORMAL,
       INIT_IN_INITIALIZERS];
 
-  INIT_STATE(String name, int ordinal) : super(name, ordinal);
+  const INIT_STATE(String name, int ordinal) : super(name, ordinal);
 }
 
 class GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference extends GeneralizingElementVisitor<Object> {
@@ -23106,13 +23112,13 @@
  * when appropriate, how the problem can be corrected.
  */
 class ResolverErrorCode extends Enum<ResolverErrorCode> implements ErrorCode {
-  static final ResolverErrorCode BREAK_LABEL_ON_SWITCH_MEMBER = new ResolverErrorCode.con1('BREAK_LABEL_ON_SWITCH_MEMBER', 0, ErrorType.COMPILE_TIME_ERROR, "Break label resolves to case or default statement");
+  static const ResolverErrorCode BREAK_LABEL_ON_SWITCH_MEMBER = const ResolverErrorCode.con1('BREAK_LABEL_ON_SWITCH_MEMBER', 0, ErrorType.COMPILE_TIME_ERROR, "Break label resolves to case or default statement");
 
-  static final ResolverErrorCode CONTINUE_LABEL_ON_SWITCH = new ResolverErrorCode.con1('CONTINUE_LABEL_ON_SWITCH', 1, ErrorType.COMPILE_TIME_ERROR, "A continue label resolves to switch, must be loop or switch member");
+  static const ResolverErrorCode CONTINUE_LABEL_ON_SWITCH = const ResolverErrorCode.con1('CONTINUE_LABEL_ON_SWITCH', 1, ErrorType.COMPILE_TIME_ERROR, "A continue label resolves to switch, must be loop or switch member");
 
-  static final ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART = new ResolverErrorCode.con1('MISSING_LIBRARY_DIRECTIVE_WITH_PART', 2, ErrorType.COMPILE_TIME_ERROR, "Libraries that have parts must have a library directive");
+  static const ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART = const ResolverErrorCode.con1('MISSING_LIBRARY_DIRECTIVE_WITH_PART', 2, ErrorType.COMPILE_TIME_ERROR, "Libraries that have parts must have a library directive");
 
-  static final List<ResolverErrorCode> values = [
+  static const List<ResolverErrorCode> values = const [
       BREAK_LABEL_ON_SWITCH_MEMBER,
       CONTINUE_LABEL_ON_SWITCH,
       MISSING_LIBRARY_DIRECTIVE_WITH_PART];
@@ -23120,18 +23126,18 @@
   /**
    * The type of this error.
    */
-  ErrorType type;
+  final ErrorType type;
 
   /**
    * The template used to create the message to be displayed for this error.
    */
-  String message;
+  final String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
    * there is no correction information for this error.
    */
-  String correction9;
+  final String correction;
 
   /**
    * Initialize a newly created error code to have the given type and message.
@@ -23139,10 +23145,7 @@
    * @param type the type of this error
    * @param message the message template used to create the message to be displayed for the error
    */
-  ResolverErrorCode.con1(String name, int ordinal, ErrorType type, String message) : super(name, ordinal) {
-    this.type = type;
-    this.message = message;
-  }
+  const ResolverErrorCode.con1(String name, int ordinal, ErrorType type, String message) : this.con2(name, ordinal, type, message, null);
 
   /**
    * Initialize a newly created error code to have the given type, message and correction.
@@ -23151,14 +23154,7 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  ResolverErrorCode.con2(String name, int ordinal, ErrorType type, String message, String correction) : super(name, ordinal) {
-    this.type = type;
-    this.message = message;
-    this.correction9 = correction;
-  }
-
-  @override
-  String get correction => correction9;
+  const ResolverErrorCode.con2(String name, int ordinal, this.type, this.message, this.correction) : super(name, ordinal);
 
   @override
   ErrorSeverity get errorSeverity => type.severity;
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index ef03a42..6960402 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -97,7 +97,7 @@
    * A table mapping characters to the states to which those characters will transition. (The index
    * into the array is the offset from the character `'a'` to the transitioning character.)
    */
-  List<KeywordState> _table;
+  final List<KeywordState> _table;
 
   /**
    * The keyword that is recognized by this state, or `null` if this state is not a terminal
@@ -112,8 +112,7 @@
    * @param table a table mapping characters to the states to which those characters will transition
    * @param syntax the syntax of the keyword that is recognized by the state
    */
-  KeywordState(List<KeywordState> table, String syntax) {
-    this._table = table;
+  KeywordState(this._table, String syntax) {
     this._keyword = (syntax == null) ? null : Keyword.keywords[syntax];
   }
 
@@ -140,19 +139,19 @@
  * scanner.
  */
 class ScannerErrorCode extends Enum<ScannerErrorCode> implements ErrorCode {
-  static final ScannerErrorCode ILLEGAL_CHARACTER = new ScannerErrorCode.con1('ILLEGAL_CHARACTER', 0, "Illegal character %x");
+  static const ScannerErrorCode ILLEGAL_CHARACTER = const ScannerErrorCode.con1('ILLEGAL_CHARACTER', 0, "Illegal character %x");
 
-  static final ScannerErrorCode MISSING_DIGIT = new ScannerErrorCode.con1('MISSING_DIGIT', 1, "Decimal digit expected");
+  static const ScannerErrorCode MISSING_DIGIT = const ScannerErrorCode.con1('MISSING_DIGIT', 1, "Decimal digit expected");
 
-  static final ScannerErrorCode MISSING_HEX_DIGIT = new ScannerErrorCode.con1('MISSING_HEX_DIGIT', 2, "Hexidecimal digit expected");
+  static const ScannerErrorCode MISSING_HEX_DIGIT = const ScannerErrorCode.con1('MISSING_HEX_DIGIT', 2, "Hexidecimal digit expected");
 
-  static final ScannerErrorCode MISSING_QUOTE = new ScannerErrorCode.con1('MISSING_QUOTE', 3, "Expected quote (' or \")");
+  static const ScannerErrorCode MISSING_QUOTE = const ScannerErrorCode.con1('MISSING_QUOTE', 3, "Expected quote (' or \")");
 
-  static final ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = new ScannerErrorCode.con1('UNTERMINATED_MULTI_LINE_COMMENT', 4, "Unterminated multi-line comment");
+  static const ScannerErrorCode UNTERMINATED_MULTI_LINE_COMMENT = const ScannerErrorCode.con1('UNTERMINATED_MULTI_LINE_COMMENT', 4, "Unterminated multi-line comment");
 
-  static final ScannerErrorCode UNTERMINATED_STRING_LITERAL = new ScannerErrorCode.con1('UNTERMINATED_STRING_LITERAL', 5, "Unterminated string literal");
+  static const ScannerErrorCode UNTERMINATED_STRING_LITERAL = const ScannerErrorCode.con1('UNTERMINATED_STRING_LITERAL', 5, "Unterminated string literal");
 
-  static final List<ScannerErrorCode> values = [
+  static const List<ScannerErrorCode> values = const [
       ILLEGAL_CHARACTER,
       MISSING_DIGIT,
       MISSING_HEX_DIGIT,
@@ -163,22 +162,20 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  String message;
+  final String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
    * there is no correction information for this error.
    */
-  String correction10;
+  final String correction;
 
   /**
    * Initialize a newly created error code to have the given message.
    *
    * @param message the message template used to create the message to be displayed for this error
    */
-  ScannerErrorCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
-    this.message = message;
-  }
+  const ScannerErrorCode.con1(String name, int ordinal, String message) : this.con2(name, ordinal, message, null);
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -186,13 +183,7 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  ScannerErrorCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
-    this.message = message;
-    this.correction10 = correction;
-  }
-
-  @override
-  String get correction => correction10;
+  const ScannerErrorCode.con2(String name, int ordinal, this.message, this.correction) : super(name, ordinal);
 
   @override
   ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
@@ -210,7 +201,7 @@
   /**
    * The offset from the beginning of the file to the beginning of the source being scanned.
    */
-  int _offsetDelta = 0;
+  final int _offsetDelta;
 
   /**
    * Initialize a newly created reader to read the characters in the given sequence.
@@ -219,9 +210,7 @@
    * @param offsetDelta the offset from the beginning of the file to the beginning of the source
    *          being scanned
    */
-  SubSequenceReader(String sequence, int offsetDelta) : super(sequence) {
-    this._offsetDelta = offsetDelta;
-  }
+  SubSequenceReader(String sequence, this._offsetDelta) : super(sequence);
 
   @override
   int get offset => _offsetDelta + super.offset;
@@ -243,7 +232,7 @@
   /**
    * The first comment in the list of comments that precede this token.
    */
-  Token _precedingComment;
+  final Token _precedingComment;
 
   /**
    * Initialize a newly created token to have the given type and offset and to be preceded by the
@@ -253,9 +242,7 @@
    * @param offset the offset from the beginning of the file to the first character in the token
    * @param precedingComment the first comment in the list of comments that precede this token
    */
-  StringTokenWithComment(TokenType type, String value, int offset, Token precedingComment) : super(type, value, offset) {
-    this._precedingComment = precedingComment;
-  }
+  StringTokenWithComment(TokenType type, String value, int offset, this._precedingComment) : super(type, value, offset);
 
   @override
   Token copy() => new StringTokenWithComment(type, lexeme, offset, copyComments(_precedingComment));
@@ -278,103 +265,103 @@
  * The enumeration `Keyword` defines the keywords in the Dart programming language.
  */
 class Keyword extends Enum<Keyword> {
-  static final Keyword ASSERT = new Keyword.con1('ASSERT', 0, "assert");
+  static const Keyword ASSERT = const Keyword.con1('ASSERT', 0, "assert");
 
-  static final Keyword BREAK = new Keyword.con1('BREAK', 1, "break");
+  static const Keyword BREAK = const Keyword.con1('BREAK', 1, "break");
 
-  static final Keyword CASE = new Keyword.con1('CASE', 2, "case");
+  static const Keyword CASE = const Keyword.con1('CASE', 2, "case");
 
-  static final Keyword CATCH = new Keyword.con1('CATCH', 3, "catch");
+  static const Keyword CATCH = const Keyword.con1('CATCH', 3, "catch");
 
-  static final Keyword CLASS = new Keyword.con1('CLASS', 4, "class");
+  static const Keyword CLASS = const Keyword.con1('CLASS', 4, "class");
 
-  static final Keyword CONST = new Keyword.con1('CONST', 5, "const");
+  static const Keyword CONST = const Keyword.con1('CONST', 5, "const");
 
-  static final Keyword CONTINUE = new Keyword.con1('CONTINUE', 6, "continue");
+  static const Keyword CONTINUE = const Keyword.con1('CONTINUE', 6, "continue");
 
-  static final Keyword DEFAULT = new Keyword.con1('DEFAULT', 7, "default");
+  static const Keyword DEFAULT = const Keyword.con1('DEFAULT', 7, "default");
 
-  static final Keyword DO = new Keyword.con1('DO', 8, "do");
+  static const Keyword DO = const Keyword.con1('DO', 8, "do");
 
-  static final Keyword ELSE = new Keyword.con1('ELSE', 9, "else");
+  static const Keyword ELSE = const Keyword.con1('ELSE', 9, "else");
 
-  static final Keyword ENUM = new Keyword.con1('ENUM', 10, "enum");
+  static const Keyword ENUM = const Keyword.con1('ENUM', 10, "enum");
 
-  static final Keyword EXTENDS = new Keyword.con1('EXTENDS', 11, "extends");
+  static const Keyword EXTENDS = const Keyword.con1('EXTENDS', 11, "extends");
 
-  static final Keyword FALSE = new Keyword.con1('FALSE', 12, "false");
+  static const Keyword FALSE = const Keyword.con1('FALSE', 12, "false");
 
-  static final Keyword FINAL = new Keyword.con1('FINAL', 13, "final");
+  static const Keyword FINAL = const Keyword.con1('FINAL', 13, "final");
 
-  static final Keyword FINALLY = new Keyword.con1('FINALLY', 14, "finally");
+  static const Keyword FINALLY = const Keyword.con1('FINALLY', 14, "finally");
 
-  static final Keyword FOR = new Keyword.con1('FOR', 15, "for");
+  static const Keyword FOR = const Keyword.con1('FOR', 15, "for");
 
-  static final Keyword IF = new Keyword.con1('IF', 16, "if");
+  static const Keyword IF = const Keyword.con1('IF', 16, "if");
 
-  static final Keyword IN = new Keyword.con1('IN', 17, "in");
+  static const Keyword IN = const Keyword.con1('IN', 17, "in");
 
-  static final Keyword IS = new Keyword.con1('IS', 18, "is");
+  static const Keyword IS = const Keyword.con1('IS', 18, "is");
 
-  static final Keyword NEW = new Keyword.con1('NEW', 19, "new");
+  static const Keyword NEW = const Keyword.con1('NEW', 19, "new");
 
-  static final Keyword NULL = new Keyword.con1('NULL', 20, "null");
+  static const Keyword NULL = const Keyword.con1('NULL', 20, "null");
 
-  static final Keyword RETHROW = new Keyword.con1('RETHROW', 21, "rethrow");
+  static const Keyword RETHROW = const Keyword.con1('RETHROW', 21, "rethrow");
 
-  static final Keyword RETURN = new Keyword.con1('RETURN', 22, "return");
+  static const Keyword RETURN = const Keyword.con1('RETURN', 22, "return");
 
-  static final Keyword SUPER = new Keyword.con1('SUPER', 23, "super");
+  static const Keyword SUPER = const Keyword.con1('SUPER', 23, "super");
 
-  static final Keyword SWITCH = new Keyword.con1('SWITCH', 24, "switch");
+  static const Keyword SWITCH = const Keyword.con1('SWITCH', 24, "switch");
 
-  static final Keyword THIS = new Keyword.con1('THIS', 25, "this");
+  static const Keyword THIS = const Keyword.con1('THIS', 25, "this");
 
-  static final Keyword THROW = new Keyword.con1('THROW', 26, "throw");
+  static const Keyword THROW = const Keyword.con1('THROW', 26, "throw");
 
-  static final Keyword TRUE = new Keyword.con1('TRUE', 27, "true");
+  static const Keyword TRUE = const Keyword.con1('TRUE', 27, "true");
 
-  static final Keyword TRY = new Keyword.con1('TRY', 28, "try");
+  static const Keyword TRY = const Keyword.con1('TRY', 28, "try");
 
-  static final Keyword VAR = new Keyword.con1('VAR', 29, "var");
+  static const Keyword VAR = const Keyword.con1('VAR', 29, "var");
 
-  static final Keyword VOID = new Keyword.con1('VOID', 30, "void");
+  static const Keyword VOID = const Keyword.con1('VOID', 30, "void");
 
-  static final Keyword WHILE = new Keyword.con1('WHILE', 31, "while");
+  static const Keyword WHILE = const Keyword.con1('WHILE', 31, "while");
 
-  static final Keyword WITH = new Keyword.con1('WITH', 32, "with");
+  static const Keyword WITH = const Keyword.con1('WITH', 32, "with");
 
-  static final Keyword ABSTRACT = new Keyword.con2('ABSTRACT', 33, "abstract", true);
+  static const Keyword ABSTRACT = const Keyword.con2('ABSTRACT', 33, "abstract", true);
 
-  static final Keyword AS = new Keyword.con2('AS', 34, "as", true);
+  static const Keyword AS = const Keyword.con2('AS', 34, "as", true);
 
-  static final Keyword DYNAMIC = new Keyword.con2('DYNAMIC', 35, "dynamic", true);
+  static const Keyword DYNAMIC = const Keyword.con2('DYNAMIC', 35, "dynamic", true);
 
-  static final Keyword EXPORT = new Keyword.con2('EXPORT', 36, "export", true);
+  static const Keyword EXPORT = const Keyword.con2('EXPORT', 36, "export", true);
 
-  static final Keyword EXTERNAL = new Keyword.con2('EXTERNAL', 37, "external", true);
+  static const Keyword EXTERNAL = const Keyword.con2('EXTERNAL', 37, "external", true);
 
-  static final Keyword FACTORY = new Keyword.con2('FACTORY', 38, "factory", true);
+  static const Keyword FACTORY = const Keyword.con2('FACTORY', 38, "factory", true);
 
-  static final Keyword GET = new Keyword.con2('GET', 39, "get", true);
+  static const Keyword GET = const Keyword.con2('GET', 39, "get", true);
 
-  static final Keyword IMPLEMENTS = new Keyword.con2('IMPLEMENTS', 40, "implements", true);
+  static const Keyword IMPLEMENTS = const Keyword.con2('IMPLEMENTS', 40, "implements", true);
 
-  static final Keyword IMPORT = new Keyword.con2('IMPORT', 41, "import", true);
+  static const Keyword IMPORT = const Keyword.con2('IMPORT', 41, "import", true);
 
-  static final Keyword LIBRARY = new Keyword.con2('LIBRARY', 42, "library", true);
+  static const Keyword LIBRARY = const Keyword.con2('LIBRARY', 42, "library", true);
 
-  static final Keyword OPERATOR = new Keyword.con2('OPERATOR', 43, "operator", true);
+  static const Keyword OPERATOR = const Keyword.con2('OPERATOR', 43, "operator", true);
 
-  static final Keyword PART = new Keyword.con2('PART', 44, "part", true);
+  static const Keyword PART = const Keyword.con2('PART', 44, "part", true);
 
-  static final Keyword SET = new Keyword.con2('SET', 45, "set", true);
+  static const Keyword SET = const Keyword.con2('SET', 45, "set", true);
 
-  static final Keyword STATIC = new Keyword.con2('STATIC', 46, "static", true);
+  static const Keyword STATIC = const Keyword.con2('STATIC', 46, "static", true);
 
-  static final Keyword TYPEDEF = new Keyword.con2('TYPEDEF', 47, "typedef", true);
+  static const Keyword TYPEDEF = const Keyword.con2('TYPEDEF', 47, "typedef", true);
 
-  static final List<Keyword> values = [
+  static const List<Keyword> values = const [
       ASSERT,
       BREAK,
       CASE,
@@ -427,13 +414,13 @@
   /**
    * The lexeme for the keyword.
    */
-  String _syntax;
+  final String syntax;
 
   /**
    * A flag indicating whether the keyword is a pseudo-keyword. Pseudo keywords can be used as
    * identifiers.
    */
-  bool _isPseudoKeyword = false;
+  final bool isPseudoKeyword;
 
   /**
    * A table mapping the lexemes of keywords to the corresponding keyword.
@@ -448,7 +435,7 @@
   static Map<String, Keyword> _createKeywordMap() {
     LinkedHashMap<String, Keyword> result = new LinkedHashMap<String, Keyword>();
     for (Keyword keyword in values) {
-      result[keyword._syntax] = keyword;
+      result[keyword.syntax] = keyword;
     }
     return result;
   }
@@ -459,7 +446,7 @@
    *
    * @param syntax the lexeme for the keyword
    */
-  Keyword.con1(String name, int ordinal, String syntax) : this.con2(name, ordinal, syntax, false);
+  const Keyword.con1(String name, int ordinal, String syntax) : this.con2(name, ordinal, syntax, false);
 
   /**
    * Initialize a newly created keyword to have the given syntax. The keyword is a pseudo-keyword if
@@ -468,25 +455,7 @@
    * @param syntax the lexeme for the keyword
    * @param isPseudoKeyword `true` if this keyword is a pseudo-keyword
    */
-  Keyword.con2(String name, int ordinal, String syntax, bool isPseudoKeyword) : super(name, ordinal) {
-    this._syntax = syntax;
-    this._isPseudoKeyword = isPseudoKeyword;
-  }
-
-  /**
-   * Return the lexeme for the keyword.
-   *
-   * @return the lexeme for the keyword
-   */
-  String get syntax => _syntax;
-
-  /**
-   * Return `true` if this keyword is a pseudo-keyword. Pseudo keywords can be used as
-   * identifiers.
-   *
-   * @return `true` if this keyword is a pseudo-keyword
-   */
-  bool get isPseudoKeyword => _isPseudoKeyword;
+  const Keyword.con2(String name, int ordinal, this.syntax, this.isPseudoKeyword) : super(name, ordinal);
 }
 
 /**
@@ -497,7 +466,7 @@
   /**
    * The sequence from which characters will be read.
    */
-  String _sequence;
+  final String _sequence;
 
   /**
    * The number of characters in the string.
@@ -514,9 +483,8 @@
    *
    * @param sequence the sequence from which characters will be read
    */
-  CharSequenceReader(String sequence) {
-    this._sequence = sequence;
-    this._stringLength = sequence.length;
+  CharSequenceReader(this._sequence) {
+    this._stringLength = _sequence.length;
     this._charOffset = -1;
   }
 
@@ -714,7 +682,7 @@
     //
     // Copy the remaining tokens in the original stream, but apply the delta to the token's offset.
     //
-    if (identical(originalStream.type, TokenType.EOF)) {
+    if (originalStream.type == TokenType.EOF) {
       _copyAndAdvance(originalStream, delta);
       _rightToken = tail;
       _rightToken.setNextWithoutSettingPrevious(_rightToken);
@@ -734,7 +702,7 @@
     // the first new token.
     //
     Token newFirst = _leftToken.next;
-    while (newFirst != _rightToken && oldFirst != oldRightToken && newFirst.type != TokenType.EOF && _equalTokens(oldFirst, newFirst)) {
+    while (!identical(newFirst, _rightToken) && !identical(oldFirst, oldRightToken) && newFirst.type != TokenType.EOF && _equalTokens(oldFirst, newFirst)) {
       _tokenMap.put(oldFirst, newFirst);
       oldLeftToken = oldFirst;
       oldFirst = oldFirst.next;
@@ -742,14 +710,14 @@
       newFirst = newFirst.next;
     }
     Token newLast = _rightToken.previous;
-    while (newLast != _leftToken && oldLast != oldLeftToken && newLast.type != TokenType.EOF && _equalTokens(oldLast, newLast)) {
+    while (!identical(newLast, _leftToken) && !identical(oldLast, oldLeftToken) && newLast.type != TokenType.EOF && _equalTokens(oldLast, newLast)) {
       _tokenMap.put(oldLast, newLast);
       oldRightToken = oldLast;
       oldLast = oldLast.previous;
       _rightToken = newLast;
       newLast = newLast.previous;
     }
-    _hasNonWhitespaceChange = _leftToken.next != _rightToken || oldLeftToken.next != oldRightToken;
+    _hasNonWhitespaceChange = !identical(_leftToken.next, _rightToken) || !identical(oldLeftToken.next, oldRightToken);
     //
     // TODO(brianwilkerson) Begin tokens are not getting associated with the corresponding end
     //     tokens (because the end tokens have not been copied when we're copying the begin tokens).
@@ -782,7 +750,7 @@
    * @param newToken the token from the new stream that is being compared
    * @return `true` if the two tokens are equal to each other
    */
-  bool _equalTokens(Token oldToken, Token newToken) => identical(oldToken.type, newToken.type) && oldToken.length == newToken.length && oldToken.lexeme == newToken.lexeme;
+  bool _equalTokens(Token oldToken, Token newToken) => oldToken.type == newToken.type && oldToken.length == newToken.length && oldToken.lexeme == newToken.lexeme;
 }
 
 /**
@@ -798,17 +766,17 @@
   /**
    * The source being scanned.
    */
-  Source source;
+  final Source source;
 
   /**
    * The reader used to access the characters in the source.
    */
-  CharacterReader _reader;
+  final CharacterReader _reader;
 
   /**
    * The error listener that will be informed of any errors that are found during the scan.
    */
-  AnalysisErrorListener _errorListener;
+  final AnalysisErrorListener _errorListener;
 
   /**
    * The flag specifying if documentation comments should be parsed.
@@ -868,10 +836,7 @@
    * @param reader the character reader used to read the characters in the source
    * @param errorListener the error listener that will be informed of any errors that are found
    */
-  Scanner(Source source, CharacterReader reader, AnalysisErrorListener errorListener) {
-    this.source = source;
-    this._reader = reader;
-    this._errorListener = errorListener;
+  Scanner(this.source, this._reader, this._errorListener) {
     _tokens = new Token(TokenType.EOF, -1);
     _tokens.setNext(_tokens);
     _tail = _tokens;
@@ -1159,7 +1124,7 @@
     _tail = _tail.setNext(token);
     if (_stackEnd >= 0) {
       BeginToken begin = _groupingStack[_stackEnd];
-      if (identical(begin.type, beginType)) {
+      if (begin.type == beginType) {
         begin.endToken = token;
         _groupingStack.removeAt(_stackEnd--);
       }
@@ -1247,7 +1212,7 @@
   BeginToken _findTokenMatchingClosingBraceInInterpolationExpression() {
     while (_stackEnd >= 0) {
       BeginToken begin = _groupingStack[_stackEnd];
-      if (identical(begin.type, TokenType.OPEN_CURLY_BRACKET) || identical(begin.type, TokenType.STRING_INTERPOLATION_EXPRESSION)) {
+      if (begin.type == TokenType.OPEN_CURLY_BRACKET || begin.type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
         return begin;
       }
       _hasUnmatchedGroups = true;
@@ -1476,12 +1441,12 @@
           next = _reader.advance();
           _beginToken();
           return next;
-        } else if (identical(begin.type, TokenType.OPEN_CURLY_BRACKET)) {
+        } else if (begin.type == TokenType.OPEN_CURLY_BRACKET) {
           _beginToken();
           _appendEndToken(TokenType.CLOSE_CURLY_BRACKET, TokenType.OPEN_CURLY_BRACKET);
           next = _reader.advance();
           _beginToken();
-        } else if (identical(begin.type, TokenType.STRING_INTERPOLATION_EXPRESSION)) {
+        } else if (begin.type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
           _beginToken();
           _appendEndToken(TokenType.CLOSE_CURLY_BRACKET, TokenType.STRING_INTERPOLATION_EXPRESSION);
           next = _reader.advance();
@@ -1902,7 +1867,7 @@
   /**
    * The first comment in the list of comments that precede this token.
    */
-  Token _precedingComment;
+  final Token _precedingComment;
 
   /**
    * Initialize a newly created token to have the given type and offset and to be preceded by the
@@ -1912,9 +1877,7 @@
    * @param offset the offset from the beginning of the file to the first character in the token
    * @param precedingComment the first comment in the list of comments that precede this token
    */
-  TokenWithComment(TokenType type, int offset, Token precedingComment) : super(type, offset) {
-    this._precedingComment = precedingComment;
-  }
+  TokenWithComment(TokenType type, int offset, this._precedingComment) : super(type, offset);
 
   @override
   Token copy() => new TokenWithComment(type, offset, _precedingComment);
@@ -1931,7 +1894,7 @@
   /**
    * The type of the token.
    */
-  TokenType type;
+  final TokenType type;
 
   /**
    * The offset from the beginning of the file to the first character in the token.
@@ -1954,8 +1917,7 @@
    * @param type the type of the token
    * @param offset the offset from the beginning of the file to the first character in the token
    */
-  Token(TokenType type, int offset) {
-    this.type = type;
+  Token(this.type, int offset) {
     this.offset = offset;
   }
 
@@ -2036,7 +1998,7 @@
    */
   bool matchesAny(List<TokenType> types) {
     for (TokenType type in types) {
-      if (identical(this.type, type)) {
+      if (this.type == type) {
         return true;
       }
     }
@@ -2165,7 +2127,7 @@
   /**
    * The first comment in the list of comments that precede this token.
    */
-  Token _precedingComment;
+  final Token _precedingComment;
 
   /**
    * Initialize a newly created token to have the given type and offset and to be preceded by the
@@ -2175,9 +2137,7 @@
    * @param offset the offset from the beginning of the file to the first character in the token
    * @param precedingComment the first comment in the list of comments that precede this token
    */
-  BeginTokenWithComment(TokenType type, int offset, Token precedingComment) : super(type, offset) {
-    this._precedingComment = precedingComment;
-  }
+  BeginTokenWithComment(TokenType type, int offset, this._precedingComment) : super(type, offset);
 
   @override
   Token copy() => new BeginTokenWithComment(type, offset, copyComments(_precedingComment));
@@ -2203,7 +2163,7 @@
   /**
    * The keyword being represented by this token.
    */
-  Keyword keyword;
+  final Keyword keyword;
 
   /**
    * Initialize a newly created token to represent the given keyword.
@@ -2211,9 +2171,7 @@
    * @param keyword the keyword being represented by this token
    * @param offset the offset from the beginning of the file to the first character in the token
    */
-  KeywordToken(Keyword keyword, int offset) : super(TokenType.KEYWORD, offset) {
-    this.keyword = keyword;
-  }
+  KeywordToken(this.keyword, int offset) : super(TokenType.KEYWORD, offset);
 
   @override
   Token copy() => new KeywordToken(keyword, offset);
@@ -2242,7 +2200,7 @@
    * @param offset the offset from the beginning of the file to the first character in the token
    */
   BeginToken(TokenType type, int offset) : super(type, offset) {
-    assert((identical(type, TokenType.OPEN_CURLY_BRACKET) || identical(type, TokenType.OPEN_PAREN) || identical(type, TokenType.OPEN_SQUARE_BRACKET) || identical(type, TokenType.STRING_INTERPOLATION_EXPRESSION)));
+    assert((type == TokenType.OPEN_CURLY_BRACKET || type == TokenType.OPEN_PAREN || type == TokenType.OPEN_SQUARE_BRACKET || type == TokenType.STRING_INTERPOLATION_EXPRESSION));
   }
 
   @override
@@ -2256,84 +2214,84 @@
   /**
    * A value used to indicate that the token type is not part of any specific class of token.
    */
-  static final TokenClass NO_CLASS = new TokenClass.con1('NO_CLASS', 0);
+  static const TokenClass NO_CLASS = const TokenClass.con1('NO_CLASS', 0);
 
   /**
    * A value used to indicate that the token type is an additive operator.
    */
-  static final TokenClass ADDITIVE_OPERATOR = new TokenClass.con2('ADDITIVE_OPERATOR', 1, 12);
+  static const TokenClass ADDITIVE_OPERATOR = const TokenClass.con2('ADDITIVE_OPERATOR', 1, 12);
 
   /**
    * A value used to indicate that the token type is an assignment operator.
    */
-  static final TokenClass ASSIGNMENT_OPERATOR = new TokenClass.con2('ASSIGNMENT_OPERATOR', 2, 1);
+  static const TokenClass ASSIGNMENT_OPERATOR = const TokenClass.con2('ASSIGNMENT_OPERATOR', 2, 1);
 
   /**
    * A value used to indicate that the token type is a bitwise-and operator.
    */
-  static final TokenClass BITWISE_AND_OPERATOR = new TokenClass.con2('BITWISE_AND_OPERATOR', 3, 10);
+  static const TokenClass BITWISE_AND_OPERATOR = const TokenClass.con2('BITWISE_AND_OPERATOR', 3, 10);
 
   /**
    * A value used to indicate that the token type is a bitwise-or operator.
    */
-  static final TokenClass BITWISE_OR_OPERATOR = new TokenClass.con2('BITWISE_OR_OPERATOR', 4, 8);
+  static const TokenClass BITWISE_OR_OPERATOR = const TokenClass.con2('BITWISE_OR_OPERATOR', 4, 8);
 
   /**
    * A value used to indicate that the token type is a bitwise-xor operator.
    */
-  static final TokenClass BITWISE_XOR_OPERATOR = new TokenClass.con2('BITWISE_XOR_OPERATOR', 5, 9);
+  static const TokenClass BITWISE_XOR_OPERATOR = const TokenClass.con2('BITWISE_XOR_OPERATOR', 5, 9);
 
   /**
    * A value used to indicate that the token type is a cascade operator.
    */
-  static final TokenClass CASCADE_OPERATOR = new TokenClass.con2('CASCADE_OPERATOR', 6, 2);
+  static const TokenClass CASCADE_OPERATOR = const TokenClass.con2('CASCADE_OPERATOR', 6, 2);
 
   /**
    * A value used to indicate that the token type is a conditional operator.
    */
-  static final TokenClass CONDITIONAL_OPERATOR = new TokenClass.con2('CONDITIONAL_OPERATOR', 7, 3);
+  static const TokenClass CONDITIONAL_OPERATOR = const TokenClass.con2('CONDITIONAL_OPERATOR', 7, 3);
 
   /**
    * A value used to indicate that the token type is an equality operator.
    */
-  static final TokenClass EQUALITY_OPERATOR = new TokenClass.con2('EQUALITY_OPERATOR', 8, 6);
+  static const TokenClass EQUALITY_OPERATOR = const TokenClass.con2('EQUALITY_OPERATOR', 8, 6);
 
   /**
    * A value used to indicate that the token type is a logical-and operator.
    */
-  static final TokenClass LOGICAL_AND_OPERATOR = new TokenClass.con2('LOGICAL_AND_OPERATOR', 9, 5);
+  static const TokenClass LOGICAL_AND_OPERATOR = const TokenClass.con2('LOGICAL_AND_OPERATOR', 9, 5);
 
   /**
    * A value used to indicate that the token type is a logical-or operator.
    */
-  static final TokenClass LOGICAL_OR_OPERATOR = new TokenClass.con2('LOGICAL_OR_OPERATOR', 10, 4);
+  static const TokenClass LOGICAL_OR_OPERATOR = const TokenClass.con2('LOGICAL_OR_OPERATOR', 10, 4);
 
   /**
    * A value used to indicate that the token type is a multiplicative operator.
    */
-  static final TokenClass MULTIPLICATIVE_OPERATOR = new TokenClass.con2('MULTIPLICATIVE_OPERATOR', 11, 13);
+  static const TokenClass MULTIPLICATIVE_OPERATOR = const TokenClass.con2('MULTIPLICATIVE_OPERATOR', 11, 13);
 
   /**
    * A value used to indicate that the token type is a relational operator.
    */
-  static final TokenClass RELATIONAL_OPERATOR = new TokenClass.con2('RELATIONAL_OPERATOR', 12, 7);
+  static const TokenClass RELATIONAL_OPERATOR = const TokenClass.con2('RELATIONAL_OPERATOR', 12, 7);
 
   /**
    * A value used to indicate that the token type is a shift operator.
    */
-  static final TokenClass SHIFT_OPERATOR = new TokenClass.con2('SHIFT_OPERATOR', 13, 11);
+  static const TokenClass SHIFT_OPERATOR = const TokenClass.con2('SHIFT_OPERATOR', 13, 11);
 
   /**
    * A value used to indicate that the token type is a unary operator.
    */
-  static final TokenClass UNARY_POSTFIX_OPERATOR = new TokenClass.con2('UNARY_POSTFIX_OPERATOR', 14, 15);
+  static const TokenClass UNARY_POSTFIX_OPERATOR = const TokenClass.con2('UNARY_POSTFIX_OPERATOR', 14, 15);
 
   /**
    * A value used to indicate that the token type is a unary operator.
    */
-  static final TokenClass UNARY_PREFIX_OPERATOR = new TokenClass.con2('UNARY_PREFIX_OPERATOR', 15, 14);
+  static const TokenClass UNARY_PREFIX_OPERATOR = const TokenClass.con2('UNARY_PREFIX_OPERATOR', 15, 14);
 
-  static final List<TokenClass> values = [
+  static const List<TokenClass> values = const [
       NO_CLASS,
       ADDITIVE_OPERATOR,
       ASSIGNMENT_OPERATOR,
@@ -2355,21 +2313,11 @@
    * The precedence of tokens of this class, or `0` if the such tokens do not represent an
    * operator.
    */
-  int _precedence = 0;
+  final int precedence;
 
-  TokenClass.con1(String name, int ordinal) : this.con2(name, ordinal, 0);
+  const TokenClass.con1(String name, int ordinal) : this.con2(name, ordinal, 0);
 
-  TokenClass.con2(String name, int ordinal, int precedence) : super(name, ordinal) {
-    this._precedence = precedence;
-  }
-
-  /**
-   * Return the precedence of tokens of this class, or `0` if the such tokens do not represent
-   * an operator.
-   *
-   * @return the precedence of tokens of this class
-   */
-  int get precedence => _precedence;
+  const TokenClass.con2(String name, int ordinal, this.precedence) : super(name, ordinal);
 }
 
 /**
@@ -2380,7 +2328,7 @@
   /**
    * The first comment in the list of comments that precede this token.
    */
-  Token _precedingComment;
+  final Token _precedingComment;
 
   /**
    * Initialize a newly created token to to represent the given keyword and to be preceded by the
@@ -2390,9 +2338,7 @@
    * @param offset the offset from the beginning of the file to the first character in the token
    * @param precedingComment the first comment in the list of comments that precede this token
    */
-  KeywordTokenWithComment(Keyword keyword, int offset, Token precedingComment) : super(keyword, offset) {
-    this._precedingComment = precedingComment;
-  }
+  KeywordTokenWithComment(Keyword keyword, int offset, this._precedingComment) : super(keyword, offset);
 
   @override
   Token copy() => new KeywordTokenWithComment(keyword, offset, copyComments(_precedingComment));
@@ -2419,143 +2365,143 @@
   /**
    * The type of the token that marks the end of the input.
    */
-  static final TokenType EOF = new TokenType_EOF('EOF', 0, null, "");
+  static const TokenType EOF = const TokenType_EOF('EOF', 0, TokenClass.NO_CLASS, "");
 
-  static final TokenType DOUBLE = new TokenType.con1('DOUBLE', 1);
+  static const TokenType DOUBLE = const TokenType.con1('DOUBLE', 1);
 
-  static final TokenType HEXADECIMAL = new TokenType.con1('HEXADECIMAL', 2);
+  static const TokenType HEXADECIMAL = const TokenType.con1('HEXADECIMAL', 2);
 
-  static final TokenType IDENTIFIER = new TokenType.con1('IDENTIFIER', 3);
+  static const TokenType IDENTIFIER = const TokenType.con1('IDENTIFIER', 3);
 
-  static final TokenType INT = new TokenType.con1('INT', 4);
+  static const TokenType INT = const TokenType.con1('INT', 4);
 
-  static final TokenType KEYWORD = new TokenType.con1('KEYWORD', 5);
+  static const TokenType KEYWORD = const TokenType.con1('KEYWORD', 5);
 
-  static final TokenType MULTI_LINE_COMMENT = new TokenType.con1('MULTI_LINE_COMMENT', 6);
+  static const TokenType MULTI_LINE_COMMENT = const TokenType.con1('MULTI_LINE_COMMENT', 6);
 
-  static final TokenType SCRIPT_TAG = new TokenType.con1('SCRIPT_TAG', 7);
+  static const TokenType SCRIPT_TAG = const TokenType.con1('SCRIPT_TAG', 7);
 
-  static final TokenType SINGLE_LINE_COMMENT = new TokenType.con1('SINGLE_LINE_COMMENT', 8);
+  static const TokenType SINGLE_LINE_COMMENT = const TokenType.con1('SINGLE_LINE_COMMENT', 8);
 
-  static final TokenType STRING = new TokenType.con1('STRING', 9);
+  static const TokenType STRING = const TokenType.con1('STRING', 9);
 
-  static final TokenType AMPERSAND = new TokenType.con2('AMPERSAND', 10, TokenClass.BITWISE_AND_OPERATOR, "&");
+  static const TokenType AMPERSAND = const TokenType.con2('AMPERSAND', 10, TokenClass.BITWISE_AND_OPERATOR, "&");
 
-  static final TokenType AMPERSAND_AMPERSAND = new TokenType.con2('AMPERSAND_AMPERSAND', 11, TokenClass.LOGICAL_AND_OPERATOR, "&&");
+  static const TokenType AMPERSAND_AMPERSAND = const TokenType.con2('AMPERSAND_AMPERSAND', 11, TokenClass.LOGICAL_AND_OPERATOR, "&&");
 
-  static final TokenType AMPERSAND_EQ = new TokenType.con2('AMPERSAND_EQ', 12, TokenClass.ASSIGNMENT_OPERATOR, "&=");
+  static const TokenType AMPERSAND_EQ = const TokenType.con2('AMPERSAND_EQ', 12, TokenClass.ASSIGNMENT_OPERATOR, "&=");
 
-  static final TokenType AT = new TokenType.con2('AT', 13, null, "@");
+  static const TokenType AT = const TokenType.con2('AT', 13, TokenClass.NO_CLASS, "@");
 
-  static final TokenType BANG = new TokenType.con2('BANG', 14, TokenClass.UNARY_PREFIX_OPERATOR, "!");
+  static const TokenType BANG = const TokenType.con2('BANG', 14, TokenClass.UNARY_PREFIX_OPERATOR, "!");
 
-  static final TokenType BANG_EQ = new TokenType.con2('BANG_EQ', 15, TokenClass.EQUALITY_OPERATOR, "!=");
+  static const TokenType BANG_EQ = const TokenType.con2('BANG_EQ', 15, TokenClass.EQUALITY_OPERATOR, "!=");
 
-  static final TokenType BAR = new TokenType.con2('BAR', 16, TokenClass.BITWISE_OR_OPERATOR, "|");
+  static const TokenType BAR = const TokenType.con2('BAR', 16, TokenClass.BITWISE_OR_OPERATOR, "|");
 
-  static final TokenType BAR_BAR = new TokenType.con2('BAR_BAR', 17, TokenClass.LOGICAL_OR_OPERATOR, "||");
+  static const TokenType BAR_BAR = const TokenType.con2('BAR_BAR', 17, TokenClass.LOGICAL_OR_OPERATOR, "||");
 
-  static final TokenType BAR_EQ = new TokenType.con2('BAR_EQ', 18, TokenClass.ASSIGNMENT_OPERATOR, "|=");
+  static const TokenType BAR_EQ = const TokenType.con2('BAR_EQ', 18, TokenClass.ASSIGNMENT_OPERATOR, "|=");
 
-  static final TokenType COLON = new TokenType.con2('COLON', 19, null, ":");
+  static const TokenType COLON = const TokenType.con2('COLON', 19, TokenClass.NO_CLASS, ":");
 
-  static final TokenType COMMA = new TokenType.con2('COMMA', 20, null, ",");
+  static const TokenType COMMA = const TokenType.con2('COMMA', 20, TokenClass.NO_CLASS, ",");
 
-  static final TokenType CARET = new TokenType.con2('CARET', 21, TokenClass.BITWISE_XOR_OPERATOR, "^");
+  static const TokenType CARET = const TokenType.con2('CARET', 21, TokenClass.BITWISE_XOR_OPERATOR, "^");
 
-  static final TokenType CARET_EQ = new TokenType.con2('CARET_EQ', 22, TokenClass.ASSIGNMENT_OPERATOR, "^=");
+  static const TokenType CARET_EQ = const TokenType.con2('CARET_EQ', 22, TokenClass.ASSIGNMENT_OPERATOR, "^=");
 
-  static final TokenType CLOSE_CURLY_BRACKET = new TokenType.con2('CLOSE_CURLY_BRACKET', 23, null, "}");
+  static const TokenType CLOSE_CURLY_BRACKET = const TokenType.con2('CLOSE_CURLY_BRACKET', 23, TokenClass.NO_CLASS, "}");
 
-  static final TokenType CLOSE_PAREN = new TokenType.con2('CLOSE_PAREN', 24, null, ")");
+  static const TokenType CLOSE_PAREN = const TokenType.con2('CLOSE_PAREN', 24, TokenClass.NO_CLASS, ")");
 
-  static final TokenType CLOSE_SQUARE_BRACKET = new TokenType.con2('CLOSE_SQUARE_BRACKET', 25, null, "]");
+  static const TokenType CLOSE_SQUARE_BRACKET = const TokenType.con2('CLOSE_SQUARE_BRACKET', 25, TokenClass.NO_CLASS, "]");
 
-  static final TokenType EQ = new TokenType.con2('EQ', 26, TokenClass.ASSIGNMENT_OPERATOR, "=");
+  static const TokenType EQ = const TokenType.con2('EQ', 26, TokenClass.ASSIGNMENT_OPERATOR, "=");
 
-  static final TokenType EQ_EQ = new TokenType.con2('EQ_EQ', 27, TokenClass.EQUALITY_OPERATOR, "==");
+  static const TokenType EQ_EQ = const TokenType.con2('EQ_EQ', 27, TokenClass.EQUALITY_OPERATOR, "==");
 
-  static final TokenType FUNCTION = new TokenType.con2('FUNCTION', 28, null, "=>");
+  static const TokenType FUNCTION = const TokenType.con2('FUNCTION', 28, TokenClass.NO_CLASS, "=>");
 
-  static final TokenType GT = new TokenType.con2('GT', 29, TokenClass.RELATIONAL_OPERATOR, ">");
+  static const TokenType GT = const TokenType.con2('GT', 29, TokenClass.RELATIONAL_OPERATOR, ">");
 
-  static final TokenType GT_EQ = new TokenType.con2('GT_EQ', 30, TokenClass.RELATIONAL_OPERATOR, ">=");
+  static const TokenType GT_EQ = const TokenType.con2('GT_EQ', 30, TokenClass.RELATIONAL_OPERATOR, ">=");
 
-  static final TokenType GT_GT = new TokenType.con2('GT_GT', 31, TokenClass.SHIFT_OPERATOR, ">>");
+  static const TokenType GT_GT = const TokenType.con2('GT_GT', 31, TokenClass.SHIFT_OPERATOR, ">>");
 
-  static final TokenType GT_GT_EQ = new TokenType.con2('GT_GT_EQ', 32, TokenClass.ASSIGNMENT_OPERATOR, ">>=");
+  static const TokenType GT_GT_EQ = const TokenType.con2('GT_GT_EQ', 32, TokenClass.ASSIGNMENT_OPERATOR, ">>=");
 
-  static final TokenType HASH = new TokenType.con2('HASH', 33, null, "#");
+  static const TokenType HASH = const TokenType.con2('HASH', 33, TokenClass.NO_CLASS, "#");
 
-  static final TokenType INDEX = new TokenType.con2('INDEX', 34, TokenClass.UNARY_POSTFIX_OPERATOR, "[]");
+  static const TokenType INDEX = const TokenType.con2('INDEX', 34, TokenClass.UNARY_POSTFIX_OPERATOR, "[]");
 
-  static final TokenType INDEX_EQ = new TokenType.con2('INDEX_EQ', 35, TokenClass.UNARY_POSTFIX_OPERATOR, "[]=");
+  static const TokenType INDEX_EQ = const TokenType.con2('INDEX_EQ', 35, TokenClass.UNARY_POSTFIX_OPERATOR, "[]=");
 
-  static final TokenType IS = new TokenType.con2('IS', 36, TokenClass.RELATIONAL_OPERATOR, "is");
+  static const TokenType IS = const TokenType.con2('IS', 36, TokenClass.RELATIONAL_OPERATOR, "is");
 
-  static final TokenType LT = new TokenType.con2('LT', 37, TokenClass.RELATIONAL_OPERATOR, "<");
+  static const TokenType LT = const TokenType.con2('LT', 37, TokenClass.RELATIONAL_OPERATOR, "<");
 
-  static final TokenType LT_EQ = new TokenType.con2('LT_EQ', 38, TokenClass.RELATIONAL_OPERATOR, "<=");
+  static const TokenType LT_EQ = const TokenType.con2('LT_EQ', 38, TokenClass.RELATIONAL_OPERATOR, "<=");
 
-  static final TokenType LT_LT = new TokenType.con2('LT_LT', 39, TokenClass.SHIFT_OPERATOR, "<<");
+  static const TokenType LT_LT = const TokenType.con2('LT_LT', 39, TokenClass.SHIFT_OPERATOR, "<<");
 
-  static final TokenType LT_LT_EQ = new TokenType.con2('LT_LT_EQ', 40, TokenClass.ASSIGNMENT_OPERATOR, "<<=");
+  static const TokenType LT_LT_EQ = const TokenType.con2('LT_LT_EQ', 40, TokenClass.ASSIGNMENT_OPERATOR, "<<=");
 
-  static final TokenType MINUS = new TokenType.con2('MINUS', 41, TokenClass.ADDITIVE_OPERATOR, "-");
+  static const TokenType MINUS = const TokenType.con2('MINUS', 41, TokenClass.ADDITIVE_OPERATOR, "-");
 
-  static final TokenType MINUS_EQ = new TokenType.con2('MINUS_EQ', 42, TokenClass.ASSIGNMENT_OPERATOR, "-=");
+  static const TokenType MINUS_EQ = const TokenType.con2('MINUS_EQ', 42, TokenClass.ASSIGNMENT_OPERATOR, "-=");
 
-  static final TokenType MINUS_MINUS = new TokenType.con2('MINUS_MINUS', 43, TokenClass.UNARY_PREFIX_OPERATOR, "--");
+  static const TokenType MINUS_MINUS = const TokenType.con2('MINUS_MINUS', 43, TokenClass.UNARY_PREFIX_OPERATOR, "--");
 
-  static final TokenType OPEN_CURLY_BRACKET = new TokenType.con2('OPEN_CURLY_BRACKET', 44, null, "{");
+  static const TokenType OPEN_CURLY_BRACKET = const TokenType.con2('OPEN_CURLY_BRACKET', 44, TokenClass.NO_CLASS, "{");
 
-  static final TokenType OPEN_PAREN = new TokenType.con2('OPEN_PAREN', 45, TokenClass.UNARY_POSTFIX_OPERATOR, "(");
+  static const TokenType OPEN_PAREN = const TokenType.con2('OPEN_PAREN', 45, TokenClass.UNARY_POSTFIX_OPERATOR, "(");
 
-  static final TokenType OPEN_SQUARE_BRACKET = new TokenType.con2('OPEN_SQUARE_BRACKET', 46, TokenClass.UNARY_POSTFIX_OPERATOR, "[");
+  static const TokenType OPEN_SQUARE_BRACKET = const TokenType.con2('OPEN_SQUARE_BRACKET', 46, TokenClass.UNARY_POSTFIX_OPERATOR, "[");
 
-  static final TokenType PERCENT = new TokenType.con2('PERCENT', 47, TokenClass.MULTIPLICATIVE_OPERATOR, "%");
+  static const TokenType PERCENT = const TokenType.con2('PERCENT', 47, TokenClass.MULTIPLICATIVE_OPERATOR, "%");
 
-  static final TokenType PERCENT_EQ = new TokenType.con2('PERCENT_EQ', 48, TokenClass.ASSIGNMENT_OPERATOR, "%=");
+  static const TokenType PERCENT_EQ = const TokenType.con2('PERCENT_EQ', 48, TokenClass.ASSIGNMENT_OPERATOR, "%=");
 
-  static final TokenType PERIOD = new TokenType.con2('PERIOD', 49, TokenClass.UNARY_POSTFIX_OPERATOR, ".");
+  static const TokenType PERIOD = const TokenType.con2('PERIOD', 49, TokenClass.UNARY_POSTFIX_OPERATOR, ".");
 
-  static final TokenType PERIOD_PERIOD = new TokenType.con2('PERIOD_PERIOD', 50, TokenClass.CASCADE_OPERATOR, "..");
+  static const TokenType PERIOD_PERIOD = const TokenType.con2('PERIOD_PERIOD', 50, TokenClass.CASCADE_OPERATOR, "..");
 
-  static final TokenType PLUS = new TokenType.con2('PLUS', 51, TokenClass.ADDITIVE_OPERATOR, "+");
+  static const TokenType PLUS = const TokenType.con2('PLUS', 51, TokenClass.ADDITIVE_OPERATOR, "+");
 
-  static final TokenType PLUS_EQ = new TokenType.con2('PLUS_EQ', 52, TokenClass.ASSIGNMENT_OPERATOR, "+=");
+  static const TokenType PLUS_EQ = const TokenType.con2('PLUS_EQ', 52, TokenClass.ASSIGNMENT_OPERATOR, "+=");
 
-  static final TokenType PLUS_PLUS = new TokenType.con2('PLUS_PLUS', 53, TokenClass.UNARY_PREFIX_OPERATOR, "++");
+  static const TokenType PLUS_PLUS = const TokenType.con2('PLUS_PLUS', 53, TokenClass.UNARY_PREFIX_OPERATOR, "++");
 
-  static final TokenType QUESTION = new TokenType.con2('QUESTION', 54, TokenClass.CONDITIONAL_OPERATOR, "?");
+  static const TokenType QUESTION = const TokenType.con2('QUESTION', 54, TokenClass.CONDITIONAL_OPERATOR, "?");
 
-  static final TokenType SEMICOLON = new TokenType.con2('SEMICOLON', 55, null, ";");
+  static const TokenType SEMICOLON = const TokenType.con2('SEMICOLON', 55, TokenClass.NO_CLASS, ";");
 
-  static final TokenType SLASH = new TokenType.con2('SLASH', 56, TokenClass.MULTIPLICATIVE_OPERATOR, "/");
+  static const TokenType SLASH = const TokenType.con2('SLASH', 56, TokenClass.MULTIPLICATIVE_OPERATOR, "/");
 
-  static final TokenType SLASH_EQ = new TokenType.con2('SLASH_EQ', 57, TokenClass.ASSIGNMENT_OPERATOR, "/=");
+  static const TokenType SLASH_EQ = const TokenType.con2('SLASH_EQ', 57, TokenClass.ASSIGNMENT_OPERATOR, "/=");
 
-  static final TokenType STAR = new TokenType.con2('STAR', 58, TokenClass.MULTIPLICATIVE_OPERATOR, "*");
+  static const TokenType STAR = const TokenType.con2('STAR', 58, TokenClass.MULTIPLICATIVE_OPERATOR, "*");
 
-  static final TokenType STAR_EQ = new TokenType.con2('STAR_EQ', 59, TokenClass.ASSIGNMENT_OPERATOR, "*=");
+  static const TokenType STAR_EQ = const TokenType.con2('STAR_EQ', 59, TokenClass.ASSIGNMENT_OPERATOR, "*=");
 
-  static final TokenType STRING_INTERPOLATION_EXPRESSION = new TokenType.con2('STRING_INTERPOLATION_EXPRESSION', 60, null, "\${");
+  static const TokenType STRING_INTERPOLATION_EXPRESSION = const TokenType.con2('STRING_INTERPOLATION_EXPRESSION', 60, TokenClass.NO_CLASS, "\${");
 
-  static final TokenType STRING_INTERPOLATION_IDENTIFIER = new TokenType.con2('STRING_INTERPOLATION_IDENTIFIER', 61, null, "\$");
+  static const TokenType STRING_INTERPOLATION_IDENTIFIER = const TokenType.con2('STRING_INTERPOLATION_IDENTIFIER', 61, TokenClass.NO_CLASS, "\$");
 
-  static final TokenType TILDE = new TokenType.con2('TILDE', 62, TokenClass.UNARY_PREFIX_OPERATOR, "~");
+  static const TokenType TILDE = const TokenType.con2('TILDE', 62, TokenClass.UNARY_PREFIX_OPERATOR, "~");
 
-  static final TokenType TILDE_SLASH = new TokenType.con2('TILDE_SLASH', 63, TokenClass.MULTIPLICATIVE_OPERATOR, "~/");
+  static const TokenType TILDE_SLASH = const TokenType.con2('TILDE_SLASH', 63, TokenClass.MULTIPLICATIVE_OPERATOR, "~/");
 
-  static final TokenType TILDE_SLASH_EQ = new TokenType.con2('TILDE_SLASH_EQ', 64, TokenClass.ASSIGNMENT_OPERATOR, "~/=");
+  static const TokenType TILDE_SLASH_EQ = const TokenType.con2('TILDE_SLASH_EQ', 64, TokenClass.ASSIGNMENT_OPERATOR, "~/=");
 
-  static final TokenType BACKPING = new TokenType.con2('BACKPING', 65, null, "`");
+  static const TokenType BACKPING = const TokenType.con2('BACKPING', 65, TokenClass.NO_CLASS, "`");
 
-  static final TokenType BACKSLASH = new TokenType.con2('BACKSLASH', 66, null, "\\");
+  static const TokenType BACKSLASH = const TokenType.con2('BACKSLASH', 66, TokenClass.NO_CLASS, "\\");
 
-  static final TokenType PERIOD_PERIOD_PERIOD = new TokenType.con2('PERIOD_PERIOD_PERIOD', 67, null, "...");
+  static const TokenType PERIOD_PERIOD_PERIOD = const TokenType.con2('PERIOD_PERIOD_PERIOD', 67, TokenClass.NO_CLASS, "...");
 
-  static final List<TokenType> values = [
+  static const List<TokenType> values = const [
       EOF,
       DOUBLE,
       HEXADECIMAL,
@@ -2628,28 +2574,17 @@
   /**
    * The class of the token.
    */
-  TokenClass _tokenClass;
+  final TokenClass _tokenClass;
 
   /**
    * The lexeme that defines this type of token, or `null` if there is more than one possible
    * lexeme for this type of token.
    */
-  String _lexeme;
+  final String lexeme;
 
-  TokenType.con1(String name, int ordinal) : this.con2(name, ordinal, TokenClass.NO_CLASS, null);
+  const TokenType.con1(String name, int ordinal) : this.con2(name, ordinal, TokenClass.NO_CLASS, null);
 
-  TokenType.con2(String name, int ordinal, TokenClass tokenClass, String lexeme) : super(name, ordinal) {
-    this._tokenClass = tokenClass == null ? TokenClass.NO_CLASS : tokenClass;
-    this._lexeme = lexeme;
-  }
-
-  /**
-   * Return the lexeme that defines this type of token, or `null` if there is more than one
-   * possible lexeme for this type of token.
-   *
-   * @return the lexeme that defines this type of token
-   */
-  String get lexeme => _lexeme;
+  const TokenType.con2(String name, int ordinal, this._tokenClass, this.lexeme) : super(name, ordinal);
 
   /**
    * Return the precedence of the token, or `0` if the token does not represent an operator.
@@ -2663,14 +2598,14 @@
    *
    * @return `true` if this type of token represents an additive operator
    */
-  bool get isAdditiveOperator => identical(_tokenClass, TokenClass.ADDITIVE_OPERATOR);
+  bool get isAdditiveOperator => _tokenClass == TokenClass.ADDITIVE_OPERATOR;
 
   /**
    * Return `true` if this type of token represents an assignment operator.
    *
    * @return `true` if this type of token represents an assignment operator
    */
-  bool get isAssignmentOperator => identical(_tokenClass, TokenClass.ASSIGNMENT_OPERATOR);
+  bool get isAssignmentOperator => _tokenClass == TokenClass.ASSIGNMENT_OPERATOR;
 
   /**
    * Return `true` if this type of token represents an associative operator. An associative
@@ -2684,28 +2619,28 @@
    *
    * @return `true` if this type of token represents an associative operator
    */
-  bool get isAssociativeOperator => identical(this, AMPERSAND) || identical(this, AMPERSAND_AMPERSAND) || identical(this, BAR) || identical(this, BAR_BAR) || identical(this, CARET) || identical(this, PLUS) || identical(this, STAR);
+  bool get isAssociativeOperator => this == AMPERSAND || this == AMPERSAND_AMPERSAND || this == BAR || this == BAR_BAR || this == CARET || this == PLUS || this == STAR;
 
   /**
    * Return `true` if this type of token represents an equality operator.
    *
    * @return `true` if this type of token represents an equality operator
    */
-  bool get isEqualityOperator => identical(_tokenClass, TokenClass.EQUALITY_OPERATOR);
+  bool get isEqualityOperator => _tokenClass == TokenClass.EQUALITY_OPERATOR;
 
   /**
    * Return `true` if this type of token represents an increment operator.
    *
    * @return `true` if this type of token represents an increment operator
    */
-  bool get isIncrementOperator => identical(_lexeme, "++") || identical(_lexeme, "--");
+  bool get isIncrementOperator => identical(lexeme, "++") || identical(lexeme, "--");
 
   /**
    * Return `true` if this type of token represents a multiplicative operator.
    *
    * @return `true` if this type of token represents a multiplicative operator
    */
-  bool get isMultiplicativeOperator => identical(_tokenClass, TokenClass.MULTIPLICATIVE_OPERATOR);
+  bool get isMultiplicativeOperator => _tokenClass == TokenClass.MULTIPLICATIVE_OPERATOR;
 
   /**
    * Return `true` if this token type represents an operator.
@@ -2719,39 +2654,39 @@
    *
    * @return `true` if this type of token represents a relational operator
    */
-  bool get isRelationalOperator => identical(_tokenClass, TokenClass.RELATIONAL_OPERATOR);
+  bool get isRelationalOperator => _tokenClass == TokenClass.RELATIONAL_OPERATOR;
 
   /**
    * Return `true` if this type of token represents a shift operator.
    *
    * @return `true` if this type of token represents a shift operator
    */
-  bool get isShiftOperator => identical(_tokenClass, TokenClass.SHIFT_OPERATOR);
+  bool get isShiftOperator => _tokenClass == TokenClass.SHIFT_OPERATOR;
 
   /**
    * Return `true` if this type of token represents a unary postfix operator.
    *
    * @return `true` if this type of token represents a unary postfix operator
    */
-  bool get isUnaryPostfixOperator => identical(_tokenClass, TokenClass.UNARY_POSTFIX_OPERATOR);
+  bool get isUnaryPostfixOperator => _tokenClass == TokenClass.UNARY_POSTFIX_OPERATOR;
 
   /**
    * Return `true` if this type of token represents a unary prefix operator.
    *
    * @return `true` if this type of token represents a unary prefix operator
    */
-  bool get isUnaryPrefixOperator => identical(_tokenClass, TokenClass.UNARY_PREFIX_OPERATOR);
+  bool get isUnaryPrefixOperator => _tokenClass == TokenClass.UNARY_PREFIX_OPERATOR;
 
   /**
    * Return `true` if this token type represents an operator that can be defined by users.
    *
    * @return `true` if this token type represents an operator that can be defined by users
    */
-  bool get isUserDefinableOperator => identical(_lexeme, "==") || identical(_lexeme, "~") || identical(_lexeme, "[]") || identical(_lexeme, "[]=") || identical(_lexeme, "*") || identical(_lexeme, "/") || identical(_lexeme, "%") || identical(_lexeme, "~/") || identical(_lexeme, "+") || identical(_lexeme, "-") || identical(_lexeme, "<<") || identical(_lexeme, ">>") || identical(_lexeme, ">=") || identical(_lexeme, ">") || identical(_lexeme, "<=") || identical(_lexeme, "<") || identical(_lexeme, "&") || identical(_lexeme, "^") || identical(_lexeme, "|");
+  bool get isUserDefinableOperator => identical(lexeme, "==") || identical(lexeme, "~") || identical(lexeme, "[]") || identical(lexeme, "[]=") || identical(lexeme, "*") || identical(lexeme, "/") || identical(lexeme, "%") || identical(lexeme, "~/") || identical(lexeme, "+") || identical(lexeme, "-") || identical(lexeme, "<<") || identical(lexeme, ">>") || identical(lexeme, ">=") || identical(lexeme, ">") || identical(lexeme, "<=") || identical(lexeme, "<") || identical(lexeme, "&") || identical(lexeme, "^") || identical(lexeme, "|");
 }
 
 class TokenType_EOF extends TokenType {
-  TokenType_EOF(String name, int ordinal, TokenClass arg0, String arg1) : super.con2(name, ordinal, arg0, arg1);
+  const TokenType_EOF(String name, int ordinal, TokenClass arg0, String arg1) : super.con2(name, ordinal, arg0, arg1);
 
   @override
   String toString() => "-eof-";
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index b16e31d..d133f1d 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -243,7 +243,7 @@
   /**
    * A flag indicating whether the dart2js path should be used when it is available.
    */
-  bool _useDart2jsPaths = false;
+  final bool _useDart2jsPaths;
 
   /**
    * The library map that is populated by visiting the AST structure parsed from the contents of
@@ -257,9 +257,7 @@
    *
    * @param useDart2jsPaths `true` if the dart2js path should be used when it is available
    */
-  SdkLibrariesReader_LibraryBuilder(bool useDart2jsPaths) {
-    this._useDart2jsPaths = useDart2jsPaths;
-  }
+  SdkLibrariesReader_LibraryBuilder(this._useDart2jsPaths);
 
   /**
    * Return the library map that was populated by visiting the AST structure parsed from the
diff --git a/pkg/analyzer/lib/src/generated/sdk_io.dart b/pkg/analyzer/lib/src/generated/sdk_io.dart
index afbf270..eedc729 100644
--- a/pkg/analyzer/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer/lib/src/generated/sdk_io.dart
@@ -433,7 +433,7 @@
   /**
    * A flag indicating whether the dart2js path should be used when it is available.
    */
-  bool _useDart2jsPaths = false;
+  final bool _useDart2jsPaths;
 
   /**
    * Initialize a newly created library reader to use the dart2js path if the given value is
@@ -441,9 +441,7 @@
    *
    * @param useDart2jsPaths `true` if the dart2js path should be used when it is available
    */
-  SdkLibrariesReader(bool useDart2jsPaths) {
-    this._useDart2jsPaths = useDart2jsPaths;
-  }
+  SdkLibrariesReader(this._useDart2jsPaths);
 
   /**
    * Return the library map read from the given source.
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 446c8ea..7dbcacd 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -69,7 +69,7 @@
   /**
    * The resolvers used to resolve absolute URI's.
    */
-  List<UriResolver> _resolvers;
+  final List<UriResolver> _resolvers;
 
   /**
    * The predicate to determine is [Source] is local.
@@ -81,9 +81,7 @@
    *
    * @param resolvers the resolvers used to resolve absolute URI's
    */
-  SourceFactory(List<UriResolver> resolvers) {
-    this._resolvers = resolvers;
-  }
+  SourceFactory(this._resolvers);
 
   /**
    * Return a source object representing the given absolute URI, or `null` if the URI is not a
@@ -160,9 +158,9 @@
 
   /**
    * Return a source object representing the URI that results from resolving the given (possibly
-   * relative) contained URI against the URI associated with an existing source object, or
-   * `null` if either the contained URI is invalid or if it cannot be resolved against the
-   * source object's URI.
+   * relative) contained URI against the URI associated with an existing source object, whether or
+   * not the resulting source exists, or `null` if either the contained URI is invalid or if
+   * it cannot be resolved against the source object's URI.
    *
    * @param containingSource the source containing the given URI
    * @param containedUri the (possibly relative) URI to be resolved against the containing source
@@ -181,10 +179,11 @@
   }
 
   /**
-   * Return an absolute URI that represents the given source.
+   * Return an absolute URI that represents the given source, or `null` if a valid URI cannot
+   * be computed.
    *
    * @param source the source to get URI for
-   * @return the absolute URI representing the given source, may be `null`
+   * @return the absolute URI representing the given source
    */
   Uri restoreUri(Source source) {
     for (UriResolver resolver in _resolvers) {
@@ -239,8 +238,9 @@
   /**
    * If this resolver should be used for URI's of the given kind, resolve the given absolute URI.
    * The URI does not need to have the scheme handled by this resolver if the kind matches. Return a
-   * [Source] representing the file to which it was resolved, or `null` if it
-   * could not be resolved.
+   * [Source] representing the file to which it was resolved, whether or not the
+   * resulting source exists, or `null` if it could not be resolved because the URI is
+   * invalid.
    *
    * @param kind the kind of URI that was originally resolved in order to produce an encoding with
    *          the given URI
@@ -251,7 +251,8 @@
 
   /**
    * Resolve the given absolute URI. Return a [Source] representing the file to which
-   * it was resolved, or `null` if it could not be resolved.
+   * it was resolved, whether or not the resulting source exists, or `null` if it could not be
+   * resolved because the URI is invalid.
    *
    * @param uri the URI to be resolved
    * @return a [Source] representing the file to which given URI was resolved
@@ -259,17 +260,34 @@
   Source resolveAbsolute(Uri uri);
 
   /**
-   * Return an absolute URI that represents the given source.
+   * Return an absolute URI that represents the given source, or `null` if a valid URI cannot
+   * be computed.
    *
    * @param source the source to get URI for
-   * @return the absolute URI representing the given source, may be `null`
+   * @return the absolute URI representing the given source
    */
   Uri restoreAbsolute(Source source) => null;
 }
 
 /**
  * The interface `Source` defines the behavior of objects representing source code that can be
- * compiled.
+ * analyzed by the analysis engine.
+ *
+ * Implementations of this interface need to be aware of some assumptions made by the analysis
+ * engine concerning sources:
+ * * Sources are not required to be unique. That is, there can be multiple instances representing
+ * the same source.
+ * * Sources are long lived. That is, the engine is allowed to hold on to a source for an extended
+ * period of time and that source must continue to report accurate and up-to-date information.
+ * Because of these assumptions, most implementations will not maintain any state but will delegate
+ * to an authoritative system of record in order to implement this API. For example, a source that
+ * represents files on disk would typically query the file system to determine the state of the
+ * file.
+ *
+ * If the instances that implement this API are the system of record, then they will typically be
+ * unique. In that case, sources that are created that represent non-existent files must also be
+ * retained so that if those files are created at a later date the long-lived sources representing
+ * those files will know that they now exist.
  */
 abstract class Source {
   /**
@@ -418,29 +436,29 @@
   /**
    * A source containing HTML. The HTML might or might not contain Dart scripts.
    */
-  static final SourceKind HTML = new SourceKind('HTML', 0);
+  static const SourceKind HTML = const SourceKind('HTML', 0);
 
   /**
    * A Dart compilation unit that is not a part of another library. Libraries might or might not
    * contain any directives, including a library directive.
    */
-  static final SourceKind LIBRARY = new SourceKind('LIBRARY', 1);
+  static const SourceKind LIBRARY = const SourceKind('LIBRARY', 1);
 
   /**
    * A Dart compilation unit that is part of another library. Parts contain a part-of directive.
    */
-  static final SourceKind PART = new SourceKind('PART', 2);
+  static const SourceKind PART = const SourceKind('PART', 2);
 
   /**
    * An unknown kind of source. Used both when it is not possible to identify the kind of a source
    * and also when the kind of a source is not known without performing a computation and the client
    * does not want to spend the time to identify the kind.
    */
-  static final SourceKind UNKNOWN = new SourceKind('UNKNOWN', 3);
+  static const SourceKind UNKNOWN = const SourceKind('UNKNOWN', 3);
 
-  static final List<SourceKind> values = [HTML, LIBRARY, PART, UNKNOWN];
+  static const List<SourceKind> values = const [HTML, LIBRARY, PART, UNKNOWN];
 
-  SourceKind(String name, int ordinal) : super(name, ordinal);
+  const SourceKind(String name, int ordinal) : super(name, ordinal);
 }
 
 /**
@@ -451,24 +469,24 @@
   /**
    * A 'dart:' URI.
    */
-  static final UriKind DART_URI = new UriKind('DART_URI', 0, 0x64);
+  static const UriKind DART_URI = const UriKind('DART_URI', 0, 0x64);
 
   /**
    * A 'file:' URI.
    */
-  static final UriKind FILE_URI = new UriKind('FILE_URI', 1, 0x66);
+  static const UriKind FILE_URI = const UriKind('FILE_URI', 1, 0x66);
 
   /**
    * A 'package:' URI referencing source package itself.
    */
-  static final UriKind PACKAGE_SELF_URI = new UriKind('PACKAGE_SELF_URI', 2, 0x73);
+  static const UriKind PACKAGE_SELF_URI = const UriKind('PACKAGE_SELF_URI', 2, 0x73);
 
   /**
    * A 'package:' URI.
    */
-  static final UriKind PACKAGE_URI = new UriKind('PACKAGE_URI', 3, 0x70);
+  static const UriKind PACKAGE_URI = const UriKind('PACKAGE_URI', 3, 0x70);
 
-  static final List<UriKind> values = [DART_URI, FILE_URI, PACKAGE_SELF_URI, PACKAGE_URI];
+  static const List<UriKind> values = const [DART_URI, FILE_URI, PACKAGE_SELF_URI, PACKAGE_URI];
 
   /**
    * Return the URI kind represented by the given encoding, or `null` if there is no kind with
@@ -496,16 +514,14 @@
   /**
    * The single character encoding used to identify this kind of URI.
    */
-  int encoding = 0;
+  final int encoding;
 
   /**
    * Initialize a newly created URI kind to have the given encoding.
    *
    * @param encoding the single character encoding used to identify this kind of URI.
    */
-  UriKind(String name, int ordinal, int encoding) : super(name, ordinal) {
-    this.encoding = encoding;
-  }
+  const UriKind(String name, int ordinal, this.encoding) : super(name, ordinal);
 }
 
 /**
@@ -521,13 +537,13 @@
    * The 0-based index of the first character of the source code for this element, relative to the
    * source buffer in which this element is contained.
    */
-  int offset = 0;
+  final int offset;
 
   /**
    * The number of characters of the source code for this element, relative to the source buffer in
    * which this element is contained.
    */
-  int length = 0;
+  final int length;
 
   /**
    * Initialize a newly created source range using the given offset and the given length.
@@ -535,10 +551,7 @@
    * @param offset the given offset
    * @param length the given length
    */
-  SourceRange(int offset, int length) {
-    this.offset = offset;
-    this.length = length;
-  }
+  SourceRange(this.offset, this.length);
 
   /**
    * @return `true` if <code>x</code> is in [offset, offset + length) interval.
@@ -657,9 +670,17 @@
  */
 class DartUriResolver extends UriResolver {
   /**
+   * Return `true` if the given URI is a `dart-ext:` URI.
+   *
+   * @param uriContent the textual representation of the URI being tested
+   * @return `true` if the given URI is a `dart-ext:` URI
+   */
+  static bool isDartExtUri(String uriContent) => uriContent != null && uriContent.startsWith(_DART_EXT_SCHEME);
+
+  /**
    * The Dart SDK against which URI's are to be resolved.
    */
-  DartSdk _sdk;
+  final DartSdk _sdk;
 
   /**
    * The name of the `dart` scheme.
@@ -667,6 +688,11 @@
   static String _DART_SCHEME = "dart";
 
   /**
+   * The prefix of a URI using the dart-ext scheme to reference a native code library.
+   */
+  static String _DART_EXT_SCHEME = "dart-ext:";
+
+  /**
    * Return `true` if the given URI is a `dart:` URI.
    *
    * @param uri the URI being tested
@@ -680,13 +706,11 @@
    *
    * @param sdk the Dart SDK against which URI's are to be resolved
    */
-  DartUriResolver(DartSdk sdk) {
-    this._sdk = sdk;
-  }
+  DartUriResolver(this._sdk);
 
   @override
   Source fromEncoding(UriKind kind, Uri uri) {
-    if (identical(kind, UriKind.DART_URI)) {
+    if (kind == UriKind.DART_URI) {
       return _sdk.fromEncoding(kind, uri);
     }
     return null;
@@ -716,7 +740,7 @@
   /**
    * An array containing the offsets of the first character of each line in the source code.
    */
-  List<int> _lineStarts;
+  final List<int> _lineStarts;
 
   /**
    * Initialize a newly created set of line information to represent the data encoded in the given
@@ -724,13 +748,12 @@
    *
    * @param lineStarts the offsets of the first character of each line in the source code
    */
-  LineInfo(List<int> lineStarts) {
-    if (lineStarts == null) {
+  LineInfo(this._lineStarts) {
+    if (_lineStarts == null) {
       throw new IllegalArgumentException("lineStarts must be non-null");
-    } else if (lineStarts.length < 1) {
+    } else if (_lineStarts.length < 1) {
       throw new IllegalArgumentException("lineStarts must be non-empty");
     }
-    this._lineStarts = lineStarts;
   }
 
   /**
@@ -758,12 +781,12 @@
   /**
    * The one-based index of the line containing the character.
    */
-  int lineNumber = 0;
+  final int lineNumber;
 
   /**
    * The one-based index of the column containing the character.
    */
-  int columnNumber = 0;
+  final int columnNumber;
 
   /**
    * Initialize a newly created location to represent the location of the character at the given
@@ -772,10 +795,7 @@
    * @param lineNumber the one-based index of the line containing the character
    * @param columnNumber the one-based index of the column containing the character
    */
-  LineInfo_Location(int lineNumber, int columnNumber) {
-    this.lineNumber = lineNumber;
-    this.columnNumber = columnNumber;
-  }
+  LineInfo_Location(this.lineNumber, this.columnNumber);
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index 711d7fe..0be26ec 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -66,7 +66,7 @@
   /**
    * The file represented by this source.
    */
-  JavaFile _file;
+  final JavaFile file;
 
   /**
    * The cached encoding for this source.
@@ -76,7 +76,7 @@
   /**
    * The kind of URI from which this source was originally derived.
    */
-  UriKind _uriKind;
+  final UriKind uriKind;
 
   /**
    * Initialize a newly created source object. The source object is assumed to not be in a system
@@ -92,16 +92,13 @@
    * @param file the file represented by this source
    * @param flags `true` if this source is in one of the system libraries
    */
-  FileBasedSource.con2(JavaFile file, UriKind uriKind) {
-    this._file = file;
-    this._uriKind = uriKind;
-  }
+  FileBasedSource.con2(this.file, this.uriKind);
 
   @override
-  bool operator ==(Object object) => object != null && this.runtimeType == object.runtimeType && _file == (object as FileBasedSource)._file;
+  bool operator ==(Object object) => object != null && this.runtimeType == object.runtimeType && file == (object as FileBasedSource).file;
 
   @override
-  bool exists() => _file.isFile();
+  bool exists() => file.isFile();
 
   @override
   TimestampedData<String> get contents {
@@ -116,34 +113,31 @@
   @override
   String get encoding {
     if (_encoding == null) {
-      _encoding = "${_uriKind.encoding}${_file.toURI().toString()}";
+      _encoding = "${uriKind.encoding}${file.toURI().toString()}";
     }
     return _encoding;
   }
 
   @override
-  String get fullName => _file.getAbsolutePath();
+  String get fullName => file.getAbsolutePath();
 
   @override
-  int get modificationStamp => _file.lastModified();
+  int get modificationStamp => file.lastModified();
 
   @override
-  String get shortName => _file.getName();
+  String get shortName => file.getName();
 
   @override
-  UriKind get uriKind => _uriKind;
+  int get hashCode => file.hashCode;
 
   @override
-  int get hashCode => _file.hashCode;
-
-  @override
-  bool get isInSystemLibrary => identical(_uriKind, UriKind.DART_URI);
+  bool get isInSystemLibrary => uriKind == UriKind.DART_URI;
 
   @override
   Source resolveRelative(Uri containedUri) {
     try {
       Uri resolvedUri = file.toURI().resolveUri(containedUri);
-      return new FileBasedSource.con2(new JavaFile.fromUri(resolvedUri), _uriKind);
+      return new FileBasedSource.con2(new JavaFile.fromUri(resolvedUri), uriKind);
     } on JavaException catch (exception) {
     }
     return null;
@@ -151,10 +145,10 @@
 
   @override
   String toString() {
-    if (_file == null) {
+    if (file == null) {
       return "<unknown source>";
     }
-    return _file.getAbsolutePath();
+    return file.getAbsolutePath();
   }
 
   /**
@@ -169,16 +163,8 @@
    * @see #getContents()
    */
   TimestampedData<String> get contentsFromFile {
-    return new TimestampedData<String>(_file.lastModified(), _file.readAsStringSync());
+    return new TimestampedData<String>(file.lastModified(), file.readAsStringSync());
   }
-
-  /**
-   * Return the file represented by this source. This is an internal method that is only intended to
-   * be used by subclasses of [UriResolver] that are designed to work with file-based sources.
-   *
-   * @return the file represented by this source
-   */
-  JavaFile get file => _file;
 }
 
 /**
@@ -193,7 +179,7 @@
   /**
    * The package directories that `package` URI's are assumed to be relative to.
    */
-  List<JavaFile> _packagesDirectories;
+  final List<JavaFile> _packagesDirectories;
 
   /**
    * The name of the `package` scheme.
@@ -220,16 +206,15 @@
    * @param packagesDirectories the package directories that `package` URI's are assumed to be
    *          relative to
    */
-  PackageUriResolver(List<JavaFile> packagesDirectories) {
-    if (packagesDirectories.length < 1) {
+  PackageUriResolver(this._packagesDirectories) {
+    if (_packagesDirectories.length < 1) {
       throw new IllegalArgumentException("At least one package directory must be provided");
     }
-    this._packagesDirectories = packagesDirectories;
   }
 
   @override
   Source fromEncoding(UriKind kind, Uri uri) {
-    if (identical(kind, UriKind.PACKAGE_SELF_URI) || identical(kind, UriKind.PACKAGE_URI)) {
+    if (kind == UriKind.PACKAGE_SELF_URI || kind == UriKind.PACKAGE_URI) {
       return new FileBasedSource.con2(new JavaFile.fromUri(uri), kind);
     }
     return null;
@@ -418,7 +403,7 @@
 
   @override
   Source fromEncoding(UriKind kind, Uri uri) {
-    if (identical(kind, UriKind.FILE_URI)) {
+    if (kind == UriKind.FILE_URI) {
       return new FileBasedSource.con2(new JavaFile.fromUri(uri), kind);
     }
     return null;
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index b8b7890..f28e1f1 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -336,7 +336,7 @@
   /**
    * The graph to work with.
    */
-  DirectedGraph<N> _graph;
+  final DirectedGraph<N> _graph;
 
   /**
    * The index used to uniquely identify the depth of nodes.
@@ -356,9 +356,7 @@
   /**
    * Initialize a newly created finder.
    */
-  DirectedGraph_SccFinder(DirectedGraph<N> graph) : super() {
-    this._graph = graph;
-  }
+  DirectedGraph_SccFinder(this._graph) : super();
 
   /**
    * Return a list containing the nodes that are part of the strongly connected component that
@@ -432,7 +430,7 @@
         w = _pop();
         component.add(w);
         _nodeMap[w].component = component;
-      } while (w != v);
+      } while (!identical(w, v));
     }
     return vInfo;
   }
diff --git a/pkg/analyzer/lib/src/generated/utilities_dart.dart b/pkg/analyzer/lib/src/generated/utilities_dart.dart
index a9bddb5..40a07fc 100644
--- a/pkg/analyzer/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_dart.dart
@@ -15,25 +15,23 @@
  * two kinds: positional optional and named optional.
  */
 class ParameterKind extends Enum<ParameterKind> {
-  static final ParameterKind REQUIRED = new ParameterKind('REQUIRED', 0, false);
+  static const ParameterKind REQUIRED = const ParameterKind('REQUIRED', 0, false);
 
-  static final ParameterKind POSITIONAL = new ParameterKind('POSITIONAL', 1, true);
+  static const ParameterKind POSITIONAL = const ParameterKind('POSITIONAL', 1, true);
 
-  static final ParameterKind NAMED = new ParameterKind('NAMED', 2, true);
+  static const ParameterKind NAMED = const ParameterKind('NAMED', 2, true);
 
-  static final List<ParameterKind> values = [REQUIRED, POSITIONAL, NAMED];
+  static const List<ParameterKind> values = const [REQUIRED, POSITIONAL, NAMED];
 
   /**
    * A flag indicating whether this is an optional parameter.
    */
-  bool isOptional = false;
+  final bool isOptional;
 
   /**
    * Initialize a newly created kind with the given state.
    *
    * @param isOptional `true` if this is an optional parameter
    */
-  ParameterKind(String name, int ordinal, bool isOptional) : super(name, ordinal) {
-    this.isOptional = isOptional;
-  }
+  const ParameterKind(String name, int ordinal, this.isOptional) : super(name, ordinal);
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/utilities_general.dart b/pkg/analyzer/lib/src/generated/utilities_general.dart
index abee059..d889e35 100644
--- a/pkg/analyzer/lib/src/generated/utilities_general.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_general.dart
@@ -11,7 +11,8 @@
  * Helper for measuring how much time is spent doing some operation.
  */
 class TimeCounter {
-  Stopwatch _sw = new Stopwatch();
+  static TimeCounter _current = null;
+  final Stopwatch _sw = new Stopwatch();
 
   /**
    * @return the number of milliseconds spent between [start] and [stop].
@@ -23,7 +24,9 @@
    *
    * @return the [TimeCounterHandle] that should be used to stop counting.
    */
-  TimeCounter_TimeCounterHandle start() => new TimeCounter_TimeCounterHandle(this);
+  TimeCounter_TimeCounterHandle start() {
+    return new TimeCounter_TimeCounterHandle(this);
+  }
 }
 
 /**
@@ -31,8 +34,16 @@
  */
 class TimeCounter_TimeCounterHandle {
   final TimeCounter _counter;
+  TimeCounter _prev;
 
   TimeCounter_TimeCounterHandle(this._counter) {
+    // if there is some counter running, pause it
+    _prev = TimeCounter._current;
+    if (_prev != null) {
+      _prev._sw.stop();
+    }
+    TimeCounter._current = _counter;
+    // start this counter
     _counter._sw.start();
   }
 
@@ -41,5 +52,10 @@
    */
   void stop() {
     _counter._sw.stop();
+    // restore previous counter and resume it
+    TimeCounter._current = _prev;
+    if (_prev != null) {
+      _prev._sw.start();
+    }
   }
-}
\ No newline at end of file
+}
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 5d214ab..bf3f884 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.13.3
+version: 0.13.4
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index e215fdb..b582327 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -818,7 +818,7 @@
     for (WrapperKind wrapper in WrapperKind.values) {
       for (AssignmentKind assignment in AssignmentKind.values) {
         SimpleIdentifier identifier = _createIdentifier(wrapper, assignment);
-        if (identical(assignment, AssignmentKind.SIMPLE_LEFT) && wrapper != WrapperKind.PREFIXED_LEFT && wrapper != WrapperKind.PROPERTY_LEFT) {
+        if (assignment == AssignmentKind.SIMPLE_LEFT && wrapper != WrapperKind.PREFIXED_LEFT && wrapper != WrapperKind.PROPERTY_LEFT) {
           if (identifier.inGetterContext()) {
             JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be false");
           }
@@ -842,7 +842,7 @@
     for (WrapperKind wrapper in WrapperKind.values) {
       for (AssignmentKind assignment in AssignmentKind.values) {
         SimpleIdentifier identifier = _createIdentifier(wrapper, assignment);
-        if (identical(wrapper, WrapperKind.PREFIXED_LEFT) || identical(wrapper, WrapperKind.PROPERTY_LEFT) || identical(assignment, AssignmentKind.BINARY) || identical(assignment, AssignmentKind.COMPOUND_RIGHT) || identical(assignment, AssignmentKind.PREFIX_NOT) || identical(assignment, AssignmentKind.SIMPLE_RIGHT) || identical(assignment, AssignmentKind.NONE)) {
+        if (wrapper == WrapperKind.PREFIXED_LEFT || wrapper == WrapperKind.PROPERTY_LEFT || assignment == AssignmentKind.BINARY || assignment == AssignmentKind.COMPOUND_RIGHT || assignment == AssignmentKind.PREFIX_NOT || assignment == AssignmentKind.SIMPLE_RIGHT || assignment == AssignmentKind.NONE) {
           if (identifier.inSetterContext()) {
             JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be false");
           }
@@ -1000,27 +1000,27 @@
 }
 
 class AssignmentKind extends Enum<AssignmentKind> {
-  static final AssignmentKind BINARY = new AssignmentKind('BINARY', 0);
+  static const AssignmentKind BINARY = const AssignmentKind('BINARY', 0);
 
-  static final AssignmentKind COMPOUND_LEFT = new AssignmentKind('COMPOUND_LEFT', 1);
+  static const AssignmentKind COMPOUND_LEFT = const AssignmentKind('COMPOUND_LEFT', 1);
 
-  static final AssignmentKind COMPOUND_RIGHT = new AssignmentKind('COMPOUND_RIGHT', 2);
+  static const AssignmentKind COMPOUND_RIGHT = const AssignmentKind('COMPOUND_RIGHT', 2);
 
-  static final AssignmentKind POSTFIX_INC = new AssignmentKind('POSTFIX_INC', 3);
+  static const AssignmentKind POSTFIX_INC = const AssignmentKind('POSTFIX_INC', 3);
 
-  static final AssignmentKind PREFIX_DEC = new AssignmentKind('PREFIX_DEC', 4);
+  static const AssignmentKind PREFIX_DEC = const AssignmentKind('PREFIX_DEC', 4);
 
-  static final AssignmentKind PREFIX_INC = new AssignmentKind('PREFIX_INC', 5);
+  static const AssignmentKind PREFIX_INC = const AssignmentKind('PREFIX_INC', 5);
 
-  static final AssignmentKind PREFIX_NOT = new AssignmentKind('PREFIX_NOT', 6);
+  static const AssignmentKind PREFIX_NOT = const AssignmentKind('PREFIX_NOT', 6);
 
-  static final AssignmentKind SIMPLE_LEFT = new AssignmentKind('SIMPLE_LEFT', 7);
+  static const AssignmentKind SIMPLE_LEFT = const AssignmentKind('SIMPLE_LEFT', 7);
 
-  static final AssignmentKind SIMPLE_RIGHT = new AssignmentKind('SIMPLE_RIGHT', 8);
+  static const AssignmentKind SIMPLE_RIGHT = const AssignmentKind('SIMPLE_RIGHT', 8);
 
-  static final AssignmentKind NONE = new AssignmentKind('NONE', 9);
+  static const AssignmentKind NONE = const AssignmentKind('NONE', 9);
 
-  static final List<AssignmentKind> values = [
+  static const List<AssignmentKind> values = const [
       BINARY,
       COMPOUND_LEFT,
       COMPOUND_RIGHT,
@@ -1032,28 +1032,28 @@
       SIMPLE_RIGHT,
       NONE];
 
-  AssignmentKind(String name, int ordinal) : super(name, ordinal);
+  const AssignmentKind(String name, int ordinal) : super(name, ordinal);
 }
 
 class WrapperKind extends Enum<WrapperKind> {
-  static final WrapperKind PREFIXED_LEFT = new WrapperKind('PREFIXED_LEFT', 0);
+  static const WrapperKind PREFIXED_LEFT = const WrapperKind('PREFIXED_LEFT', 0);
 
-  static final WrapperKind PREFIXED_RIGHT = new WrapperKind('PREFIXED_RIGHT', 1);
+  static const WrapperKind PREFIXED_RIGHT = const WrapperKind('PREFIXED_RIGHT', 1);
 
-  static final WrapperKind PROPERTY_LEFT = new WrapperKind('PROPERTY_LEFT', 2);
+  static const WrapperKind PROPERTY_LEFT = const WrapperKind('PROPERTY_LEFT', 2);
 
-  static final WrapperKind PROPERTY_RIGHT = new WrapperKind('PROPERTY_RIGHT', 3);
+  static const WrapperKind PROPERTY_RIGHT = const WrapperKind('PROPERTY_RIGHT', 3);
 
-  static final WrapperKind NONE = new WrapperKind('NONE', 4);
+  static const WrapperKind NONE = const WrapperKind('NONE', 4);
 
-  static final List<WrapperKind> values = [
+  static const List<WrapperKind> values = const [
       PREFIXED_LEFT,
       PREFIXED_RIGHT,
       PROPERTY_LEFT,
       PROPERTY_RIGHT,
       NONE];
 
-  WrapperKind(String name, int ordinal) : super(name, ordinal);
+  const WrapperKind(String name, int ordinal) : super(name, ordinal);
 }
 
 class BreadthFirstVisitorTest extends ParserTestCase {
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 3a9d2b9..4054c21 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -7733,6 +7733,33 @@
 }
 
 class HintCodeTest extends ResolverTestCase {
+  void fail_deadCode_statementAfterRehrow() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  try {",
+        "    var one = 1;",
+        "  } catch (e) {",
+        "    rethrow;",
+        "    var two = 2;",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
+  void fail_deadCode_statementAfterThrow() {
+    Source source = addSource(EngineTestCase.createSource([
+        "f() {",
+        "  var one = 1;",
+        "  throw 'Stop here';",
+        "  var two = 2;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.DEAD_CODE]);
+    verify([source]);
+  }
+
   void fail_isInt() {
     Source source = addSource(EngineTestCase.createSource(["var v = 1 is int;"]));
     resolve(source);
@@ -16090,12 +16117,30 @@
   }
 
   void test_visitBinaryExpression() {
+    // num i;
+    // var j;
+    // i + j
     InterfaceType numType = _typeProvider.numType;
     SimpleIdentifier left = AstFactory.identifier3("i");
     left.staticType = numType;
     BinaryExpression expression = AstFactory.binaryExpression(left, TokenType.PLUS, AstFactory.identifier3("j"));
     _resolveNode(expression, []);
     JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
+    JUnitTestCase.assertNull(expression.propagatedElement);
+    _listener.assertNoErrors();
+  }
+
+  void test_visitBinaryExpression_propagatedElement() {
+    // var i = 1;
+    // var j;
+    // i + j
+    InterfaceType numType = _typeProvider.numType;
+    SimpleIdentifier left = AstFactory.identifier3("i");
+    left.propagatedType = numType;
+    BinaryExpression expression = AstFactory.binaryExpression(left, TokenType.PLUS, AstFactory.identifier3("j"));
+    _resolveNode(expression, []);
+    JUnitTestCase.assertNull(expression.staticElement);
+    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.propagatedElement);
     _listener.assertNoErrors();
   }
 
@@ -16691,6 +16736,10 @@
         final __test = new ElementResolverTest();
         runJUnitTest(__test, __test.test_visitBinaryExpression);
       });
+      _ut.test('test_visitBinaryExpression_propagatedElement', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitBinaryExpression_propagatedElement);
+      });
       _ut.test('test_visitBreakStatement_withLabel', () {
         final __test = new ElementResolverTest();
         runJUnitTest(__test, __test.test_visitBreakStatement_withLabel);
@@ -18932,6 +18981,34 @@
     verify([source]);
   }
 
+  void test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingGetter() {
+    // 16133
+    Source source = addSource(EngineTestCase.createSource([
+        "class I {",
+        "  var v;",
+        "}",
+        "class C implements I {",
+        "  set v(_) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
+  void test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingSetter() {
+    // 16133
+    Source source = addSource(EngineTestCase.createSource([
+        "class I {",
+        "  var v;",
+        "}",
+        "class C implements I {",
+        "  get v => 1;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
+    verify([source]);
+  }
+
   void test_nonAbstractClassInheritsAbstractMemberThree() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A {",
@@ -18959,6 +19036,19 @@
     verify([source]);
   }
 
+  void test_nonAbstractClassInheritsAbstractMemberTwo_variable_fromInterface_missingBoth() {
+    // 16133
+    Source source = addSource(EngineTestCase.createSource([
+        "class I {",
+        "  var v;",
+        "}",
+        "class C implements I {",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO]);
+    verify([source]);
+  }
+
   void test_nonTypeInCatchClause_noElement() {
     Source source = addSource(EngineTestCase.createSource(["f() {", "  try {", "  } on T catch (e) {", "  }", "}"]));
     resolve(source);
@@ -19101,13 +19191,42 @@
     verify([source]);
   }
 
-  void test_returnWithoutValue() {
+  void test_returnWithoutValue_factoryConstructor() {
+    Source source = addSource(EngineTestCase.createSource(["class A { factory A() { return; } }"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
+    verify([source]);
+  }
+
+  void test_returnWithoutValue_function() {
     Source source = addSource(EngineTestCase.createSource(["int f() { return; }"]));
     resolve(source);
     assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
     verify([source]);
   }
 
+  void test_returnWithoutValue_method() {
+    Source source = addSource(EngineTestCase.createSource(["class A { int m() { return; } }"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
+    verify([source]);
+  }
+
+  void test_returnWithoutValue_mixedReturnTypes_function() {
+    // Tests that only the RETURN_WITHOUT_VALUE warning is created, and no MIXED_RETURN_TYPES are
+    // created.
+    Source source = addSource(EngineTestCase.createSource([
+        "int f(int x) {",
+        "  if (x < 0) {",
+        "    return 1;",
+        "  }",
+        "  return;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
+    verify([source]);
+  }
+
   void test_staticAccessToInstanceMember_method_invocation() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "}", "main() {", "  A.m();", "}"]));
     resolve(source);
@@ -19396,6 +19515,12 @@
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
 
+  void test_voidReturnForGetter() {
+    Source source = addSource(EngineTestCase.createSource(["class S {", "  void get value {}", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.VOID_RETURN_FOR_GETTER]);
+  }
+
   static dartSuite() {
     _ut.group('StaticWarningCodeTest', () {
       _ut.test('test_ambiguousImport_as', () {
@@ -20026,6 +20151,14 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_superclasses_interface);
       });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingGetter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingGetter);
+      });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingSetter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingSetter);
+      });
       _ut.test('test_nonAbstractClassInheritsAbstractMemberThree', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberThree);
@@ -20034,6 +20167,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberTwo);
       });
+      _ut.test('test_nonAbstractClassInheritsAbstractMemberTwo_variable_fromInterface_missingBoth', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_nonAbstractClassInheritsAbstractMemberTwo_variable_fromInterface_missingBoth);
+      });
       _ut.test('test_nonTypeInCatchClause_noElement', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_nonTypeInCatchClause_noElement);
@@ -20094,9 +20231,21 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_redirectToNonClass_undefinedIdentifier);
       });
-      _ut.test('test_returnWithoutValue', () {
+      _ut.test('test_returnWithoutValue_factoryConstructor', () {
         final __test = new StaticWarningCodeTest();
-        runJUnitTest(__test, __test.test_returnWithoutValue);
+        runJUnitTest(__test, __test.test_returnWithoutValue_factoryConstructor);
+      });
+      _ut.test('test_returnWithoutValue_function', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_returnWithoutValue_function);
+      });
+      _ut.test('test_returnWithoutValue_method', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_returnWithoutValue_method);
+      });
+      _ut.test('test_returnWithoutValue_mixedReturnTypes_function', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_returnWithoutValue_mixedReturnTypes_function);
       });
       _ut.test('test_staticAccessToInstanceMember_method_invocation', () {
         final __test = new StaticWarningCodeTest();
@@ -20230,6 +20379,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_undefinedStaticMethodOrGetter_setter_inSuperclass);
       });
+      _ut.test('test_voidReturnForGetter', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_voidReturnForGetter);
+      });
     });
   }
 }
@@ -20640,6 +20793,7 @@
         ElementFactory.methodElement("<=", _boolType, [_numType]),
         ElementFactory.methodElement(">", _boolType, [_numType]),
         ElementFactory.methodElement(">=", _boolType, [_numType]),
+        ElementFactory.methodElement("==", _boolType, [_objectType]),
         ElementFactory.methodElement("isNaN", _boolType, []),
         ElementFactory.methodElement("isNegative", _boolType, []),
         ElementFactory.methodElement("isInfinite", _boolType, []),
@@ -21042,7 +21196,7 @@
    * A set containing nodes that are known to not be resolvable and should therefore not cause the
    * test to fail.
    */
-  Set<AstNode> _knownExceptions;
+  final Set<AstNode> _knownExceptions;
 
   /**
    * A list containing all of the AST nodes that were not resolved.
@@ -21069,9 +21223,7 @@
    * @param knownExceptions a set containing nodes that are known to not be resolvable and should
    *          therefore not cause the test to fail
    **/
-  ResolutionVerifier.con1(Set<AstNode> knownExceptions) {
-    this._knownExceptions = knownExceptions;
-  }
+  ResolutionVerifier.con1(this._knownExceptions);
 
   /**
    * Assert that all of the visited identifiers were resolved.
@@ -23582,26 +23734,26 @@
 
 class EnclosedScopeTest extends ResolverTestCase {
   void test_define_duplicate() {
-    GatheringErrorListener errorListener2 = new GatheringErrorListener();
-    Scope rootScope = new Scope_EnclosedScopeTest_test_define_duplicate(errorListener2);
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope rootScope = new Scope_EnclosedScopeTest_test_define_duplicate(listener);
     EnclosedScope scope = new EnclosedScope(rootScope);
     VariableElement element1 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
     VariableElement element2 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
     scope.define(element1);
     scope.define(element2);
-    errorListener2.assertErrorsWithSeverities([ErrorSeverity.ERROR]);
+    listener.assertErrorsWithSeverities([ErrorSeverity.ERROR]);
   }
 
   void test_define_normal() {
-    GatheringErrorListener errorListener3 = new GatheringErrorListener();
-    Scope rootScope = new Scope_EnclosedScopeTest_test_define_normal(errorListener3);
+    GatheringErrorListener listener = new GatheringErrorListener();
+    Scope rootScope = new Scope_EnclosedScopeTest_test_define_normal(listener);
     EnclosedScope outerScope = new EnclosedScope(rootScope);
     EnclosedScope innerScope = new EnclosedScope(outerScope);
     VariableElement element1 = ElementFactory.localVariableElement(AstFactory.identifier3("v1"));
     VariableElement element2 = ElementFactory.localVariableElement(AstFactory.identifier3("v2"));
     outerScope.define(element1);
     innerScope.define(element2);
-    errorListener3.assertNoErrors();
+    listener.assertNoErrors();
   }
 
   static dartSuite() {
@@ -23619,24 +23771,24 @@
 }
 
 class Scope_EnclosedScopeTest_test_define_duplicate extends Scope {
-  GatheringErrorListener errorListener2;
+  GatheringErrorListener listener;
 
-  Scope_EnclosedScopeTest_test_define_duplicate(this.errorListener2) : super();
+  Scope_EnclosedScopeTest_test_define_duplicate(this.listener) : super();
 
   @override
-  AnalysisErrorListener get errorListener => errorListener2;
+  AnalysisErrorListener get errorListener => listener;
 
   @override
   Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
 }
 
 class Scope_EnclosedScopeTest_test_define_normal extends Scope {
-  GatheringErrorListener errorListener3;
+  GatheringErrorListener listener;
 
-  Scope_EnclosedScopeTest_test_define_normal(this.errorListener3) : super();
+  Scope_EnclosedScopeTest_test_define_normal(this.listener) : super();
 
   @override
-  AnalysisErrorListener get errorListener => errorListener3;
+  AnalysisErrorListener get errorListener => listener;
 
   @override
   Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => null;
@@ -23697,12 +23849,6 @@
     EngineTestCase.assertLength(0, unit.topLevelVariables);
   }
 
-  void test_invalidUri_part() {
-    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part '\${'a'}.dart';"]));
-    LibraryElement element = _buildLibrary(librarySource, [CompileTimeErrorCode.URI_WITH_INTERPOLATION]);
-    JUnitTestCase.assertNotNull(element);
-  }
-
   void test_missingLibraryDirectiveWithPart() {
     addSource("/a.dart", EngineTestCase.createSource(["part of lib;"]));
     Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["part 'a.dart';"]));
@@ -23815,10 +23961,6 @@
         final __test = new LibraryElementBuilderTest();
         runJUnitTest(__test, __test.test_empty);
       });
-      _ut.test('test_invalidUri_part', () {
-        final __test = new LibraryElementBuilderTest();
-        runJUnitTest(__test, __test.test_invalidUri_part);
-      });
       _ut.test('test_missingLibraryDirectiveWithPart', () {
         final __test = new LibraryElementBuilderTest();
         runJUnitTest(__test, __test.test_missingLibraryDirectiveWithPart);
@@ -23907,11 +24049,9 @@
   /**
    * The listener that is to be informed when an error is encountered.
    */
-  AnalysisErrorListener errorListener;
+  final AnalysisErrorListener errorListener;
 
-  ScopeTest_TestScope(AnalysisErrorListener errorListener) {
-    this.errorListener = errorListener;
-  }
+  ScopeTest_TestScope(this.errorListener);
 
   @override
   Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => localLookup(name, referencingLibrary);
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index a0769fe..0d52188 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -265,7 +265,7 @@
     while (currentToken != null && currentToken.type != TokenType.EOF) {
       _validateStream(builder, currentToken.precedingComments);
       TokenType type = currentToken.type;
-      if (identical(type, TokenType.OPEN_CURLY_BRACKET) || identical(type, TokenType.OPEN_PAREN) || identical(type, TokenType.OPEN_SQUARE_BRACKET) || identical(type, TokenType.STRING_INTERPOLATION_EXPRESSION)) {
+      if (type == TokenType.OPEN_CURLY_BRACKET || type == TokenType.OPEN_PAREN || type == TokenType.OPEN_SQUARE_BRACKET || type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
         if (currentToken is! BeginToken) {
           builder.append("\r\nExpected BeginToken, found ");
           builder.append(currentToken.runtimeType.toString());
@@ -1145,10 +1145,10 @@
     JUnitTestCase.assertEquals(0, originalToken.offset);
     JUnitTestCase.assertEquals(source.length, originalToken.length);
     JUnitTestCase.assertEquals(source, originalToken.lexeme);
-    if (identical(expectedType, TokenType.SCRIPT_TAG)) {
+    if (expectedType == TokenType.SCRIPT_TAG) {
       // Adding space before the script tag is not allowed, and adding text at the end changes nothing.
       return originalToken;
-    } else if (identical(expectedType, TokenType.SINGLE_LINE_COMMENT)) {
+    } else if (expectedType == TokenType.SINGLE_LINE_COMMENT) {
       // Adding space to an end-of-line comment changes the comment.
       Token tokenWithSpaces = _scan(" ${source}");
       JUnitTestCase.assertNotNull(tokenWithSpaces);
@@ -1157,7 +1157,7 @@
       JUnitTestCase.assertEquals(source.length, tokenWithSpaces.length);
       JUnitTestCase.assertEquals(source, tokenWithSpaces.lexeme);
       return originalToken;
-    } else if (identical(expectedType, TokenType.INT) || identical(expectedType, TokenType.DOUBLE)) {
+    } else if (expectedType == TokenType.INT || expectedType == TokenType.DOUBLE) {
       Token tokenWithLowerD = _scan("${source}d");
       JUnitTestCase.assertNotNull(tokenWithLowerD);
       JUnitTestCase.assertEquals(expectedType, tokenWithLowerD.type);
@@ -1880,17 +1880,13 @@
  * of a given offset in source code.
  */
 class ScannerTest_ExpectedLocation {
-  int _offset = 0;
+  final int _offset;
 
-  int _lineNumber = 0;
+  final int _lineNumber;
 
-  int _columnNumber = 0;
+  final int _columnNumber;
 
-  ScannerTest_ExpectedLocation(int offset, int lineNumber, int columnNumber) {
-    this._offset = offset;
-    this._lineNumber = lineNumber;
-    this._columnNumber = columnNumber;
-  }
+  ScannerTest_ExpectedLocation(this._offset, this._lineNumber, this._columnNumber);
 }
 
 class IncrementalScannerTest extends EngineTestCase {
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index 9bffa5a..2490233 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -26,7 +26,7 @@
   /**
    * The source being parsed.
    */
-  String _rawSource;
+  final String _rawSource;
 
   /**
    * The source being parsed after inserting a marker at the beginning and end of the range of the
@@ -52,14 +52,13 @@
   /**
    * Initialize a newly created error listener to collect errors.
    */
-  GatheringErrorListener() : super();
+  GatheringErrorListener() : this.con1(null);
 
   /**
    * Initialize a newly created error listener to collect errors.
    */
-  GatheringErrorListener.con1(String rawSource) {
-    this._rawSource = rawSource;
-    this._markedSource = rawSource;
+  GatheringErrorListener.con1(this._rawSource) {
+    this._markedSource = _rawSource;
   }
 
   /**
@@ -210,7 +209,7 @@
     int expectedErrorCount = 0;
     int expectedWarningCount = 0;
     for (ErrorSeverity severity in expectedSeverities) {
-      if (identical(severity, ErrorSeverity.ERROR)) {
+      if (severity == ErrorSeverity.ERROR) {
         expectedErrorCount++;
       } else {
         expectedWarningCount++;
@@ -219,7 +218,7 @@
     int actualErrorCount = 0;
     int actualWarningCount = 0;
     for (AnalysisError error in _errors) {
-      if (identical(error.errorCode.errorSeverity, ErrorSeverity.ERROR)) {
+      if (error.errorCode.errorSeverity == ErrorSeverity.ERROR) {
         actualErrorCount++;
       } else {
         actualWarningCount++;
diff --git a/pkg/async/pubspec.yaml b/pkg/async/pubspec.yaml
index 5c9a328..f3442c2 100644
--- a/pkg/async/pubspec.yaml
+++ b/pkg/async/pubspec.yaml
@@ -1,9 +1,9 @@
 name: async
-version: 0.9.1
+version: 0.9.1+1
 author: Dart Team <misc@dartlang.org>
 description: Utility functions and classes related to the 'dart:async' library.
 homepage: http://www.dartlang.org
 dev_dependencies:
-  unittest: ">=0.9.0 <0.10.0"
+  unittest: ">=0.10.0 <0.12.0"
 environment:
   sdk: ">=1.0.0 <2.0.0"
diff --git a/pkg/async/test/stream_zip_test.dart b/pkg/async/test/stream_zip_test.dart
index 54083b9..56a016a 100644
--- a/pkg/async/test/stream_zip_test.dart
+++ b/pkg/async/test/stream_zip_test.dart
@@ -38,7 +38,7 @@
   testZip(Iterable streams, Iterable expectedData) {
     List data = [];
     Stream zip = new StreamZip(streams);
-    zip.listen(data.add, onDone: expectAsync0(() {
+    zip.listen(data.add, onDone: expectAsync(() {
       expect(data, equals(expectedData));
     }));
   }
@@ -155,7 +155,7 @@
   });
 
   test("Pause/Resume", () {
-    var done = expectAsync0((){});  // Call to complete test.
+    var done = expectAsync((){});  // Call to complete test.
 
     int sc1p = 0;
     StreamController c1 = new StreamController(
@@ -215,7 +215,7 @@
     var sz = new StreamZip([s1, s2]);
     int ctr = 0;
     var sub;
-    sub = sz.listen(expectAsync1((v) {
+    sub = sz.listen(expectAsync((v) {
       expect(v, equals([ctr * 2, ctr * 2 + 1]));
       if (ctr == 1) {
         sub.pause(new Future.delayed(const Duration(milliseconds: 25)));
diff --git a/pkg/async/test/stream_zip_zone_test.dart b/pkg/async/test/stream_zip_zone_test.dart
index d39e3d7..0b0c4bc 100644
--- a/pkg/async/test/stream_zip_zone_test.dart
+++ b/pkg/async/test/stream_zip_zone_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "dart:async";
-import "package:async/stream_zip.dart";
 import "package:unittest/unittest.dart";
 
 // Test that stream listener callbacks all happen in the zone where the
@@ -34,16 +33,16 @@
     runZoned(() {
       Zone newZone1 = Zone.current;
       StreamSubscription sub;
-      sub = stream.listen(expectAsync1((v) {
+      sub = stream.listen(expectAsync((v) {
         expect(v, 42);
         expect(Zone.current, newZone1);
         outer.run(() {
-          sub.onData(expectAsync1((v) {
+          sub.onData(expectAsync((v) {
             expect(v, 37);
             expect(Zone.current, newZone1);
             runZoned(() {
               Zone newZone2 = Zone.current;
-              sub.onData(expectAsync1((v) {
+              sub.onData(expectAsync((v) {
                 expect(v, 87);
                 expect(Zone.current, newZone1);
               }));
diff --git a/pkg/barback/CHANGELOG.md b/pkg/barback/CHANGELOG.md
index 753e5a1..c62245e 100644
--- a/pkg/barback/CHANGELOG.md
+++ b/pkg/barback/CHANGELOG.md
@@ -1,3 +1,17 @@
+## 0.13.1
+
+* Only run `Transformer.isPrimary` once for each asset.
+
+## 0.13.0
+
+* `Transformer.isPrimary` now takes an `AssetId` rather than an `Asset`.
+
+* `DeclaringTransform` now only exposes the primary input's `AssetId`, rather
+  than the primary `Asset` object.
+
+* `DeclaringTransform` no longer supports `getInput`, `readInput`,
+  `readInputAsString`, or `hasInput`.
+
 ## 0.12.0
 
 * Add a `Transform.logger.fine` function that doesn't print its messages by
diff --git a/pkg/barback/example/markdown_converter/README.md b/pkg/barback/example/markdown_converter/README.md
new file mode 100644
index 0000000..84325dd
--- /dev/null
+++ b/pkg/barback/example/markdown_converter/README.md
@@ -0,0 +1,4 @@
+This example shows how to write a simple pub transformer.
+
+For more information, see Writing a Pub Transformer:
+https://www.dartlang.org/tools/pub/transformers/
diff --git a/pkg/barback/example/markdown_converter/lib/transformer.dart b/pkg/barback/example/markdown_converter/lib/transformer.dart
new file mode 100644
index 0000000..22bff32
--- /dev/null
+++ b/pkg/barback/example/markdown_converter/lib/transformer.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:barback/barback.dart';
+import 'package:markdown/markdown.dart';
+
+import 'dart:async';
+
+class ConvertMarkdown extends Transformer {
+
+  // A constructor named "asPlugin" is required. It can be empty, but
+  // it must be present. It is how pub determines that you want this
+  // class to be publicly available as a loadable transformer plugin.
+  ConvertMarkdown.asPlugin();
+
+  // Any markdown file with one of the following extensions is
+  // converted to HTML.
+  String get allowedExtensions => ".md .markdown .mdown";
+
+  Future apply(Transform transform) {
+    return transform.primaryInput.readAsString().then((content) {
+
+      // The extension of the output is changed to ".html".
+      var id = transform.primaryInput.id.changeExtension(".html");
+
+      String newContent = "<html><body>"
+                        + markdownToHtml(content)
+                        + "</body></html>";
+      transform.addOutput(new Asset.fromString(id, newContent));
+    });
+  }
+}
diff --git a/pkg/barback/example/markdown_converter/pubspec.yaml b/pkg/barback/example/markdown_converter/pubspec.yaml
new file mode 100644
index 0000000..f212c9f
--- /dev/null
+++ b/pkg/barback/example/markdown_converter/pubspec.yaml
@@ -0,0 +1,10 @@
+name: markdown_converter
+description: This hello world example implements a simple
+             transformer that converts a markdown file (with
+             a ".mdown", ".md", or a ".markdown" extension) to HTML.
+dependencies:
+  barback: any
+  markdown: any
+
+transformers:
+- markdown_converter
diff --git a/pkg/barback/example/markdown_converter/web/images/bison.jpg b/pkg/barback/example/markdown_converter/web/images/bison.jpg
new file mode 100644
index 0000000..1a8c8b6
--- /dev/null
+++ b/pkg/barback/example/markdown_converter/web/images/bison.jpg
Binary files differ
diff --git a/pkg/barback/example/markdown_converter/web/index.markdown b/pkg/barback/example/markdown_converter/web/index.markdown
new file mode 100644
index 0000000..3bbe8bd
--- /dev/null
+++ b/pkg/barback/example/markdown_converter/web/index.markdown
@@ -0,0 +1,14 @@
+
+# First level header
+
+* one
+* two
+* three
+
+## Second level header
+
+1. apple
+2. banana
+3. pear
+
+<img src="images/bison.jpg" alt="The Google Bison" />
diff --git a/pkg/barback/example/markdown_converter/web/test2.md b/pkg/barback/example/markdown_converter/web/test2.md
new file mode 100644
index 0000000..452a24d
--- /dev/null
+++ b/pkg/barback/example/markdown_converter/web/test2.md
@@ -0,0 +1,7 @@
+
+# Another first level header 
+
+* _Italics_ 
+* `literal`
+* **bold**
+
diff --git a/pkg/barback/example/simple_transformer/README.md b/pkg/barback/example/simple_transformer/README.md
new file mode 100644
index 0000000..84325dd
--- /dev/null
+++ b/pkg/barback/example/simple_transformer/README.md
@@ -0,0 +1,4 @@
+This example shows how to write a simple pub transformer.
+
+For more information, see Writing a Pub Transformer:
+https://www.dartlang.org/tools/pub/transformers/
diff --git a/pkg/barback/example/simple_transformer/lib/transformer.dart b/pkg/barback/example/simple_transformer/lib/transformer.dart
new file mode 100644
index 0000000..881e06f
--- /dev/null
+++ b/pkg/barback/example/simple_transformer/lib/transformer.dart
@@ -0,0 +1,28 @@
+// 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.
+
+import 'package:barback/barback.dart';
+
+import 'dart:async';
+
+class InsertCopyright extends Transformer {
+  String copyright = "Copyright (c) 2014, the Example project authors.\n";
+
+  // A constructor named "asPlugin" is required. It can be empty, but
+  // it must be present. It is how pub determines that you want this
+  // class to be publicly available as a loadable transformer plugin.
+  InsertCopyright.asPlugin();
+
+  Future<bool> isPrimary(Asset input) {
+    return new Future.value(input.id.extension == '.txt');
+  }
+
+  Future apply(Transform transform) {
+    return transform.primaryInput.readAsString().then((content) {
+      var id = transform.primaryInput.id;
+      String newContent = copyright + content;
+      transform.addOutput(new Asset.fromString(id, newContent));
+    });
+  }
+}
diff --git a/pkg/barback/example/simple_transformer/pubspec.yaml b/pkg/barback/example/simple_transformer/pubspec.yaml
new file mode 100644
index 0000000..13f91e8
--- /dev/null
+++ b/pkg/barback/example/simple_transformer/pubspec.yaml
@@ -0,0 +1,9 @@
+name: simple_transformer
+description: This hello world example implements a simple
+             transformer that inserts a copyright string into
+             an input asset - a file that ends with ".txt".
+dependencies:
+  barback: any
+
+transformers:
+- simple_transformer
diff --git a/pkg/barback/example/simple_transformer/web/test.txt b/pkg/barback/example/simple_transformer/web/test.txt
new file mode 100644
index 0000000..5da849b
--- /dev/null
+++ b/pkg/barback/example/simple_transformer/web/test.txt
@@ -0,0 +1 @@
+ABC
diff --git a/pkg/barback/lib/src/base_transform.dart b/pkg/barback/lib/src/base_transform.dart
index c0de0f8..bb0183c 100644
--- a/pkg/barback/lib/src/base_transform.dart
+++ b/pkg/barback/lib/src/base_transform.dart
@@ -5,16 +5,10 @@
 library barback.base_transform;
 
 import 'dart:async';
-import 'dart:convert';
 
-import 'asset.dart';
-import 'asset_id.dart';
-import 'asset_node.dart';
-import 'errors.dart';
 import 'log.dart';
 import 'transform_logger.dart';
 import 'transform_node.dart';
-import 'utils.dart';
 
 /// The base class for the ephemeral transform objects that are passed to
 /// transformers.
@@ -47,29 +41,6 @@
   TransformLogger get logger => _logger;
   TransformLogger _logger;
 
-  /// Gets the primary input asset.
-  ///
-  /// While a transformation can use multiple input assets, one must be a
-  /// special "primary" asset. This will be the "entrypoint" or "main" input
-  /// file for a transformation.
-  ///
-  /// For example, with a dart2js transform, the primary input would be the
-  /// entrypoint Dart file. All of the other Dart files that that imports
-  /// would be secondary inputs.
-  ///
-  /// This method may fail at runtime with an [AssetNotFoundException] if called
-  /// asynchronously after the transform begins running. The primary input may
-  /// become unavailable while this transformer is running due to asset changes
-  /// earlier in the graph. You can ignore the error if this happens: the
-  /// transformer will be re-run automatically for you.
-  Asset get primaryInput {
-    if (_node.primary.state != AssetState.AVAILABLE) {
-      throw new AssetNotFoundException(_node.primary.id);
-    }
-
-    return _node.primary.asset;
-  }
-
   BaseTransform(this._node) {
     _logger = new TransformLogger((asset, level, message, span) {
       if (level == LogLevel.ERROR) _loggedError = true;
@@ -81,46 +52,6 @@
     });
   }
 
-  /// Gets the asset for an input [id].
-  ///
-  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
-  Future<Asset> getInput(AssetId id) => _node.getInput(id);
-
-  /// A convenience method to the contents of the input with [id] as a string.
-  ///
-  /// This is equivalent to calling [getInput] followed by [Asset.readAsString].
-  ///
-  /// If the asset was created from a [String] the original string is always
-  /// returned and [encoding] is ignored. Otherwise, the binary data of the
-  /// asset is decoded using [encoding], which defaults to [UTF8].
-  ///
-  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
-  Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
-    if (encoding == null) encoding = UTF8;
-    return getInput(id).then((input) => input.readAsString(encoding: encoding));
-  }
-
-  /// A convenience method to the contents of the input with [id].
-  ///
-  /// This is equivalent to calling [getInput] followed by [Asset.read].
-  ///
-  /// If the asset was created from a [String], this returns its UTF-8 encoding.
-  ///
-  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
-  Stream<List<int>> readInput(AssetId id) =>
-      futureStream(getInput(id).then((input) => input.read()));
-
-  /// A convenience method to return whether or not an asset exists.
-  ///
-  /// This is equivalent to calling [getInput] and catching an
-  /// [AssetNotFoundException].
-  Future<bool> hasInput(AssetId id) {
-    return getInput(id).then((_) => true).catchError((error) {
-      if (error is AssetNotFoundException && error.id == id) return false;
-      throw error;
-    });
-  }
-
   /// Consume the primary input so that it doesn't get processed by future
   /// phases or emitted once processing has finished.
   ///
diff --git a/pkg/barback/lib/src/declaring_transform.dart b/pkg/barback/lib/src/declaring_transform.dart
index 3f6ecbd..2f8a8bf 100644
--- a/pkg/barback/lib/src/declaring_transform.dart
+++ b/pkg/barback/lib/src/declaring_transform.dart
@@ -14,8 +14,11 @@
 class DeclaringTransform extends BaseTransform {
   final _outputIds = new Set<AssetId>();
 
+  final AssetId primaryId;
+
   DeclaringTransform._(TransformNode node)
-    : super(node);
+      : primaryId = node.primary.id,
+        super(node);
 
   /// Stores [id] as the id of an output that will be created by this
   /// transformation when it's run.
diff --git a/pkg/barback/lib/src/declaring_transformer.dart b/pkg/barback/lib/src/declaring_transformer.dart
index 14a9c4e..a784493 100644
--- a/pkg/barback/lib/src/declaring_transformer.dart
+++ b/pkg/barback/lib/src/declaring_transformer.dart
@@ -14,11 +14,12 @@
 /// If a transformer implements this interface, that allows barback to perform
 /// optimizations to make the asset graph work more smoothly.
 abstract class DeclaringTransformer {
-  /// Declare which assets would be emitted for the primary input specified by
-  /// [transform].
+  /// Declare which assets would be emitted for the primary input id specified
+  /// by [transform].
   ///
-  /// For the most part, this works like [Transformer.apply]. The difference is
-  /// that instead of emitting [Asset]s, it just emits [AssetId]s through
-  /// [transform.addOutputId].
+  /// This works a little like [Transformer.apply], with two main differences.
+  /// First, instead of having access to the primary input's contents, it only
+  /// has access to its id. Second, instead of emitting [Asset]s, it just emits
+  /// [AssetId]s through [transform.addOutputId].
   Future declareOutputs(DeclaringTransform transform);
 }
diff --git a/pkg/barback/lib/src/transform.dart b/pkg/barback/lib/src/transform.dart
index 1695388..25c260a 100644
--- a/pkg/barback/lib/src/transform.dart
+++ b/pkg/barback/lib/src/transform.dart
@@ -4,10 +4,16 @@
 
 library barback.transform;
 
+import 'dart:async';
+import 'dart:convert';
+
 import 'asset.dart';
+import 'asset_id.dart';
 import 'asset_set.dart';
 import 'base_transform.dart';
+import 'errors.dart';
 import 'transform_node.dart';
+import 'utils.dart';
 
 /// While a [Transformer] represents a *kind* of transformation, this defines
 /// one specific usage of it on a set of files.
@@ -17,10 +23,76 @@
 /// the transformation. It lets the [Transformer] access inputs and generate
 /// outputs.
 class Transform extends BaseTransform {
+  final TransformNode _node;
+
   final _outputs = new AssetSet();
 
+  /// Gets the primary input asset.
+  ///
+  /// While a transformation can use multiple input assets, one must be a
+  /// special "primary" asset. This will be the "entrypoint" or "main" input
+  /// file for a transformation.
+  ///
+  /// For example, with a dart2js transform, the primary input would be the
+  /// entrypoint Dart file. All of the other Dart files that that imports
+  /// would be secondary inputs.
+  ///
+  /// This method may fail at runtime with an [AssetNotFoundException] if called
+  /// asynchronously after the transform begins running. The primary input may
+  /// become unavailable while this transformer is running due to asset changes
+  /// earlier in the graph. You can ignore the error if this happens: the
+  /// transformer will be re-run automatically for you.
+  Asset get primaryInput {
+    if (!_node.primary.state.isAvailable) {
+      throw new AssetNotFoundException(_node.primary.id);
+    }
+
+    return _node.primary.asset;
+  }
+
   Transform._(TransformNode node)
-    : super(node);
+    : _node = node,
+      super(node);
+
+  /// Gets the asset for an input [id].
+  ///
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
+  Future<Asset> getInput(AssetId id) => _node.getInput(id);
+
+  /// A convenience method to the contents of the input with [id] as a string.
+  ///
+  /// This is equivalent to calling [getInput] followed by [Asset.readAsString].
+  ///
+  /// If the asset was created from a [String] the original string is always
+  /// returned and [encoding] is ignored. Otherwise, the binary data of the
+  /// asset is decoded using [encoding], which defaults to [UTF8].
+  ///
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
+  Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
+    if (encoding == null) encoding = UTF8;
+    return getInput(id).then((input) => input.readAsString(encoding: encoding));
+  }
+
+  /// A convenience method to the contents of the input with [id].
+  ///
+  /// This is equivalent to calling [getInput] followed by [Asset.read].
+  ///
+  /// If the asset was created from a [String], this returns its UTF-8 encoding.
+  ///
+  /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
+  Stream<List<int>> readInput(AssetId id) =>
+      futureStream(getInput(id).then((input) => input.read()));
+
+  /// A convenience method to return whether or not an asset exists.
+  ///
+  /// This is equivalent to calling [getInput] and catching an
+  /// [AssetNotFoundException].
+  Future<bool> hasInput(AssetId id) {
+    return getInput(id).then((_) => true).catchError((error) {
+      if (error is AssetNotFoundException && error.id == id) return false;
+      throw error;
+    });
+  }
 
   /// Stores [output] as the output created by this transformation.
   ///
diff --git a/pkg/barback/lib/src/transform_node.dart b/pkg/barback/lib/src/transform_node.dart
index e31d5e8..5402849 100644
--- a/pkg/barback/lib/src/transform_node.dart
+++ b/pkg/barback/lib/src/transform_node.dart
@@ -44,7 +44,7 @@
   StreamSubscription<AssetNode> _phaseSubscription;
 
   /// Whether [this] is dirty and still has more processing to do.
-  bool get isDirty => !_state.isDone;
+  bool get isDirty => _state != _State.NOT_PRIMARY && _state != _State.APPLIED;
 
   /// Whether [transformer] is lazy and this transform has yet to be forced.
   bool _isLazy;
@@ -90,7 +90,7 @@
   final _onLogPool = new StreamPool<LogEntry>.broadcast();
 
   /// The current state of [this].
-  var _state = _TransformNodeState.PROCESSING;
+  var _state = _State.COMPUTING_IS_PRIMARY;
 
   /// Whether [this] has been marked as removed.
   bool get _isRemoved => _onAssetController.isClosed;
@@ -99,7 +99,7 @@
   /// consumes the primary input.
   ///
   /// Defaults to `false`. This is not meaningful unless [_state] is
-  /// [_TransformNodeState.APPLIED].
+  /// [_State.APPLIED].
   bool _consumePrimary = false;
 
   TransformNode(this.phase, Transformer transformer, this.primary,
@@ -110,15 +110,34 @@
       if (state.isRemoved) {
         remove();
       } else {
-        _dirty(primaryChanged: true);
+        _dirty();
       }
     });
 
     _phaseSubscription = phase.previous.onAsset.listen((node) {
-      if (_missingInputs.contains(node.id)) _dirty(primaryChanged: false);
+      if (_missingInputs.contains(node.id)) _dirty();
     });
 
-    _process();
+    syncFuture(() => transformer.isPrimary(primary.id))
+        .catchError((error, stackTrace) {
+      if (_isRemoved) return false;
+
+      // Catch all transformer errors and pipe them to the results stream. This
+      // is so a broken transformer doesn't take down the whole graph.
+      phase.cascade.reportError(_wrapException(error, stackTrace));
+
+      return false;
+    }).then((isPrimary) {
+      if (_isRemoved) return;
+      if (isPrimary) {
+        _apply();
+        return;
+      }
+
+      _emitPassThrough();
+      _state = _State.NOT_PRIMARY;
+      _onDoneController.add(null);
+    });
   }
 
   /// The [TransformInfo] describing this node.
@@ -153,90 +172,51 @@
     // transform's outputs have gone unused, we switch it back to lazy mode.
     if (!_isLazy) return;
     _isLazy = false;
-    _dirty(primaryChanged: false);
+    _dirty();
   }
 
   /// Marks this transform as dirty.
   ///
   /// This causes all of the transform's outputs to be marked as dirty as well.
-  /// [primaryChanged] should be true if and only if [this] was set dirty
-  /// because [primary] changed.
-  void _dirty({bool primaryChanged: false}) {
-    if (!primaryChanged && _state.isNotPrimary) return;
+  void _dirty() {
+    if (_state == _State.COMPUTING_IS_PRIMARY) return;
+    if (_state == _State.NOT_PRIMARY) {
+      _emitPassThrough();
+      return;
+    }
 
     if (_passThroughController != null) _passThroughController.setDirty();
     for (var controller in _outputControllers.values) {
       controller.setDirty();
     }
 
-    if (_state.isDone) {
-      if (primaryChanged) {
-        _process();
-      } else {
-        _apply();
-      }
-    } else if (primaryChanged) {
-      _state = _TransformNodeState.NEEDS_IS_PRIMARY;
-    } else if (!_state.needsIsPrimary) {
-      _state = _TransformNodeState.NEEDS_APPLY;
+    if (_state == _State.APPLIED) {
+      _apply();
+    } else {
+      _state = _State.NEEDS_APPLY;
     }
   }
 
-  /// Determines whether [primary] is primary for [transformer], and if so runs
-  /// [transformer.apply].
-  void _process() {
-    // Clear all the old input subscriptions. If an input is re-used, we'll
-    // re-subscribe.
-    _clearInputSubscriptions();
-    _state = _TransformNodeState.PROCESSING;
-    primary.whenAvailable((_) {
-      _state = _TransformNodeState.PROCESSING;
-      return transformer.isPrimary(primary.asset);
-    }).catchError((error, stackTrace) {
-      // If the transform became dirty while processing, ignore any errors from
-      // it.
-      if (_state.needsIsPrimary || _isRemoved) return false;
-
-      // Catch all transformer errors and pipe them to the results stream. This
-      // is so a broken transformer doesn't take down the whole graph.
-      phase.cascade.reportError(_wrapException(error, stackTrace));
-
-      return false;
-    }).then((isPrimary) {
-      if (_isRemoved) return;
-      if (_state.needsIsPrimary) {
-        _process();
-      } else if (isPrimary) {
-        _apply();
-      } else {
-        _clearOutputs();
-        _emitPassThrough();
-        _state = _TransformNodeState.NOT_PRIMARY;
-        _onDoneController.add(null);
-      }
-    });
-  }
-
   /// Applies this transform.
   void _apply() {
-    assert(!_onAssetController.isClosed);
+    assert(!_isRemoved);
 
     // Clear input subscriptions here as well as in [_process] because [_apply]
     // may be restarted independently if only a secondary input changes.
     _clearInputSubscriptions();
-    _state = _TransformNodeState.PROCESSING;
+    _state = _State.APPLYING;
     primary.whenAvailable((_) {
-      if (_state.needsIsPrimary) return null;
-      _state = _TransformNodeState.PROCESSING;
+      if (_isRemoved) return null;
+      _state = _State.APPLYING;
       // TODO(nweiz): If [transformer] is a [DeclaringTransformer] but not a
-      // [LazyTransformer], we can get some mileage out of doing a declarative
+      // [LazyTransformer], we can get some mileage out of doing a declaration
       // first so we know how to hook up the assets.
       if (_isLazy) return _declareLazy();
       return _applyImmediate();
     }).catchError((error, stackTrace) {
       // If the transform became dirty while processing, ignore any errors from
       // it.
-      if (!_state.isProcessing || _isRemoved) return false;
+      if (_state == _State.NEEDS_APPLY || _isRemoved) return false;
 
       // Catch all transformer errors and pipe them to the results stream. This
       // is so a broken transformer doesn't take down the whole graph.
@@ -245,20 +225,19 @@
     }).then((hadError) {
       if (_isRemoved) return;
 
-      if (_state.needsIsPrimary) {
-        _process();
-      } else if (_state.needsApply) {
+      if (_state == _State.NEEDS_APPLY) {
         _apply();
-      } else {
-        assert(_state.isProcessing);
-        if (hadError) {
-          _clearOutputs();
-          _dontEmitPassThrough();
-        }
-
-        _state = _TransformNodeState.APPLIED;
-        _onDoneController.add(null);
+        return;
       }
+
+      assert(_state == _State.APPLYING);
+      if (hadError) {
+        _clearOutputs();
+        _dontEmitPassThrough();
+      }
+
+      _state = _State.APPLIED;
+      _onDoneController.add(null);
     });
   }
 
@@ -276,7 +255,7 @@
       }
 
       _inputSubscriptions.putIfAbsent(node.id, () {
-        return node.onStateChange.listen((_) => _dirty(primaryChanged: false));
+        return node.onStateChange.listen((_) => _dirty());
       });
 
       return node.asset;
@@ -294,7 +273,7 @@
     return syncFuture(() {
       return transformer.apply(transformController.transform);
     }).then((_) {
-      if (!_state.isProcessing || _onAssetController.isClosed) return false;
+      if (_state == _State.NEEDS_APPLY || _isRemoved) return false;
       if (transformController.loggedError) return true;
 
       _consumePrimary = transformController.consumePrimary;
@@ -352,7 +331,7 @@
       return (transformer as LazyTransformer)
           .declareOutputs(transformController.transform);
     }).then((_) {
-      if (!_state.isProcessing || _onAssetController.isClosed) return false;
+      if (_state == _State.NEEDS_APPLY || _isRemoved) return false;
       if (transformController.loggedError) return true;
 
       _consumePrimary = transformController.consumePrimary;
@@ -421,7 +400,9 @@
     if (_passThroughController == null) {
       _passThroughController = new AssetNodeController.from(primary);
       _onAssetController.add(_passThroughController.node);
-    } else {
+    } else if (primary.state.isDirty) {
+      _passThroughController.setDirty();
+    } else if (!_passThroughController.node.state.isAvailable) {
       _passThroughController.setAvailable(primary.asset);
     }
   }
@@ -446,70 +427,43 @@
 }
 
 /// The enum of states that [TransformNode] can be in.
-class _TransformNodeState {
-  /// The transform node is running [Transformer.isPrimary] or
-  /// [Transformer.apply] and doesn't need to re-run them.
+class _State {
+  /// The transform is running [Transformer.isPrimary].
   ///
-  /// If there are no external changes by the time the processing finishes, this
-  /// will transition to [APPLIED] or [NOT_PRIMARY] depending on the result of
-  /// [Transformer.isPrimary]. If the primary input changes, this will
-  /// transition to [NEEDS_IS_PRIMARY]. If a secondary input changes, this will
-  /// transition to [NEEDS_APPLY].
-  static final PROCESSING = const _TransformNodeState._("processing");
+  /// This is the initial state of the transformer. Once [Transformer.isPrimary]
+  /// finishes running, this will transition to [APPLYING] if the input is
+  /// primary, or [NOT_PRIMARY] if it's not.
+  static final COMPUTING_IS_PRIMARY = const _State._("computing isPrimary");
 
-  /// The transform is running [Transformer.isPrimary] or [Transformer.apply],
-  /// but since it started the primary input changed, so it will need to re-run
-  /// [Transformer.isPrimary].
+  /// The transform is running [Transformer.apply].
   ///
-  /// This will always transition to [Transformer.PROCESSING].
-  static final NEEDS_IS_PRIMARY =
-    const _TransformNodeState._("needs isPrimary");
+  /// If an input changes while in this state, it will transition to
+  /// [NEEDS_APPLY]. If the [TransformNode] is still in this state when
+  /// [Transformer.apply] finishes running, it will transition to [APPLIED].
+  static final APPLYING = const _State._("applying");
 
-  /// The transform is running [Transformer.apply], but since it started a
-  /// secondary input changed, so it will need to re-run [Transformer.apply].
+  /// The transform is running [Transformer.apply], but an input changed after
+  /// it started, so it will need to re-run [Transformer.apply].
   ///
-  /// If there are no external changes by the time [Transformer.apply] finishes,
-  /// this will transition to [PROCESSING]. If the primary input changes, this
-  /// will transition to [NEEDS_IS_PRIMARY].
-  static final NEEDS_APPLY = const _TransformNodeState._("needs apply");
+  /// This will transition to [APPLYING] once [Transformer.apply] finishes
+  /// running.
+  static final NEEDS_APPLY = const _State._("needs apply");
 
   /// The transform has finished running [Transformer.apply], whether or not it
   /// emitted an error.
   ///
-  /// If the primary input or a secondary input changes, this will transition to
-  /// [PROCESSING].
-  static final APPLIED = const _TransformNodeState._("applied");
+  /// If an input changes, this will transition to [APPLYING].
+  static final APPLIED = const _State._("applied");
 
   /// The transform has finished running [Transformer.isPrimary], which returned
   /// `false`.
   ///
-  /// If the primary input changes, this will transition to [PROCESSING].
-  static final NOT_PRIMARY = const _TransformNodeState._("not primary");
-
-  /// Whether [this] is [PROCESSING].
-  bool get isProcessing => this == _TransformNodeState.PROCESSING;
-
-  /// Whether [this] is [NEEDS_IS_PRIMARY].
-  bool get needsIsPrimary => this == _TransformNodeState.NEEDS_IS_PRIMARY;
-
-  /// Whether [this] is [NEEDS_APPLY].
-  bool get needsApply => this == _TransformNodeState.NEEDS_APPLY;
-
-  /// Whether [this] is [APPLIED].
-  bool get isApplied => this == _TransformNodeState.APPLIED;
-
-  /// Whether [this] is [NOT_PRIMARY].
-  bool get isNotPrimary => this == _TransformNodeState.NOT_PRIMARY;
-
-  /// Whether the transform has finished running [Transformer.isPrimary] and
-  /// [Transformer.apply].
-  ///
-  /// Specifically, whether [this] is [APPLIED] or [NOT_PRIMARY].
-  bool get isDone => isApplied || isNotPrimary;
+  /// This will never transition to another state.
+  static final NOT_PRIMARY = const _State._("not primary");
 
   final String name;
 
-  const _TransformNodeState._(this.name);
+  const _State._(this.name);
 
   String toString() => name;
 }
diff --git a/pkg/barback/lib/src/transformer.dart b/pkg/barback/lib/src/transformer.dart
index 83e2e2b..2b9499a 100644
--- a/pkg/barback/lib/src/transformer.dart
+++ b/pkg/barback/lib/src/transformer.dart
@@ -6,7 +6,7 @@
 
 import 'dart:async';
 
-import 'asset.dart';
+import 'asset_id.dart';
 import 'transform.dart';
 import 'utils.dart';
 
@@ -43,7 +43,7 @@
         '${pluralize("doesn't", invalidExtensions.length, plural: "don't")}.');
   }
 
-  /// Returns `true` if [input] can be a primary input for this transformer.
+  /// Returns `true` if [id] can be a primary input for this transformer.
   ///
   /// While a transformer can read from multiple input files, one must be the
   /// "primary" input. This asset determines whether the transformation should
@@ -59,12 +59,12 @@
   /// If this is not overridden, defaults to allow any asset whose extension
   /// matches one of the ones returned by [allowedExtensions]. If *that* is
   /// not overridden, allows all assets.
-  Future<bool> isPrimary(Asset input) {
+  Future<bool> isPrimary(AssetId id) {
     // Allow all files if [primaryExtensions] is not overridden.
     if (allowedExtensions == null) return new Future.value(true);
 
     for (var extension in allowedExtensions.split(" ")) {
-      if (input.id.path.endsWith(extension)) return new Future.value(true);
+      if (id.path.endsWith(extension)) return new Future.value(true);
     }
 
     return new Future.value(false);
diff --git a/pkg/barback/pubspec.yaml b/pkg/barback/pubspec.yaml
index 42c5443..1776f83 100644
--- a/pkg/barback/pubspec.yaml
+++ b/pkg/barback/pubspec.yaml
@@ -8,7 +8,7 @@
 # When the minor version of this is upgraded, you *must* update that version
 # number in pub to stay in sync with this. New patch versions are considered
 # backwards compatible, and pub will allow later patch versions automatically.
-version: 0.12.0-dev
+version: 0.13.1-dev
 
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
diff --git a/pkg/barback/test/package_graph/transform/concurrency_test.dart b/pkg/barback/test/package_graph/transform/concurrency_test.dart
index 41e3047..3dd2da2 100644
--- a/pkg/barback/test/package_graph/transform/concurrency_test.dart
+++ b/pkg/barback/test/package_graph/transform/concurrency_test.dart
@@ -490,4 +490,19 @@
     expectAsset("app|bar.out", "foo.in");
     buildShouldSucceed();
   });
+
+  test("materializes a passed-through asset that was emitted before it was "
+      "available", () {
+    initGraph(["app|foo.in"], {"app": [
+      [new RewriteTransformer("txt", "txt")]
+    ]});
+
+    pauseProvider();
+    updateSources(["app|foo.in"]);
+    expectAssetDoesNotComplete("app|foo.in");
+
+    resumeProvider();
+    expectAsset("app|foo.in", "foo");
+    buildShouldSucceed();
+  });
 }
diff --git a/pkg/barback/test/package_graph/transform/pass_through_test.dart b/pkg/barback/test/package_graph/transform/pass_through_test.dart
index eb90418..1e5f4b3 100644
--- a/pkg/barback/test/package_graph/transform/pass_through_test.dart
+++ b/pkg/barback/test/package_graph/transform/pass_through_test.dart
@@ -252,22 +252,4 @@
     expectAsset("app|foo.txt", "bar.in");
     buildShouldSucceed();
   });
-
-  test("doesn't return an overwritten asset until we know it will still "
-      "be overwritten", () {
-    var rewrite = new RewriteTransformer("txt", "txt");
-    initGraph(["app|foo.txt"], {"app": [[rewrite]]});
-
-    updateSources(["app|foo.txt"]);
-    expectAsset("app|foo.txt", "foo.txt");
-    buildShouldSucceed();
-
-    rewrite.pauseIsPrimary("app|foo.txt");
-    updateSources(["app|foo.txt"]);
-    expectAssetDoesNotComplete("app|foo.txt");
-
-    rewrite.resumeIsPrimary("app|foo.txt");
-    expectAsset("app|foo.txt", "foo.txt");
-    buildShouldSucceed();
-  });
 }
\ No newline at end of file
diff --git a/pkg/barback/test/transformer/bad.dart b/pkg/barback/test/transformer/bad.dart
index 49046ca..a1e99cd 100644
--- a/pkg/barback/test/transformer/bad.dart
+++ b/pkg/barback/test/transformer/bad.dart
@@ -22,7 +22,7 @@
 
   BadTransformer(this.outputs);
 
-  Future<bool> doIsPrimary(Asset asset) => new Future.value(true);
+  Future<bool> doIsPrimary(AssetId id) => new Future.value(true);
 
   Future doApply(Transform transform) {
     return newFuture(() {
diff --git a/pkg/barback/test/transformer/bad_log.dart b/pkg/barback/test/transformer/bad_log.dart
index 9e49f8b..5d77b93 100644
--- a/pkg/barback/test/transformer/bad_log.dart
+++ b/pkg/barback/test/transformer/bad_log.dart
@@ -19,7 +19,7 @@
 
   BadLogTransformer(this.outputs);
 
-  Future<bool> doIsPrimary(Asset asset) => new Future.value(true);
+  Future<bool> doIsPrimary(AssetId id) => new Future.value(true);
 
   Future doApply(Transform transform) {
     return newFuture(() {
diff --git a/pkg/barback/test/transformer/catch_asset_not_found.dart b/pkg/barback/test/transformer/catch_asset_not_found.dart
index 2e4e24b..ee5371d 100644
--- a/pkg/barback/test/transformer/catch_asset_not_found.dart
+++ b/pkg/barback/test/transformer/catch_asset_not_found.dart
@@ -23,8 +23,8 @@
   CatchAssetNotFoundTransformer(this.extension, String input)
       : input = new AssetId.parse(input);
 
-  Future<bool> doIsPrimary(Asset asset) =>
-      new Future.value(asset.id.extension == extension);
+  Future<bool> doIsPrimary(AssetId id) =>
+      new Future.value(id.extension == extension);
 
   Future doApply(Transform transform) {
     return transform.getInput(input).then((_) {
diff --git a/pkg/barback/test/transformer/check_content.dart b/pkg/barback/test/transformer/check_content.dart
index 445e86f..0696c72 100644
--- a/pkg/barback/test/transformer/check_content.dart
+++ b/pkg/barback/test/transformer/check_content.dart
@@ -17,12 +17,13 @@
 
   CheckContentTransformer(this.content, this.addition);
 
-  Future<bool> doIsPrimary(Asset asset) =>
-    asset.readAsString().then((value) => value.contains(content));
+  Future<bool> doIsPrimary(AssetId id) => new Future.value(true);
 
   Future doApply(Transform transform) {
     return getPrimary(transform).then((primary) {
       return primary.readAsString().then((value) {
+        if (!value.contains(content)) return;
+
         transform.addOutput(
             new Asset.fromString(primary.id, "$value$addition"));
       });
diff --git a/pkg/barback/test/transformer/check_content_and_rename.dart b/pkg/barback/test/transformer/check_content_and_rename.dart
index a923911..9fcdebb 100644
--- a/pkg/barback/test/transformer/check_content_and_rename.dart
+++ b/pkg/barback/test/transformer/check_content_and_rename.dart
@@ -21,15 +21,17 @@
   CheckContentAndRenameTransformer(this.oldExtension, this.oldContent,
       this.newExtension, this.newContent);
 
-  Future<bool> doIsPrimary(Asset asset) {
-    if (asset.id.extension != '.$oldExtension') return new Future.value(false);
-    return asset.readAsString().then((value) => value == oldContent);
-  }
+  Future<bool> doIsPrimary(AssetId id) =>
+      new Future.value(id.extension != '.$oldExtension');
 
   Future doApply(Transform transform) {
     return getPrimary(transform).then((input) {
-      transform.addOutput(new Asset.fromString(
-          input.id.changeExtension('.$newExtension'), newContent));
+      return input.readAsString().then((contents) {
+        if (contents != oldContent) return;
+
+        transform.addOutput(new Asset.fromString(
+            input.id.changeExtension('.$newExtension'), newContent));
+      });
     });
   }
 }
diff --git a/pkg/barback/test/transformer/create_asset.dart b/pkg/barback/test/transformer/create_asset.dart
index 9e89516..5db8940 100644
--- a/pkg/barback/test/transformer/create_asset.dart
+++ b/pkg/barback/test/transformer/create_asset.dart
@@ -17,7 +17,7 @@
 
   CreateAssetTransformer(this.output);
 
-  Future<bool> doIsPrimary(Asset asset) => new Future.value(true);
+  Future<bool> doIsPrimary(_) => new Future.value(true);
 
   Future doApply(Transform transform) {
     return newFuture(() {
diff --git a/pkg/barback/test/transformer/emit_nothing.dart b/pkg/barback/test/transformer/emit_nothing.dart
index d68fecd..a414cb8 100644
--- a/pkg/barback/test/transformer/emit_nothing.dart
+++ b/pkg/barback/test/transformer/emit_nothing.dart
@@ -16,8 +16,8 @@
 
   EmitNothingTransformer(this.extension);
 
-  Future<bool> doIsPrimary(Asset asset) =>
-    new Future.value(asset.id.extension == ".$extension");
+  Future<bool> doIsPrimary(AssetId id) =>
+    new Future.value(id.extension == ".$extension");
 
   Future doApply(Transform transform) => new Future.value();
 
diff --git a/pkg/barback/test/transformer/has_input.dart b/pkg/barback/test/transformer/has_input.dart
index add3017..9805f70 100644
--- a/pkg/barback/test/transformer/has_input.dart
+++ b/pkg/barback/test/transformer/has_input.dart
@@ -19,7 +19,7 @@
   HasInputTransformer(Iterable<String> inputs)
       : inputs = inputs.map((input) => new AssetId.parse(input)).toList();
 
-  Future<bool> doIsPrimary(Asset asset) => new Future.value(true);
+  Future<bool> doIsPrimary(_) => new Future.value(true);
 
   Future doApply(Transform transform) {
     return Future.wait(inputs.map((input) {
diff --git a/pkg/barback/test/transformer/lazy_bad.dart b/pkg/barback/test/transformer/lazy_bad.dart
index 4bd07fd..16d0b77 100644
--- a/pkg/barback/test/transformer/lazy_bad.dart
+++ b/pkg/barback/test/transformer/lazy_bad.dart
@@ -21,7 +21,7 @@
 
   LazyBadTransformer(this.output);
 
-  Future<bool> doIsPrimary(Asset asset) => new Future.value(true);
+  Future<bool> doIsPrimary(_) => new Future.value(true);
 
   Future doApply(Transform transform) {
     return newFuture(() {
diff --git a/pkg/barback/test/transformer/lazy_many_to_one.dart b/pkg/barback/test/transformer/lazy_many_to_one.dart
index 7e1b114..dcdc0b1 100644
--- a/pkg/barback/test/transformer/lazy_many_to_one.dart
+++ b/pkg/barback/test/transformer/lazy_many_to_one.dart
@@ -18,6 +18,6 @@
       : super(extension);
 
   Future declareOutputs(DeclaringTransform transform) {
-    transform.declareOutput(transform.primaryInput.id.changeExtension(".out"));
+    transform.declareOutput(transform.primaryId.changeExtension(".out"));
   }
 }
diff --git a/pkg/barback/test/transformer/lazy_rewrite.dart b/pkg/barback/test/transformer/lazy_rewrite.dart
index f694a0e..1a36778 100644
--- a/pkg/barback/test/transformer/lazy_rewrite.dart
+++ b/pkg/barback/test/transformer/lazy_rewrite.dart
@@ -20,7 +20,7 @@
   Future declareOutputs(DeclaringTransform transform) {
     if (consumePrimary) transform.consumePrimary();
     for (var extension in to.split(" ")) {
-      var id = transform.primaryInput.id.changeExtension(".$extension");
+      var id = transform.primaryId.changeExtension(".$extension");
       transform.declareOutput(id);
     }
   }
diff --git a/pkg/barback/test/transformer/log.dart b/pkg/barback/test/transformer/log.dart
index cfbad8d..7866722 100644
--- a/pkg/barback/test/transformer/log.dart
+++ b/pkg/barback/test/transformer/log.dart
@@ -22,7 +22,7 @@
 
   LogTransformer(this._entries);
 
-  Future<bool> doIsPrimary(Asset asset) => new Future.value(true);
+  Future<bool> doIsPrimary(_) => new Future.value(true);
 
   Future doApply(Transform transform) {
     return newFuture(() {
diff --git a/pkg/barback/test/transformer/many_to_one.dart b/pkg/barback/test/transformer/many_to_one.dart
index ab56202..6806bfe 100644
--- a/pkg/barback/test/transformer/many_to_one.dart
+++ b/pkg/barback/test/transformer/many_to_one.dart
@@ -23,8 +23,8 @@
   /// files at each of those paths.
   ManyToOneTransformer(this.extension);
 
-  Future<bool> doIsPrimary(Asset asset) =>
-    new Future.value(asset.id.extension == ".$extension");
+  Future<bool> doIsPrimary(AssetId id) =>
+    new Future.value(id.extension == ".$extension");
 
   Future doApply(Transform transform) {
     return getPrimary(transform)
diff --git a/pkg/barback/test/transformer/mock.dart b/pkg/barback/test/transformer/mock.dart
index 413b5b0..531f9e4 100644
--- a/pkg/barback/test/transformer/mock.dart
+++ b/pkg/barback/test/transformer/mock.dart
@@ -166,11 +166,11 @@
     }).then((_) => transform.primaryInput);
   }
 
-  Future<bool> isPrimary(Asset asset) {
-    return newFuture(() => doIsPrimary(asset)).then((result) {
+  Future<bool> isPrimary(AssetId id) {
+    return newFuture(() => doIsPrimary(id)).then((result) {
       return newFuture(() {
-        if (_isPrimary.containsKey(asset.id)) {
-          return _isPrimary[asset.id].future;
+        if (_isPrimary.containsKey(id)) {
+          return _isPrimary[id].future;
         }
       }).then((_) => result);
     });
@@ -190,7 +190,7 @@
   }
 
   /// The wrapped version of [isPrimary] for subclasses to override.
-  Future<bool> doIsPrimary(Asset asset);
+  Future<bool> doIsPrimary(AssetId id);
 
   /// The wrapped version of [doApply] for subclasses to override.
   Future doApply(Transform transform);
diff --git a/pkg/barback/test/transformer/one_to_many.dart b/pkg/barback/test/transformer/one_to_many.dart
index b3b2f5e..0ad527a 100644
--- a/pkg/barback/test/transformer/one_to_many.dart
+++ b/pkg/barback/test/transformer/one_to_many.dart
@@ -21,8 +21,8 @@
   /// files at each of those paths.
   OneToManyTransformer(this.extension);
 
-  Future<bool> doIsPrimary(Asset asset) =>
-    new Future.value(asset.id.extension == ".$extension");
+  Future<bool> doIsPrimary(AssetId id) =>
+    new Future.value(id.extension == ".$extension");
 
   Future doApply(Transform transform) {
     return getPrimary(transform)
diff --git a/pkg/barback/test/transformer/rewrite.dart b/pkg/barback/test/transformer/rewrite.dart
index 6525b07..995c94f 100644
--- a/pkg/barback/test/transformer/rewrite.dart
+++ b/pkg/barback/test/transformer/rewrite.dart
@@ -25,8 +25,8 @@
   /// created for each input.
   RewriteTransformer(this.from, this.to);
 
-  Future<bool> doIsPrimary(Asset asset) =>
-    new Future.value(asset.id.extension == ".$from");
+  Future<bool> doIsPrimary(AssetId id) =>
+      new Future.value(id.extension == ".$from");
 
   Future doApply(Transform transform) {
     return getPrimary(transform).then((input) {
diff --git a/pkg/barback/test/transformer_test.dart b/pkg/barback/test/transformer_test.dart
index 902e140..3eb83a1 100644
--- a/pkg/barback/test/transformer_test.dart
+++ b/pkg/barback/test/transformer_test.dart
@@ -17,23 +17,25 @@
   group("isPrimary", () {
     test("defaults to allowedExtensions", () {
       var transformer = new ExtensionTransformer(".txt .bin");
-      expect(transformer.isPrimary(makeAsset("foo.txt")),
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.txt")),
           completion(isTrue));
 
-      expect(transformer.isPrimary(makeAsset("foo.bin")),
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.bin")),
           completion(isTrue));
 
-      expect(transformer.isPrimary(makeAsset("foo.nottxt")),
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.nottxt")),
           completion(isFalse));
     });
 
     test("supports multi-level extensions with allowedExtensions", () {
       var transformer = new ExtensionTransformer(".dart.js");
-      expect(transformer.isPrimary(makeAsset("foo.dart.js")),
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.dart.js")),
           completion(isTrue));
 
-      expect(transformer.isPrimary(makeAsset("foo.js")), completion(isFalse));
-      expect(transformer.isPrimary(makeAsset("foo.dart")), completion(isFalse));
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.js")),
+          completion(isFalse));
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.dart")),
+          completion(isFalse));
     });
 
     test("throws an error for extensions without periods", () {
@@ -42,21 +44,18 @@
 
     test("allows all files if allowedExtensions is not overridden", () {
       var transformer = new MockTransformer();
-      expect(transformer.isPrimary(makeAsset("foo.txt")),
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.txt")),
           completion(isTrue));
 
-      expect(transformer.isPrimary(makeAsset("foo.bin")),
+      expect(transformer.isPrimary(new AssetId("pkg", "foo.bin")),
           completion(isTrue));
 
-      expect(transformer.isPrimary(makeAsset("anything")),
+      expect(transformer.isPrimary(new AssetId("pkg", "anything")),
           completion(isTrue));
     });
   });
 }
 
-Asset makeAsset(String path) =>
-    new Asset.fromString(new AssetId.parse("app|$path"), "");
-
 class MockTransformer extends Transformer {
   MockTransformer();
 
diff --git a/pkg/code_transformers/lib/assets.dart b/pkg/code_transformers/lib/assets.dart
index 8fabaf6..4bafc26 100644
--- a/pkg/code_transformers/lib/assets.dart
+++ b/pkg/code_transformers/lib/assets.dart
@@ -11,10 +11,18 @@
 import 'package:path/path.dart' as path;
 import 'package:source_maps/span.dart' show Span;
 
-/// Create an [AssetId] for a [url] seen in the [source] asset. By default this
-/// is used to resolve relative urls that occur in HTML assets, including
-/// cross-package urls of the form "packages/foo/bar.html". Dart "package:"
-/// urls are not resolved unless [source] is Dart file (has a .dart extension).
+/// Create an [AssetId] for a [url] seen in the [source] asset.
+///
+/// By default this is used to resolve relative urls that occur in HTML assets,
+/// including cross-package urls of the form "packages/foo/bar.html". Dart
+/// "package:" urls are not resolved unless [source] is Dart file (has a .dart
+/// extension).
+///
+/// This function returns null if [url] can't be resolved. We log a warning
+/// message in [logger] if we know the reason why resolution failed. This
+/// happens, for example, when using incorrect paths to reach into another
+/// package, or when [errorsOnAbsolute] is true and the url seems to be
+/// absolute.
 // TODO(sigmund): delete once this is part of barback (dartbug.com/12610)
 AssetId uriToAssetId(AssetId source, String url, TransformLogger logger,
     Span span, {bool errorOnAbsolute: true}) {
@@ -31,7 +39,7 @@
     }
 
     if (errorOnAbsolute) {
-      logger.error('absolute paths not allowed: "$url"', span: span);
+      logger.warning('absolute paths not allowed: "$url"', span: span);
     }
     return null;
   }
@@ -71,7 +79,7 @@
       fixedSegments.addAll(sourceSegments.map((_) => '..'));
       fixedSegments.addAll(segments.sublist(index));
       var fixedUrl = urlBuilder.joinAll(fixedSegments);
-      logger.error('Invalid url to reach to another package: $url. Path '
+      logger.warning('Invalid url to reach to another package: $url. Path '
           'reaching to other packages must first reach up all the '
           'way to the $prefix folder. For example, try changing the url above '
           'to: $fixedUrl', span: span);
@@ -90,7 +98,7 @@
   if (prefix != 'packages' && prefix != 'assets') return null;
   var folder = prefix == 'packages' ? 'lib' : 'asset';
   if (segments.length < index + 3) {
-    logger.error("incomplete $prefix/ path. It should have at least 3 "
+    logger.warning("incomplete $prefix/ path. It should have at least 3 "
         "segments $prefix/name/path-from-name's-$folder-dir", span: span);
     return null;
   }
diff --git a/pkg/code_transformers/lib/src/resolver.dart b/pkg/code_transformers/lib/src/resolver.dart
index fac1aac..95f5b1c 100644
--- a/pkg/code_transformers/lib/src/resolver.dart
+++ b/pkg/code_transformers/lib/src/resolver.dart
@@ -6,6 +6,8 @@
 
 import 'dart:async';
 
+import 'package:analyzer/src/generated/ast.dart' show Expression;
+import 'package:analyzer/src/generated/constant.dart' show EvaluationResult;
 import 'package:analyzer/src/generated/element.dart';
 import 'package:barback/barback.dart';
 import 'package:source_maps/refactor.dart';
@@ -68,6 +70,11 @@
   /// potential library name conflicts the name is not guaranteed to be unique.
   Element getLibraryFunction(String functionName);
 
+  /// Gets the result of evaluating the constant [expression] in the context of
+  /// a [library].
+  EvaluationResult evaluateConstant(
+      LibraryElement library, Expression expression);
+
   /// Gets an URI appropriate for importing the specified library.
   ///
   /// Returns null if the library cannot be imported via an absolute URI or
diff --git a/pkg/code_transformers/lib/src/resolver_impl.dart b/pkg/code_transformers/lib/src/resolver_impl.dart
index 9382521..ad73da4 100644
--- a/pkg/code_transformers/lib/src/resolver_impl.dart
+++ b/pkg/code_transformers/lib/src/resolver_impl.dart
@@ -6,13 +6,12 @@
 
 import 'dart:async';
 import 'package:analyzer/analyzer.dart' show parseCompilationUnit;
-import 'package:analyzer/src/generated/ast.dart';
+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/error.dart';
 import 'package:analyzer/src/generated/java_io.dart';
-import 'package:analyzer/src/generated/parser.dart';
-import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
 import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
 import 'package:analyzer/src/generated/source.dart';
@@ -36,7 +35,7 @@
   final Map<AssetId, _AssetBasedSource> sources =
       <AssetId, _AssetBasedSource>{};
 
-  final AnalysisContext _context =
+  final InternalAnalysisContext _context =
       AnalysisEngine.instance.createAnalysisContext();
 
   /// Transform for which this is currently updating, or null when not updating.
@@ -83,7 +82,7 @@
     // Can only have one resolve in progress at a time, so chain the current
     // resolution to be after the last one.
     var phaseComplete = new Completer();
-    var future = _lastPhaseComplete.then((_) {
+    var future = _lastPhaseComplete.whenComplete(() {
       _currentPhaseComplete = phaseComplete;
       return _performResolve(transform,
         entryPoints == null ? [transform.primaryInput.id] : entryPoints);
@@ -132,8 +131,12 @@
         source.dependentAssets.where((id) => !visited.contains(id))
             .forEach(processAsset);
       }, onError: (e) {
-        _context.applyChanges(new ChangeSet()..removedSource(sources[assetId]));
-        sources.remove(assetId);
+        var source = sources[assetId];
+        if (source != null && source.exists()) {
+          _context.applyChanges(
+              new ChangeSet()..removedSource(source));
+          sources[assetId].updateContents(null);
+        }
       }));
     }
     entryPoints.forEach(processAsset);
@@ -143,10 +146,13 @@
     return visiting.future.then((_) {
       var changeSet = new ChangeSet();
       toUpdate.forEach((pending) => pending.apply(changeSet));
-      var unreachableAssets = new Set.from(sources.keys).difference(visited);
+      var unreachableAssets = sources.keys.toSet()
+          .difference(visited)
+          .map((id) => sources[id]);
       for (var unreachable in unreachableAssets) {
-        changeSet.removedSource(sources[unreachable]);
-        sources.remove(unreachable);
+        changeSet.removedSource(unreachable);
+        unreachable.updateContents(null);
+        sources.remove(unreachable.assetId);
       }
 
       // Update the analyzer context with the latest sources
@@ -223,6 +229,12 @@
             orElse: () => null);
   }
 
+  EvaluationResult evaluateConstant(
+      LibraryElement library, Expression expression) {
+    return new ConstantEvaluator(library.source, _context.typeProvider)
+        .evaluate(expression);
+  }
+
   Uri getImportUri(LibraryElement lib, {AssetId from}) =>
       _getSourceUri(lib, from: from);
 
@@ -325,8 +337,11 @@
   }
 
   /// Contents of the file.
-  TimestampedData<String> get contents =>
-      new TimestampedData<String>(modificationStamp, _contents);
+  TimestampedData<String> get contents {
+    if (!exists()) throw new StateError('$assetId does not exist');
+
+    return new TimestampedData<String>(modificationStamp, _contents);
+  }
 
   /// Contents of the file.
   String get rawContents => _contents;
@@ -339,7 +354,7 @@
   /// Gets all imports/parts/exports which resolve to assets (non-Dart files).
   Iterable<AssetId> get dependentAssets => _dependentAssets;
 
-  bool exists() => true;
+  bool exists() => _contents != null;
 
   bool operator ==(Object other) =>
       other is _AssetBasedSource && assetId == other.assetId;
@@ -412,10 +427,16 @@
 
   Source resolveAbsolute(Uri uri) {
     var assetId = _resolve(null, uri.toString(), logger, null);
+    if (assetId == null) {
+      logger.error('Unable to resolve asset ID for "$uri"');
+      return null;
+    }
     var source = _resolver.sources[assetId];
-    /// All resolved assets should be available by this point.
+    // Analyzer expects that sources which are referenced but do not exist yet
+    // still exist, so just make an empty source.
     if (source == null) {
-      logger.error('Unable to find asset for "$uri"');
+      source = new _AssetBasedSource(assetId, _resolver);
+      _resolver.sources[assetId] = source;
     }
     return source;
   }
@@ -581,7 +602,7 @@
   }
 
   /**
-   * A Future that complets with a List of the values from all the added
+   * A Future that completes with a List of the values from all the added
    * tasks, when they have all completed.
    *
    * If any task fails, this Future will receive the error. Only the first
diff --git a/pkg/code_transformers/lib/src/resolvers.dart b/pkg/code_transformers/lib/src/resolvers.dart
index f7e39b3..077ea5b 100644
--- a/pkg/code_transformers/lib/src/resolvers.dart
+++ b/pkg/code_transformers/lib/src/resolvers.dart
@@ -68,9 +68,10 @@
   ///    }
   Future applyToEntryPoints(Transform transform, [List<AssetId> entryPoints]) {
     return resolvers.get(transform, entryPoints).then((resolver) {
-      return new Future.value(applyResolver(transform, resolver)).then((_) {
-        resolver.release();
-      });
+      return new Future(() => applyResolver(transform, resolver))
+        .whenComplete(() {
+          resolver.release();
+        });
     });
   }
 
diff --git a/pkg/code_transformers/pubspec.yaml b/pkg/code_transformers/pubspec.yaml
index 9f2a3da..5792858 100644
--- a/pkg/code_transformers/pubspec.yaml
+++ b/pkg/code_transformers/pubspec.yaml
@@ -1,14 +1,14 @@
 name: code_transformers
-version: 0.1.0
+version: 0.1.2-dev
 author: "Dart Team <misc@dartlang.org>"
 description: Collection of utilities related to creating barback transformers.
 homepage: http://www.dartlang.org
 dependencies:
   analyzer: ">=0.13.0 <0.14.0"
-  barback: ">=0.11.0 <0.12.0"
+  barback: ">=0.11.0 <0.14.0"
   path: ">=0.9.0 <2.0.0"
   source_maps: ">=0.9.0 <0.10.0"
 dev_dependencies:
-  unittest: ">=0.9.0 <0.10.0"
+  unittest: ">=0.10.1 <0.11.0"
 environment:
   sdk: ">=1.0.0 <2.0.0"
diff --git a/pkg/code_transformers/test/assets_test.dart b/pkg/code_transformers/test/assets_test.dart
index 0d104dd..4a130b7 100644
--- a/pkg/code_transformers/test/assets_test.dart
+++ b/pkg/code_transformers/test/assets_test.dart
@@ -5,13 +5,10 @@
 library code_transformers.test.assets_test;
 
 import 'dart:async';
-import 'dart:io' show File, Platform;
 
 import 'package:barback/barback.dart';
 import 'package:code_transformers/assets.dart';
-import 'package:code_transformers/resolver.dart';
 import 'package:code_transformers/tests.dart';
-import 'package:path/path.dart' as path;
 import 'package:unittest/compact_vm_config.dart';
 import 'package:unittest/unittest.dart';
 
@@ -19,7 +16,7 @@
   useCompactVMConfiguration();
 
 
-  Future testAssetUri(String name,
+  void testAssetUri(String name,
       {AssetId source, String uri, AssetId result, String message,
       bool errorOnAbsolute: true}) {
     test(name, () {
@@ -69,7 +66,7 @@
     testAssetUri('does not allow packages from non-dart lib files',
         source: new AssetId('a', 'lib/index.html'),
         uri: 'packages/foo/bar',
-        message: 'error: Invalid url to reach to another package: '
+        message: 'warning: Invalid url to reach to another package: '
             'packages/foo/bar. Path reaching to other packages must first '
             'reach up all the way to the packages folder. For example, try '
             'changing the url above to: ../../packages/foo/bar');
@@ -82,12 +79,13 @@
     testAssetUri('does not allow package: imports from non-dart files',
         source: new AssetId('a', 'lib/index.html'),
         uri: 'package:foo/bar.dart',
-        message: 'error: absolute paths not allowed: "package:foo/bar.dart"');
+        message: 'warning: absolute paths not allowed: "package:foo/bar.dart"');
 
     testAssetUri('does not allow absolute /packages by default',
         source: new AssetId('a', 'lib/index.html'),
         uri: '/packages/foo/bar.dart',
-        message: 'error: absolute paths not allowed: "/packages/foo/bar.dart"');
+        message:
+            'warning: absolute paths not allowed: "/packages/foo/bar.dart"');
 
     testAssetUri('can suppress error on absolute /packages ',
         source: new AssetId('a', 'lib/index.html'),
@@ -102,8 +100,6 @@
 
   Validator(this.validation);
 
-  Future<bool> isPrimary(Asset input) => new Future.value(true);
-
   Future apply(Transform transform) {
     return new Future.value(validation(transform));
   }
diff --git a/pkg/code_transformers/test/entry_point_test.dart b/pkg/code_transformers/test/entry_point_test.dart
index a384444..20b354a 100644
--- a/pkg/code_transformers/test/entry_point_test.dart
+++ b/pkg/code_transformers/test/entry_point_test.dart
@@ -5,12 +5,10 @@
 library code_transformers.test.assets_test;
 
 import 'dart:async';
-import 'dart:io' show File, Platform;
 
 import 'package:barback/barback.dart';
 import 'package:code_transformers/resolver.dart';
 import 'package:code_transformers/tests.dart';
-import 'package:path/path.dart' as path;
 import 'package:unittest/compact_vm_config.dart';
 import 'package:unittest/unittest.dart';
 
@@ -100,8 +98,6 @@
 
   Validator(this.validation);
 
-  Future<bool> isPrimary(Asset input) => new Future.value(true);
-
   Future apply(Transform transform) {
     return new Future.value(validation(transform));
   }
diff --git a/pkg/code_transformers/test/resolver_test.dart b/pkg/code_transformers/test/resolver_test.dart
index 3a396f0..1403b1f 100644
--- a/pkg/code_transformers/test/resolver_test.dart
+++ b/pkg/code_transformers/test/resolver_test.dart
@@ -5,12 +5,10 @@
 library code_transformers.test.resolver_test;
 
 import 'dart:async';
-import 'dart:io' show File, Platform;
 
 import 'package:barback/barback.dart';
 import 'package:code_transformers/resolver.dart';
 import 'package:code_transformers/tests.dart';
-import 'package:path/path.dart' as path;
 import 'package:unittest/compact_vm_config.dart';
 import 'package:unittest/unittest.dart';
 
@@ -19,7 +17,7 @@
   var entryPoint = new AssetId('a', 'web/main.dart');
   var resolvers = new Resolvers(testingDartSdkDirectory);
 
-  Future validateResolver({Map<String, String> inputs, void validator(Resolver),
+  Future validateResolver({Map<String, String> inputs, validator(Resolver),
       List<String> messages: const[]}) {
     return applyTransformers(
           [[new TestTransformer(resolvers, entryPoint, validator)]],
@@ -120,15 +118,30 @@
           });
     });
 
+    test('handles missing files', () {
+      return validateResolver(
+          inputs: {
+            'a|web/main.dart': '''
+              import 'package:b/missing.dart';
+
+              main() {
+              } ''',
+          },
+          validator: (resolver) {
+            var lib = resolver.getLibrary(entryPoint);
+            expect(lib.importedLibraries.length, 1);
+          });
+    });
+
     test('should update on changed package imports', () {
       return validateResolver(
           inputs: {
             'a|web/main.dart': '''
-              import 'package:b/b.dart';
+              import 'package:b/missing.dart';
 
               main() {
               } ''',
-            'b|lib/b.dart': '''
+            'b|lib/missing.dart': '''
               library b;
               class Bar {}
               ''',
@@ -145,14 +158,11 @@
       return validateResolver(
           inputs: {
             'a|web/main.dart': '''
-              import 'package:b/b.dart';
+              import 'package:b/missing.dart';
 
               main() {
               } ''',
           },
-          messages: [
-            'error: Unable to find asset for "package:b/b.dart"',
-          ],
           validator: (resolver) {
             var lib = resolver.getLibrary(entryPoint);
             expect(lib.importedLibraries.length, 1);
@@ -160,6 +170,7 @@
     });
 
     test('should fail on absolute URIs', () {
+      var warningPrefix = 'warning: absolute paths not allowed';
       return validateResolver(
           inputs: {
             'a|web/main.dart': '''
@@ -170,10 +181,8 @@
           },
           messages: [
             // First from the AST walker
-            'error: absolute paths not allowed: "/b.dart" (web/main.dart 0 14)',
-            // Then two from the resolver.
-            'error: absolute paths not allowed: "/b.dart"',
-            'error: absolute paths not allowed: "/b.dart"',
+            '$warningPrefix: "/b.dart" (web/main.dart 0 14)',
+            '$warningPrefix: "/b.dart"',
           ],
           validator: (resolver) {
             var lib = resolver.getLibrary(entryPoint);
@@ -345,10 +354,12 @@
     this.resolvers = resolvers;
   }
 
-  Future<bool> isPrimary(Asset input) =>
-      new Future.value(input.id == primary);
-
-  applyResolver(Transform transform, Resolver resolver) {
-    return validator(resolver);
+  // TODO(nweiz): This should just take an AssetId when barback <0.13.0 support
+  // is dropped.
+  Future<bool> isPrimary(idOrAsset) {
+    var id = idOrAsset is AssetId ? idOrAsset : idOrAsset.id;
+    return new Future.value(id == primary);
   }
+
+  applyResolver(Transform transform, Resolver resolver) => validator(resolver);
 }
diff --git a/pkg/csslib/pubspec.yaml b/pkg/csslib/pubspec.yaml
index 44dcebf..295ff3f 100644
--- a/pkg/csslib/pubspec.yaml
+++ b/pkg/csslib/pubspec.yaml
@@ -1,15 +1,15 @@
 name: csslib
-version: 0.9.2-dev+1
-author: "Polymer.dart Team <web-ui-dev@dartlang.org>"
+version: 0.9.2+1
+author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: A library for parsing CSS.
 homepage: https://www.dartlang.org
-dependencies:
-  args: ">=0.9.0 <0.10.0"
-  logging: ">=0.9.0 <0.10.0"
-  path: ">=0.9.0 <2.0.0"
-  source_maps: ">=0.9.0 <0.10.0"
-dev_dependencies:
-  browser: ">=0.9.0 <0.10.0"
-  unittest: ">=0.9.0 <0.10.0"
 environment:
-  sdk: ">=1.0.0 <2.0.0"
+  sdk: '>=1.0.0 <2.0.0'
+dependencies:
+  args: '>=0.9.0 <0.11.0'
+  logging: '>=0.9.0 <0.10.0'
+  path: '>=0.9.0 <2.0.0'
+  source_maps: '>=0.9.0 <0.10.0'
+dev_dependencies:
+  browser: '>=0.9.0 <0.10.0'
+  unittest: '>=0.9.0 <0.10.0'
diff --git a/pkg/custom_element/lib/custom_element.dart b/pkg/custom_element/lib/custom_element.dart
index 9370cb3..b0a3b5b 100644
--- a/pkg/custom_element/lib/custom_element.dart
+++ b/pkg/custom_element/lib/custom_element.dart
@@ -17,9 +17,8 @@
  */
 library custom_element;
 
-import 'dart:async';
 import 'dart:html';
-import 'src/custom_tag_name.dart';
+import 'dart:async';
 
 /**
  * *Deprecated* -- do not use. Extend [HtmlElement] and use
@@ -120,7 +119,7 @@
       host.getAttributeNS(namespaceUri, localName);
 
   @deprecated
-  String setAttributeNS(
+  void setAttributeNS(
       String namespaceUri, String localName, String value) {
     host.setAttributeNS(namespaceUri, localName, value);
   }
@@ -144,7 +143,7 @@
   /**
    * Replaces this node with another node.
    */
-  Node replaceWith(Node otherNode) { host.replaceWith(otherNode); }
+  Node replaceWith(Node otherNode) => host.replaceWith(otherNode);
 
   /**
    * Removes this node from the DOM.
diff --git a/pkg/custom_element/pubspec.yaml b/pkg/custom_element/pubspec.yaml
index 1f1eb80..b6baadf 100644
--- a/pkg/custom_element/pubspec.yaml
+++ b/pkg/custom_element/pubspec.yaml
@@ -1,5 +1,5 @@
 name: custom_element
-version: 0.10.0
+version: 0.10.1
 author: "Polymer.dart Team <web-ui-dev@dartlang.org>"
 homepage: http://www.dartlang.org/
 description: >
@@ -8,4 +8,4 @@
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
 environment:
-  sdk: ">=1.2.0 <2.0.0"
+  sdk: ">=1.3.0-dev.7.5 <2.0.0"
diff --git a/pkg/docgen/lib/src/model_helpers.dart b/pkg/docgen/lib/src/model_helpers.dart
index 95bd317..1c8a255 100644
--- a/pkg/docgen/lib/src/model_helpers.dart
+++ b/pkg/docgen/lib/src/model_helpers.dart
@@ -11,14 +11,15 @@
 import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
 import '../../../../sdk/lib/_internal/libraries.dart';
 
+import 'library_helpers.dart' show includePrivateMembers;
 import 'models.dart';
 import 'package_helpers.dart';
 
 /// Returns a list of meta annotations assocated with a mirror.
-List<Annotation> createAnnotations(DeclarationMirror mirror, Library
-  owningLibrary) {
-  var annotationMirrors = mirror.metadata.where((e) => e is
-      dart2js_mirrors.Dart2JsConstructedConstantMirror);
+List<Annotation> createAnnotations(DeclarationMirror mirror,
+    Library owningLibrary) {
+  var annotationMirrors = mirror.metadata
+      .where((e) => e is dart2js_mirrors.Dart2JsConstructedConstantMirror);
   var annotations = [];
   annotationMirrors.forEach((annotation) {
     var docgenAnnotation = new Annotation(annotation, owningLibrary);
@@ -73,6 +74,134 @@
   return packageNameFor(rootdir);
 }
 
+
+/// Helper that maps [mirrors] to their simple name in map.
+Map addAll(Map map, Iterable<DeclarationMirror> mirrors) {
+  for (var mirror in mirrors) {
+    map[dart2js_util.nameOf(mirror)] = mirror;
+  }
+  return map;
+}
+
+/// For the given library determine what items (if any) are exported.
+///
+/// Returns a Map with three keys: "classes", "methods", and "variables" the
+/// values of which point to a map of exported name identifiers with values
+/// corresponding to the actual DeclarationMirror.
+Map<String, Map<String, DeclarationMirror>> calcExportedItems(
+    LibrarySourceMirror library) {
+  var exports = {};
+  exports['classes'] = {};
+  exports['methods'] = {};
+  exports['variables'] = {};
+
+  // Determine the classes, variables and methods that are exported for a
+  // specific dependency.
+  void _populateExports(LibraryDependencyMirror export, bool showExport) {
+    if (!showExport) {
+      // Add all items, and then remove the hidden ones.
+      // Ex: "export foo hide bar"
+      addAll(exports['classes'],
+          dart2js_util.typesOf(export.targetLibrary.declarations));
+      addAll(exports['methods'],
+          export.targetLibrary.declarations.values.where(
+              (mirror) => mirror is MethodMirror));
+      addAll(exports['variables'],
+          dart2js_util.variablesOf(export.targetLibrary.declarations));
+    }
+    for (CombinatorMirror combinator in export.combinators) {
+      for (String identifier in combinator.identifiers) {
+        var librarySourceMirror =
+            export.targetLibrary as DeclarationSourceMirror;
+        var declaration = librarySourceMirror.lookupInScope(identifier);
+        if (declaration == null) {
+          // Technically this should be a bug, but some of our packages
+          // (such as the polymer package) are curently broken in this
+          // way, so we just produce a warning.
+          print('Warning identifier $identifier not found in library '
+              '${dart2js_util.qualifiedNameOf(export.targetLibrary)}');
+        } else {
+          var subMap = exports['classes'];
+          if (declaration is MethodMirror) {
+            subMap = exports['methods'];
+          } else if (declaration is VariableMirror) {
+            subMap = exports['variables'];
+          }
+          if (showExport) {
+            subMap[identifier] = declaration;
+          } else {
+            subMap.remove(identifier);
+          }
+        }
+      }
+    }
+  }
+
+  Iterable<LibraryDependencyMirror> exportList =
+      library.libraryDependencies.where((lib) => lib.isExport);
+  for (LibraryDependencyMirror export in exportList) {
+    // If there is a show in the export, add only the show items to the
+    // library. Ex: "export foo show bar"
+    // Otherwise, add all items, and then remove the hidden ones.
+    // Ex: "export foo hide bar"
+    _populateExports(export,
+        export.combinators.any((combinator) => combinator.isShow));
+  }
+  return exports;
+}
+
+
+/// Returns a map of [Variable] objects constructed from [mirrorMap].
+/// The optional parameter [containingLibrary] is contains data for variables
+/// defined at the top level of a library (potentially for exporting
+/// purposes).
+Map<String, Variable> createVariables(Iterable<VariableMirror> mirrors,
+    Indexable owner) {
+  var data = {};
+  // TODO(janicejl): When map to map feature is created, replace the below
+  // with a filter. Issue(#9590).
+  mirrors.forEach((dart2js_mirrors.Dart2JsFieldMirror mirror) {
+    if (includePrivateMembers || !isHidden(mirror)) {
+      var mirrorName = dart2js_util.nameOf(mirror);
+      data[mirrorName] = new Variable(mirrorName, mirror, owner);
+    }
+  });
+  return data;
+}
+
+/// Returns a map of [Method] objects constructed from [mirrorMap].
+/// The optional parameter [containingLibrary] is contains data for variables
+/// defined at the top level of a library (potentially for exporting
+/// purposes).
+Map<String, Method> createMethods(Iterable<MethodMirror> mirrors,
+    Indexable owner) {
+  var group = new Map<String, Method>();
+  mirrors.forEach((MethodMirror mirror) {
+    if (includePrivateMembers || !mirror.isPrivate) {
+      group[dart2js_util.nameOf(mirror)] = new Method(mirror, owner);
+    }
+  });
+  return group;
+}
+
+/// Returns a map of [Parameter] objects constructed from [mirrorList].
+Map<String, Parameter> createParameters(List<ParameterMirror> mirrorList,
+    Indexable owner) {
+  var data = {};
+  mirrorList.forEach((ParameterMirror mirror) {
+    data[dart2js_util.nameOf(mirror)] =
+        new Parameter(mirror, owner.owningLibrary);
+  });
+  return data;
+}
+
+/// Returns a map of [Generic] objects constructed from the class mirror.
+Map<String, Generic> createGenerics(TypeMirror mirror) {
+  return new Map.fromIterable(mirror.typeVariables,
+      key: (e) => dart2js_util.nameOf(e),
+      value: (e) => new Generic(e));
+}
+
 /// Annotations that we do not display in the viewer.
 const List<String> _SKIPPED_ANNOTATIONS = const [
   'metadata.DocsEditable', '_js_helper.JSName', '_js_helper.Creates',
diff --git a/pkg/docgen/lib/src/models.dart b/pkg/docgen/lib/src/models.dart
index 302ecf5..2e59a61 100644
--- a/pkg/docgen/lib/src/models.dart
+++ b/pkg/docgen/lib/src/models.dart
@@ -24,6 +24,9 @@
 abstract class MirrorBased<TMirror extends DeclarationMirror> {
   /// The original dart2js mirror around which this object wraps.
   TMirror get mirror;
+
+  /// Return an informative [Object.toString] for debugging.
+  String toString() => "${super.toString()} - $mirror";
 }
 
 /// A Docgen wrapper around the dart2js mirror for a generic type.
@@ -41,11 +44,11 @@
 /// For types that we do not explicitly create or have not yet created in our
 /// entity map (like core types).
 class DummyMirror implements Indexable {
-  DeclarationMirror mirror;
+  final DeclarationMirror mirror;
   /// The library that contains this element, if any. Used as a hint to help
   /// determine which object we're referring to when looking up this mirror in
   /// our map.
-  Indexable owner;
+  final Indexable owner;
   DummyMirror(this.mirror, [this.owner]);
 
   String get docName {
@@ -102,8 +105,7 @@
 abstract class Indexable<TMirror extends DeclarationMirror>
     extends MirrorBased<TMirror> {
 
-
-  Library get _owningLibrary => owner._owningLibrary;
+  Library get owningLibrary => owner.owningLibrary;
 
   String get qualifiedName => fileName;
   final TMirror mirror;
@@ -256,64 +258,9 @@
     return commentText;
   }
 
-  /// Returns a map of [Variable] objects constructed from [mirrorMap].
-  /// The optional parameter [containingLibrary] is contains data for variables
-  /// defined at the top level of a library (potentially for exporting
-  /// purposes).
-  Map<String, Variable> _createVariables(Iterable<VariableMirror> mirrors,
-      Indexable owner) {
-    var data = {};
-    // TODO(janicejl): When map to map feature is created, replace the below
-    // with a filter. Issue(#9590).
-    mirrors.forEach((dart2js_mirrors.Dart2JsFieldMirror mirror) {
-      if (includePrivateMembers || !isHidden(mirror)) {
-        var mirrorName = dart2js_util.nameOf(mirror);
-        data[mirrorName] = new Variable(mirrorName, mirror, owner);
-      }
-    });
-    return data;
-  }
-
-  /// Returns a map of [Method] objects constructed from [mirrorMap].
-  /// The optional parameter [containingLibrary] is contains data for variables
-  /// defined at the top level of a library (potentially for exporting
-  /// purposes).
-  Map<String, Method> _createMethods(Iterable<MethodMirror> mirrors,
-      Indexable owner) {
-    var group = new Map<String, Method>();
-    mirrors.forEach((MethodMirror mirror) {
-      if (includePrivateMembers || !mirror.isPrivate) {
-        group[dart2js_util.nameOf(mirror)] = new Method(mirror, owner);
-      }
-    });
-    return group;
-  }
-
-  /// Returns a map of [Parameter] objects constructed from [mirrorList].
-  Map<String, Parameter> _createParameters(List<ParameterMirror> mirrorList,
-      Indexable owner) {
-    var data = {};
-    mirrorList.forEach((ParameterMirror mirror) {
-      data[dart2js_util.nameOf(mirror)] =
-          new Parameter(mirror, owner._owningLibrary);
-    });
-    return data;
-  }
-
-  /// Returns a map of [Generic] objects constructed from the class mirror.
-  Map<String, Generic> _createGenerics(TypeMirror mirror) {
-    return new Map.fromIterable(mirror.typeVariables,
-        key: (e) => dart2js_util.nameOf(e),
-        value: (e) => new Generic(e));
-  }
-
-  /// Return an informative [Object.toString] for debugging.
-  String toString() => "${super.toString()}(${name.toString()})";
-
   /// Return a map representation of this type.
   Map toMap();
 
-
   /// Expand the method map [mapToExpand] into a more detailed map that
   /// separates out setters, getters, constructors, operators, and methods.
   Map _expandMethodMap(Map<String, Method> mapToExpand) => {
@@ -353,7 +300,7 @@
   bool _hasBeenCheckedForPackage = false;
   String packageIntro;
 
-  Library get _owningLibrary => this;
+  Library get owningLibrary => this;
 
   /// Returns the [Library] for the given [mirror] if it has already been
   /// created, else creates it.
@@ -366,8 +313,8 @@
   }
 
   Library._(LibraryMirror libraryMirror) : super(libraryMirror) {
-    var exported = _calcExportedItems(libraryMirror);
-    var exportedClasses = _addAll(exported['classes'],
+    var exported = calcExportedItems(libraryMirror);
+    var exportedClasses = addAll(exported['classes'],
         dart2js_util.typesOf(libraryMirror.declarations));
     updateLibraryPackage(mirror);
     exportedClasses.forEach((String mirrorName, TypeMirror mirror) {
@@ -390,10 +337,10 @@
               '${dart2js_util.nameOf(mirror)} - no class type match. ');
         }
     });
-    this.functions = _createMethods(_addAll(exported['methods'],
+    this.functions = createMethods(addAll(exported['methods'],
         libraryMirror.declarations.values.where(
             (mirror) => mirror is MethodMirror)).values, this);
-    this.variables = _createVariables(_addAll(exported['variables'],
+    this.variables = createVariables(addAll(exported['variables'],
         dart2js_util.variablesOf(libraryMirror.declarations)).values, this);
   }
 
@@ -412,14 +359,6 @@
 
   String _mdnComment() => '';
 
-  /// Helper that maps [mirrors] to their simple name in map.
-  static Map _addAll(Map map, Iterable<DeclarationMirror> mirrors) {
-    for (var mirror in mirrors) {
-      map[dart2js_util.nameOf(mirror)] = mirror;
-    }
-    return map;
-  }
-
   /// For a library's [mirror], determine the name of the package (if any) we
   /// believe it came from (because of its file URI).
   ///
@@ -472,73 +411,6 @@
     return dart2js_util.qualifiedNameOf(mirror).replaceAll('.','-');
   }
 
-  /// For the given library determine what items (if any) are exported.
-  ///
-  /// Returns a Map with three keys: "classes", "methods", and "variables" the
-  /// values of which point to a map of exported name identifiers with values
-  /// corresponding to the actual DeclarationMirror.
-  Map<String, Map<String, DeclarationMirror>> _calcExportedItems(
-      LibrarySourceMirror library) {
-    var exports = {};
-    exports['classes'] = {};
-    exports['methods'] = {};
-    exports['variables'] = {};
-
-    // Determine the classes, variables and methods that are exported for a
-    // specific dependency.
-    void _populateExports(LibraryDependencyMirror export, bool showExport) {
-      if (!showExport) {
-        // Add all items, and then remove the hidden ones.
-        // Ex: "export foo hide bar"
-        _addAll(exports['classes'],
-            dart2js_util.typesOf(export.targetLibrary.declarations));
-        _addAll(exports['methods'],
-            export.targetLibrary.declarations.values.where(
-                (mirror) => mirror is MethodMirror));
-        _addAll(exports['variables'],
-            dart2js_util.variablesOf(export.targetLibrary.declarations));
-      }
-      for (CombinatorMirror combinator in export.combinators) {
-        for (String identifier in combinator.identifiers) {
-          var librarySourceMirror =
-              export.targetLibrary as DeclarationSourceMirror;
-          var declaration = librarySourceMirror.lookupInScope(identifier);
-          if (declaration == null) {
-            // Technically this should be a bug, but some of our packages
-            // (such as the polymer package) are curently broken in this
-            // way, so we just produce a warning.
-            print('Warning identifier $identifier not found in library '
-                '${dart2js_util.qualifiedNameOf(export.targetLibrary)}');
-          } else {
-            var subMap = exports['classes'];
-            if (declaration is MethodMirror) {
-              subMap = exports['methods'];
-            } else if (declaration is VariableMirror) {
-              subMap = exports['variables'];
-            }
-            if (showExport) {
-              subMap[identifier] = declaration;
-            } else {
-              subMap.remove(identifier);
-            }
-          }
-        }
-      }
-    }
-
-    Iterable<LibraryDependencyMirror> exportList =
-        library.libraryDependencies.where((lib) => lib.isExport);
-    for (LibraryDependencyMirror export in exportList) {
-      // If there is a show in the export, add only the show items to the
-      // library. Ex: "export foo show bar"
-      // Otherwise, add all items, and then remove the hidden ones.
-      // Ex: "export foo hide bar"
-      _populateExports(export,
-          export.combinators.any((combinator) => combinator.isShow));
-    }
-    return exports;
-  }
-
   /// Checks if the given name is a key for any of the Class Maps.
   bool containsKey(String name) =>
       classes.containsKey(name) || errors.containsKey(name);
@@ -566,22 +438,26 @@
   bool isValidMirror(DeclarationMirror mirror) => mirror is LibraryMirror;
 }
 
-abstract class OwnedIndexable extends Indexable {
+abstract class OwnedIndexable<TMirror extends DeclarationMirror>
+    extends Indexable<TMirror> {
+  /// List of the meta annotations on this item.
+  final List<Annotation> annotations;
+
   /// The object one scope-level above which this item is defined.
   ///
   /// Ex: The owner for a top level class, would be its enclosing library.
   /// The owner of a local variable in a method would be the enclosing method.
-  Indexable owner;
-
-  /// List of the meta annotations on this item.
-  List<Annotation> annotations;
+  final Indexable owner;
 
   /// Returns this object's qualified name, but following the conventions
   /// we're using in Dartdoc, which is that library names with dots in them
   /// have them replaced with hyphens.
   String get docName => owner.docName + '.' + dart2js_util.nameOf(mirror);
 
-  OwnedIndexable(DeclarationMirror mirror, this.owner) : super(mirror);
+  OwnedIndexable(DeclarationMirror mirror, Indexable owner)
+      : annotations = createAnnotations(mirror, owner.owningLibrary),
+        this.owner = owner,
+        super(mirror);
 
   /// Generates MDN comments from database.json.
   String _mdnComment() {
@@ -598,7 +474,9 @@
 }
 
 /// A class containing contents of a Dart class.
-class Class extends OwnedIndexable implements Comparable {
+class Class
+    extends OwnedIndexable<dart2js_mirrors.Dart2JsInterfaceTypeMirror>
+    implements Comparable<Class> {
 
   /// List of the names of interfaces that this class implements.
   List<Class> interfaces = [];
@@ -610,18 +488,18 @@
   Map<String, Variable> variables;
 
   /// Inherited variables in the class.
-  Map<String, Variable> inheritedVariables;
+  final Map<String, Variable> inheritedVariables = {};
 
   /// Methods in the class.
   Map<String, Method> methods;
 
-  Map<String, Method> inheritedMethods;
+  final Map<String, Method> inheritedMethods = new Map<String, Method>();
 
   /// Generic infomation about the class.
-  Map<String, Generic> generics;
+  final Map<String, Generic> generics;
 
   Class superclass;
-  bool isAbstract;
+  bool get isAbstract => mirror.isAbstract;
 
   /// Make sure that we don't check for inherited comments more than once.
   bool _commentsEnsured = false;
@@ -654,9 +532,9 @@
     }
   }
 
-  Class._(ClassSourceMirror classMirror, Indexable owner) :
-      super(classMirror, owner) {
-    inheritedVariables = {};
+  Class._(ClassSourceMirror classMirror, Indexable owner)
+      : generics = createGenerics(classMirror),
+        super(classMirror, owner) {
 
     // The reason we do this madness is the superclass and interface owners may
     // not be this class's owner!! Example: BaseClient in http pkg.
@@ -666,14 +544,10 @@
         new Class._possiblyDifferentOwner(classMirror.superclass, owner);
 
     interfaces = superinterfaces.toList();
-    variables = _createVariables(
+    variables = createVariables(
         dart2js_util.variablesOf(classMirror.declarations), this);
-    methods = _createMethods(classMirror.declarations.values.where(
+    methods = createMethods(classMirror.declarations.values.where(
         (mirror) => mirror is MethodMirror), this);
-    annotations = createAnnotations(classMirror, owner._owningLibrary);
-    generics = _createGenerics(classMirror);
-    isAbstract = classMirror.isAbstract;
-    inheritedMethods = new Map<String, Method>();
 
     // Tell superclass that you are a subclass, unless you are not
     // visible or an intermediary mixin class.
@@ -825,18 +699,18 @@
     'generics': recurseMap(generics)
   };
 
-  int compareTo(aClass) => name.compareTo(aClass.name);
+  int compareTo(Class other) => name.compareTo(other.name);
 
   bool isValidMirror(DeclarationMirror mirror) => mirror is ClassMirror;
 }
 
 class Typedef extends OwnedIndexable {
-  String returnType;
+  final String returnType;
 
-  Map<String, Parameter> parameters;
+  final Map<String, Parameter> parameters;
 
   /// Generic information about the typedef.
-  Map<String, Generic> generics;
+  final Map<String, Generic> generics;
 
   /// Returns the [Library] for the given [mirror] if it has already been
   /// created, else creates it.
@@ -848,13 +722,12 @@
     return aTypedef;
   }
 
-  Typedef._(TypedefMirror mirror, Library owningLibrary) :
-      super(mirror, owningLibrary) {
-    returnType = getDocgenObject(mirror.referent.returnType).docName;
-    generics = _createGenerics(mirror);
-    parameters = _createParameters(mirror.referent.parameters, owningLibrary);
-    annotations = createAnnotations(mirror, owningLibrary);
-  }
+  Typedef._(TypedefMirror mirror, Library owningLibrary)
+      : returnType = getDocgenObject(mirror.referent.returnType).docName,
+        generics = createGenerics(mirror),
+        parameters = createParameters(mirror.referent.parameters,
+            owningLibrary),
+        super(mirror, owningLibrary);
 
   Map toMap() {
     var map = {
@@ -905,8 +778,7 @@
     isFinal = mirror.isFinal;
     isStatic = mirror.isStatic;
     isConst = mirror.isConst;
-    type = new Type(mirror.type, owner._owningLibrary);
-    annotations = createAnnotations(mirror, owner._owningLibrary);
+    type = new Type(mirror.type, owner.owningLibrary);
   }
 
   String get name => _variableName;
@@ -958,12 +830,12 @@
 class Method extends OwnedIndexable {
 
   /// Parameters for this method.
-  Map<String, Parameter> parameters;
+  final Map<String, Parameter> parameters;
 
-  bool isStatic;
-  bool isAbstract;
-  bool isConst;
-  Type returnType;
+  final bool isStatic;
+  final bool isAbstract;
+  final bool isConst;
+  final Type returnType;
   Method methodInheritedFrom;
 
   /// Qualified name to state where the comment is inherited from.
@@ -979,14 +851,12 @@
   }
 
   Method._(MethodMirror mirror, Indexable owner, this.methodInheritedFrom)
-      : super(mirror, owner) {
-    isStatic = mirror.isStatic;
-    isAbstract = mirror.isAbstract;
-    isConst = mirror.isConstConstructor;
-    returnType = new Type(mirror.returnType, owner._owningLibrary);
-    parameters = _createParameters(mirror.parameters, owner);
-    annotations = createAnnotations(mirror, owner._owningLibrary);
-  }
+      : returnType = new Type(mirror.returnType, owner.owningLibrary),
+        isStatic = mirror.isStatic,
+        isAbstract = mirror.isAbstract,
+        isConst = mirror.isConstConstructor,
+        parameters = createParameters(mirror.parameters, owner),
+        super(mirror, owner);
 
   Method get originallyInheritedFrom => methodInheritedFrom == null ?
       this : methodInheritedFrom.originallyInheritedFrom;
@@ -1054,7 +924,7 @@
     'static': isStatic,
     'abstract': isAbstract,
     'constant': isConst,
-    'return': new List.filled(1, returnType.toMap()),
+    'return': [returnType.toMap()],
     'parameters': recurseMap(parameters),
     'annotations': annotations.map((a) => a.toMap()).toList()
   };
@@ -1163,18 +1033,6 @@
 
   Type(this.mirror, this.owningLibrary);
 
-  /// Returns a list of [Type] objects constructed from TypeMirrors.
-  List<Type> _createTypeGenerics(TypeMirror mirror) {
-    if (mirror is ClassMirror) {
-      var innerList = [];
-      mirror.typeArguments.forEach((e) {
-        innerList.add(new Type(e, owningLibrary));
-      });
-      return innerList;
-    }
-    return [];
-  }
-
   Map toMap() {
     var result = getDocgenObject(mirror, owningLibrary);
     return {
@@ -1184,6 +1042,12 @@
       'inner': _createTypeGenerics(mirror).map((e) => e.toMap()).toList(),
     };
   }
+
+  /// Returns a list of [Type] objects constructed from TypeMirrors.
+  List<Type> _createTypeGenerics(TypeMirror mirror) {
+    if (mirror is! ClassMirror) return [];
+    return mirror.typeArguments.map((e) => new Type(e, owningLibrary)).toList();
+  }
 }
 
 /// Holds the name of the annotation, and its parameters.
diff --git a/pkg/docgen/pubspec.yaml b/pkg/docgen/pubspec.yaml
index 77291e7..605766c 100644
--- a/pkg/docgen/pubspec.yaml
+++ b/pkg/docgen/pubspec.yaml
@@ -8,7 +8,7 @@
 dependencies:
   args: '>=0.9.0 <0.11.0'
   logging: '>=0.9.0 <0.10.0'
-  markdown: '0.5.1'
+  markdown: '0.6.0'
   path: '>=0.9.0 <2.0.0'
   yaml: '>=0.9.0 <0.10.0'
 dev_dependencies:
diff --git a/pkg/docgen/test/generate_json_test.dart b/pkg/docgen/test/generate_json_test.dart
index 68a3a12..9149a96 100644
--- a/pkg/docgen/test/generate_json_test.dart
+++ b/pkg/docgen/test/generate_json_test.dart
@@ -9,7 +9,6 @@
 import 'package:path/path.dart' as p;
 import 'package:scheduled_test/descriptor.dart' as d;
 import 'package:scheduled_test/scheduled_test.dart';
-import 'package:unittest/matcher.dart';
 
 import 'util.dart';
 import '../lib/docgen.dart' as dg;
diff --git a/pkg/docgen/test/only_lib_content_in_pkg_test.dart b/pkg/docgen/test/only_lib_content_in_pkg_test.dart
index 0e6e05a..b4ec488 100644
--- a/pkg/docgen/test/only_lib_content_in_pkg_test.dart
+++ b/pkg/docgen/test/only_lib_content_in_pkg_test.dart
@@ -9,7 +9,6 @@
 import 'package:path/path.dart' as p;
 import 'package:scheduled_test/descriptor.dart' as d;
 import 'package:scheduled_test/scheduled_test.dart';
-import 'package:unittest/matcher.dart';
 
 import '../lib/docgen.dart' as dg;
 import 'util.dart';
diff --git a/pkg/docgen/test/typedef_test.dart b/pkg/docgen/test/typedef_test.dart
index 5defa66..9911f08 100644
--- a/pkg/docgen/test/typedef_test.dart
+++ b/pkg/docgen/test/typedef_test.dart
@@ -10,7 +10,6 @@
 import 'package:path/path.dart' as p;
 import 'package:scheduled_test/descriptor.dart' as d;
 import 'package:scheduled_test/scheduled_test.dart';
-import 'package:unittest/matcher.dart';
 
 import 'util.dart';
 import '../lib/docgen.dart' as dg;
diff --git a/pkg/http/CHANGELOG.md b/pkg/http/CHANGELOG.md
index 0a9b4ba..7bd8d07 100644
--- a/pkg/http/CHANGELOG.md
+++ b/pkg/http/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 0.11.0
+
+* Change `MultipartFile.contentType` from `dart:io`'s `ContentType` type to
+  `http_parser`'s `MediaType` type.
+
+* Exceptions are now of type `ClientException` rather than `dart:io`'s
+  `HttpException`.
+
 ## 0.10.0
 
 * Make `BaseRequest.contentLength` and `BaseResponse.contentLength` use `null`
@@ -7,3 +15,5 @@
   positional.
 
 * Make request headers case-insensitive.
+
+* Make `MultipartRequest` more closely adhere to browsers' encoding conventions.
diff --git a/pkg/http/lib/http.dart b/pkg/http/lib/http.dart
index 2b76f8d..67c5649 100644
--- a/pkg/http/lib/http.dart
+++ b/pkg/http/lib/http.dart
@@ -59,7 +59,7 @@
 ///       UserAgentClient(this.userAgent, this._inner);
 ///
 ///       Future<StreamedResponse> send(BaseRequest request) {
-///         request.headers[HttpHeaders.USER_AGENT] = userAgent;
+///         request.headers['user-agent'] = userAgent;
 ///         return _inner.send(request);
 ///       }
 ///     }
@@ -79,6 +79,7 @@
 export 'src/base_response.dart';
 export 'src/byte_stream.dart';
 export 'src/client.dart';
+export 'src/exception.dart';
 export 'src/multipart_file.dart';
 export 'src/multipart_request.dart';
 export 'src/request.dart';
@@ -171,7 +172,7 @@
 /// be a [Uri] or a [String], and returns a Future that completes to the body of
 /// the response as a [String].
 ///
-/// The Future will emit an [HttpException] if the response doesn't have a
+/// The Future will emit a [ClientException] if the response doesn't have a
 /// success status code.
 ///
 /// This automatically initializes a new [Client] and closes that client once
@@ -187,7 +188,7 @@
 /// be a [Uri] or a [String], and returns a Future that completes to the body of
 /// the response as a list of bytes.
 ///
-/// The Future will emit an [HttpException] if the response doesn't have a
+/// The Future will emit a [ClientException] if the response doesn't have a
 /// success status code.
 ///
 /// This automatically initializes a new [Client] and closes that client once
diff --git a/pkg/http/lib/src/base_client.dart b/pkg/http/lib/src/base_client.dart
index 87a4224..da38e70 100644
--- a/pkg/http/lib/src/base_client.dart
+++ b/pkg/http/lib/src/base_client.dart
@@ -6,11 +6,11 @@
 
 import 'dart:async';
 import 'dart:convert';
-import 'dart:io';
 import 'dart:typed_data';
 
 import 'base_request.dart';
 import 'client.dart';
+import 'exception.dart';
 import 'request.dart';
 import 'response.dart';
 import 'streamed_response.dart';
@@ -89,7 +89,7 @@
   /// can be a [Uri] or a [String], and returns a Future that completes to the
   /// body of the response as a String.
   ///
-  /// The Future will emit an [HttpException] if the response doesn't have a
+  /// The Future will emit a [ClientException] if the response doesn't have a
   /// success status code.
   ///
   /// For more fine-grained control over the request and response, use [send] or
@@ -105,7 +105,7 @@
   /// can be a [Uri] or a [String], and returns a Future that completes to the
   /// body of the response as a list of bytes.
   ///
-  /// The Future will emit an [HttpException] if the response doesn't have a
+  /// The Future will emit an [ClientException] if the response doesn't have a
   /// success status code.
   ///
   /// For more fine-grained control over the request and response, use [send] or
@@ -122,7 +122,8 @@
   /// Implementers should call [BaseRequest.finalize] to get the body of the
   /// request as a [ByteStream]. They shouldn't make any assumptions about the
   /// state of the stream; it could have data written to it asynchronously at a
-  /// later point, or it could already be closed when it's returned.
+  /// later point, or it could already be closed when it's returned. Any
+  /// internal HTTP errors should be wrapped as [ClientException]s.
   Future<StreamedResponse> send(BaseRequest request);
 
   /// Sends a non-streaming [Request] and returns a non-streaming [Response].
@@ -157,7 +158,8 @@
     if (response.reasonPhrase != null) {
       message = "$message: ${response.reasonPhrase}";
     }
-    throw new HttpException("$message.");
+    if (url is String) url = Uri.parse(url);
+    throw new ClientException("$message.", url);
   }
 
   /// Closes the client and cleans up any resources associated with it. It's
diff --git a/pkg/http/lib/src/base_request.dart b/pkg/http/lib/src/base_request.dart
index a52b9c2..ba87e52 100644
--- a/pkg/http/lib/src/base_request.dart
+++ b/pkg/http/lib/src/base_request.dart
@@ -115,12 +115,10 @@
     var client = new Client();
     return client.send(this).then((response) {
       var stream = onDone(response.stream, client.close);
-      var contentLength = response.contentLength < 0 ?
-          null : response.contentLength;
       return new StreamedResponse(
           new ByteStream(stream),
           response.statusCode,
-          contentLength: contentLength,
+          contentLength: response.contentLength,
           request: response.request,
           headers: response.headers,
           isRedirect: response.isRedirect,
diff --git a/pkg/http/lib/src/byte_stream.dart b/pkg/http/lib/src/byte_stream.dart
index 181d410..d4e7f70 100644
--- a/pkg/http/lib/src/byte_stream.dart
+++ b/pkg/http/lib/src/byte_stream.dart
@@ -6,7 +6,6 @@
 
 import 'dart:async';
 import 'dart:convert';
-import 'dart:io';
 import 'dart:typed_data';
 
 import 'utils.dart';
@@ -14,24 +13,27 @@
 /// A stream of chunks of bytes representing a single piece of data.
 class ByteStream extends StreamView<List<int>> {
   ByteStream(Stream<List<int>> stream)
-    : super(stream);
+      : super(stream);
 
   /// Returns a single-subscription byte stream that will emit the given bytes
   /// in a single chunk.
   factory ByteStream.fromBytes(List<int> bytes) =>
-    new ByteStream(streamFromIterable([bytes]));
+      new ByteStream(streamFromIterable([bytes]));
 
   /// Collects the data of this stream in a [Uint8List].
   Future<Uint8List> toBytes() {
-    return fold(new BytesBuilder(), (builder, chunk) => builder..add(chunk))
-        .then((builder) => builder.takeBytes());
+    var completer = new Completer();
+    var sink = new ByteConversionSink.withCallback(completer.complete);
+    listen(sink.add, onError: completer.completeError, onDone: sink.close,
+        cancelOnError: true);
+    return completer.future;
   }
 
   /// Collect the data of this stream in a [String], decoded according to
   /// [encoding], which defaults to `UTF8`.
   Future<String> bytesToString([Encoding encoding=UTF8]) =>
-      toBytes().then((bytes) => encoding.decode(bytes));
+      encoding.decodeStream(this);
 
   Stream<String> toStringStream([Encoding encoding=UTF8]) =>
-    transform(encoding.decoder);
+      transform(encoding.decoder);
 }
diff --git a/pkg/http/lib/src/client.dart b/pkg/http/lib/src/client.dart
index 1e6771f..68c9067 100644
--- a/pkg/http/lib/src/client.dart
+++ b/pkg/http/lib/src/client.dart
@@ -92,7 +92,7 @@
   /// can be a [Uri] or a [String], and returns a Future that completes to the
   /// body of the response as a String.
   ///
-  /// The Future will emit an [HttpException] if the response doesn't have a
+  /// The Future will emit a [ClientException] if the response doesn't have a
   /// success status code.
   ///
   /// For more fine-grained control over the request and response, use [send] or
@@ -103,7 +103,7 @@
   /// can be a [Uri] or a [String], and returns a Future that completes to the
   /// body of the response as a list of bytes.
   ///
-  /// The Future will emit an [HttpException] if the response doesn't have a
+  /// The Future will emit a [ClientException] if the response doesn't have a
   /// success status code.
   ///
   /// For more fine-grained control over the request and response, use [send] or
diff --git a/pkg/http/lib/src/exception.dart b/pkg/http/lib/src/exception.dart
new file mode 100644
index 0000000..bb199d8
--- /dev/null
+++ b/pkg/http/lib/src/exception.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http.exception;
+
+/// An exception caused by an error in a pkg/http client.
+class ClientException implements Exception {
+  final String message;
+
+  /// The URL of the HTTP request or response that failed.
+  final Uri uri;
+
+  ClientException(this.message, [this.uri]);
+
+  String toString() => message;
+}
diff --git a/pkg/http/lib/src/io_client.dart b/pkg/http/lib/src/io_client.dart
index 112607d..b5e4815 100644
--- a/pkg/http/lib/src/io_client.dart
+++ b/pkg/http/lib/src/io_client.dart
@@ -11,6 +11,7 @@
 
 import 'base_client.dart';
 import 'base_request.dart';
+import 'exception.dart';
 import 'streamed_response.dart';
 
 /// A `dart:io`-based HTTP client. This is the default client.
@@ -47,7 +48,9 @@
       var contentLength = response.contentLength == -1 ?
           null : response.contentLength;
       return new StreamedResponse(
-          response,
+          response.handleError((error) =>
+              throw new ClientException(error.message, error.uri),
+              test: (error) => error is HttpException),
           response.statusCode,
           contentLength: contentLength,
           request: request,
@@ -55,6 +58,9 @@
           isRedirect: response.isRedirect,
           persistentConnection: response.persistentConnection,
           reasonPhrase: response.reasonPhrase);
+    }).catchError((error) {
+      if (error is! HttpException) throw error;
+      throw new ClientException(error.message, error.uri);
     });
   }
 
diff --git a/pkg/http/lib/src/multipart_file.dart b/pkg/http/lib/src/multipart_file.dart
index d316e2a..220c286 100644
--- a/pkg/http/lib/src/multipart_file.dart
+++ b/pkg/http/lib/src/multipart_file.dart
@@ -5,9 +5,10 @@
 library multipart_file;
 
 import 'dart:async';
-import 'dart:convert';
 import 'dart:io';
+import 'dart:convert';
 
+import 'package:http_parser/http_parser.dart';
 import 'package:path/path.dart' as path;
 import 'package:stack_trace/stack_trace.dart';
 
@@ -28,7 +29,7 @@
   final String filename;
 
   /// The content-type of the file. Defaults to `application/octet-stream`.
-  final ContentType contentType;
+  final MediaType contentType;
 
   /// The stream that will emit the file's contents.
   final ByteStream _stream;
@@ -44,17 +45,17 @@
   /// [contentType] currently defaults to `application/octet-stream`, but in the
   /// future may be inferred from [filename].
   MultipartFile(this.field, Stream<List<int>> stream, this.length,
-      {this.filename, ContentType contentType})
+      {this.filename, MediaType contentType})
     : this._stream = toByteStream(stream),
       this.contentType = contentType != null ? contentType :
-          new ContentType("application", "octet-stream");
+          new MediaType("application", "octet-stream");
 
   /// Creates a new [MultipartFile] from a byte array.
   ///
   /// [contentType] currently defaults to `application/octet-stream`, but in the
   /// future may be inferred from [filename].
   factory MultipartFile.fromBytes(String field, List<int> value,
-      {String filename, ContentType contentType}) {
+      {String filename, MediaType contentType}) {
     var stream = new ByteStream.fromBytes(value);
     return new MultipartFile(field, stream, value.length,
         filename: filename,
@@ -68,16 +69,11 @@
   /// [contentType] currently defaults to `text/plain; charset=utf-8`, but in
   /// the future may be inferred from [filename].
   factory MultipartFile.fromString(String field, String value,
-      {String filename, ContentType contentType}) {
-    contentType = contentType == null ? new ContentType("text", "plain")
+      {String filename, MediaType contentType}) {
+    contentType = contentType == null ? new MediaType("text", "plain")
                                       : contentType;
-    var charset = contentType.charset;
-    var encoding = encodingForCharset(contentType.charset, UTF8);
-    // Make a new contentType with ensured charset.
-    contentType = new ContentType(contentType.primaryType,
-                                  contentType.subType,
-                                  charset: encoding.name,
-                                  parameters: contentType.parameters);
+    var encoding = encodingForCharset(contentType.parameters['charset'], UTF8);
+    contentType = contentType.change(parameters: {'charset': encoding.name});
 
     return new MultipartFile.fromBytes(field, encoding.encode(value),
         filename: filename,
@@ -91,7 +87,7 @@
   /// defaults to `application/octet-stream`, but in the future may be inferred
   /// from [filename].
   static Future<MultipartFile> fromPath(String field, String filePath,
-      {String filename, ContentType contentType}) {
+      {String filename, MediaType contentType}) {
     if (filename == null) filename = path.basename(filePath);
     var file = new File(filePath);
     return Chain.track(file.length()).then((length) {
diff --git a/pkg/http/lib/src/multipart_request.dart b/pkg/http/lib/src/multipart_request.dart
index 5bbd5b3..6a00a5ca 100644
--- a/pkg/http/lib/src/multipart_request.dart
+++ b/pkg/http/lib/src/multipart_request.dart
@@ -13,6 +13,8 @@
 import 'multipart_file.dart';
 import 'utils.dart';
 
+final _newlineRegExp = new RegExp(r"\r\n|\r|\n");
+
 /// A `multipart/form-data` request. Such a request has both string [fields],
 /// which function as normal form fields, and (potentially streamed) binary
 /// [files].
@@ -27,7 +29,7 @@
 ///     request.files.add(new http.MultipartFile.fromFile(
 ///         'package',
 ///         new File('build/package.tar.gz'),
-///         contentType: new ContentType('application', 'x-tar'));
+///         contentType: new MediaType('application', 'x-tar'));
 ///     request.send().then((response) {
 ///       if (response.statusCode == 200) print("Uploaded!");
 ///     });
@@ -61,13 +63,13 @@
 
     fields.forEach((name, value) {
       length += "--".length + _BOUNDARY_LENGTH + "\r\n".length +
-          _headerForField(name, value).length +
+          UTF8.encode(_headerForField(name, value)).length +
           UTF8.encode(value).length + "\r\n".length;
     });
 
     for (var file in _files) {
       length += "--".length + _BOUNDARY_LENGTH + "\r\n".length +
-          _headerForFile(file).length +
+          UTF8.encode(_headerForFile(file)).length +
           file.length + "\r\n".length;
     }
 
@@ -91,8 +93,7 @@
     var controller = new StreamController<List<int>>(sync: true);
 
     void writeAscii(String string) {
-      assert(isPlainAscii(string));
-      controller.add(string.codeUnits);
+      controller.add(UTF8.encode(string));
     }
 
     writeUtf8(String string) => controller.add(UTF8.encode(string));
@@ -133,11 +134,8 @@
   /// Returns the header string for a field. The return value is guaranteed to
   /// contain only ASCII characters.
   String _headerForField(String name, String value) {
-    // http://tools.ietf.org/html/rfc2388 mandates some complex encodings for
-    // field names and file names, but in practice user agents seem to just
-    // URL-encode them so we do the same.
     var header =
-        'content-disposition: form-data; name="${Uri.encodeFull(name)}"';
+        'content-disposition: form-data; name="${_browserEncode(name)}"';
     if (!isPlainAscii(value)) {
       header = '$header\r\ncontent-type: text/plain; charset=utf-8';
     }
@@ -148,14 +146,24 @@
   /// contain only ASCII characters.
   String _headerForFile(MultipartFile file) {
     var header = 'content-type: ${file.contentType}\r\n'
-      'content-disposition: form-data; name="${Uri.encodeFull(file.field)}"';
+      'content-disposition: form-data; name="${_browserEncode(file.field)}"';
 
     if (file.filename != null) {
-      header = '$header; filename="${Uri.encodeFull(file.filename)}"';
+      header = '$header; filename="${_browserEncode(file.filename)}"';
     }
     return '$header\r\n\r\n';
   }
 
+  /// Encode [value] in the same way browsers do.
+  String _browserEncode(String value) {
+    // http://tools.ietf.org/html/rfc2388 mandates some complex encodings for
+    // field names and file names, but in practice user agents seem not to
+    // follow this at all. Instead, they URL-encode `\r`, `\n`, and `\r\n` as
+    // `\r\n`; URL-encode `"`; and do nothing else (even for `%` or non-ASCII
+    // characters). We follow their behavior.
+    return value.replaceAll(_newlineRegExp, "%0D%0A").replaceAll('"', "%22");
+  }
+
   /// Returns a randomly-generated multipart boundary string
   String _boundaryString() {
     var prefix = "dart-http-boundary-";
diff --git a/pkg/http/lib/src/request.dart b/pkg/http/lib/src/request.dart
index f247f00..b83e6a7 100644
--- a/pkg/http/lib/src/request.dart
+++ b/pkg/http/lib/src/request.dart
@@ -5,9 +5,10 @@
 library request;
 
 import 'dart:convert';
-import 'dart:io';
 import 'dart:typed_data';
 
+import 'package:http_parser/http_parser.dart';
+
 import 'base_request.dart';
 import 'byte_stream.dart';
 import 'utils.dart';
@@ -45,23 +46,19 @@
   /// If the request has a `Content-Type` header, setting this will set the
   /// charset parameter on that header.
   Encoding get encoding {
-    if (_contentType == null || _contentType.charset == null) {
+    if (_contentType == null ||
+        !_contentType.parameters.containsKey('charset')) {
       return _defaultEncoding;
     }
-    return requiredEncodingForCharset(_contentType.charset);
+    return requiredEncodingForCharset(_contentType.parameters['charset']);
   }
 
   set encoding(Encoding value) {
     _checkFinalized();
     _defaultEncoding = value;
     var contentType = _contentType;
-    if (contentType != null) {
-      contentType = new ContentType(contentType.primaryType,
-                                    contentType.subType,
-                                    charset: value.name,
-                                    parameters: contentType.parameters);
-      _contentType = contentType;
-    }
+    if (contentType == null) return;
+    _contentType = contentType.change(parameters: {'charset': value.name});
   }
 
   // TODO(nweiz): make this return a read-only view
@@ -90,14 +87,10 @@
     bodyBytes = encoding.encode(value);
     var contentType = _contentType;
     if (contentType == null) {
-      contentType = new ContentType("text", "plain", charset: encoding.name);
-    } else if (contentType.charset == null) {
-      contentType = new ContentType(contentType.primaryType,
-                                    contentType.subType,
-                                    charset: encoding.name,
-                                    parameters: contentType.parameters);
+      _contentType = new MediaType("text", "plain", {'charset': encoding.name});
+    } else if (!contentType.parameters.containsKey('charset')) {
+      _contentType = contentType.change(parameters: {'charset': encoding.name});
     }
-    _contentType = contentType;
   }
 
   /// The form-encoded fields in the body of the request as a map from field
@@ -115,8 +108,9 @@
   ///
   /// This map should only be set, not modified in place.
   Map<String, String> get bodyFields {
-    if (_contentType == null ||
-        _contentType.value != "application/x-www-form-urlencoded") {
+    var contentType = _contentType;
+    if (contentType == null ||
+        contentType.mimeType != "application/x-www-form-urlencoded") {
       throw new StateError('Cannot access the body fields of a Request without '
           'content-type "application/x-www-form-urlencoded".');
     }
@@ -125,11 +119,12 @@
   }
 
   set bodyFields(Map<String, String> fields) {
-    if (_contentType == null) {
-      _contentType = new ContentType("application", "x-www-form-urlencoded");
-    } else if (_contentType.value != "application/x-www-form-urlencoded") {
+    var contentType = _contentType;
+    if (contentType == null) {
+      _contentType = new MediaType("application", "x-www-form-urlencoded");
+    } else if (contentType.mimeType != "application/x-www-form-urlencoded") {
       throw new StateError('Cannot set the body fields of a Request with '
-          'content-type "${_contentType.value}".');
+          'content-type "${contentType.mimeType}".');
     }
 
     this.body = mapToQuery(fields, encoding: encoding);
@@ -149,15 +144,15 @@
   }
 
   /// The `Content-Type` header of the request (if it exists) as a
-  /// [ContentType].
-  ContentType get _contentType {
-    var contentType = headers[HttpHeaders.CONTENT_TYPE];
+  /// [MediaType].
+  MediaType get _contentType {
+    var contentType = headers['content-type'];
     if (contentType == null) return null;
-    return ContentType.parse(contentType);
+    return new MediaType.parse(contentType);
   }
 
-  set _contentType(ContentType value) {
-    headers[HttpHeaders.CONTENT_TYPE] = value.toString();
+  set _contentType(MediaType value) {
+    headers['content-type'] = value.toString();
   }
 
   /// Throw an error if this request has been finalized.
diff --git a/pkg/http/lib/src/response.dart b/pkg/http/lib/src/response.dart
index afbb714..a107d0c 100644
--- a/pkg/http/lib/src/response.dart
+++ b/pkg/http/lib/src/response.dart
@@ -6,9 +6,10 @@
 
 import 'dart:async';
 import 'dart:convert';
-import 'dart:io';
 import 'dart:typed_data';
 
+import 'package:http_parser/http_parser.dart';
+
 import 'base_request.dart';
 import 'base_response.dart';
 import 'streamed_response.dart';
@@ -84,12 +85,13 @@
 /// defaults to [LATIN1] if the headers don't specify a charset or
 /// if that charset is unknown.
 Encoding _encodingForHeaders(Map<String, String> headers) =>
-  encodingForCharset(_contentTypeForHeaders(headers).charset);
+  encodingForCharset(_contentTypeForHeaders(headers).parameters['charset']);
 
-/// Returns the [ContentType] object for the given headers. Defaults to
-/// `application/octet-stream`.
-ContentType _contentTypeForHeaders(Map<String, String> headers) {
-  var contentType = headers[HttpHeaders.CONTENT_TYPE];
-  if (contentType != null) return ContentType.parse(contentType);
-  return new ContentType("application", "octet-stream");
+/// Returns the [MediaType] object for the given headers's content-type.
+///
+/// Defaults to `application/octet-stream`.
+MediaType _contentTypeForHeaders(Map<String, String> headers) {
+  var contentType = headers['content-type'];
+  if (contentType != null) return new MediaType.parse(contentType);
+  return new MediaType("application", "octet-stream");
 }
diff --git a/pkg/http/lib/src/utils.dart b/pkg/http/lib/src/utils.dart
index f08e962..dde507a 100644
--- a/pkg/http/lib/src/utils.dart
+++ b/pkg/http/lib/src/utils.dart
@@ -62,8 +62,7 @@
 /// Returns the [Encoding] that corresponds to [charset]. Returns [fallback] if
 /// [charset] is null or if no [Encoding] was found that corresponds to
 /// [charset].
-Encoding encodingForCharset(
-    String charset, [Encoding fallback = LATIN1]) {
+Encoding encodingForCharset(String charset, [Encoding fallback = LATIN1]) {
   if (charset == null) return fallback;
   var encoding = Encoding.getByName(charset);
   return encoding == null ? fallback : encoding;
diff --git a/pkg/http/pubspec.yaml b/pkg/http/pubspec.yaml
index 75b4e54..f3cf0c3 100644
--- a/pkg/http/pubspec.yaml
+++ b/pkg/http/pubspec.yaml
@@ -1,12 +1,13 @@
 name: http
-version: 0.10.0-dev
+version: 0.11.0-dev
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://pub.dartlang.org/packages/http
 description: A composable, Future-based API for making HTTP requests.
 dependencies:
+  http_parser: ">=0.0.1 <0.1.0"
   path: ">=0.9.0 <2.0.0"
   stack_trace: ">=0.9.1 <0.10.0"
 dev_dependencies:
-  unittest: ">=0.9.0 <0.10.0"
+  unittest: ">=0.9.0 <0.11.0"
 environment:
   sdk: ">=1.1.0 <2.0.0"
diff --git a/pkg/http/test/http_test.dart b/pkg/http/test/http_test.dart
index 92a14fa..69bc43d 100644
--- a/pkg/http/test/http_test.dart
+++ b/pkg/http/test/http_test.dart
@@ -298,7 +298,7 @@
 
     test('read throws an error for a 4** status code', () {
       expect(startServer().then((_) {
-        expect(http.read(serverUrl.resolve('/error')), throwsHttpException);
+        expect(http.read(serverUrl.resolve('/error')), throwsClientException);
       }), completes);
     });
 
@@ -326,7 +326,8 @@
 
     test('readBytes throws an error for a 4** status code', () {
       expect(startServer().then((_) {
-        expect(http.readBytes(serverUrl.resolve('/error')), throwsHttpException);
+        expect(http.readBytes(serverUrl.resolve('/error')),
+            throwsClientException);
       }), completes);
     });
   });
diff --git a/pkg/http/test/multipart_test.dart b/pkg/http/test/multipart_test.dart
index 7467d5f..a3f0f8e 100644
--- a/pkg/http/test/multipart_test.dart
+++ b/pkg/http/test/multipart_test.dart
@@ -9,6 +9,7 @@
 import 'dart:io';
 
 import 'package:http/http.dart' as http;
+import 'package:http_parser/http_parser.dart';
 import 'package:path/path.dart' as path;
 import 'package:unittest/unittest.dart';
 
@@ -30,7 +31,7 @@
 
     var future = item.finalize().toBytes().then((bodyBytes) {
       var body = UTF8.decode(bodyBytes);
-      var contentType = ContentType.parse(item.headers['content-type']);
+      var contentType = new MediaType.parse(item.headers['content-type']);
       var boundary = contentType.parameters['boundary'];
       var expected = cleanUpLiteral(_pattern)
           .replaceAll("\n", "\r\n")
@@ -93,7 +94,33 @@
 
     expect(request, bodyMatches('''
         --{{boundary}}
-        content-disposition: form-data; name="f%C3%AF%C4%93ld"
+        content-disposition: form-data; name="fïēld"
+
+        value
+        --{{boundary}}--
+        '''));
+  });
+
+  test('with a field name with newlines', () {
+    var request = new http.MultipartRequest('POST', dummyUrl);
+    request.fields['foo\nbar\rbaz\r\nbang'] = 'value';
+
+    expect(request, bodyMatches('''
+        --{{boundary}}
+        content-disposition: form-data; name="foo%0D%0Abar%0D%0Abaz%0D%0Abang"
+
+        value
+        --{{boundary}}--
+        '''));
+  });
+
+  test('with a field name with a quote', () {
+    var request = new http.MultipartRequest('POST', dummyUrl);
+    request.fields['foo"bar'] = 'value';
+
+    expect(request, bodyMatches('''
+        --{{boundary}}
+        content-disposition: form-data; name="foo%22bar"
 
         value
         --{{boundary}}--
@@ -122,7 +149,37 @@
     expect(request, bodyMatches('''
         --{{boundary}}
         content-type: text/plain; charset=utf-8
-        content-disposition: form-data; name="file"; filename="f%C3%AFl%C4%93name.txt"
+        content-disposition: form-data; name="file"; filename="fïlēname.txt"
+
+        contents
+        --{{boundary}}--
+        '''));
+  });
+
+  test('with a filename with newlines', () {
+    var request = new http.MultipartRequest('POST', dummyUrl);
+    request.files.add(new http.MultipartFile.fromString('file', 'contents',
+        filename: 'foo\nbar\rbaz\r\nbang'));
+
+    expect(request, bodyMatches('''
+        --{{boundary}}
+        content-type: text/plain; charset=utf-8
+        content-disposition: form-data; name="file"; filename="foo%0D%0Abar%0D%0Abaz%0D%0Abang"
+
+        contents
+        --{{boundary}}--
+        '''));
+  });
+
+  test('with a filename with a quote', () {
+    var request = new http.MultipartRequest('POST', dummyUrl);
+    request.files.add(new http.MultipartFile.fromString('file', 'contents',
+        filename: 'foo"bar'));
+
+    expect(request, bodyMatches('''
+        --{{boundary}}
+        content-type: text/plain; charset=utf-8
+        content-disposition: form-data; name="file"; filename="foo%22bar"
 
         contents
         --{{boundary}}--
@@ -132,7 +189,7 @@
   test('with a string file with a content-type but no charset', () {
     var request = new http.MultipartRequest('POST', dummyUrl);
     var file = new http.MultipartFile.fromString('file', '{"hello": "world"}',
-        contentType: new ContentType('application', 'json'));
+        contentType: new MediaType('application', 'json'));
     request.files.add(file);
 
     expect(request, bodyMatches('''
@@ -149,7 +206,7 @@
     var request = new http.MultipartRequest('POST', dummyUrl);
     // "Ã¥" encoded as ISO-8859-1 and then read as UTF-8 results in "å".
     var file = new http.MultipartFile.fromString('file', 'non-ascii: "Ã¥"',
-        contentType: new ContentType('text', 'plain', charset: 'iso-8859-1'));
+        contentType: new MediaType('text', 'plain', {'charset': 'iso-8859-1'}));
     request.files.add(file);
 
     expect(request, bodyMatches('''
diff --git a/pkg/http/test/streamed_request_test.dart b/pkg/http/test/streamed_request_test.dart
index 761102c..c9e3689 100644
--- a/pkg/http/test/streamed_request_test.dart
+++ b/pkg/http/test/streamed_request_test.dart
@@ -58,4 +58,17 @@
       expect(() => request.contentLength = 10, throwsStateError);
     });
   });
+
+  // Regression test.
+  test('.send() with a response with no content length', () {
+    return startServer().then((_) {
+      var request = new http.StreamedRequest(
+          'GET', serverUrl.resolve('/no-content-length'));
+      request.sink.close();
+      return request.send();
+    }).then((response) {
+      expect(UTF8.decodeStream(response.stream), completion(equals('body')));
+    }).whenComplete(stopServer);
+  });
+
 }
\ No newline at end of file
diff --git a/pkg/http/test/utils.dart b/pkg/http/test/utils.dart
index 3797bd1..051cbd4 100644
--- a/pkg/http/test/utils.dart
+++ b/pkg/http/test/utils.dart
@@ -8,7 +8,7 @@
 import 'dart:convert';
 import 'dart:io';
 
-import 'package:http/src/byte_stream.dart';
+import 'package:http/http.dart';
 import 'package:http/src/utils.dart';
 import 'package:unittest/unittest.dart';
 
@@ -54,6 +54,14 @@
         return;
       }
 
+      if (path == '/no-content-length') {
+        response.statusCode = 200;
+        response.contentLength = -1;
+        response.write('body');
+        response.close();
+        return;
+      }
+
       new ByteStream(request).toBytes().then((requestBodyBytes) {
         var outputEncoding;
         var encodingName = request.uri.queryParameters['response-encoding'];
@@ -166,17 +174,9 @@
   }
 }
 
-/// A matcher for HttpExceptions.
-const isHttpException = const _HttpException();
-
 /// A matcher for functions that throw HttpException.
-const Matcher throwsHttpException =
-    const Throws(isHttpException);
-
-class _HttpException extends TypeMatcher {
-  const _HttpException() : super("HttpException");
-  bool matches(item, Map matchState) => item is HttpException;
-}
+Matcher get throwsClientException =>
+    throwsA(new isInstanceOf<ClientException>());
 
 /// A matcher for RedirectLimitExceededExceptions.
 const isRedirectLimitExceededException =
diff --git a/pkg/json/LICENSE b/pkg/http_parser/LICENSE
similarity index 100%
copy from pkg/json/LICENSE
copy to pkg/http_parser/LICENSE
diff --git a/pkg/http_parser/README.md b/pkg/http_parser/README.md
new file mode 100644
index 0000000..edfa71a
--- /dev/null
+++ b/pkg/http_parser/README.md
@@ -0,0 +1,3 @@
+`http_parser` is a platform-independent package for parsing and serializing
+various HTTP-related formats. It's designed to be usable on both the browser and
+the server, and thus avoids referencing any types from `dart:io` or `dart:html`.
diff --git a/pkg/http_parser/lib/http_parser.dart b/pkg/http_parser/lib/http_parser.dart
new file mode 100644
index 0000000..3b876d0
--- /dev/null
+++ b/pkg/http_parser/lib/http_parser.dart
@@ -0,0 +1,155 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_parser;
+
+import 'package:string_scanner/string_scanner.dart';
+
+export 'src/media_type.dart';
+
+const _WEEKDAYS = const ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
+const _MONTHS = const ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
+    "Sep", "Oct", "Nov", "Dec"];
+
+final _shortWeekdayRegExp = new RegExp(r"Mon|Tue|Wed|Thu|Fri|Sat|Sun");
+final _longWeekdayRegExp =
+    new RegExp(r"Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday");
+final _monthRegExp =
+    new RegExp(r"Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec");
+final _digitRegExp = new RegExp(r"\d+");
+
+// TODO(nweiz): Move this into an http_parser package.
+/// Return a HTTP-formatted string representation of [date].
+///
+/// This follows [RFC 822](http://tools.ietf.org/html/rfc822) as updated by [RFC
+/// 1123](http://tools.ietf.org/html/rfc1123).
+String formatHttpDate(DateTime date) {
+  date = date.toUtc();
+  var buffer = new StringBuffer()
+      ..write(_WEEKDAYS[date.weekday - 1])
+      ..write(", ")
+      ..write(date.day.toString())
+      ..write(" ")
+      ..write(_MONTHS[date.month - 1])
+      ..write(" ")
+      ..write(date.year.toString())
+      ..write(date.hour < 9 ? " 0" : " ")
+      ..write(date.hour.toString())
+      ..write(date.minute < 9 ? ":0" : ":")
+      ..write(date.minute.toString())
+      ..write(date.second < 9 ? ":0" : ":")
+      ..write(date.second.toString())
+      ..write(" GMT");
+  return buffer.toString();
+}
+
+// TODO(nweiz): Move this into an http_parser package.
+/// Parses an HTTP-formatted date into a UTC [DateTime].
+///
+/// This follows [RFC
+/// 2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3). It will
+/// throw a [FormatException] if [date] is invalid.
+DateTime parseHttpDate(String date) {
+  try {
+    var scanner = new StringScanner(date);
+
+    if (scanner.scan(_longWeekdayRegExp)) {
+      // RFC 850 starts with a long weekday.
+      scanner.expect(", ");
+      var day = _parseInt(scanner, 2);
+      scanner.expect("-");
+      var month = _parseMonth(scanner);
+      scanner.expect("-");
+      var year = 1900 + _parseInt(scanner, 2);
+      scanner.expect(" ");
+      var time = _parseTime(scanner);
+      scanner.expect(" GMT");
+      scanner.expectDone();
+
+      return _makeDateTime(year, month, day, time);
+    }
+
+    // RFC 1123 and asctime both start with a short weekday.
+    scanner.expect(_shortWeekdayRegExp);
+    if (scanner.scan(", ")) {
+      // RFC 1123 follows the weekday with a comma.
+      var day = _parseInt(scanner, 2);
+      scanner.expect(" ");
+      var month = _parseMonth(scanner);
+      scanner.expect(" ");
+      var year = _parseInt(scanner, 4);
+      scanner.expect(" ");
+      var time = _parseTime(scanner);
+      scanner.expect(" GMT");
+      scanner.expectDone();
+
+      return _makeDateTime(year, month, day, time);
+    }
+
+    // asctime follows the weekday with a space.
+    scanner.expect(" ");
+    var month = _parseMonth(scanner);
+    scanner.expect(" ");
+    var day = scanner.scan(" ") ?
+        _parseInt(scanner, 1) :
+        _parseInt(scanner, 2);
+    scanner.expect(" ");
+    var time = _parseTime(scanner);
+    scanner.expect(" ");
+    var year = _parseInt(scanner, 4);
+    scanner.expectDone();
+
+    return _makeDateTime(year, month, day, time);
+  } on FormatException catch (error) {
+    throw new FormatException('Invalid HTTP date "$date": ${error.message}');
+  }
+}
+
+/// Parses a short-form month name to a form accepted by [DateTime].
+int _parseMonth(StringScanner scanner) {
+  scanner.expect(_monthRegExp);
+  // DateTime uses 1-indexed months.
+  return _MONTHS.indexOf(scanner.lastMatch[0]) + 1;
+}
+
+/// Parses an int an enforces that it has exactly [digits] digits.
+int _parseInt(StringScanner scanner, int digits) {
+  scanner.expect(_digitRegExp);
+  if (scanner.lastMatch[0].length != digits) {
+    scanner.error("expected a $digits-digit number.");
+  }
+
+  return int.parse(scanner.lastMatch[0]);
+}
+
+/// Parses an timestamp of the form "HH:MM:SS" on a 24-hour clock.
+DateTime _parseTime(StringScanner scanner) {
+  var hours = _parseInt(scanner, 2);
+  if (hours >= 24) scanner.error("hours may not be greater than 24.");
+  scanner.expect(':');
+
+  var minutes = _parseInt(scanner, 2);
+  if (minutes >= 60) scanner.error("minutes may not be greater than 60.");
+  scanner.expect(':');
+
+  var seconds = _parseInt(scanner, 2);
+  if (seconds >= 60) scanner.error("seconds may not be greater than 60.");
+
+  return new DateTime(1, 1, 1, hours, minutes, seconds);
+}
+
+/// Returns a UTC [DateTime] from the given components.
+///
+/// Validates that [day] is a valid day for [month]. If it's not, throws a
+/// [FormatException].
+DateTime _makeDateTime(int year, int month, int day, DateTime time) {
+  var dateTime = new DateTime.utc(
+      year, month, day, time.hour, time.minute, time.second);
+
+  // If [day] was too large, it will cause [month] to overflow.
+  if (dateTime.month != month) {
+    throw new FormatException("invalid day '$day' for month '$month'.");
+  }
+  return dateTime;
+}
diff --git a/pkg/http_parser/lib/src/media_type.dart b/pkg/http_parser/lib/src/media_type.dart
new file mode 100644
index 0000000..7a1ff23
--- /dev/null
+++ b/pkg/http_parser/lib/src/media_type.dart
@@ -0,0 +1,161 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library http_parser.media_type;
+
+import 'package:collection/collection.dart';
+import 'package:string_scanner/string_scanner.dart';
+
+// All of the following regular expressions come from section 2.2 of the HTTP
+// spec: http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html
+final _lws = new RegExp(r"(?:\r\n)?[ \t]+");
+final _token = new RegExp(r'[^()<>@,;:"\\/[\]?={} \t\x00-\x1F\x7F]+');
+final _quotedString = new RegExp(r'"(?:[^"\x00-\x1F\x7F]|\\.)*"');
+final _quotedPair = new RegExp(r'\\(.)');
+
+/// A regular expression matching any number of [_lws] productions in a row.
+final _whitespace = new RegExp("(?:${_lws.pattern})*");
+
+/// A regular expression matching a character that is not a valid HTTP token.
+final _nonToken = new RegExp(r'[()<>@,;:"\\/\[\]?={} \t\x00-\x1F\x7F]');
+
+/// A regular expression matching a character that needs to be backslash-escaped
+/// in a quoted string.
+final _escapedChar = new RegExp(r'["\x00-\x1F\x7F]');
+
+/// A class representing an HTTP media type, as used in Accept and Content-Type
+/// headers.
+///
+/// This is immutable; new instances can be created based on an old instance by
+/// calling [change].
+class MediaType {
+  /// The primary identifier of the MIME type.
+  final String type;
+
+  /// The secondary identifier of the MIME type.
+  final String subtype;
+
+  /// The parameters to the media type.
+  ///
+  /// This map is immutable.
+  final Map<String, String> parameters;
+
+  /// The media type's MIME type.
+  String get mimeType => "$type/$subtype";
+
+  /// Parses a media type.
+  ///
+  /// This will throw a FormatError if the media type is invalid.
+  factory MediaType.parse(String mediaType) {
+    // This parsing is based on sections 3.6 and 3.7 of the HTTP spec:
+    // http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html.
+    try {
+      var scanner = new StringScanner(mediaType);
+      scanner.scan(_whitespace);
+      scanner.expect(_token);
+      var type = scanner.lastMatch[0];
+      scanner.expect('/');
+      scanner.expect(_token);
+      var subtype = scanner.lastMatch[0];
+      scanner.scan(_whitespace);
+
+      var parameters = {};
+      while (scanner.scan(';')) {
+        scanner.scan(_whitespace);
+        scanner.expect(_token);
+        var attribute = scanner.lastMatch[0];
+        scanner.expect('=');
+
+        var value;
+        if (scanner.scan(_token)) {
+          value = scanner.lastMatch[0];
+        } else {
+          scanner.expect(_quotedString);
+          var quotedString = scanner.lastMatch[0];
+          value = quotedString.substring(1, quotedString.length - 1).
+              replaceAllMapped(_quotedPair, (match) => match[1]);
+        }
+
+        scanner.scan(_whitespace);
+        parameters[attribute] = value;
+      }
+
+      scanner.expectDone();
+      return new MediaType(type, subtype, parameters);
+    } on FormatException catch (error) {
+      throw new FormatException(
+          'Invalid media type "$mediaType": ${error.message}');
+    }
+  }
+
+  MediaType(this.type, this.subtype, [Map<String, String> parameters])
+      : this.parameters = new UnmodifiableMapView(
+          parameters == null ? {} : new Map.from(parameters));
+
+  /// Returns a copy of this [MediaType] with some fields altered.
+  ///
+  /// [type] and [subtype] alter the corresponding fields. [mimeType] is parsed
+  /// and alters both the [type] and [subtype] fields; it cannot be passed along
+  /// with [type] or [subtype].
+  ///
+  /// [parameters] overwrites and adds to the corresponding field. If
+  /// [clearParameters] is passed, it replaces the corresponding field entirely
+  /// instead.
+  MediaType change({String type, String subtype, String mimeType,
+      Map<String, String> parameters, bool clearParameters: false}) {
+    if (mimeType != null) {
+      if (type != null) {
+        throw new ArgumentError("You may not pass both [type] and [mimeType].");
+      } else if (subtype != null) {
+        throw new ArgumentError("You may not pass both [subtype] and "
+            "[mimeType].");
+      }
+
+      var segments = mimeType.split('/');
+      if (segments.length != 2) {
+        throw new FormatException('Invalid mime type "$mimeType".');
+      }
+
+      type = segments[0];
+      subtype = segments[1];
+    }
+
+    if (type == null) type = this.type;
+    if (subtype == null) subtype = this.subtype;
+    if (parameters == null) parameters = {};
+
+    if (!clearParameters) {
+      var newParameters = parameters;
+      parameters = new Map.from(this.parameters);
+      parameters.addAll(newParameters);
+    }
+
+    return new MediaType(type, subtype, parameters);
+  }
+
+  /// Converts the media type to a string.
+  ///
+  /// This will produce a valid HTTP media type.
+  String toString() {
+    var buffer = new StringBuffer()
+        ..write(type)
+        ..write("/")
+        ..write(subtype);
+
+    parameters.forEach((attribute, value) {
+      buffer.write("; $attribute=");
+      if (_nonToken.hasMatch(value)) {
+        buffer
+          ..write('"')
+          ..write(value.replaceAllMapped(
+              _escapedChar, (match) => "\\" + match[0]))
+          ..write('"');
+      } else {
+        buffer.write(value);
+      }
+    });
+
+    return buffer.toString();
+  }
+}
diff --git a/pkg/http_parser/pubspec.yaml b/pkg/http_parser/pubspec.yaml
new file mode 100644
index 0000000..1ace583
--- /dev/null
+++ b/pkg/http_parser/pubspec.yaml
@@ -0,0 +1,13 @@
+name: http_parser
+version: 0.0.1
+author: "Dart Team <misc@dartlang.org>"
+homepage: http://www.dartlang.org
+description: >
+  A platform-independent package for parsing and serializing HTTP formats.
+dependencies:
+  collection: ">=0.9.1 <0.10.0"
+  string_scanner: ">=0.0.0 <0.1.0"
+dev_dependencies:
+  unittest: ">=0.10.0 <0.11.0"
+environment:
+  sdk: ">=1.2.0 <2.0.0"
diff --git a/pkg/http_parser/test/http_date_test.dart b/pkg/http_parser/test/http_date_test.dart
new file mode 100644
index 0000000..680147a
--- /dev/null
+++ b/pkg/http_parser/test/http_date_test.dart
@@ -0,0 +1,315 @@
+// 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 http_parser.http_date_test;
+
+import 'package:http_parser/http_parser.dart';
+import 'package:unittest/unittest.dart';
+
+void main() {
+  group("parse", () {
+    group("RFC 1123", () {
+      test("parses the example date", () {
+        var date = parseHttpDate("Sun, 06 Nov 1994 08:49:37 GMT");
+        expect(date.day, equals(6));
+        expect(date.month, equals(DateTime.NOVEMBER));
+        expect(date.year, equals(1994));
+        expect(date.hour, equals(8));
+        expect(date.minute, equals(49));
+        expect(date.second, equals(37));
+        expect(date.timeZoneName, equals("UTC"));
+      });
+
+      test("whitespace is required", () {
+        expect(() => parseHttpDate("Sun,06 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 199408:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:49:37GMT"),
+            throwsFormatException);
+      });
+
+      test("exactly one space is required", () {
+        expect(() => parseHttpDate("Sun,  06 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06  Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov  1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994  08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:49:37  GMT"),
+            throwsFormatException);
+      });
+
+      test("requires precise number lengths", () {
+        expect(() => parseHttpDate("Sun, 6 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 8:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:9:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:49:7 GMT"),
+            throwsFormatException);
+      });
+
+      test("requires reasonable numbers", () {
+        expect(() => parseHttpDate("Sun, 00 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 31 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 32 Aug 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 24:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:60:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:49:60 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows short weekday names", () {
+        expect(() => parseHttpDate("Sunday, 6 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows short month names", () {
+        expect(() => parseHttpDate("Sun, 6 November 1994 08:49:37 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows GMT", () {
+        expect(() => parseHttpDate("Sun, 6 Nov 1994 08:49:37 PST"),
+            throwsFormatException);
+      });
+
+      test("disallows trailing whitespace", () {
+        expect(() => parseHttpDate("Sun, 6 Nov 1994 08:49:37 GMT "),
+            throwsFormatException);
+      });
+    });
+
+    group("RFC 850", () {
+      test("parses the example date", () {
+        var date = parseHttpDate("Sunday, 06-Nov-94 08:49:37 GMT");
+        expect(date.day, equals(6));
+        expect(date.month, equals(DateTime.NOVEMBER));
+        expect(date.year, equals(1994));
+        expect(date.hour, equals(8));
+        expect(date.minute, equals(49));
+        expect(date.second, equals(37));
+        expect(date.timeZoneName, equals("UTC"));
+      });
+
+      test("whitespace is required", () {
+        expect(() => parseHttpDate("Sunday,06-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-9408:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:49:37GMT"),
+            throwsFormatException);
+      });
+
+      test("exactly one space is required", () {
+        expect(() => parseHttpDate("Sunday,  06-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94  08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:49:37  GMT"),
+            throwsFormatException);
+      });
+
+      test("requires precise number lengths", () {
+        expect(() => parseHttpDate("Sunday, 6-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 8:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:9:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:49:7 GMT"),
+            throwsFormatException);
+      });
+
+      test("requires reasonable numbers", () {
+        expect(() => parseHttpDate("Sunday, 00-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 31-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 32-Aug-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 24:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:60:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:49:60 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows long weekday names", () {
+        expect(() => parseHttpDate("Sun, 6-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows short month names", () {
+        expect(() => parseHttpDate("Sunday, 6-November-94 08:49:37 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows GMT", () {
+        expect(() => parseHttpDate("Sunday, 6-Nov-94 08:49:37 PST"),
+            throwsFormatException);
+      });
+
+      test("disallows trailing whitespace", () {
+        expect(() => parseHttpDate("Sunday, 6-Nov-94 08:49:37 GMT "),
+            throwsFormatException);
+      });
+    });
+
+    group("asctime()", () {
+      test("parses the example date", () {
+        var date = parseHttpDate("Sun Nov  6 08:49:37 1994");
+        expect(date.day, equals(6));
+        expect(date.month, equals(DateTime.NOVEMBER));
+        expect(date.year, equals(1994));
+        expect(date.hour, equals(8));
+        expect(date.minute, equals(49));
+        expect(date.second, equals(37));
+        expect(date.timeZoneName, equals("UTC"));
+      });
+
+      test("parses a date with a two-digit day", () {
+        var date = parseHttpDate("Sun Nov 16 08:49:37 1994");
+        expect(date.day, equals(16));
+        expect(date.month, equals(DateTime.NOVEMBER));
+        expect(date.year, equals(1994));
+        expect(date.hour, equals(8));
+        expect(date.minute, equals(49));
+        expect(date.second, equals(37));
+        expect(date.timeZoneName, equals("UTC"));
+      });
+
+      test("whitespace is required", () {
+        expect(() => parseHttpDate("SunNov  6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  608:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:371994"),
+            throwsFormatException);
+      });
+
+      test("the right amount of whitespace is required", () {
+        expect(() => parseHttpDate("Sun  Nov  6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov   6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov 6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6  08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:37  1994"),
+            throwsFormatException);
+      });
+
+      test("requires precise number lengths", () {
+        expect(() => parseHttpDate("Sun Nov 016 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 8:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:9:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:7 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:37 94"),
+            throwsFormatException);
+      });
+
+      test("requires reasonable numbers", () {
+        expect(() => parseHttpDate("Sun Nov 0 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov 31 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Aug 32 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 24:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:60:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:60 1994"),
+            throwsFormatException);
+      });
+
+      test("only allows short weekday names", () {
+        expect(() => parseHttpDate("Sunday Nov 0 08:49:37 1994"),
+            throwsFormatException);
+      });
+
+      test("only allows short month names", () {
+        expect(() => parseHttpDate("Sun November 0 08:49:37 1994"),
+            throwsFormatException);
+      });
+
+      test("disallows trailing whitespace", () {
+        expect(() => parseHttpDate("Sun November 0 08:49:37 1994 "),
+            throwsFormatException);
+      });
+    });
+  });
+}
diff --git a/pkg/http_parser/test/media_type_test.dart b/pkg/http_parser/test/media_type_test.dart
new file mode 100644
index 0000000..14affbb
--- /dev/null
+++ b/pkg/http_parser/test/media_type_test.dart
@@ -0,0 +1,163 @@
+// 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 http_parser.media_type_test;
+
+import 'package:http_parser/http_parser.dart';
+import 'package:unittest/unittest.dart';
+
+void main() {
+  group("parse", () {
+    test("parses a simple MIME type", () {
+      var type = new MediaType.parse("text/plain");
+      expect(type.type, equals("text"));
+      expect(type.subtype, equals("plain"));
+    });
+
+    test("allows leading whitespace", () {
+      expect(new MediaType.parse(" text/plain").mimeType, equals("text/plain"));
+      expect(new MediaType.parse("\ttext/plain").mimeType,
+          equals("text/plain"));
+    });
+
+    test("allows trailing whitespace", () {
+      expect(new MediaType.parse("text/plain ").mimeType, equals("text/plain"));
+      expect(new MediaType.parse("text/plain\t").mimeType,
+          equals("text/plain"));
+    });
+
+    test("disallows separators in the MIME type", () {
+      expect(() => new MediaType.parse("te(xt/plain"), throwsFormatException);
+      expect(() => new MediaType.parse("text/pla=in"), throwsFormatException);
+    });
+
+    test("disallows whitespace around the slash", () {
+      expect(() => new MediaType.parse("text /plain"), throwsFormatException);
+      expect(() => new MediaType.parse("text/ plain"), throwsFormatException);
+    });
+
+    test("parses parameters", () {
+      var type = new MediaType.parse("text/plain;foo=bar;baz=bang");
+      expect(type.mimeType, equals("text/plain"));
+      expect(type.parameters, equals({"foo": "bar", "baz": "bang"}));
+    });
+
+    test("allows whitespace around the semicolon", () {
+      var type = new MediaType.parse("text/plain ; foo=bar ; baz=bang");
+      expect(type.mimeType, equals("text/plain"));
+      expect(type.parameters, equals({"foo": "bar", "baz": "bang"}));
+    });
+
+    test("disallows whitespace around the equals", () {
+      expect(() => new MediaType.parse("text/plain; foo =bar"),
+          throwsFormatException);
+      expect(() => new MediaType.parse("text/plain; foo= bar"),
+          throwsFormatException);
+    });
+
+    test("disallows separators in the parameters", () {
+      expect(() => new MediaType.parse("text/plain; fo:o=bar"),
+          throwsFormatException);
+      expect(() => new MediaType.parse("text/plain; foo=b@ar"),
+          throwsFormatException);
+    });
+
+    test("parses quoted parameters", () {
+      var type = new MediaType.parse(
+          'text/plain; foo="bar space"; baz="bang\\\\escape"');
+      expect(type.mimeType, equals("text/plain"));
+      expect(type.parameters, equals({
+        "foo": "bar space",
+        "baz": "bang\\escape"
+      }));
+    });
+  });
+
+  group("change", () {
+    var type;
+    setUp(() {
+      type = new MediaType.parse("text/plain; foo=bar; baz=bang");
+    });
+
+    test("uses the existing fields by default", () {
+      var newType = type.change();
+      expect(newType.type, equals("text"));
+      expect(newType.subtype, equals("plain"));
+      expect(newType.parameters, equals({"foo": "bar", "baz": "bang"}));
+    });
+
+    test("[type] overrides the existing type", () {
+      expect(type.change(type: "new").type, equals("new"));
+    });
+
+    test("[subtype] overrides the existing subtype", () {
+      expect(type.change(subtype: "new").subtype, equals("new"));
+    });
+
+    test("[mimeType] overrides the existing type and subtype", () {
+      var newType = type.change(mimeType: "image/png");
+      expect(newType.type, equals("image"));
+      expect(newType.subtype, equals("png"));
+    });
+
+    test("[parameters] overrides and adds to existing parameters", () {
+      expect(type.change(parameters: {
+        "foo": "zap",
+        "qux": "fblthp"
+      }).parameters, equals({
+        "foo": "zap",
+        "baz": "bang",
+        "qux": "fblthp"
+      }));
+    });
+
+    test("[clearParameters] removes existing parameters", () {
+      expect(type.change(clearParameters: true).parameters, isEmpty);
+    });
+
+    test("[clearParameters] with [parameters] removes before adding", () {
+      var newType = type.change(
+          parameters: {"foo": "zap"},
+          clearParameters: true);
+      expect(newType.parameters, equals({"foo": "zap"}));
+    });
+
+    test("[type] with [mimeType] is illegal", () {
+      expect(() => type.change(type: "new", mimeType: "image/png"),
+          throwsArgumentError);
+    });
+
+    test("[subtype] with [mimeType] is illegal", () {
+      expect(() => type.change(subtype: "new", mimeType: "image/png"),
+          throwsArgumentError);
+    });
+  });
+
+  group("toString", () {
+    test("serializes a simple MIME type", () {
+      expect(new MediaType("text", "plain").toString(), equals("text/plain"));
+    });
+
+    test("serializes a token parameter as a token", () {
+      expect(new MediaType("text", "plain", {"foo": "bar"}).toString(),
+          equals("text/plain; foo=bar"));
+    });
+
+    test("serializes a non-token parameter as a quoted string", () {
+      expect(new MediaType("text", "plain", {"foo": "bar baz"}).toString(),
+          equals('text/plain; foo="bar baz"'));
+    });
+
+    test("escapes a quoted string as necessary", () {
+      expect(new MediaType("text", "plain", {"foo": 'bar"\x7Fbaz'}).toString(),
+          equals('text/plain; foo="bar\\"\\\x7Fbaz"'));
+    });
+
+    test("serializes multiple parameters", () {
+      expect(new MediaType("text", "plain", {
+        "foo": "bar", "baz": "bang"
+      }).toString(), equals("text/plain; foo=bar; baz=bang"));
+    });
+  });
+}
diff --git a/pkg/http_server/lib/src/virtual_directory.dart b/pkg/http_server/lib/src/virtual_directory.dart
index 6eef0b4..98dd963 100644
--- a/pkg/http_server/lib/src/virtual_directory.dart
+++ b/pkg/http_server/lib/src/virtual_directory.dart
@@ -255,16 +255,17 @@
       }
 
       response.headers.set(HttpHeaders.LAST_MODIFIED, stats.modified);
-      var path = request.uri.path;
+      var path = Uri.decodeComponent(request.uri.path);
+      var encodedPath = new HtmlEscape().convert(path);
       var header =
 '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<title>Index of $path</title>
+<title>Index of $encodedPath</title>
 </head>
 <body>
-<h1>Index of $path</h1>
+<h1>Index of $encodedPath</h1>
 <table>
   <tr>
     <td>Name</td>
@@ -284,16 +285,25 @@
       response.write(header);
 
       void add(String name, String modified, var size) {
+        try {
         if (size == null) size = "-";
         if (modified == null) modified = "";
-        var p = normalize(join(path, name));
+        var encodedSize = new HtmlEscape().convert(size.toString());
+        var encodedModified = new HtmlEscape().convert(modified);
+        var encodedLink = new HtmlEscape(HtmlEscapeMode.ATTRIBUTE)
+            .convert(Uri.encodeComponent(normalize(join(path, name))));
+        var encodedName = new HtmlEscape().convert(name);
+
         var entry =
 '''  <tr>
-    <td><a href="$p">$name</a></td>
-    <td>$modified</td>
-    <td style="text-align: right">$size</td>
+    <td><a href="$encodedLink">$encodedName</a></td>
+    <td>$encodedModified</td>
+    <td style="text-align: right">$encodedSize</td>
   </tr>''';
         response.write(entry);
+        } catch (e) {
+          print(e);
+        }
       }
 
       if (path != '/') {
@@ -331,8 +341,10 @@
       return;
     }
     // Default error page.
-    var path = request.uri.path;
-    var reason = response.reasonPhrase;
+    var path = Uri.decodeComponent(request.uri.path);
+    var encodedPath = new HtmlEscape().convert(path);
+    var encodedReason = new HtmlEscape().convert(response.reasonPhrase);
+    var encodedError = new HtmlEscape().convert(error.toString());
 
     var server = response.headers.value(HttpHeaders.SERVER);
     if (server == null) server = "";
@@ -341,10 +353,10 @@
 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<title>$reason: $path</title>
+<title>$encodedReason: $encodedPath</title>
 </head>
 <body>
-<h1>Error $error at \'$path\': $reason</h1>
+<h1>Error $encodedError at \'$encodedPath\': $encodedReason</h1>
 $server
 </body>
 </html>''';
diff --git a/pkg/http_server/pubspec.yaml b/pkg/http_server/pubspec.yaml
index 6511e98..e2825d2 100644
--- a/pkg/http_server/pubspec.yaml
+++ b/pkg/http_server/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http_server
-version: 0.9.2-dev
+version: 0.9.2
 author: Dart Team <misc@dartlang.org>
 description: Library of HTTP server classes.
 homepage: http://www.dartlang.org
@@ -8,6 +8,6 @@
   mime: ">=0.9.0 <0.10.0"
   path: ">=0.9.0 <2.0.0"
 dev_dependencies:
-  unittest: ">=0.9.0 <0.10.0"
+  unittest: ">=0.10.0 <0.12.0"
 environment:
   sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/http_server/test/virtual_directory_test.dart b/pkg/http_server/test/virtual_directory_test.dart
index 7be2a12..97c7332 100644
--- a/pkg/http_server/test/virtual_directory_test.dart
+++ b/pkg/http_server/test/virtual_directory_test.dart
@@ -99,7 +99,7 @@
 
         return getAsString(virDir, '/')
           .then((result) {
-            expect(result, contains('Index of /'));
+            expect(result, contains('Index of &#x2F'));
           });
       });
 
@@ -112,7 +112,7 @@
 
         return getAsString(virDir, '/')
           .then((result) {
-            expect(result, contains('Index of /'));
+            expect(result, contains('Index of &#x2F'));
           });
       });
 
@@ -125,7 +125,18 @@
 
         return getAsString(virDir, '/')
           .then((result) {
-            expect(result, contains('Index of /'));
+            expect(result, contains('Index of &#x2F'));
+          });
+      });
+
+      testVirtualDir('encoded-dir', (dir) {
+        var virDir = new VirtualDirectory(dir.path);
+        new Directory('${dir.path}/alert(\'hacked!\');').createSync();
+        virDir.allowDirectoryListing = true;
+
+        return getAsString(virDir, '/alert(\'hacked!\');')
+          .then((result) {
+            expect(result, contains('&#x2F;alert(&#x27;hacked!&#x27;);&#x2F;'));
           });
       });
 
@@ -137,21 +148,45 @@
 
           return Future.wait([
               getAsString(virDir, '/').then(
-                  (s) => s.contains('recursive/')),
+                  (s) => s.contains('recursive&#x2F;')),
               getAsString(virDir, '/').then(
                   (s) => !s.contains('../')),
               getAsString(virDir, '/').then(
-                  (s) => s.contains('Index of /')),
+                  (s) => s.contains('Index of &#x2F;')),
               getAsString(virDir, '/recursive').then(
-                  (s) => s.contains('recursive/')),
+                  (s) => s.contains('recursive&#x2F;')),
               getAsString(virDir, '/recursive').then(
-                  (s) => s.contains('../')),
+                  (s) => s.contains('..&#x2F;')),
               getAsString(virDir, '/recursive').then(
-                  (s) => s.contains('Index of /recursive'))])
+                  (s) => s.contains('Index of &#x2F;recursive'))])
             .then((result) {
               expect(result, equals([true, true, true, true, true, true]));
             });
         });
+
+        testVirtualDir('encoded-path', (dir) {
+          var virDir = new VirtualDirectory(dir.path);
+          new Directory('${dir.path}/javascript:alert(document);"')
+              .createSync();
+          virDir.allowDirectoryListing = true;
+
+          return getAsString(virDir, '/')
+            .then((result) {
+              expect(result, contains('%2Fjavascript%3Aalert(document)%3B%22'));
+            });
+        });
+
+        testVirtualDir('encoded-special', (dir) {
+          var virDir = new VirtualDirectory(dir.path);
+          new Directory('${dir.path}/<>&"').createSync();
+          virDir.allowDirectoryListing = true;
+
+          return getAsString(virDir, '/')
+            .then((result) {
+              expect(result, contains('&lt;&gt;&amp;&quot;&#x2F;'));
+              expect(result, contains('href="%2F%3C%3E%26%22"'));
+            });
+        });
       }
     });
 
@@ -193,9 +228,9 @@
         var virDir = new VirtualDirectory(dir.path);
         virDir.allowDirectoryListing = true;
 
-        virDir.directoryHandler = protectAsync2((dir2, request) {
+        virDir.directoryHandler = (dir2, request) {
           fail('not expected');
-        });
+        };
 
         return getStatusCodeForVirtDir(virDir, '/dir', followRedirects: false)
           .then((result) {
diff --git a/pkg/intl/CHANGELOG.md b/pkg/intl/CHANGELOG.md
new file mode 100644
index 0000000..8baf4c7
--- /dev/null
+++ b/pkg/intl/CHANGELOG.md
@@ -0,0 +1,11 @@
+## 0.9.8
+
+* Add a "meaning" optional parameter for Intl.message to distinguish between
+  two messages with identical text.
+
+* Handle two different messages with the same text.
+
+* Allow complex string literals in arguments (e.g. multi-line)
+
+
+
diff --git a/pkg/intl/lib/number_format.dart b/pkg/intl/lib/number_format.dart
index 72f3154..5750f4e 100644
--- a/pkg/intl/lib/number_format.dart
+++ b/pkg/intl/lib/number_format.dart
@@ -82,7 +82,7 @@
    * of formatting then there will only ever be one number being formatted
    * at a time. In languages with threads we'd need to pass this on the stack.
    */
-  StringBuffer _buffer;
+  final StringBuffer _buffer = new StringBuffer();
 
   /**
    * Create a number format that prints using [newPattern] as it applies in
@@ -146,13 +146,12 @@
     if (number.isNaN) return symbols.NAN;
     if (number.isInfinite) return "${_signPrefix(number)}${symbols.INFINITY}";
 
-    _newBuffer();
     _add(_signPrefix(number));
     _formatNumber(number.abs() * _multiplier);
     _add(_signSuffix(number));
 
     var result = _buffer.toString();
-    _buffer = null;
+    _buffer.clear();
     return result;
   }
 
@@ -250,13 +249,12 @@
     // If the int part is larger than 2^52 and we're on Javascript (so it's
     // really a float) it will lose precision, so pad out the rest of it
     // with zeros. Check for Javascript by seeing if an integer is double.
-    var paddingDigits = new StringBuffer();
+    var paddingDigits = '';
     if (1 is double && intValue > _maxInt) {
         var howManyDigitsTooBig = (log(intValue) / LN10).ceil() - 16;
         var divisor = pow(10, howManyDigitsTooBig).round();
-        for (var each in new List(howManyDigitsTooBig.toInt())) {
-          paddingDigits.write(symbols.ZERO_DIGIT);
-        }
+        paddingDigits = symbols.ZERO_DIGIT * howManyDigitsTooBig.toInt();
+
         intValue = (intValue / divisor).truncate();
     }
     var integerDigits = "${intValue}${paddingDigits}".codeUnits;
@@ -307,12 +305,6 @@
   bool _hasPrintableIntegerPart(int intValue) =>
       intValue > 0 || minimumIntegerDigits > 0;
 
-  /**
-   * Create a new empty buffer. See comment on [_buffer] variable for why
-   * we have it as an instance variable rather than passing it on the stack.
-   */
-  void _newBuffer() { _buffer = new StringBuffer(); }
-
   /** A group of methods that provide support for writing digits and other
    * required characters into [_buffer] easily.
    */
@@ -447,8 +439,10 @@
     }
   }
 
-  /** Variable used in parsing prefixes and suffixes to keep track of
-   * whether or not we are in a quoted region. */
+  /**
+   * Variable used in parsing prefixes and suffixes to keep track of
+   * whether or not we are in a quoted region.
+   */
   bool inQuote = false;
 
   /**
@@ -516,28 +510,21 @@
   }
 
   /** Variables used in [_parseTrunk] and [parseTrunkCharacter]. */
-  var decimalPos;
-  var digitLeftCount;
-  var zeroDigitCount;
-  var digitRightCount;
-  var groupingCount;
-  var trunk;
+  var decimalPos = -1;
+  var digitLeftCount = 0;
+  var zeroDigitCount = 0;
+  var digitRightCount = 0;
+  var groupingCount = -1;
 
   /**
    * Parse the "trunk" portion of the pattern, the piece that doesn't include
    * positive or negative prefixes or suffixes.
    */
   String _parseTrunk() {
-    decimalPos = -1;
-    digitLeftCount = 0;
-    zeroDigitCount = 0;
-    digitRightCount = 0;
-    groupingCount = -1;
-
     var loop = true;
-    trunk = new StringBuffer();
+    var trunk = new StringBuffer();
     while (pattern.current != null && loop) {
-      loop = parseTrunkCharacter();
+      loop = parseTrunkCharacter(trunk);
     }
 
     if (zeroDigitCount == 0 && digitLeftCount > 0 && decimalPos >= 0) {
@@ -596,7 +583,7 @@
    * continue to look for additional trunk characters or false if we have
    * reached the end.
    */
-  bool parseTrunkCharacter() {
+  bool parseTrunkCharacter(trunk) {
     var ch = pattern.current;
     switch (ch) {
       case _PATTERN_DIGIT:
@@ -697,12 +684,29 @@
  */
 class _StringIterator implements Iterator<String> {
   final String input;
-  int index = -1;
-  inBounds(i) => i >= 0 && i < input.length;
-  _StringIterator(this.input);
-  String get current => inBounds(index) ? input[index] : null;
+  int nextIndex = 0;
+  String _current = null;
 
-  bool moveNext() => inBounds(++index);
-  String get peek => inBounds(index + 1) ? input[index + 1] : null;
+  _StringIterator(input) : input = _validate(input);
+
+  String get current => _current;
+
+  bool moveNext() {
+    if (nextIndex >= input.length) {
+      _current = null;
+      return false;
+    }
+    _current = input[nextIndex++];
+    return true;
+  }
+
+  String get peek => nextIndex >= input.length ? null : input[nextIndex];
+
   Iterator<String> get iterator => this;
+
+  static String _validate(input) {
+    if (input is! String) throw new ArgumentError(input);
+    return input;
+  }
+
 }
diff --git a/pkg/intl/lib/src/date_format_field.dart b/pkg/intl/lib/src/date_format_field.dart
index bf8f810..47a9d7b 100644
--- a/pkg/intl/lib/src/date_format_field.dart
+++ b/pkg/intl/lib/src/date_format_field.dart
@@ -195,7 +195,7 @@
     if (year < 0) {
       year = -year;
     }
-    return width == 2 ? padTo(2, year % 100) : year.toString();
+    return width == 2 ? padTo(2, year % 100) : padTo(width, year);
   }
 
   /**
diff --git a/pkg/intl/pubspec.yaml b/pkg/intl/pubspec.yaml
index 5ed556a..de44ae6 100644
--- a/pkg/intl/pubspec.yaml
+++ b/pkg/intl/pubspec.yaml
@@ -1,14 +1,14 @@
 name: intl
-version: 0.9.6
+version: 0.9.8
 author: Dart Team <misc@dartlang.org>
 description: Contains code to deal with internationalized/localized messages, date and number formatting and parsing, bi-directional text, and other internationalization issues.
 homepage: http://www.dartlang.org
+environment:
+  sdk: '>=1.0.0 <2.0.0'
 documentation: http://api.dartlang.org/docs/pkg/intl
 dependencies:
-  analyzer: "0.13.0-dev.6"
-  path: ">=0.9.0 <2.0.0"
+  analyzer: '>=0.13.2 <0.14.0'
+  path: '>=0.9.0 <2.0.0'
 dev_dependencies:
-  serialization: ">=0.9.0 <0.10.0"
-  unittest: ">=0.9.0 <0.11.0"
-environment:
-  sdk: ">=1.0.0 <2.0.0"
+  serialization: '>=0.9.0 <0.10.0'
+  unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/intl/test/date_time_format_http_request_test.dart b/pkg/intl/test/date_time_format_http_request_test.dart
index 26bd476..4e7fa5c 100644
--- a/pkg/intl/test/date_time_format_http_request_test.dart
+++ b/pkg/intl/test/date_time_format_http_request_test.dart
@@ -21,7 +21,7 @@
     "/root_dart/pkg/intl/lib/src/data/dates/";
 
    test("Initializing a locale that needs fallback", () {
-     initializeDateFormatting("de_DE", url).then(expectAsync1((_) => true));
+     initializeDateFormatting("de_DE", url).then(expectAsync((_) => true));
    });
 
   runWith(smallSetOfLocales, url, initializeDateFormatting);
diff --git a/pkg/intl/test/date_time_format_test_core.dart b/pkg/intl/test/date_time_format_test_core.dart
index 989b264..ea7cfca 100644
--- a/pkg/intl/test/date_time_format_test_core.dart
+++ b/pkg/intl/test/date_time_format_test_core.dart
@@ -372,6 +372,12 @@
     expect(local.hour, equals(parsed.hour));
     });
 
+  test('Test 0-padding', () {
+    var someDate = new DateTime(123, 1, 2, 3, 4, 5);
+    var format = new DateFormat('yyyy-MM-dd HH:mm:ss');
+    expect(format.format(someDate), '0123-01-02 03:04:05');
+  });
+
   test('Test default format', () {
     var someDate = new DateTime(2012, 1, 27, 20, 58, 59, 1);
     var emptyFormat = new DateFormat(null, "en_US");
@@ -446,4 +452,4 @@
     expect(basic, basicAgain);
     expect(first.month, 7);
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/intl/test/find_default_locale_browser_test.dart b/pkg/intl/test/find_default_locale_browser_test.dart
index 1cc177eb..f00b4c8 100644
--- a/pkg/intl/test/find_default_locale_browser_test.dart
+++ b/pkg/intl/test/find_default_locale_browser_test.dart
@@ -14,7 +14,7 @@
     // should find a way to force the system locale before the test is run
     // and then verify that it's actually the correct value.
     Intl.systemLocale = 'xx_YY';
-    var callback = expectAsync1(verifyLocale);
+    var callback = expectAsync(verifyLocale);
     findSystemLocale().then(callback);
   });
 }
diff --git a/pkg/intl/test/find_default_locale_standalone_test.dart b/pkg/intl/test/find_default_locale_standalone_test.dart
index f0df693..a89f8ad 100644
--- a/pkg/intl/test/find_default_locale_standalone_test.dart
+++ b/pkg/intl/test/find_default_locale_standalone_test.dart
@@ -15,7 +15,7 @@
     // and then verify that it's actually the correct value.
     // We have no way of getting this reliably for Windows, so it will fail.
     Intl.systemLocale = "xx_YY";
-    var callback = expectAsync1(verifyLocale);
+    var callback = expectAsync(verifyLocale);
     findSystemLocale().then(callback);
   });
 }
diff --git a/pkg/intl/test/intl_message_basic_example_test.dart b/pkg/intl/test/intl_message_basic_example_test.dart
index 249776c..9a16571 100644
--- a/pkg/intl/test/intl_message_basic_example_test.dart
+++ b/pkg/intl/test/intl_message_basic_example_test.dart
@@ -24,10 +24,10 @@
 
   test('Verify basic example printing localized messages', () {
     runAllTests(_) {
-      setup(expectAsync1(runProgram), addToList);
+      setup(expectAsync(runProgram), addToList);
     }
-    setup(expectAsync1(runAllTests), addToList);
-    waitForIt.future.then(expectAsync1((_) {
+    setup(expectAsync(runAllTests), addToList);
+    waitForIt.future.then(expectAsync((_) {
       expect(list[0], "Ran at 00:00:00 on Thursday, January 1, 1970");
       expect(list[1], "Ausgedruckt am 00:00:00 am Donnerstag, 1. Januar 1970.");
       expect(list[2], "วิ่ง 0:00:00 on วันพฤหัสบดี 1 มกราคม 1970.");
diff --git a/pkg/intl/test/message_extraction/failed_extraction_test.dart b/pkg/intl/test/message_extraction/failed_extraction_test.dart
index 38361b8..9a02062 100644
--- a/pkg/intl/test/message_extraction/failed_extraction_test.dart
+++ b/pkg/intl/test/message_extraction/failed_extraction_test.dart
@@ -1,16 +1,39 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+library failed_extraction_test;
+
 import "message_extraction_test.dart";
 import "dart:io";
 import "package:unittest/unittest.dart";
 
 main() {
-  run(null, ["extract_to_json.dart",
-      "sample_with_messages.dart", "part_of_sample_with_messages.dart"])
-    .then((ProcessResult result) {
-      expect(result.exitCode, 0);
+  test("Expect warnings but successful extraction", () {
+    runTestWithWarnings(warningsAreErrors: false, expectedExitCode: 0);
   });
-  run(null, ["extract_to_json.dart", "--warnings-are-errors",
-      "sample_with_messages.dart", "part_of_sample_with_messages.dart"])
-    .then((ProcessResult result) {
-      expect(result.exitCode, 1);
-    });
-}
\ No newline at end of file
+}
+
+void runTestWithWarnings({bool warningsAreErrors, int expectedExitCode}) {
+
+  void verify(ProcessResult result) {
+    try {
+      expect(result.exitCode, expectedExitCode);
+    } finally {
+      deleteGeneratedFiles();
+    }
+  }
+
+  copyFilesToTempDirectory();
+  var program = asTestDirPath("extract_to_json.dart");
+  var args = ["--output-dir=$tempDir"];
+  if (warningsAreErrors) {
+    args.add('--warnings-are-errors');
+  }
+  var files = [asTempDirPath("sample_with_messages.dart"), asTempDirPath(
+      "part_of_sample_with_messages.dart"),];
+  var allArgs = [program]
+      ..addAll(args)
+      ..addAll(files);
+  var callback = expectAsync(verify);
+  run(null, allArgs).then(callback);
+}
diff --git a/pkg/intl/test/message_extraction/foo_messages_all.dart b/pkg/intl/test/message_extraction/foo_messages_all.dart
index 4cd228e..06b482e 100644
--- a/pkg/intl/test/message_extraction/foo_messages_all.dart
+++ b/pkg/intl/test/message_extraction/foo_messages_all.dart
@@ -1,41 +1,9 @@
-/**
- * DO NOT EDIT. This is code generated via pkg/intl/generate_localized.dart
- * This is a library that looks up messages for specific locales by
- * delegating to the appropriate library.
- */
+// 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 messages_all;
+library keep_the_static_analysis_from_complaining;
 
-import 'dart:async';
-import 'package:intl/message_lookup_by_library.dart';
-import 'package:intl/src/intl_helpers.dart';
-import 'package:intl/intl.dart';
-
-import 'foo_messages_de_DE.dart' as messages_de_DE;
-import 'foo_messages_fr.dart' as messages_fr;
-
-
-MessageLookupByLibrary _findExact(localeName) {
-  switch (localeName) {
-    case 'de_DE' : return messages_de_DE.messages;
-    case 'fr' : return messages_fr.messages;
-    default: return null;
-  }
-}
-
-/** User programs should call this before using [localeName] for messages.*/
-Future initializeMessages(String localeName) {
-  initializeInternalMessageLookup(() => new CompositeMessageLookup());
-  messageLookup.addLocale(localeName, _findGeneratedMessagesFor);
-  // TODO(alanknight): Restore once Issue 12824 is fixed.
-  // var lib = deferredLibraries[localeName];
-  // return lib == null ? new Future.value(false) : lib.load();
-  return new Future.value(true);
-}
-
-MessageLookupByLibrary _findGeneratedMessagesFor(locale) {
-  var actualLocale = Intl.verifiedLocale(locale, (x) => _findExact(x) != null,
-      onFailure: (_) => null);
-  if (actualLocale == null) return null;
-  return _findExact(actualLocale);
-}
+initializeMessages(_) => throw new UnimplementedError(
+    "This entire file is only here to make the static"
+    " analysis happy. It will be generated during actual tests.");
diff --git a/pkg/intl/test/message_extraction/foo_messages_de_DE.dart b/pkg/intl/test/message_extraction/foo_messages_de_DE.dart
deleted file mode 100644
index f4c55ed..0000000
--- a/pkg/intl/test/message_extraction/foo_messages_de_DE.dart
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * DO NOT EDIT. This is code generated via pkg/intl/generate_localized.dart
- * This is a library that provides messages for a de_DE locale. All the
- * messages from the main program should be duplicated here with the same
- * function name.
- */
-
-library messages_de_DE;
-import 'package:intl/intl.dart';
-import 'package:intl/message_lookup_by_library.dart';
-
-final messages = new MessageLookup();
-
-class MessageLookup extends MessageLookupByLibrary {
-
-  get localeName => 'de_DE';
-  static alwaysTranslated() => "Diese Zeichenkette wird immer übersetzt";
-
-  static differentNameSameContents() => "Hallo Welt";
-
-  static escapable() => "Escapes: \n\r\f\b\t\v.";
-
-  static leadingQuotes() => "\"Sogenannt\"";
-
-  static message1() => "Dies ist eine Nachricht";
-
-  static message2(x) => "Eine weitere Meldung mit dem Parameter $x";
-
-  static message3(a, b, c) => "Zeichen, die Flucht benötigen, zB Schrägstriche \\ Dollar \${ (geschweiften Klammern sind ok) und xml reservierte Zeichen <& und Zitate \" Parameter $a, $b und $c";
-
-  static method() => "Dies ergibt sich aus einer Methode";
-
-  static multiLine() => "Dieser String erstreckt sich über mehrere Zeilen erstrecken.";
-
-  static nestedMessage(names, number, combinedGender, place) => "${Intl.gender(combinedGender, female: '${Intl.plural(number, one: '$names ging in dem $place', other: '$names gingen zum $place')}', other: '${Intl.plural(number, zero: 'Niemand ging zu $place', one: '${names} ging zum $place', other: '${names} gingen zum $place')}')}";
-
-  static nestedOuter(number, gen) => "${Intl.plural(number, other: '${Intl.gender(gen, male: '$number Mann', other: '$number andere')}')}";
-
-  static nestedSelect(currency, amount) => "${Intl.select(currency, {'CDN': '${Intl.plural(amount, one: '$amount Kanadischer dollar', other: '$amount Kanadischen dollar')}', 'other': 'whatever', })}";
-
-  static nonLambda() => "Diese Methode ist nicht eine Lambda";
-
-  static originalNotInBMP() => "Antike griechische Galgenmännchen Zeichen: 𐅆𐅇";
-
-  static outerGender(g) => "${Intl.gender(g, female: 'Frau', male: 'Mann', other: 'andere')}";
-
-  static outerPlural(n) => "${Intl.plural(n, zero: 'Null', one: 'ein', other: 'einige')}";
-
-  static outerSelect(currency, amount) => "${Intl.select(currency, {'CDN': '$amount Kanadischen dollar', 'other': '$amount einige Währung oder anderen.', })}";
-
-  static pluralThatFailsParsing(noOfThings) => "${Intl.plural(noOfThings, one: 'eins:', other: '$noOfThings Dinge:')}";
-
-  static plurals(num) => "${Intl.plural(num, zero: 'Ist Null Plural?', one: 'Dies ist einmalig', other: 'Dies ist Plural ($num).')}";
-
-  static sameContentsDifferentName() => "Hallo Welt";
-
-  static rentAsVerb() => "mieten";
-
-  static rentToBePaid() => "Miete";
-
-  static staticMessage() => "Dies ergibt sich aus einer statischen Methode";
-
-  static trickyInterpolation(s) => "Interpolation ist schwierig, wenn es einen Satz wie dieser endet ${s}.";
-
-  static types(a, b, c) => "$a, $b, $c";
-
-  static whereTheyWentMessage(name, gender, place) => "${Intl.gender(gender, female: '${name} ging zu ihrem ${place}', male: '${name} ging zu seinem ${place}', other: '${name} ging zu seinem ${place}')}";
-
-
-  final messages = const {
-    "alwaysTranslated" : alwaysTranslated,
-    "differentNameSameContents" : differentNameSameContents,
-    "escapable" : escapable,
-    "leadingQuotes" : leadingQuotes,
-    "message1" : message1,
-    "message2" : message2,
-    "message3" : message3,
-    "method" : method,
-    "multiLine" : multiLine,
-    "nestedMessage" : nestedMessage,
-    "nestedOuter" : nestedOuter,
-    "nestedSelect" : nestedSelect,
-    "nonLambda" : nonLambda,
-    "originalNotInBMP" : originalNotInBMP,
-    "outerGender" : outerGender,
-    "outerPlural" : outerPlural,
-    "outerSelect" : outerSelect,
-    "pluralThatFailsParsing" : pluralThatFailsParsing,
-    "plurals" : plurals,
-    "sameContentsDifferentName" : sameContentsDifferentName,
-    "rentAsVerb" : rentAsVerb,
-    "rentToBePaid" : rentToBePaid,
-    "staticMessage" : staticMessage,
-    "trickyInterpolation" : trickyInterpolation,
-    "types" : types,
-    "whereTheyWentMessage" : whereTheyWentMessage
-  };
-}
\ No newline at end of file
diff --git a/pkg/intl/test/message_extraction/foo_messages_fr.dart b/pkg/intl/test/message_extraction/foo_messages_fr.dart
deleted file mode 100644
index 7be3c2a..0000000
--- a/pkg/intl/test/message_extraction/foo_messages_fr.dart
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * DO NOT EDIT. This is code generated via pkg/intl/generate_localized.dart
- * This is a library that provides messages for a fr locale. All the
- * messages from the main program should be duplicated here with the same
- * function name.
- */
-
-library messages_fr;
-import 'package:intl/intl.dart';
-import 'package:intl/message_lookup_by_library.dart';
-
-final messages = new MessageLookup();
-
-class MessageLookup extends MessageLookupByLibrary {
-
-  get localeName => 'fr';
-  static alwaysTranslated() => "Cette chaîne est toujours traduit";
-
-  static differentNameSameContents() => "Bonjour tout le monde";
-
-  static escapable() => "Escapes: \n\r\f\b\t\v.";
-
-  static leadingQuotes() => "\"Soi-disant\"";
-
-  static message1() => "Il s\'agit d\'un message";
-
-  static message2(x) => "Un autre message avec un seul paramètre $x";
-
-  static message3(a, b, c) => "Caractères qui doivent être échapper, par exemple barres \\ dollars \${ (les accolades sont ok), et xml/html réservés <& et des citations \" avec quelques paramètres ainsi $a, $b, et $c";
-
-  static method() => "Cela vient d\'une méthode";
-
-  static multiLine() => "Cette message prend plusiers lignes.";
-
-  static nestedMessage(names, number, combinedGender, place) => "${Intl.gender(combinedGender, female: '${Intl.plural(number, one: '$names était allée à la $place', other: '$names étaient allées à la $place')}', other: '${Intl.plural(number, zero: 'Personne n\'avait allé à la $place', one: '${names} était allé à la $place', other: '${names} étaient allés à la $place')}')}";
-
-  static nestedOuter(number, gen) => "${Intl.plural(number, other: '${Intl.gender(gen, male: '$number homme', other: '$number autre')}')}";
-
-  static nestedSelect(currency, amount) => "${Intl.select(currency, {'CDN': '${Intl.plural(amount, one: '$amount dollar Canadien', other: '$amount dollars Canadiens')}', 'other': 'Nimporte quoi', })}";
-
-  static nonLambda() => "Cette méthode n\'est pas un lambda";
-
-  static notAlwaysTranslated() => "Ce manque certaines traductions";
-
-  static originalNotInBMP() => "Anciens caractères grecs jeux du pendu: 𐅆𐅇.";
-
-  static outerGender(g) => "${Intl.gender(g, female: 'femme', male: 'homme', other: 'autre')}";
-
-  static outerPlural(n) => "${Intl.plural(n, zero: 'rien', one: 'un', other: 'quelques-uns')}";
-
-  static outerSelect(currency, amount) => "${Intl.select(currency, {'CDN': '$amount dollars Canadiens', 'other': '$amount certaine devise ou autre.', })}";
-
-  static pluralThatFailsParsing(noOfThings) => "${Intl.plural(noOfThings, one: '1 chose:', other: '$noOfThings choses:')}";
-
-  static plurals(num) => "${Intl.plural(num, zero: 'Est-ce que nulle est pluriel?', one: 'C\'est singulier', other: 'C\'est pluriel ($num).')}";
-
-  static sameContentsDifferentName() => "Bonjour tout le monde";
-
-  static rentAsVerb() => "louer";
-
-  static rentToBePaid() => "loyer";
-
-  static staticMessage() => "Cela vient d\'une méthode statique";
-
-  static trickyInterpolation(s) => "L\'interpolation est délicate quand elle se termine une phrase comme ${s}.";
-
-  static types(a, b, c) => "$a, $b, $c";
-
-  static whereTheyWentMessage(name, gender, place) => "${Intl.gender(gender, female: '${name} est allée à sa ${place}', male: '${name} est allé à sa ${place}', other: '${name} est allé à sa ${place}')}";
-
-
-  final messages = const {
-    "alwaysTranslated" : alwaysTranslated,
-    "differentNameSameContents" : differentNameSameContents,
-    "escapable" : escapable,
-    "leadingQuotes" : leadingQuotes,
-    "message1" : message1,
-    "message2" : message2,
-    "message3" : message3,
-    "method" : method,
-    "multiLine" : multiLine,
-    "nestedMessage" : nestedMessage,
-    "nestedOuter" : nestedOuter,
-    "nestedSelect" : nestedSelect,
-    "nonLambda" : nonLambda,
-    "notAlwaysTranslated" : notAlwaysTranslated,
-    "originalNotInBMP" : originalNotInBMP,
-    "outerGender" : outerGender,
-    "outerPlural" : outerPlural,
-    "outerSelect" : outerSelect,
-    "pluralThatFailsParsing" : pluralThatFailsParsing,
-    "plurals" : plurals,
-    "sameContentsDifferentName" : sameContentsDifferentName,
-    "rentAsVerb" : rentAsVerb,
-    "rentToBePaid" : rentToBePaid,
-    "staticMessage" : staticMessage,
-    "trickyInterpolation" : trickyInterpolation,
-    "types" : types,
-    "whereTheyWentMessage" : whereTheyWentMessage
-  };
-}
\ No newline at end of file
diff --git a/pkg/intl/test/message_extraction/generated_messages_js_test.dart b/pkg/intl/test/message_extraction/generated_messages_js_test.dart
deleted file mode 100644
index a036d7f..0000000
--- a/pkg/intl/test/message_extraction/generated_messages_js_test.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// This test is intended to be run when compiled to Javascript, though it will
-// also work if run from the VM, it just won't test anything different from
-// message_extraction_test. It runs the generated code without going through
-// the message extraction or translation, which can't be done in JS. This tells
-// us if the generated code works in JS.
-
-library generated_messages_js_test.dart;
-
-import 'package:unittest/unittest.dart';
-import 'sample_with_messages.dart' as sample;
-import 'print_to_list.dart';
-import 'verify_messages.dart';
-
-main() {
-  test("Test generated code running in JS", () =>
-    sample.main().then((_) => verifyResult(lines)));
-}
diff --git a/pkg/intl/test/message_extraction/message_extraction_test.dart b/pkg/intl/test/message_extraction/message_extraction_test.dart
index b2de632..90574d1 100644
--- a/pkg/intl/test/message_extraction/message_extraction_test.dart
+++ b/pkg/intl/test/message_extraction/message_extraction_test.dart
@@ -10,46 +10,68 @@
 import 'dart:convert';
 import 'package:path/path.dart' as path;
 import '../data_directory.dart';
-import 'verify_messages.dart';
-import 'sample_with_messages.dart' as sample;
 
 final dart = Platform.executable;
 
 /** The VM arguments we were given, most important package-root. */
 final vmArgs = Platform.executableArguments;
 
+var tempDir = Directory.systemTemp.createTempSync('message_extraction_test'
+    ).path;
+
 /**
- * Translate a file path into this test directory, regardless of the
- * working directory.
+ * Translate a relative file path into this test directory. This is
+ * applied to all the arguments of [run]. It will ignore a string that
+ * is an absolute path or begins with "--", because some of the arguments
+ * might be command-line options.
  */
-String dir([String s]) {
-  if (s != null && s.startsWith("--")) { // Don't touch command-line options.
-    return s;
-  } else {
-   return path.join(intlDirectory, 'test', 'message_extraction', s);
-  }
+String asTestDirPath([String s]) {
+  if (s == null || s.startsWith("--") || path.isAbsolute(s)) return s;
+  return path.join(intlDirectory, 'test', 'message_extraction', s);
+}
+
+/**
+ * Translate a relative file path into our temp directory. This is
+ * applied to all the arguments of [run]. It will ignore a string that
+ * is an absolute path or begins with "--", because some of the arguments
+ * might be command-line options.
+ */
+String asTempDirPath([String s]) {
+  if (s == null || s.startsWith("--") || path.isAbsolute(s)) return s;
+  return path.join(tempDir, s);
 }
 
 main() {
   test("Test round trip message extraction, translation, code generation, "
       "and printing", () {
-    deleteGeneratedFiles();
+    copyFilesToTempDirectory();
     return extractMessages(null).then((result) {
       return generateTranslationFiles(result);
     }).then((result) {
       return generateCodeFromTranslation(result);
-    }).then((_) => sample.main())
-    .then(verifyResult)
-    .whenComplete(deleteGeneratedFiles);
+    }).then((result) => runAndVerify(result));
   });
 }
 
+void copyFilesToTempDirectory() {
+  var files = [asTestDirPath('sample_with_messages.dart'), asTestDirPath(
+      'part_of_sample_with_messages.dart'), asTestDirPath('verify_messages.dart'),
+      asTestDirPath('run_and_verify.dart')];
+  for (var filename in files) {
+    var file = new File(filename);
+    file.copySync(path.join(tempDir, path.basename(filename)));
+  }
+}
+
 void deleteGeneratedFiles() {
-  var files = [dir('intl_messages.json'), dir('translation_fr.json'),
-      dir('translation_de_DE.json')];
-  files.map((name) => new File(name)).forEach((x) {
-    if (x.existsSync()) x.deleteSync();
-  });
+  try {
+    var dir = new Directory(tempDir);
+    dir.listSync().forEach((x) => x.deleteSync());
+    dir.deleteSync();
+  } on Error catch (e) {
+    print("Failed to delete $tempDir");
+    print("Exception:\n$e");
+  }
 }
 
 /**
@@ -58,7 +80,7 @@
  * directory.
  */
 Future<ProcessResult> run(ProcessResult previousResult, List<String> filenames)
-{
+    {
   // If there's a failure in one of the sub-programs, print its output.
   if (previousResult != null) {
     if (previousResult.exitCode != 0) {
@@ -68,34 +90,35 @@
     print(previousResult.stderr);
     print("exitCode=${previousResult.exitCode}");
   }
-  var filesInTheRightDirectory = filenames.map((x) => dir(x)).toList();
+  var filesInTheRightDirectory = filenames.map((x) => asTempDirPath(x)).toList(
+      );
   // Inject the script argument --output-dir in between the script and its
   // arguments.
   var args = []
       ..addAll(vmArgs)
       ..add(filesInTheRightDirectory.first)
-      ..addAll(["--output-dir=${dir()}"])
+      ..addAll(["--output-dir=$tempDir"])
       ..addAll(filesInTheRightDirectory.skip(1));
-  var result = Process.run(dart, args, stdoutEncoding: UTF8,
-      stderrEncoding: UTF8);
+  var result = Process.run(dart, args, stdoutEncoding: UTF8, stderrEncoding:
+      UTF8);
   return result;
 }
 
 Future<ProcessResult> extractMessages(ProcessResult previousResult) => run(
-    previousResult,
-    ['extract_to_json.dart', '--suppress-warnings', 'sample_with_messages.dart',
-        'part_of_sample_with_messages.dart']);
+    previousResult, [asTestDirPath('extract_to_json.dart'),
+    '--suppress-warnings', 'sample_with_messages.dart',
+    'part_of_sample_with_messages.dart']);
 
 Future<ProcessResult> generateTranslationFiles(ProcessResult previousResult) =>
-    run(
-        previousResult,
-        ['make_hardcoded_translation.dart', 'intl_messages.json']);
+    run(previousResult,
+        [asTestDirPath('make_hardcoded_translation.dart'),
+        'intl_messages.json']);
 
 Future<ProcessResult> generateCodeFromTranslation(ProcessResult previousResult)
-    => run(
-        previousResult,
-        ['generate_from_json.dart', '--generated-file-prefix=foo_',
-         'sample_with_messages.dart',
-             'part_of_sample_with_messages.dart', 'translation_fr.json',
-             'translation_de_DE.json' ]);
+    => run(previousResult, [asTestDirPath('generate_from_json.dart'),
+    '--generated-file-prefix=foo_', 'sample_with_messages.dart',
+    'part_of_sample_with_messages.dart', 'translation_fr.json',
+    'translation_de_DE.json']);
 
+Future<ProcessResult> runAndVerify(ProcessResult previousResult) => run(
+    previousResult, [asTempDirPath('run_and_verify.dart')]);
diff --git a/pkg/intl/test/message_extraction/really_fail_extraction_test.dart b/pkg/intl/test/message_extraction/really_fail_extraction_test.dart
new file mode 100644
index 0000000..76f5251
--- /dev/null
+++ b/pkg/intl/test/message_extraction/really_fail_extraction_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library really_fail_extraction_test;
+
+import "failed_extraction_test.dart";
+import "package:unittest/unittest.dart";
+
+main() {
+  test("Expect failure because warnings are errors", () {
+    runTestWithWarnings(warningsAreErrors: true, expectedExitCode: 1);
+  });
+}
diff --git a/pkg/intl/test/message_extraction/run_and_verify.dart b/pkg/intl/test/message_extraction/run_and_verify.dart
new file mode 100644
index 0000000..c283f2c
--- /dev/null
+++ b/pkg/intl/test/message_extraction/run_and_verify.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.
+library verify_and_run;
+
+import 'sample_with_messages.dart' as sample;
+import 'verify_messages.dart';
+
+main() {
+  sample.main().then(verifyResult);
+}
\ No newline at end of file
diff --git a/pkg/json/README.md b/pkg/json/README.md
deleted file mode 100644
index 677a4d4..0000000
--- a/pkg/json/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-A JSON library for Dart.
-
-The path package provides some extensible classes for JSON manipulations. It
-is (in its original form) a copy of the `dart:json` library before that was
-deprecated.
diff --git a/pkg/json/lib/json.dart b/pkg/json/lib/json.dart
deleted file mode 100644
index 4c67322..0000000
--- a/pkg/json/lib/json.dart
+++ /dev/null
@@ -1,827 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Utilities for encoding and decoding JSON (JavaScript Object Notation) data.
- */
-
-library json;
-
-import "dart:collection" show HashSet;
-
-// JSON parsing and serialization.
-
-/**
- * Error thrown by JSON serialization if an object cannot be serialized.
- *
- * The [unsupportedObject] field holds that object that failed to be serialized.
- *
- * If an object isn't directly serializable, the serializer calls the 'toJson'
- * method on the object. If that call fails, the error will be stored in the
- * [cause] field. If the call returns an object that isn't directly
- * serializable, the [cause] will be null.
- */
-class JsonUnsupportedObjectError extends Error {
-  /** The object that could not be serialized. */
-  final unsupportedObject;
-  /** The exception thrown by object's [:toJson:] method, if any. */
-  final cause;
-
-  JsonUnsupportedObjectError(this.unsupportedObject, { this.cause });
-
-  String toString() {
-    if (cause != null) {
-      return "Calling toJson method on object failed.";
-    } else {
-      return "Object toJson method returns non-serializable value.";
-    }
-  }
-}
-
-
-/**
- * Reports that an object could not be stringified due to cyclic references.
- *
- * An object that references itself cannot be serialized by [stringify].
- * When the cycle is detected, a [JsonCyclicError] is thrown.
- */
-class JsonCyclicError extends JsonUnsupportedObjectError {
-  /** The first object that was detected as part of a cycle. */
-  JsonCyclicError(Object object): super(object);
-  String toString() => "Cyclic error in JSON stringify";
-}
-
-
-/**
- * Parses [json] and build the corresponding parsed JSON value.
- *
- * Parsed JSON values are of the types [num], [String], [bool], [Null],
- * [List]s of parsed JSON values or [Map]s from [String] to parsed
- * JSON values.
- *
- * The optional [reviver] function, if provided, is called once for each
- * object or list property parsed. The arguments are the property name
- * ([String]) or list index ([int]), and the value is the parsed value.
- * The return value of the reviver will be used as the value of that property
- * instead the parsed value.
- *
- * Throws [FormatException] if the input is not valid JSON text.
- */
-parse(String json, [reviver(var key, var value)]) {
-  BuildJsonListener listener;
-  if (reviver == null) {
-    listener = new BuildJsonListener();
-  } else {
-    listener = new ReviverJsonListener(reviver);
-  }
-  new JsonParser(json, listener).parse();
-  return listener.result;
-}
-
-/**
- * Serializes [object] into a JSON string.
- *
- * Directly serializable values are [num], [String], [bool], and [Null], as well
- * as some [List] and [Map] values.
- * For [List], the elements must all be serializable.
- * For [Map], the keys must be [String] and the values must be serializable.
- *
- * If a value is any other type is attempted serialized, a "toJson()" method
- * is invoked on the object and the result, which must be a directly
- * serializable value, is serialized instead of the original value.
- *
- * If the object does not support this method, throws, or returns a
- * value that is not directly serializable, a [JsonUnsupportedObjectError]
- * exception is thrown. If the call throws (including the case where there
- * is no nullary "toJson" method, the error is caught and stored in the
- * [JsonUnsupportedObjectError]'s [:cause:] field.
- *
- * If a [List] or [Map] contains a reference to itself, directly or through
- * other lists or maps, it cannot be serialized and a [JsonCyclicError] is
- * thrown.
- *
- * Json Objects should not change during serialization.
- * If an object is serialized more than once, [stringify] is allowed to cache
- * the JSON text for it. I.e., if an object changes after it is first
- * serialized, the new values may or may not be reflected in the result.
- */
-String stringify(Object object) {
-  return _JsonStringifier.stringify(object);
-}
-
-/**
- * Serializes [object] into [output] stream.
- *
- * Performs the same operations as [stringify] but outputs the resulting
- * string to an existing [StringSink] instead of creating a new [String].
- *
- * If serialization fails by throwing, some data might have been added to
- * [output], but it won't contain valid JSON text.
- */
-void printOn(Object object, StringSink output) {
-  return _JsonStringifier.printOn(object, output);
-}
-
-//// Implementation ///////////////////////////////////////////////////////////
-
-// Simple API for JSON parsing.
-
-abstract class JsonListener {
-  void handleString(String value) {}
-  void handleNumber(num value) {}
-  void handleBool(bool value) {}
-  void handleNull() {}
-  void beginObject() {}
-  void propertyName() {}
-  void propertyValue() {}
-  void endObject() {}
-  void beginArray() {}
-  void arrayElement() {}
-  void endArray() {}
-  /** Called on failure to parse [source]. */
-  void fail(String source, int position, String message) {}
-}
-
-/**
- * A [JsonListener] that builds data objects from the parser events.
- *
- * This is a simple stack-based object builder. It keeps the most recently
- * seen value in a variable, and uses it depending on the following event.
- */
-class BuildJsonListener extends JsonListener {
-  /**
-   * Stack used to handle nested containers.
-   *
-   * The current container is pushed on the stack when a new one is
-   * started. If the container is a [Map], there is also a current [key]
-   * which is also stored on the stack.
-   */
-  List stack = [];
-  /** The current [Map] or [List] being built. */
-  var currentContainer;
-  /** The most recently read property key. */
-  String key;
-  /** The most recently read value. */
-  var value;
-
-  /** Pushes the currently active container (and key, if a [Map]). */
-  void pushContainer() {
-    if (currentContainer is Map) stack.add(key);
-    stack.add(currentContainer);
-  }
-
-  /** Pops the top container from the [stack], including a key if applicable. */
-  void popContainer() {
-    value = currentContainer;
-    currentContainer = stack.removeLast();
-    if (currentContainer is Map) key = stack.removeLast();
-  }
-
-  void handleString(String value) { this.value = value; }
-  void handleNumber(num value) { this.value = value; }
-  void handleBool(bool value) { this.value = value; }
-  void handleNull() { this.value = null; }
-
-  void beginObject() {
-    pushContainer();
-    currentContainer = {};
-  }
-
-  void propertyName() {
-    key = value;
-    value = null;
-  }
-
-  void propertyValue() {
-    Map map = currentContainer;
-    map[key] = value;
-    key = value = null;
-  }
-
-  void endObject() {
-    popContainer();
-  }
-
-  void beginArray() {
-    pushContainer();
-    currentContainer = [];
-  }
-
-  void arrayElement() {
-    List list = currentContainer;
-    currentContainer.add(value);
-    value = null;
-  }
-
-  void endArray() {
-    popContainer();
-  }
-
-  /** Read out the final result of parsing a JSON string. */
-  get result {
-    assert(currentContainer == null);
-    return value;
-  }
-}
-
-typedef _Reviver(var key, var value);
-
-class ReviverJsonListener extends BuildJsonListener {
-  final _Reviver reviver;
-  ReviverJsonListener(reviver(key, value)) : this.reviver = reviver;
-
-  void arrayElement() {
-    List list = currentContainer;
-    value = reviver(list.length, value);
-    super.arrayElement();
-  }
-
-  void propertyValue() {
-    value = reviver(key, value);
-    super.propertyValue();
-  }
-
-  get result {
-    return reviver("", value);
-  }
-}
-
-class JsonParser {
-  // A simple non-recursive state-based parser for JSON.
-  //
-  // Literal values accepted in states ARRAY_EMPTY, ARRAY_COMMA, OBJECT_COLON
-  // and strings also in OBJECT_EMPTY, OBJECT_COMMA.
-  //               VALUE  STRING  :  ,  }  ]        Transitions to
-  // EMPTY            X      X                   -> END
-  // ARRAY_EMPTY      X      X             @     -> ARRAY_VALUE / pop
-  // ARRAY_VALUE                     @     @     -> ARRAY_COMMA / pop
-  // ARRAY_COMMA      X      X                   -> ARRAY_VALUE
-  // OBJECT_EMPTY            X          @        -> OBJECT_KEY / pop
-  // OBJECT_KEY                   @              -> OBJECT_COLON
-  // OBJECT_COLON     X      X                   -> OBJECT_VALUE
-  // OBJECT_VALUE                    @  @        -> OBJECT_COMMA / pop
-  // OBJECT_COMMA            X                   -> OBJECT_KEY
-  // END
-  // Starting a new array or object will push the current state. The "pop"
-  // above means restoring this state and then marking it as an ended value.
-  // X means generic handling, @ means special handling for just that
-  // state - that is, values are handled generically, only punctuation
-  // cares about the current state.
-  // Values for states are chosen so bits 0 and 1 tell whether
-  // a string/value is allowed, and setting bits 0 through 2 after a value
-  // gets to the next state (not empty, doesn't allow a value).
-
-  // State building-block constants.
-  static const int INSIDE_ARRAY = 1;
-  static const int INSIDE_OBJECT = 2;
-  static const int AFTER_COLON = 3;  // Always inside object.
-
-  static const int ALLOW_STRING_MASK = 8;  // Allowed if zero.
-  static const int ALLOW_VALUE_MASK = 4;  // Allowed if zero.
-  static const int ALLOW_VALUE = 0;
-  static const int STRING_ONLY = 4;
-  static const int NO_VALUES = 12;
-
-  // Objects and arrays are "empty" until their first property/element.
-  static const int EMPTY = 0;
-  static const int NON_EMPTY = 16;
-  static const int EMPTY_MASK = 16;  // Empty if zero.
-
-
-  static const int VALUE_READ_BITS = NO_VALUES | NON_EMPTY;
-
-  // Actual states.
-  static const int STATE_INITIAL      = EMPTY | ALLOW_VALUE;
-  static const int STATE_END          = NON_EMPTY | NO_VALUES;
-
-  static const int STATE_ARRAY_EMPTY  = INSIDE_ARRAY | EMPTY | ALLOW_VALUE;
-  static const int STATE_ARRAY_VALUE  = INSIDE_ARRAY | NON_EMPTY | NO_VALUES;
-  static const int STATE_ARRAY_COMMA  = INSIDE_ARRAY | NON_EMPTY | ALLOW_VALUE;
-
-  static const int STATE_OBJECT_EMPTY = INSIDE_OBJECT | EMPTY | STRING_ONLY;
-  static const int STATE_OBJECT_KEY   = INSIDE_OBJECT | NON_EMPTY | NO_VALUES;
-  static const int STATE_OBJECT_COLON = AFTER_COLON | NON_EMPTY | ALLOW_VALUE;
-  static const int STATE_OBJECT_VALUE = AFTER_COLON | NON_EMPTY | NO_VALUES;
-  static const int STATE_OBJECT_COMMA = INSIDE_OBJECT | NON_EMPTY | STRING_ONLY;
-
-  // Character code constants.
-  static const int BACKSPACE       = 0x08;
-  static const int TAB             = 0x09;
-  static const int NEWLINE         = 0x0a;
-  static const int CARRIAGE_RETURN = 0x0d;
-  static const int FORM_FEED       = 0x0c;
-  static const int SPACE           = 0x20;
-  static const int QUOTE           = 0x22;
-  static const int PLUS            = 0x2b;
-  static const int COMMA           = 0x2c;
-  static const int MINUS           = 0x2d;
-  static const int DECIMALPOINT    = 0x2e;
-  static const int SLASH           = 0x2f;
-  static const int CHAR_0          = 0x30;
-  static const int CHAR_9          = 0x39;
-  static const int COLON           = 0x3a;
-  static const int CHAR_E          = 0x45;
-  static const int LBRACKET        = 0x5b;
-  static const int BACKSLASH       = 0x5c;
-  static const int RBRACKET        = 0x5d;
-  static const int CHAR_a          = 0x61;
-  static const int CHAR_b          = 0x62;
-  static const int CHAR_e          = 0x65;
-  static const int CHAR_f          = 0x66;
-  static const int CHAR_l          = 0x6c;
-  static const int CHAR_n          = 0x6e;
-  static const int CHAR_r          = 0x72;
-  static const int CHAR_s          = 0x73;
-  static const int CHAR_t          = 0x74;
-  static const int CHAR_u          = 0x75;
-  static const int LBRACE          = 0x7b;
-  static const int RBRACE          = 0x7d;
-
-  final String source;
-  final JsonListener listener;
-  JsonParser(this.source, this.listener);
-
-  /** Parses [source], or throws if it fails. */
-  void parse() {
-    final List<int> states = <int>[];
-    int state = STATE_INITIAL;
-    int position = 0;
-    int length = source.length;
-    while (position < length) {
-      int char = source.codeUnitAt(position);
-      switch (char) {
-        case SPACE:
-        case CARRIAGE_RETURN:
-        case NEWLINE:
-        case TAB:
-          position++;
-          break;
-        case QUOTE:
-          if ((state & ALLOW_STRING_MASK) != 0) fail(position);
-          position = parseString(position + 1);
-          state |= VALUE_READ_BITS;
-          break;
-        case LBRACKET:
-          if ((state & ALLOW_VALUE_MASK) != 0) fail(position);
-          listener.beginArray();
-          states.add(state);
-          state = STATE_ARRAY_EMPTY;
-          position++;
-          break;
-        case LBRACE:
-          if ((state & ALLOW_VALUE_MASK) != 0) fail(position);
-          listener.beginObject();
-          states.add(state);
-          state = STATE_OBJECT_EMPTY;
-          position++;
-          break;
-        case CHAR_n:
-          if ((state & ALLOW_VALUE_MASK) != 0) fail(position);
-          position = parseNull(position);
-          state |= VALUE_READ_BITS;
-          break;
-        case CHAR_f:
-          if ((state & ALLOW_VALUE_MASK) != 0) fail(position);
-          position = parseFalse(position);
-          state |= VALUE_READ_BITS;
-          break;
-        case CHAR_t:
-          if ((state & ALLOW_VALUE_MASK) != 0) fail(position);
-          position = parseTrue(position);
-          state |= VALUE_READ_BITS;
-          break;
-        case COLON:
-          if (state != STATE_OBJECT_KEY) fail(position);
-          listener.propertyName();
-          state = STATE_OBJECT_COLON;
-          position++;
-          break;
-        case COMMA:
-          if (state == STATE_OBJECT_VALUE) {
-            listener.propertyValue();
-            state = STATE_OBJECT_COMMA;
-            position++;
-          } else if (state == STATE_ARRAY_VALUE) {
-            listener.arrayElement();
-            state = STATE_ARRAY_COMMA;
-            position++;
-          } else {
-            fail(position);
-          }
-          break;
-        case RBRACKET:
-          if (state == STATE_ARRAY_EMPTY) {
-            listener.endArray();
-          } else if (state == STATE_ARRAY_VALUE) {
-            listener.arrayElement();
-            listener.endArray();
-          } else {
-            fail(position);
-          }
-          state = states.removeLast() | VALUE_READ_BITS;
-          position++;
-          break;
-        case RBRACE:
-          if (state == STATE_OBJECT_EMPTY) {
-            listener.endObject();
-          } else if (state == STATE_OBJECT_VALUE) {
-            listener.propertyValue();
-            listener.endObject();
-          } else {
-            fail(position);
-          }
-          state = states.removeLast() | VALUE_READ_BITS;
-          position++;
-          break;
-        default:
-          if ((state & ALLOW_VALUE_MASK) != 0) fail(position);
-          position = parseNumber(char, position);
-          state |= VALUE_READ_BITS;
-          break;
-      }
-    }
-    if (state != STATE_END) fail(position);
-  }
-
-  /**
-   * Parses a "true" literal starting at [position].
-   *
-   * [:source[position]:] must be "t".
-   */
-  int parseTrue(int position) {
-    assert(source.codeUnitAt(position) == CHAR_t);
-    if (source.length < position + 4) fail(position, "Unexpected identifier");
-    if (source.codeUnitAt(position + 1) != CHAR_r ||
-        source.codeUnitAt(position + 2) != CHAR_u ||
-        source.codeUnitAt(position + 3) != CHAR_e) {
-      fail(position);
-    }
-    listener.handleBool(true);
-    return position + 4;
-  }
-
-  /**
-   * Parses a "false" literal starting at [position].
-   *
-   * [:source[position]:] must be "f".
-   */
-  int parseFalse(int position) {
-    assert(source.codeUnitAt(position) == CHAR_f);
-    if (source.length < position + 5) fail(position, "Unexpected identifier");
-    if (source.codeUnitAt(position + 1) != CHAR_a ||
-        source.codeUnitAt(position + 2) != CHAR_l ||
-        source.codeUnitAt(position + 3) != CHAR_s ||
-        source.codeUnitAt(position + 4) != CHAR_e) {
-      fail(position);
-    }
-    listener.handleBool(false);
-    return position + 5;
-  }
-
-  /** Parses a "null" literal starting at [position].
-   *
-   * [:source[position]:] must be "n".
-   */
-  int parseNull(int position) {
-    assert(source.codeUnitAt(position) == CHAR_n);
-    if (source.length < position + 4) fail(position, "Unexpected identifier");
-    if (source.codeUnitAt(position + 1) != CHAR_u ||
-        source.codeUnitAt(position + 2) != CHAR_l ||
-        source.codeUnitAt(position + 3) != CHAR_l) {
-      fail(position);
-    }
-    listener.handleNull();
-    return position + 4;
-  }
-
-  int parseString(int position) {
-    // Format: '"'([^\x00-\x1f\\\"]|'\\'[bfnrt/\\"])*'"'
-    // Initial position is right after first '"'.
-    int start = position;
-    int char;
-    do {
-      if (position == source.length) {
-        fail(start - 1, "Unterminated string");
-      }
-      char = source.codeUnitAt(position);
-      if (char == QUOTE) {
-        listener.handleString(source.substring(start, position));
-        return position + 1;
-      }
-      if (char < SPACE) {
-        fail(position, "Control character in string");
-      }
-      position++;
-    } while (char != BACKSLASH);
-    // Backslash escape detected. Collect character codes for rest of string.
-    int firstEscape = position - 1;
-    List<int> chars = <int>[];
-    while (true) {
-      if (position == source.length) {
-        fail(start - 1, "Unterminated string");
-      }
-      char = source.codeUnitAt(position);
-      switch (char) {
-        case CHAR_b: char = BACKSPACE; break;
-        case CHAR_f: char = FORM_FEED; break;
-        case CHAR_n: char = NEWLINE; break;
-        case CHAR_r: char = CARRIAGE_RETURN; break;
-        case CHAR_t: char = TAB; break;
-        case SLASH:
-        case BACKSLASH:
-        case QUOTE:
-          break;
-        case CHAR_u:
-          int hexStart = position - 1;
-          int value = 0;
-          for (int i = 0; i < 4; i++) {
-            position++;
-            if (position == source.length) {
-              fail(start - 1, "Unterminated string");
-            }
-            char = source.codeUnitAt(position);
-            char -= 0x30;
-            if (char < 0) fail(hexStart, "Invalid unicode escape");
-            if (char < 10) {
-              value = value * 16 + char;
-            } else {
-              char = (char | 0x20) - 0x31;
-              if (char < 0 || char > 5) {
-                fail(hexStart, "Invalid unicode escape");
-              }
-              value = value * 16 + char + 10;
-            }
-          }
-          char = value;
-          break;
-        default:
-          if (char < SPACE) fail(position, "Control character in string");
-          fail(position, "Unrecognized string escape");
-      }
-      do {
-        chars.add(char);
-        position++;
-        if (position == source.length) fail(start - 1, "Unterminated string");
-        char = source.codeUnitAt(position);
-        if (char == QUOTE) {
-          String result = new String.fromCharCodes(chars);
-          if (start < firstEscape) {
-            result = "${source.substring(start, firstEscape)}$result";
-          }
-          listener.handleString(result);
-          return position + 1;
-        }
-        if (char < SPACE) {
-          fail(position, "Control character in string");
-        }
-      } while (char != BACKSLASH);
-      position++;
-    }
-  }
-
-  int _handleLiteral(start, position, isDouble) {
-    String literal = source.substring(start, position);
-    // This correctly creates -0 for doubles.
-    num value = (isDouble ? double.parse(literal) : int.parse(literal));
-    listener.handleNumber(value);
-    return position;
-  }
-
-  int parseNumber(int char, int position) {
-    // Format:
-    //  '-'?('0'|[1-9][0-9]*)('.'[0-9]+)?([eE][+-]?[0-9]+)?
-    int start = position;
-    int length = source.length;
-    bool isDouble = false;
-    if (char == MINUS) {
-      position++;
-      if (position == length) fail(position, "Missing expected digit");
-      char = source.codeUnitAt(position);
-    }
-    if (char < CHAR_0 || char > CHAR_9) {
-      fail(position, "Missing expected digit");
-    }
-    if (char == CHAR_0) {
-      position++;
-      if (position == length) return _handleLiteral(start, position, false);
-      char = source.codeUnitAt(position);
-      if (CHAR_0 <= char && char <= CHAR_9) {
-        fail(position);
-      }
-    } else {
-      do {
-        position++;
-        if (position == length) return _handleLiteral(start, position, false);
-        char = source.codeUnitAt(position);
-      } while (CHAR_0 <= char && char <= CHAR_9);
-    }
-    if (char == DECIMALPOINT) {
-      isDouble = true;
-      position++;
-      if (position == length) fail(position, "Missing expected digit");
-      char = source.codeUnitAt(position);
-      if (char < CHAR_0 || char > CHAR_9) fail(position);
-      do {
-        position++;
-        if (position == length) return _handleLiteral(start, position, true);
-        char = source.codeUnitAt(position);
-      } while (CHAR_0 <= char && char <= CHAR_9);
-    }
-    if (char == CHAR_e || char == CHAR_E) {
-      isDouble = true;
-      position++;
-      if (position == length) fail(position, "Missing expected digit");
-      char = source.codeUnitAt(position);
-      if (char == PLUS || char == MINUS) {
-        position++;
-        if (position == length) fail(position, "Missing expected digit");
-        char = source.codeUnitAt(position);
-      }
-      if (char < CHAR_0 || char > CHAR_9) {
-        fail(position, "Missing expected digit");
-      }
-      do {
-        position++;
-        if (position == length) return _handleLiteral(start, position, true);
-        char = source.codeUnitAt(position);
-      } while (CHAR_0 <= char && char <= CHAR_9);
-    }
-    return _handleLiteral(start, position, isDouble);
-  }
-
-  void fail(int position, [String message]) {
-    if (message == null) message = "Unexpected character";
-    listener.fail(source, position, message);
-    // If the listener didn't throw, do it here.
-    String slice;
-    int sliceEnd = position + 20;
-    if (sliceEnd > source.length) {
-      slice = "'${source.substring(position)}'";
-    } else {
-      slice = "'${source.substring(position, sliceEnd)}...'";
-    }
-    throw new FormatException("Unexpected character at $position: $slice");
-  }
-}
-
-
-class _JsonStringifier {
-  final StringSink sink;
-  final Set<Object> seen;
-
-  _JsonStringifier(this.sink) : seen = new HashSet.identity();
-
-  static String stringify(final object) {
-    StringBuffer output = new StringBuffer();
-    _JsonStringifier stringifier = new _JsonStringifier(output);
-    stringifier.stringifyValue(object);
-    return output.toString();
-  }
-
-  static void printOn(final object, StringSink output) {
-    _JsonStringifier stringifier = new _JsonStringifier(output);
-    stringifier.stringifyValue(object);
-  }
-
-  static String numberToString(num x) {
-    return x.toString();
-  }
-
-  // ('0' + x) or ('a' + x - 10)
-  static int hexDigit(int x) => x < 10 ? 48 + x : 87 + x;
-
-  static void escape(StringSink sb, String s) {
-    final int length = s.length;
-    bool needsEscape = false;
-    final charCodes = new List<int>();
-    for (int i = 0; i < length; i++) {
-      int charCode = s.codeUnitAt(i);
-      if (charCode < 32) {
-        needsEscape = true;
-        charCodes.add(JsonParser.BACKSLASH);
-        switch (charCode) {
-        case JsonParser.BACKSPACE:
-          charCodes.add(JsonParser.CHAR_b);
-          break;
-        case JsonParser.TAB:
-          charCodes.add(JsonParser.CHAR_t);
-          break;
-        case JsonParser.NEWLINE:
-          charCodes.add(JsonParser.CHAR_n);
-          break;
-        case JsonParser.FORM_FEED:
-          charCodes.add(JsonParser.CHAR_f);
-          break;
-        case JsonParser.CARRIAGE_RETURN:
-          charCodes.add(JsonParser.CHAR_r);
-          break;
-        default:
-          charCodes.add(JsonParser.CHAR_u);
-          charCodes.add(hexDigit((charCode >> 12) & 0xf));
-          charCodes.add(hexDigit((charCode >> 8) & 0xf));
-          charCodes.add(hexDigit((charCode >> 4) & 0xf));
-          charCodes.add(hexDigit(charCode & 0xf));
-          break;
-        }
-      } else if (charCode == JsonParser.QUOTE ||
-          charCode == JsonParser.BACKSLASH) {
-        needsEscape = true;
-        charCodes.add(JsonParser.BACKSLASH);
-        charCodes.add(charCode);
-      } else {
-        charCodes.add(charCode);
-      }
-    }
-    sb.write(needsEscape ? new String.fromCharCodes(charCodes) : s);
-  }
-
-  void checkCycle(final object) {
-    if (seen.contains(object)) {
-      throw new JsonCyclicError(object);
-    }
-    seen.add(object);
-  }
-
-  void stringifyValue(final object) {
-    // Tries stringifying object directly. If it's not a simple value, List or
-    // Map, call toJson() to get a custom representation and try serializing
-    // that.
-    if (!stringifyJsonValue(object)) {
-      checkCycle(object);
-      try {
-        var customJson = object.toJson();
-        if (!stringifyJsonValue(customJson)) {
-          throw new JsonUnsupportedObjectError(object);
-        }
-        seen.remove(object);
-      } catch (e) {
-        throw new JsonUnsupportedObjectError(object, cause: e);
-      }
-    }
-  }
-
-  /**
-   * Serializes a [num], [String], [bool], [Null], [List] or [Map] value.
-   *
-   * Returns true if the value is one of these types, and false if not.
-   * If a value is both a [List] and a [Map], it's serialized as a [List].
-   */
-  bool stringifyJsonValue(final object) {
-    if (object is num) {
-      if (!object.isFinite) return false;
-      sink.write(numberToString(object));
-      return true;
-    } else if (identical(object, true)) {
-      sink.write('true');
-      return true;
-    } else if (identical(object, false)) {
-      sink.write('false');
-       return true;
-    } else if (object == null) {
-      sink.write('null');
-      return true;
-    } else if (object is String) {
-      sink.write('"');
-      escape(sink, object);
-      sink.write('"');
-      return true;
-    } else if (object is List) {
-      checkCycle(object);
-      List a = object;
-      sink.write('[');
-      if (a.length > 0) {
-        stringifyValue(a[0]);
-        // TODO: switch to Iterables.
-        for (int i = 1; i < a.length; i++) {
-          sink.write(',');
-          stringifyValue(a[i]);
-        }
-      }
-      sink.write(']');
-      seen.remove(object);
-      return true;
-    } else if (object is Map) {
-      checkCycle(object);
-      Map<String, Object> m = object;
-      sink.write('{');
-      bool first = true;
-      m.forEach((String key, Object value) {
-        if (!first) {
-          sink.write(',"');
-        } else {
-          sink.write('"');
-        }
-        escape(sink, key);
-        sink.write('":');
-        stringifyValue(value);
-        first = false;
-      });
-      sink.write('}');
-      seen.remove(object);
-      return true;
-    } else {
-      return false;
-    }
-  }
-}
diff --git a/pkg/json/pubspec.yaml b/pkg/json/pubspec.yaml
deleted file mode 100644
index b4e3112..0000000
--- a/pkg/json/pubspec.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-name: json
-version: 0.9.1
-author: Dart Team <misc@dartlang.org>
-description: >
- A JSON library. Intended for advanced use where the built-in facilities are
- too limiting.
-homepage: http://www.dartlang.org
-documentation: http://api.dartlang.org/docs/pkg/json
-dev_dependencies:
-  unittest: ">=0.9.0 <0.10.0"
-environment:
-  sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/json/test/json_test.dart b/pkg/json/test/json_test.dart
deleted file mode 100644
index c3aaf70..0000000
--- a/pkg/json/test/json_test.dart
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library json_tests;
-import 'package:unittest/unittest.dart';
-import 'package:json/json.dart' as json;
-
-main() {
-  test('Parse', () {
-    // Scalars.
-    expect(json.parse(' 5 '), equals(5));
-    expect(json.parse(' -42 '), equals(-42));
-    expect(json.parse(' 3e0 '), equals(3));
-    expect(json.parse(' 3.14 '), equals(3.14));
-    expect(json.parse('true '), isTrue);
-    expect(json.parse(' false'), isFalse);
-    expect(json.parse(' null '), isNull);
-    expect(json.parse('\n\rnull\t'), isNull);
-    expect(json.parse(' "hi there\\" bob" '), equals('hi there" bob'));
-    expect(json.parse(' "" '), isEmpty);
-
-    // Lists.
-    expect(json.parse(' [] '), isEmpty);
-    expect(json.parse('[ ]'), isEmpty);
-    expect(json.parse(' [3, -4.5, true, "hi", false] '),
-      equals([3, -4.5, true, 'hi', false]));
-    // Nulls are tricky.
-    expect(json.parse('[null]'), orderedEquals([null]));
-    expect(json.parse(' [3, -4.5, null, true, "hi", false] '),
-      equals([3, -4.5, null, true, 'hi', false]));
-    expect(json.parse('[[null]]'), equals([[null]]));
-    expect(json.parse(' [ [3], [], [null], ["hi", true]] '),
-      equals([[3], [], [null], ['hi', true]]));
-
-    // Maps.
-    expect(json.parse(' {} '), isEmpty);
-    expect(json.parse('{ }'), isEmpty);
-
-    expect(json.parse(
-        ' {"x":3, "y": -4.5,  "z" : "hi","u" : true, "v": false } '),
-        equals({"x":3, "y": -4.5,  "z" : "hi", "u" : true, "v": false }));
-
-    expect(json.parse(' {"x":3, "y": -4.5,  "z" : "hi" } '),
-        equals({"x":3, "y": -4.5,  "z" : "hi" }));
-
-    expect(json.parse(' {"y": -4.5,  "z" : "hi" ,"x":3 } '),
-        equals({"y": -4.5,  "z" : "hi" ,"x":3 }));
-
-    expect(json.parse('{ " hi bob " :3, "": 4.5}'),
-        equals({ " hi bob " :3, "": 4.5}));
-
-    expect(json.parse(' { "x" : { } } '), equals({ 'x' : {}}));
-    expect(json.parse('{"x":{}}'), equals({ 'x' : {}}));
-
-    // Nulls are tricky.
-    expect(json.parse('{"w":null}'), equals({ 'w' : null}));
-
-    expect(json.parse('{"x":{"w":null}}'), equals({"x":{"w":null}}));
-
-    expect(json.parse(' {"x":3, "y": -4.5,  "z" : "hi",'
-                   '"w":null, "u" : true, "v": false } '),
-        equals({"x":3, "y": -4.5,  "z" : "hi",
-                   "w":null, "u" : true, "v": false }));
-
-    expect(json.parse('{"x": {"a":3, "b": -4.5}, "y":[{}], '
-                   '"z":"hi","w":{"c":null,"d":true}, "v":null}'),
-        equals({"x": {"a":3, "b": -4.5}, "y":[{}],
-                   "z":"hi","w":{"c":null,"d":true}, "v":null}));
-  });
-
-  test('stringify', () {
-    // Scalars.
-    expect(json.stringify(5), equals('5'));
-    expect(json.stringify(-42), equals('-42'));
-    // Dart does not guarantee a formatting for doubles,
-    // so reparse and compare to the original.
-    validateRoundTrip(3.14);
-    expect(json.stringify(true), equals('true'));
-    expect(json.stringify(false), equals('false'));
-    expect(json.stringify(null), equals('null'));
-    expect(json.stringify(' hi there" bob '), equals('" hi there\\" bob "'));
-    expect(json.stringify('hi\\there'), equals('"hi\\\\there"'));
-    // TODO(devoncarew): these tests break the dartium build
-    //expect(json.stringify('hi\nthere'), equals('"hi\\nthere"'));
-    //expect(json.stringify('hi\r\nthere'), equals('"hi\\r\\nthere"'));
-    expect(json.stringify(''), equals('""'));
-
-    // Lists.
-    expect(json.stringify([]), equals('[]'));
-    expect(json.stringify(new List(0)), equals('[]'));
-    expect(json.stringify(new List(3)), equals('[null,null,null]'));
-    validateRoundTrip([3, -4.5, null, true, 'hi', false]);
-    expect(json.stringify([[3], [], [null], ['hi', true]]),
-      equals('[[3],[],[null],["hi",true]]'));
-
-    // Maps.
-    expect(json.stringify({}), equals('{}'));
-    expect(json.stringify(new Map()), equals('{}'));
-    expect(json.stringify({'x':{}}), equals('{"x":{}}'));
-    expect(json.stringify({'x':{'a':3}}), equals('{"x":{"a":3}}'));
-
-    // Dart does not guarantee an order on the keys
-    // of a map literal, so reparse and compare to the original Map.
-    validateRoundTrip(
-        {'x':3, 'y':-4.5, 'z':'hi', 'w':null, 'u':true, 'v':false});
-    validateRoundTrip({"x":3, "y":-4.5, "z":'hi'});
-    validateRoundTrip({' hi bob ':3, '':4.5});
-    validateRoundTrip(
-        {'x':{'a':3, 'b':-4.5}, 'y':[{}], 'z':'hi', 'w':{'c':null, 'd':true},
-                  'v':null});
-
-    expect(json.stringify(new ToJson(4)), "4");
-    expect(json.stringify(new ToJson([4, "a"])), '[4,"a"]');
-    expect(json.stringify(new ToJson([4, new ToJson({"x":42})])),
-           '[4,{"x":42}]');
-
-    expect(() {
-      json.stringify([new ToJson(new ToJson(4))]);
-    }, throwsJsonError);
-
-    expect(() {
-      json.stringify([new Object()]);
-    }, throwsJsonError);
-
-    expect(() {
-      json.stringify([double.NAN]);
-    }, throwsJsonError);
-
-    expect(() {
-      json.stringify([double.INFINITY]);
-    }, throwsJsonError);
-
-    expect(() {
-      json.stringify([-double.INFINITY]);
-    }, throwsJsonError);
-  });
-
-  test('stringify throws if argument cannot be converted', () {
-    /**
-     * Checks that we get an exception (rather than silently returning null) if
-     * we try to stringify something that cannot be converted to json.
-     */
-    expect(() => json.stringify(new TestClass()), throwsJsonError);
-  });
-
-  test('stringify throws if toJson throws', () {
-    expect(() => json.stringify(new ToJsoner("bad", throws: true)),
-           throwsJsonError);
-  });
-
-  test('stringify throws if toJson returns non-serializable value', () {
-    expect(() => json.stringify(new ToJsoner(new TestClass())),
-           throwsJsonError);
-  });
-
-  test('stringify throws on cyclic values', () {
-    var a = [];
-    var b = a;
-    for (int i = 0; i < 50; i++) {
-      b = [b];
-    }
-    a.add(b);
-    expect(() => json.stringify(a), throwsJsonError);
-  });
-}
-
-class TestClass {
-  int x;
-  String y;
-
-  TestClass() : x = 3, y = 'joe' { }
-}
-
-class ToJsoner {
-  final Object returnValue;
-  final bool throws;
-  ToJsoner(this.returnValue, {this.throws});
-  Object toJson() {
-    if (throws) throw returnValue;
-    return returnValue;
-  }
-}
-
-class ToJson {
-  final object;
-  const ToJson(this.object);
-  toJson() => object;
-}
-
-var throwsJsonError =
-    throwsA(new isInstanceOf<json.JsonUnsupportedObjectError>());
-
-/**
- * Checks that the argument can be converted to a JSON string and
- * back, and produce something equivalent to the argument.
- */
-validateRoundTrip(expected) {
-  expect(json.parse(json.stringify(expected)), equals(expected));
-}
diff --git a/pkg/json_rpc_2/CHANGELOG.md b/pkg/json_rpc_2/CHANGELOG.md
new file mode 100644
index 0000000..3b0694e
--- /dev/null
+++ b/pkg/json_rpc_2/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 0.0.2+2
+
+* Fix error response to include data from `RpcException` when not a map.
diff --git a/pkg/json_rpc_2/lib/error_code.dart b/pkg/json_rpc_2/lib/error_code.dart
index 40d6733..96cb909 100644
--- a/pkg/json_rpc_2/lib/error_code.dart
+++ b/pkg/json_rpc_2/lib/error_code.dart
@@ -22,7 +22,7 @@
 /// unavailable.
 const METHOD_NOT_FOUND = -32601;
 
-/// An error code indicating that the request paramaters are invalid for the
+/// An error code indicating that the request parameters are invalid for the
 /// requested method.
 const INVALID_PARAMS = -32602;
 
diff --git a/pkg/json_rpc_2/lib/src/exception.dart b/pkg/json_rpc_2/lib/src/exception.dart
index fb1cd2f..be9c2d3 100644
--- a/pkg/json_rpc_2/lib/src/exception.dart
+++ b/pkg/json_rpc_2/lib/src/exception.dart
@@ -52,6 +52,8 @@
       modifiedData['request'] = request;
     } else if (data == null) {
       modifiedData = {'request': request};
+    } else {
+      modifiedData = data;
     }
 
     var id = request is Map ? request['id'] : null;
diff --git a/pkg/json_rpc_2/pubspec.yaml b/pkg/json_rpc_2/pubspec.yaml
index f12be64..b340db3 100644
--- a/pkg/json_rpc_2/pubspec.yaml
+++ b/pkg/json_rpc_2/pubspec.yaml
@@ -1,5 +1,5 @@
 name: json_rpc_2
-version: 0.0.2
+version: 0.0.2+2
 author: Dart Team <misc@dartlang.org>
 description: An implementation of the JSON-RPC 2.0 spec.
 homepage: http://www.dartlang.org
diff --git a/pkg/json_rpc_2/test/server/parameters_test.dart b/pkg/json_rpc_2/test/server/parameters_test.dart
index 8bd126a..49e4573 100644
--- a/pkg/json_rpc_2/test/server/parameters_test.dart
+++ b/pkg/json_rpc_2/test/server/parameters_test.dart
@@ -5,7 +5,6 @@
 library json_rpc_2.test.server.parameters_test;
 
 import 'package:unittest/unittest.dart';
-import 'package:json_rpc_2/error_code.dart' as error_code;
 import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
 
 import 'utils.dart';
diff --git a/pkg/json_rpc_2/test/server/server_test.dart b/pkg/json_rpc_2/test/server/server_test.dart
index fc3adb5..c18a8ca 100644
--- a/pkg/json_rpc_2/test/server/server_test.dart
+++ b/pkg/json_rpc_2/test/server/server_test.dart
@@ -92,6 +92,22 @@
     }), completion(isNull));
   });
 
+  test("includes the error data in the response", () {
+    server.registerMethod('foo', (params) {
+      throw new json_rpc.RpcException(5, 'Error message.', data: 'data value');
+    });
+
+    expectErrorResponse(server, {
+      'jsonrpc': '2.0',
+      'method': 'foo',
+      'params': {},
+      'id': 1234
+    },
+        5,
+        'Error message.',
+        data: 'data value');
+  });
+
   group("JSON", () {
     test("handles a request parsed from JSON", () {
       server.registerMethod('foo', (params) {
diff --git a/pkg/json_rpc_2/test/server/utils.dart b/pkg/json_rpc_2/test/server/utils.dart
index 07f571c..6f92c0a 100644
--- a/pkg/json_rpc_2/test/server/utils.dart
+++ b/pkg/json_rpc_2/test/server/utils.dart
@@ -8,9 +8,10 @@
 import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
 
 void expectErrorResponse(json_rpc.Server server, request, int errorCode,
-    String message) {
+    String message, {data}) {
   var id;
   if (request is Map) id = request['id'];
+  if (data == null) data = {'request': request};
 
   expect(server.handleRequest(request), completion(equals({
     'jsonrpc': '2.0',
@@ -18,7 +19,7 @@
     'error': {
       'code': errorCode,
       'message': message,
-      'data': {'request': request}
+      'data': data
     }
   })));
 }
diff --git a/pkg/oauth2/CHANGELOG.md b/pkg/oauth2/CHANGELOG.md
new file mode 100644
index 0000000..da65ce6
--- /dev/null
+++ b/pkg/oauth2/CHANGELOG.md
@@ -0,0 +1,9 @@
+# 0.9.3
+
+* Update the `http` dependency.
+
+# 0.9.2
+
+* Expand the dependency on the HTTP package to include 0.10.x.
+
+* Add a README file.
diff --git a/pkg/oauth2/README.md b/pkg/oauth2/README.md
new file mode 100644
index 0000000..72aff2a
--- /dev/null
+++ b/pkg/oauth2/README.md
@@ -0,0 +1,100 @@
+A client library for authenticating with a remote service via OAuth2 on
+behalf of a user, and making authorized HTTP requests with the user's OAuth2
+credentials. Currently this only works where `dart:io` is available.
+
+OAuth2 allows a client (the program using this library) to access and
+manipulate a resource that's owned by a resource owner (the end user) and
+lives on a remote server. The client directs the resource owner to an
+authorization server (usually but not always the same as the server that
+hosts the resource), where the resource owner tells the authorization server
+to give the client an access token. This token serves as proof that the
+client has permission to access resources on behalf of the resource owner.
+
+OAuth2 provides several different methods for the client to obtain
+authorization. At the time of writing, this library only supports the
+[AuthorizationCodeGrant][] method, but further methods may be added in the
+future. The following example uses this method to authenticate, and assumes
+that the library is being used by a server-side application.
+
+[AuthorizationCodeGrant]: https://api.dartlang.org/apidocs/channels/stable/#oauth2/oauth2.AuthorizationCodeGrant
+
+```dart
+import 'dart:io'
+import 'package:oauth2/oauth2.dart' as oauth2;
+
+// These URLs are endpoints that are provided by the authorization
+// server. They're usually included in the server's documentation of its
+// OAuth2 API.
+final authorizationEndpoint =
+    Uri.parse("http://example.com/oauth2/authorization");
+final tokenEndpoint =
+    Uri.parse("http://example.com/oauth2/token");
+
+// The authorization server will issue each client a separate client
+// identifier and secret, which allows the server to tell which client
+// is accessing it. Some servers may also have an anonymous
+// identifier/secret pair that any client may use.
+//
+// Note that clients whose source code or binary executable is readily
+// available may not be able to make sure the client secret is kept a
+// secret. This is fine; OAuth2 servers generally won't rely on knowing
+// with certainty that a client is who it claims to be.
+final identifier = "my client identifier";
+final secret = "my client secret";
+
+// This is a URL on your application's server. The authorization server
+// will redirect the resource owner here once they've authorized the
+// client. The redirection will include the authorization code in the
+// query parameters.
+final redirectUrl = Uri.parse("http://my-site.com/oauth2-redirect");
+
+var credentialsFile = new File("~/.myapp/credentials.json");
+return credentialsFile.exists().then((exists) {
+  // If the OAuth2 credentials have already been saved from a previous
+  // run, we just want to reload them.
+  if (exists) {
+    return credentialsFile.readAsString().then((json) {
+      var credentials = new oauth2.Credentials.fromJson(json);
+      return new oauth2.Client(identifier, secret, credentials);
+    });
+  }
+
+  // If we don't have OAuth2 credentials yet, we need to get the
+  // resource owner to authorize us. We're assuming here that we're a
+  // command-line application.
+  var grant = new oauth2.AuthorizationCodeGrant(
+      identifier, secret, authorizationEndpoint, tokenEndpoint);
+
+  // Redirect the resource owner to the authorization URL. This will be
+  // a URL on the authorization server (authorizationEndpoint with some
+  // additional query parameters). Once the resource owner has
+  // authorized, they'll be redirected to `redirectUrl` with an
+  // authorization code.
+  //
+  // `redirect` is an imaginary function that redirects the resource
+  // owner's browser.
+  return redirect(grant.getAuthorizationUrl(redirectUrl)).then((_) {
+    // Another imaginary function that listens for a request to
+    // `redirectUrl`.
+    return listen(redirectUrl);
+  }).then((request) {
+    // Once the user is redirected to `redirectUrl`, pass the query
+    // parameters to the AuthorizationCodeGrant. It will validate them
+    // and extract the authorization code to create a new Client.
+    return grant.handleAuthorizationResponse(request.uri.queryParameters);
+  })
+}).then((client) {
+  // Once you have a Client, you can use it just like any other HTTP
+  // client.
+  return client.read("http://example.com/protected-resources.txt")
+      .then((result) {
+    // Once we're done with the client, save the credentials file. This
+    // ensures that if the credentials were automatically refreshed
+    // while using the client, the new credentials are available for the
+    // next run of the program.
+    return credentialsFile.open(FileMode.WRITE).then((file) {
+      return file.writeString(client.credentials.toJson());
+    }).then((file) => file.close()).then((_) => result);
+  });
+}).then(print);
+```
diff --git a/pkg/oauth2/lib/oauth2.dart b/pkg/oauth2/lib/oauth2.dart
index cca66ab..cb3c592 100644
--- a/pkg/oauth2/lib/oauth2.dart
+++ b/pkg/oauth2/lib/oauth2.dart
@@ -2,119 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// A client library for authenticating with a remote service via OAuth2 on
-/// behalf of a user, and making authorized HTTP requests with the user's OAuth2
-/// credentials.
-///
-/// ## Installing ##
-///
-/// Use [pub][] to install this package. Add the following to your
-/// `pubspec.yaml` file.
-///
-///     dependencies:
-///       oauth2: any
-///
-/// Then run `pub install`.
-///
-/// For more information, see the
-/// [oauth2 package on pub.dartlang.org][pkg].
-///
-/// OAuth2 allows a client (the program using this library) to access and
-/// manipulate a resource that's owned by a resource owner (the end user) and
-/// lives on a remote server. The client directs the resource owner to an
-/// authorization server (usually but not always the same as the server that
-/// hosts the resource), where the resource owner tells the authorization server
-/// to give the client an access token. This token serves as proof that the
-/// client has permission to access resources on behalf of the resource owner.
-///
-/// OAuth2 provides several different methods for the client to obtain
-/// authorization. At the time of writing, this library only supports the
-/// [AuthorizationCodeGrant] method, but further methods may be added in the
-/// future. The following example uses this method to authenticate, and assumes
-/// that the library is being used by a server-side application.
-///
-///     import 'dart:io'
-///     import 'package:oauth2/oauth2.dart' as oauth2;
-///
-///     // These URLs are endpoints that are provided by the authorization
-///     // server. They're usually included in the server's documentation of its
-///     // OAuth2 API.
-///     final authorizationEndpoint =
-///         Uri.parse("http://example.com/oauth2/authorization");
-///     final tokenEndpoint =
-///         Uri.parse("http://example.com/oauth2/token");
-///     
-///     // The authorization server will issue each client a separate client
-///     // identifier and secret, which allows the server to tell which client
-///     // is accessing it. Some servers may also have an anonymous
-///     // identifier/secret pair that any client may use.
-///     //
-///     // Note that clients whose source code or binary executable is readily
-///     // available may not be able to make sure the client secret is kept a
-///     // secret. This is fine; OAuth2 servers generally won't rely on knowing
-///     // with certainty that a client is who it claims to be.
-///     final identifier = "my client identifier";
-///     final secret = "my client secret";
-///
-///     // This is a URL on your application's server. The authorization server
-///     // will redirect the resource owner here once they've authorized the
-///     // client. The redirection will include the authorization code in the
-///     // query parameters.
-///     final redirectUrl = Uri.parse(
-///         "http://my-site.com/oauth2-redirect");
-///     
-///     var credentialsFile = new File("~/.myapp/credentials.json");
-///     return credentialsFile.exists().then((exists) {
-///       // If the OAuth2 credentials have already been saved from a previous
-///       // run, we just want to reload them.
-///       if (exists) {
-///         return credentialsFile.readAsString().then((json) {
-///           var credentials = new oauth2.Credentials.fromJson(json);
-///           return new oauth2.Client(identifier, secret, credentials);
-///         });
-///       }
-///     
-///       // If we don't have OAuth2 credentials yet, we need to get the
-///       // resource owner to authorize us. We're assuming here that we're a
-///       // command-line application.
-///       var grant = new oauth2.AuthorizationCodeGrant(
-///           identifier, secret, authorizationEndpoint, tokenEndpoint);
-///     
-///       // Redirect the resource owner to the authorization URL. This will be
-///       // a URL on the authorization server (authorizationEndpoint with some
-///       // additional query parameters). Once the resource owner has
-///       // authorized, they'll be redirected to `redirectUrl` with an
-///       // authorization code.
-///       //
-///       // `redirect` is an imaginary function that redirects the resource
-///       // owner's browser.
-///       return redirect(grant.getAuthorizationUrl(redirectUrl)).then((_) {
-///         // Another imaginary function that listens for a request to
-///         // `redirectUrl`.
-///         return listen(redirectUrl);
-///       }).then((request) {
-///         // Once the user is redirected to `redirectUrl`, pass the query
-///         // parameters to the AuthorizationCodeGrant. It will validate them
-///         // and extract the authorization code to create a new Client.
-///         return grant.handleAuthorizationResponse(request.uri.queryParameters);
-///       })
-///     }).then((client) {
-///       // Once you have a Client, you can use it just like any other HTTP
-///       // client.
-///       return client.read("http://example.com/protected-resources.txt")
-///           .then((result) {
-///         // Once we're done with the client, save the credentials file. This
-///         // ensures that if the credentials were automatically refreshed
-///         // while using the client, the new credentials are available for the
-///         // next run of the program.
-///         return credentialsFile.open(FileMode.WRITE).then((file) {
-///           return file.writeString(client.credentials.toJson());
-///         }).then((file) => file.close()).then((_) => result);
-///       });
-///     }).then(print);
-///
-/// [pub]: http://pub.dartlang.org
-/// [pkg]: http://pub.dartlang.org/packages/oauth2
 library oauth2;
 
 export 'src/authorization_code_grant.dart';
diff --git a/pkg/oauth2/lib/src/handle_access_token_response.dart b/pkg/oauth2/lib/src/handle_access_token_response.dart
index 11a6fb9..5766362 100644
--- a/pkg/oauth2/lib/src/handle_access_token_response.dart
+++ b/pkg/oauth2/lib/src/handle_access_token_response.dart
@@ -4,10 +4,10 @@
 
 library handle_access_token_response;
 
-import 'dart:io';
 import 'dart:convert';
 
 import 'package:http/http.dart' as http;
+import 'package:http_parser/http_parser.dart';
 
 import 'credentials.dart';
 import 'authorization_exception.dart';
@@ -31,15 +31,13 @@
     _validate(response, tokenEndpoint, condition, message);
 
   var contentType = response.headers['content-type'];
-  if (contentType != null) {
-    contentType = ContentType.parse(contentType);
-  }
+  if (contentType != null) contentType = new MediaType.parse(contentType);
 
   // The spec requires a content-type of application/json, but some endpoints
   // (e.g. Dropbox) serve it as text/javascript instead.
   validate(contentType != null &&
-      (contentType.value == "application/json" ||
-       contentType.value == "text/javascript"),
+      (contentType.mimeType == "application/json" ||
+       contentType.mimeType == "text/javascript"),
       'content-type was "$contentType", expected "application/json"');
 
   var parameters;
@@ -105,10 +103,8 @@
   }
 
   var contentType = response.headers['content-type'];
-  if (contentType != null) {
-    contentType = ContentType.parse(contentType);
-  }
-  validate(contentType != null && contentType.value == "application/json",
+  if (contentType != null) contentType = new MediaType.parse(contentType);
+  validate(contentType != null && contentType.mimeType == "application/json",
       'content-type was "$contentType", expected "application/json"');
 
   var parameters;
diff --git a/pkg/oauth2/pubspec.yaml b/pkg/oauth2/pubspec.yaml
index 61c4f52..2e61c58 100644
--- a/pkg/oauth2/pubspec.yaml
+++ b/pkg/oauth2/pubspec.yaml
@@ -1,5 +1,5 @@
 name: oauth2
-version: 0.9.2-dev
+version: 0.9.3-dev
 author: Dart Team <misc@dartlang.org>
 homepage: http://www.dartlang.org
 description: >
@@ -9,6 +9,7 @@
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  http: '>=0.9.2 <0.11.0'
+  http: '>=0.11.0-dev <0.12.0'
+  http_parser: '>=0.0.0 <0.1.0'
 dev_dependencies:
   unittest: '>=0.9.0 <0.11.0'
diff --git a/pkg/observe/lib/src/observable_map.dart b/pkg/observe/lib/src/observable_map.dart
index a46c645..b09c468 100644
--- a/pkg/observe/lib/src/observable_map.dart
+++ b/pkg/observe/lib/src/observable_map.dart
@@ -118,8 +118,10 @@
     if (len != _map.length) {
       notifyPropertyChange(#length, len, _map.length);
       notifyChange(new MapChangeRecord.insert(key, value));
+      _notifyKeysValuesChanged();
     } else if (oldValue != value) {
       notifyChange(new MapChangeRecord(key, oldValue, value));
+      _notifyValuesChanged();
     }
   }
 
@@ -133,6 +135,7 @@
     if (hasObservers && len != _map.length) {
       notifyPropertyChange(#length, len, _map.length);
       notifyChange(new MapChangeRecord.insert(key, result));
+      _notifyKeysValuesChanged();
     }
     return result;
   }
@@ -143,6 +146,7 @@
     if (hasObservers && len != _map.length) {
       notifyChange(new MapChangeRecord.remove(key, result));
       notifyPropertyChange(#length, len, _map.length);
+      _notifyKeysValuesChanged();
     }
     return result;
   }
@@ -154,6 +158,7 @@
         notifyChange(new MapChangeRecord.remove(key, value));
       });
       notifyPropertyChange(#length, len, 0);
+      _notifyKeysValuesChanged();
     }
     _map.clear();
   }
@@ -161,4 +166,15 @@
   void forEach(void f(K key, V value)) => _map.forEach(f);
 
   String toString() => Maps.mapToString(this);
+
+  // Note: we don't really have a reasonable old/new value to use here.
+  // But this should fix "keys" and "values" in templates with minimal overhead.
+  void _notifyKeysValuesChanged() {
+    notifyChange(new PropertyChangeRecord(this, #keys, null, null));
+    _notifyValuesChanged();
+  }
+
+  void _notifyValuesChanged() {
+    notifyChange(new PropertyChangeRecord(this, #values, null, null));
+  }
 }
diff --git a/pkg/observe/lib/src/path_observer.dart b/pkg/observe/lib/src/path_observer.dart
index 0d631a0..cfaab18 100644
--- a/pkg/observe/lib/src/path_observer.dart
+++ b/pkg/observe/lib/src/path_observer.dart
@@ -82,8 +82,12 @@
 }
 
 /// A dot-delimieted property path such as "foo.bar" or "foo.10.bar".
+///
 /// The path specifies how to get a particular value from an object graph, where
-/// the graph can include arrays.
+/// the graph can include arrays and maps. Each segment of the path describes
+/// how to take a single step in the object graph. Properties like 'foo' or
+/// 'bar' are read as properties on objects, or as keys if the object is a [Map]
+/// or a [Indexable], while integer values are read as indexes in a [List].
 // TODO(jmesserly): consider specialized subclasses for:
 // * empty path
 // * "value"
@@ -180,7 +184,7 @@
     return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
   }
 
-  /// Returns the current of the path from the provided [obj]ect.
+  /// Returns the current value of the path from the provided [obj]ect.
   getValueFrom(Object obj) {
     if (!isValid) return null;
     for (var segment in _segments) {
@@ -233,6 +237,12 @@
   return false;
 }
 
+/// Properties in [Map] that need to be read as properties and not as keys in
+/// the map. We exclude methods ('containsValue', 'containsKey', 'putIfAbsent',
+/// 'addAll', 'remove', 'clear', 'forEach') because there is no use in reading
+/// them as part of path-observer segments.
+const _MAP_PROPERTIES = const [#keys, #values, #length, #isEmpty, #isNotEmpty];
+
 _getObjectProperty(object, property) {
   if (object == null) return null;
 
@@ -241,21 +251,24 @@
       return object[property];
     }
   } else if (property is Symbol) {
-    final type = object.runtimeType;
+    // Support indexer if available, e.g. Maps or polymer_expressions Scope.
+    // This is the default syntax used by polymer/nodebind and
+    // polymer/observe-js PathObserver.
+    // TODO(sigmund): should we also support using checking dynamically for
+    // whether the type practically implements the indexer API
+    // (smoke.hasInstanceMethod(type, const Symbol('[]')))?
+    if (object is Indexable<String, dynamic> ||
+        object is Map<String, dynamic> && !_MAP_PROPERTIES.contains(property)) {
+      return object[smoke.symbolToName(property)];
+    }
     try {
-      if (smoke.hasGetter(type, property) || smoke.hasNoSuchMethod(type)) {
-        return smoke.read(object, property);
-      }
-      // Support indexer if available, e.g. Maps or polymer_expressions Scope.
-      // This is the default syntax used by polymer/nodebind and
-      // polymer/observe-js PathObserver.
-      if (smoke.hasInstanceMethod(type, const Symbol('[]'))) {
-        return object[smoke.symbolToName(property)];
-      }
+      return smoke.read(object, property);
     } on NoSuchMethodError catch (e) {
       // Rethrow, unless the type implements noSuchMethod, in which case we
       // interpret the exception as a signal that the method was not found.
-      if (!smoke.hasNoSuchMethod(type)) rethrow;
+      // Dart note: getting invalid properties is an error, unlike in JS where
+      // it returns undefined.
+      if (!smoke.hasNoSuchMethod(object.runtimeType)) rethrow;
     }
   }
 
@@ -274,19 +287,17 @@
       return true;
     }
   } else if (property is Symbol) {
-    final type = object.runtimeType;
+    // Support indexer if available, e.g. Maps or polymer_expressions Scope.
+    if (object is Indexable<String, dynamic> ||
+        object is Map<String, dynamic> && !_MAP_PROPERTIES.contains(property)) {
+      object[smoke.symbolToName(property)] = value;
+      return true;
+    }
     try {
-      if (smoke.hasSetter(type, property) || smoke.hasNoSuchMethod(type)) {
-        smoke.write(object, property, value);
-        return true;
-      }
-      // Support indexer if available, e.g. Maps or polymer_expressions Scope.
-      if (smoke.hasInstanceMethod(type, const Symbol('[]='))) {
-        object[smoke.symbolToName(property)] = value;
-        return true;
-      }
-    } on NoSuchMethodError catch (e) {
-      if (!smoke.hasNoSuchMethod(type)) rethrow;
+      smoke.write(object, property, value);
+      return true;
+    } on NoSuchMethodError catch (e, s) {
+      if (!smoke.hasNoSuchMethod(object.runtimeType)) rethrow;
     }
   }
 
@@ -470,6 +481,13 @@
   }
 }
 
+/// An object accepted by [PropertyPath] where properties are read and written
+/// as indexing operations, just like a [Map].
+abstract class Indexable<K, V> {
+  V operator [](K key);
+  operator []=(K key, V value);
+}
+
 const _observerSentinel = const _ObserverSentinel();
 class _ObserverSentinel { const _ObserverSentinel(); }
 
diff --git a/pkg/observe/lib/transformer.dart b/pkg/observe/lib/transformer.dart
index 2c5a17e..776cc3f 100644
--- a/pkg/observe/lib/transformer.dart
+++ b/pkg/observe/lib/transformer.dart
@@ -45,22 +45,23 @@
     return files;
   }
 
-  Future<bool> isPrimary(Asset input) {
-    if (input.id.extension != '.dart' ||
-        (_files != null && !_files.contains(input.id.path))) {
-      return new Future.value(false);
-    }
-    // Note: technically we should parse the file to find accurately the
-    // observable annotation, but that seems expensive. It would require almost
-    // as much work as applying the transform. We rather have some false
-    // positives here, and then generate no outputs when we apply this
-    // transform.
-    return input.readAsString().then(
-      (c) => c.contains("@observable") || c.contains("@published"));
+  // TODO(nweiz): This should just take an AssetId when barback <0.13.0 support
+  // is dropped.
+  Future<bool> isPrimary(idOrAsset) {
+    var id = idOrAsset is AssetId ? idOrAsset : idOrAsset.id;
+    return new Future.value(id.extension == '.dart' &&
+        (_files == null || _files.contains(id.path)));
   }
 
   Future apply(Transform transform) {
     return transform.primaryInput.readAsString().then((content) {
+      // Do a quick string check to determine if this is this file even
+      // plausibly might need to be transformed. If not, we can avoid an
+      // expensive parse.
+      if (!content.contains("@observable") && !content.contains("@published")) {
+        return;
+      }
+
       var id = transform.primaryInput.id;
       // TODO(sigmund): improve how we compute this url
       var url = id.path.startsWith('lib/')
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index 8320b58..bf2bd93 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -1,5 +1,5 @@
 name: observe
-version: 0.10.0-pre.3.dev
+version: 0.10.0-pre.4.dev
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Observable properties and objects for use in template_binding.
@@ -10,7 +10,7 @@
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
   analyzer: '>=0.13.0 <0.14.0'
-  barback: '>=0.9.0 <0.13.0'
+  barback: '>=0.9.0 <0.14.0'
   logging: '>=0.9.0 <0.10.0'
   path: '>=0.9.0 <2.0.0'
   smoke: '>=0.1.0-pre.0 <0.2.0'
diff --git a/pkg/observe/test/observable_map_test.dart b/pkg/observe/test/observable_map_test.dart
index 063287e..ee494c48 100644
--- a/pkg/observe/test/observable_map_test.dart
+++ b/pkg/observe/test/observable_map_test.dart
@@ -188,6 +188,80 @@
     expect(map.toString(), '{a: 1, b: 2}');
   });
 
+  group('observe keys/values', () {
+    ObservableMap map;
+    int keysChanged;
+    int valuesChanged;
+
+    setUp(() {
+      map = toObservable({'a': 1, 'b': 2, 'c': 3});
+      keysChanged = 0;
+      valuesChanged = 0;
+      sub = map.changes.listen((records) {
+        keysChanged += getPropertyChangeRecords(records, #keys).length;
+        valuesChanged += getPropertyChangeRecords(records, #values).length;
+      });
+    });
+
+    tearDown(sharedTearDown);
+
+    test('add item changes keys/values', () {
+      map['d'] = 4;
+      expect(map, {'a': 1, 'b': 2, 'c': 3, 'd': 4});
+      return new Future(() {
+        expect(keysChanged, 1);
+        expect(valuesChanged, 1);
+      });
+    });
+
+    test('putIfAbsent changes keys/values', () {
+      map.putIfAbsent('d', () => 4);
+      expect(map, {'a': 1, 'b': 2, 'c': 3, 'd': 4});
+      return new Future(() {
+        expect(keysChanged, 1);
+        expect(valuesChanged, 1);
+      });
+    });
+
+    test('remove changes keys/values', () {
+      map.remove('c');
+      map.remove('a');
+      expect(map, {'b': 2});
+      return new Future(() {
+        expect(keysChanged, 2);
+        expect(valuesChanged, 2);
+      });
+    });
+
+    test('remove non-existent item does not change keys/values', () {
+      map.remove('d');
+      expect(map, {'a': 1, 'b': 2, 'c': 3});
+      return new Future(() {
+        expect(keysChanged, 0);
+        expect(valuesChanged, 0);
+      });
+    });
+
+    test('set existing item does not change keys', () {
+      map['c'] = 9000;
+      expect(map, {'a': 1, 'b': 2, 'c': 9000});
+      return new Future(() {
+        expect(keysChanged, 0);
+        expect(valuesChanged, 1);
+      });
+    });
+
+    test('clear changes keys/values', () {
+      map.clear();
+      expect(map, {});
+      return new Future(() {
+        expect(keysChanged, 1);
+        expect(valuesChanged, 1);
+      });
+    });
+  });
+
+
   group('change records', () {
     List<ChangeRecord> records;
     ObservableMap map;
@@ -232,6 +306,8 @@
         expectChanges(records, [
           _lengthChange(map, 2, 3),
           _insertKey('c', 3),
+          _propChange(map, #keys),
+          _propChange(map, #values),
         ]);
       });
     });
@@ -246,8 +322,11 @@
       return new Future(() {
         expectChanges(records, [
           _changeKey('a', 1, 42),
+          _propChange(map, #values),
           _lengthChange(map, 2, 3),
-          _insertKey('c', 3)
+          _insertKey('c', 3),
+          _propChange(map, #keys),
+          _propChange(map, #values),
         ]);
       });
     });
@@ -260,6 +339,8 @@
         expectChanges(records, [
           _removeKey('b', 2),
           _lengthChange(map, 2, 1),
+          _propChange(map, #keys),
+          _propChange(map, #values),
         ]);
       });
     });
@@ -273,6 +354,8 @@
           _removeKey('a', 1),
           _removeKey('b', 2),
           _lengthChange(map, 2, 0),
+          _propChange(map, #keys),
+          _propChange(map, #values),
         ]);
       });
     });
@@ -287,3 +370,5 @@
 _insertKey(key, newValue) => new MapChangeRecord.insert(key, newValue);
 
 _removeKey(key, oldValue) => new MapChangeRecord.remove(key, oldValue);
+
+_propChange(map, prop) => new PropertyChangeRecord(map, prop, null, null);
diff --git a/pkg/observe/test/path_observer_test.dart b/pkg/observe/test/path_observer_test.dart
index 8d71680..674f8b2 100644
--- a/pkg/observe/test/path_observer_test.dart
+++ b/pkg/observe/test/path_observer_test.dart
@@ -9,7 +9,9 @@
 
 // This file contains code ported from:
 // https://github.com/rafaelw/ChangeSummary/blob/master/tests/test.js
-
+// Dart note: getting invalid properties is an error, unlike in JS where it
+// returns undefined. This difference comes up where we check for _throwsNSM in
+// the tests below.
 main() => dirtyCheckZone().run(() {
   group('PathObserver', observePathTests);
 
@@ -68,19 +70,18 @@
   });
 });
 
-
 observePathTests() {
   test('Degenerate Values', () {
     expect(new PathObserver(null, '').value, null);
     expect(new PathObserver(123, '').value, 123);
-    expect(new PathObserver(123, 'foo.bar.baz').value, null);
+    expect(() => new PathObserver(123, 'foo.bar.baz').value, _throwsNSM('foo'));
 
     // shouldn't throw:
     new PathObserver(123, '')..open((_) {})..close();
     new PropertyPath('').setValueFrom(null, null);
     new PropertyPath('').setValueFrom(123, 42);
-    new PropertyPath('foo.bar.baz').setValueFrom(123, 42);
-
+    expect(() => new PropertyPath('foo.bar.baz').setValueFrom(123, 42),
+        _throwsNSM('foo'));
     var foo = {};
     expect(new PathObserver(foo, '').value, foo);
 
@@ -105,7 +106,8 @@
     expect(new PathObserver(obj, 'value.value.value').value, 3);
 
     obj.value = new ObservableBox(4);
-    expect(new PathObserver(obj, 'value.value.value').value, null);
+    expect(() => new PathObserver(obj, 'value.value.value').value,
+        _throwsNSM('value'));
     expect(new PathObserver(obj, 'value.value').value, 4);
   });
 
@@ -125,7 +127,7 @@
     expect(new PathObserver(obj, 'a.b.c').value, 3);
 
     obj['a'] = toObservable({'b': 4});
-    expect(new PathObserver(obj, 'a.b.c').value, null);
+    expect(() => new PathObserver(obj, 'a.b.c').value, _throwsNSM('c'));
     expect(new PathObserver(obj, 'a.b').value, 4);
   });
 
@@ -138,8 +140,9 @@
     new PropertyPath('bar').setValueFrom(obj, bar);
     expect(obj['bar'], bar);
 
-    new PropertyPath('bar.baz.bat').setValueFrom(obj, 'not here');
-    expect(new PathObserver(obj, 'bar.baz.bat').value, null);
+    expect(() => new PropertyPath('bar.baz.bat').setValueFrom(obj, 'not here'),
+        _throwsNSM('bat='));
+    expect(() => new PathObserver(obj, 'bar.baz.bat').value, _throwsNSM('bat'));
   });
 
   test('set value back to same', () {
@@ -239,7 +242,13 @@
 
       var path = new PathObserver(model, 'a.b.c');
       var lastValue = null;
-      path.open((x) { lastValue = x; });
+      var errorSeen = false;
+      runZoned(() {
+        path.open((x) { lastValue = x; });
+      }, onError: (e) {
+        expect(e, _isNoSuchMethodOf('c'));
+        errorSeen = true;
+      });
 
       model.a.b.c = 'hello, mom';
 
@@ -257,15 +266,17 @@
         expect(lastValue, 'hello, you');
 
         model.a.b = 1;
+        expect(errorSeen, isFalse);
       }).then(newMicrotask).then((_) {
-        expect(lastValue, null);
+        expect(errorSeen, isTrue);
+        expect(lastValue, 'hello, you');
 
         // Stop observing
         path.close();
 
         model.a.b = createModel()..c = 'hello, back again -- but not observing';
       }).then(newMicrotask).then((_) {
-        expect(lastValue, null);
+        expect(lastValue, 'hello, you');
 
         // Resume observing
         new PathObserver(model, 'a.b.c').open((x) { lastValue = x; });
@@ -300,10 +311,10 @@
     var model = new ObjectWithErrors();
     var observer = new PathObserver(model, 'foo');
 
-    expect(() => observer.value, throws);
+    expect(() => observer.value, _throwsNSM('bar'));
     expect(model.getFooCalled, 1);
 
-    expect(() { observer.value = 123; }, throws);
+    expect(() { observer.value = 123; }, _throwsNSM('bar='));
     expect(model.setFooCalled, [123]);
   });
 
@@ -352,6 +363,19 @@
   });
 }
 
+/// A matcher that checks that a closure throws a NoSuchMethodError matching the
+/// given [name].
+_throwsNSM(String name) => throwsA(_isNoSuchMethodOf(name));
+
+/// A matcher that checkes whether an exception is a NoSuchMethodError matching
+/// the given [name].
+_isNoSuchMethodOf(String name) => predicate((e) =>
+    e is NoSuchMethodError &&
+    // Dart2js and VM error messages are a bit different, but they both contain
+    // the name.
+    ('$e'.contains("'$name'") || // VM error
+     '$e'.contains('\'Symbol("$name")\''))); // dart2js error
+
 class ObjectWithErrors {
   int getFooCalled = 0;
   List setFooCalled = [];
@@ -383,7 +407,7 @@
   }
 }
 
-class IndexerModel {
+class IndexerModel implements Indexable<String, dynamic> {
   var _foo = 42;
   List log = [];
 
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 0ffbc6e..9cf80d5 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -16,7 +16,6 @@
 
 scheduled_test/test/scheduled_server_test: Pass, Fail # 13524
 scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
-polymer/test/event_path_test: Pass, Fail # Issue 15766
 
 [ $compiler == dart2js && $mode == debug ]
 docgen/test/generate_json_test: Skip # Way too slow
@@ -26,10 +25,31 @@
 
 [ $runtime == vm && $mode == debug]
 docgen/test/only_lib_content_in_pkg_test: Skip # Slow
+polymer/test/build/all_phases_test: Skip # Slow
+analysis_server/test/analysis_server_test: Pass, Timeout
+analysis_server/test/domain_context_test: Pass, Timeout
+analysis_server/test/domain_server_test: Pass, Timeout
+analyzer/test/generated/element_test: Pass, Timeout
+analyzer/test/generated/parser_test: Pass, Timeout
+code_transformers/test/resolver_test: Pass, Timeout
+docgen/test/only_lib_content_in_pkg_test: Pass, Timeout
+polymer_expressions/test/globals_test: Pass, Timeout
+polymer/test/build/all_phases_test: Pass, Timeout
+polymer/test/build/script_compactor_test: Pass, Timeout
+smoke/test/codegen/end_to_end_test: Pass, Timeout
+smoke/test/codegen/recorder_test: Pass, Timeout
+template_binding/test/template_binding_test: Pass, Timeout
+third_party/html5lib/test/tokenizer_test: Pass, Timeout
 
 [ $runtime == vm && ( $arch == simarm || $arch == simmips ) ]
 docgen/test/only_lib_content_in_pkg_test: Skip # slow
 docgen/test/typedef_test: Skip # slow
+barback/test/too_many_open_files_test: Skip # 14220
+third_party/html5lib/test/tokenizer_test: Pass, Slow
+docgen/test/generate_json_test: Skip # Issue 17003
+polymer/test/build/script_compactor_test: Skip # Slow
+polymer/test/build/all_phases_test: Skip # Slow
+code_transformers/test/resolver_test: Skip # Issue 17908
 
 [ $compiler == dart2js ]
 collection/test/equality_test/01: Fail # Issue 1533
@@ -38,9 +58,10 @@
 collection/test/equality_test/04: Fail # Issue 1533
 collection/test/equality_test/05: Fail # Issue 1533
 collection/test/equality_test/none: Pass, Fail # Issue 14348
+docgen/test/multi_library_test: Slow, Pass # issue 17060
+shelf/test/message_test: RuntimeError # Issue 18109
 third_party/angular_tests/browser_test: Pass, Slow # Large dart2js compile time
 typed_data/test/typed_buffers_test/01: Fail # Not supporting Int64List, Uint64List.
-docgen/test/multi_library_test: Slow, Pass # issue 17060
 
 [ $compiler == dart2js && $checked ]
 crypto/test/base64_test: Slow, Pass
@@ -75,6 +96,7 @@
 polymer/test/events_test: Skip #uses dart:html
 polymer/test/instance_attrs_test: Skip #uses dart:html
 polymer/test/js_interop_test: Skip #uses dart:html
+polymer/test/mirror_loader_test: Skip # uses dart:html
 polymer/test/nested_binding_test: Skip # uses dart:html
 polymer/test/noscript_test: Skip #uses dart:html
 polymer/test/prop_attr_bind_reflection_test: Skip #uses dart:html
@@ -135,7 +157,7 @@
 [ $runtime == vm && $system == windows ]
 intl/test/find_default_locale_standalone_test: Fail # Issue 8110
 
-[ $compiler == dartanalyzer ]
+[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 # These tests are runtime negative but statically positive, so we skip
 # them in the analyzer.
 mock/test/mock_regexp_negative_test: Skip
@@ -145,17 +167,7 @@
 polymer/example/canonicalization3: Skip
 
 third_party/angular_tests/browser_test: StaticWarning # Issue 15890
-
-[ $compiler == dart2analyzer ]
-# These tests are runtime negative but statically positive, so we skip
-# them in the analyzer.
-mock/test/mock_regexp_negative_test: Skip
-mock/test/mock_stepwise_negative_test: Skip
-polymer/example/canonicalization: Skip
-polymer/example/canonicalization2: Skip
-polymer/example/canonicalization3: Skip
-
-third_party/angular_tests/browser_test: StaticWarning # Issue 15890
+docgen/test/*: StaticWarning # Issue 17896
 
 [ $compiler == dart2js && $runtime == none]
 polymer/example/canonicalization: Skip
@@ -183,11 +195,7 @@
 crypto/test/sha256_test: Slow, Pass
 crypto/test/sha1_test: Slow, Pass
 polymer/example/component: Fail # Issue 13198
-polymer/example/canonicalization/test/dev_test: Fail, OK # tests development only behavior
-polymer/example/canonicalization/test/dev2_test: Fail, OK # tests development only behavior
-polymer/example/canonicalization/test/dev3_test: Fail, OK # tests development only behavior
-polymer/example/canonicalization/test/dir/dev_test: Fail, OK # tests development only behavior
-polymer/example/canonicalization/test/dir/dev2_test: Fail, OK # tests development only behavior
+polymer/test/mirror_loader_test: Skip # tests development only behavior
 
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
 docgen/test/single_library_test: Fail # TODO(kasperl): Please triage.
@@ -195,16 +203,16 @@
 
 [ $browser ]
 analysis_server/test/*: Skip # Uses dart:io.
+analyzer/test/error_test: Fail, OK # Uses dart:io.
 analyzer/test/generated/ast_test: Fail, OK # Uses dart:io.
 analyzer/test/generated/element_test: Fail, OK # Uses dart:io.
+analyzer/test/generated/element_test: Fail, OK # Uses dart:io.
 analyzer/test/generated/parser_test: Fail, OK # Uses dart:io.
 analyzer/test/generated/resolver_test: Fail, OK # Uses dart:io.
-analyzer/test/error_test: Fail, OK # Uses dart:io.
-analyzer/test/generated/element_test: Fail, OK # Uses dart:io.
 analyzer/test/generated/resolver_test: Fail, OK # Uses dart:io.
 analyzer/test/options_test: Fail, OK # Uses dart:io.
-analyzer/test/services/formatter_test: Fail, OK # Uses dart:io.
 analyzer/test/parse_compilation_unit_test: Fail, OK # Uses dart:io.
+analyzer/test/services/formatter_test: Fail, OK # Uses dart:io.
 barback/test/*: Fail, OK # Uses dart:io.
 code_transformers/test/*: Skip # Uses dart:io.
 http/test/client_test: Fail, OK # Uses dart:io.
@@ -218,9 +226,10 @@
 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.
 intl/test/find_default_locale_standalone_test: Fail, OK # Uses dart:io.
-intl/test/message_extraction/message_extraction_test: Fail, OK # Uses dart:io.
-intl/test/message_extraction/failed_extraction_test: Fail, OK # Users dart:io
 intl/test/message_extraction/examples_parsing_test: Fail, OK # Users dart:io
+intl/test/message_extraction/failed_extraction_test: Fail, OK # Users dart:io
+intl/test/message_extraction/message_extraction_test: Fail, OK # Uses dart:io.
+intl/test/message_extraction/really_fail_extraction_test: Fail, OK # Users dart:io
 oauth2/test/authorization_code_grant_test: Fail, OK # Uses dart:io.
 oauth2/test/client_test: Fail, OK # Uses dart:io.
 oauth2/test/credentials_test: Fail, OK # Uses dart:io.
@@ -228,10 +237,11 @@
 observe/test/transformer_test: Fail, OK # Uses dart:io.
 path/test/io_test: Fail, OK # Uses dart:io.
 polymer/test/build/*: Fail, OK # Uses dart:io.
-smoke/test/codegen/recorder_test: Skip # Uses dart:io.
+shelf/test/shelf_io_test: Fail, OK # Uses dart:io
 smoke/test/codegen/end_to_end_test: Skip # Uses dart:io.
-third_party/angular_tests/vm_test: Skip # Uses dart:io
+smoke/test/codegen/recorder_test: Skip # Uses dart:io.
 third_party/angular_tests/browser_test/core_dom/cookies: Fail # Issue 16337
+third_party/angular_tests/vm_test: Skip # Uses dart:io
 watcher/test/*: Fail, OK # Uses dart:io.
 
 scheduled_test/test/descriptor/*: Fail # http://dartbug.com/8440
@@ -261,14 +271,15 @@
 [ $arch == arm ]
 *: Skip  # Issue 13624
 
-[ $arch == simarm || $arch == simmips ]
-barback/test/too_many_open_files_test: Skip # 14220
-third_party/html5lib/test/tokenizer_test: Pass, Slow
-docgen/test/generate_json_test: Skip # Issue 17003
-
 [ $arch == simarm && $checked ]
 watcher/test/directory_watcher/linux_test: Skip # Issue 16118
 
+[ $arch == simmips && $checked ]
+http/test/http_test: Pass, Crash # Issue 18015
+
+[ $arch == simarm64 ]
+*: Skip
+
 # Skip serialization test that explicitly has no library declaration in the
 # test on Dartium, which requires all tests to have a library.
 [ $compiler == none && ( $runtime == dartium || $runtime == drt ) ]
@@ -298,19 +309,12 @@
 unittest/test/unittest_test_returning_future_test: Fail # 13921
 unittest/test/unittest_test_returning_future_using_runasync_test: Fail # 13921
 unittest/test/unittest_testcases_immutable_test: Fail # 13921
-polymer/example/canonicalization/test/deploy2_test: Fail, OK # tests deploy only behavior
-polymer/example/canonicalization/test/deploy3_test: Fail, OK # tests deploy only behavior
-polymer/example/canonicalization/test/deploy_test: Fail, OK # tests deploy only behavior
-polymer/example/canonicalization/test/dir/deploy2_test: Fail, OK # tests deploy only behavior
-polymer/example/canonicalization/test/dir/deploy_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 ]
-intl/test/message_extraction/message_extraction_test: Skip # Issue 17130
-
 # Skip tests on the VM if the package depends on dart:html
 custom_element: Skip
 template_binding: Skip
@@ -322,6 +326,7 @@
 
 [ $runtime == safari || $ie ]
 polymer_expressions/test/globals_test: Fail # Issue 16568
+polymer_expressions/test/bindings_test: Fail # Issue 16568
 
 [ $browser ]
 docgen/test/*: Skip  # Uses dart:io
@@ -336,6 +341,8 @@
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 matcher/test/matchers_test: StaticWarning, OK # testing error creating abstract class
+scheduled_test/test/scheduled_test/on_complete_test: StaticWarning # Issue 18113
+scheduled_test/test/scheduled_test/set_up_test: StaticWarning # Issue 18113
 
 [ $runtime == vm && ($system == windows || $system == macos) ]
 watcher/test/*/linux_test: Skip
@@ -355,31 +362,7 @@
 third_party/angular_tests/browser_test/change_detection/dirty_checking_change_detector: Skip # Issue 17152
 
 [ $use_repository_packages ]
-analyzer/test/error_test: PubGetError
-analyzer/test/generated/ast_test: PubGetError
-analyzer/test/generated/element_test: PubGetError
-analyzer/test/generated/parser_test: PubGetError
-analyzer/test/generated/resolver_test: PubGetError
-analyzer/test/generated/scanner_test: PubGetError
-analyzer/test/options_test: PubGetError
-analyzer/test/parse_compilation_unit_test: PubGetError
-analyzer/test/services/formatter_test: PubGetError
-args/test/args_test: PubGetError
-args/test/command_test: PubGetError
-args/test/parse_all_test: PubGetError
-args/test/parse_test: PubGetError
-args/test/usage_test: PubGetError
-async/test/stream_zip_test: PubGetError
-async/test/stream_zip_zone_test: PubGetError
-collection/test/algorithms_test: PubGetError
-collection/test/iterable_zip_test: PubGetError
-collection/test/priority_queue_test: PubGetError
-collection/test/unmodifiable_collection_test: PubGetError
-collection/test/wrapper_test: PubGetError
-stack_trace/test/chain_test: PubGetError
-stack_trace/test/frame_test: PubGetError
-stack_trace/test/trace_test: PubGetError
-stack_trace/test/vm_test: PubGetError
+analyzer/test/*: PubGetError
 
 [ $runtime == ie9 ]
 polymer: Pass, Fail, Timeout # Issue 16717
diff --git a/pkg/pkgbuild.status b/pkg/pkgbuild.status
index e6519ea..ea8f0de 100644
--- a/pkg/pkgbuild.status
+++ b/pkg/pkgbuild.status
@@ -6,24 +6,37 @@
 
 samples/third_party/angular_todo: Pass, Slow
 samples/third_party/dromaeo: Pass, Slow
+samples/third_party/todomvc_performance: Pass, Slow
 samples/pop_pop_win: Pass, Slow
 samples/searchable_list: Pass, Slow
 pkg/docgen: Pass, Slow
 
 [ $use_repository_packages ]
 pkg/analyzer: PubGetError
-pkg/args: PubGetError
 pkg/browser: PubGetError
-
-# These samples were patched to work with polymer-0.10.0-pre.7, but that version
-# of polymer was not merged in trunk:
-samples/polymer_intl: Fail
-samples/searchable_list: Fail
-samples/third_party/todomvc: Fail
+pkg/third_party/html5lib: PubGetError # angular needs to be updated
 
 [ $use_public_packages ]
-pkg/polymer: Fail # observe with analyzer 0.13.0 has not been published yet.
+pkg/oauth2: PubGetError # Uses -dev version of pkg/http.
+
+[ $use_public_packages && $builder_tag == russian ]
+samples/third_party/todomvc: Fail # Issue 18104
 
 [ $builder_tag == russian ]
 samples/pop_pop_win: Fail # Issue 16356
 samples/third_party/angular_todo: Fail # Issue 16356
+
+[ $system == windows ]
+samples/third_party/todomvc_performance: Fail # Issue 18086
+
+[ $use_public_packages ]
+pkg/observe: PubGetError # Issue 18115
+pkg/polymer: PubGetError # Issue 18115
+pkg/polymer_expressions: PubGetError # Issue 18115
+pkg/template_binding: PubGetError # Issue 18115
+samples/polymer_intl: PubGetError # Issue 18115
+samples/searchable_list: PubGetError # Issue 18115
+samples/third_party/angular_todo: PubGetError # Issue 18115
+samples/third_party/todomvc: PubGetError # Issue 18115
+samples/third_party/todomvc_performance: PubGetError # Issue 18115
+samples/tracker: PubGetError # Issue 18115
diff --git a/pkg/polymer/CHANGELOG.md b/pkg/polymer/CHANGELOG.md
index a3a44ba..6aa0a4c 100644
--- a/pkg/polymer/CHANGELOG.md
+++ b/pkg/polymer/CHANGELOG.md
@@ -6,6 +6,12 @@
 and template_binding.
 
 #### Pub version 0.10.0-dev
+  * initPolymer is now deprecated: no need to call it or to include init.dart,
+    instead include `<link rel="import" href="packages/polymer/polymer.html">`
+  * Mime-type of script tags needs to change to prepare for upcoming breaking
+    change in Dartium: use `<script type="application/dart;component=1">`.
+  * The output of pub-build no longer uses mirrors. We replace all uses of
+    mirrors with code generation.
   * Interop with polymer-js elements now works.
   * Polymer polyfills are now consolidated in package:web_components, which is
     identical to platform.js from http://polymer-project.org.
@@ -15,9 +21,7 @@
   * New feature: `@ObserveProperty('foo bar.baz') myMethod() {...}` will cause
     myMethod to be called when "foo" or "bar.baz" changes.
   * Updated for 0.10.0-dev package:observe and package:template_binding changes.
-  * Deploy step removes use of mirrors to initialize polymer elements. Mirrors
-    are still used for @published and for polymer-expressions.
-    **breaking change**: @initMethod and @CustomTag are only supported on
+  * **breaking change**: @initMethod and @CustomTag are only supported on
     public classes/methods.
 
 #### Pub version 0.9.5
diff --git a/pkg/polymer/example/canonicalization/lib/a.html b/pkg/polymer/example/canonicalization/lib/a.html
index c359e83..ea93598 100644
--- a/pkg/polymer/example/canonicalization/lib/a.html
+++ b/pkg/polymer/example/canonicalization/lib/a.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart' src='a.dart'></script>
+<script type='application/dart;component=1' src='a.dart'></script>
diff --git a/pkg/polymer/example/canonicalization/lib/b.html b/pkg/polymer/example/canonicalization/lib/b.html
index 2a42437..dc9e034 100644
--- a/pkg/polymer/example/canonicalization/lib/b.html
+++ b/pkg/polymer/example/canonicalization/lib/b.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart' src='b.dart'></script>
+<script type='application/dart;component=1' src='b.dart'></script>
diff --git a/pkg/polymer/example/canonicalization/test/canonicalization1_test.dart b/pkg/polymer/example/canonicalization/test/canonicalization1_test.dart
new file mode 100644
index 0000000..1130a8f
--- /dev/null
+++ b/pkg/polymer/example/canonicalization/test/canonicalization1_test.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library canonicalization.test.canonizalization1_test;
+
+import 'package:polymer/polymer.dart';
+import 'common.dart';
+
+@initMethod main() => tests();
diff --git a/pkg/polymer/example/canonicalization/test/dev_test.html b/pkg/polymer/example/canonicalization/test/canonicalization1_test.html
similarity index 86%
rename from pkg/polymer/example/canonicalization/test/dev_test.html
rename to pkg/polymer/example/canonicalization/test/canonicalization1_test.html
index d145f9e..e7d15c1 100644
--- a/pkg/polymer/example/canonicalization/test/dev_test.html
+++ b/pkg/polymer/example/canonicalization/test/canonicalization1_test.html
@@ -14,6 +14,7 @@
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart" src="dev_test.dart"></script>
+    <script type="application/dart;component=1"
+            src="canonicalization1_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization/test/canonicalization2_test.dart b/pkg/polymer/example/canonicalization/test/canonicalization2_test.dart
new file mode 100644
index 0000000..3ca67a0
--- /dev/null
+++ b/pkg/polymer/example/canonicalization/test/canonicalization2_test.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library canonicalization.test.canonizalization2_test;
+
+import 'package:polymer/polymer.dart';
+import 'common.dart';
+
+@initMethod main() => tests();
diff --git a/pkg/polymer/example/canonicalization/test/dev2_test.html b/pkg/polymer/example/canonicalization/test/canonicalization2_test.html
similarity index 79%
rename from pkg/polymer/example/canonicalization/test/dev2_test.html
rename to pkg/polymer/example/canonicalization/test/canonicalization2_test.html
index 18ce024..935acb6 100644
--- a/pkg/polymer/example/canonicalization/test/dev2_test.html
+++ b/pkg/polymer/example/canonicalization/test/canonicalization2_test.html
@@ -10,11 +10,12 @@
     <title>Tests canonicalization during the development cycle</title>
     <link rel="import" href="packages/polymer/polymer.html">
     <link rel="import" href="packages/canonicalization/a.html">
-    <!-- similar to dev_test, but 'e' imports 'b' -->
+    <!-- similar to canonicalization1_test, but 'e' imports 'b' -->
     <link rel="import" href="packages/canonicalization/e.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart" src="dev_test.dart"></script>
+    <script type="application/dart;component=1"
+            src="canonicalization2_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization/test/canonicalization3_test.dart b/pkg/polymer/example/canonicalization/test/canonicalization3_test.dart
new file mode 100644
index 0000000..962c3d8
--- /dev/null
+++ b/pkg/polymer/example/canonicalization/test/canonicalization3_test.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library canonicalization.test.canonizalization3_test;
+
+import 'package:polymer/polymer.dart';
+import 'common.dart';
+
+@initMethod main() => tests();
diff --git a/pkg/polymer/example/canonicalization/test/deploy3_test.html b/pkg/polymer/example/canonicalization/test/canonicalization3_test.html
similarity index 79%
rename from pkg/polymer/example/canonicalization/test/deploy3_test.html
rename to pkg/polymer/example/canonicalization/test/canonicalization3_test.html
index a15ed4c..50f7c6c 100644
--- a/pkg/polymer/example/canonicalization/test/deploy3_test.html
+++ b/pkg/polymer/example/canonicalization/test/canonicalization3_test.html
@@ -10,11 +10,12 @@
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
     <link rel="import" href="packages/canonicalization/a.html">
-    <!-- similar to deploy_test, but 'f' imports 'b' -->
+    <!-- similar to canonicalization1_test, but 'f' imports 'b' -->
     <link rel="import" href="packages/canonicalization/f.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart" src="deploy3_test.dart"></script>
+    <script type="application/dart;component=1"
+            src="canonicalization3_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization/test/deploy_test.dart b/pkg/polymer/example/canonicalization/test/common.dart
similarity index 72%
rename from pkg/polymer/example/canonicalization/test/deploy_test.dart
rename to pkg/polymer/example/canonicalization/test/common.dart
index cae44d6..9c0c153 100644
--- a/pkg/polymer/example/canonicalization/test/deploy_test.dart
+++ b/pkg/polymer/example/canonicalization/test/common.dart
@@ -1,9 +1,9 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 /// Tests how canonicalization works when using the deployed app.
-library canonicalization.deploy_test;
+library canonicalization.test.common;
 
 import 'package:unittest/unittest.dart';
 import 'package:unittest/html_config.dart';
@@ -15,25 +15,21 @@
 import 'package:canonicalization/d.dart' as d1;
 import 'packages/canonicalization/d.dart' as d2;
 
-main() {
-  initPolymer();
+tests() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
 
   test('canonicalization', () {
-    // "package:" urls work the same during development and deployment
     expect(a, 1, reason:
       'deploy picks the "package:" url as the canonical url for script tags.');
 
-    // relative urls do not. true, we shouldn't be using 'packages/' above, so
-    // that's ok.
+    // We shouldn't be using 'packages/' above, so that's ok.
     expect(b, 0, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
+      'we pick the "package:" url as the canonical url for script tags.');
     expect(c, 2, reason: 'c was always imported with "package:" urls.');
     expect(d1.d, 2, reason: 'both a and b are loaded using package: urls');
 
-    // same here
     expect(d2.d, 0, reason: 'both a and b are loaded using package: urls');
   });
 }
diff --git a/pkg/polymer/example/canonicalization/test/deploy2_test.dart b/pkg/polymer/example/canonicalization/test/deploy2_test.dart
deleted file mode 100644
index 2b66dbb..0000000
--- a/pkg/polymer/example/canonicalization/test/deploy2_test.dart
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Tests how canonicalization works when using the deployed app.
-library canonicalization.deploy2_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:polymer/polymer.dart';
-
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
-
-main() {
-  initPolymer();
-  useHtmlConfiguration();
-
-  setUp(() => Polymer.onReady);
-
-  test('canonicalization', () {
-    // "package:" urls work the same during development and deployment
-    expect(a, 1, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-
-    // relative urls do not. true, we shouldn't be using 'packages/' above, so
-    // that's ok.
-    expect(b, 0, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-    expect(c, 2, reason: 'c was always imported with "package:" urls.');
-    expect(d1.d, 2, reason: 'both a and b are loaded using package: urls');
-
-    // same here
-    expect(d2.d, 0, reason: 'both a and b are loaded using package: urls');
-  });
-}
diff --git a/pkg/polymer/example/canonicalization/test/deploy2_test.html b/pkg/polymer/example/canonicalization/test/deploy2_test.html
deleted file mode 100644
index a2884b7..0000000
--- a/pkg/polymer/example/canonicalization/test/deploy2_test.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<!--
-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.
--->
-<html>
-<!--polymer-test: this comment is needed for test_suite.dart-->
-  <head>
-    <title>Tests canonicalization at deployment time</title>
-    <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <!-- similar to deploy_test, but 'e' imports 'b' -->
-    <link rel="import" href="packages/canonicalization/e.html">
-    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  </head>
-  <body>
-    <script type="application/dart" src="deploy2_test.dart"></script>
-  </body>
-</html>
diff --git a/pkg/polymer/example/canonicalization/test/deploy3_test.dart b/pkg/polymer/example/canonicalization/test/deploy3_test.dart
deleted file mode 100644
index 8c963b6..0000000
--- a/pkg/polymer/example/canonicalization/test/deploy3_test.dart
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Tests how canonicalization works when using the deployed app.
-library canonicalization.deploy3_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:polymer/polymer.dart';
-
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
-
-main() {
-  initPolymer();
-  useHtmlConfiguration();
-
-  setUp(() => Polymer.onReady);
-
-  test('canonicalization', () {
-    // "package:" urls work the same during development and deployment
-    expect(a, 1, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-
-    // relative urls do not. true, we shouldn't be using 'packages/' above, so
-    // that's ok.
-    expect(b, 0, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-    expect(c, 2, reason: 'c was always imported with "package:" urls.');
-    expect(d1.d, 2, reason: 'both a and b are loaded using package: urls');
-
-    // same here
-    expect(d2.d, 0, reason: 'both a and b are loaded using package: urls');
-  });
-}
diff --git a/pkg/polymer/example/canonicalization/test/dev2_test.dart b/pkg/polymer/example/canonicalization/test/dev2_test.dart
deleted file mode 100644
index dfaebff..0000000
--- a/pkg/polymer/example/canonicalization/test/dev2_test.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Tests how canonicalization works during development.
-library canonicalization.dev2_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:polymer/polymer.dart';
-
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
-
-main() {
-  initPolymer();
-  useHtmlConfiguration();
-
-  setUp(() => Polymer.onReady);
-
-  test('canonicalization', () {
-    expect(a, 1, reason:
-      'initPolymer picks the "package:" url as the canonical url for script '
-      'tags whose library is also loaded with a "package:" url.');
-    expect(b, 1, reason:
-      'initPolymer does nothing with script tags where the program doesn\'t '
-      'use a "package:" urls matching the same library.');
-    expect(c, 2, reason: 'c was always imported with "package:" urls.');
-    expect(d1.d, 1, reason: 'this matches the import from a');
-    expect(d2.d, 1, reason: 'this matches the import from b');
-  });
-}
diff --git a/pkg/polymer/example/canonicalization/test/dev3_test.dart b/pkg/polymer/example/canonicalization/test/dev3_test.dart
deleted file mode 100644
index 15d1dbc..0000000
--- a/pkg/polymer/example/canonicalization/test/dev3_test.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Tests how canonicalization works during development.
-library canonicalization.dev3_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:polymer/polymer.dart';
-
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
-
-main() {
-  initPolymer();
-  useHtmlConfiguration();
-
-  setUp(() => Polymer.onReady);
-
-  test('canonicalization', () {
-    expect(a, 1, reason:
-      'initPolymer picks the "package:" url as the canonical url for script '
-      'tags whose library is also loaded with a "package:" url.');
-    expect(b, 1, reason:
-      'initPolymer does nothing with script tags where the program doesn\'t '
-      'use a "package:" urls matching the same library.');
-    expect(c, 2, reason: 'c was always imported with "package:" urls.');
-    expect(d1.d, 1, reason: 'this matches the import from a');
-    expect(d2.d, 1, reason: 'this matches the import from b');
-  });
-}
diff --git a/pkg/polymer/example/canonicalization/test/dev3_test.html b/pkg/polymer/example/canonicalization/test/dev3_test.html
deleted file mode 100644
index f30a992..0000000
--- a/pkg/polymer/example/canonicalization/test/dev3_test.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<!--
-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.
--->
-<html>
-<!--polymer-test: this comment is needed for test_suite.dart-->
-  <head>
-    <title>Tests canonicalization at deployment time</title>
-    <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/f.html">
-    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  </head>
-  <body>
-    <script type="application/dart" src="dev3_test.dart"></script>
-  </body>
-</html>
diff --git a/pkg/polymer/example/canonicalization/test/dev_test.dart b/pkg/polymer/example/canonicalization/test/dev_test.dart
deleted file mode 100644
index 0d13d6d..0000000
--- a/pkg/polymer/example/canonicalization/test/dev_test.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Tests how canonicalization works during development.
-library canonicalization.dev_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:polymer/polymer.dart';
-
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
-
-main() {
-  initPolymer();
-  useHtmlConfiguration();
-
-  setUp(() => Polymer.onReady);
-
-  test('canonicalization', () {
-    expect(a, 1, reason:
-      'initPolymer picks the "package:" url as the canonical url for script '
-      'tags whose library is also loaded with a "package:" url.');
-    expect(b, 1, reason:
-      'initPolymer does nothing with script tags where the program doesn\'t '
-      'use a "package:" urls matching the same library.');
-    expect(c, 2, reason: 'c was always imported with "package:" urls.');
-    expect(d1.d, 1, reason: 'this matches the import from a');
-    expect(d2.d, 1, reason: 'this matches the import from b');
-  });
-}
diff --git a/pkg/polymer/example/canonicalization/test/dir/deploy2_test.dart b/pkg/polymer/example/canonicalization/test/dir/deploy2_test.dart
deleted file mode 100644
index 65c1cc1..0000000
--- a/pkg/polymer/example/canonicalization/test/dir/deploy2_test.dart
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Tests canonicalization at deployment time from a subdir.
-library canonicalization.dir.deploy2_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:polymer/polymer.dart';
-
-import 'package:canonicalization/a.dart';
-import '../packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import '../packages/canonicalization/d.dart' as d2;
-
-main() {
-  initPolymer();
-  useHtmlConfiguration();
-
-  setUp(() => Polymer.onReady);
-
-  test('canonicalization', () {
-    // "package:" urls work the same during development and deployment
-    expect(a, 1, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-
-    // relative urls do not. true, we shouldn't be using 'packages/' above, so
-    // that's ok.
-    expect(b, 0, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-    expect(c, 2, reason: 'c was always imported with "package:" urls.');
-    expect(d1.d, 2, reason: 'both a and b are loaded using package: urls');
-
-    // same here
-    expect(d2.d, 0, reason: 'both a and b are loaded using package: urls');
-  });
-}
diff --git a/pkg/polymer/example/canonicalization/test/dir/deploy_test.dart b/pkg/polymer/example/canonicalization/test/dir/deploy_test.dart
deleted file mode 100644
index 65b1b28..0000000
--- a/pkg/polymer/example/canonicalization/test/dir/deploy_test.dart
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Tests canonicalization at deployment time from a subdir.
-library canonicalization.dir.deploy_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:polymer/polymer.dart';
-
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
-
-main() {
-  initPolymer();
-  useHtmlConfiguration();
-
-  setUp(() => Polymer.onReady);
-
-  test('canonicalization', () {
-    // "package:" urls work the same during development and deployment
-    expect(a, 1, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-
-    // relative urls do not. true, we shouldn't be using 'packages/' above, so
-    // that's ok.
-    expect(b, 0, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-    expect(c, 2, reason: 'c was always imported with "package:" urls.');
-    expect(d1.d, 2, reason: 'both a and b are loaded using package: urls');
-
-    // same here
-    expect(d2.d, 0, reason: 'both a and b are loaded using package: urls');
-  });
-}
diff --git a/pkg/polymer/example/canonicalization/test/dir/deploy_test.html b/pkg/polymer/example/canonicalization/test/dir/deploy_test.html
deleted file mode 100644
index 8ac6ec0..0000000
--- a/pkg/polymer/example/canonicalization/test/dir/deploy_test.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<!--
-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.
--->
-<html>
-<!--polymer-test: this comment is needed for test_suite.dart-->
-  <head>
-    <title>Tests canonicalization at deployment time</title>
-    <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/b.html">
-    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  </head>
-  <body>
-    <script type="application/dart" src="deploy_test.dart"></script>
-  </body>
-</html>
diff --git a/pkg/polymer/example/canonicalization/test/dir/dev2_test.dart b/pkg/polymer/example/canonicalization/test/dir/dev2_test.dart
deleted file mode 100644
index 4bac334..0000000
--- a/pkg/polymer/example/canonicalization/test/dir/dev2_test.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Tests canonicalization during development from a subdir.
-library canonicalization.dir.dev2_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:polymer/polymer.dart';
-
-import 'package:canonicalization/a.dart';
-import '../packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import '../packages/canonicalization/d.dart' as d2;
-
-main() {
-  initPolymer();
-  useHtmlConfiguration();
-
-  setUp(() => Polymer.onReady);
-
-  test('canonicalization', () {
-    expect(a, 1, reason:
-      'initPolymer picks the "package:" url as the canonical url for script '
-      'tags whose library is also loaded with a "package:" url.');
-    expect(b, 1, reason:
-      'initPolymer does nothing with script tags where the program doesn\'t '
-      'use a "package:" urls matching the same library.');
-    expect(c, 2, reason: 'c was always imported with "package:" urls.');
-    expect(d1.d, 1, reason: 'this matches the import from a');
-    expect(d2.d, 1, reason: 'this matches the import from b');
-  });
-}
diff --git a/pkg/polymer/example/canonicalization/test/dir/dev2_test.html b/pkg/polymer/example/canonicalization/test/dir/dev2_test.html
deleted file mode 100644
index 4c5306f..0000000
--- a/pkg/polymer/example/canonicalization/test/dir/dev2_test.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<!--
-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.
--->
-<html>
-<!--polymer-test: this comment is needed for test_suite.dart-->
-  <head>
-    <title>Tests canonicalization during the development cycle</title>
-    <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="../packages/canonicalization/a.html">
-    <link rel="import" href="../packages/canonicalization/b.html">
-    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  </head>
-  <body>
-    <script type="application/dart" src="dev2_test.dart"></script>
-  </body>
-</html>
diff --git a/pkg/polymer/example/canonicalization/test/dir/dev_test.dart b/pkg/polymer/example/canonicalization/test/dir/dev_test.dart
deleted file mode 100644
index 305d57d..0000000
--- a/pkg/polymer/example/canonicalization/test/dir/dev_test.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Tests canonicalization during development from a subdir.
-library canonicalization.dir.dev_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:polymer/polymer.dart';
-
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
-
-main() {
-  initPolymer();
-  useHtmlConfiguration();
-
-  setUp(() => Polymer.onReady);
-
-  test('canonicalization', () {
-    expect(a, 1, reason:
-      'initPolymer picks the "package:" url as the canonical url for script '
-      'tags whose library is also loaded with a "package:" url.');
-    expect(b, 1, reason:
-      'initPolymer does nothing with script tags where the program doesn\'t '
-      'use a "package:" urls matching the same library.');
-    expect(c, 2, reason: 'c was always imported with "package:" urls.');
-    expect(d1.d, 1, reason: 'this matches the import from a');
-    expect(d2.d, 1, reason: 'this matches the import from b');
-  });
-}
diff --git a/pkg/polymer/example/canonicalization/test/dir/dev_test.html b/pkg/polymer/example/canonicalization/test/dir/dev_test.html
deleted file mode 100644
index d145f9e..0000000
--- a/pkg/polymer/example/canonicalization/test/dir/dev_test.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<!--
-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.
--->
-<html>
-<!--polymer-test: this comment is needed for test_suite.dart-->
-  <head>
-    <title>Tests canonicalization during the development cycle</title>
-    <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/b.html">
-    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  </head>
-  <body>
-    <script type="application/dart" src="dev_test.dart"></script>
-  </body>
-</html>
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir1_test.dart b/pkg/polymer/example/canonicalization/test/dir/dir1_test.dart
new file mode 100644
index 0000000..32d3ae3
--- /dev/null
+++ b/pkg/polymer/example/canonicalization/test/dir/dir1_test.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.
+
+/// Tests canonicalization at deployment time from a subdir.
+library canonicalization.test.dir1_test;
+
+import 'package:polymer/polymer.dart';
+import '../common.dart';
+
+@initMethod main() => tests();
diff --git a/pkg/polymer/example/canonicalization/test/deploy_test.html b/pkg/polymer/example/canonicalization/test/dir/dir1_test.html
similarity index 89%
rename from pkg/polymer/example/canonicalization/test/deploy_test.html
rename to pkg/polymer/example/canonicalization/test/dir/dir1_test.html
index 8ac6ec0..cc1b5c3 100644
--- a/pkg/polymer/example/canonicalization/test/deploy_test.html
+++ b/pkg/polymer/example/canonicalization/test/dir/dir1_test.html
@@ -14,6 +14,6 @@
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart" src="deploy_test.dart"></script>
+    <script type="application/dart;component=1" src="dir1_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir2_test.dart b/pkg/polymer/example/canonicalization/test/dir/dir2_test.dart
new file mode 100644
index 0000000..d4c55dc
--- /dev/null
+++ b/pkg/polymer/example/canonicalization/test/dir/dir2_test.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.
+
+/// Tests canonicalization at deployment time from a subdir.
+library canonicalization.test.dir2_test;
+
+import 'package:polymer/polymer.dart';
+import '../common.dart';
+
+@initMethod main() => tests();
diff --git a/pkg/polymer/example/canonicalization/test/dir/deploy2_test.html b/pkg/polymer/example/canonicalization/test/dir/dir2_test.html
similarity index 89%
rename from pkg/polymer/example/canonicalization/test/dir/deploy2_test.html
rename to pkg/polymer/example/canonicalization/test/dir/dir2_test.html
index f2646b4..43415b8 100644
--- a/pkg/polymer/example/canonicalization/test/dir/deploy2_test.html
+++ b/pkg/polymer/example/canonicalization/test/dir/dir2_test.html
@@ -14,6 +14,6 @@
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart" src="deploy2_test.dart"></script>
+    <script type="application/dart;component=1" src="dir2_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization2/lib/a.html b/pkg/polymer/example/canonicalization2/lib/a.html
index c359e83..ea93598 100644
--- a/pkg/polymer/example/canonicalization2/lib/a.html
+++ b/pkg/polymer/example/canonicalization2/lib/a.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart' src='a.dart'></script>
+<script type='application/dart;component=1' src='a.dart'></script>
diff --git a/pkg/polymer/example/canonicalization2/lib/b.html b/pkg/polymer/example/canonicalization2/lib/b.html
index 2a42437..dc9e034 100644
--- a/pkg/polymer/example/canonicalization2/lib/b.html
+++ b/pkg/polymer/example/canonicalization2/lib/b.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart' src='b.dart'></script>
+<script type='application/dart;component=1' src='b.dart'></script>
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart
index 2612a8f..69cd3693 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart
@@ -15,8 +15,8 @@
 import 'package:canonicalization2/d.dart' as d1;
 import 'packages/canonicalization2/d.dart' as d2;
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html
index bac8aba..e026952 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html
@@ -14,7 +14,8 @@
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart" onerror="scriptTagOnErrorCallback(null)"
-        src="bad_lib_import2_negative_test.dart"></script>
+    <script type="application/dart;component=1"
+            onerror="scriptTagOnErrorCallback(null)"
+            src="bad_lib_import2_negative_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart
index f3df1c3..b9611b7 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart
@@ -15,8 +15,8 @@
 import 'package:canonicalization2/d.dart' as d1;
 import 'packages/canonicalization2/d.dart' as d2;
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html
index 83313ee..52c8beb 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html
@@ -14,7 +14,8 @@
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart" onerror="scriptTagOnErrorCallback(null)"
-        src="bad_lib_import_negative_test.dart"></script>
+    <script type="application/dart;component=1"
+            onerror="scriptTagOnErrorCallback(null)"
+            src="bad_lib_import_negative_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization3/lib/a.html b/pkg/polymer/example/canonicalization3/lib/a.html
index c359e83..ea93598 100644
--- a/pkg/polymer/example/canonicalization3/lib/a.html
+++ b/pkg/polymer/example/canonicalization3/lib/a.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart' src='a.dart'></script>
+<script type='application/dart;component=1' src='a.dart'></script>
diff --git a/pkg/polymer/example/canonicalization3/lib/b.html b/pkg/polymer/example/canonicalization3/lib/b.html
index 2a42437..dc9e034 100644
--- a/pkg/polymer/example/canonicalization3/lib/b.html
+++ b/pkg/polymer/example/canonicalization3/lib/b.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart' src='b.dart'></script>
+<script type='application/dart;component=1' src='b.dart'></script>
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart
index 574c472..7cec7ae 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart
@@ -15,8 +15,8 @@
 import 'package:canonicalization3/d.dart' as d1;
 import 'packages/canonicalization3/d.dart' as d2;
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html
index 21448a6..56127b3 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html
@@ -14,7 +14,8 @@
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart" onerror="scriptTagOnErrorCallback(null)"
-        src="bad_lib_import2_negative_test.dart"></script>
+    <script type="application/dart;component=1"
+            onerror="scriptTagOnErrorCallback(null)"
+            src="bad_lib_import2_negative_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart
index afb2ab7..04c3a90 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart
@@ -15,8 +15,8 @@
 import 'package:canonicalization3/d.dart' as d1;
 import 'packages/canonicalization3/d.dart' as d2;
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html
index 72f7574..cf81c09 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html
@@ -14,7 +14,8 @@
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart" onerror="scriptTagOnErrorCallback(null)"
-        src="bad_lib_import_negative_test.dart"></script>
+    <script type="application/dart;component=1"
+            onerror="scriptTagOnErrorCallback(null)"
+            src="bad_lib_import_negative_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/component/news/test/news_index_test.dart b/pkg/polymer/example/component/news/test/news_index_test.dart
index 6e0c660..192601b 100644
--- a/pkg/polymer/example/component/news/test/news_index_test.dart
+++ b/pkg/polymer/example/component/news/test/news_index_test.dart
@@ -8,8 +8,8 @@
 import 'package:unittest/html_config.dart';
 
 /// This test runs the news example and checks the state of the initial page.
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   extractLinks(nodes) => nodes.where((n) => n is Element)
diff --git a/pkg/polymer/example/component/news/test/news_index_test.html b/pkg/polymer/example/component/news/test/news_index_test.html
index 1f5ded0..c46e48e 100644
--- a/pkg/polymer/example/component/news/test/news_index_test.html
+++ b/pkg/polymer/example/component/news/test/news_index_test.html
@@ -21,6 +21,6 @@
     <li><a href="//example.com/stories/4">Awesome story</a></li>
     <li class="breaking"><a href="//example.com/stories/5">Horrible story</a></li>
 </ul>
-<script type="application/dart" src="news_index_test.dart"></script>
+<script type="application/dart;component=1" src="news_index_test.dart"></script>
 </body>
 </html>
diff --git a/pkg/polymer/example/component/news/web/index.html b/pkg/polymer/example/component/news/web/index.html
index b9e56c9..4eb17fc 100644
--- a/pkg/polymer/example/component/news/web/index.html
+++ b/pkg/polymer/example/component/news/web/index.html
@@ -6,6 +6,7 @@
 <html>
 <head>
     <title>Simple Web Components Example</title>
+    <link rel="import" href="packages/polymer/polymer.html">
     <link rel="import" href="news-component.html">
 </head>
 <body>
@@ -18,7 +19,5 @@
     <li><a href="//example.com/stories/4">Awesome story</a></li>
     <li class="breaking"><a href="//example.com/stories/5">Horrible story</a></li>
 </ul>
-  <script type="application/dart">export 'package:polymer/init.dart';</script>
-  <script src='packages/browser/dart.js'></script>
 </body>
 </html>
diff --git a/pkg/polymer/example/component/news/web/news-component.html b/pkg/polymer/example/component/news/web/news-component.html
index 4d86f22..4d81d73 100644
--- a/pkg/polymer/example/component/news/web/news-component.html
+++ b/pkg/polymer/example/component/news/web/news-component.html
@@ -24,7 +24,7 @@
       </ul>
     </div>
   </template>
-  <script type="application/dart">
+  <script type="application/dart;component=1">
     import 'dart:html';
     import 'package:polymer/polymer.dart';
 
diff --git a/pkg/polymer/example/scoped_style/my_test.html b/pkg/polymer/example/scoped_style/my_test.html
index c759c66..9816fae 100644
--- a/pkg/polymer/example/scoped_style/my_test.html
+++ b/pkg/polymer/example/scoped_style/my_test.html
@@ -5,7 +5,7 @@
     </style>
     <p>Inside element, should be red</p>
   </template>
-  <script type="application/dart">
+  <script type="application/dart;component=1">
     import 'package:polymer/polymer.dart';
 
     @CustomTag('my-test')
diff --git a/pkg/polymer/lib/boot.dart b/pkg/polymer/lib/boot.dart
new file mode 100644
index 0000000..652709d
--- /dev/null
+++ b/pkg/polymer/lib/boot.dart
@@ -0,0 +1,170 @@
+// 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.
+
+/// Bootstrap to initialize polymer applications. This library is not in use
+/// yet but it will replace boot.js in the near future (see dartbug.com/18007).
+///
+/// This script contains logic to bootstrap polymer apps during development. It
+/// internally discovers special Dart script tags through HTML imports, and
+/// constructs a new entrypoint for the application that is then launched in an
+/// isolate.
+///
+/// For each script tag found, we will load the corresponding Dart library and
+/// execute all methods annotated with `@initMethod` and register all classes
+/// labeled with `@CustomTag`. We keep track of the order of imports and execute
+/// initializers in the same order.
+///
+/// All polymer applications use this bootstrap logic. It is included
+/// automatically when you include the polymer.html import:
+///
+///    <link rel="import" href="packages/polymer/polymer.html">
+///
+/// There are two important changes compared to previous versions of polymer
+/// (0.10.0-pre.6 and older):
+///
+///   * Use 'application/dart;component=1' instead of 'application/dart':
+///   Dartium already limits to have a single script tag per document, but it
+///   will be changing semantics soon and make them even stricter. Multiple
+///   script tags are not going to be running on the same isolate after this
+///   change. For polymer applications we'll use a parameter on the script tags
+///   mime-type to prevent Dartium from loading them separately. Instead this
+///   bootstrap script combines those special script tags and creates the
+///   application Dartium needs to run.
+///
+//    If you had:
+///
+///      <polymer-element name="x-foo"> ...
+///      <script type="application/dart" src="x_foo.dart'></script>
+///
+///   Now you need to write:
+///
+///      <polymer-element name="x-foo"> ...
+///      <script type="application/dart;component=1" src="x_foo.dart'></script>
+///
+///   * `initPolymer` is gone: we used to initialize applications in two
+///   possible ways: using init.dart or invoking initPolymer in your main. Any
+///   of these initialization patterns can be replaced to use an `@initMethod`
+///   instead. For example, If you need to run some initialization code before
+///   any other code is executed, include a "application/dart;component=1"
+///   script tag that contains an initializer method with the body of your old
+///   main, and make sure this tag is placed above other html-imports that load
+///   the rest of the application. Initialization methods are executed in the
+///   order in which they are discovered in the HTML document.
+library polymer.src.boot;
+
+import 'dart:html';
+import 'dart:mirrors';
+
+main() {
+  var scripts = _discoverScripts(document, window.location.href);
+  var sb = new StringBuffer()..write('library bootstrap;\n\n');
+  int count = 0;
+  for (var s in scripts) {
+    sb.writeln("import '$s' as prefix_$count;");
+    count++;
+  }
+  sb.writeln("import 'package:polymer/src/mirror_loader.dart';");
+  sb.write('\nmain() => startPolymerInDevelopment([\n');
+  for (var s in scripts) {
+    sb.writeln("  '$s',");
+  }
+  sb.write(']);\n');
+  var isolateUri = _asDataUri(sb.toString());
+  spawnDomUri(Uri.parse(isolateUri), [], '');
+}
+
+/// Internal state used in [_discoverScripts].
+class _State {
+  /// Documents that we have visited thus far.
+  final Set<Document> seen = new Set();
+
+  /// Scripts that have been discovered, in tree order.
+  final List<String> scripts = [];
+
+  /// Whether we've seen a type="application/dart" script tag, since we expect
+  /// to have only one of those.
+  bool scriptSeen = false;
+}
+
+/// Walks the HTML import structure to discover all script tags that are
+/// implicitly loaded. This code is only used in Dartium and should only be
+/// called after all HTML imports are resolved. Polymer ensures this by asking
+/// users to put their Dart script tags after all HTML imports (this is checked
+/// by the linter, and Dartium will otherwise show an error message).
+List<String> _discoverScripts(Document doc, String baseUri, [_State state]) {
+  if (state == null) state = new _State();
+  if (doc == null) {
+    print('warning: $baseUri not found.');
+    return state.scripts;
+  }
+  if (!state.seen.add(doc)) return state.scripts;
+
+  for (var node in doc.querySelectorAll('script,link[rel="import"]')) {
+    if (node is LinkElement) {
+      _discoverScripts(node.import, node.href, state);
+    } else if (node is ScriptElement) {
+      if (node.type == 'application/dart;component=1') {
+        if (node.src != '' ||
+            node.text != "export 'package:polymer/boot.dart';") {
+          state.scripts.add(_getScriptUrl(node));
+        }
+      }
+
+      if (node.type == 'application/dart') {
+        if (state.scriptSeen) {
+          print('Dartium currently only allows a single Dart script tag '
+              'per application, and in the future it will run them in '
+              'separtate isolates.  To prepare for this Dart script '
+              'tags need to be updated to use the mime-type '
+              '"application/dart;component=1" instead of "application/dart":');
+        }
+        state.scriptSeen = true;
+      }
+    }
+  }
+  return state.scripts;
+}
+
+// TODO(sigmund): explore other (cheaper) ways to resolve URIs relative to the
+// root library (see dartbug.com/12612)
+final _rootUri = currentMirrorSystem().isolate.rootLibrary.uri;
+
+/// Returns a URI that can be used to load the contents of [script] in a Dart
+/// import. This is either the source URI if [script] has a `src` attribute, or
+/// a base64 encoded `data:` URI if the [script] contents are inlined.
+String _getScriptUrl(script) {
+  var uriString = script.src;
+  if (uriString != '') {
+    var uri = _rootUri.resolve(uriString);
+    if (!_isHttpStylePackageUrl(uri)) return '$uri';
+    // Use package: urls if available. This rule here is more permissive than
+    // how we translate urls in polymer-build, but we expect Dartium to limit
+    // the cases where there are differences. The polymer-build issues an error
+    // when using packages/ inside lib without properly stepping out all the way
+    // to the packages folder. If users don't create symlinks in the source
+    // tree, then Dartium will also complain because it won't find the file seen
+    // in an HTML import.
+    var packagePath = uri.path.substring(
+        uri.path.lastIndexOf('packages/') + 'packages/'.length);
+    return 'package:$packagePath';
+  }
+
+  return _asDataUri(script.text);
+}
+
+/// Whether [uri] is an http URI that contains a 'packages' segment, and
+/// therefore could be converted into a 'package:' URI.
+bool _isHttpStylePackageUrl(Uri uri) {
+  var uriPath = uri.path;
+  return uri.scheme == _rootUri.scheme &&
+      // Don't process cross-domain uris.
+      uri.authority == _rootUri.authority &&
+      uriPath.endsWith('.dart') &&
+      (uriPath.contains('/packages/') || uriPath.startsWith('packages/'));
+}
+
+/// Returns a base64 `data:` uri with the contents of [s].
+// TODO(sigmund): change back to application/dart: using text/javascript seems
+// wrong but it hides a warning in Dartium (dartbug.com/18000).
+_asDataUri(s) => 'data:text/javascript;base64,${window.btoa(s)}';
diff --git a/pkg/polymer/lib/boot.js b/pkg/polymer/lib/boot.js
index d4a0f8f..a4a148e 100644
--- a/pkg/polymer/lib/boot.js
+++ b/pkg/polymer/lib/boot.js
@@ -1,11 +1,148 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// Bootstrap to initialize polymer applications. This library is will be
+/// replaced by boot.dart in the near future (see dartbug.com/18007).
+///
+/// This script contains logic to bootstrap polymer apps during development. It
+/// internally discovers special Dart script tags through HTML imports, and
+/// constructs a new entrypoint for the application that is then launched in an
+/// isolate.
+///
+/// For each script tag found, we will load the corresponding Dart library and
+/// execute all methods annotated with `@initMethod` and register all classes
+/// labeled with `@CustomTag`. We keep track of the order of imports and execute
+/// initializers in the same order.
+///
+/// All polymer applications use this bootstrap logic. It is included
+/// automatically when you include the polymer.html import:
+///
+///    <link rel="import" href="packages/polymer/polymer.html">
+///
+/// There are two important changes compared to previous versions of polymer
+/// (0.10.0-pre.6 and older):
+///
+///   * Use 'application/dart;component=1' instead of 'application/dart':
+///   Dartium already limits to have a single script tag per document, but it
+///   will be changing semantics soon and make them even stricter. Multiple
+///   script tags are not going to be running on the same isolate after this
+///   change. For polymer applications we'll use a parameter on the script tags
+///   mime-type to prevent Dartium from loading them separately. Instead this
+///   bootstrap script combines those special script tags and creates the
+///   application Dartium needs to run.
+///
+//    If you had:
+///
+///      <polymer-element name="x-foo"> ...
+///      <script type="application/dart" src="x_foo.dart'></script>
+///
+///   Now you need to write:
+///
+///      <polymer-element name="x-foo"> ...
+///      <script type="application/dart;component=1" src="x_foo.dart'></script>
+///
+///   * `initPolymer` is gone: we used to initialize applications in two
+///   possible ways: using `init.dart` or invoking initPolymer in your main. Any
+///   of these initialization patterns can be replaced to use an `@initMethod`
+///   instead. For example, If you need to run some initialization code before
+///   any other code is executed, include a "application/dart;component=1"
+///   script tag that contains an initializer method with the body of your old
+///   main, and make sure this tag is placed above other html-imports that load
+///   the rest of the application. Initialization methods are executed in the
+///   order in which they are discovered in the HTML document.
 (function() {
-  console.error('"boot.js" is now deprecated. Instead, you can initialize '
-    + 'your polymer application by adding the following tags: \'' +
-    + '<script type="application/dart">export "package:polymer/init.dart";'
-    + '</script><script src="packages/browser/dart.js"></script>\'. '
-    + 'Make sure these script tags come after all HTML imports.');
+  // Only run in Dartium.
+  if (navigator.userAgent.indexOf('(Dart)') === -1) return;
+
+  // Extract a Dart import URL from a script tag, which is the 'src' attribute
+  // of the script tag, or a data-url with the script contents for inlined code.
+  function getScriptUrl(script) {
+    var url = script.src;
+    if (url) {
+      // Normalize package: urls
+      var index = url.indexOf('packages/');
+      if (index == 0 || (index > 0 && url[index - 1] == '/')) {
+        url = "package:" + url.slice(index + 9);
+      }
+      return url;
+    }
+
+    // TODO(sigmund): change back to application/dart: using application/json is
+    // wrong but it hides a warning in Dartium (dartbug.com/18000).
+    return "data:application/json;base64," + window.btoa(script.textContent);
+  }
+
+  // Creates a Dart program that imports [urls] and passes them to
+  // startPolymerInDevelopment, which in turn will invoke methods marked with
+  // @initMethod, and register any custom tag labeled with @CustomTag in those
+  // libraries.
+  function createMain(urls, mainUrl) {
+    var imports = Array(urls.length + 1);
+    for (var i = 0; i < urls.length; ++i) {
+      imports[i] = 'import "' + urls[i] + '" as i' + i + ';';
+    }
+    imports[urls.length] = 'import "package:polymer/src/mirror_loader.dart";';
+    var arg = urls.length == 0 ? '[]' :
+        ('[\n      "' + urls.join('",\n      "') + '"\n     ]');
+    return (imports.join('\n') +
+        '\n\nmain() {\n' +
+        '  startPolymerInDevelopment(' + arg + ');\n' +
+        '}\n');
+  }
+
+  function discoverScripts(content, state) {
+    if (!state) {
+      // internal state tracking documents we've visited, the resulting list of
+      // scripts, and any tags with the incorrect mime-type.
+      state = {seen: {}, scripts: [], badTags: []};
+    }
+    if (!content) return state;
+
+    // Note: we visit both script and link-imports together to ensure we
+    // preserve the order of the script tags as they are discovered.
+    var nodes = content.querySelectorAll('script,link[rel="import"]');
+    for (var i = 0; i < nodes.length; i++) {
+      var node = nodes[i];
+      if (node instanceof HTMLLinkElement) {
+        // TODO(jmesserly): figure out why ".import" fails in content_shell but
+        // works in Dartium.
+        if (node.import && node.import.href) node = node.import;
+
+        if (state.seen[node.href]) continue;
+        state.seen[node.href] = node;
+        discoverScripts(node.import, state);
+      } else if (node instanceof HTMLScriptElement) {
+        if (node.type == 'application/dart;component=1') {
+          state.scripts.push(getScriptUrl(node));
+        }
+        if (node.type == 'application/dart') {
+          state.badTags.push(node);
+        }
+      }
+    }
+    return state;
+  }
+
+  // TODO(jmesserly): we're using this function because DOMContentLoaded can
+  // be fired too soon: https://www.w3.org/Bugs/Public/show_bug.cgi?id=23526
+  HTMLImports.whenImportsReady(function() {
+    // Append a new script tag that initializes everything.
+    var newScript = document.createElement('script');
+    newScript.type = "application/dart";
+
+    var results = discoverScripts(document);
+    if (results.badTags.length > 0) {
+      console.warn('Dartium currently only allows a single Dart script tag '
+        + 'per application, and in the future it will run them in '
+        + 'separtate isolates.  To prepare for this all the following '
+        + 'script tags need to be updated to use the mime-type '
+        + '"application/dart;component=1" instead of "application/dart":');
+      for (var i = 0; i < results.badTags.length; i++) {
+        console.warn(results.badTags[i]);
+      }
+    }
+    newScript.textContent = createMain(results.scripts);
+    document.body.appendChild(newScript);
+  });
 })();
diff --git a/pkg/polymer/lib/deploy.dart b/pkg/polymer/lib/deploy.dart
index 8e5f724..a6e302f 100644
--- a/pkg/polymer/lib/deploy.dart
+++ b/pkg/polymer/lib/deploy.dart
@@ -23,7 +23,9 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
+import 'package:code_transformers/tests.dart' show testingDartSdkDirectory;
 import 'package:path/path.dart' as path;
+
 import 'src/build/common.dart' show TransformOptions, phasesForPolymer;
 import 'src/build/runner.dart';
 import 'transformer.dart';
@@ -60,8 +62,6 @@
       .catchError(_reportErrorAndExit);
 }
 
-createDeployPhases(options) => new PolymerTransformerGroup(options).phases;
-
 BarbackOptions _createTestOptions(String testFile, String outDir,
     bool directlyIncludeJS, bool contentSecurityPolicy, bool releaseMode) {
 
@@ -78,8 +78,8 @@
   }
   var packageName = readCurrentPackageFromPubspec(pubspecDir);
 
-  // Find the dart-root so we can include both polymer and smoke as additional
-  // packages whose transformers we need to run.
+  // Find the dart-root so we can include all package dependencies and
+  // transformers from other packages.
   var pkgDir = path.join(_findDirWithDir(path.absolute(testDir), 'pkg'), 'pkg');
 
   var phases = createDeployPhases(new TransformOptions(
@@ -87,17 +87,17 @@
       directlyIncludeJS: directlyIncludeJS,
       contentSecurityPolicy: contentSecurityPolicy,
       releaseMode: releaseMode,
-      lint: false));
+      lint: false), sdkDir: testingDartSdkDirectory);
+  var dirs = {};
+  // Note: we include all packages in pkg/ to keep things simple. Ideally this
+  // should be restricted to the transitive dependencies of this package.
+  _subDirs(pkgDir).forEach((p) { dirs[path.basename(p)] = p; });
+  // Note: packageName may be a duplicate of 'polymer', but that's ok (they
+  // should be the same value).
+  dirs[packageName]= pubspecDir;
   return new BarbackOptions(phases, outDir,
       currentPackage: packageName,
-      packageDirs: {
-        'polymer': path.join(pkgDir, 'polymer'),
-        'smoke': path.join(pkgDir, 'smoke'),
-        // packageName may be a duplicate of 'polymer', but that's ok, the
-        // following will be the value used in the map (they should also be the
-        // same value).
-        packageName: pubspecDir,
-      },
+      packageDirs: dirs,
       // TODO(sigmund): include here also smoke transformer when it's on by
       // default.
       packagePhases: {'polymer': phasesForPolymer},
@@ -124,6 +124,10 @@
   return dir;
 }
 
+List<String> _subDirs(String dir) =>
+    new Directory(dir).listSync(followLinks: false)
+        .where((d) => d is Directory).map((d) => d.path).toList();
+
 void _reportErrorAndExit(e, trace) {
   print('Uncaught error: $e');
   if (trace != null) print(trace);
diff --git a/pkg/polymer/lib/polymer.dart b/pkg/polymer/lib/polymer.dart
index 72e70d7..39f5779 100644
--- a/pkg/polymer/lib/polymer.dart
+++ b/pkg/polymer/lib/polymer.dart
@@ -52,16 +52,14 @@
 // *** Important Note ***
 // This import is automatically replaced when calling pub build by the
 // mirrors_remover transformer. The transformer will remove any dependencies on
-// dart:mirrors in deployed polymer apps. This and the import to
-// mirror_loader.dart below should be updated in sync with changed in
-// lib/src/build/mirrors_remover.dart.
+// dart:mirrors in deployed polymer apps. This should be updated in sync with
+// changed in lib/src/build/mirrors_remover.dart.
 //
-// Technically, if we have codegen for expressions we shouldn't need any
-// @MirrorsUsed (since this is for development only), but our test bots don't
-// run pub-build yet. Until then, polymer might be tested with mirror_loader
-// instead of the static_loader, however the actual code there is practically
-// dead ([initializers] will be set programatically with generated code
-// anyways), but the @MirrorsUsed helps reduce the load on our bots.
+// Technically this annotation is not needed now that we have codegen for
+// expressions, but our test bots don't run pub-build yet. Until then, tests
+// might (transitively) have an import to smoke.mirrors, even though the code is
+// completely dead. This @MirrorsUsed annotation helps reduce the load on our
+// bots.
 @MirrorsUsed(metaTargets:
     const [Reflectable, ObservableProperty, PublishedProperty, CustomTag,
         ObserveProperty],
@@ -79,7 +77,6 @@
 import 'package:template_binding/template_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';
diff --git a/pkg/polymer/lib/polymer.html b/pkg/polymer/lib/polymer.html
index 9a90ea1..5cbaf79 100644
--- a/pkg/polymer/lib/polymer.html
+++ b/pkg/polymer/lib/polymer.html
@@ -24,3 +24,9 @@
 
 <!-- Teach dart2js about Shadow DOM polyfill objects. -->
 <script src="../../packages/web_components/dart_support.js"></script>
+
+<!-- Bootstrap the user application in a new isolate. -->
+<script src="boot.js"></script>
+<!-- TODO(sigmund): replace boot.js by boot.dart (dartbug.com/18007)
+<script type="application/dart">export "package:polymer/boot.dart";</script>
+ -->
diff --git a/pkg/polymer/lib/src/build/build_filter.dart b/pkg/polymer/lib/src/build/build_filter.dart
index fc2138d..4b50fe1 100644
--- a/pkg/polymer/lib/src/build/build_filter.dart
+++ b/pkg/polymer/lib/src/build/build_filter.dart
@@ -17,16 +17,21 @@
   final TransformOptions options;
   BuildFilter(this.options);
 
-  Future<bool> isPrimary(Asset input) => new Future.value(
+  // TODO(nweiz): This should just take an AssetId when barback <0.13.0 support
+  // is dropped.
+  Future<bool> isPrimary(idOrAsset) {
+    var id = idOrAsset is AssetId ? idOrAsset : idOrAsset.id;
+    return new Future.value(
       // nothing is filtered in debug mode
       options.releaseMode &&
       // TODO(sigmund): remove this exclusion once we have dev_transformers
       // (dartbug.com/14187)
-      input.id.path.startsWith('web/') &&
+      id.path.startsWith('web/') &&
       // may filter non-entry HTML files and internal artifacts
-      (input.id.extension == '.html' || input.id.extension == '.scriptUrls') &&
+      (id.extension == '.html' || id.extension == '.scriptUrls') &&
       // keep any entry points
-      !options.isHtmlEntryPoint(input.id));
+      !options.isHtmlEntryPoint(id));
+  }
 
   Future apply(Transform transform) {
     if (transform.primaryInput.id.extension == '.scriptUrls') {
diff --git a/pkg/polymer/lib/src/build/common.dart b/pkg/polymer/lib/src/build/common.dart
index 2510742..26e6a26 100644
--- a/pkg/polymer/lib/src/build/common.dart
+++ b/pkg/polymer/lib/src/build/common.dart
@@ -188,3 +188,27 @@
   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 {
+  'annotation-xml': '',
+  'color-profile': '',
+  'font-face': '',
+  'font-face-src': '',
+  'font-face-uri': '',
+  'font-face-format': '',
+  'font-face-name': '',
+  'missing-glyph': '',
+};
+
+/// Returns true if this is a valid custom element name. See:
+/// <http://w3c.github.io/webcomponents/spec/custom/#dfn-custom-element-type>
+bool isCustomTagName(String name) {
+  if (name == null || !name.contains('-')) return false;
+  return !invalidTagNames.containsKey(name);
+}
+
+/// Regex to split names in the 'attributes' attribute, which supports 'a b c',
+/// 'a,b,c', or even 'a b,c'. This is the same as in `lib/src/declaration.dart`.
+final ATTRIBUTES_REGEX = new RegExp(r'\s|,');
diff --git a/pkg/polymer/lib/src/build/import_inliner.dart b/pkg/polymer/lib/src/build/import_inliner.dart
index 992ae78..ee2aee0 100644
--- a/pkg/polymer/lib/src/build/import_inliner.dart
+++ b/pkg/polymer/lib/src/build/import_inliner.dart
@@ -20,6 +20,7 @@
 
 import 'common.dart';
 
+// TODO(sigmund): move to web_components package (dartbug.com/18037).
 class _HtmlInliner extends PolymerTransformer {
   final TransformOptions options;
   final Transform transform;
@@ -50,7 +51,8 @@
       changed = _extractScripts(document, docId);
       return _visitImports(document);
     }).then((importsFound) {
-      changed = changed || importsFound;
+      bool scriptsRemoved = _removeScripts(document);
+      changed = changed || importsFound || scriptsRemoved;
 
       var output = transform.primaryInput;
       if (changed) output = new Asset.fromString(docId, document.outerHtml);
@@ -120,7 +122,8 @@
       var type = node.attributes['type'];
       var rel = node.attributes['rel'];
       if (tag == 'style' || tag == 'script' &&
-            (type == null || type == TYPE_JS || type == TYPE_DART) ||
+            (type == null || type == TYPE_JS || type == TYPE_DART_APP ||
+             type == TYPE_DART_COMPONENT) ||
           tag == 'link' && (rel == 'stylesheet' || rel == 'import')) {
         // Move the node into the body, where its contents will be placed.
         doc.body.insertBefore(node, insertionPoint);
@@ -135,7 +138,6 @@
       new _UrlNormalizer(transform, id).visit(doc);
       return _visitImports(doc).then((_) {
         _extractScripts(doc, id);
-        _removeScripts(doc);
 
         // TODO(jmesserly): figure out how this is working in vulcanizer.
         // Do they produce a <body> tag with a <head> and <body> inside?
@@ -153,23 +155,22 @@
     });
   }
 
-  /// Remove scripts from HTML imports, and remember their [AssetId]s for later
-  /// use.
+  /// Remove "application/dart;component=1" scripts and remember their
+  /// [AssetId]s for later use.
   ///
   /// Dartium only allows a single script tag per page, so we can't inline
   /// the script tags. Instead we remove them entirely.
-  void _removeScripts(Document doc) {
+  bool _removeScripts(Document doc) {
+    bool changed = false;
     for (var script in doc.querySelectorAll('script')) {
-      if (script.attributes['type'] == TYPE_DART) {
+      if (script.attributes['type'] == TYPE_DART_COMPONENT) {
+        changed = true;
         script.remove();
         var src = script.attributes['src'];
         scriptIds.add(uriToAssetId(docId, src, logger, script.sourceSpan));
-
-        // only the first script needs to be added.
-        // others are already removed by _extractScripts
-        return;
       }
     }
+    return changed;
   }
 
   /// Split inline scripts into their own files. We need to do this for dart2js
@@ -180,23 +181,15 @@
     bool changed = false;
     bool first = true;
     for (var script in doc.querySelectorAll('script')) {
-      if (script.attributes['type'] != TYPE_DART) continue;
+      var type = script.attributes['type'];
+      if (type != TYPE_DART_COMPONENT && type != TYPE_DART_APP) continue;
 
       // only one Dart script per document is supported in Dartium.
-      if (!first) {
-        // Remove the script. It's invalid to have more than one in Dartium.
-        script.remove();
-        changed = true;
-
-        // TODO(jmesserly): remove this when we are running linter.
-        logger.warning('more than one Dart script per HTML '
-            'document is not supported. Script will be ignored.',
-            span: script.sourceSpan);
-        continue;
+      if (type == TYPE_DART_APP) {
+        if (!first) logger.warning(COMPONENT_WARNING, span: script.sourceSpan);
+        first = false;
       }
 
-      first = false;
-
       var src = script.attributes['src'];
       if (src != null) continue;
 
@@ -222,7 +215,7 @@
             '${path.extension(sourceId.path).substring(1)}';
         if (libName.startsWith('lib/')) libName = libName.substring(4);
         libName = libName.replaceAll('/', '.').replaceAll('-', '_');
-        libName = '${sourceId.package}.$libName';
+        libName = '${sourceId.package}.${libName}_$count';
 
         code = "library $libName;\n$code";
       }
@@ -251,14 +244,19 @@
   ImportInliner(this.options);
 
   /// Only run on entry point .html files.
-  Future<bool> isPrimary(Asset input) =>
-      new Future.value(options.isHtmlEntryPoint(input.id));
+  // TODO(nweiz): This should just take an AssetId when barback <0.13.0 support
+  // is dropped.
+  Future<bool> isPrimary(idOrAsset) {
+    var id = idOrAsset is AssetId ? idOrAsset : idOrAsset.id;
+    return new Future.value(options.isHtmlEntryPoint(id));
+  }
 
   Future apply(Transform transform) =>
       new _HtmlInliner(options, transform).apply();
 }
 
-const TYPE_DART = 'application/dart';
+const TYPE_DART_APP = 'application/dart';
+const TYPE_DART_COMPONENT = 'application/dart;component=1';
 const TYPE_JS = 'text/javascript';
 
 /// Internally adjusts urls in the html that we are about to inline.
@@ -280,11 +278,13 @@
     });
     if (node.localName == 'style') {
       node.text = visitCss(node.text);
-    } else if (node.localName == 'script' &&
-        node.attributes['type'] == TYPE_DART) {
+    } else if (node.localName == 'script') {
+      var type = node.attributes['type'];
       // TODO(jmesserly): we might need to visit JS too to handle ES Harmony
       // modules.
-      node.text = visitInlineDart(node.text);
+      if (type == TYPE_DART_APP || type == TYPE_DART_COMPONENT) {
+        node.text = visitInlineDart(node.text);
+      }
     }
     super.visitElement(node);
   }
@@ -391,3 +391,10 @@
 ];
 
 _getSpan(SourceFile file, AstNode node) => file.span(node.offset, node.end);
+
+const COMPONENT_WARNING =
+    'More than one Dart script per HTML document is not supported, but in the '
+    'near future Dartium will execute each tag as a separate isolate. If this '
+    'code is meant to load definitions that are part of the same application '
+    'you should switch it to use the "application/dart;component=1" mime-type '
+    'instead.';
diff --git a/pkg/polymer/lib/src/build/linter.dart b/pkg/polymer/lib/src/build/linter.dart
index df33318..668d969 100644
--- a/pkg/polymer/lib/src/build/linter.dart
+++ b/pkg/polymer/lib/src/build/linter.dart
@@ -140,6 +140,7 @@
   TransformLogger _logger;
   bool _inPolymerElement = false;
   bool _dartTagSeen = false;
+  bool _polymerHtmlSeen = false;
   bool _isEntrypoint;
   Map<String, _ElementSummary> _elements;
 
@@ -169,8 +170,8 @@
   void run(Document doc) {
     visit(doc);
 
-    if (_isEntrypoint && !_dartTagSeen) {
-      _logger.error(USE_INIT_DART, span: doc.body.sourceSpan);
+    if (_isEntrypoint && !_polymerHtmlSeen) {
+      _logger.warning(USE_POLYMER_HTML, span: doc.body.sourceSpan);
     }
   }
 
@@ -186,10 +187,15 @@
     }
 
     var href = node.attributes['href'];
-    if (href != null && href != '') return;
+    if (href == null || href == '') {
+      _logger.warning('link rel="$rel" missing href.', span: node.sourceSpan);
+      return;
+    }
 
+    if (href == 'packages/polymer/polymer.html') {
+      _polymerHtmlSeen = true;
+    }
     // TODO(sigmund): warn also if href can't be resolved.
-    _logger.warning('link rel="$rel" missing href.', span: node.sourceSpan);
   }
 
   /// Produce warnings if using `<element>` instead of `<polymer-element>`.
@@ -214,14 +220,14 @@
       _logger.error('Missing tag name of the custom element. Please include an '
           'attribute like \'name="your-tag-name"\'.',
           span: node.sourceSpan);
-    } else if (!_isCustomTag(tagName)) {
+    } else if (!isCustomTagName(tagName)) {
       _logger.error('Invalid name "$tagName". Custom element names must have '
           'at least one dash and can\'t be any of the following names: '
-          '${_invalidTagNames.keys.join(", ")}.',
+          '${invalidTagNames.keys.join(", ")}.',
           span: node.sourceSpan);
     }
 
-    if (_elements[extendsTag] == null && _isCustomTag(extendsTag)) {
+    if (_elements[extendsTag] == null && isCustomTagName(extendsTag)) {
       _logger.warning('custom element with name "$extendsTag" not found.',
           span: node.sourceSpan);
     }
@@ -232,10 +238,8 @@
 
       // names='a b c' or names='a,b,c'
       // record each name for publishing
-      for (var attr in attrs.split(attrs.contains(',') ? ',' : ' ')) {
-        // remove excess ws
-        attr = attr.trim();
-        if (!_validateCustomAttributeName(attr, attrsSpan)) break;
+      for (var attr in attrs.split(ATTRIBUTES_REGEX)) {
+        if (!_validateCustomAttributeName(attr.trim(), attrsSpan)) break;
       }
     }
 
@@ -247,34 +251,20 @@
 
   /// Checks for multiple Dart script tags in the same page, which is invalid.
   void _validateScriptElement(Element node) {
-    var scriptType = node.attributes['type'];
-    var isDart = scriptType == 'application/dart';
     var src = node.attributes['src'];
-
-    if (isDart) {
-      if (_dartTagSeen) {
-        _logger.warning('Only one "application/dart" script tag per document '
-            'is allowed.', span: node.sourceSpan);
-      }
-      _dartTagSeen = true;
-    }
-
     if (src == null) return;
-
-    if (src == 'packages/polymer/boot.js') {
-      _logger.warning(BOOT_JS_DEPRECATED, span: node.sourceSpan);
-      return;
-    }
+    var type = node.attributes['type'];
+    bool isDart = type == 'application/dart;component=1' ||
+        type == 'application/dart';
 
     if (src.endsWith('.dart') && !isDart) {
-      _logger.warning('Wrong script type, expected type="application/dart".',
-          span: node.sourceSpan);
+      _logger.warning('Wrong script type, expected type="application/dart" '
+          'or type="application/dart;component=1".', span: node.sourceSpan);
       return;
     }
 
     if (!src.endsWith('.dart') && isDart) {
-      _logger.warning('"application/dart" scripts should '
-          'use the .dart file extension.',
+      _logger.warning('"$type" scripts should use the .dart file extension.',
           span: node.sourceSpan);
       return;
     }
@@ -299,7 +289,7 @@
     var nodeTag = node.localName;
     var hasIsAttribute;
     var customTagName;
-    if (_isCustomTag(nodeTag)) {
+    if (isCustomTagName(nodeTag)) {
       // <fancy-button>
       customTagName = nodeTag;
       hasIsAttribute = false;
@@ -387,39 +377,10 @@
   }
 }
 
+const String USE_POLYMER_HTML =
+    'To run a polymer application you need to include the following HTML '
+    'import: <link rel="import" href="packages/polymer/polymer.html">. This '
+    'will include the common polymer logic needed to boostrap your '
+    'application. The old style of initializing polymer with boot.js or '
+    'initPolymer are now deprecated. ';
 
-// These names have meaning in SVG or MathML, so they aren't allowed as custom
-// tags.
-var _invalidTagNames = const {
-  'annotation-xml': '',
-  'color-profile': '',
-  'font-face': '',
-  'font-face-src': '',
-  'font-face-uri': '',
-  'font-face-format': '',
-  'font-face-name': '',
-  'missing-glyph': '',
-};
-
-/// Returns true if this is a valid custom element name. See:
-/// <https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-custom-element-name>
-bool _isCustomTag(String name) {
-  if (name == null || !name.contains('-')) return false;
-  return !_invalidTagNames.containsKey(name);
-}
-
-const String USE_INIT_DART =
-    'To run a polymer application, you need to call "initPolymer". You can '
-    'either include a generic script tag that does this for you:'
-    '\'<script type="application/dart">export "package:polymer/init.dart";'
-    '</script>\' or add your own script tag and call that function. '
-    'Make sure the script tag is placed after all HTML imports.';
-
-const String BOOT_JS_DEPRECATED =
-    '"boot.js" is now deprecated. Instead, you can initialize your polymer '
-    'application by calling "initPolymer()" in your main. If you don\'t have a '
-    'main, then you can include our generic main by adding the following '
-    'script tag to your page: \'<script type="application/dart">export '
-    '"package:polymer/init.dart";</script>\'. Additionally you need to '
-    'include: \'<script src="packages/browser/dart.js"></script>\' in the page '
-    'too. Make sure these script tags come after all HTML imports.';
diff --git a/pkg/polymer/lib/src/build/mirrors_remover.dart b/pkg/polymer/lib/src/build/mirrors_remover.dart
index 5c58c39..19f6fd6 100644
--- a/pkg/polymer/lib/src/build/mirrors_remover.dart
+++ b/pkg/polymer/lib/src/build/mirrors_remover.dart
@@ -14,26 +14,27 @@
   MirrorsRemover.asPlugin();
 
   /// Only apply to `lib/polymer.dart`.
-  Future<bool> isPrimary(Asset input) => new Future.value(
-      input.id.package == 'polymer' &&
-      input.id.path == 'lib/polymer.dart');
+  // TODO(nweiz): This should just take an AssetId when barback <0.13.0 support
+  // is dropped.
+  Future<bool> isPrimary(idOrAsset) {
+    var id = idOrAsset is AssetId ? idOrAsset : idOrAsset.id;
+    return new Future.value(
+        id.package == 'polymer' && id.path == 'lib/polymer.dart');
+  }
 
   Future apply(Transform transform) {
     var id = transform.primaryInput.id;
     return transform.primaryInput.readAsString().then((code) {
       // Note: this rewrite is highly-coupled with how polymer.dart is
       // written. Make sure both are updated in sync.
-      var start = code.indexOf('@MirrorsUsed');
+      var start = code.indexOf('@MirrorsUsed(');
       if (start == -1) _error();
       var end = code.indexOf('show MirrorsUsed;', start);
       if (end == -1) _error();
-      var loaderImport = code.indexOf(
-          "import 'src/mirror_loader.dart' as loader;", end);
-      if (loaderImport == -1) _error();
+      end = code.indexOf('\n', end);
       var sb = new StringBuffer()
           ..write(code.substring(0, start))
-          ..write(code.susbtring(end)
-              .replaceAll('src/mirror_loader.dart', 'src/static_loader.dart'));
+          ..write(code.substring(end));
 
       transform.addOutput(new Asset.fromString(id, sb.toString()));
     });
diff --git a/pkg/polymer/lib/src/build/polyfill_injector.dart b/pkg/polymer/lib/src/build/polyfill_injector.dart
index d1597e1..2a3099a 100644
--- a/pkg/polymer/lib/src/build/polyfill_injector.dart
+++ b/pkg/polymer/lib/src/build/polyfill_injector.dart
@@ -14,8 +14,7 @@
 import 'common.dart';
 
 /// Ensures that any scripts and polyfills needed to run a polymer application
-/// are included. For example, this transformer will ensure that there is a
-/// script tag that loads the polyfills and interop.js (used for css shimming).
+/// are included.
 ///
 /// This step also replaces "packages/browser/dart.js" and the Dart script tag
 /// with a script tag that loads the dart2js compiled code directly.
@@ -25,13 +24,16 @@
   PolyfillInjector(this.options);
 
   /// Only run on entry point .html files.
-  Future<bool> isPrimary(Asset input) =>
-      new Future.value(options.isHtmlEntryPoint(input.id));
+  // TODO(nweiz): This should just take an AssetId when barback <0.13.0 support
+  // is dropped.
+  Future<bool> isPrimary(idOrAsset) {
+    var id = idOrAsset is AssetId ? idOrAsset : idOrAsset.id;
+    return new Future.value(options.isHtmlEntryPoint(id));
+  }
 
   Future apply(Transform transform) {
     return readPrimaryAsHtml(transform).then((document) {
       bool webComponentsFound = false;
-      bool jsInteropFound = false;
       Element dartJs;
       final dartScripts = <Element>[];
 
@@ -39,9 +41,7 @@
         var src = tag.attributes['src'];
         if (src != null) {
           var last = src.split('/').last;
-          if (last == 'interop.js') {
-            jsInteropFound = true;
-          } else if (_webComponentsJS.hasMatch(last)) {
+          if (_webComponentsJS.hasMatch(last)) {
             webComponentsFound = true;
           } else if (last == 'dart.js') {
             dartJs = tag;
@@ -88,9 +88,6 @@
               '<script src="packages/$urlSegment"></script>\n'));
       }
 
-      // JS interop code is required for Polymer CSS shimming.
-      if (!jsInteropFound) _addScriptFirst('browser/interop.js');
-
       var suffix = options.releaseMode ? '.js' : '.concat.js';
       if (!webComponentsFound) {
         _addScriptFirst('web_components/dart_support.js');
diff --git a/pkg/polymer/lib/src/build/script_compactor.dart b/pkg/polymer/lib/src/build/script_compactor.dart
index 61a6b71..bf8a51d 100644
--- a/pkg/polymer/lib/src/build/script_compactor.dart
+++ b/pkg/polymer/lib/src/build/script_compactor.dart
@@ -8,12 +8,25 @@
 import 'dart:async';
 import 'dart:convert';
 
-import 'package:html5lib/dom.dart' show Document, Element;
+import 'package:html5lib/dom.dart' show Document, Element, Text;
+import 'package:html5lib/dom_parsing.dart';
+import 'package:html5lib/parser.dart' show parseFragment;
 import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart' hide Element;
+import 'package:analyzer/src/generated/element.dart' as analyzer show Element;
 import 'package:barback/barback.dart';
 import 'package:code_transformers/assets.dart';
 import 'package:path/path.dart' as path;
 import 'package:source_maps/span.dart' show SourceFile;
+import 'package:smoke/codegen/generator.dart';
+import 'package:smoke/codegen/recorder.dart';
+import 'package:code_transformers/resolver.dart';
+import 'package:code_transformers/src/dart_sdk.dart';
+import 'package:template_binding/src/mustache_tokens.dart' show MustacheTokens;
+
+import 'package:polymer_expressions/expression.dart' as pe;
+import 'package:polymer_expressions/parser.dart' as pe;
+import 'package:polymer_expressions/visitor.dart' as pe;
 
 import 'import_inliner.dart' show ImportInliner; // just for docs.
 import 'common.dart';
@@ -29,16 +42,22 @@
 /// statement to a library, and then uses `initPolymer` (see polymer.dart)  to
 /// process `@initMethod` and `@CustomTag` annotations in those libraries.
 class ScriptCompactor extends Transformer {
+  final Resolvers resolvers;
   final TransformOptions options;
 
-  ScriptCompactor(this.options);
+  ScriptCompactor(this.options, {String sdkDir})
+      : resolvers = new Resolvers(sdkDir != null ? sdkDir : dartSdkDirectory);
 
   /// Only run on entry point .html files.
-  Future<bool> isPrimary(Asset input) =>
-      new Future.value(options.isHtmlEntryPoint(input.id));
+  // TODO(nweiz): This should just take an AssetId when barback <0.13.0 support
+  // is dropped.
+  Future<bool> isPrimary(idOrAsset) {
+    var id = idOrAsset is AssetId ? idOrAsset : idOrAsset.id;
+    return new Future.value(options.isHtmlEntryPoint(id));
+  }
 
   Future apply(Transform transform) =>
-      new _ScriptCompactor(transform, options).apply();
+      new _ScriptCompactor(transform, options, resolvers).apply();
 }
 
 /// Helper class mainly use to flatten the async code.
@@ -49,13 +68,33 @@
   final AssetId docId;
   final AssetId bootstrapId;
 
+  /// HTML document parsed from [docId].
   Document document;
-  List<AssetId> entryLibraries;
-  AssetId mainLibraryId;
-  Element mainScriptTag;
-  final Map<AssetId, List<_Initializer>> initializers = {};
 
-  _ScriptCompactor(Transform transform, this.options)
+  /// List of ids for each Dart entry script tag (the main tag and any tag
+  /// included on each custom element definition).
+  List<AssetId> entryLibraries;
+
+  /// Initializers that will register custom tags or invoke `initMethod`s.
+  final List<_Initializer> initializers = [];
+
+  /// Attributes published on a custom-tag. We make these available via
+  /// reflection even if @published was not used.
+  final Map<String, List<String>> publishedAttributes = {};
+
+  /// Hook needed to access the analyzer within barback transformers.
+  final Resolvers resolvers;
+
+  /// Resolved types used for analyzing the user's sources and generating code.
+  _ResolvedTypes types;
+
+  /// The resolver instance associated with a single run of this transformer.
+  Resolver resolver;
+
+  /// Code generator used to create the static initialization for smoke.
+  final generator = new SmokeCodeGenerator();
+
+  _ScriptCompactor(Transform transform, this.options, this.resolvers)
       : transform = transform,
         logger = transform.logger,
         docId = transform.primaryInput.id,
@@ -90,201 +129,267 @@
         tag.remove();
         continue;
       }
-      if (tag.attributes['type'] != 'application/dart') continue;
-      if (src == null) {
-        logger.warning('unexpected script without a src url. The '
+      if (tag.attributes['type'] == 'application/dart;component=1') {
+        logger.warning('unexpected script. The '
           'ScriptCompactor transformer should run after running the '
-          'InlineCodeExtractor', span: tag.sourceSpan);
-        continue;
+          'ImportInliner', span: tag.sourceSpan);
       }
-      if (mainLibraryId != null) {
-        logger.warning('unexpected script. Only one Dart script tag '
-          'per document is allowed.', span: tag.sourceSpan);
-        tag.remove();
-        continue;
-      }
-      mainLibraryId = uriToAssetId(docId, src, logger, tag.sourceSpan);
-      mainScriptTag = tag;
     }
   }
 
   /// Emits the main HTML and Dart bootstrap code for the application. If there
   /// were not Dart entry point files, then this simply emits the original HTML.
   Future _emitNewEntrypoint(_) {
-    if (mainScriptTag == null) {
-      // We didn't find any main library, nothing to do.
+    if (entryLibraries.isEmpty) {
+      // We didn't find code, nothing to do.
       transform.addOutput(transform.primaryInput);
       return null;
     }
 
-    // Emit the bootstrap .dart file
-    mainScriptTag.attributes['src'] = path.url.basename(bootstrapId.path);
-    entryLibraries.add(mainLibraryId);
-    return _computeInitializers().then(_createBootstrapCode).then((code) {
-      transform.addOutput(new Asset.fromString(bootstrapId, code));
-      transform.addOutput(new Asset.fromString(docId, document.outerHtml));
-    });
+    return _initResolver()
+        .then(_extractUsesOfMirrors)
+        .then(_emitFiles)
+        .whenComplete(() => resolver.release());
   }
 
-  /// Emits the actual bootstrap code.
-  String _createBootstrapCode(_) {
-    StringBuffer code = new StringBuffer()..writeln(MAIN_HEADER);
-    for (int i = 0; i < entryLibraries.length; i++) {
-      var url = assetUrlFor(entryLibraries[i], bootstrapId, logger);
-      if (url != null) code.writeln("import '$url' as i$i;");
-    }
+  /// Load a resolver that computes information for every library in
+  /// [entryLibraries], then use it to initialize the [recorder] (for import
+  /// resolution) and to resolve specific elements (for analyzing the user's
+  /// code).
+  Future _initResolver() => resolvers.get(transform, entryLibraries).then((r) {
+    resolver = r;
+    types = new _ResolvedTypes(resolver);
+  });
 
-    code..write('\n')
-        ..writeln('void main() {')
-        ..writeln('  configureForDeployment([');
+  /// Inspects the entire program to find out anything that polymer accesses
+  /// using mirrors and produces static information that can be used to replace
+  /// the mirror-based loader and the uses of mirrors through the `smoke`
+  /// package. This includes:
+  ///
+  ///   * visiting entry-libraries to extract initializers,
+  ///   * visiting polymer-expressions to extract getters and setters,
+  ///   * looking for published fields of custom elements, and
+  ///   * looking for event handlers and callbacks of change notifications.
+  ///
+  void _extractUsesOfMirrors(_) {
+    // Generate getters and setters needed to evaluate polymer expressions, and
+    // extract information about published attributes.
+    new _HtmlExtractor(generator, publishedAttributes).visit(document);
 
-    // Inject @CustomTag and @initMethod initializations for each library
-    // that is sourced in a script tag.
-    for (int i = 0; i < entryLibraries.length; i++) {
-      for (var init in initializers[entryLibraries[i]]) {
-        var initCode = init.asCode('i$i');
-        code.write("      $initCode,\n");
-      }
-    }
-    code..writeln('    ]);')
-        ..writeln('  i${entryLibraries.length - 1}.main();')
-        ..writeln('}');
-    return code.toString();
-  }
+    // Create a recorder that uses analyzer data to feed data to [generator].
+    var recorder = new Recorder(generator,
+        (lib) => resolver.getImportUri(lib, from: bootstrapId).toString());
 
-  /// Computes initializers needed for each library in [entryLibraries]. Results
-  /// are available afterwards in [initializers].
-  Future _computeInitializers() => Future.forEach(entryLibraries, (lib) {
-      return _initializersOf(lib).then((res) {
-        initializers[lib] = res;
-      });
-    });
-
-  /// Computes the initializers of [dartLibrary]. That is, a closure that calls
-  /// Polymer.register for each @CustomTag, and any public top-level methods
-  /// labeled with @initMethod.
-  Future<List<_Initializer>> _initializersOf(AssetId dartLibrary) {
-    var result = [];
-    return transform.readInputAsString(dartLibrary).then((code) {
-      var file = new SourceFile.text(_simpleUriForSource(dartLibrary), code);
-      var unit = parseCompilationUnit(code);
-
-      return Future.forEach(unit.directives, (directive) {
-        // Include anything from parts.
-        if (directive is PartDirective) {
-          var targetId = uriToAssetId(dartLibrary, directive.uri.stringValue,
-              logger, _getSpan(file, directive));
-          return _initializersOf(targetId).then(result.addAll);
-        }
-
-        // Similarly, include anything from exports except what's filtered by
-        // the show/hide combinators.
-        if (directive is ExportDirective) {
-          var targetId = uriToAssetId(dartLibrary, directive.uri.stringValue,
-              logger, _getSpan(file, directive));
-          return _initializersOf(targetId).then(
-            (r) => _processExportDirective(directive, r, result));
-        }
-      }).then((_) {
-        // Scan the code for classes and top-level functions.
-        for (var node in unit.declarations) {
-          if (node is ClassDeclaration) {
-            _processClassDeclaration(node, result, file, logger);
-          } else if (node is FunctionDeclaration &&
-              node.metadata.any(_isInitMethodAnnotation)) {
-            _processFunctionDeclaration(node, result, file, logger);
-          }
-        }
-        return result;
-      });
-    });
-  }
-
-  static String _simpleUriForSource(AssetId source) =>
-      source.path.startsWith('lib/')
-      ? 'package:${source.package}/${source.path.substring(4)}' : source.path;
-
-  /// Filter [exportedInitializers] according to [directive]'s show/hide
-  /// combinators and add the result to [result].
-  // TODO(sigmund): call the analyzer's resolver instead?
-  static _processExportDirective(ExportDirective directive,
-      List<_Initializer> exportedInitializers,
-      List<_Initializer> result) {
-    for (var combinator in directive.combinators) {
-      if (combinator is ShowCombinator) {
-        var show = combinator.shownNames.map((n) => n.name).toSet();
-        exportedInitializers.retainWhere((e) => show.contains(e.symbolName));
-      } else if (combinator is HideCombinator) {
-        var hide = combinator.hiddenNames.map((n) => n.name).toSet();
-        exportedInitializers.removeWhere((e) => hide.contains(e.symbolName));
-      }
-    }
-    result.addAll(exportedInitializers);
-  }
-
-  /// Add an initializer to register [node] as a polymer element if it contains
-  /// an appropriate [CustomTag] annotation.
-  static _processClassDeclaration(ClassDeclaration node,
-      List<_Initializer> result, SourceFile file,
-      TransformLogger logger) {
-    for (var meta in node.metadata) {
-      if (!_isCustomTagAnnotation(meta)) continue;
-      var args = meta.arguments.arguments;
-      if (args == null || args.length == 0) {
-        logger.error('Missing argument in @CustomTag annotation',
-            span: _getSpan(file, meta));
-        continue;
+    // Process all classes and top-level functions to include initializers,
+    // register custom elements, and include special fields and methods in
+    // custom element classes.
+    for (var id in entryLibraries) {
+      var lib = resolver.getLibrary(id);
+      for (var fun in _visibleTopLevelMethodsOf(lib)) {
+        _processFunction(fun, id);
       }
 
-      var tagName = args[0].stringValue;
-      var typeName = node.name.name;
-      if (typeName.startsWith('_')) {
-        logger.error('@CustomTag is no longer supported on private '
-          'classes: $tagName', span: _getSpan(file, node.name));
-        continue;
+      for (var cls in _visibleClassesOf(lib)) {
+        _processClass(cls, id, recorder);
       }
-      result.add(new _CustomTagInitializer(tagName, typeName));
     }
   }
 
-  /// Add a method initializer for [function].
-  static _processFunctionDeclaration(FunctionDeclaration function,
-      List<_Initializer> result, SourceFile file,
-      TransformLogger logger) {
-    var name = function.name.name;
-    if (name.startsWith('_')) {
-      logger.error('@initMethod is no longer supported on private '
-        'functions: $name', span: _getSpan(file, function.name));
+  /// Process a class ([cls]). If it contains an appropriate [CustomTag]
+  /// annotation, we include an initializer to register this class, and make
+  /// sure to include everything that might be accessed or queried from them
+  /// using the smoke package. In particular, polymer uses smoke for the
+  /// following:
+  ///    * invoke #registerCallback on custom elements classes, if present.
+  ///    * query for methods ending in `*Changed`.
+  ///    * query for methods with the `@ObserveProperty` annotation.
+  ///    * query for non-final properties labeled with `@published`.
+  ///    * read declarations of properties named in the `attributes` attribute.
+  ///    * read/write the value of published properties .
+  ///    * invoke methods in event handlers.
+  _processClass(ClassElement cls, AssetId id, Recorder recorder) {
+    if (!_hasPolymerMixin(cls)) return;
+
+    // Check whether the class has a @CustomTag annotation. Typically we expect
+    // a single @CustomTag, but it's possible to have several.
+    var tagNames = [];
+    for (var meta in cls.node.metadata) {
+      var tagName = _extractTagName(meta, cls);
+      if (tagName != null) tagNames.add(tagName);
+    }
+
+    if (cls.isPrivate && tagNames.isNotEmpty) {
+      var name = tagNames.first;
+      logger.error('@CustomTag is not currently supported on private classes:'
+          ' $name. Consider making this class public, or create a '
+          'public initialization method marked with `@initMethod` that calls '
+          '`Polymer.register($name, ${cls.name})`.',
+          span: _spanForNode(cls, cls.node.name));
       return;
     }
-    result.add(new _InitMethodInitializer(name));
+
+    // Include #registerCallback if it exists. Note that by default lookupMember
+    // and query will also add the corresponding getters and setters.
+    recorder.lookupMember(cls, 'registerCallback');
+
+    // Include methods that end with *Changed.
+    recorder.runQuery(cls, new QueryOptions(
+          includeFields: false, includeProperties: false,
+          includeInherited: true, includeMethods: true,
+          includeUpTo: types.htmlElementElement,
+          matches: (n) => n.endsWith('Changed') && n != 'attributeChanged'));
+
+    // Include methods marked with @ObserveProperty.
+    recorder.runQuery(cls, new QueryOptions(
+          includeFields: false, includeProperties: false,
+          includeInherited: true, includeMethods: true,
+          includeUpTo: types.htmlElementElement,
+          withAnnotations: [types.observePropertyElement]));
+
+    // Include @published and @observable properties.
+    // Symbols in @published are used when resolving bindings on published
+    // attributes, symbols for @observable are used via path observers when
+    // implementing *Changed an @ObserveProperty.
+    // TODO(sigmund): consider including only those symbols mentioned in
+    // *Changed and @ObserveProperty instead.
+    recorder.runQuery(cls, new QueryOptions(
+          includeUpTo: types.htmlElementElement,
+          withAnnotations: [types.publishedElement, types.observableElement]));
+
+    for (var tagName in tagNames) {
+      // Include an initializer that will call Polymer.register
+      initializers.add(new _CustomTagInitializer(id, tagName, cls.displayName));
+
+      // Include also properties published via the `attributes` attribute.
+      var attrs = publishedAttributes[tagName];
+      if (attrs == null) continue;
+      for (var attr in attrs) {
+        recorder.lookupMember(cls, attr, recursive: true);
+      }
+    }
+  }
+
+  /// Determines if [cls] or a supertype has a mixin of the Polymer class.
+  bool _hasPolymerMixin(ClassElement cls) {
+    while (cls != types.htmlElementElement) {
+      for (var m in cls.mixins) {
+        if (m.element == types.polymerClassElement) return true;
+      }
+      if (cls.supertype == null) return false;
+      cls = cls.supertype.element;
+    }
+    return false;
+  }
+
+  /// If [meta] is [CustomTag], extract the name associated with the tag.
+  String _extractTagName(Annotation meta, ClassElement cls) {
+    if (meta.element != types.customTagConstructor) return null;
+
+    // Read argument from the AST
+    var args = meta.arguments.arguments;
+    if (args == null || args.length == 0) {
+      logger.warning('Missing argument in @CustomTag annotation',
+          span: _spanForNode(cls, meta));
+      return null;
+    }
+
+    var res = resolver.evaluateConstant(
+        cls.enclosingElement.enclosingElement, args[0]);
+    if (!res.isValid || res.value.type != types.stringType) {
+      logger.warning('The parameter to @CustomTag seems to be invalid.',
+          span: _spanForNode(cls, args[0]));
+      return null;
+    }
+    return res.value.stringValue;
+  }
+
+  /// Adds the top-level [function] as an initalizer if it's marked with
+  /// `@initMethod`.
+  _processFunction(FunctionElement function, AssetId id) {
+    bool initMethodFound = false;
+    for (var meta in function.metadata) {
+      var e = meta.element;
+      if (e is PropertyAccessorElement &&
+          e.variable == types.initMethodElement) {
+        initMethodFound = true;
+        break;
+      }
+    }
+    if (!initMethodFound) return;
+    if (function.isPrivate) {
+      logger.error('@initMethod is no longer supported on private '
+          'functions: ${function.displayName}',
+          span: _spanForNode(function, function.node.name));
+      return;
+    }
+    initializers.add(new _InitMethodInitializer(id, function.displayName));
+  }
+
+  /// Writes the final output for the bootstrap Dart file and entrypoint HTML
+  /// file.
+  void _emitFiles(_) {
+    StringBuffer code = new StringBuffer()..writeln(MAIN_HEADER);
+    Map<AssetId, String> prefixes = {};
+    int i = 0;
+    for (var id in entryLibraries) {
+      var url = assetUrlFor(id, bootstrapId, logger);
+      if (url == null) continue;
+      code.writeln("import '$url' as i$i;");
+      prefixes[id] = 'i$i';
+      i++;
+    }
+
+    // Include smoke initialization.
+    generator.writeImports(code);
+    generator.writeTopLevelDeclarations(code);
+    code.writeln('\nvoid main() {');
+    generator.writeInitCall(code);
+    code.writeln('  startPolymer([');
+
+    // Include initializers to switch from mirrors_loader to static_loader.
+    for (var init in initializers) {
+      var initCode = init.asCode(prefixes[init.assetId]);
+      code.write("      $initCode,\n");
+    }
+    code..writeln('    ]);')
+        ..writeln('}');
+    transform.addOutput(new Asset.fromString(bootstrapId, code.toString()));
+
+
+    // Emit the bootstrap .dart file
+    var srcUrl = path.url.basename(bootstrapId.path);
+    document.body.nodes.add(parseFragment(
+          '<script type="application/dart" src="$srcUrl"></script>'));
+    transform.addOutput(new Asset.fromString(docId, document.outerHtml));
+  }
+
+  _spanForNode(analyzer.Element context, AstNode node) {
+    var file = resolver.getSourceFile(context);
+    return file.span(node.offset, node.end);
   }
 }
 
-// TODO(sigmund): consider support for importing annotations with prefixes.
-bool _isInitMethodAnnotation(Annotation node) =>
-    node.name.name == 'initMethod' && node.constructorName == null &&
-    node.arguments == null;
-bool _isCustomTagAnnotation(Annotation node) => node.name.name == 'CustomTag';
-
 abstract class _Initializer {
+  AssetId get assetId;
   String get symbolName;
   String asCode(String prefix);
 }
 
 class _InitMethodInitializer implements _Initializer {
-  String methodName;
+  final AssetId assetId;
+  final String methodName;
   String get symbolName => methodName;
-  _InitMethodInitializer(this.methodName);
+  _InitMethodInitializer(this.assetId, this.methodName);
 
   String asCode(String prefix) => "$prefix.$methodName";
 }
 
 class _CustomTagInitializer implements _Initializer {
-  String tagName;
-  String typeName;
+  final AssetId assetId;
+  final String tagName;
+  final String typeName;
   String get symbolName => typeName;
-  _CustomTagInitializer(this.tagName, this.typeName);
+  _CustomTagInitializer(this.assetId, this.tagName, this.typeName);
 
   String asCode(String prefix) =>
       "() => Polymer.register('$tagName', $prefix.$typeName)";
@@ -296,5 +401,297 @@
 library app_bootstrap;
 
 import 'package:polymer/polymer.dart';
-import 'package:smoke/static.dart' as smoke;
 """;
+
+/// An html visitor that:
+///   * finds all polymer expressions and records the getters and setters that
+///     will be needed to evaluate them at runtime.
+///   * extracts all attributes declared in the `attribute` attributes of
+///     polymer elements.
+class _HtmlExtractor extends TreeVisitor {
+  final Map<String, List<String>> publishedAttributes;
+  final SmokeCodeGenerator generator;
+  final _SubExpressionVisitor visitor;
+  bool _inTemplate = false;
+
+  _HtmlExtractor(SmokeCodeGenerator generator, this.publishedAttributes)
+      : generator = generator,
+        visitor = new _SubExpressionVisitor(generator);
+
+  void visitElement(Element node) {
+    if (_inTemplate) _processNormalElement(node);
+    if (node.localName == 'polymer-element') {
+      _processPolymerElement(node);
+      _processNormalElement(node);
+    }
+
+    if (node.localName == 'template') {
+      var last = _inTemplate;
+      _inTemplate = true;
+      super.visitElement(node);
+      _inTemplate = last;
+    } else {
+      super.visitElement(node);
+    }
+  }
+
+  void visitText(Text node) {
+    if (!_inTemplate) return;
+    var bindings = _Mustaches.parse(node.data);
+    if (bindings == null) return;
+    for (var e in bindings.expressions) {
+      _addExpression(e, false, false);
+    }
+  }
+
+  /// Registers getters and setters for all published attributes.
+  void _processPolymerElement(Element node) {
+    var tagName = node.attributes['name'];
+    var value = node.attributes['attributes'];
+    if (value != null) {
+      publishedAttributes[tagName] =
+          value.split(ATTRIBUTES_REGEX).map((a) => a.trim()).toList();
+    }
+  }
+
+  /// Produces warnings for misuses of on-foo event handlers, and for instanting
+  /// custom tags incorrectly.
+  void _processNormalElement(Element node) {
+    var tag = node.localName;
+    var isCustomTag = isCustomTagName(tag) || node.attributes['is'] != null;
+
+    // Event handlers only allowed inside polymer-elements
+    node.attributes.forEach((name, value) {
+      var bindings = _Mustaches.parse(value);
+      if (bindings == null) return;
+      var isEvent = false;
+      var isTwoWay = false;
+      if (name is String) {
+        name = name.toLowerCase();
+        isEvent = name.startsWith('on-');
+        isTwoWay = !isEvent && bindings.isWhole && (isCustomTag ||
+            tag == 'input' && (name == 'value' || name =='checked') ||
+            tag == 'select' && (name == 'selectedindex' || name == 'value') ||
+            tag == 'textarea' && name == 'value');
+      }
+      for (var exp in bindings.expressions) {
+        _addExpression(exp, isEvent, isTwoWay);
+      }
+    });
+  }
+
+  void _addExpression(String stringExpression, bool inEvent, bool isTwoWay) {
+    if (inEvent) {
+      if (!stringExpression.startsWith("@")) {
+        generator.addGetter(stringExpression);
+        generator.addSymbol(stringExpression);
+        return;
+      }
+      stringExpression = stringExpression.substring(1);
+    }
+    visitor.run(pe.parse(stringExpression), isTwoWay);
+  }
+}
+
+/// A polymer-expression visitor that records every getter and setter that will
+/// be needed to evaluate a single expression at runtime.
+class _SubExpressionVisitor extends pe.RecursiveVisitor {
+  final SmokeCodeGenerator generator;
+  bool _includeSetter;
+
+  _SubExpressionVisitor(this.generator);
+
+  /// Visit [exp], and record getters and setters that are needed in order to
+  /// evaluate it at runtime. [includeSetter] is only true if this expression
+  /// occured in a context where it could be updated, for example in two-way
+  /// bindings such as `<input value={{exp}}>`.
+  void run(pe.Expression exp, bool includeSetter) {
+    _includeSetter = includeSetter;
+    visit(exp);
+  }
+
+  /// Adds a getter and symbol for [name], and optionally a setter.
+  _add(String name) {
+    generator.addGetter(name);
+    generator.addSymbol(name);
+    if (_includeSetter) generator.addSetter(name);
+  }
+
+  void preVisitExpression(e) {
+    // For two-way bindings the outermost expression may be updated, so we need
+    // both the getter and the setter, but we only need the getter for
+    // subexpressions. We exclude setters as soon as we go deeper in the tree,
+    // except when we see a filter (that can potentially be a two-way
+    // transformer).
+    if (e is pe.BinaryOperator && e.operator == '|') return;
+    _includeSetter = false;
+  }
+
+  visitIdentifier(pe.Identifier e) {
+    if (e.value != 'this') _add(e.value);
+    super.visitIdentifier(e);
+  }
+
+  visitGetter(pe.Getter e) {
+    _add(e.name);
+    super.visitGetter(e);
+  }
+
+  visitInvoke(pe.Invoke e) {
+    _includeSetter = false; // Invoke is only valid as an r-value.
+    _add(e.method);
+    super.visitInvoke(e);
+  }
+}
+
+/// Parses and collects information about bindings found in polymer templates.
+class _Mustaches {
+  /// Each expression that appears within `{{...}}` and `[[...]]`.
+  final List<String> expressions;
+
+  /// Whether the whole text returned by [parse] was a single expression.
+  final bool isWhole;
+
+  _Mustaches(this.isWhole, this.expressions);
+
+  static _Mustaches parse(String text) {
+    if (text == null || text.isEmpty) return null;
+    // Use template-binding's parser, but provide a delegate function factory to
+    // save the expressions without parsing them as [PropertyPath]s.
+    var tokens = MustacheTokens.parse(text, (s) => () => s);
+    if (tokens == null) return null;
+    var length = tokens.length;
+    bool isWhole = length == 1 && tokens.getText(length) == '' &&
+        tokens.getText(0) == '';
+    var expressions = new List(length);
+    for (int i = 0; i < length; i++) {
+      expressions[i] = tokens.getPrepareBinding(i)();
+    }
+    return new _Mustaches(isWhole, expressions);
+  }
+}
+
+/// Holds types that are used in queries 
+class _ResolvedTypes {
+  /// Element representing `HtmlElement`.
+  final ClassElement htmlElementElement;
+
+  /// Element representing `String`.
+  final InterfaceType stringType;
+
+  /// Element representing `Polymer`.
+  final ClassElement polymerClassElement;
+
+  /// Element representing the constructor of `@CustomTag`.
+  final ConstructorElement customTagConstructor;
+
+  /// Element representing the type of `@published`.
+  final ClassElement publishedElement;
+
+  /// Element representing the type of `@observable`.
+  final ClassElement observableElement;
+
+  /// Element representing the type of `@ObserveProperty`.
+  final ClassElement observePropertyElement;
+
+  /// Element representing the `@initMethod` annotation.
+  final TopLevelVariableElement initMethodElement;
+
+
+  factory _ResolvedTypes(Resolver resolver) {
+    // Load class elements that are used in queries for codegen.
+    var polymerLib = resolver.getLibrary(
+        new AssetId('polymer', 'lib/polymer.dart'));
+    if (polymerLib == null) _definitionError('the polymer library');
+
+    var htmlLib = resolver.getLibraryByUri(Uri.parse('dart:html'));
+    if (htmlLib == null) _definitionError('the "dart:html" library');
+
+    var coreLib = resolver.getLibraryByUri(Uri.parse('dart:core'));
+    if (coreLib == null) _definitionError('the "dart:core" library');
+
+    var observeLib = resolver.getLibrary(
+        new AssetId('observe', 'lib/src/metadata.dart'));
+    if (observeLib == null) _definitionError('the observe library');
+
+    var initMethodElement = null;
+    for (var unit in polymerLib.parts) {
+      if (unit.uri == 'src/loader.dart') {
+        initMethodElement = unit.topLevelVariables.firstWhere(
+            (t) => t.displayName == 'initMethod');
+        break;
+      }
+    }
+    var customTagConstructor =
+        _lookupType(polymerLib, 'CustomTag').constructors.first;
+    var publishedElement = _lookupType(polymerLib, 'PublishedProperty');
+    var observableElement = _lookupType(observeLib, 'ObservableProperty');
+    var observePropertyElement = _lookupType(polymerLib, 'ObserveProperty');
+    var polymerClassElement = _lookupType(polymerLib, 'Polymer');
+    var htmlElementElement = _lookupType(htmlLib, 'HtmlElement');
+    var stringType = _lookupType(coreLib, 'String').type;
+    if (initMethodElement == null) _definitionError('@initMethod');
+
+    return new _ResolvedTypes.internal(htmlElementElement, stringType,
+      polymerClassElement, customTagConstructor, publishedElement,
+      observableElement, observePropertyElement, initMethodElement);
+  }
+
+  _ResolvedTypes.internal(this.htmlElementElement, this.stringType,
+      this.polymerClassElement, this.customTagConstructor,
+      this.publishedElement, this.observableElement,
+      this.observePropertyElement, this.initMethodElement);
+
+  static _lookupType(LibraryElement lib, String typeName) {
+    var result = lib.getType(typeName);
+    if (result == null) _definitionError(typeName);
+    return result;
+  }
+
+  static _definitionError(name) {
+    throw new StateError("Internal error in polymer-builder: couldn't find "
+        "definition of $name.");
+  }
+}
+
+/// Retrieves all classses that are visible if you were to import [lib]. This
+/// includes exported classes from other libraries.
+List<ClassElement> _visibleClassesOf(LibraryElement lib) {
+  var result = [];
+  result.addAll(lib.units.expand((u) => u.types));
+  for (var e in lib.exports) {
+    var exported = e.exportedLibrary.units.expand((u) => u.types).toList();
+    _filter(exported, e.combinators);
+    result.addAll(exported);
+  }
+  return result;
+}
+
+/// Retrieves all top-level methods that are visible if you were to import
+/// [lib]. This includes exported methods from other libraries too.
+List<ClassElement> _visibleTopLevelMethodsOf(LibraryElement lib) {
+  var result = [];
+  result.addAll(lib.units.expand((u) => u.functions));
+  for (var e in lib.exports) {
+    var exported = e.exportedLibrary.units
+        .expand((u) => u.functions).toList();
+    _filter(exported, e.combinators);
+    result.addAll(exported);
+  }
+  return result;
+}
+
+/// Filters [elements] that come from an export, according to its show/hide
+/// combinators. This modifies [elements] in place.
+void _filter(List<analyzer.Element> elements,
+    List<NamespaceCombinator> combinators) {
+  for (var c in combinators) {
+    if (c is ShowElementCombinator) {
+      var show = c.shownNames.toSet();
+      elements.retainWhere((e) => show.contains(e.displayName));
+    } else if (c is HideElementCombinator) {
+      var hide = c.hiddenNames.toSet();
+      elements.removeWhere((e) => hide.contains(e.displayName));
+    }
+  }
+}
diff --git a/pkg/polymer/lib/src/declaration.dart b/pkg/polymer/lib/src/declaration.dart
index e79f8bd..c3eb0b5 100644
--- a/pkg/polymer/lib/src/declaration.dart
+++ b/pkg/polymer/lib/src/declaration.dart
@@ -448,7 +448,7 @@
 
   // In deploy mode we should never do a sync XHR; link rel=stylesheet will
   // be inlined into a <style> tag by ImportInliner.
-  if (loader.deployMode) return '';
+  if (_deployMode) return '';
 
   // TODO(jmesserly): sometimes the href property is wrong after deployment.
   var href = sheet.href;
diff --git a/pkg/polymer/lib/src/js/polymer/build.log b/pkg/polymer/lib/src/js/polymer/build.log
index 4fdddcc..2daeb00 100644
--- a/pkg/polymer/lib/src/js/polymer/build.log
+++ b/pkg/polymer/lib/src/js/polymer/build.log
@@ -1,38 +1,32 @@
 BUILD LOG
 ---------
-Build Time: 2014-03-05T20:10:31
+Build Time: 2014-04-01T15:27:00
 
 NODEJS INFORMATION
 ==================
-nodejs: v0.8.21
-chai: 1.9.0
-grunt: 0.4.2
-grunt-audit: 0.0.2
+nodejs: v0.10.26
+chai: 1.9.1
 grunt-concat-sourcemap: 0.4.1
-grunt-contrib-concat: 0.3.0
-grunt-contrib-uglify: 0.3.2
-grunt-contrib-yuidoc: 0.5.0
-grunt-karma: 0.6.2
-karma: 0.10.9
-karma-chrome-launcher: 0.1.2
-karma-coffee-preprocessor: 0.1.2
-karma-crbot-reporter: 0.0.4
+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.2
+karma: 0.12.2
 karma-firefox-launcher: 0.1.3
-karma-html2js-preprocessor: 0.1.0
-karma-ie-launcher: 0.1.1
-karma-jasmine: 0.1.5
-karma-mocha: 0.1.1
-karma-phantomjs-launcher: 0.1.2
-karma-requirejs: 0.2.1
+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.17.1
-requirejs: 2.1.10
+mocha: 1.18.2
+Polymer: 0.2.2
 
 REPO REVISIONS
 ==============
-polymer-dev: e6f6d2bdd318941562e46bc18adc8da2312cec36
+polymer-dev: 40bde06093289de27439809e0c5ea34b9be14b66
 
 BUILD HASHES
 ============
-build/polymer.js: 183c6dd1ffc466c8a4667562e21830b361710e96
\ 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.concat.js b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
index 44c0afb..85a6554 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
@@ -407,11 +407,11 @@
       var handle = timeout ? setTimeout(fn, timeout) :
           requestAnimationFrame(fn);
       // NOTE: switch on inverting handle to determine which time is used.
-      return timeout ? handle : 1 / handle;
+      return timeout ? handle : ~handle;
     },
     cancelAsync: function(handle) {
-      if (handle < 1) {
-        cancelAnimationFrame(Math.round(1 / handle));
+      if (handle < 0) {
+        cancelAnimationFrame(~handle);
       } else {
         clearTimeout(handle);
       }
@@ -664,6 +664,8 @@
       if ((n$ && n$.length) || (pn$ && pn$.length)) {
         var self = this;
         var o = this._propertyObserver = new CompoundObserver();
+        // keep track of property observer so we can shut it down
+        this.registerObservers([o]);
         for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
           o.addPath(this, n);
           // observer array properties
@@ -706,7 +708,7 @@
         // if we are observing the previous value, stop
         if (Array.isArray(old)) {
           log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);
-          this.unregisterObserver(name + '__array');
+          this.closeNamedObserver(name + '__array');
         }
         // if the new value is an array, being observing it
         if (Array.isArray(value)) {
@@ -715,7 +717,7 @@
           observer.open(function(value, old) {
             this.invokeMethod(callbackName, [old]);
           }, this);
-          this.registerObserver(name + '__array', observer);
+          this.registerNamedObserver(name + '__array', observer);
         }
       }
     },
@@ -723,42 +725,51 @@
       // apply Polymer two-way reference binding
       return bindProperties(this, property, observable);
     },
-    unbindAllProperties: function() {
-      if (this._propertyObserver) {
-        this._propertyObserver.close();
-      }
-      this.unregisterObservers();
-    },
-    unbindProperty: function(name) {
-      return this.unregisterObserver(name);
-    },
     invokeMethod: function(method, args) {
       var fn = this[method] || method;
       if (typeof fn === 'function') {
         fn.apply(this, args);
       }
     },
+    registerObservers: function(observers) {
+      this._observers.push(observers);
+    },
+    // observer array items are arrays of observers.
+    closeObservers: function() {
+      for (var i=0, l=this._observers.length; i<l; i++) {
+        this.closeObserverArray(this._observers[i]);
+      }
+      this._observers = [];
+    },
+    closeObserverArray: function(observerArray) {
+      for (var i=0, l=observerArray.length, o; i<l; i++) {
+        o = observerArray[i];
+        if (o && o.close) {
+          o.close();
+        }
+      }
+    },
     // bookkeeping observers for memory management
-    registerObserver: function(name, observer) {
-      var o$ = this._observers || (this._observers = {});
+    registerNamedObserver: function(name, observer) {
+      var o$ = this._namedObservers || (this._namedObservers = {});
       o$[name] = observer;
     },
-    unregisterObserver: function(name) {
-      var o$ = this._observers;
+    closeNamedObserver: function(name) {
+      var o$ = this._namedObservers;
       if (o$ && o$[name]) {
         o$[name].close();
         o$[name] = null;
         return true;
       }
     },
-    unregisterObservers: function() {
-      if (this._observers) {
-        var keys=Object.keys(this._observers);
+    closeNamedObservers: function() {
+      if (this._namedObservers) {
+        var keys=Object.keys(this._namedObservers);
         for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {
-          o = this._observers[k];
+          o = this._namedObservers[k];
           o.close();
         }
-        this._observers = {};
+        this._namedObservers = {};
       }
     }
   };
@@ -831,33 +842,33 @@
   var mdv = {
     syntax: syntax,
     instanceTemplate: function(template) {
-      return template.createInstance(this, this.syntax);
+      var dom = template.createInstance(this, this.syntax);
+      this.registerObservers(dom.bindings_);
+      return dom;
     },
     bind: function(name, observable, oneTime) {
-      // 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 (!this._elementPrepared) {
-        this.prepareElement();
-      }
       var property = this.propertyForAttribute(name);
       if (!property) {
         // TODO(sjmiles): this mixin method must use the special form
         // of `super` installed by `mixinMethod` in declaration/prototype.js
         return this.mixinSuper(arguments);
       } else {
-        // clean out the closets
-        this.unbind(name);
         // use n-way Polymer binding
         var observer = this.bindProperty(property, observable);
-        // stick path on observer so it's available via this.bindings
-        observer.path = observable.path_;
-        // reflect bound property to attribute when binding
-        // to ensure binding is not left on attribute if property
-        // does not update due to not changing.
         this.reflectPropertyToAttribute(property);
-        return this.bindings[name] = observer;
+        // NOTE: reflecting binding information is typically required only for
+        // tooling. It has a performance cost so it's opt-in in Node.bind.
+        if (Platform.enableBindingsReflection) {
+          observer.path = observable.path_;
+          this.bindings_ = this.bindings_ || {};
+          this.bindings_[name] = observer;
+        }
+        return observer;
       }
     },
+    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from
+    // TemplateBinding. We still need to close/dispose of observers but perhaps
+    // we should choose a more explicit name.
     asyncUnbindAll: function() {
       if (!this._unbound) {
         log.unbind && console.log('[%s] asyncUnbindAll', this.localName);
@@ -866,18 +877,12 @@
     },
     unbindAll: function() {
       if (!this._unbound) {
-        this.unbindAllProperties();
-        this.super();
-        // unbind shadowRoot
-        var root = this.shadowRoot;
-        while (root) {
-          unbindNodeTree(root);
-          root = root.olderShadowRoot;
-        }
+        this.closeObservers();
+        this.closeNamedObservers();
         this._unbound = true;
       }
     },
-    cancelUnbindAll: function(preventCascade) {
+    cancelUnbindAll: function() {
       if (this._unbound) {
         log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);
         return;
@@ -886,15 +891,6 @@
       if (this._unbindAllJob) {
         this._unbindAllJob = this._unbindAllJob.stop();
       }
-      // 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) {
-        forNodeTree(this.shadowRoot, function(n) {
-          if (n.cancelUnbindAll) {
-            n.cancelUnbindAll();
-          }
-        });
-      }
     }
   };
 
@@ -930,11 +926,17 @@
  * license that can be found in the LICENSE file.
  */
 (function(scope) {
-  var preparingElements = 0;
 
   var base = {
     PolymerBase: true,
-    job: Polymer.job,
+    job: function(job, callback, wait) {
+      if (typeof job === 'string') {
+        var n = '___' + job;
+        this[n] = Polymer.job.call(this, this[n], callback, wait);
+      } else {
+        return Polymer.job.call(this, job, callback, wait);
+      }
+    },
     super: Polymer.super,
     // user entry point for element has had its createdCallback called
     created: function() {
@@ -944,17 +946,21 @@
     ready: function() {
     },
     createdCallback: function() {
-      this.created();
-      if (this.ownerDocument.defaultView || this.alwaysPrepare ||
-          preparingElements > 0) {
-        this.prepareElement();
+      if (this.templateInstance && this.templateInstance.model) {
+        console.warn('Attributes on ' + this.localName + ' were data bound ' +
+            'prior to Polymer upgrading the element. This may result in ' +
+            'incorrect binding types.');
       }
+      this.created();
+      this.prepareElement();
     },
     // system entry point, do not override
     prepareElement: function() {
       this._elementPrepared = true;
       // install shadowRoots storage
       this.shadowRoots = {};
+      // storage for closeable observers.
+      this._observers = [];
       // install property observers
       this.observeProperties();
       // install boilerplate attributes
@@ -963,13 +969,8 @@
       this.takeAttributes();
       // add event listeners
       this.addHostListeners();
-      // guarantees that while preparing, any
-      // sub-elements are also prepared
-      preparingElements++;
       // process declarative resources
       this.parseDeclarations(this.__proto__);
-      // decrement semaphore
-      preparingElements--;
       // TODO(sorvell): CE polyfill uses unresolved attribute to simulate
       // :unresolved; remove this attribute to be compatible with native
       // CE.
@@ -978,10 +979,7 @@
       this.ready();
     },
     attachedCallback: function() {
-      if (!this._elementPrepared) {
-        this.prepareElement();
-      }
-      this.cancelUnbindAll(true);
+      this.cancelUnbindAll();
       // invoke user action
       if (this.attached) {
         this.attached();
@@ -1042,7 +1040,7 @@
       var template = this.fetchTemplate(elementElement);
       if (template) {
         var root = this.shadowFromTemplate(template);
-        this.shadowRoots[elementElement.name] = root;        
+        this.shadowRoots[elementElement.name] = root;
       }
     },
     // return a shadow-root template (if desired), override for custom behavior
@@ -1054,8 +1052,6 @@
       if (template) {
         // make a shadow root
         var root = this.createShadowRoot();
-        // migrate flag(s)
-        root.resetStyleInheritance = this.resetStyleInheritance;
         // stamp template
         // which includes parsing and applying MDV bindings before being 
         // inserted (to avoid {{}} in attribute values)
@@ -1070,7 +1066,7 @@
       }
     },
     // utility function that stamps a <template> into light-dom
-    lightFromTemplate: function(template) {
+    lightFromTemplate: function(template, refNode) {
       if (template) {
         // TODO(sorvell): mark this element as a lightDOMController so that
         // event listeners on bound nodes inside it will be called on it.
@@ -1083,14 +1079,18 @@
         // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
         var dom = this.instanceTemplate(template);
         // append to shadow dom
-        this.appendChild(dom);
+        if (refNode) {
+          this.insertBefore(dom, refNode);          
+        } else {
+          this.appendChild(dom);
+        }
         // perform post-construction initialization tasks on ahem, light root
-        this.shadowRootReady(this, template);
+        this.shadowRootReady(this);
         // return the created shadow root
         return dom;
       }
     },
-    shadowRootReady: function(root, template) {
+    shadowRootReady: function(root) {
       // locate nodes with id and store references to them in this.$ hash
       this.marshalNodeReferences(root);
       // set up pointer gestures
@@ -1166,25 +1166,12 @@
     /**
      * Installs external stylesheets and <style> elements with the attribute 
      * polymer-scope='controller' into the scope of element. This is intended
-     * to be a called during custom element construction. 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.
+     * to be a called during custom element construction.
     */
-    // TODO(sorvell): remove when spec issues are addressed
     installControllerStyles: function() {
       // apply controller styles, but only if they are not yet applied
-      var scope = this.findStyleController();
-      if (scope && !this.scopeHasElementStyle(scope, STYLE_CONTROLLER_SCOPE)) {
+      var scope = this.findStyleScope();
+      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {
         // allow inherited controller styles
         var proto = getPrototypeOf(this), cssText = '';
         while (proto && proto.element) {
@@ -1192,29 +1179,50 @@
           proto = getPrototypeOf(proto);
         }
         if (cssText) {
-          var style = this.element.cssTextToScopeStyle(cssText,
-              STYLE_CONTROLLER_SCOPE);
-          // TODO(sorvell): for now these styles are not shimmed
-          // but we may need to shim them
-          Polymer.applyStyleToScope(style, scope);
+          this.installScopeCssText(cssText, scope);
         }
       }
     },
-    findStyleController: function() {
+    installScopeStyle: function(style, name, scope) {
+      var scope = scope || this.findStyleScope(), name = name || '';
+      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {
+        var cssText = '';
+        if (style instanceof Array) {
+          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {
+            cssText += s.textContent + '\n\n';
+          }
+        } else {
+          cssText = style.textContent;
+        }
+        this.installScopeCssText(cssText, scope, name);
+      }
+    },
+    installScopeCssText: function(cssText, scope, name) {
+      scope = scope || this.findStyleScope();
+      name = name || '';
+      if (!scope) {
+        return;
+      }
       if (window.ShadowDOMPolyfill) {
-        return wrap(document.head);
-      } else {
-        // find the shadow root that contains this element
-        var n = this;
-        while (n.parentNode) {
-          n = n.parentNode;
-        }
-        return n === document ? document.head : n;
+        cssText = shimCssText(cssText, scope.host);
       }
+      var style = this.element.cssTextToScopeStyle(cssText,
+          STYLE_CONTROLLER_SCOPE);
+      Polymer.applyStyleToScope(style, scope);
+      // cache that this style has been applied
+      scope._scopeStyles[this.localName + name] = true;
     },
-    scopeHasElementStyle: function(scope, descriptor) {
-      var rule = STYLE_SCOPE_ATTRIBUTE + '=' + this.localName + '-' + descriptor;
-      return scope.querySelector('style[' + rule + ']');
+    findStyleScope: function(node) {
+      // find the shadow root that contains this element
+      var n = node || this;
+      while (n.parentNode) {
+        n = n.parentNode;
+      }
+      return n;
+    },
+    scopeHasNamedStyle: function(scope, name) {
+      scope._scopeStyles = scope._scopeStyles || {};
+      return scope._scopeStyles[name];
     }
   };
   
@@ -1224,6 +1232,16 @@
     return prototype.__proto__;
   }
 
+  function shimCssText(cssText, host) {
+    var name = '', is = false;
+    if (host) {
+      name = host.localName;
+      is = host.hasAttribute('is');
+    }
+    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);
+    return Platform.ShadowCSS.shimCssText(cssText, selector);
+  }
+
   // exports
 
   scope.api.instance.styles = styles;
@@ -1246,6 +1264,15 @@
 
   // specify an 'own' prototype for tag `name`
   function element(name, prototype) {
+    if (arguments.length === 1 && typeof arguments[0] !== 'string') {
+      prototype = name;
+      var script = document._currentScript;
+      name = script && script.parentNode && script.parentNode.getAttribute ?
+          script.parentNode.getAttribute('name') : '';
+      if (!name) {
+        throw 'Element name could not be inferred.';
+      }
+    }
     if (getRegisteredPrototype[name]) {
       throw 'Already registered (Polymer) prototype for element ' + name;
     }
@@ -1395,7 +1422,7 @@
     },
     copySheetAttributes: function(style, link) {
       for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {
-        if (a.name !== 'rel' && a.name !== 'src') {
+        if (a.name !== 'rel' && a.name !== 'href') {
           style.setAttribute(a.name, a.value);
         }
       }
@@ -1417,14 +1444,6 @@
      * element's template.
      * @param elementElement The <element> element to style.
      */
-    // TODO(sorvell): wip... caching and styles handling can probably be removed
-    // We need a scheme to ensure stylesheets are eagerly loaded without 
-    // the creation of an element instance. Here are 2 options for handling this:
-    // 1. create a dummy element with ShadowDOM in dom that includes ALL styles
-    // processed here.
-    // 2. place stylesheets outside the element template. This will allow 
-    // imports to naturally load the sheets. Then at load time, we can remove
-    // the stylesheet from dom.
     installSheets: function() {
       this.cacheSheets();
       this.cacheStyles();
@@ -1535,11 +1554,17 @@
 
   function importRuleForSheet(sheet, baseUrl) {
     var href = new URL(sheet.getAttribute('href'), baseUrl).href;
-    return '@import \'' + href + '\';'
+    return '@import \'' + href + '\';';
   }
 
   function applyStyleToScope(style, scope) {
     if (style) {
+      if (scope === document) {
+        scope = document.head;
+      }
+      if (window.ShadowDOMPolyfill) {
+        scope = document.head;
+      }
       // TODO(sorvell): necessary for IE
       // see https://connect.microsoft.com/IE/feedback/details/790212/
       // cloning-a-style-element-and-adding-to-document-produces
@@ -1550,7 +1575,17 @@
       if (attr) {
         clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);
       }
-      scope.appendChild(clone);
+      // TODO(sorvell): probably too brittle; try to figure out 
+      // where to put the element.
+      var refNode = scope.firstElementChild;
+      if (scope === document.head) {
+        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';
+        var s$ = document.head.querySelectorAll(selector);
+        if (s$.length) {
+          refNode = s$[s$.length-1].nextElementSibling;
+        }
+      }
+      scope.insertBefore(clone, refNode);
     }
   }
 
@@ -1630,95 +1665,94 @@
   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);
-          }
-          //a.push(n);
-        }
-      }
-      if (prototype.publish) {
-        // construct name list
-        var a = prototype._publishNames = [];
-        for (var n in prototype.publish) {
-          a.push(n);
-        }
-      }
-    },
-    publishProperties: function(prototype, base) {
-      // if we have any properties to publish
-      var publish = prototype.publish;
-      if (publish) {
-        // transcribe `publish` entries onto own prototype
-        this.requireProperties(publish, prototype, base);
-        // construct map of lower-cased property names
-        prototype._publishLC = this.lowerCaseMap(publish);
-      }
-    },
-    requireProperties: function(properties, prototype, base) {
-      // ensure a prototype value for each property
-      for (var n in properties) {
-        if (prototype[n] === undefined && base[n] === undefined) {
-          prototype[n] = properties[n];
-        }
-      }
-    },
-    lowerCaseMap: function(properties) {
-      var map = {};
-      for (var n in properties) {
-        map[n.toLowerCase()] = n;
-      }
-      return map;
-    }
-  };
-
-  // exports
-
-  scope.api.declaration.properties = properties;
-
-})(Polymer);
+/*

+ * Copyright 2013 The Polymer Authors. All rights reserved.

+ * Use of this source code is governed by a BSD-style

+ * license that can be found in the LICENSE file.

+ */

+(function(scope) {

+

+  // element api

+

+  var properties = {

+    inferObservers: function(prototype) {

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

+      var observe = prototype.observe, property;

+      for (var n in prototype) {

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

+          if (!observe) {

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

+          }

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

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

+        }

+      }

+    },

+    explodeObservers: function(prototype) {

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

+      var o = prototype.observe;

+      if (o) {

+        var exploded = {};

+        for (var n in o) {

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

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

+            exploded[ni] = o[n];

+          }

+        }

+        prototype.observe = exploded;

+      }

+    },

+    optimizePropertyMaps: function(prototype) {

+      if (prototype.observe) {

+        // construct name list

+        var a = prototype._observeNames = [];

+        for (var n in prototype.observe) {

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

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

+            a.push(ni);

+          }

+        }

+      }

+      if (prototype.publish) {

+        // construct name list

+        var a = prototype._publishNames = [];

+        for (var n in prototype.publish) {

+          a.push(n);

+        }

+      }

+    },

+    publishProperties: function(prototype, base) {

+      // if we have any properties to publish

+      var publish = prototype.publish;

+      if (publish) {

+        // transcribe `publish` entries onto own prototype

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

+        // construct map of lower-cased property names

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

+      }

+    },

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

+      // ensure a prototype value for each property

+      for (var n in properties) {

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

+          prototype[n] = properties[n];

+        }

+      }

+    },

+    lowerCaseMap: function(properties) {

+      var map = {};

+      for (var n in properties) {

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

+      }

+      return map;

+    }

+  };

+

+  // exports

+

+  scope.api.declaration.properties = properties;

+

+})(Polymer);

 
 /*
  * Copyright 2013 The Polymer Authors. All rights reserved.
@@ -2063,8 +2097,8 @@
     indexOf: function(element) {
       var i = queueForElement(element).indexOf(element);
       if (i >= 0 && document.contains(element)) {
-        i += (HTMLImports.useNative || HTMLImports.ready) ? importQueue.length :
-            1e9;
+        i += (HTMLImports.useNative || HTMLImports.ready) ? 
+          importQueue.length : 1e9;
       }
       return i;  
     },
@@ -2083,7 +2117,7 @@
         //console.warn('queue order wrong', i);
         return;
       }
-      return queueForElement(element).shift();  
+      return queueForElement(element).shift();
     },
     check: function() {
       // next
@@ -2247,10 +2281,11 @@
        || this.waitingForResources()) {
           return;
       }
+      // TODO(sorvell): ends up calling '_register' by virtue
+      // of `waitingForQueue` (see below)
       queue.go(this);
     },
 
-
     // TODO(sorvell): refactor, this method is private-ish, but it's being
     // called by the queue object.
     _register: function() {
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 2e5ebdb..eed265f 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
@@ -29,7 +29,7 @@
     "src/declaration/polymer-element.js"
   ],
   "names": [],
-  "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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzFA;AACA;AACA;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;;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,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;AACA;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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",
+  "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 * 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",
@@ -39,22 +39,22 @@
     "/*\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 : 1 / handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 1) {\n        cancelAnimationFrame(Math.round(1 / 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(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        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.unregisterObserver(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.registerObserver(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    unbindAllProperties: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.close();\n      }\n      this.unregisterObservers();\n    },\n    unbindProperty: function(name) {\n      return this.unregisterObserver(name);\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    // bookkeeping observers for memory management\n    registerObserver: function(name, observer) {\n      var o$ = this._observers || (this._observers = {});\n      o$[name] = observer;\n    },\n    unregisterObserver: function(name) {\n      var o$ = this._observers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    unregisterObservers: function() {\n      if (this._observers) {\n        var keys=Object.keys(this._observers);\n        for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {\n          o = this._observers[k];\n          o.close();\n        }\n        this._observers = {};\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      return template.createInstance(this, this.syntax);\n    },\n    bind: function(name, observable, oneTime) {\n      // note: binding is a prepare signal. This allows us to be sure that any\n      // property changes that occur as a result of binding will be observed.\n      if (!this._elementPrepared) {\n        this.prepareElement();\n      }\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        // clean out the closets\n        this.unbind(name);\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable);\n        // stick path on observer so it's available via this.bindings\n        observer.path = observable.path_;\n        // reflect bound property to attribute when binding\n        // to ensure binding is not left on attribute if property\n        // does not update due to not changing.\n        this.reflectPropertyToAttribute(property);\n        return this.bindings[name] = observer;\n      }\n    },\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.unbindAllProperties();\n        this.super();\n        // unbind shadowRoot\n        var root = this.shadowRoot;\n        while (root) {\n          unbindNodeTree(root);\n          root = root.olderShadowRoot;\n        }\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function(preventCascade) {\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      // cancel unbinding our shadow tree iff we're not in the process of\n      // cascading our tree (as we do, for example, when the element is inserted).\n      if (!preventCascade) {\n        forNodeTree(this.shadowRoot, function(n) {\n          if (n.cancelUnbindAll) {\n            n.cancelUnbindAll();\n          }\n        });\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  var preparingElements = 0;\n\n  var base = {\n    PolymerBase: true,\n    job: Polymer.job,\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      this.created();\n      if (this.ownerDocument.defaultView || this.alwaysPrepare ||\n          preparingElements > 0) {\n        this.prepareElement();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      this._elementPrepared = true;\n      // install shadowRoots storage\n      this.shadowRoots = {};\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      // guarantees that while preparing, any\n      // sub-elements are also prepared\n      preparingElements++;\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // decrement semaphore\n      preparingElements--;\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      if (!this._elementPrepared) {\n        this.prepareElement();\n      }\n      this.cancelUnbindAll(true);\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        // migrate flag(s)\n        root.resetStyleInheritance = this.resetStyleInheritance;\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) {\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        this.appendChild(dom);\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this, template);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root, template) {\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. Note, this incurs a \n     * per instance cost and should be used sparingly.\n     *\n     * The need for this type of styling should go away when the shadowDOM spec\n     * addresses these issues:\n     * \n     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21391\n     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21390\n     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21389\n     * \n     * @param element The custom element instance into whose controller (parent)\n     * scope styles will be installed.\n     * @param elementElement The <element> containing controller styles.\n    */\n    // TODO(sorvell): remove when spec issues are addressed\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleController();\n      if (scope && !this.scopeHasElementStyle(scope, STYLE_CONTROLLER_SCOPE)) {\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          var style = this.element.cssTextToScopeStyle(cssText,\n              STYLE_CONTROLLER_SCOPE);\n          // TODO(sorvell): for now these styles are not shimmed\n          // but we may need to shim them\n          Polymer.applyStyleToScope(style, scope);\n        }\n      }\n    },\n    findStyleController: function() {\n      if (window.ShadowDOMPolyfill) {\n        return wrap(document.head);\n      } else {\n        // find the shadow root that contains this element\n        var n = this;\n        while (n.parentNode) {\n          n = n.parentNode;\n        }\n        return n === document ? document.head : n;\n      }\n    },\n    scopeHasElementStyle: function(scope, descriptor) {\n      var rule = STYLE_SCOPE_ATTRIBUTE + '=' + this.localName + '-' + descriptor;\n      return scope.querySelector('style[' + rule + ']');\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  // 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 (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(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 !== 'src') {\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    // TODO(sorvell): wip... caching and styles handling can probably be removed\n    // We need a scheme to ensure stylesheets are eagerly loaded without \n    // the creation of an element instance. Here are 2 options for handling this:\n    // 1. create a dummy element with ShadowDOM in dom that includes ALL styles\n    // processed here.\n    // 2. place stylesheets outside the element template. This will allow \n    // imports to naturally load the sheets. Then at load time, we can remove\n    // the stylesheet from dom.\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      // 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      scope.appendChild(clone);\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(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);",
-    "/*\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  // 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          //a.push(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    requireProperties: function(properties, prototype, base) {\n      // ensure a prototype value for each property\n      for (var n in properties) {\n        if (prototype[n] === undefined && base[n] === undefined) {\n          prototype[n] = properties[n];\n        }\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  };\n\n  // exports\n\n  scope.api.declaration.properties = properties;\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  // 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) ? importQueue.length :\n            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 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      queue.go(this);\n    },\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"
+    "/*\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.js b/pkg/polymer/lib/src/js/polymer/polymer.js
index e03efb2..170c124 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js
@@ -28,6 +28,6 @@
  * (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.0-e6f6d2b
-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:1/e},cancelAsync:function(a){1>a?cancelAnimationFrame(Math.round(1/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){for(var c,d=this._propertyObserver=new CompoundObserver,e=0,f=a.length;f>e&&(c=a[e]);e++){d.addPath(this,c);var g=Object.getOwnPropertyDescriptor(this.__proto__,c);g&&g.value&&this.observeArrayValue(c,g.value,null)}for(var c,e=0,f=b.length;f>e&&(c=b[e]);e++)this.observe&&void 0!==this.observe[c]||d.addPath(this,c);d.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.unregisterObserver(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.registerObserver(a+"__array",f)}},bindProperty:function(a,c){return b(this,a,c)},unbindAllProperties:function(){this._propertyObserver&&this._propertyObserver.close(),this.unregisterObservers()},unbindProperty:function(a){return this.unregisterObserver(a)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObserver:function(a,b){var c=this._observers||(this._observers={});c[a]=b},unregisterObserver:function(a){var b=this._observers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},unregisterObservers:function(){if(this._observers){for(var a,b,c=Object.keys(this._observers),d=0,e=c.length;e>d&&(a=c[d]);d++)b=this._observers[a],b.close();this._observers={}}}},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}function c(a){e(a,d)}function d(a){a.unbindAll()}function e(a,b){if(a){b(a);for(var c=a.firstChild;c;c=c.nextSibling)e(c,b)}}var f=window.logFlags||0,g=(a.api.instance.events,new PolymerExpressions);g.resolveEventHandler=function(a,c,d){var e=b(d);if(e){var f=c.getValueFrom(e);if(f)return f.bind(e)}};var h={syntax:g,instanceTemplate:function(a){return a.createInstance(this,this.syntax)},bind:function(a,b){this._elementPrepared||this.prepareElement();var c=this.propertyForAttribute(a);if(c){this.unbind(a);var d=this.bindProperty(c,b);return d.path=b.path_,this.reflectPropertyToAttribute(c),this.bindings[a]=d}return this.mixinSuper(arguments)},asyncUnbindAll:function(){this._unbound||(f.unbind&&console.log("[%s] asyncUnbindAll",this.localName),this._unbindAllJob=this.job(this._unbindAllJob,this.unbindAll,0))},unbindAll:function(){if(!this._unbound){this.unbindAllProperties(),this.super();for(var a=this.shadowRoot;a;)c(a),a=a.olderShadowRoot;this._unbound=!0}},cancelUnbindAll:function(a){return this._unbound?void(f.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(f.unbind&&console.log("[%s] cancelUnbindAll",this.localName),this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop()),void(a||e(this.shadowRoot,function(a){a.cancelUnbindAll&&a.cancelUnbindAll()})))}},i=/\{\{([^{}]*)}}/;a.bindPattern=i,a.api.instance.mdv=h}(Polymer),function(a){function b(a){return a.hasOwnProperty("PolymerBase")}function c(){}var d=0,e={PolymerBase:!0,job:Polymer.job,"super":Polymer.super,created:function(){},ready:function(){},createdCallback:function(){this.created(),(this.ownerDocument.defaultView||this.alwaysPrepare||d>0)&&this.prepareElement()},prepareElement:function(){this._elementPrepared=!0,this.shadowRoots={},this.observeProperties(),this.copyInstanceAttributes(),this.takeAttributes(),this.addHostListeners(),d++,this.parseDeclarations(this.__proto__),d--,this.removeAttribute("unresolved"),this.ready()},attachedCallback:function(){this._elementPrepared||this.prepareElement(),this.cancelUnbindAll(!0),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();b.resetStyleInheritance=this.resetStyleInheritance;var c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a){if(a){this.lightDomController=!0;var b=this.instanceTemplate(a);return this.appendChild(b),this.shadowRootReady(this,a),b}},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=e,e.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=e}(Polymer),function(a){function b(a){return a.__proto__}var c=(window.logFlags||{},"element"),d="controller",e={STYLE_SCOPE_ATTRIBUTE:c,installControllerStyles:function(){var a=this.findStyleController();if(a&&!this.scopeHasElementStyle(a,d)){for(var c=b(this),e="";c&&c.element;)e+=c.element.cssTextForScope(d),c=b(c);if(e){var f=this.element.cssTextToScopeStyle(e,d);Polymer.applyStyleToScope(f,a)}}},findStyleController:function(){if(window.ShadowDOMPolyfill)return wrap(document.head);for(var a=this;a.parentNode;)a=a.parentNode;return a===document?document.head:a},scopeHasElementStyle:function(a,b){var d=c+"="+this.localName+"-"+b;return a.querySelector("style["+d+"]")}};a.api.instance.styles=e}(Polymer),function(a){function b(a,b){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){var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e),b.appendChild(c)}}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&&"src"!==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);
+// @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 212884f..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":["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":[],"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 */\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 : 1 / handle;\n    },\n    cancelAsync: function(handle) {\n      if (handle < 1) {\n        cancelAnimationFrame(Math.round(1 / 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        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.unregisterObserver(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.registerObserver(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    unbindAllProperties: function() {\n      if (this._propertyObserver) {\n        this._propertyObserver.close();\n      }\n      this.unregisterObservers();\n    },\n    unbindProperty: function(name) {\n      return this.unregisterObserver(name);\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    // bookkeeping observers for memory management\n    registerObserver: function(name, observer) {\n      var o$ = this._observers || (this._observers = {});\n      o$[name] = observer;\n    },\n    unregisterObserver: function(name) {\n      var o$ = this._observers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    unregisterObservers: function() {\n      if (this._observers) {\n        var keys=Object.keys(this._observers);\n        for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {\n          o = this._observers[k];\n          o.close();\n        }\n        this._observers = {};\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      return template.createInstance(this, this.syntax);\n    },\n    bind: function(name, observable, oneTime) {\n      // note: binding is a prepare signal. This allows us to be sure that any\n      // property changes that occur as a result of binding will be observed.\n      if (!this._elementPrepared) {\n        this.prepareElement();\n      }\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        // clean out the closets\n        this.unbind(name);\n        // use n-way Polymer binding\n        var observer = this.bindProperty(property, observable);\n        // stick path on observer so it's available via this.bindings\n        observer.path = observable.path_;\n        // reflect bound property to attribute when binding\n        // to ensure binding is not left on attribute if property\n        // does not update due to not changing.\n        this.reflectPropertyToAttribute(property);\n        return this.bindings[name] = observer;\n      }\n    },\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.unbindAllProperties();\n        this.super();\n        // unbind shadowRoot\n        var root = this.shadowRoot;\n        while (root) {\n          unbindNodeTree(root);\n          root = root.olderShadowRoot;\n        }\n        this._unbound = true;\n      }\n    },\n    cancelUnbindAll: function(preventCascade) {\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      // cancel unbinding our shadow tree iff we're not in the process of\n      // cascading our tree (as we do, for example, when the element is inserted).\n      if (!preventCascade) {\n        forNodeTree(this.shadowRoot, function(n) {\n          if (n.cancelUnbindAll) {\n            n.cancelUnbindAll();\n          }\n        });\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  var preparingElements = 0;\n\n  var base = {\n    PolymerBase: true,\n    job: Polymer.job,\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      this.created();\n      if (this.ownerDocument.defaultView || this.alwaysPrepare ||\n          preparingElements > 0) {\n        this.prepareElement();\n      }\n    },\n    // system entry point, do not override\n    prepareElement: function() {\n      this._elementPrepared = true;\n      // install shadowRoots storage\n      this.shadowRoots = {};\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      // guarantees that while preparing, any\n      // sub-elements are also prepared\n      preparingElements++;\n      // process declarative resources\n      this.parseDeclarations(this.__proto__);\n      // decrement semaphore\n      preparingElements--;\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      if (!this._elementPrepared) {\n        this.prepareElement();\n      }\n      this.cancelUnbindAll(true);\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        // migrate flag(s)\n        root.resetStyleInheritance = this.resetStyleInheritance;\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) {\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        this.appendChild(dom);\n        // perform post-construction initialization tasks on ahem, light root\n        this.shadowRootReady(this, template);\n        // return the created shadow root\n        return dom;\n      }\n    },\n    shadowRootReady: function(root, template) {\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. Note, this incurs a \n     * per instance cost and should be used sparingly.\n     *\n     * The need for this type of styling should go away when the shadowDOM spec\n     * addresses these issues:\n     * \n     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21391\n     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21390\n     * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21389\n     * \n     * @param element The custom element instance into whose controller (parent)\n     * scope styles will be installed.\n     * @param elementElement The <element> containing controller styles.\n    */\n    // TODO(sorvell): remove when spec issues are addressed\n    installControllerStyles: function() {\n      // apply controller styles, but only if they are not yet applied\n      var scope = this.findStyleController();\n      if (scope && !this.scopeHasElementStyle(scope, STYLE_CONTROLLER_SCOPE)) {\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          var style = this.element.cssTextToScopeStyle(cssText,\n              STYLE_CONTROLLER_SCOPE);\n          // TODO(sorvell): for now these styles are not shimmed\n          // but we may need to shim them\n          Polymer.applyStyleToScope(style, scope);\n        }\n      }\n    },\n    findStyleController: function() {\n      if (window.ShadowDOMPolyfill) {\n        return wrap(document.head);\n      } else {\n        // find the shadow root that contains this element\n        var n = this;\n        while (n.parentNode) {\n          n = n.parentNode;\n        }\n        return n === document ? document.head : n;\n      }\n    },\n    scopeHasElementStyle: function(scope, descriptor) {\n      var rule = STYLE_SCOPE_ATTRIBUTE + '=' + this.localName + '-' + descriptor;\n      return scope.querySelector('style[' + rule + ']');\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  // 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 (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 !== 'src') {\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    // TODO(sorvell): wip... caching and styles handling can probably be removed\n    // We need a scheme to ensure stylesheets are eagerly loaded without \n    // the creation of an element instance. Here are 2 options for handling this:\n    // 1. create a dummy element with ShadowDOM in dom that includes ALL styles\n    // processed here.\n    // 2. place stylesheets outside the element template. This will allow \n    // imports to naturally load the sheets. Then at load time, we can remove\n    // the stylesheet from dom.\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      // 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      scope.appendChild(clone);\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);","/*\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  // 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          //a.push(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    requireProperties: function(properties, prototype, base) {\n      // ensure a prototype value for each property\n      for (var n in properties) {\n        if (prototype[n] === undefined && base[n] === undefined) {\n          prototype[n] = properties[n];\n        }\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  };\n\n  // exports\n\n  scope.api.declaration.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  // 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) ? importQueue.length :\n            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      queue.go(this);\n    },\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
+{"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":"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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 */\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/use_native_dartium_shadowdom.js b/pkg/polymer/lib/src/js/use_native_dartium_shadowdom.js
index c2f51c1..7b492b7 100644
--- a/pkg/polymer/lib/src/js/use_native_dartium_shadowdom.js
+++ b/pkg/polymer/lib/src/js/use_native_dartium_shadowdom.js
@@ -7,4 +7,23 @@
   window.Platform = window.Platform || {};
   Platform.flags = Platform.flags || {};
   Platform.flags.shadow = 'native';
+
+  // Note: Dartium 34 hasn't turned on the unprefixed Shadow DOM
+  // (this happens in Chrome 35), so unless "enable experimental platform
+  // features" is enabled, things will break. So we expose them as unprefixed
+  // names instead.
+  var proto = Element.prototype;
+  if (!proto.createShadowRoot) {
+    proto.createShadowRoot = proto.webkitCreateShadowRoot;
+
+    Object.defineProperty(proto, 'shadowRoot', {
+      get: function() {
+        return this.webkitShadowRoot;
+      },
+      set: function(value) {
+        this.webkitShadowRoot = value;
+      },
+      configurable: true
+    });
+  }
 }
diff --git a/pkg/polymer/lib/src/loader.dart b/pkg/polymer/lib/src/loader.dart
index 60bf2fe..13e8b1c 100644
--- a/pkg/polymer/lib/src/loader.dart
+++ b/pkg/polymer/lib/src/loader.dart
@@ -20,40 +20,38 @@
   const InitMethodAnnotation();
 }
 
-/// Initializes a polymer application as follows:
-///   * set up up polling for observable changes
-///   * initialize Model-Driven Views
-///   * Include some style to prevent flash of unstyled content (FOUC)
-///   * for each library included transitively from HTML and HTML imports,
-///   register custom elements declared there (labeled with [CustomTag]) and
-///   invoke the initialization method on it (top-level functions annotated with
-///   [initMethod]).
-Zone initPolymer() => loader.deployMode
-  // In deployment mode, we rely on change notifiers instead of dirty checking.
-    ? _initPolymerOptimized() : (dirtyCheckZone()..run(_initPolymerOptimized));
-
-/// Same as [initPolymer], but runs the version that is optimized for deployment
-/// to the internet. The biggest difference is it omits the [Zone] that
-/// automatically invokes [Observable.dirtyCheck], and the list of initializers
-/// must be supplied instead of being dynamically searched for at runtime using
-/// mirrors.
-Zone _initPolymerOptimized() {
-  _hookJsPolymer();
-
-  for (var initializer in loader.initializers) {
-    initializer();
-  }
-
+/// This method is deprecated. It used to be where polymer initialization
+/// happens, now this is done automatically from bootstrap.dart.
+@deprecated
+Zone initPolymer() {
+  window.console.error(_ERROR);
   return Zone.current;
 }
 
-/// Configures [initPolymer] making it optimized for deployment to the internet.
-/// With this setup the initializer list is supplied instead of searched for
-/// at runtime. Additionally, after this method is called [initPolymer] omits
-/// the [Zone] that automatically invokes [Observable.dirtyCheck].
-void configureForDeployment(List<Function> initializers) {
-  loader.initializers = initializers;
-  loader.deployMode = true;
+const _ERROR = '''
+initPolymer is now deprecated. To initialize a polymer app:
+  * add to your page: <link rel="import" href="packages/polymer/polymer.html">
+  * replace "application/dart" mime-types with "application/dart;component=1"
+  * if you use "init.dart", remove it
+  * if you have a main, change it into a method annotated with @initMethod
+''';
+
+/// True if we're in deployment mode.
+bool _deployMode = false;
+
+/// Starts polymer by running all [initializers] and hooking the polymer.js
+/// code. **Note**: this function is not meant to be invoked directly by
+/// application developers. It is invoked by a bootstrap entry point that is
+/// automatically generated. During development, this entry point is generated
+/// dynamically in `boot.js`. Similarly, pub-build generates this entry point
+/// for deployment.
+void startPolymer(List<Function> initializers, [bool deployMode = true]) {
+  _hookJsPolymer();
+  _deployMode = deployMode;
+
+  for (var initializer in initializers) {
+    initializer();
+  }
 }
 
 /// To ensure Dart can interoperate with polymer-element registered by
diff --git a/pkg/polymer/lib/src/mirror_loader.dart b/pkg/polymer/lib/src/mirror_loader.dart
index c450b83..6e8a2bd 100644
--- a/pkg/polymer/lib/src/mirror_loader.dart
+++ b/pkg/polymer/lib/src/mirror_loader.dart
@@ -22,24 +22,26 @@
 import 'dart:mirrors';
 
 import 'package:logging/logging.dart' show Logger;
-import 'package:polymer/polymer.dart' show
-    InitMethodAnnotation, CustomTag, initMethod, Polymer;
+import 'package:polymer/polymer.dart';
+import 'package:observe/src/dirty_check.dart';
 
 
+void startPolymerInDevelopment(List<String> librariesToLoad) {
+  dirtyCheckZone()..run(() {
+    startPolymer(discoverInitializers(librariesToLoad), false);
+  });
+}
+
 /// Set of initializers that are invoked by `initPolymer`.  This is computed the
 /// list by crawling HTML imports, searching for script tags, and including an
 /// initializer for each type tagged with a [CustomTag] annotation and for each
 /// top-level method annotated with [initMethod].
-List<Function> initializers = _discoverInitializers();
-
-/// True if we're in deployment mode.
-bool deployMode = false;
 
 /// Discovers what script tags are loaded from HTML pages and collects the
 /// initializers of their corresponding libraries.
-List<Function> _discoverInitializers() {
+// Visible for testing only.
+List<Function> discoverInitializers(List<String> librariesToLoad) {
   var initializers = [];
-  var librariesToLoad = _discoverScripts(document, window.location.href);
   for (var lib in librariesToLoad) {
     try {
       _loadLibrary(lib, initializers);
@@ -52,58 +54,11 @@
   return initializers;
 }
 
-/// Walks the HTML import structure to discover all script tags that are
-/// implicitly loaded. This code is only used in Dartium and should only be
-/// called after all HTML imports are resolved. Polymer ensures this by asking
-/// users to put their Dart script tags after all HTML imports (this is checked
-/// by the linter, and Dartium will otherwise show an error message).
-List<String> _discoverScripts(Document doc, String baseUri,
-    [Set<Document> seen, List<String> scripts]) {
-  if (seen == null) seen = new Set<Document>();
-  if (scripts == null) scripts = <String>[];
-  if (doc == null) {
-    print('warning: $baseUri not found.');
-    return scripts;
-  }
-  if (seen.contains(doc)) return scripts;
-  seen.add(doc);
-
-  bool scriptSeen = false;
-  for (var node in doc.querySelectorAll('script,link[rel="import"]')) {
-    if (node is LinkElement) {
-      _discoverScripts(node.import, node.href, seen, scripts);
-    } else if (node is ScriptElement && node.type == 'application/dart') {
-      if (!scriptSeen) {
-        var url = node.src;
-        scripts.add(url == '' ? baseUri : url);
-        scriptSeen = true;
-      } else {
-        print('warning: more than one Dart script tag in $baseUri. Dartium '
-            'currently only allows a single Dart script tag per document.');
-      }
-    }
-  }
-  return scripts;
-}
-
 /// All libraries in the current isolate.
 final _libs = currentMirrorSystem().libraries;
 
-// TODO(sigmund): explore other (cheaper) ways to resolve URIs relative to the
-// root library (see dartbug.com/12612)
-final _rootUri = currentMirrorSystem().isolate.rootLibrary.uri;
-
 final Logger _loaderLog = new Logger('polymer.src.mirror_loader');
 
-bool _isHttpStylePackageUrl(Uri uri) {
-  var uriPath = uri.path;
-  return uri.scheme == _rootUri.scheme &&
-      // Don't process cross-domain uris.
-      uri.authority == _rootUri.authority &&
-      uriPath.endsWith('.dart') &&
-      (uriPath.contains('/packages/') || uriPath.startsWith('packages/'));
-}
-
 /// Reads the library at [uriString] (which can be an absolute URI or a relative
 /// URI from the root library), and:
 ///
@@ -113,23 +68,8 @@
 ///   * Registers any [PolymerElement] that is marked with the [CustomTag]
 ///     annotation.
 void _loadLibrary(String uriString, List<Function> initializers) {
-  var uri = _rootUri.resolve(uriString);
+  var uri = Uri.parse(uriString);
   var lib = _libs[uri];
-  if (_isHttpStylePackageUrl(uri)) {
-    // Use package: urls if available. This rule here is more permissive than
-    // how we translate urls in polymer-build, but we expect Dartium to limit
-    // the cases where there are differences. The polymer-build issues an error
-    // when using packages/ inside lib without properly stepping out all the way
-    // to the packages folder. If users don't create symlinks in the source
-    // tree, then Dartium will also complain because it won't find the file seen
-    // in an HTML import.
-    var packagePath = uri.path.substring(
-        uri.path.lastIndexOf('packages/') + 'packages/'.length);
-    var canonicalLib = _libs[Uri.parse('package:$packagePath')];
-    if (canonicalLib != null) {
-      lib = canonicalLib;
-    }
-  }
 
   if (lib == null) {
     _loaderLog.info('$uri library not found');
@@ -162,7 +102,8 @@
 
 void _loadCustomTags(LibraryMirror lib, ClassMirror cls,
     LinkedHashMap registerFns) {
-  if (cls == null || cls.reflectedType == HtmlElement) return;
+  if (cls == null) return;
+  if (cls.hasReflectedType && cls.reflectedType == HtmlElement) return;
 
   // Register superclass first.
   _loadCustomTags(lib, cls.superclass, registerFns);
@@ -177,6 +118,13 @@
   var meta = _getCustomTagMetadata(cls);
   if (meta == null) return;
 
+  if (!cls.hasReflectedType) {
+    var name = MirrorSystem.getName(cls.simpleName);
+    new Completer().completeError(new UnsupportedError('Custom element classes '
+        'cannot have type-parameters: $name'));
+    return;
+  }
+
   registerFns.putIfAbsent(cls.reflectedType, () =>
       () => Polymer.register(meta.tagName, cls.reflectedType));
 }
diff --git a/pkg/polymer/lib/src/static_loader.dart b/pkg/polymer/lib/src/static_loader.dart
deleted file mode 100644
index cd926c1..0000000
--- a/pkg/polymer/lib/src/static_loader.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Alternative implementation for loading initializers that avoids using
-/// mirrors. Unlike `mirror_loader` this is used for deployed applications to
-/// avoid any dependence on the mirror system.
-library polymer.src.static_loader;
-
-/// Set of initializers that are invoked by `initPolymer`.  This is initialized
-/// with code automatically generated by the polymer transformers. The
-/// initialization code is injected in the entrypoint of the application.
-List<Function> initializers;
-
-/// True if we're in deployment mode.
-// TODO(sigmund): make this a const anda rem ove the assignment in
-// configureForDevelopment when our testing infrastructure supports calling pub
-// build.
-bool deployMode = true;
diff --git a/pkg/polymer/lib/transformer.dart b/pkg/polymer/lib/transformer.dart
index 717ae51..c4a224a 100644
--- a/pkg/polymer/lib/transformer.dart
+++ b/pkg/polymer/lib/transformer.dart
@@ -28,7 +28,7 @@
   final Iterable<Iterable> phases;
 
   PolymerTransformerGroup(TransformOptions options)
-      : phases = _createDeployPhases(options);
+      : phases = createDeployPhases(options);
 
   PolymerTransformerGroup.asPlugin(BarbackSettings settings)
       : this(_parseSettings(settings));
@@ -69,12 +69,13 @@
 /// comes first (other than linter, if [options.linter] is enabled), which
 /// allows the rest of the HTML-processing phases to operate only on HTML that
 /// is actually imported.
-List<List<Transformer>> _createDeployPhases(TransformOptions options) {
+List<List<Transformer>> createDeployPhases(
+    TransformOptions options, {String sdkDir}) {
   var phases = options.lint ? [[new Linter(options)]] : [];
   return phases..addAll([
     [new ImportInliner(options)],
     [new ObservableTransformer()],
-    [new ScriptCompactor(options)],
+    [new ScriptCompactor(options, sdkDir: sdkDir)],
     [new PolyfillInjector(options)],
     [new BuildFilter(options)]
   ]);
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index b6fcbca..aca5df5 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.10.0-pre.4
+version: 0.10.0-pre.9.dev
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Polymer.dart is a new type of library for the web, built on top of Web
@@ -9,29 +9,26 @@
 dependencies:
   analyzer: '>=0.13.0 <0.14.0'
   args: '>=0.10.0 <0.11.0'
-  barback: '>=0.9.0 <0.13.0'
+  barback: '>=0.9.0 <0.14.0'
   browser: '>=0.10.0 <0.11.0'
   code_transformers: '>=0.1.0 <0.2.0'
-  html5lib: '>=0.9.2 <0.10.0'
+  html5lib: '>=0.10.0 <0.11.0'
   logging: '>=0.9.0 <0.10.0'
   observe: '>=0.10.0-pre.0 <0.11.0'
   path: '>=0.9.0 <2.0.0'
-  polymer_expressions: '>=0.10.0-pre.0 <0.11.0'
-  smoke: '>=0.1.0-pre.1 <0.2.0'
+  polymer_expressions: '>=0.10.0-pre.1 <0.11.0'
+  smoke: '>=0.1.0-pre.2 <0.2.0'
   source_maps: '>=0.9.0 <0.10.0'
-  template_binding: '>=0.10.0-pre.0 <0.11.0'
-  web_components: '>=0.3.2 <0.4.0'
+  template_binding: '>=0.10.0-pre.1 <0.11.0'
+  web_components: '>=0.3.3 <0.4.0'
   yaml: '>=0.9.0 <0.10.0'
 dev_dependencies:
   unittest: '>=0.10.0 <0.11.0'
 transformers:
-# TODO(sigmund): uncomment when full codegen is ready.
-#- polymer/src/build/remove_mirrors
-#    $include: lib/polymer.dart
+- polymer/src/build/mirrors_remover:
+    $include: lib/polymer.dart
 - observe:
     files: lib/src/instance.dart
-    # TODO(sigmund): uncomment once $include is available in the stable channel
-    # (1.3.0) or when we really need a dependency on the latest dev channel.
-    # $include: lib/src/instance.dart
+    $include: lib/src/instance.dart
 environment:
-  sdk: '>=1.2.0 <2.0.0'
+  sdk: '>=1.3.0-dev.5.0 <2.0.0'
diff --git a/pkg/polymer/test/attr_deserialize_test.dart b/pkg/polymer/test/attr_deserialize_test.dart
index 536b019..55060e1 100644
--- a/pkg/polymer/test/attr_deserialize_test.dart
+++ b/pkg/polymer/test/attr_deserialize_test.dart
@@ -19,8 +19,8 @@
   @published Object json;
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/attr_deserialize_test.html b/pkg/polymer/test/attr_deserialize_test.html
index 35ef320..8179078 100644
--- a/pkg/polymer/test/attr_deserialize_test.html
+++ b/pkg/polymer/test/attr_deserialize_test.html
@@ -25,6 +25,7 @@
         json="{'here': 'is', 'some': 'json', 'x': 123}">
     </my-element>
 
-    <script type="application/dart" src="attr_deserialize_test.dart"></script>
+    <script type="application/dart;component=1"
+            src="attr_deserialize_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/attr_mustache_test.dart b/pkg/polymer/test/attr_mustache_test.dart
index e327ed6..d8cb940 100644
--- a/pkg/polymer/test/attr_mustache_test.dart
+++ b/pkg/polymer/test/attr_mustache_test.dart
@@ -44,8 +44,8 @@
   @observable var src = 'testSource';
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/attr_mustache_test.html b/pkg/polymer/test/attr_mustache_test.html
index 42c3b3d..9dc8b7e 100644
--- a/pkg/polymer/test/attr_mustache_test.html
+++ b/pkg/polymer/test/attr_mustache_test.html
@@ -23,6 +23,7 @@
       </template>
     </polymer-element>
 
-  <script type="application/dart" src="attr_mustache_test.dart"></script>
+  <script type="application/dart;component=1"
+          src="attr_mustache_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/bind_test.dart b/pkg/polymer/test/bind_test.dart
index 7a58683..0b3c6eb 100644
--- a/pkg/polymer/test/bind_test.dart
+++ b/pkg/polymer/test/bind_test.dart
@@ -44,8 +44,8 @@
   }
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/bind_test.html b/pkg/polymer/test/bind_test.html
index 7221cce..82aa2d9 100644
--- a/pkg/polymer/test/bind_test.html
+++ b/pkg/polymer/test/bind_test.html
@@ -34,6 +34,6 @@
       </template>
     </polymer-element>
 
-    <script type="application/dart" src="bind_test.dart"></script>
+    <script type="application/dart;component=1" src="bind_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/build/all_phases_test.dart b/pkg/polymer/test/build/all_phases_test.dart
index b30b428..2427976 100644
--- a/pkg/polymer/test/build/all_phases_test.dart
+++ b/pkg/polymer/test/build/all_phases_test.dart
@@ -4,71 +4,85 @@
 
 library polymer.test.build.all_phases_test;
 
+import 'package:code_transformers/tests.dart' show testingDartSdkDirectory;
 import 'package:polymer/src/build/common.dart';
+import 'package:polymer/src/build/import_inliner.dart' show COMPONENT_WARNING;
+import 'package:polymer/src/build/linter.dart' show USE_POLYMER_HTML;
 import 'package:polymer/src/build/script_compactor.dart' show MAIN_HEADER;
 import 'package:polymer/transformer.dart';
+import 'package:smoke/codegen/generator.dart' show DEFAULT_IMPORTS;
 import 'package:unittest/compact_vm_config.dart';
 
 import 'common.dart';
 
 void main() {
   useCompactVMConfiguration();
-  var phases = new PolymerTransformerGroup(new TransformOptions()).phases;
+  var phases = createDeployPhases(new TransformOptions(),
+      sdkDir: testingDartSdkDirectory);
 
   testPhases('no changes', phases, {
       'a|web/test.html': '<!DOCTYPE html><html></html>',
     }, {}, [
-      'error: To run a polymer application, you need to call "initPolymer". You'
-      ' can either include a generic script tag that does this for you:\'<'
-      'script type="application/dart">export "package:polymer/init.dart";'
-      '</script>\' or add your own script tag and call that function. Make sure'
-      ' the script tag is placed after all HTML imports.'
+      'warning: $USE_POLYMER_HTML'
     ]);
 
   testPhases('observable changes', phases, {
-      'a|web/test.dart': _sampleObservable('A', 'foo'),
-      'a|web/test2.dart': _sampleObservableOutput('B', 'bar'),
+      'a|web/test.dart': _sampleInput('A', 'foo'),
+      'a|web/test2.dart': _sampleOutput('B', 'bar'),
     }, {
-      'a|web/test.dart': _sampleObservableOutput('A', 'foo'),
-      'a|web/test2.dart': _sampleObservableOutput('B', 'bar'),
+      'a|web/test.dart': _sampleOutput('A', 'foo'),
+      'a|web/test2.dart': _sampleOutput('B', 'bar'),
     });
 
   testPhases('single script', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '<script type="application/dart" src="a.dart"></script>',
-      'a|web/a.dart': _sampleObservable('A', 'foo'),
+          '<link rel="import" href="packages/polymer/polymer.html">'
+          '<script type="application/dart;component=1" src="a.dart"></script>',
+      'a|web/a.dart': _sampleInput('A', 'foo'),
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '$WEB_COMPONENTS_TAG'
-          '$INTEROP_TAG'
+          '</head><body>'
           '<script src="test.html_bootstrap.dart.js"></script>'
-          '</head><body></body></html>',
+          '</body></html>',
 
       'a|web/test.html_bootstrap.dart':
           '''$MAIN_HEADER
           import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'a.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
 
           void main() {
-            configureForDeployment([
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                parents: {
+                  smoke_0.XA: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XA: const {},
+                }));
+            startPolymer([
+                i0.m_foo,
+                () => Polymer.register('x-A', i0.XA),
               ]);
-            i0.main();
           }
           '''.replaceAll('\n          ', '\n'),
-      'a|web/a.dart': _sampleObservableOutput('A', 'foo'),
+      'a|web/a.dart': _sampleOutput('A', 'foo'),
     });
 
   testPhases('single inline script', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '<script type="application/dart">'
-          '${_sampleObservable("B", "bar")}</script>',
+          '<link rel="import" href="packages/polymer/polymer.html">'
+          '<script type="application/dart;component=1">'
+          '${_sampleInput("B", "bar")}</script>',
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '$WEB_COMPONENTS_TAG'
-          '$INTEROP_TAG'
           '</head><body>'
           '<script src="test.html_bootstrap.dart.js"></script>'
           '</body></html>',
@@ -76,89 +90,161 @@
       'a|web/test.html_bootstrap.dart':
           '''$MAIN_HEADER
           import 'test.html.0.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'test.html.0.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
 
           void main() {
-            configureForDeployment([
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                parents: {
+                  smoke_0.XB: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XB: const {},
+                }));
+            startPolymer([
+                i0.m_bar,
+                () => Polymer.register('x-B', i0.XB),
               ]);
-            i0.main();
           }
           '''.replaceAll('\n          ', '\n'),
       'a|web/test.html.0.dart':
-          _sampleObservableOutput("B", "bar"),
+          _sampleOutput("B", "bar"),
     });
 
-  const onlyOne = 'warning: Only one "application/dart" script tag per document'
-      ' is allowed.';
-  const moreNotSupported =
-      'warning: more than one Dart script per HTML document is not supported. '
-      'Script will be ignored.';
-
-  testPhases('several scripts', phases, {
+  testPhases('several application scripts', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '<script type="application/dart" src="a.dart"></script>'
-          // TODO(sigmund): provide a way to see logging warnings and errors.
-          // For example, these extra tags produce warnings and are then removed
-          // by the transformers. The test below checks that the output looks
-          // correct, but we should also validate the messages logged.
+          '<link rel="import" href="packages/polymer/polymer.html">'
+          '<script type="application/dart;component=1" src="a.dart"></script>'
           '<script type="application/dart">'
-          '${_sampleObservable("B", "bar")}</script>'
+          '${_sampleInput("B", "bar")}</script>'
           '</head><body><div>'
           '<script type="application/dart">'
-          '${_sampleObservable("C", "car")}</script>'
+          '${_sampleInput("C", "car")}</script>'
           '</div>'
           '<script type="application/dart" src="d.dart"></script>',
-      'a|web/a.dart': _sampleObservable('A', 'foo'),
+      'a|web/a.dart': _sampleInput('A', 'foo'),
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '$WEB_COMPONENTS_TAG'
-          '$INTEROP_TAG'
           '</head><body>'
+          '<script src="test.html.0.dart.js"></script>'
+          '<div>'                   
+          '<script src="test.html.1.dart.js"></script>'
+          '</div>'
+          '<script src="d.dart.js"></script>'
           '<script src="test.html_bootstrap.dart.js"></script>'
-          '<div></div>'
           '</body></html>',
 
       'a|web/test.html_bootstrap.dart':
           '''$MAIN_HEADER
           import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'a.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
 
           void main() {
-            configureForDeployment([
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                parents: {
+                  smoke_0.XA: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XA: const {},
+                }));
+            startPolymer([
+                i0.m_foo,
+                () => Polymer.register('x-A', i0.XA),
               ]);
-            i0.main();
           }
           '''.replaceAll('\n          ', '\n'),
-      'a|web/a.dart': _sampleObservableOutput('A', 'foo'),
+      'a|web/a.dart': _sampleOutput('A', 'foo'),
     }, [
       // These should not be emitted multiple times. See:
       // https://code.google.com/p/dart/issues/detail?id=17197
-      '$onlyOne (web/test.html 0 81)',
-      '$onlyOne (web/test.html 7 27)',
-      '$onlyOne (web/test.html 14 15)',
-      '$moreNotSupported (web/test.html 0 81)',
-      '$moreNotSupported (web/test.html 7 27)',
-      '$moreNotSupported (web/test.html 14 15)'
+      'warning: $COMPONENT_WARNING (web/test.html 14 27)',
+      'warning: $COMPONENT_WARNING (web/test.html 28 15)'
     ]);
 
+  testPhases('several component scripts', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '<link rel="import" href="packages/polymer/polymer.html">'
+          '<script type="application/dart;component=1" src="a.dart"></script>'
+          '<script type="application/dart;component=1">'
+          '${_sampleInput("B", "bar")}</script>'
+          '</head><body><div>'
+          '<script type="application/dart;component=1">'
+          '${_sampleInput("C", "car")}</script>'
+          '</div>',
+      'a|web/a.dart': _sampleInput('A', 'foo'),
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '$WEB_COMPONENTS_TAG'
+          '</head><body>'
+          '<div></div>'
+          '<script src="test.html_bootstrap.dart.js"></script>'
+          '</body></html>',
+
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          import 'test.html.0.dart' as i1;
+          import 'test.html.1.dart' as i2;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'a.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+          import 'test.html.0.dart' as smoke_2;
+          import 'test.html.1.dart' as smoke_3;
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                parents: {
+                  smoke_0.XA: smoke_1.PolymerElement,
+                  smoke_2.XB: smoke_1.PolymerElement,
+                  smoke_3.XC: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XA: const {},
+                  smoke_2.XB: const {},
+                  smoke_3.XC: const {},
+                }));
+            startPolymer([
+                i0.m_foo,
+                () => Polymer.register('x-A', i0.XA),
+                i1.m_bar,
+                () => Polymer.register('x-B', i1.XB),
+                i2.m_car,
+                () => Polymer.register('x-C', i2.XC),
+              ]);
+          }
+          '''.replaceAll('\n          ', '\n'),
+      'a|web/a.dart': _sampleOutput('A', 'foo'),
+    }, []);
+
   testPhases('with imports', phases, {
       'a|web/index.html':
           '<!DOCTYPE html><html><head>'
+          '<link rel="import" href="packages/polymer/polymer.html">'
           '<link rel="import" href="test2.html">'
           '</head><body>'
-          '<script type="application/dart" src="b.dart"></script>',
-      'a|web/b.dart': _sampleObservable('B', 'bar'),
+          '<script type="application/dart;component=1" src="b.dart"></script>',
+      'a|web/b.dart': _sampleInput('B', 'bar'),
       'a|web/test2.html':
           '<!DOCTYPE html><html><head></head><body>'
           '<polymer-element name="x-a">1'
-          '<script type="application/dart">'
-          '${_sampleObservable("A", "foo")}</script>'
+          '<script type="application/dart;component=1">'
+          '${_sampleInput("A", "foo")}</script>'
           '</polymer-element></html>',
     }, {
       'a|web/index.html':
           '<!DOCTYPE html><html><head>'
           '$WEB_COMPONENTS_TAG'
-          '$INTEROP_TAG'
           '</head><body><polymer-element name="x-a">1</polymer-element>'
           '<script src="index.html_bootstrap.dart.js"></script>'
           '</body></html>',
@@ -166,37 +252,74 @@
           '''$MAIN_HEADER
           import 'index.html.0.dart' as i0;
           import 'b.dart' as i1;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'index.html.0.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+          import 'b.dart' as smoke_2;
 
           void main() {
-            configureForDeployment([
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                parents: {
+                  smoke_2.XB: smoke_1.PolymerElement,
+                  smoke_0.XA: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_2.XB: const {},
+                  smoke_0.XA: const {},
+                }));
+            startPolymer([
+                i0.m_foo,
+                () => Polymer.register('x-A', i0.XA),
+                i1.m_bar,
+                () => Polymer.register('x-B', i1.XB),
               ]);
-            i1.main();
           }
           '''.replaceAll('\n          ', '\n'),
-      'a|web/index.html.0.dart': _sampleObservableOutput("A", "foo"),
-      'a|web/b.dart': _sampleObservableOutput('B', 'bar'),
+      'a|web/index.html.0.dart': _sampleOutput("A", "foo"),
+      'a|web/b.dart': _sampleOutput('B', 'bar'),
     });
 }
 
-String _sampleObservable(String className, String fieldName) => '''
+String _sampleInput(String className, String fieldName) => '''
 library ${className}_$fieldName;
 import 'package:observe/observe.dart';
+import 'package:polymer/polymer.dart';
 
 class $className extends Observable {
   @observable int $fieldName;
   $className(this.$fieldName);
 }
+
+@CustomTag('x-$className')
+class X${className} extends PolymerElement {
+  X${className}.created() : super.created();
+}
+@initMethod m_$fieldName() {}
 ''';
 
-String _sampleObservableOutput(String className, String field,
-    {bool includeMain: false}) =>
-    "library ${className}_$field;\n"
-    "import 'package:observe/observe.dart';\n\n"
-    "class $className extends ChangeNotifier {\n"
-    "  @reflectable @observable int get $field => __\$$field; "
-      "int __\$$field; "
-      "@reflectable set $field(int value) { "
-      "__\$$field = notifyPropertyChange(#$field, __\$$field, value); "
-      "}\n"
-    "  $className($field) : __\$$field = $field;\n"
-    "}\n";
+
+String _sampleOutput(String className, String fieldName) {
+  var fieldReplacement = '@reflectable @observable '
+      'int get $fieldName => __\$$fieldName; '
+      'int __\$$fieldName; '
+      '@reflectable set $fieldName(int value) { '
+      '__\$$fieldName = notifyPropertyChange(#$fieldName, '
+      '__\$$fieldName, value); }';
+  return '''
+library ${className}_$fieldName;
+import 'package:observe/observe.dart';
+import 'package:polymer/polymer.dart';
+
+class $className extends ChangeNotifier {
+  $fieldReplacement
+  $className($fieldName) : __\$$fieldName = $fieldName;
+}
+
+@CustomTag('x-$className')
+class X${className} extends PolymerElement {
+  X${className}.created() : super.created();
+}
+@initMethod m_$fieldName() {}
+''';
+}
diff --git a/pkg/polymer/test/build/code_extractor.dart b/pkg/polymer/test/build/code_extractor.dart
index a375ff0..beeafcb 100644
--- a/pkg/polymer/test/build/code_extractor.dart
+++ b/pkg/polymer/test/build/code_extractor.dart
@@ -24,7 +24,20 @@
           '</body></html>',
 
       'a|web/test.html.0.dart':
-          'library a.web.test_html;\nmain() { }',
+          'library a.web.test_html_0;\nmain() { }',
+    });
+
+  testPhases('component script, no library in script', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '<script type="application/dart;component=1">main() { }</script>',
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head></head><body>'
+          '</body></html>',
+
+      'a|web/test.html.0.dart':
+          'library a.web.test_html_0;\nmain() { }',
     });
 
   testPhases('single script, with library', phases, {
@@ -44,14 +57,18 @@
   testPhases('under lib/ directory not transformed', phases, {
       'a|lib/test.html':
           '<!DOCTYPE html><html><head>'
-          '<script type="application/dart">library f;\nmain() { }</script>',
+          '<script type="application/dart">library f;\nmain() { }</script>'
+          '<script type="application/dart;component=1">'
+          'library g;\nmain() { }</script>',
     }, {
       'a|lib/test.html':
           '<!DOCTYPE html><html><head>'
           '<script type="application/dart">library f;\nmain() { }</script>'
+          '<script type="application/dart;component=1">'
+          'library g;\nmain() { }</script>',
     });
 
-  testPhases('multiple scripts - only emit first', phases, {
+  testPhases('multiple scripts allowed', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '<script type="application/dart">library a1;\nmain1() { }</script>'
@@ -60,10 +77,33 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body>'
           '<script type="application/dart" src="test.html.0.dart"></script>'
+          '<script type="application/dart" src="test.html.1.dart"></script>'
           '</body></html>',
 
       'a|web/test.html.0.dart':
           'library a1;\nmain1() { }',
+      'a|web/test.html.1.dart':
+          'library a2;\nmain2() { }',
+    });
+
+  testPhases('component scripts removed', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '<script type="application/dart;component=1">'
+          'library a1;\nmain1() { }</script>'
+          '<script type="application/dart;component=1">'
+          'library a2;\nmain2() { }</script>',
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head></head><body>'
+          '</body></html>',
+      'a|web/test.html.scriptUrls': JSON.encode([
+          ["a", "web/test.html.0.dart"],
+          ["a", "web/test.html.1.dart"]]),
+      'a|web/test.html.0.dart':
+          'library a1;\nmain1() { }',
+      'a|web/test.html.1.dart':
+          'library a2;\nmain2() { }',
     });
 
   testPhases('multiple deeper scripts', phases, {
@@ -80,11 +120,18 @@
           '<!DOCTYPE html><html><head>'
           '</head><body>'
           '<script type="application/dart" src="test.html.0.dart"></script>'
-          '<div></div><div><div>'
+          '<div>'
+          '<script type="application/dart" src="test.html.1.dart"></script>'
+          '</div><div><div>'
+          '<script type="application/dart" src="test.html.2.dart"></script>'
           '</div></div></body></html>',
 
       'a|web/test.html.0.dart':
-          'library a.web.test_html;\nmain1() { }',
+          'library a.web.test_html_0;\nmain1() { }',
+      'a|web/test.html.1.dart':
+          'library a.web.test_html_1;\nmain2() { }',
+      'a|web/test.html.2.dart':
+          'library a.web.test_html_2;\nmain3() { }',
     });
 
   testPhases('multiple imported scripts', phases, {
@@ -94,13 +141,13 @@
           '<link rel="import" href="packages/a/foo/test.html">'
           '<link rel="import" href="packages/b/test.html">',
       'a|web/test2.html':
-          '<script type="application/dart">main1() { }',
+          '<script type="application/dart;component=1">main1() { }',
       'a|web/bar/test.html':
-          '<script type="application/dart">main2() { }',
+          '<script type="application/dart;component=1">main2() { }',
       'a|lib/foo/test.html':
-          '<script type="application/dart">main3() { }',
+          '<script type="application/dart;component=1">main3() { }',
       'b|lib/test.html':
-          '<script type="application/dart">main4() { }'
+          '<script type="application/dart;component=1">main4() { }'
     }, {
       'a|web/test.html':
           '<html><head></head><body></body></html>',
@@ -110,10 +157,10 @@
         ["a", "web/test.html.2.dart"],
         ["a", "web/test.html.3.dart"],
       ]),
-      'a|web/test.html.0.dart': 'library a.web.test2_html;\nmain1() { }',
-      'a|web/test.html.1.dart': 'library a.web.bar.test_html;\nmain2() { }',
-      'a|web/test.html.2.dart': 'library a.foo.test_html;\nmain3() { }',
-      'a|web/test.html.3.dart': 'library b.test_html;\nmain4() { }'
+      '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_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() { }'
     });
 
   group('fixes import/export/part URIs', dartUriTests);
@@ -137,10 +184,12 @@
         '</body></html>',
     }, {
       'a|web/test.html':
-          '<!DOCTYPE html><html><head></head><body></body></html>',
-      'a|web/test.html.scriptUrls': '[["a","web/test.html.0.dart"]]',
+          '<!DOCTYPE html><html><head></head><body>'
+          '<script type="application/dart" src="test.html.0.dart"></script>'
+          '</body></html>',
+      'a|web/test.html.scriptUrls': '[]',
       'a|web/test.html.0.dart':
-          "library a.web.test2.foo_html;\n"
+          "library a.web.test2.foo_html_0;\n"
           "import 'package:qux/qux.dart';"
           "import 'test2/foo.dart';"
           "export 'test2/bar.dart';"
@@ -151,7 +200,42 @@
           '</body></html>',
       'a|web/test2/foo.html.scriptUrls': '[]',
       'a|web/test2/foo.html.0.dart':
-          "library a.web.test2.foo_html;\n"
+          "library a.web.test2.foo_html_0;\n"
+          "import 'package:qux/qux.dart';"
+          "import 'foo.dart';"
+          "export 'bar.dart';"
+          "part 'baz.dart';",
+    });
+
+  testPhases('from web folder, component', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '<link rel="import" href="test2/foo.html">'
+          '</head><body></body></html>',
+      'a|web/test2/foo.html':
+        '<!DOCTYPE html><html><head></head><body>'
+        '<script type="application/dart;component=1">'
+        "import 'package:qux/qux.dart';"
+        "import 'foo.dart';"
+        "export 'bar.dart';"
+        "part 'baz.dart';"
+        '</script>'
+        '</body></html>',
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head></head><body></body></html>',
+      'a|web/test.html.scriptUrls': '[["a","web/test.html.0.dart"]]',
+      'a|web/test.html.0.dart':
+          "library a.web.test2.foo_html_0;\n"
+          "import 'package:qux/qux.dart';"
+          "import 'test2/foo.dart';"
+          "export 'test2/bar.dart';"
+          "part 'test2/baz.dart';",
+      'a|web/test2/foo.html':
+          '<!DOCTYPE html><html><head></head><body></body></html>',
+      'a|web/test2/foo.html.scriptUrls': '[["a","web/test2/foo.html.0.dart"]]',
+      'a|web/test2/foo.html.0.dart':
+          "library a.web.test2.foo_html_0;\n"
           "import 'package:qux/qux.dart';"
           "import 'foo.dart';"
           "export 'bar.dart';"
@@ -165,7 +249,7 @@
           '</head><body></body></html>',
       'a|lib/test2/foo.html':
         '<!DOCTYPE html><html><head></head><body>'
-        '<script type="application/dart">'
+        '<script type="application/dart;component=1">'
         "import 'package:qux/qux.dart';"
         "import 'foo.dart';"
         "export 'bar.dart';"
@@ -177,14 +261,14 @@
           '<!DOCTYPE html><html><head></head><body></body></html>',
       'a|web/test.html.scriptUrls': '[["a","web/test.html.0.dart"]]',
       'a|web/test.html.0.dart':
-          "library a.test2.foo_html;\n"
+          "library a.test2.foo_html_0;\n"
           "import 'package:qux/qux.dart';"
           "import 'package:a/test2/foo.dart';"
           "export 'package:a/test2/bar.dart';"
           "part 'package:a/test2/baz.dart';",
       'a|lib/test2/foo.html':
           '<!DOCTYPE html><html><head></head><body>'
-          '<script type="application/dart">'
+          '<script type="application/dart;component=1">'
           "import 'package:qux/qux.dart';"
           "import 'foo.dart';"
           "export 'bar.dart';"
@@ -200,7 +284,7 @@
           '</head><body></body></html>',
       'b|lib/test2/foo.html':
         '<!DOCTYPE html><html><head></head><body>'
-        '<script type="application/dart">'
+        '<script type="application/dart;component=1">'
         "import 'package:qux/qux.dart';"
         "import 'foo.dart';"
         "export 'bar.dart';"
@@ -212,14 +296,14 @@
           '<!DOCTYPE html><html><head></head><body></body></html>',
       'a|web/test.html.scriptUrls': '[["a","web/test.html.0.dart"]]',
       'a|web/test.html.0.dart':
-          "library b.test2.foo_html;\n"
+          "library b.test2.foo_html_0;\n"
           "import 'package:qux/qux.dart';"
           "import 'package:b/test2/foo.dart';"
           "export 'package:b/test2/bar.dart';"
           "part 'package:b/test2/baz.dart';",
       'b|lib/test2/foo.html':
           '<!DOCTYPE html><html><head></head><body>'
-          '<script type="application/dart">'
+          '<script type="application/dart;component=1">'
           "import 'package:qux/qux.dart';"
           "import 'foo.dart';"
           "export 'bar.dart';"
diff --git a/pkg/polymer/test/build/common.dart b/pkg/polymer/test/build/common.dart
index 91e6b11..17c254a 100644
--- a/pkg/polymer/test/build/common.dart
+++ b/pkg/polymer/test/build/common.dart
@@ -36,8 +36,11 @@
   var resultSubscription;
   var logSubscription;
 
-  Future<Asset> getAsset(AssetId id) =>
-      new Future.value(new Asset.fromString(id, files[idToString(id)]));
+  Future<Asset> getAsset(AssetId id) {
+    var content = files[idToString(id)];
+    if (content == null) fail('error: requested $id, but $id is not available');
+    return new Future.value(new Asset.fromString(id, content));
+  }
 
   TestHelper(List<List<Transformer>> transformers, Map<String, String> files,
       this.messages)
@@ -124,6 +127,10 @@
 testPhases(String testName, List<List<Transformer>> phases,
     Map<String, String> inputFiles, Map<String, String> expectedFiles,
     [List<String> expectedMessages, bool solo = false]) {
+
+  // Include mock versions of the polymer library that can be used to test
+  // resolver-based code generation.
+  POLYMER_MOCKS.forEach((file, contents) { inputFiles[file] = contents; });
   (solo ? solo_test : test)(testName, () {
     var helper = new TestHelper(phases, inputFiles, expectedMessages)..run();
     return helper.checkAll(expectedFiles).whenComplete(() => helper.tearDown());
@@ -134,6 +141,45 @@
     '<script src="packages/web_components/platform.js"></script>\n'
     '<script src="packages/web_components/dart_support.js"></script>\n';
 
-const INTEROP_TAG = '<script src="packages/browser/interop.js"></script>\n';
 const DART_JS_TAG = '<script src="packages/browser/dart.js"></script>';
 
+const POLYMER_MOCKS = const {
+  'polymer|lib/polymer.html': '<!DOCTYPE html><html></html>',
+  'polymer|lib/polymer.dart':
+      'library polymer;\n'
+      'import "dart:html";\n'
+      'export "package:observe/observe.dart";\n' // for @observable
+      'part "src/loader.dart";\n'  // for @CustomTag and @initMethod
+      'part "src/instance.dart";\n', // for @published and @ObserveProperty
+
+  'polymer|lib/src/loader.dart':
+      'part of polymer;\n'
+      'class CustomTag {\n'
+      '  final String tagName;\n'
+      '  const CustomTag(this.tagName);'
+      '}\n'
+      'class InitMethodAnnotation { const InitMethodAnnotation(); }\n'
+      'const initMethod = const InitMethodAnnotation();\n',
+
+  'polymer|lib/src/instance.dart':
+      'part of polymer;\n'
+      'class PublishedProperty { const PublishedProperty(); }\n'
+      'const published = const PublishedProperty();\n'
+      'class ObserveProperty { const ObserveProperty(); }\n'
+      'abstract class Polymer {}\n'
+      'class PolymerElement extends HtmlElement with Polymer {}\n',
+
+  'polymer|lib/init.dart':
+      'library polymer.init;\n'
+      'import "package:polymer/polymer.dart";\n'
+      'main() {};\n',
+
+  'observe|lib/observe.dart':
+      'library observe;\n'
+      'export "src/metadata.dart";',
+
+  'observe|lib/src/metadata.dart':
+      'library observe.src.metadata;\n'
+      'class ObservableProperty { const ObservableProperty(); }\n'
+      'const observable = const ObservableProperty();\n',
+};
diff --git a/pkg/polymer/test/build/import_inliner_test.dart b/pkg/polymer/test/build/import_inliner_test.dart
index 7db7e4f..8741ac1 100644
--- a/pkg/polymer/test/build/import_inliner_test.dart
+++ b/pkg/polymer/test/build/import_inliner_test.dart
@@ -98,6 +98,37 @@
           '<script type="text/javascript">/*first*/</script>'
           '<script src="second.js"></script>'
           '<link rel="import" href="test2.html">'
+          '<script>/*forth*/</script>'
+          '</head></html>',
+      'a|web/test2.html':
+          '<!DOCTYPE html><html><head><script>/*third*/</script>'
+          '</head><body><polymer-element>2</polymer-element></html>',
+      'a|web/second.js': '/*second*/'
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '</head><body>'
+          '<script type="text/javascript">/*first*/</script>'
+          '<script src="second.js"></script>'
+          '<script>/*third*/</script>'
+          '<polymer-element>2</polymer-element>'
+          '<script>/*forth*/</script>'
+          '</body></html>',
+      'a|web/test.html.scriptUrls': '[]',
+      'a|web/test2.html':
+          '<!DOCTYPE html><html><head><script>/*third*/</script>'
+          '</head><body><polymer-element>2</polymer-element></html>',
+      'a|web/test2.html.scriptUrls': '[]',
+      'a|web/second.js': '/*second*/'
+    });
+
+  testPhases('preserves order of scripts, including Dart scripts', phases,
+    {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '<script type="text/javascript">/*first*/</script>'
+          '<script src="second.js"></script>'
+          '<link rel="import" href="test2.html">'
           '<script type="application/dart">/*forth*/</script>'
           '</head></html>',
       'a|web/test2.html':
@@ -115,7 +146,41 @@
           '<script type="application/dart" src="test.html.0.dart"></script>'
           '</body></html>',
       'a|web/test.html.scriptUrls': '[]',
-      'a|web/test.html.0.dart': 'library a.web.test_html;\n/*forth*/',
+      'a|web/test.html.0.dart': 'library a.web.test_html_0;\n/*forth*/',
+      'a|web/test2.html':
+          '<!DOCTYPE html><html><head><script>/*third*/</script>'
+          '</head><body><polymer-element>2</polymer-element></html>',
+      'a|web/test2.html.scriptUrls': '[]',
+      'a|web/second.js': '/*second*/'
+    });
+
+  testPhases('preserves order, extract component scripts', phases,
+    {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '<script type="text/javascript">/*first*/</script>'
+          '<script src="second.js"></script>'
+          '<link rel="import" href="test2.html">'
+          '<script type="application/dart;component=1">/*forth*/</script>'
+          '<script type="application/dart;component=1">/*fifth*/</script>'
+          '</head></html>',
+      'a|web/test2.html':
+          '<!DOCTYPE html><html><head><script>/*third*/</script>'
+          '</head><body><polymer-element>2</polymer-element></html>',
+      'a|web/second.js': '/*second*/'
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '</head><body>'
+          '<script type="text/javascript">/*first*/</script>'
+          '<script src="second.js"></script>'
+          '<script>/*third*/</script>'
+          '<polymer-element>2</polymer-element>'
+          '</body></html>',
+      'a|web/test.html.scriptUrls':
+          '[["a","web/test.html.0.dart"],["a","web/test.html.1.dart"]]',
+      'a|web/test.html.0.dart': 'library a.web.test_html_0;\n/*forth*/',
+      'a|web/test.html.1.dart': 'library a.web.test_html_1;\n/*fifth*/',
       'a|web/test2.html':
           '<!DOCTYPE html><html><head><script>/*third*/</script>'
           '</head><body><polymer-element>2</polymer-element></html>',
@@ -369,8 +434,54 @@
       'a|web/test_2.html':
           '<!DOCTYPE html><html><head>'
           '<link rel="import" href="test_1.html">'
-          '</head><body><polymer-element>2'
+          '</head><body><polymer-element>2</polymer-element>'
+          '<script type="application/dart" src="s2.dart"></script></html>',
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '</head><body>'
+          '<polymer-element>2</polymer-element>'
           '<script type="application/dart" src="s2.dart"></script>'
+          '<polymer-element>1</polymer-element>'
+          '<script type="application/dart" src="s1.dart"></script>'
+          '</body></html>',
+      'a|web/test.html.scriptUrls': '[]',
+      'a|web/test_1.html':
+          '<!DOCTYPE html><html><head>'
+          '</head><body>'
+          '<polymer-element>2</polymer-element>'
+          '<script type="application/dart" src="s2.dart"></script>'
+          '<polymer-element>1</polymer-element>'
+          '<script type="application/dart" src="s1.dart"></script>'
+          '</body></html>',
+      'a|web/test_1.html.scriptUrls': '[]',
+      'a|web/test_2.html':
+          '<!DOCTYPE html><html><head>'
+          '</head><body>'
+          '<polymer-element>1</polymer-element>'
+          '<script type="application/dart" src="s1.dart"></script>'
+          '<polymer-element>2</polymer-element>'
+          '<script type="application/dart" src="s2.dart"></script>'
+          '</body></html>',
+      'a|web/test_2.html.scriptUrls': '[]',
+    });
+
+  testPhases('imports cycle, 1-step lasso, Dart components scripts', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '<link rel="import" href="test_1.html">'
+          '</head></html>',
+      'a|web/test_1.html':
+          '<!DOCTYPE html><html><head>'
+          '<link rel="import" href="test_2.html">'
+          '</head><body><polymer-element>1</polymer-element>'
+          '<script type="application/dart;component=1" src="s1.dart">'
+          '</script></html>',
+      'a|web/test_2.html':
+          '<!DOCTYPE html><html><head>'
+          '<link rel="import" href="test_1.html">'
+          '</head><body><polymer-element>2'
+          '<script type="application/dart;component=1" src="s2.dart"></script>'
           '</polymer-element>'
           '</html>',
     }, {
@@ -386,20 +497,17 @@
           '</head><body>'
           '<polymer-element>2</polymer-element>'
           '<polymer-element>1</polymer-element>'
-          '<script type="application/dart" src="s1.dart"></script>'
           '</body></html>',
       'a|web/test_1.html.scriptUrls':
-          '[["a","web/s2.dart"]]',
+          '[["a","web/s2.dart"],["a","web/s1.dart"]]',
       'a|web/test_2.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
           '<polymer-element>1</polymer-element>'
-          '<polymer-element>2'
-          '<script type="application/dart" src="s2.dart"></script>'
-          '</polymer-element>'
+          '<polymer-element>2</polymer-element>'
           '</body></html>',
       'a|web/test_2.html.scriptUrls':
-          '[["a","web/s1.dart"]]',
+          '[["a","web/s1.dart"],["a","web/s2.dart"]]',
     });
 
   testPhases('imports with Dart script after JS script', phases, {
@@ -414,7 +522,7 @@
           '<foo>42</foo><bar-baz></bar-baz>'
           '<polymer-element>1'
           '<script src="s1.js"></script>'
-          '<script type="application/dart" src="s1.dart"></script>'
+          '<script type="application/dart;component=1" src="s1.dart"></script>'
           '</polymer-element>'
           'FOO</body></html>',
     }, {
@@ -433,10 +541,9 @@
           '<foo>42</foo><bar-baz></bar-baz>'
           '<polymer-element>1'
           '<script src="s1.js"></script>'
-          '<script type="application/dart" src="s1.dart"></script>'
           '</polymer-element>'
           'FOO</body></html>',
-      'a|web/test_1.html.scriptUrls': '[]',
+      'a|web/test_1.html.scriptUrls': '[["a","web/s1.dart"]]',
     });
 
   testPhases('imports cycle, 2-step lasso', phases, {
diff --git a/pkg/polymer/test/build/linter_test.dart b/pkg/polymer/test/build/linter_test.dart
index e302915..341e238 100644
--- a/pkg/polymer/test/build/linter_test.dart
+++ b/pkg/polymer/test/build/linter_test.dart
@@ -6,30 +6,29 @@
 
 import 'package:polymer/src/build/common.dart';
 import 'package:polymer/src/build/linter.dart';
-import 'package:unittest/compact_vm_config.dart';
 import 'package:unittest/unittest.dart';
 
 import 'common.dart';
 
 void main() {
-  useCompactVMConfiguration();
   _testLinter('nothing to report', {
       'a|lib/test.html': '<!DOCTYPE html><html></html>',
     }, []);
 
-  group('must have Dart code to invoke initPolymer, dart.js, not boot.js', () {
+  group('must have import to polymer.html', () {
     _testLinter('nothing to report', {
         'a|web/test.html': '<!DOCTYPE html><html>'
+            '<link rel="import" href="packages/polymer/polymer.html">'
             '<script type="application/dart" src="foo.dart">'
             '</script>'
             '<script src="packages/browser/dart.js"></script>'
             '</html>',
       }, []);
 
-    _testLinter('missing Dart code and dart.js', {
+    _testLinter('missing everything', {
         'a|web/test.html': '<!DOCTYPE html><html></html>',
       }, [
-        'error: $USE_INIT_DART',
+        'warning: $USE_POLYMER_HTML',
       ]);
 
     _testLinter('using deprecated boot.js', {
@@ -40,36 +39,23 @@
             '<script src="packages/browser/dart.js"></script>'
             '</html>',
       }, [
-        'warning: $BOOT_JS_DEPRECATED (web/test.html 1 0)',
+        'warning: $USE_POLYMER_HTML',
       ]);
   });
-  group('single script tag per document', () {
+  group('multiple script tag per document allowed', () {
     _testLinter('two top-level tags', {
         'a|web/test.html': '<!DOCTYPE html><html>'
+            '<link rel="import" href="packages/polymer/polymer.html">'
             '<script type="application/dart" src="a.dart">'
             '</script>\n'
             '<script type="application/dart" src="b.dart">'
             '</script>'
             '<script src="packages/browser/dart.js"></script>'
-      }, [
-        'warning: Only one "application/dart" script tag per document is'
-        ' allowed. (web/test.html 1 0)',
-      ]);
-
-    _testLinter('two top-level tags, non entrypoint', {
-        'a|lib/test.html': '<!DOCTYPE html><html>'
-            '<script type="application/dart" src="a.dart">'
-            '</script>\n'
-            '<script type="application/dart" src="b.dart">'
-            '</script>'
-            '<script src="packages/browser/dart.js"></script>'
-      }, [
-        'warning: Only one "application/dart" script tag per document is'
-        ' allowed. (lib/test.html 1 0)',
-      ]);
+      }, []);
 
     _testLinter('tags inside elements', {
         'a|web/test.html': '<!DOCTYPE html><html>'
+            '<link rel="import" href="packages/polymer/polymer.html">'
             '<polymer-element name="x-a">'
             '<script type="application/dart" src="a.dart">'
             '</script>'
@@ -77,10 +63,7 @@
             '<script type="application/dart" src="b.dart">'
             '</script>'
             '<script src="packages/browser/dart.js"></script>'
-      }, [
-        'warning: Only one "application/dart" script tag per document is'
-        ' allowed. (web/test.html 1 0)',
-      ]);
+      }, []);
   });
 
   group('doctype warning', () {
@@ -89,7 +72,7 @@
       }, [
         'warning: Unexpected start tag (html). Expected DOCTYPE. '
         '(web/test.html 0 0)',
-        'error: $USE_INIT_DART',
+        'warning: $USE_POLYMER_HTML',
       ]);
 
     _testLinter('in lib', {
@@ -227,8 +210,8 @@
             <script src="foo.dart"></script>
             </html>'''.replaceAll('            ', ''),
       }, [
-        'warning: Wrong script type, expected type="application/dart".'
-        ' (lib/test.html 1 0)'
+        'warning: Wrong script type, expected type="application/dart" or'
+        ' type="application/dart;component=1". (lib/test.html 1 0)'
       ]);
 
     _testLinter('in polymer-element, .dart url', {
@@ -238,8 +221,8 @@
             </polymer-element>
             </html>'''.replaceAll('            ', ''),
       }, [
-        'warning: Wrong script type, expected type="application/dart".'
-        ' (lib/test.html 2 0)'
+        'warning: Wrong script type, expected type="application/dart" or'
+        ' type="application/dart;component=1". (lib/test.html 2 0)'
       ]);
 
     _testLinter('in polymer-element, .js url', {
@@ -457,11 +440,12 @@
     }, []);
 }
 
-_testLinter(String name, Map inputFiles, List outputMessages) {
+_testLinter(String name, Map inputFiles, List outputMessages,
+    [bool solo = false]) {
   var linter = new Linter(new TransformOptions());
   var outputFiles = {};
   if (outputMessages.every((m) => m.startsWith('warning:'))) {
     inputFiles.forEach((k, v) => outputFiles[k] = v);
   }
-  testPhases(name, [[linter]], inputFiles, outputFiles, outputMessages);
+  testPhases(name, [[linter]], inputFiles, outputFiles, outputMessages, solo);
 }
diff --git a/pkg/polymer/test/build/polyfill_injector_test.dart b/pkg/polymer/test/build/polyfill_injector_test.dart
index 7e0f95e..4b5dbf6 100644
--- a/pkg/polymer/test/build/polyfill_injector_test.dart
+++ b/pkg/polymer/test/build/polyfill_injector_test.dart
@@ -51,7 +51,7 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '$WEB_COMPONENTS_TAG$INTEROP_TAG'
+          '$WEB_COMPONENTS_TAG'
           '</head><body>'
           '<script ${type}src="a.dart$ext"></script>'
           '$dartJsTag'
@@ -62,7 +62,6 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '$WEB_COMPONENTS_TAG'
-          '$INTEROP_TAG'
           '</head><body>'
           '<script type="application/dart" src="a.dart"></script>'
           '$dartJsTag'
@@ -70,7 +69,6 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '$WEB_COMPONENTS_TAG'
-          '$INTEROP_TAG'
           '</head><body>'
           '<script ${type}src="a.dart$ext"></script>'
           '$dartJsTag'
diff --git a/pkg/polymer/test/build/script_compactor_test.dart b/pkg/polymer/test/build/script_compactor_test.dart
index 2d32a74..862ceb3 100644
--- a/pkg/polymer/test/build/script_compactor_test.dart
+++ b/pkg/polymer/test/build/script_compactor_test.dart
@@ -4,16 +4,24 @@
 
 library polymer.test.build.script_compactor_test;
 
+import 'package:code_transformers/tests.dart' show testingDartSdkDirectory;
 import 'package:polymer/src/build/common.dart';
 import 'package:polymer/src/build/script_compactor.dart';
+import 'package:smoke/codegen/generator.dart' show DEFAULT_IMPORTS;
 import 'package:unittest/compact_vm_config.dart';
+import 'package:unittest/unittest.dart';
 
 import 'common.dart';
 
 void main() {
   useCompactVMConfiguration();
-  var phases = [[new ScriptCompactor(new TransformOptions())]];
+  var phases = [[new ScriptCompactor(new TransformOptions(),
+      sdkDir: testingDartSdkDirectory)]];
+  group('initializers', () => initializerTests(phases));
+  group('codegen', () => codegenTests(phases));
+}
 
+initializerTests(phases) {
   testPhases('no changes', phases, {
       'a|web/test.html': '<!DOCTYPE html><html></html>',
       'a|web/test.html.scriptUrls': '[]',
@@ -23,55 +31,161 @@
 
   testPhases('no changes outside web/', phases, {
       'a|lib/test.html':
-          '<!DOCTYPE html><html><head>'
-          '<script type="application/dart" src="a.dart"></script>',
+          '<!DOCTYPE html><html><head>',
+      'a|lib/test.html.scriptUrls': '[["a","lib/a.dart"]]',
     }, {
       'a|lib/test.html':
-          '<!DOCTYPE html><html><head>'
-          '<script type="application/dart" src="a.dart"></script>',
+          '<!DOCTYPE html><html><head>',
+      'a|lib/test.html.scriptUrls': '[["a","lib/a.dart"]]',
     });
 
   testPhases('single script', phases, {
       'a|web/test.html':
-          '<!DOCTYPE html><html><head>'
-          '<script type="application/dart" src="a.dart"></script>',
-      'a|web/test.html.scriptUrls': '[]',
-      'a|web/a.dart': 'library a;\nmain(){}',
+          '<!DOCTYPE html><html><head>',
+      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          '@initMethod main(){}',
     }, {
       'a|web/test.html':
-          '<!DOCTYPE html><html><head>'
+          '<!DOCTYPE html><html><head></head><body>'
           '<script type="application/dart" '
           'src="test.html_bootstrap.dart"></script>'
-          '</head><body></body></html>',
+          '</body></html>',
 
       'a|web/test.html_bootstrap.dart':
           '''$MAIN_HEADER
           import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
 
           void main() {
-            configureForDeployment([
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false));
+            startPolymer([
+                i0.main,
               ]);
-            i0.main();
           }
           '''.replaceAll('\n          ', '\n'),
-      'a|web/a.dart': 'library a;\nmain(){}',
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          '@initMethod main(){}',
     });
 
+  testPhases('simple initialization', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>',
+      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          '@CustomTag("x-foo")\n'
+          'class XFoo extends PolymerElement {\n'
+          '}\n'
+          '@initMethod main(){}',
+    }, {
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'a.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                parents: {
+                  smoke_0.XFoo: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XFoo: const {},
+                }));
+            startPolymer([
+                i0.main,
+                () => Polymer.register(\'x-foo\', i0.XFoo),
+              ]);
+          }
+          '''.replaceAll('\n          ', '\n'),
+    });
+  
+  testPhases('use const expressions', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>',
+      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/b.dart':
+          'library a;\n'
+          'const x = "x";\n',
+      'a|web/c.dart':
+          'part of a;\n'
+          'const dash = "-";\n',
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          'import "b.dart";\n'
+          'part "c.dart";\n'
+          'const letterO = "o";\n'
+          '@CustomTag("\$x\${dash}f\${letterO}o2")\n'
+          'class XFoo extends PolymerElement {\n'
+          '}\n',
+    }, {
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'a.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                parents: {
+                  smoke_0.XFoo: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XFoo: const {},
+                }));
+            startPolymer([
+                () => Polymer.register(\'x-foo2\', i0.XFoo),
+              ]);
+          }
+          '''.replaceAll('\n          ', '\n'),
+    });
+
+  testPhases('invalid const expression', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>',
+      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          '@CustomTag("\${x}-foo")\n' // invalid, x is not defined
+          'class XFoo extends PolymerElement {\n'
+          '}\n'
+          'main(){}',
+    }, {}, [
+      'warning: The parameter to @CustomTag seems to be invalid. '
+      '(web/a.dart 2 11)',
+    ]);
+
   testPhases('several scripts', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '</head><body><div>'
-          '<script type="application/dart" src="d.dart"></script>'
-          '</div>',
+          '</head><body><div></div>',
       'a|web/test.html.scriptUrls':
-          '[["a", "web/a.dart"],["a", "web/b.dart"],["a", "web/c.dart"]]',
-      'a|web/d.dart': 'library d;\nmain(){}\n@initMethod mD(){}',
+          '[["a", "web/a.dart"],["a", "web/b.dart"],["a", "web/c.dart"],'
+          '["a", "web/d.dart"]]',
+      'a|web/d.dart':
+          'library d;\n'
+          'import "package:polymer/polymer.dart";\n'
+          '@initMethod main(){}\n@initMethod mD(){}',
 
       'a|web/a.dart':
           'import "package:polymer/polymer.dart";\n'
           '@initMethod mA(){}\n',
 
       'a|web/b.dart':
+          'import "package:polymer/polymer.dart";\n'
           'export "e.dart";\n'
           'export "f.dart" show XF1, mF1;\n'
           'export "g.dart" hide XG1, mG1;\n'
@@ -80,43 +194,42 @@
 
       'a|web/c.dart':
           'import "package:polymer/polymer.dart";\n'
-          'part "c_part.dart"\n'
-          '@CustomTag("x-c2") class XC2 {}\n',
+          'part "c_part.dart";\n'
+          '@CustomTag("x-c1") class XC1 extends PolymerElement {}\n',
 
       'a|web/c_part.dart':
-          '@CustomTag("x-c1") class XC1 {}\n',
+          '@CustomTag("x-c2") class XC2 extends PolymerElement {}\n',
 
       'a|web/e.dart':
           'import "package:polymer/polymer.dart";\n'
-          '@CustomTag("x-e") class XE {}\n'
+          '@CustomTag("x-e") class XE extends PolymerElement {}\n'
           '@initMethod mE(){}\n',
 
       'a|web/f.dart':
           'import "package:polymer/polymer.dart";\n'
-          '@CustomTag("x-f1") class XF1 {}\n'
+          '@CustomTag("x-f1") class XF1 extends PolymerElement {}\n'
           '@initMethod mF1(){}\n'
-          '@CustomTag("x-f2") class XF2 {}\n'
+          '@CustomTag("x-f2") class XF2 extends PolymerElement {}\n'
           '@initMethod mF2(){}\n',
 
       'a|web/g.dart':
           'import "package:polymer/polymer.dart";\n'
-          '@CustomTag("x-g1") class XG1 {}\n'
+          '@CustomTag("x-g1") class XG1 extends PolymerElement {}\n'
           '@initMethod mG1(){}\n'
-          '@CustomTag("x-g2") class XG2 {}\n'
+          '@CustomTag("x-g2") class XG2 extends PolymerElement {}\n'
           '@initMethod mG2(){}\n',
 
       'a|web/h.dart':
           'import "package:polymer/polymer.dart";\n'
-          '@CustomTag("x-h1") class XH1 {}\n'
+          '@CustomTag("x-h1") class XH1 extends PolymerElement {}\n'
           '@initMethod mH1(){}\n'
-          '@CustomTag("x-h2") class XH2 {}\n'
+          '@CustomTag("x-h2") class XH2 extends PolymerElement {}\n'
           '@initMethod mH2(){}\n',
     }, {
       'a|web/test.html':
-          '<!DOCTYPE html><html><head></head><body><div>'
+          '<!DOCTYPE html><html><head></head><body><div></div>'
           '<script type="application/dart" src="test.html_bootstrap.dart">'
           '</script>'
-          '</div>'
           '</body></html>',
 
       'a|web/test.html_bootstrap.dart':
@@ -125,23 +238,363 @@
           import 'b.dart' as i1;
           import 'c.dart' as i2;
           import 'd.dart' as i3;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'e.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+          import 'f.dart' as smoke_2;
+          import 'g.dart' as smoke_3;
+          import 'h.dart' as smoke_4;
+          import 'c.dart' as smoke_5;
 
           void main() {
-            configureForDeployment([
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                parents: {
+                  smoke_5.XC1: smoke_1.PolymerElement,
+                  smoke_5.XC2: smoke_1.PolymerElement,
+                  smoke_0.XE: smoke_1.PolymerElement,
+                  smoke_2.XF1: smoke_1.PolymerElement,
+                  smoke_3.XG2: smoke_1.PolymerElement,
+                  smoke_4.XH1: smoke_1.PolymerElement,
+                }, 
+                declarations: {
+                  smoke_5.XC1: const {},
+                  smoke_5.XC2: const {},
+                  smoke_0.XE: const {},
+                  smoke_2.XF1: const {},
+                  smoke_3.XG2: const {},
+                  smoke_4.XH1: const {},
+                }));
+            startPolymer([
                 i0.mA,
-                () => Polymer.register('x-e', i1.XE),
-                i1.mE,
-                () => Polymer.register('x-f1', i1.XF1),
-                i1.mF1,
-                () => Polymer.register('x-g2', i1.XG2),
-                i1.mG2,
-                () => Polymer.register('x-h1', i1.XH1),
                 i1.mB,
+                i1.mE,
+                i1.mF1,
+                i1.mG2,
+                () => Polymer.register('x-e', i1.XE),
+                () => Polymer.register('x-f1', i1.XF1),
+                () => Polymer.register('x-g2', i1.XG2),
+                () => Polymer.register('x-h1', i1.XH1),
                 () => Polymer.register('x-c1', i2.XC1),
                 () => Polymer.register('x-c2', i2.XC2),
+                i3.main,
                 i3.mD,
               ]);
-            i3.main();
+          }
+          '''.replaceAll('\n          ', '\n'),
+    }, null);
+}
+
+codegenTests(phases) {
+  testPhases('bindings', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><body>'
+          '<polymer-element name="foo-bar"><template>'
+          '<div>{{a.node}}</div>'
+          '<div>{{anotherNode}}</div>'
+          '<div class="{{an.attribute}}"></div>'
+          '<a href="path/{{within.an.attribute}}/foo/bar"></a>'
+          '<div data-attribute="{{anotherAttribute}}"></div>'
+          // input and custom-element attributes are treated as 2-way bindings:
+          '<input value="{{this.is.twoWay}}">'
+          '<input value="{{this.is.twoWayInt | intToStringTransformer}}">'
+          '<something-else my-attribute="{{here.too}}"></something-else>'
+          '<div on-click="{{methodName}}"></div>'
+          '<div on-click="{{@read.method}}"></div>'
+          '</template></polymer-element>',
+      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          '@initMethod main(){}',
+    }, {
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                getters: {
+                  #a: (o) => o.a,
+                  #an: (o) => o.an,
+                  #anotherAttribute: (o) => o.anotherAttribute,
+                  #anotherNode: (o) => o.anotherNode,
+                  #attribute: (o) => o.attribute,
+                  #here: (o) => o.here,
+                  #intToStringTransformer: (o) => o.intToStringTransformer,
+                  #is: (o) => o.is,
+                  #method: (o) => o.method,
+                  #methodName: (o) => o.methodName,
+                  #node: (o) => o.node,
+                  #read: (o) => o.read,
+                  #too: (o) => o.too,
+                  #twoWay: (o) => o.twoWay,
+                  #twoWayInt: (o) => o.twoWayInt,
+                  #within: (o) => o.within,
+                },
+                setters: {
+                  #too: (o, v) { o.too = v; },
+                  #twoWay: (o, v) { o.twoWay = v; },
+                  #twoWayInt: (o, v) { o.twoWayInt = v; },
+                },
+                names: {
+                  #a: r'a',
+                  #an: r'an',
+                  #anotherAttribute: r'anotherAttribute',
+                  #anotherNode: r'anotherNode',
+                  #attribute: r'attribute',
+                  #here: r'here',
+                  #intToStringTransformer: r'intToStringTransformer',
+                  #is: r'is',
+                  #method: r'method',
+                  #methodName: r'methodName',
+                  #node: r'node',
+                  #read: r'read',
+                  #too: r'too',
+                  #twoWay: r'twoWay',
+                  #twoWayInt: r'twoWayInt',
+                  #within: r'within',
+                }));
+            startPolymer([
+                i0.main,
+              ]);
+          }
+          '''.replaceAll('\n          ', '\n'),
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          '@initMethod main(){}',
+    });
+
+  final field1Details = "annotations: const [smoke_1.published]";
+  final field3Details = "isFinal: true, annotations: const [smoke_1.published]";
+  final prop1Details = "kind: PROPERTY, annotations: const [smoke_1.published]";
+  final prop3Details =
+      "kind: PROPERTY, isFinal: true, annotations: const [smoke_1.published]";
+  testPhases('published via annotation', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><body>',
+      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          '@CustomTag("x-foo")\n'
+          'class XFoo extends PolymerElement {\n'
+          '  @published int field1;\n'
+          '  int field2;\n'
+          '  @published final int field3;\n'
+          '  final int field4;\n'
+          '  @published int get prop1 => 1;\n'
+          '  set prop1(int x) {};\n'
+          '  int get prop2 => 2;\n'
+          '  set prop2(int x) {};\n'
+          '  @published int get prop3 => 3;\n'
+          '  int get prop4 => 4;\n'
+          '  @published int method1() => 1;\n'
+          '  int method2() => 2;\n'
+          '}\n',
+    }, {
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'a.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                getters: {
+                  #field1: (o) => o.field1,
+                  #field3: (o) => o.field3,
+                  #prop1: (o) => o.prop1,
+                  #prop3: (o) => o.prop3,
+                },
+                setters: {
+                  #field1: (o, v) { o.field1 = v; },
+                  #prop1: (o, v) { o.prop1 = v; },
+                },
+                parents: {
+                  smoke_0.XFoo: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XFoo: {
+                    #field1: const Declaration(#field1, int, $field1Details),
+                    #field3: const Declaration(#field3, int, $field3Details),
+                    #prop1: const Declaration(#prop1, int, $prop1Details),
+                    #prop3: const Declaration(#prop3, int, $prop3Details),
+                  },
+                },
+                names: {
+                  #field1: r'field1',
+                  #field3: r'field3',
+                  #prop1: r'prop1',
+                  #prop3: r'prop3',
+                }));
+            startPolymer([
+                () => Polymer.register(\'x-foo\', i0.XFoo),
+              ]);
+          }
+          '''.replaceAll('\n          ', '\n'),
+    });
+
+  testPhases('published via attributes', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><body>'
+          '<polymer-element name="x-foo" attributes="field1,prop2">'
+          '</polymer-element>',
+      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          '@CustomTag("x-foo")\n'
+          'class XFoo extends PolymerElement {\n'
+          '  int field1;\n'
+          '  int field2;\n'
+          '  int get prop1 => 1;\n'
+          '  set prop1(int x) {};\n'
+          '  int get prop2 => 2;\n'
+          '  set prop2(int x) {};\n'
+          '}\n',
+    }, {
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'a.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                getters: {
+                  #field1: (o) => o.field1,
+                  #prop2: (o) => o.prop2,
+                },
+                setters: {
+                  #field1: (o, v) { o.field1 = v; },
+                  #prop2: (o, v) { o.prop2 = v; },
+                },
+                parents: {
+                  smoke_0.XFoo: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XFoo: {
+                    #field1: const Declaration(#field1, int),
+                    #prop2: const Declaration(#prop2, int, kind: PROPERTY),
+                  },
+                },
+                names: {
+                  #field1: r'field1',
+                  #prop2: r'prop2',
+                }));
+            startPolymer([
+                () => Polymer.register(\'x-foo\', i0.XFoo),
+              ]);
+          }
+          '''.replaceAll('\n          ', '\n'),
+    });
+
+  final fooDetails =
+      "kind: METHOD, annotations: const [const smoke_1.ObserveProperty('x')]";
+  final xChangedDetails = "Function, kind: METHOD";
+  testPhases('ObserveProperty and *Changed methods', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><body>'
+          '</polymer-element>',
+      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          '@CustomTag("x-foo")\n'
+          'class XFoo extends PolymerElement {\n'
+          '  int x;\n'
+          '  void xChanged() {}\n'
+          '  void attributeChanged() {}\n' // should be excluded
+          '  @ObserveProperty("x")'
+          '  void foo() {}\n'
+          '}\n',
+    }, {
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'a.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                getters: {
+                  #foo: (o) => o.foo,
+                  #xChanged: (o) => o.xChanged,
+                },
+                parents: {
+                  smoke_0.XFoo: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XFoo: {
+                    #foo: const Declaration(#foo, Function, $fooDetails),
+                    #xChanged: const Declaration(#xChanged, $xChangedDetails),
+                  },
+                },
+                names: {
+                  #foo: r'foo',
+                  #xChanged: r'xChanged',
+                }));
+            startPolymer([
+                () => Polymer.register(\'x-foo\', i0.XFoo),
+              ]);
+          }
+          '''.replaceAll('\n          ', '\n'),
+    });
+
+  final rcDetails = "#registerCallback, Function, kind: METHOD, isStatic: true";
+  testPhases('register callback is included', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><body>'
+          '</polymer-element>',
+      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          '@CustomTag("x-foo")\n'
+          'class XFoo extends PolymerElement {\n'
+          '  static registerCallback() {};\n'
+          '  static foo() {};\n'
+          '}\n',
+    }, {
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'a.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                parents: {
+                  smoke_0.XFoo: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XFoo: {
+                    #registerCallback: const Declaration($rcDetails),
+                  },
+                },
+                staticMethods: {
+                  smoke_0.XFoo: {
+                    #registerCallback: smoke_0.XFoo.registerCallback,
+                  },
+                },
+                names: {
+                  #registerCallback: r'registerCallback',
+                }));
+            startPolymer([
+                () => Polymer.register(\'x-foo\', i0.XFoo),
+              ]);
           }
           '''.replaceAll('\n          ', '\n'),
     });
diff --git a/pkg/polymer/test/custom_event_test.dart b/pkg/polymer/test/custom_event_test.dart
index b584029..0b67e3e 100644
--- a/pkg/polymer/test/custom_event_test.dart
+++ b/pkg/polymer/test/custom_event_test.dart
@@ -42,8 +42,8 @@
   barBazHandler(e) => events.add(['barbaz', e]);
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/custom_event_test.html b/pkg/polymer/test/custom_event_test.html
index 1e071cf..db709b8 100644
--- a/pkg/polymer/test/custom_event_test.html
+++ b/pkg/polymer/test/custom_event_test.html
@@ -25,6 +25,7 @@
 
   <test-custom-event></test-custom-event>
 
-  <script type="application/dart" src="custom_event_test.dart"></script>
+  <script type="application/dart;component=1"
+          src="custom_event_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/entered_view_test.dart b/pkg/polymer/test/entered_view_test.dart
index 632ea70..afd6b2d 100644
--- a/pkg/polymer/test/entered_view_test.dart
+++ b/pkg/polymer/test/entered_view_test.dart
@@ -30,9 +30,8 @@
   }
 }
 
-main() => initPolymer().run(_tests);
-
-_tests() {
+@initMethod
+main() {
   useHtmlConfiguration();
   Polymer.register('x-inner', XInner);
   Polymer.register('x-outer', XOuter);
diff --git a/pkg/polymer/test/entered_view_test.html b/pkg/polymer/test/entered_view_test.html
index d9e937d..078556a 100644
--- a/pkg/polymer/test/entered_view_test.html
+++ b/pkg/polymer/test/entered_view_test.html
@@ -32,6 +32,7 @@
     outer element:
     <x-outer></x-outer>
 
-    <script type="application/dart" src="entered_view_test.dart"></script>
+    <script type="application/dart;component=1"
+            src="entered_view_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/event_handlers_test.dart b/pkg/polymer/test/event_handlers_test.dart
index 852d44d..0cbcfa0 100644
--- a/pkg/polymer/test/event_handlers_test.dart
+++ b/pkg/polymer/test/event_handlers_test.dart
@@ -89,27 +89,15 @@
 class MiniModel extends Observable {
   XTest _element;
   @observable final int index;
-  @reflectable Function itemTapAction;
-  _itemTapAction(e, d, n) {
+  @reflectable void itemTapAction(e, d, n) {
     _element._logEvent(e, 'mini-model callback $this');
     e.stopPropagation();
   }
-  MiniModel(this._element, this.index) {
-    // TODO(sigmund): remove this and reflect directly on the method. This is
-    // needed to work around bug 13002
-    itemTapAction = _itemTapAction;
-  }
+  MiniModel(this._element, this.index);
   String toString() => "<mini-model $index>";
 }
 
-main() {
-  Logger.root..level = Level.FINE
-      ..onRecord.listen((m) => print('${m.loggerName} ${m.message}'));
-
-  initPolymer();
-}
-
-@initMethod init() {
+@initMethod main() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/event_handlers_test.html b/pkg/polymer/test/event_handlers_test.html
index 94dc475..883b6be 100644
--- a/pkg/polymer/test/event_handlers_test.html
+++ b/pkg/polymer/test/event_handlers_test.html
@@ -54,7 +54,8 @@
         </div>
       </div>
     </template>
-    <script type="application/dart" src="event_handlers_test.dart"></script>
+    <script type="application/dart;component=1"
+            src="event_handlers_test.dart"></script>
   </polymer-element>
   </body>
 </html>
diff --git a/pkg/polymer/test/event_path_declarative_test.dart b/pkg/polymer/test/event_path_declarative_test.dart
index 9983d13..1d8c2d1 100644
--- a/pkg/polymer/test/event_path_declarative_test.dart
+++ b/pkg/polymer/test/event_path_declarative_test.dart
@@ -18,8 +18,6 @@
 var _observedEvents = [];
 var _testFired;
 
-main() => initPolymer();
-
 @reflectable
 class XZug extends PolymerElement {
 
@@ -79,7 +77,7 @@
   }
 }
 
-@initMethod init() {
+@initMethod main() {
   useHtmlConfiguration();
   // TODO(sigmund): switch back to use @CustomTag. We seem to be running into a
   // problem where using @CustomTag doesn't guarantee that we register the tags
diff --git a/pkg/polymer/test/event_path_declarative_test.html b/pkg/polymer/test/event_path_declarative_test.html
index 4fcc3d6..07cd086 100644
--- a/pkg/polymer/test/event_path_declarative_test.html
+++ b/pkg/polymer/test/event_path_declarative_test.html
@@ -71,6 +71,7 @@
       </template>
     </polymer-element>
 
-  <script type="application/dart" src="event_path_declarative_test.dart"></script>
+  <script type="application/dart;component=1"
+          src="event_path_declarative_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/event_path_test.dart b/pkg/polymer/test/event_path_test.dart
index 86978eb..ecf922f 100644
--- a/pkg/polymer/test/event_path_test.dart
+++ b/pkg/polymer/test/event_path_test.dart
@@ -9,28 +9,32 @@
 import 'package:unittest/html_config.dart';
 import 'package:unittest/unittest.dart';
 
-@CustomTag("x-selector")
 class XSelector extends PolymerElement {
   XSelector.created() : super.created();
 }
 
-@CustomTag("x-overlay")
 class XOverlay extends PolymerElement {
   XOverlay.created() : super.created();
 }
 
-@CustomTag("x-menu")
 class XMenu extends PolymerElement {
   XMenu.created() : super.created();
 }
 
-@CustomTag("x-menu-button")
 class XMenuButton extends PolymerElement {
   XMenuButton.created() : super.created();
 }
 
+@initMethod
 main() {
-  initPolymer();
+  // TODO(sigmund): use @CustomTag instead of Polymer.regsiter. A bug is making
+  // this code sensitive to the order in which we register elements (e.g. if
+  // x-menu is registered before x-selector). See dartbug.com/17926.
+  Polymer.register('x-selector', XSelector);
+  Polymer.register('x-overlay', XOverlay);
+  Polymer.register('x-menu', XMenu);
+  Polymer.register('x-menu-button', XMenuButton);
+
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/event_path_test.html b/pkg/polymer/test/event_path_test.html
index 0372815..400dc7d 100644
--- a/pkg/polymer/test/event_path_test.html
+++ b/pkg/polymer/test/event_path_test.html
@@ -62,6 +62,7 @@
   </x-menu-button>
 
 
-  <script type="application/dart" src="event_path_test.dart"></script>
+  <script type="application/dart;component=1"
+          src="event_path_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/events_test.dart b/pkg/polymer/test/events_test.dart
index a1c601a..b4d8ad7 100644
--- a/pkg/polymer/test/events_test.dart
+++ b/pkg/polymer/test/events_test.dart
@@ -44,8 +44,8 @@
   TestC.created() : super.created();
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/events_test.html b/pkg/polymer/test/events_test.html
index bfee540..2e64311 100644
--- a/pkg/polymer/test/events_test.html
+++ b/pkg/polymer/test/events_test.html
@@ -46,6 +46,6 @@
   <test-b id="b"></test-b>
   <test-c id="c"></test-c>
 
-  <script type="application/dart" src="events_test.dart"></script>
+  <script type="application/dart;component=1" src="events_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/instance_attrs_test.dart b/pkg/polymer/test/instance_attrs_test.dart
index f5b6eac..24f94cb 100644
--- a/pkg/polymer/test/instance_attrs_test.dart
+++ b/pkg/polymer/test/instance_attrs_test.dart
@@ -17,8 +17,8 @@
   get attributes => super.attributes;
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/instance_attrs_test.html b/pkg/polymer/test/instance_attrs_test.html
index 11832de..2b6bfe1 100644
--- a/pkg/polymer/test/instance_attrs_test.html
+++ b/pkg/polymer/test/instance_attrs_test.html
@@ -22,6 +22,7 @@
 
     <my-element baz="world"></my-element>
 
-    <script type="application/dart" src="instance_attrs_test.dart"></script>
+    <script type="application/dart;component=1"
+            src="instance_attrs_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/js_interop_test.dart b/pkg/polymer/test/js_interop_test.dart
index 3704ccb..fc6f41c 100644
--- a/pkg/polymer/test/js_interop_test.dart
+++ b/pkg/polymer/test/js_interop_test.dart
@@ -16,7 +16,8 @@
   DartElement.created() : super.created();
 }
 
-main() => initPolymer().run(() {
+@initMethod
+main() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
@@ -31,7 +32,7 @@
 
   test('js-element in dart-element', () => testInterop(
       querySelector('dart-element').shadowRoot.querySelector('js-element')));
-});
+}
 
 testInterop(jsElem) {
   expect(jsElem.shadowRoot.text, 'FOOBAR');
diff --git a/pkg/polymer/test/js_interop_test.html b/pkg/polymer/test/js_interop_test.html
index dab9c5c..8ce3bf1 100644
--- a/pkg/polymer/test/js_interop_test.html
+++ b/pkg/polymer/test/js_interop_test.html
@@ -34,7 +34,8 @@
   <dart-element></dart-element>
   <js-element></js-element>
 
-  <script type="application/dart" src="js_interop_test.dart"></script>
+  <script type="application/dart;component=1"
+          src="js_interop_test.dart"></script>
 
   </body>
 </html>
diff --git a/pkg/polymer/test/mirror_loader_1.dart b/pkg/polymer/test/mirror_loader_1.dart
new file mode 100644
index 0000000..4fbe74a
--- /dev/null
+++ b/pkg/polymer/test/mirror_loader_1.dart
@@ -0,0 +1,10 @@
+library mirror_loader_test1;
+
+import 'dart:html';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('x-a')
+class XA extends PolymerElement {
+  final String x = "a";
+  XA.created() : super.created();
+}
diff --git a/pkg/polymer/test/mirror_loader_2.dart b/pkg/polymer/test/mirror_loader_2.dart
new file mode 100644
index 0000000..d148571
--- /dev/null
+++ b/pkg/polymer/test/mirror_loader_2.dart
@@ -0,0 +1,15 @@
+library mirror_loader_test2;
+
+import 'dart:html';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('x-a')
+class XA extends PolymerElement {
+  final String x = "a";
+  XA.created() : super.created();
+}
+
+// The next classes are here as a regression test for darbug.com/17929. Our
+// loader was incorrectly trying to retrieve the reflectiveType of these
+// classes.
+class Foo<T> {}
diff --git a/pkg/polymer/test/mirror_loader_3.dart b/pkg/polymer/test/mirror_loader_3.dart
new file mode 100644
index 0000000..1f3e511
--- /dev/null
+++ b/pkg/polymer/test/mirror_loader_3.dart
@@ -0,0 +1,11 @@
+library mirror_loader_test3;
+
+import 'dart:html';
+
+import 'package:polymer/polymer.dart';
+
+@CustomTag('x-b')
+class XB<T> extends PolymerElement {
+  final String x = "a";
+  XB.created() : super.created();
+}
diff --git a/pkg/polymer/test/mirror_loader_4.dart b/pkg/polymer/test/mirror_loader_4.dart
new file mode 100644
index 0000000..7d882af
--- /dev/null
+++ b/pkg/polymer/test/mirror_loader_4.dart
@@ -0,0 +1,21 @@
+library mirror_loader_test4;
+
+import 'dart:html';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('x-a')
+class XA extends PolymerElement {
+  final String x = "a";
+  XA.created() : super.created();
+}
+
+// The next classes are here as a regression test for darbug.com/17929. Our
+// loader was incorrectly trying to retrieve the reflectiveType of these
+// classes.
+class Foo<T> {}
+
+@CustomTag('x-b')
+class XB<T> extends PolymerElement {
+  final String x = "a";
+  XB.created() : super.created();
+}
diff --git a/pkg/polymer/test/mirror_loader_test.dart b/pkg/polymer/test/mirror_loader_test.dart
new file mode 100644
index 0000000..0de5500
--- /dev/null
+++ b/pkg/polymer/test/mirror_loader_test.dart
@@ -0,0 +1,51 @@
+// 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:async';
+import 'dart:html';
+
+import 'dart:mirrors';
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:path/path.dart' show url;
+
+import 'package:polymer/src/mirror_loader.dart';
+import 'mirror_loader_1.dart' as m1;
+import 'mirror_loader_2.dart' as m2;
+import 'mirror_loader_3.dart' as m3;
+import 'mirror_loader_4.dart' as m4;
+
+main() {
+  useHtmlConfiguration();
+
+  test('registered correctly', () {
+    expect(_discover(#mirror_loader_test1).length, 1);
+    expect(_discover(#mirror_loader_test2).length, 1);
+  });
+
+  test('parameterized custom tags are not registered', () {
+    runZoned(() {
+      expect(_discover(#mirror_loader_test3).length, 0);
+    }, onError: (e) {
+      expect(e is UnsupportedError, isTrue);
+      expect('$e', contains(
+          'Custom element classes cannot have type-parameters: XB'));
+    });
+  });
+
+  test('registers correct types even when errors are found', () {
+    runZoned(() {
+      expect(_discover(#mirror_loader_test4).length, 1);
+    }, onError: (e) {
+      expect(e is UnsupportedError, isTrue);
+      expect('$e', contains(
+          'Custom element classes cannot have type-parameters: XB'));
+    });
+  });
+}
+
+final mirrors = currentMirrorSystem();
+_discover(Symbol name) =>
+    discoverInitializers([mirrors.findLibrary(name).uri.toString()]);
diff --git a/pkg/polymer/test/nested_binding_test.dart b/pkg/polymer/test/nested_binding_test.dart
index f4c4959..7cc8858 100644
--- a/pkg/polymer/test/nested_binding_test.dart
+++ b/pkg/polymer/test/nested_binding_test.dart
@@ -29,8 +29,8 @@
   }
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/nested_binding_test.html b/pkg/polymer/test/nested_binding_test.html
index ffafdf1..8f4e7c6 100644
--- a/pkg/polymer/test/nested_binding_test.html
+++ b/pkg/polymer/test/nested_binding_test.html
@@ -27,6 +27,7 @@
 
     <my-test></my-test>
 
-    <script type="application/dart" src="nested_binding_test.dart"></script>
+    <script type="application/dart;component=1"
+            src="nested_binding_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/noscript_test.dart b/pkg/polymer/test/noscript_test.dart
index 06cec77..58a1c0e 100644
--- a/pkg/polymer/test/noscript_test.dart
+++ b/pkg/polymer/test/noscript_test.dart
@@ -18,7 +18,8 @@
   return completer.future;
 }
 
-main() => initPolymer().run(() {
+@initMethod
+main() {
   useHtmlConfiguration();
 
   var ready = Polymer.onReady.then((_) {
@@ -35,4 +36,4 @@
     expect(querySelector('x-b').shadowRoot.nodes.first.text, 'b');
     expect(querySelector('x-d').shadowRoot.nodes.first.text, 'd');
   });
-});
+}
diff --git a/pkg/polymer/test/noscript_test.html b/pkg/polymer/test/noscript_test.html
index 652cc7f..c2304c0 100644
--- a/pkg/polymer/test/noscript_test.html
+++ b/pkg/polymer/test/noscript_test.html
@@ -24,6 +24,6 @@
   </template>
   <x-d></x-d>
 
-  <script type="application/dart" src="noscript_test.dart"></script>
+  <script type="application/dart;component=1" src="noscript_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/prop_attr_bind_reflection_test.dart b/pkg/polymer/test/prop_attr_bind_reflection_test.dart
index 57cd21c..ce06474 100644
--- a/pkg/polymer/test/prop_attr_bind_reflection_test.dart
+++ b/pkg/polymer/test/prop_attr_bind_reflection_test.dart
@@ -29,8 +29,8 @@
   MyElement.created() : super.created();
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/prop_attr_bind_reflection_test.html b/pkg/polymer/test/prop_attr_bind_reflection_test.html
index f1b19a5..51d9acd 100644
--- a/pkg/polymer/test/prop_attr_bind_reflection_test.html
+++ b/pkg/polymer/test/prop_attr_bind_reflection_test.html
@@ -28,7 +28,8 @@
 
     <my-element></my-element>
 
-    <script type="application/dart" src="prop_attr_bind_reflection_test.dart">
+    <script type="application/dart;component=1"
+            src="prop_attr_bind_reflection_test.dart">
     </script>
   </body>
 </html>
diff --git a/pkg/polymer/test/prop_attr_reflection_test.dart b/pkg/polymer/test/prop_attr_reflection_test.dart
index 79b9c8e..927ebab 100644
--- a/pkg/polymer/test/prop_attr_reflection_test.dart
+++ b/pkg/polymer/test/prop_attr_reflection_test.dart
@@ -11,23 +11,23 @@
 class XFoo extends PolymerElement {
   XFoo.created() : super.created();
 
-  @observable var foo = '';
-  @observable String baz = '';
+  @published var foo = '';
+  @published String baz = '';
 }
 
 class XBar extends XFoo {
   XBar.created() : super.created();
 
-  @observable int zot = 3;
-  @observable bool zim = false;
-  @observable String str = 'str';
-  @observable Object obj;
+  @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) {
@@ -40,8 +40,8 @@
   return completer.future;
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/prop_attr_reflection_test.html b/pkg/polymer/test/prop_attr_reflection_test.html
index 12e2f93..9041a2c 100644
--- a/pkg/polymer/test/prop_attr_reflection_test.html
+++ b/pkg/polymer/test/prop_attr_reflection_test.html
@@ -28,6 +28,7 @@
       </template>
     </polymer-element>
 
-  <script type="application/dart" src="prop_attr_reflection_test.dart"></script>
+  <script type="application/dart;component=1"
+          src="prop_attr_reflection_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/property_change_test.dart b/pkg/polymer/test/property_change_test.dart
index fbbda2e..621be39 100644
--- a/pkg/polymer/test/property_change_test.dart
+++ b/pkg/polymer/test/property_change_test.dart
@@ -46,11 +46,12 @@
   }
 }
 
-main() => initPolymer().run(() {
+@initMethod
+main() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
 
   test('bar change detected', () => _bar.future);
   test('zonk change detected', () => _zonk.future);
-});
+}
diff --git a/pkg/polymer/test/property_change_test.html b/pkg/polymer/test/property_change_test.html
index 25251d3..7b78678 100644
--- a/pkg/polymer/test/property_change_test.html
+++ b/pkg/polymer/test/property_change_test.html
@@ -15,6 +15,7 @@
     <x-test id="test"></x-test>
 
     <polymer-element name="x-test"><template></template></polymer-element>
-    <script type="application/dart" src="property_change_test.dart"></script>
+    <script type="application/dart;component=1"
+            src="property_change_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/property_observe_test.dart b/pkg/polymer/test/property_observe_test.dart
index c3facc6..6fe6a2b 100644
--- a/pkg/polymer/test/property_observe_test.dart
+++ b/pkg/polymer/test/property_observe_test.dart
@@ -82,10 +82,11 @@
   }
 }
 
-main() => initPolymer().run(() {
+@initMethod
+main() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
 
   test('changes detected', () => _done.future);
-});
+}
diff --git a/pkg/polymer/test/property_observe_test.html b/pkg/polymer/test/property_observe_test.html
index 0c6bbc8..c1a4ea6 100644
--- a/pkg/polymer/test/property_observe_test.html
+++ b/pkg/polymer/test/property_observe_test.html
@@ -19,6 +19,7 @@
     <polymer-element name="x-test2" extends="x-test">
       <template></template>
     </polymer-element>
-    <script type="application/dart" src="property_observe_test.dart"></script>
+    <script type="application/dart;component=1"
+            src="property_observe_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/publish_attributes_test.dart b/pkg/polymer/test/publish_attributes_test.dart
index 33966e7..d4ecdded 100644
--- a/pkg/polymer/test/publish_attributes_test.dart
+++ b/pkg/polymer/test/publish_attributes_test.dart
@@ -52,8 +52,8 @@
   XQux.created() : super.created();
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/publish_attributes_test.html b/pkg/polymer/test/publish_attributes_test.html
index ca91807..7fc9572 100644
--- a/pkg/polymer/test/publish_attributes_test.html
+++ b/pkg/polymer/test/publish_attributes_test.html
@@ -27,6 +27,7 @@
 
     <polymer-element name="x-qux" attributes="qux"></polymer-element>
 
-  <script type="application/dart" src="publish_attributes_test.dart"></script>
+  <script type="application/dart;component=1"
+          src="publish_attributes_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/publish_inherited_properties_test.dart b/pkg/polymer/test/publish_inherited_properties_test.dart
index 2e7a4ac..5945266 100644
--- a/pkg/polymer/test/publish_inherited_properties_test.dart
+++ b/pkg/polymer/test/publish_inherited_properties_test.dart
@@ -46,8 +46,8 @@
   @published int squid = 7;
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady.then((_) {
diff --git a/pkg/polymer/test/publish_inherited_properties_test.html b/pkg/polymer/test/publish_inherited_properties_test.html
index 024c11e..8be8ea2 100644
--- a/pkg/polymer/test/publish_inherited_properties_test.html
+++ b/pkg/polymer/test/publish_inherited_properties_test.html
@@ -27,6 +27,7 @@
     <polymer-element name="x-noscript" extends="x-zot">
     </polymer-element>
 
-  <script type="application/dart" src="publish_inherited_properties_test.dart"></script>
+  <script type="application/dart;component=1"
+          src="publish_inherited_properties_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/register_test.dart b/pkg/polymer/test/register_test.dart
index 8afb734..f5f2bda 100644
--- a/pkg/polymer/test/register_test.dart
+++ b/pkg/polymer/test/register_test.dart
@@ -27,8 +27,8 @@
   XDiv2Element.created() : super.created();
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/register_test.html b/pkg/polymer/test/register_test.html
index b115dbe..8a3bcb6 100644
--- a/pkg/polymer/test/register_test.html
+++ b/pkg/polymer/test/register_test.html
@@ -30,6 +30,6 @@
     <div is='x-div' id='x-div'></div>
     <div is='x-div-two' id='x-div-two'></div>
 
-  <script type="application/dart" src="register_test.dart"></script>
+  <script type="application/dart;component=1" src="register_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/take_attributes_test.dart b/pkg/polymer/test/take_attributes_test.dart
index 8267deb..c77a1a4 100644
--- a/pkg/polymer/test/take_attributes_test.dart
+++ b/pkg/polymer/test/take_attributes_test.dart
@@ -49,8 +49,8 @@
   @observable var values = {};
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/take_attributes_test.html b/pkg/polymer/test/take_attributes_test.html
index a7fa8e7..163f499 100644
--- a/pkg/polymer/test/take_attributes_test.html
+++ b/pkg/polymer/test/take_attributes_test.html
@@ -71,6 +71,7 @@
            values="{ 'movie': 'Buckaroo Banzai', 'DOB': '07/31/1978' }">
     </x-obj>
 
-  <script type="application/dart" src="take_attributes_test.dart"></script>
+  <script type="application/dart;component=1"
+          src="take_attributes_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/template_distribute_dynamic_test.dart b/pkg/polymer/test/template_distribute_dynamic_test.dart
index 8d6cc6a..af73a20 100644
--- a/pkg/polymer/test/template_distribute_dynamic_test.dart
+++ b/pkg/polymer/test/template_distribute_dynamic_test.dart
@@ -52,8 +52,8 @@
   }
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/template_distribute_dynamic_test.html b/pkg/polymer/test/template_distribute_dynamic_test.html
index e42b464..ff9e1e4 100644
--- a/pkg/polymer/test/template_distribute_dynamic_test.html
+++ b/pkg/polymer/test/template_distribute_dynamic_test.html
@@ -32,7 +32,8 @@
     </template>
   </polymer-element>
 
-  <script type="application/dart" src="template_distribute_dynamic_test.dart">
+  <script type="application/dart;component=1"
+          src="template_distribute_dynamic_test.dart">
   </script>
   </body>
 </html>
diff --git a/pkg/polymer/test/unbind_test.dart b/pkg/polymer/test/unbind_test.dart
index 1de5630..3ab18d6 100644
--- a/pkg/polymer/test/unbind_test.dart
+++ b/pkg/polymer/test/unbind_test.dart
@@ -39,8 +39,8 @@
   bool get isBarValid => validBar == bar;
 }
 
+@initMethod
 main() {
-  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/unbind_test.html b/pkg/polymer/test/unbind_test.html
index 8b8cfbb..8b2f4dc 100644
--- a/pkg/polymer/test/unbind_test.html
+++ b/pkg/polymer/test/unbind_test.html
@@ -17,6 +17,6 @@
 
   <polymer-element name="x-test" attributes="bar"></polymer-element>
 
-  <script type="application/dart" src="unbind_test.dart"></script>
+  <script type="application/dart;component=1" src="unbind_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer_expressions/lib/eval.dart b/pkg/polymer_expressions/lib/eval.dart
index 2983183..2332cf9 100644
--- a/pkg/polymer_expressions/lib/eval.dart
+++ b/pkg/polymer_expressions/lib/eval.dart
@@ -150,7 +150,7 @@
  * searches for the name in local variables, then in global variables,
  * and then finally looks up the name as a property in the model.
  */
-abstract class Scope {
+abstract class Scope implements Indexable<String, Object> {
   Scope._();
 
   /** Create a scope containing a [model] and all of [variables]. */
@@ -168,7 +168,11 @@
    * we return the [model]. For any other name, this finds the first variable
    * matching [name] or, if none exists, the property [name] in the [model].
    */
-  Object operator[](String name);
+  Object operator [](String name);
+
+  operator []=(String name, Object value) {
+    throw new UnsupportedError('[]= is not supported in Scope.');
+  }
 
   /**
    * Returns whether [name] is defined in [model], that is, a lookup
diff --git a/pkg/polymer_expressions/lib/parser.dart b/pkg/polymer_expressions/lib/parser.dart
index bf8dd66..411c7ae 100644
--- a/pkg/polymer_expressions/lib/parser.dart
+++ b/pkg/polymer_expressions/lib/parser.dart
@@ -66,11 +66,9 @@
         left = _makeInvokeOrGetter(left, right);
       } else if (_token.kind == KEYWORD_TOKEN && _token.value == 'in') {
         left = _parseComprehension(left);
-      } else if (_token.kind == OPERATOR_TOKEN && _token.value == '?') {
-        left = _parseTernary(left);
       } else if (_token.kind == OPERATOR_TOKEN
           && _token.precedence >= precedence) {
-        left = _parseBinary(left);
+        left = _token.value == '?' ? _parseTernary(left) : _parseBinary(left);
       } else {
         break;
       }
diff --git a/pkg/polymer_expressions/pubspec.yaml b/pkg/polymer_expressions/pubspec.yaml
index 9020dee..28ec61c 100644
--- a/pkg/polymer_expressions/pubspec.yaml
+++ b/pkg/polymer_expressions/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer_expressions
-version: 0.10.0-pre.1.dev
+version: 0.10.0-pre.2.dev
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: An expressive custom binding syntax for HTML templates
 homepage: http://www.dartlang.org/polymer-dart/
diff --git a/pkg/polymer_expressions/test/bindings_test.dart b/pkg/polymer_expressions/test/bindings_test.dart
index e8e2f6c7..d5e1063 100644
--- a/pkg/polymer_expressions/test/bindings_test.dart
+++ b/pkg/polymer_expressions/test/bindings_test.dart
@@ -47,16 +47,15 @@
           '<template><span>{{x}}</span></template>'));
       testDiv.append(template.createInstance(model, new PolymerExpressions()));
 
+      var el;
       return new Future(() {
-        var el = testDiv.query("span");
+        el = testDiv.query("span");
         expect(el.text, 'abcde');
         expect(model.x, 'abcde');
         model.x = '___';
-
-        return new Future(() {
-          expect(model.x, '___');
-          expect(el.text, '___');
-        });
+      }).then(_nextMicrotask).then((_) {
+        expect(model.x, '___');
+        expect(el.text, '___');
       });
     });
 
@@ -69,7 +68,7 @@
         testDiv.append(template.createInstance(model,
             new PolymerExpressions()));
 
-        return new Future(() {});
+        return _nextMicrotask(null);
       }, onError: (e) {
         expect('$e', startsWith("Error evaluating expression 'foo':"));
         completer.complete(true);
@@ -118,9 +117,32 @@
         subscription.cancel();
       });
     });
+
+
+    test('detects changes to ObservableMap keys/values', () {
+      var map = new ObservableMap.from({'a': 1, 'b': 2});
+      var template = templateBind(new Element.html('<template>'
+          '<template repeat="{{k in x.keys}}">{{k}}:{{x[k]}},</template>'
+          '</template>'));
+      var model = new NotifyModel(map);
+      testDiv.append(template.createInstance(model, new PolymerExpressions()));
+
+      return new Future(() {
+        expect(testDiv.text, 'a:1,b:2,');
+        map.remove('b');
+        map['c'] = 3;
+      }).then(_nextMicrotask).then((_) {
+        expect(testDiv.text, 'a:1,c:3,');
+        map['a'] = 4;
+      }).then(_nextMicrotask).then((_) {
+        expect(testDiv.text, 'a:4,c:3,');
+      });
+    });
   });
 });
 
+_nextMicrotask(_) => new Future(() {});
+
 @reflectable
 class NotifyModel extends ChangeNotifier {
   var _x;
diff --git a/pkg/polymer_expressions/test/parser_test.dart b/pkg/polymer_expressions/test/parser_test.dart
index e57d11a..09de5d6 100644
--- a/pkg/polymer_expressions/test/parser_test.dart
+++ b/pkg/polymer_expressions/test/parser_test.dart
@@ -159,6 +159,23 @@
       expect(() => parse('a + 1 ? b + 1 :: c.d + 3'), throws);
     });
 
+    test('ternary operators have lowest associativity', () {
+      expectParse('a == b ? c + d : e - f', ternary(
+            binary(ident('a'), '==', ident('b')),
+            binary(ident('c'), '+', ident('d')),
+            binary(ident('e'), '-', ident('f'))));
+
+      expectParse('a.x == b.y ? c + d : e - f', ternary(
+            binary(getter(ident('a'), 'x'), '==', getter(ident('b'), 'y')),
+            binary(ident('c'), '+', ident('d')),
+            binary(ident('e'), '-', ident('f'))));
+
+      expectParse('a.x == b.y ? c + d : e - f', ternary(
+            binary(getter(ident('a'), 'x'), '==', getter(ident('b'), 'y')),
+            binary(ident('c'), '+', ident('d')),
+            binary(ident('e'), '-', ident('f'))));
+    });
+
     test('should parse a filter chain', () {
       expectParse('a | b | c', binary(binary(ident('a'), '|', ident('b')),
           '|', ident('c')));
diff --git a/pkg/scheduled_test/CHANGELOG.md b/pkg/scheduled_test/CHANGELOG.md
index 199b543..86d33dd 100644
--- a/pkg/scheduled_test/CHANGELOG.md
+++ b/pkg/scheduled_test/CHANGELOG.md
@@ -1,3 +1,17 @@
+## 0.11.0
+
+* `ScheduledServer.handle` now takes a `shelf.Handler` rather than a custom
+  handler class.
+
+* The body of a `test()` or a `setUp()` call may now return a Future. This was
+  already supported by the `unittest` package. The Future is passed to a
+  `wrapFuture` call.
+
+## 0.10.1+1
+
+* Updated `http` version constraint from `">=0.9.0 <0.10.0"` to
+  `">=0.9.0 <0.11.0"`
+
 ## 0.10.1
 
 * Add a `StreamMatcher.hasMatch` method.
diff --git a/pkg/scheduled_test/lib/scheduled_server.dart b/pkg/scheduled_test/lib/scheduled_server.dart
index 9466182..e04817a 100644
--- a/pkg/scheduled_test/lib/scheduled_server.dart
+++ b/pkg/scheduled_test/lib/scheduled_server.dart
@@ -8,16 +8,15 @@
 import 'dart:collection';
 import 'dart:io';
 
-import 'package:stack_trace/stack_trace.dart';
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as shelf_io;
 
 import 'scheduled_test.dart';
 import 'src/scheduled_server/handler.dart';
 import 'src/utils.dart';
 
-typedef Future ScheduledHandler(HttpRequest request);
-
-/// A class representing an [HttpServer] that's scheduled to run in the course
-/// of the test. This class allows the server's request handling to be scheduled
+/// A class representing an HTTP server that's scheduled to run in the course of
+/// the test. This class allows the server's request handling to be scheduled
 /// synchronously.
 ///
 /// The server expects requests to be received in the order [handle] is called,
@@ -48,10 +47,9 @@
 
     var scheduledServer;
     scheduledServer = new ScheduledServer._(schedule(() {
-      return Chain.track(HttpServer.bind("127.0.0.1", 0)).then((server) {
-        Chain.track(server).listen(scheduledServer._handleRequest,
-            onError: currentSchedule.signalError);
-        currentSchedule.onComplete.schedule(server.close);
+      return shelf_io.serve(scheduledServer._handleRequest, "127.0.0.1", 0)
+          .then((server) {
+        currentSchedule.onComplete.schedule(() => server.close(force: true));
         return server;
       });
     }, "starting '$description'"), description);
@@ -73,34 +71,34 @@
   /// The request must be received at the point in the schedule at which
   /// [handle] was called, or in the task immediately prior (to allow for
   /// non-deterministic asynchronicity). Otherwise, an error will be thrown.
-  void handle(String method, String path, ScheduledHandler fn) {
+  void handle(String method, String path, shelf.Handler fn) {
     var handler = new Handler(this, method, path, fn);
     _handlers.add(handler);
     schedule(() {
       handler.ready = true;
-      return handler.result.catchError((e) {
-        // Close the server so that we don't leave a dangling request.
-        _server.then((s) => s.close(force: true));
-        throw e;
-      });
+      return handler.result;
     }, "'$description' waiting for $method $path");
   }
 
-  /// The handler for incoming [HttpRequest]s to this server. This dispatches
-  /// the request to the first handler in the queue. It's that handler's
-  /// responsibility to check that the method/path are correct and that it's
-  /// being run at the correct time.
-  void _handleRequest(HttpRequest request) {
-    wrapFuture(syncFuture(() {
+  /// The handler for incoming [shelf.Request]s to this server.
+  ///
+  /// This dispatches the request to the first handler in the queue. It's that
+  /// handler's responsibility to check that the method/path are correct and
+  /// that it's being run at the correct time.
+  Future<shelf.Response> _handleRequest(shelf.Request request) {
+    return wrapFuture(syncFuture(() {
       if (_handlers.isEmpty) {
-        fail("'$description' received ${request.method} ${request.uri.path} "
+        fail("'$description' received ${request.method} ${request.url.path} "
              "when no more requests were expected.");
       }
       return _handlers.removeFirst().fn(request);
-    }).catchError((e) {
-      // Close the server so that we don't leave a dangling request.
-      _server.then((s) => s.close(force: true));
-      throw e;
-    }), 'receiving ${request.method} ${request.uri}');
+    }), 'receiving ${request.method} ${request.url.path}').catchError((error) {
+      // Don't let errors bubble up to the shelf handler. It will print them to
+      // stderr, but the user will already be notified via the scheduled_test
+      // infrastructure.
+      return new shelf.Response.internalServerError(
+          body: error.toString(),
+          headers: {'content-type': 'text/plain'});
+    });
   }
 }
diff --git a/pkg/scheduled_test/lib/scheduled_test.dart b/pkg/scheduled_test/lib/scheduled_test.dart
index b6ba30d..bba4687 100644
--- a/pkg/scheduled_test/lib/scheduled_test.dart
+++ b/pkg/scheduled_test/lib/scheduled_test.dart
@@ -216,18 +216,30 @@
 /// `unittest.setUp`.
 Function _setUpFn;
 
-/// Creates a new test case with the given description and body. This has the
-/// same semantics as [unittest.test].
-void test(String description, void body()) =>
+/// Creates a new test case with the given description and body.
+///
+/// This has the same semantics as [unittest.test].
+///
+/// If [body] returns a [Future], that future will automatically be wrapped with
+/// [wrapFuture].
+void test(String description, Future body()) =>
   _test(description, body, unittest.test);
 
 /// Creates a new test case with the given description and body that will be the
-/// only test run in this file. This has the same semantics as
-/// [unittest.solo_test].
-void solo_test(String description, void body()) =>
+/// only test run in this file.
+///
+/// This has the same semantics as [unittest.solo_test].
+///
+/// If [body] returns a [Future], that future will automatically be wrapped with
+/// [wrapFuture].
+void solo_test(String description, Future body()) =>
   _test(description, body, unittest.solo_test);
 
-void _test(String description, void body(), Function testFn) {
+void _test(String description, Future body(), Function testFn) {
+  maybeWrapFuture(future, description) {
+    if (future != null) wrapFuture(future, description);
+  }
+
   unittest.ensureInitialized();
   _ensureSetUpForTopLevel();
   testFn(description, () {
@@ -236,8 +248,8 @@
     Chain.capture(() {
       _currentSchedule = new Schedule();
       return currentSchedule.run(() {
-        if (_setUpFn != null) _setUpFn();
-        body();
+        if (_setUpFn != null) maybeWrapFuture(_setUpFn(), "set up");
+        maybeWrapFuture(body(), "test body");
       }).catchError((error, stackTrace) {
         if (error is ScheduleError) {
           assert(error.schedule.errors.contains(error));
diff --git a/pkg/scheduled_test/lib/src/scheduled_server/handler.dart b/pkg/scheduled_test/lib/src/scheduled_server/handler.dart
index ecac381..33886aa 100644
--- a/pkg/scheduled_test/lib/src/scheduled_server/handler.dart
+++ b/pkg/scheduled_test/lib/src/scheduled_server/handler.dart
@@ -6,6 +6,8 @@
 
 import 'dart:async';
 
+import 'package:shelf/shelf.dart' as shelf;
+
 import '../../scheduled_server.dart';
 import '../../scheduled_test.dart';
 import '../utils.dart';
@@ -22,8 +24,8 @@
   final String path;
 
   /// The function to run to handle the request.
-  ScheduledHandler get fn => _fn;
-  ScheduledHandler _fn;
+  shelf.Handler get fn => _fn;
+  shelf.Handler _fn;
 
   /// The scheduled task immediately prior to this handler. If this task is
   /// running when this handler receives a request, it should wait until the
@@ -41,28 +43,31 @@
   /// Whether it's time for the handler to receive its request.
   var ready = false;
 
-  Handler(this.server, this.method, this.path, ScheduledHandler fn) {
+  Handler(this.server, this.method, this.path, shelf.Handler fn) {
     _fn = (request) {
       return _waitForTask().then((_) {
         if (!ready) {
-          fail("'${server.description}' received "
-               "$method $path earlier than expected.");
+          fail("'${server.description}' received $method $path earlier than "
+              "expected.");
         }
 
+        var description = "'${server.description}' handling ${request.method} "
+            "${request.url.path}";
         // Use a nested call to [schedule] to help the user tell the difference
         // between a test failing while waiting for a handler and a test failing
         // while executing a handler.
         chainToCompleter(schedule(() {
           return syncFuture(() {
-            if (request.method != method || request.uri.path != path) {
+            if (request.method != method || request.url.path != path) {
               fail("'${server.description}' expected $method $path, "
-                   "but got ${request.method} ${request.uri.path}.");
+                   "but got ${request.method} ${request.url.path}.");
             }
 
             return fn(request);
           });
-        }, "'${server.description}' handling ${request.method} ${request.uri}"),
-            _resultCompleter);
+        }, description), _resultCompleter);
+
+        return _resultCompleter.future;
       });
     };
   }
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index 8e8462e..4e0bc56 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -1,5 +1,5 @@
 name: scheduled_test
-version: 0.10.1
+version: 0.11.0-dev
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
@@ -14,5 +14,6 @@
   path: ">=0.9.0 <2.0.0"
   stack_trace: ">=0.9.1 <0.10.0"
   unittest: ">=0.9.0 <0.11.0"
+  shelf: ">=0.4.0 <0.5.0"
 environment:
-  sdk: ">=0.8.10+6 <2.0.0"
+  sdk: ">=0.8.10+6 <2.0.0"
\ No newline at end of file
diff --git a/pkg/scheduled_test/test/scheduled_server_test.dart b/pkg/scheduled_test/test/scheduled_server_test.dart
index 63edc69..9b92820 100644
--- a/pkg/scheduled_test/test/scheduled_server_test.dart
+++ b/pkg/scheduled_test/test/scheduled_server_test.dart
@@ -11,6 +11,7 @@
 import 'package:scheduled_test/scheduled_server.dart';
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/src/mock_clock.dart' as mock_clock;
+import 'package:shelf/shelf.dart' as shelf;
 
 import 'metatest.dart';
 import 'utils.dart';
@@ -20,176 +21,94 @@
 
   setUpTimeout();
 
-  expectTestsPass("a server with no handlers does nothing", () {
-    test('test', () => new ScheduledServer());
+  expectTestPasses("a server with no handlers does nothing",
+      () => new ScheduledServer());
+
+  expectServerError("a server with no handlers that receives a request throws "
+      "an error", () {
+    var server = new ScheduledServer();
+    expect(server.url.then((url) => http.read(url.resolve('/hello'))),
+        completion(equals('Hello, test!')));
+  }, "'scheduled server 0' received GET /hello when no more requests were "
+      "expected.");
+
+  expectTestPasses("a handler runs when it's hit", () {
+    var server = new ScheduledServer();
+    expect(server.url.then((url) => http.read(url.resolve('/hello'))),
+        completion(equals('Hello, test!')));
+
+    server.handle('GET', '/hello',
+        (request) => new shelf.Response.ok('Hello, test!'));
   });
 
-  expectTestsPass("a server with no handlers that receives a request throws an "
-      "error", () {
-    var errors;
-    test('test 1', () {
-      currentSchedule.onException.schedule(() {
-        errors = currentSchedule.errors;
-      });
+  expectTestPasses("a handler blocks the schedule on the returned future", () {
+    var blockedOnFuture = false;
+    var server = new ScheduledServer();
+    expect(server.url.then((url) => http.read(url.resolve('/hello'))),
+        completion(equals('Hello, test!')));
 
-      var server = new ScheduledServer();
-      expect(server.url.then((url) => http.read(url.resolve('/hello'))),
-          completion(equals('Hello, test!')));
-    });
-
-    test('test 2', () {
-      expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
-      expect(errors.length, 2);
-      expect(errors[0].error.toString(), equals("'scheduled server 0' received "
-          "GET /hello when no more requests were expected."));
-      expect(errors[1].error, new isInstanceOf<HttpException>());
-    });
-  }, passing: ['test 2']);
-
-  expectTestsPass("a handler runs when it's hit", () {
-    test('test', () {
-      var server = new ScheduledServer();
-      expect(server.url.then((url) => http.read(url.resolve('/hello'))),
-          completion(equals('Hello, test!')));
-
-      server.handle('GET', '/hello', (request) {
-        request.response.write('Hello, test!');
-        request.response.close();
+    server.handle('GET', '/hello', (request) {
+      return pumpEventQueue().then((_) {
+        blockedOnFuture = true;
+        return new shelf.Response.ok('Hello, test!');
       });
     });
+
+    schedule(() => expect(blockedOnFuture, isTrue));
   });
 
-  expectTestsPass("a handler blocks the schedule on the returned future", () {
-    test('test', () {
-      var blockedOnFuture = false;
-      var server = new ScheduledServer();
-      expect(server.url.then((url) => http.read(url.resolve('/hello'))),
-          completion(equals('Hello, test!')));
+  expectServerError("a handler fails if it's hit too early", () {
+    var server = new ScheduledServer();
+    var response = server.url.then((url) => http.read(url.resolve('/hello')));
+    expect(response, completion(equals('Hello, test!')));
 
-      server.handle('GET', '/hello', (request) {
-        request.response.write('Hello, test!');
-        request.response.close();
-        return pumpEventQueue().then((_) {
-          blockedOnFuture = true;
-        });
-      });
+    // Block the schedule until we're sure the request has hit the server.
+    schedule(() => response);
 
-      schedule(() => expect(blockedOnFuture, isTrue));
-    });
-  });
+    // Add an additional task here so that when the previous task hits the
+    // server, it will be considered too early. Otherwise we'd hit the heuristic
+    // of allowing the server to be hit in the immediately prior task.
+    schedule(() => null);
 
-  expectTestsPass("a handler fails if it's hit too early", () {
-    var errors;
-    test('test 1', () {
-      currentSchedule.onException.schedule(() {
-        errors = currentSchedule.errors;
-      });
+    server.handle('GET', '/hello',
+        (request) => new shelf.Response.ok('Hello, test!'));
+  }, "'scheduled server 0' received GET /hello earlier than expected.");
 
-      var server = new ScheduledServer();
-      var response = server.url.then((url) => http.read(url.resolve('/hello')));
-      expect(response, completion(equals('Hello, test!')));
-
-      // Block the schedule until we're sure the request has hit the server.
-      schedule(() => response);
-
-      // Add a task's worth of space to avoid hitting the heuristic of waiting
-      // for the immediately-preceding task.
-      schedule(() => null);
-
-      server.handle('GET', '/hello', (request) {
-        request.response.write('Hello, test!');
-        request.response.close();
-      });
-    });
-
-    test('test 2', () {
-      // TODO(nweiz): There can be three errors due to issue 9151. The
-      // HttpException is reported without a stack trace, and so when it's
-      // wrapped twice it registers as a different exception each time (because
-      // it's given an ad-hoc stack trace). Always expect two exceptions when
-      // issue 9151 is fixed.
-      expect(errors.length, inInclusiveRange(2, 3));
-      expect(errors[0].error.toString(), equals(
-          "'scheduled server 0' received GET /hello earlier than expected."));
-      expect(errors[1].error, new isInstanceOf<HttpException>());
-      if (errors.length > 2) {
-        expect(errors[2].error, new isInstanceOf<HttpException>());
-      }
-      expect(errors, everyElement(new isInstanceOf<ScheduleError>()));
-    });
-  }, passing: ['test 2']);
-
-  expectTestsPass("a handler waits for the immediately prior task to complete "
+  expectTestPasses("a handler waits for the immediately prior task to complete "
       "before checking if it's too early", () {
-    test('test', () {
-      var server = new ScheduledServer();
-      expect(server.url.then((url) => http.read(url.resolve('/hello'))),
-          completion(equals('Hello, test!')));
+    var server = new ScheduledServer();
+    expect(server.url.then((url) => http.read(url.resolve('/hello'))),
+        completion(equals('Hello, test!')));
 
-      // Sleeping here is unfortunate, but we want to be sure that the HTTP
-      // request hits the server during this test without actually blocking the
-      // task on the request completing.
-      //
-      // This is also a potential race condition, but hopefully a local HTTP
-      // request won't take 1s.
-      schedule(() => new Future.delayed(new Duration(seconds: 1)));
+    // Sleeping here is unfortunate, but we want to be sure that the HTTP
+    // request hits the server during this test without actually blocking the
+    // task on the request completing.
+    //
+    // This is also a potential race condition, but hopefully a local HTTP
+    // request won't take 500ms.
+    schedule(() => new Future.delayed(new Duration(milliseconds: 500)));
 
-      server.handle('GET', '/hello', (request) {
-        request.response.write('Hello, test!');
-        request.response.close();
-      });
-    });
+    server.handle('GET', '/hello',
+        (request) => new shelf.Response.ok('Hello, test!'));
   });
 
-  expectTestsPass("a handler fails if the url is wrong", () {
-    var errors;
-    test('test 1', () {
-      currentSchedule.onException.schedule(() {
-        errors = currentSchedule.errors;
-      });
+  expectServerError("a handler fails if the url is wrong", () {
+    var server = new ScheduledServer();
+    expect(server.url.then((url) => http.read(url.resolve('/hello'))),
+        completion(equals('Hello, test!')));
 
-      var server = new ScheduledServer();
-      expect(server.url.then((url) => http.read(url.resolve('/hello'))),
-          completion(equals('Hello, test!')));
+    server.handle('GET', '/goodbye',
+        (request) => new shelf.Response.ok('Goodbye, test!'));
+  }, "'scheduled server 0' expected GET /goodbye, but got GET /hello.");
 
-      server.handle('GET', '/goodbye', (request) {
-        request.response.write('Goodbye, test!');
-        request.response.close();
-      });
-    });
+  expectServerError("a handler fails if the method is wrong", () {
+    var server = new ScheduledServer();
+    expect(server.url.then((url) => http.head(url.resolve('/hello'))),
+        completes);
 
-    test('test 2', () {
-      expect(errors.length, 2);
-      expect(errors[0].error.toString(), equals(
-          "'scheduled server 0' expected GET /goodbye, but got GET /hello."));
-      expect(errors[1].error, new isInstanceOf<HttpException>());
-    });
-  }, passing: ['test 2']);
-
-  expectTestsPass("a handler fails if the method is wrong", () {
-    var errors;
-    test('test 1', () {
-      currentSchedule.onException.schedule(() {
-        errors = currentSchedule.errors;
-      });
-
-      var server = new ScheduledServer();
-      expect(server.url.then((url) => http.head(url.resolve('/hello'))),
-          completes);
-
-      server.handle('GET', '/hello', (request) {
-        request.response.write('Hello, test!');
-        request.response.close();
-      });
-    });
-
-    test('test 2', () {
-      expect(errors.length, 2);
-      expect(errors[0].error.toString(), equals(
-          "'scheduled server 0' expected GET /hello, but got HEAD /hello."));
-      expect(errors[1].error, new isInstanceOf<HttpException>());
-    });
-  }, passing: ['test 2']);
+    server.handle('GET', '/hello',
+        (request) => new shelf.Response.ok('Hello, test!'));
+  }, "'scheduled server 0' expected GET /hello, but got HEAD /hello.");
 
   expectTestsPass("a handler times out waiting to be hit", () {
     var clock = mock_clock.mock()..run();
@@ -204,10 +123,8 @@
 
       var server = new ScheduledServer();
 
-      server.handle('GET', '/hello', (request) {
-        request.response.write('Hello, test!');
-        request.response.close();
-      });
+      server.handle('GET', '/hello',
+          (request) => new shelf.Response.ok('Hello, test!'));
     });
 
     test('test 2', () {
@@ -219,95 +136,75 @@
     });
   }, passing: ['test 2']);
 
-  expectTestsPass("multiple handlers in series respond to requests in series",
+  expectTestPasses("multiple handlers in series respond to requests in series",
       () {
-    test('test', () {
-      var server = new ScheduledServer();
-      expect(server.url.then((url) {
-        return http.read(url.resolve('/hello/1')).then((response) {
-          expect(response, equals('Hello, request 1!'));
-          return http.read(url.resolve('/hello/2'));
-        }).then((response) {
-          expect(response, equals('Hello, request 2!'));
-          return http.read(url.resolve('/hello/3'));
-        }).then((response) => expect(response, equals('Hello, request 3!')));
-      }), completes);
+    var server = new ScheduledServer();
+    expect(server.url.then((url) {
+      return http.read(url.resolve('/hello/1')).then((response) {
+        expect(response, equals('Hello, request 1!'));
+        return http.read(url.resolve('/hello/2'));
+      }).then((response) {
+        expect(response, equals('Hello, request 2!'));
+        return http.read(url.resolve('/hello/3'));
+      }).then((response) => expect(response, equals('Hello, request 3!')));
+    }), completes);
 
-      server.handle('GET', '/hello/1', (request) {
-        request.response.write('Hello, request 1!');
-        request.response.close();
-      });
+    server.handle('GET', '/hello/1',
+        (request) => new shelf.Response.ok('Hello, request 1!'));
 
-      server.handle('GET', '/hello/2', (request) {
-        request.response.write('Hello, request 2!');
-        request.response.close();
-      });
+    server.handle('GET', '/hello/2',
+        (request) => new shelf.Response.ok('Hello, request 2!'));
 
-      server.handle('GET', '/hello/3', (request) {
-        request.response.write('Hello, request 3!');
-        request.response.close();
-      });
-    });
+    server.handle('GET', '/hello/3',
+        (request) => new shelf.Response.ok('Hello, request 3!'));
   });
 
-  expectTestsPass("a server that receives a request after all its handlers "
+  expectServerError("a server that receives a request after all its handlers "
       "have run throws an error", () {
-    var errors;
-    test('test 1', () {
-      currentSchedule.onException.schedule(() {
-        errors = currentSchedule.errors;
-      });
+    var server = new ScheduledServer();
+    expect(server.url.then((url) {
+      return http.read(url.resolve('/hello/1')).then((response) {
+        expect(response, equals('Hello, request 1!'));
+        return http.read(url.resolve('/hello/2'));
+      }).then((response) {
+        expect(response, equals('Hello, request 2!'));
+        return http.read(url.resolve('/hello/3'));
+      }).then((response) => expect(response, equals('Hello, request 3!')));
+    }), completes);
 
-      var server = new ScheduledServer();
-      expect(server.url.then((url) {
-        return http.read(url.resolve('/hello/1')).then((response) {
-          expect(response, equals('Hello, request 1!'));
-          return http.read(url.resolve('/hello/2'));
-        }).then((response) {
-          expect(response, equals('Hello, request 2!'));
-          return http.read(url.resolve('/hello/3'));
-        }).then((response) => expect(response, equals('Hello, request 3!')));
-      }), completes);
+    server.handle('GET', '/hello/1',
+        (request) => new shelf.Response.ok('Hello, request 1!'));
 
-      server.handle('GET', '/hello/1', (request) {
-        request.response.write('Hello, request 1!');
-        request.response.close();
-      });
+    server.handle('GET', '/hello/2',
+        (request) => new shelf.Response.ok('Hello, request 2!'));
+  }, "'scheduled server 0' received GET /hello/3 when no more requests were "
+      "expected.");
 
-      server.handle('GET', '/hello/2', (request) {
-        request.response.write('Hello, request 2!');
-        request.response.close();
-      });
-    });
+  expectServerError("an error in a handler doesn't cause a timeout", () {
+    var server = new ScheduledServer();
+    expect(server.url.then((url) => http.read(url.resolve('/hello'))),
+        completion(equals('Hello, test!')));
 
-    test('test 2', () {
-      expect(errors.length, 2);
-      expect(errors[0].error.toString(), equals("'scheduled server 0' received "
-          "GET /hello/3 when no more requests were expected."));
-      expect(errors[1].error, new isInstanceOf<HttpException>());
-    });
-  }, passing: ['test 2']);
+    server.handle('GET', '/hello', (request) => fail('oh no'));
+  }, 'oh no');
+}
 
-  expectTestsPass("an error in a handler doesn't cause a timeout", () {
-    var errors;
-    test('test 1', () {
-      currentSchedule.onException.schedule(() {
-        errors = currentSchedule.errors;
-      });
+/// Creates a metatest that runs [testBody], captures its schedule errors, and
+/// asserts that it throws an error with the given [errorMessage].
+void expectServerError(String description, void testBody(),
+    String errorMessage) {
+  expectTestFails(description, testBody, (errors) {
+    // There can be between one and three errors here. The first is the
+    // expected server error. The second is an HttpException that may occur if
+    // the server is closed fast enough after the error. The third is due to
+    // issue 9151: the HttpException is reported without a stack trace, and so
+    // when it's wrapped twice it registers as a different exception each time
+    // (because it's given an ad-hoc stack trace).
+    expect(errors.length, inInclusiveRange(1, 3));
+    expect(errors[0].error.toString(), equals(errorMessage));
 
-      var server = new ScheduledServer();
-      expect(server.url.then((url) => http.read(url.resolve('/hello'))),
-          completion(equals('Hello, test!')));
-
-      server.handle('GET', '/hello', (request) {
-        fail('oh no');
-      });
-    });
-
-    test('test 2', () {
-      expect(errors.length, 2);
-      expect(errors[0].error.toString(), equals('oh no'));
-      expect(errors[1].error, new isInstanceOf<HttpException>());
-    });
-  }, passing: ['test 2']);
+    for (var i = 1; i < errors.length; i++) {
+      expect(errors[i].error, new isInstanceOf<HttpException>());
+    }
+  });
 }
diff --git a/pkg/scheduled_test/test/scheduled_test/set_up_test.dart b/pkg/scheduled_test/test/scheduled_test/set_up_test.dart
index 1fbf80f..2ebf35c 100644
--- a/pkg/scheduled_test/test/scheduled_test/set_up_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/set_up_test.dart
@@ -176,4 +176,31 @@
     });
   });
 
+  expectTestsPass("a future returned by setUp is implicitly wrapped", () {
+    var futureComplete = false;
+    setUp(() => pumpEventQueue().then((_) => futureComplete = true));
+
+    test('test', () {
+      currentSchedule.onComplete.schedule(() => expect(futureComplete, isTrue));
+    });
+  });
+
+  expectTestsPass("a future returned by setUp should not block test()", () {
+    var futureComplete = false;
+    setUp(() => pumpEventQueue().then((_) => futureComplete = true));
+
+    test('test', () {
+      expect(futureComplete, isFalse);
+    });
+  });
+
+  expectTestsPass("a future returned by setUp should not block the schedule",
+      () {
+    var futureComplete = false;
+    setUp(() => pumpEventQueue().then((_) => futureComplete = true));
+
+    test('test', () {
+      schedule(() => expect(futureComplete, isFalse));
+    });
+  });
 }
diff --git a/pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart b/pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart
index 077aeb4..b6b5ca0 100644
--- a/pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart
+++ b/pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart
@@ -44,6 +44,26 @@
     });
   });
 
+  expectTestsPass("a returned future should be implicitly wrapped",
+      () {
+    test('test', () {
+      var futureComplete = false;
+      currentSchedule.onComplete.schedule(() => expect(futureComplete, isTrue));
+
+      return pumpEventQueue().then((_) => futureComplete = true);
+    });
+  });
+
+  expectTestsPass("a returned future should not block the schedule",
+      () {
+    test('test', () {
+      var futureComplete = false;
+      schedule(() => expect(futureComplete, isFalse));
+
+      return pumpEventQueue().then((_) => futureComplete = true);
+    });
+  });
+
   expectTestsPass("wrapFuture should pass through the error of the wrapped "
       "future", () {
     var error;
diff --git a/pkg/scheduled_test/test/utils.dart b/pkg/scheduled_test/test/utils.dart
index e2b6fcd..2d27b2d 100644
--- a/pkg/scheduled_test/test/utils.dart
+++ b/pkg/scheduled_test/test/utils.dart
@@ -62,7 +62,7 @@
 /// Creates a metatest with [body] and asserts that it passes.
 ///
 /// This is like [expectTestsPass], but the [test] is set up automatically.
-void expectTestPasses(String description, void body()) =>
+void expectTestPasses(String description, Future body()) =>
   expectTestsPass(description, () => test('test', body));
 
 /// Creates a metatest that runs [testBody], captures its schedule errors, and
@@ -70,7 +70,7 @@
 ///
 /// [testBody] is expected to produce an error, while [validator] is expected to
 /// produce none.
-void expectTestFails(String description, void testBody(),
+void expectTestFails(String description, Future testBody(),
     void validator(List<ScheduleError> errors)) {
   expectTestsPass(description, () {
     var errors;
diff --git a/pkg/shelf/CHANGELOG.md b/pkg/shelf/CHANGELOG.md
new file mode 100644
index 0000000..caefe02
--- /dev/null
+++ b/pkg/shelf/CHANGELOG.md
@@ -0,0 +1,58 @@
+## 0.4.0
+
+* Access to headers for `Request` and `Response` is now case-insensitive.
+
+* The constructor for `Request` has been simplified. 
+
+* `Request` now exposes `url` which replaces `pathInfo`, `queryString`, and 
+  `pathSegments`.
+
+## 0.3.0+9
+
+* Removed old testing infrastructure.
+
+* Updated documentation address.
+
+## 0.3.0+8
+
+* Added a dependency on the `http_parser` package.
+
+## 0.3.0+7
+
+* Removed unused dependency on the `mime` package.
+
+## 0.3.0+6
+
+* Added a dependency on the `string_scanner` package.
+
+## 0.3.0+5
+
+* Updated `pubspec` details for move to Dart SDK.
+
+## 0.3.0 2014-03-25
+
+* `Response`
+    * **NEW!** `int get contentLength`
+    * **NEW!** `DateTime get expires`
+    * **NEW!** `DateTime get lastModified`
+* `Request`
+    * **BREAKING** `contentLength` is now read from `headers`. The constructor
+      argument has been removed.
+    * **NEW!** supports an optional `Stream<List<int>> body` constructor argument.
+    * **NEW!** `Stream<List<int>> read()` and
+      `Future<String> readAsString([Encoding encoding])`
+    * **NEW!** `DateTime get ifModifiedSince`
+    * **NEW!** `String get mimeType`
+    * **NEW!** `Encoding get encoding`
+
+## 0.2.0 2014-03-06
+
+* **BREAKING** Removed `Shelf` prefix from all classes.
+* **BREAKING** `Response` has drastically different constructors.
+* *NEW!* `Response` now accepts a body of either `String` or
+  `Stream<List<int>>`.
+* *NEW!* `Response` now exposes `encoding` and `mimeType`.
+
+## 0.1.0 2014-03-02
+
+* First reviewed release
diff --git a/pkg/json/LICENSE b/pkg/shelf/LICENSE
similarity index 100%
rename from pkg/json/LICENSE
rename to pkg/shelf/LICENSE
diff --git a/pkg/shelf/README.md b/pkg/shelf/README.md
new file mode 100644
index 0000000..9456481
--- /dev/null
+++ b/pkg/shelf/README.md
@@ -0,0 +1,42 @@
+## Web Server Middleware for Dart
+
+## Introduction
+
+**Shelf** makes it easy to create and compose **web servers** and **parts of web
+servers**. How?
+
+* Expose a small set of simple types.
+* Map server logic into a simple function: a single argument for the request,
+the response is the return value.
+* Trivially mix and match synchronous and asynchronous processing.
+* Flexibliity to return a simple string or a byte stream with the same model.
+
+## Example
+
+See `example/example_server.dart`
+
+```dart
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as io;
+
+void main() {
+  var handler = const shelf.Stack().addMiddleware(shelf.logRequests())
+      .addHandler(_echoRequest);
+
+  io.serve(handler, 'localhost', 8080).then((server) {
+    print('Serving at http://${server.address.host}:${server.port}');
+  });
+}
+
+shelf.Response _echoRequest(shelf.Request request) {
+  return new shelf.Response.ok('Request for "${request.url}"');
+}
+```
+
+## Inspiration
+
+* [Connect](http://www.senchalabs.org/connect/) for NodeJS.
+    * Read [this great write-up](http://howtonode.org/connect-it) to understand
+      the overall philosophy of all of these models.
+* [Rack](http://rack.github.io/) for Ruby.
+* [WSGI](http://legacy.python.org/dev/peps/pep-3333/) for Python.
diff --git a/pkg/shelf/example/example_server.dart b/pkg/shelf/example/example_server.dart
new file mode 100644
index 0000000..49fda9e
--- /dev/null
+++ b/pkg/shelf/example/example_server.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as io;
+
+void main() {
+  var handler = const shelf.Stack().addMiddleware(shelf.logRequests())
+      .addHandler(_echoRequest);
+
+  io.serve(handler, 'localhost', 8080).then((server) {
+    print('Serving at http://${server.address.host}:${server.port}');
+  });
+}
+
+shelf.Response _echoRequest(shelf.Request request) {
+  return new shelf.Response.ok('Request for "${request.url}"');
+}
diff --git a/pkg/shelf/lib/shelf.dart b/pkg/shelf/lib/shelf.dart
new file mode 100644
index 0000000..eb339c0
--- /dev/null
+++ b/pkg/shelf/lib/shelf.dart
@@ -0,0 +1,12 @@
+// 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 shelf;
+
+export 'src/handlers/logger.dart';
+export 'src/middleware.dart';
+export 'src/request.dart';
+export 'src/response.dart';
+export 'src/stack.dart';
+export 'src/handler.dart';
diff --git a/pkg/shelf/lib/shelf_io.dart b/pkg/shelf/lib/shelf_io.dart
new file mode 100644
index 0000000..b866719
--- /dev/null
+++ b/pkg/shelf/lib/shelf_io.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A Shelf adapter for handling [HttpRequest] objects from `dart:io`.
+///
+/// One can provide an instance of [HttpServer] as the `requests` parameter in
+/// [serveRequests].
+library shelf.io;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:stack_trace/stack_trace.dart';
+
+import 'shelf.dart';
+import 'src/util.dart';
+
+/// Starts an [HttpServer] that listens on the specified [address] and
+/// [port] and sends requests to [handler].
+///
+/// See the documentation for [HttpServer.bind] for more details on [address],
+/// [port], and [backlog].
+Future<HttpServer> serve(Handler handler, address, int port,
+    {int backlog}) {
+  if (backlog == null) backlog = 0;
+  return HttpServer.bind(address, port, backlog: backlog).then((server) {
+    serveRequests(server, handler);
+    return server;
+  });
+}
+
+/// Serve a [Stream] of [HttpRequest]s.
+///
+/// [HttpServer] implements [Stream<HttpRequest>] so it can be passed directly
+/// to [serveRequests].
+void serveRequests(Stream<HttpRequest> requests, Handler handler) {
+  requests.listen((request) => handleRequest(request, handler));
+}
+
+/// Uses [handler] to handle [request].
+///
+/// Returns a [Future] which completes when the request has been handled.
+Future handleRequest(HttpRequest request, Handler handler) {
+  var shelfRequest = _fromHttpRequest(request);
+
+  return syncFuture(() => handler(shelfRequest))
+      .catchError((error, stackTrace) {
+    var chain = new Chain.current();
+    if (stackTrace != null) {
+      chain = new Chain.forTrace(stackTrace)
+          .foldFrames((frame) => frame.isCore || frame.package == 'shelf')
+          .terse;
+    }
+
+    return _logError('Error thrown by handler\n$error\n$chain');
+  }).then((response) {
+    if (response == null) {
+      response = _logError('null response from handler');
+    }
+
+    return _writeResponse(response, request.response);
+  });
+}
+
+/// Creates a new [Request] from the provided [HttpRequest].
+Request _fromHttpRequest(HttpRequest request) {
+  var headers = {};
+  request.headers.forEach((k, v) {
+    // Multiple header values are joined with commas.
+    // See http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-21#page-22
+    headers[k] = v.join(',');
+  });
+
+  return new Request(request.method, request.requestedUri,
+      protocolVersion: request.protocolVersion, headers: headers,
+      body: request);
+}
+
+Future _writeResponse(Response response, HttpResponse httpResponse) {
+  httpResponse.statusCode = response.statusCode;
+
+  response.headers.forEach((header, value) {
+    if (value == null) return;
+    httpResponse.headers.set(header, value);
+  });
+
+  if (response.headers[HttpHeaders.SERVER] == null) {
+    var value = httpResponse.headers.value(HttpHeaders.SERVER);
+    httpResponse.headers.set(HttpHeaders.SERVER, '$value with Shelf');
+  }
+  return httpResponse.addStream(response.read())
+      .then((_) => httpResponse.close());
+}
+
+// TODO(kevmoo) A developer mode is needed to include error info in response
+// TODO(kevmoo) Make error output plugable. stderr, logging, etc
+Response _logError(String message) {
+  stderr.writeln('ERROR - ${new DateTime.now()}');
+  stderr.writeln(message);
+  return new Response.internalServerError();
+}
diff --git a/pkg/shelf/lib/src/handler.dart b/pkg/shelf/lib/src/handler.dart
new file mode 100644
index 0000000..6ac3d31
--- /dev/null
+++ b/pkg/shelf/lib/src/handler.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.typedef;
+
+import 'request.dart';
+
+/// The signature of a function which handles a [Request].
+///
+/// A [Handler] may receive a request directly from an HTTP server or it
+/// may be composed as part of a larger application.
+///
+/// Should return [Response] or [Future<Response>].
+//TODO(kevmoo): provide a more detailed explanation.
+typedef Handler(Request request);
diff --git a/pkg/shelf/lib/src/handlers/logger.dart b/pkg/shelf/lib/src/handlers/logger.dart
new file mode 100644
index 0000000..2e95cf9
--- /dev/null
+++ b/pkg/shelf/lib/src/handlers/logger.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.handlers.logger;
+
+import 'package:stack_trace/stack_trace.dart';
+
+import '../middleware.dart';
+import '../util.dart';
+
+/// Middleware which prints the time of the request, the elapsed time for the
+/// inner handlers, the response's status code and the request URI.
+///
+/// [logger] takes two paramaters.
+///
+/// `msg` includes the request time, duration, request method, and requested
+/// path.
+///
+/// For successful requests, `msg` also includes the status code.
+///
+/// When an error is thrown, `isError` is true and `msg` contains the error
+/// description and stack trace.
+Middleware logRequests({void logger(String msg, bool isError)}) =>
+    (innerHandler) {
+  if (logger == null) logger = _defaultLogger;
+
+  return (request) {
+    var startTime = new DateTime.now();
+    var watch = new Stopwatch()..start();
+
+    return syncFuture(() => innerHandler(request)).then((response) {
+      var msg = _getMessage(startTime, response.statusCode, request.url,
+          request.method, watch.elapsed);
+
+      logger(msg, false);
+
+      return response;
+    }, onError: (error, stackTrace) {
+      var msg = _getErrorMessage(startTime, request.url, request.method,
+          watch.elapsed, error, stackTrace);
+
+      logger(msg, true);
+
+      throw error;
+    });
+  };
+};
+
+String _getMessage(DateTime requestTime, int statusCode, Uri url,
+  String method, Duration elapsedTime) {
+
+  return '${requestTime}\t$elapsedTime\t$method\t[${statusCode}]\t${url}';
+}
+
+String _getErrorMessage(DateTime requestTime, Uri url,
+  String method, Duration elapsedTime, Object error, StackTrace stack) {
+
+  var chain = new Chain.current();
+  if (stack != null) {
+    chain = new Chain.forTrace(stack)
+      .foldFrames((frame) => frame.isCore || frame.package == 'shelf')
+      .terse;
+  }
+
+  var msg = '${requestTime}\t$elapsedTime\t$method\t${url}\n$error';
+  if(chain == null) return msg;
+
+  return '$msg\n$chain';
+}
+
+void _defaultLogger(String msg, bool isError) {
+  if (isError) {
+    print('[ERROR] $msg');
+  } else {
+    print(msg);
+  }
+}
diff --git a/pkg/shelf/lib/src/media_type.dart b/pkg/shelf/lib/src/media_type.dart
new file mode 100644
index 0000000..595fc9a
--- /dev/null
+++ b/pkg/shelf/lib/src/media_type.dart
@@ -0,0 +1,156 @@
+// 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 shelf.media_type;
+
+import 'package:collection/collection.dart';
+
+import 'string_scanner.dart';
+
+// All of the following regular expressions come from section 2.2 of the HTTP
+// spec: http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html
+final _lws = new RegExp(r"(?:\r\n)?[ \t]+");
+final _token = new RegExp(r'[^()<>@,;:"\\/[\]?={} \t\x00-\x1F\x7F]+');
+final _quotedString = new RegExp(r'"(?:[^"\x00-\x1F\x7F]|\\.)*"');
+final _quotedPair = new RegExp(r'\\(.)');
+
+/// A regular expression matching any number of [_lws] productions in a row.
+final _whitespace = new RegExp("(?:${_lws.pattern})*");
+
+/// A regular expression matching a character that is not a valid HTTP token.
+final _nonToken = new RegExp(r'[()<>@,;:"\\/\[\]?={} \t\x00-\x1F\x7F]');
+
+/// A regular expression matching a character that needs to be backslash-escaped
+/// in a quoted string.
+final _escapedChar = new RegExp(r'["\x00-\x1F\x7F]');
+
+/// A class representing an HTTP media type, as used in Accept and Content-Type
+/// headers.
+class MediaType {
+  /// The primary identifier of the MIME type.
+  final String type;
+
+  /// The secondary identifier of the MIME type.
+  final String subtype;
+
+  /// The parameters to the media type.
+  ///
+  /// This map is immutable.
+  final Map<String, String> parameters;
+
+  /// The media type's MIME type.
+  String get mimeType => "$type/$subtype";
+
+  /// Parses a media type.
+  ///
+  /// This will throw a FormatError if the media type is invalid.
+  factory MediaType.parse(String mediaType) {
+    // This parsing is based on sections 3.6 and 3.7 of the HTTP spec:
+    // http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html.
+    var errorMessage = 'Invalid media type "$mediaType".';
+    var scanner = new StringScanner(mediaType);
+    scanner.scan(_whitespace);
+    scanner.expect(_token, errorMessage);
+    var type = scanner.lastMatch[0];
+    scanner.expect('/', errorMessage);
+    scanner.expect(_token, errorMessage);
+    var subtype = scanner.lastMatch[0];
+    scanner.scan(_whitespace);
+
+    var parameters = {};
+    while (scanner.scan(';')) {
+      scanner.scan(_whitespace);
+      scanner.expect(_token, errorMessage);
+      var attribute = scanner.lastMatch[0];
+      scanner.expect('=', errorMessage);
+
+      var value;
+      if (scanner.scan(_token)) {
+        value = scanner.lastMatch[0];
+      } else {
+        scanner.expect(_quotedString, errorMessage);
+        var quotedString = scanner.lastMatch[0];
+        value = quotedString.substring(1, quotedString.length - 1).
+            replaceAllMapped(_quotedPair, (match) => match[1]);
+      }
+
+      scanner.scan(_whitespace);
+      parameters[attribute] = value;
+    }
+
+    if (!scanner.isDone) throw new FormatException(errorMessage);
+
+    return new MediaType(type, subtype, parameters);
+  }
+
+  MediaType(this.type, this.subtype, [Map<String, String> parameters])
+      : this.parameters = new UnmodifiableMapView(
+          parameters == null ? {} : new Map.from(parameters));
+
+  /// Returns a copy of this [MediaType] with some fields altered.
+  ///
+  /// [type] and [subtype] alter the corresponding fields. [mimeType] is parsed
+  /// and alters both the [type] and [subtype] fields; it cannot be passed along
+  /// with [type] or [subtype].
+  ///
+  /// [parameters] overwrites and adds to the corresponding field. If
+  /// [clearParameters] is passed, it replaces the corresponding field entirely
+  /// instead.
+  MediaType change({String type, String subtype, String mimeType,
+      Map<String, String> parameters, bool clearParameters: false}) {
+    if (mimeType != null) {
+      if (type != null) {
+        throw new ArgumentError("You may not pass both [type] and [mimeType].");
+      } else if (subtype != null) {
+        throw new ArgumentError("You may not pass both [subtype] and "
+            "[mimeType].");
+      }
+
+      var segments = mimeType.split('/');
+      if (segments.length != 2) {
+        throw new FormatException('Invalid mime type "$mimeType".');
+      }
+
+      type = segments[0];
+      subtype = segments[1];
+    }
+
+    if (type == null) type = this.type;
+    if (subtype == null) subtype = this.subtype;
+    if (parameters == null) parameters = {};
+
+    if (!clearParameters) {
+      var newParameters = parameters;
+      parameters = new Map.from(this.parameters);
+      parameters.addAll(newParameters);
+    }
+
+    return new MediaType(type, subtype, parameters);
+  }
+
+  /// Converts the media type to a string.
+  ///
+  /// This will produce a valid HTTP media type.
+  String toString() {
+    var buffer = new StringBuffer()
+        ..write(type)
+        ..write("/")
+        ..write(subtype);
+
+    parameters.forEach((attribute, value) {
+      buffer.write("; $attribute=");
+      if (_nonToken.hasMatch(value)) {
+        buffer
+          ..write('"')
+          ..write(value.replaceAllMapped(
+              _escapedChar, (match) => "\\" + match[0]))
+          ..write('"');
+      } else {
+        buffer.write(value);
+      }
+    });
+
+    return buffer.toString();
+  }
+}
diff --git a/pkg/shelf/lib/src/message.dart b/pkg/shelf/lib/src/message.dart
new file mode 100644
index 0000000..ad64d10
--- /dev/null
+++ b/pkg/shelf/lib/src/message.dart
@@ -0,0 +1,113 @@
+// 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 shelf.message;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:convert';
+
+// TODO(kevmoo): use UnmodifiableMapView from SDK once 1.4 ships
+import 'package:collection/wrappers.dart' as pc;
+import 'package:http_parser/http_parser.dart';
+import 'package:stack_trace/stack_trace.dart';
+
+/// Represents logic shared between [Request] and [Response].
+abstract class Message {
+  /// The HTTP headers.
+  ///
+  /// The value is immutable.
+  final Map<String, String> headers;
+
+  /// The streaming body of the message.
+  ///
+  /// This can be read via [read] or [readAsString].
+  final Stream<List<int>> _body;
+
+  /// Creates a new [Message].
+  ///
+  /// If [headers] is `null`, it is treated as empty.
+  Message(this._body, {Map<String, String> headers})
+      : this.headers = _getIgnoreCaseMapView(headers);
+
+  /// The contents of the content-length field in [headers].
+  ///
+  /// If not set, `null`.
+  int get contentLength {
+    if (_contentLengthCache != null) return _contentLengthCache;
+    if (!headers.containsKey('content-length')) return null;
+    _contentLengthCache = int.parse(headers['content-length']);
+    return _contentLengthCache;
+  }
+  int _contentLengthCache;
+
+  /// The MIME type of the message.
+  ///
+  /// This is parsed from the Content-Type header in [headers]. It contains only
+  /// the MIME type, without any Content-Type parameters.
+  ///
+  /// If [headers] doesn't have a Content-Type header, this will be `null`.
+  String get mimeType {
+    var contentType = _contentType;
+    if (contentType == null) return null;
+    return contentType.mimeType;
+  }
+
+  /// The encoding of the message body.
+  ///
+  /// This is parsed from the "charset" paramater of the Content-Type header in
+  /// [headers].
+  ///
+  /// If [headers] doesn't have a Content-Type header or it specifies an
+  /// encoding that [dart:convert] doesn't support, this will be `null`.
+  Encoding get encoding {
+    var contentType = _contentType;
+    if (contentType == null) return null;
+    if (!contentType.parameters.containsKey('charset')) return null;
+    return Encoding.getByName(contentType.parameters['charset']);
+  }
+
+  /// The parsed version of the Content-Type header in [headers].
+  ///
+  /// This is cached for efficient access.
+  MediaType get _contentType {
+    if (_contentTypeCache != null) return _contentTypeCache;
+    if (!headers.containsKey('content-type')) return null;
+    _contentTypeCache = new MediaType.parse(headers['content-type']);
+    return _contentTypeCache;
+  }
+  MediaType _contentTypeCache;
+
+  /// Returns a [Stream] representing the body.
+  ///
+  /// Can only be called once.
+  Stream<List<int>> read() => _body;
+
+  /// Returns a [Future] containing the body as a String.
+  ///
+  /// If [encoding] is passed, that's used to decode the body.
+  /// Otherwise the encoding is taken from the Content-Type header. If that
+  /// doesn't exist or doesn't have a "charset" parameter, UTF-8 is used.
+  ///
+  /// This calls [read] internally, which can only be called once.
+  Future<String> readAsString([Encoding encoding]) {
+    if (encoding == null) encoding = this.encoding;
+    if (encoding == null) encoding = UTF8;
+    return Chain.track(encoding.decodeStream(read()));
+  }
+}
+
+/// Creates on an unmodifiable map of [headers] with case-insensitive access.
+Map<String, String> _getIgnoreCaseMapView(Map<String, String> headers) {
+  if (headers == null) return const {};
+  // TODO(kevmoo) generalize this model with a 'canonical map' to align with
+  // similiar implementation in http pkg [BaseRequest].
+  var map = new LinkedHashMap<String, String>(
+      equals: (key1, key2) => key1.toLowerCase() == key2.toLowerCase(),
+      hashCode: (key) => key.toLowerCase().hashCode);
+
+  map.addAll(headers);
+
+  return new pc.UnmodifiableMapView<String, String>(map);
+}
diff --git a/pkg/shelf/lib/src/middleware.dart b/pkg/shelf/lib/src/middleware.dart
new file mode 100644
index 0000000..e1a9f18
--- /dev/null
+++ b/pkg/shelf/lib/src/middleware.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.middleware;
+
+import 'request.dart';
+import 'response.dart';
+import 'handler.dart';
+import 'util.dart';
+
+/// A function which creates a new [Handler] by wrapping a [Handler].
+///
+/// You can extend the functions of a [Handler] by wrapping it in
+/// [Middleware] that can intercept and process a request before it it sent
+/// to a handler, a response after it is sent by a handler, or both.
+///
+/// Because [Middleware] consumes a [Handler] and returns a new
+/// [Handler], multiple [Middleware] instances can be composed
+/// together to offer rich functionality.
+///
+/// Common uses for middleware include caching, logging, and authentication.
+///
+/// A simple [Middleware] can be created using [createMiddleware].
+typedef Handler Middleware(Handler innerHandler);
+
+/// Creates a [Middleware] using the provided functions.
+///
+/// If provided, [requestHandler] receives a [Request]. It can respond to
+/// the request by returning a [Response] or [Future<Response>].
+/// [requestHandler] can also return `null` for some or all requests in which
+/// case the request is sent to the inner [Handler].
+///
+/// If provided, [responseHandler] is called with the [Response] generated
+/// by the inner [Handler]. Responses generated by [requestHandler] are not
+/// sent to [responseHandler].
+///
+/// [responseHandler] should return either a [Response] or
+/// [Future<Response>]. It may return the response parameter it receives or
+/// create a new response object.
+///
+/// If provided, [errorHandler] receives errors thrown by the inner handler. It
+/// does not receive errors thrown by [requestHandler] or [responseHandler]. It
+/// can either return a new response or throw an error.
+Middleware createMiddleware({requestHandler(Request request),
+    responseHandler(Response response),
+    errorHandler(error, StackTrace stackTrace)}) {
+  if (requestHandler == null) requestHandler = (request) => null;
+
+  if (responseHandler == null) responseHandler = (response) => response;
+
+  return (Handler innerHandler) {
+    return (request) {
+      return syncFuture(() => requestHandler(request)).then((response) {
+        if (response != null) return response;
+
+        return syncFuture(() => innerHandler(request))
+            .then((response) => responseHandler(response),
+                onError: errorHandler);
+      });
+    };
+  };
+}
diff --git a/pkg/shelf/lib/src/request.dart b/pkg/shelf/lib/src/request.dart
new file mode 100644
index 0000000..71c4e98
--- /dev/null
+++ b/pkg/shelf/lib/src/request.dart
@@ -0,0 +1,153 @@
+// 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 shelf.request;
+
+import 'dart:async';
+
+import 'package:http_parser/http_parser.dart';
+
+import 'message.dart';
+
+/// Represents an HTTP request to be processed by a Shelf application.
+class Request extends Message {
+  /// The remainder of the [requestedUri] path and query designating the virtual
+  /// "location" of the request's target within the handler.
+  ///
+  /// [url] may be an empty, if [requestedUri]targets the handler
+  /// root and does not have a trailing slash.
+  ///
+  /// [url] is never null. If it is not empty, it will start with `/`.
+  ///
+  /// [scriptName] and [url] combine to create a valid path that should
+  /// correspond to the [requestedUri] path.
+  final Uri url;
+
+  /// The HTTP request method, such as "GET" or "POST".
+  final String method;
+
+  /// The initial portion of the [requestedUri] path that corresponds to the
+  /// handler.
+  ///
+  /// [scriptName] allows a handler to know its virtual "location".
+  ///
+  /// If the handler corresponds to the "root" of a server, it will be an
+  /// empty string, otherwise it will start with a `/`
+  ///
+  /// [scriptName] and [url] combine to create a valid path that should
+  /// correspond to the [requestedUri] path.
+  final String scriptName;
+
+  /// The HTTP protocol version used in the request, either "1.0" or "1.1".
+  final String protocolVersion;
+
+  /// The original [Uri] for the request.
+  final Uri requestedUri;
+
+  /// If this is non-`null` and the requested resource hasn't been modified
+  /// since this date and time, the server should return a 304 Not Modified
+  /// response.
+  ///
+  /// This is parsed from the If-Modified-Since header in [headers]. If
+  /// [headers] doesn't have an If-Modified-Since header, this will be `null`.
+  DateTime get ifModifiedSince {
+    if (_ifModifiedSinceCache != null) return _ifModifiedSinceCache;
+    if (!headers.containsKey('if-modified-since')) return null;
+    _ifModifiedSinceCache = parseHttpDate(headers['if-modified-since']);
+    return _ifModifiedSinceCache;
+  }
+  DateTime _ifModifiedSinceCache;
+
+  /// Creates a new [Request].
+  ///
+  /// If [url] and [scriptName] are omitted, they are inferred from
+  /// [requestedUri].
+  ///
+  /// Setting one of [url] or [scriptName] and not the other will throw an
+  /// [ArgumentError].
+  ///
+  /// The default value for [protocolVersion] is '1.1'.
+  // TODO(kevmoo) finish documenting the rest of the arguments.
+  Request(this.method, Uri requestedUri, {String protocolVersion,
+    Map<String, String> headers, Uri url, String scriptName,
+    Stream<List<int>> body})
+      : this.requestedUri = requestedUri,
+        this.protocolVersion = protocolVersion == null ?
+            '1.1' : protocolVersion,
+        this.url = _computeUrl(requestedUri, url, scriptName),
+        this.scriptName = _computeScriptName(requestedUri, url, scriptName),
+        super(body == null ? new Stream.fromIterable([]) : body,
+            headers: headers) {
+    if (method.isEmpty) throw new ArgumentError('method cannot be empty.');
+
+    // TODO(kevmoo) use isAbsolute property on Uri once Issue 18053 is fixed
+    if (requestedUri.scheme.isEmpty) {
+      throw new ArgumentError('requstedUri must be an absolute URI.');
+    }
+
+    if (this.scriptName.isNotEmpty && !this.scriptName.startsWith('/')) {
+      throw new ArgumentError('scriptName must be empty or start with "/".');
+    }
+
+    if (this.scriptName == '/') {
+      throw new ArgumentError(
+          'scriptName can never be "/". It should be empty instead.');
+    }
+
+    if (this.scriptName.endsWith('/')) {
+      throw new ArgumentError('scriptName must not end with "/".');
+    }
+
+    if (this.url.path.isNotEmpty && !this.url.path.startsWith('/')) {
+      throw new ArgumentError('url must be empty or start with "/".');
+    }
+
+    if (this.scriptName.isEmpty && this.url.path.isEmpty) {
+      throw new ArgumentError('scriptName and url cannot both be empty.');
+    }
+  }
+}
+
+/// Computes `url` from the provided [Request] constructor arguments.
+///
+/// If [url] and [scriptName] are `null`, infer value from [requestedUrl],
+/// otherwise return [url].
+///
+/// If [url] is provided, but [scriptName] is omitted, throws an
+/// [ArgumentError].
+Uri _computeUrl(Uri requestedUri, Uri url, String scriptName) {
+  if (url == null && scriptName == null) {
+    return new Uri(path: requestedUri.path, query: requestedUri.query,
+        fragment: requestedUri.fragment);
+  }
+
+  if (url != null && scriptName != null) {
+    // TODO(kevmoo) use isAbsolute property on Uri once Issue 18053 is fixed
+    if (url.scheme.isNotEmpty) throw new ArgumentError('url must be relative.');
+    return url;
+  }
+
+  throw new ArgumentError(
+      'url and scriptName must both be null or both be set.');
+}
+
+/// Computes `scriptName` from the provided [Request] constructor arguments.
+///
+/// If [url] and [scriptName] are `null` it returns an empty string, otherwise
+/// [scriptName] is returned.
+///
+/// If [script] is provided, but [url] is omitted, throws an
+/// [ArgumentError].
+String _computeScriptName(Uri requstedUri, Uri url, String scriptName) {
+  if (url == null && scriptName == null) {
+    return '';
+  }
+
+  if (url != null && scriptName != null) {
+    return scriptName;
+  }
+
+  throw new ArgumentError(
+      'url and scriptName must both be null or both be set.');
+}
diff --git a/pkg/shelf/lib/src/response.dart b/pkg/shelf/lib/src/response.dart
new file mode 100644
index 0000000..bbc268b
--- /dev/null
+++ b/pkg/shelf/lib/src/response.dart
@@ -0,0 +1,270 @@
+// 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 shelf.response;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:http_parser/http_parser.dart';
+
+import 'message.dart';
+
+/// The response returned by a [Handler].
+class Response extends Message {
+  /// The HTTP status code of the response.
+  final int statusCode;
+
+  /// The date and time after which the response's data should be considered
+  /// stale.
+  ///
+  /// This is parsed from the Expires header in [headers]. If [headers] doesn't
+  /// have an Expires header, this will be `null`.
+  DateTime get expires {
+    if (_expiresCache != null) return _expiresCache;
+    if (!headers.containsKey('expires')) return null;
+    _expiresCache = parseHttpDate(headers['expires']);
+    return _expiresCache;
+  }
+  DateTime _expiresCache;
+
+  /// The date and time the source of the response's data was last modified.
+  ///
+  /// This is parsed from the Last-Modified header in [headers]. If [headers]
+  /// doesn't have a Last-Modified header, this will be `null`.
+  DateTime get lastModified {
+    if (_lastModifiedCache != null) return _lastModifiedCache;
+    if (!headers.containsKey('last-modified')) return null;
+    _lastModifiedCache = parseHttpDate(headers['last-modified']);
+    return _lastModifiedCache;
+  }
+  DateTime _lastModifiedCache;
+
+  /// Constructs a 200 OK response.
+  ///
+  /// This indicates that the request has succeeded.
+  ///
+  /// [body] is the response body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body. If it's a [String],
+  /// [encoding] is used to encode it to a [Stream<List<int>>]. It defaults to
+  /// UTF-8.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response.ok(body, {Map<String, String> headers, Encoding encoding})
+      : this(200, body: body, headers: headers, encoding: encoding);
+
+  /// Constructs a 301 Moved Permanently response.
+  ///
+  /// This indicates that the requested resource has moved permanently to a new
+  /// URI. [location] is that URI; it can be either a [String] or a [Uri]. It's
+  /// automatically set as the Location header in [headers].
+  ///
+  /// [body] is the response body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body. If it's a [String],
+  /// [encoding] is used to encode it to a [Stream<List<int>>]. It defaults to
+  /// UTF-8.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response.movedPermanently(location, {body, Map<String, String> headers,
+      Encoding encoding})
+      : this._redirect(301, location, body, headers, encoding);
+
+  /// Constructs a 302 Found response.
+  ///
+  /// This indicates that the requested resource has moved temporarily to a new
+  /// URI. [location] is that URI; it can be either a [String] or a [Uri]. It's
+  /// automatically set as the Location header in [headers].
+  ///
+  /// [body] is the response body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body. If it's a [String],
+  /// [encoding] is used to encode it to a [Stream<List<int>>]. It defaults to
+  /// UTF-8.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response.found(location, {body, Map<String, String> headers,
+      Encoding encoding})
+      : this._redirect(302, location, body, headers, encoding);
+
+  /// Constructs a 303 See Other response.
+  ///
+  /// This indicates that the response to the request should be retrieved using
+  /// a GET request to a new URI. [location] is that URI; it can be either a
+  /// [String] or a [Uri]. It's automatically set as the Location header in
+  /// [headers].
+  ///
+  /// [body] is the response body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body. If it's a [String],
+  /// [encoding] is used to encode it to a [Stream<List<int>>]. It defaults to
+  /// UTF-8.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response.seeOther(location, {body, Map<String, String> headers,
+      Encoding encoding})
+      : this._redirect(303, location, body, headers, encoding);
+
+  /// Constructs a helper constructor for redirect responses.
+  Response._redirect(int statusCode, location, body,
+      Map<String, String> headers, Encoding encoding)
+      : this(statusCode,
+            body: body,
+            encoding: encoding,
+            headers: _addHeader(
+                headers, 'location', _locationToString(location)));
+
+  /// Constructs a 304 Not Modified response.
+  ///
+  /// This is used to respond to a conditional GET request that provided
+  /// information used to determine whether the requested resource has changed
+  /// since the last request. It indicates that the resource has not changed and
+  /// the old value should be used.
+  Response.notModified({Map<String, String> headers})
+      : this(304, headers: _addHeader(
+            headers, 'date', formatHttpDate(new DateTime.now())));
+
+  /// Constructs a 403 Forbidden response.
+  ///
+  /// This indicates that the server is refusing to fulfill the request.
+  ///
+  /// [body] is the response body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body. If it's a [String],
+  /// [encoding] is used to encode it to a [Stream<List<int>>]. It defaults to
+  /// UTF-8.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response.forbidden(body, {Map<String, String> headers,
+      Encoding encoding})
+      : this(403, body: body, headers: headers);
+
+  /// Constructs a 404 Not Found response.
+  ///
+  /// This indicates that the server didn't find any resource matching the
+  /// requested URI.
+  ///
+  /// [body] is the response body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body. If it's a [String],
+  /// [encoding] is used to encode it to a [Stream<List<int>>]. It defaults to
+  /// UTF-8.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response.notFound(body, {Map<String, String> headers, Encoding encoding})
+      : this(404, body: body, headers: headers);
+
+  /// Constructs a 500 Internal Server Error response.
+  ///
+  /// This indicates that the server had an internal error that prevented it
+  /// from fulfilling the request.
+  ///
+  /// [body] is the response body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body. If it's `null` or not
+  /// passed, a default error message is used. If it's a [String], [encoding] is
+  /// used to encode it to a [Stream<List<int>>]. It defaults to UTF-8.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response.internalServerError({body, Map<String, String> headers,
+      Encoding encoding})
+      : this(500,
+            headers: body == null ? _adjust500Headers(headers) : headers,
+            body: body == null ? 'Internal Server Error' : body);
+
+  /// Constructs an HTTP response with the given [statusCode].
+  ///
+  /// [statusCode] must be greater than or equal to 100.
+  ///
+  /// [body] is the response body. It may be either a [String], a
+  /// [Stream<List<int>>], or `null` to indicate no body. If it's `null` or not
+  /// passed, a default error message is used. If it's a [String], [encoding] is
+  /// used to encode it to a [Stream<List<int>>]. It defaults to UTF-8.
+  ///
+  /// If [encoding] is passed, the "encoding" field of the Content-Type header
+  /// in [headers] will be set appropriately. If there is no existing
+  /// Content-Type header, it will be set to "application/octet-stream".
+  Response(this.statusCode, {body, Map<String, String> headers,
+      Encoding encoding})
+      : super(_bodyToStream(body, encoding),
+          headers: _adjustHeaders(headers, encoding)) {
+    if (statusCode < 100) {
+      throw new ArgumentError("Invalid status code: $statusCode.");
+    }
+  }
+}
+
+/// Converts [body] to a byte stream.
+///
+/// [body] may be either a [String], a [Stream<List<int>>], or `null`. If it's a
+/// [String], [encoding] will be used to convert it to a [Stream<List<int>>].
+Stream<List<int>> _bodyToStream(body, Encoding encoding) {
+  if (encoding == null) encoding = UTF8;
+  if (body == null) return new Stream.fromIterable([]);
+  if (body is String) return new Stream.fromIterable([encoding.encode(body)]);
+  if (body is Stream) return body;
+
+  throw new ArgumentError('Response body "$body" must be a String or a '
+      'Stream.');
+}
+
+/// Adds information about [encoding] to [headers].
+///
+/// Returns a new map without modifying [headers].
+Map<String, String> _adjustHeaders(
+    Map<String, String> headers, Encoding encoding) {
+  if (headers == null) headers = const {};
+  if (encoding == null) return headers;
+  if (headers['content-type'] == null) {
+    return _addHeader(headers, 'content-type',
+        'application/octet-stream; charset=${encoding.name}');
+  }
+
+  var contentType = new MediaType.parse(headers['content-type'])
+      .change(parameters: {'charset': encoding.name});
+  return _addHeader(headers, 'content-type', contentType.toString());
+}
+
+/// Adds a header with [name] and [value] to [headers], which may be null.
+///
+/// Returns a new map without modifying [headers].
+Map<String, String> _addHeader(Map<String, String> headers, String name,
+    String value) {
+  headers = headers == null ? {} : new Map.from(headers);
+  headers[name] = value;
+  return headers;
+}
+
+/// Adds content-type information to [headers].
+///
+/// Returns a new map without modifying [headers]. This is used to add
+/// content-type information when creating a 500 response with a default body.
+Map<String, String> _adjust500Headers(Map<String, String> headers) {
+  if (headers == null || headers['content-type'] == null) {
+    return _addHeader(headers, 'content-type', 'text/plain');
+  }
+
+  var contentType = new MediaType.parse(headers['content-type'])
+      .change(mimeType: 'text/plain');
+  return _addHeader(headers, 'content-type', contentType.toString());
+}
+
+/// Converts [location], which may be a [String] or a [Uri], to a [String].
+///
+/// Throws an [ArgumentError] if [location] isn't a [String] or a [Uri].
+String _locationToString(location) {
+  if (location is String) return location;
+  if (location is Uri) return location.toString();
+
+  throw new ArgumentError('Response location must be a String or Uri, was '
+      '"$location".');
+}
diff --git a/pkg/shelf/lib/src/stack.dart b/pkg/shelf/lib/src/stack.dart
new file mode 100644
index 0000000..3aacf72
--- /dev/null
+++ b/pkg/shelf/lib/src/stack.dart
@@ -0,0 +1,45 @@
+// 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 shelf.stack;
+
+import 'handler.dart';
+import 'middleware.dart';
+
+/// A helper that makes it easy to compose a set of [Middleware] and a
+/// [Handler].
+///
+///     var handler = const Stack()
+///         .addMiddleware(loggingMiddleware)
+///         .addMiddleware(cachingMiddleware)
+///         .addHandler(application);
+class Stack {
+  final Stack _parent;
+  final Middleware _middleware;
+
+  const Stack()
+      : _middleware = null,
+        _parent = null;
+
+  Stack._(this._middleware, this._parent);
+
+  /// Returns a new [Stack] with [middleware] added to the existing set of
+  /// [Middleware].
+  ///
+  /// [middleware] will be the last [Middleware] to process a request and
+  /// the first to process a response.
+  Stack addMiddleware(Middleware middleware) =>
+      new Stack._(middleware, this);
+
+  /// Returns a new [Handler] with [handler] as the final processor of a
+  /// [Request] if all of the middleware in the stack have passed the request
+  /// through.
+  Handler addHandler(Handler handler) {
+    if (_middleware == null) return handler;
+    return _parent.addHandler(_middleware(handler));
+  }
+
+  /// Exposes this stack of [Middleware] as a single middleware instance.
+  Middleware get middleware => addHandler;
+}
diff --git a/pkg/shelf/lib/src/string_scanner.dart b/pkg/shelf/lib/src/string_scanner.dart
new file mode 100644
index 0000000..834c2d4
--- /dev/null
+++ b/pkg/shelf/lib/src/string_scanner.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.string_scanner;
+
+/// A class that scans through a string using [Pattern]s.
+class StringScanner {
+  /// The string being scanned through.
+  final String string;
+
+  /// The current position of the scanner in the string, in characters.
+  int get position => _position;
+  set position(int position) {
+    if (position < 0 || position > string.length) {
+      throw new ArgumentError("Invalid position $position");
+    }
+
+    _position = position;
+  }
+  int _position = 0;
+
+  /// The data about the previous match made by the scanner.
+  ///
+  /// If the last match failed, this will be `null`.
+  Match get lastMatch => _lastMatch;
+  Match _lastMatch;
+
+  /// The portion of the string that hasn't yet been scanned.
+  String get rest => string.substring(position);
+
+  /// Whether the scanner has completely consumed [string].
+  bool get isDone => position == string.length;
+
+  /// Creates a new [StringScanner] that starts scanning from [position].
+  ///
+  /// [position] defaults to 0, the beginning of the string.
+  StringScanner(this.string, {int position}) {
+    if (position != null) this.position = position;
+  }
+
+  /// If [pattern] matches at the current position of the string, scans forward
+  /// until the end of the match.
+  ///
+  /// Returns whether or not [pattern] matched.
+  bool scan(Pattern pattern) {
+    var success = matches(pattern);
+    if (success) _position = _lastMatch.end;
+    return success;
+  }
+
+  /// If [pattern] matches at the current position of the string, scans forward
+  /// until the end of the match.
+  ///
+  /// If [pattern] did not match, throws a [FormatException] with [message].
+  void expect(Pattern pattern, String message) {
+    if (scan(pattern)) return;
+    throw new FormatException(message);
+  }
+
+  /// Returns whether or not [pattern] matches at the current position of the
+  /// string.
+  ///
+  /// This doesn't move the scan pointer forward.
+  bool matches(Pattern pattern) {
+    _lastMatch = pattern.matchAsPrefix(string, position);
+    return _lastMatch != null;
+  }
+}
diff --git a/pkg/shelf/lib/src/util.dart b/pkg/shelf/lib/src/util.dart
new file mode 100644
index 0000000..ee761d6
--- /dev/null
+++ b/pkg/shelf/lib/src/util.dart
@@ -0,0 +1,12 @@
+// 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 shelf.util;
+
+import 'dart:async';
+
+import 'package:stack_trace/stack_trace.dart';
+
+/// Like [Future.sync], but wraps the Future in [Chain.track] as well.
+Future syncFuture(callback()) => Chain.track(new Future.sync(callback));
diff --git a/pkg/shelf/pubspec.yaml b/pkg/shelf/pubspec.yaml
new file mode 100644
index 0000000..fcf337b
--- /dev/null
+++ b/pkg/shelf/pubspec.yaml
@@ -0,0 +1,17 @@
+name: shelf
+version: 0.4.0
+author: Dart Team <misc@dartlang.org>
+description: Web Server Middleware for Dart
+homepage: http://www.dartlang.org
+environment:
+  sdk: '>=1.2.0 <2.0.0'
+documentation: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf
+dependencies:
+  collection: '>=0.9.1 <0.10.0'
+  http_parser: '>=0.0.0 <0.1.0'
+  path: '>=1.0.0 <2.0.0'
+  stack_trace: '>=0.9.2 <0.10.0'
+dev_dependencies:
+  http: '>=0.9.2 <0.11.0'
+  scheduled_test: '>=0.10.0 <0.11.0'
+  unittest: '>=0.10.0 <0.11.0'
diff --git a/pkg/shelf/test/create_middleware_test.dart b/pkg/shelf/test/create_middleware_test.dart
new file mode 100644
index 0000000..7ce99eb
--- /dev/null
+++ b/pkg/shelf/test/create_middleware_test.dart
@@ -0,0 +1,211 @@
+// 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 shelf.create_middleware_test;
+
+import 'dart:async';
+
+import 'package:shelf/shelf.dart';
+import 'package:unittest/unittest.dart';
+
+import 'test_util.dart';
+
+void main() {
+  test('forwards the request and response if both handlers are null', () {
+    var handler = const Stack()
+        .addMiddleware(createMiddleware())
+        .addHandler((request) {
+          return syncHandler(request, headers: {'from' : 'innerHandler'});
+        });
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(response.headers['from'], 'innerHandler');
+    });
+  });
+
+  group('requestHandler', () {
+    test('sync null response forwards to inner handler', () {
+      var handler = const Stack()
+          .addMiddleware(createMiddleware(requestHandler: (request) => null))
+          .addHandler(syncHandler);
+
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.headers['from'], isNull);
+      });
+    });
+
+    test('async null response forwards to inner handler', () {
+      var handler = const Stack()
+          .addMiddleware(createMiddleware(
+              requestHandler: (request) => new Future.value(null)))
+          .addHandler(syncHandler);
+
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.headers['from'], isNull);
+      });
+    });
+
+    test('sync response is returned', () {
+      var handler = const Stack()
+          .addMiddleware(createMiddleware(
+              requestHandler: (request) => _middlewareResponse))
+          .addHandler(_failHandler);
+
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.headers['from'], 'middleware');
+      });
+    });
+
+    test('async response is returned', () {
+      var handler = const Stack()
+          .addMiddleware(createMiddleware(requestHandler: (request) =>
+              new Future.value(_middlewareResponse)))
+          .addHandler(_failHandler);
+
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.headers['from'], 'middleware');
+      });
+    });
+
+    group('with responseHandler', () {
+      test('with sync result, responseHandler is not called', () {
+        var middleware = createMiddleware(
+            requestHandler: (request) => _middlewareResponse,
+            responseHandler: (response) => fail('should not be called'));
+
+        var handler = const Stack()
+            .addMiddleware(middleware)
+            .addHandler(syncHandler);
+
+        return makeSimpleRequest(handler).then((response) {
+          expect(response.headers['from'], 'middleware');
+        });
+      });
+
+      test('with async result, responseHandler is not called', () {
+        var middleware = createMiddleware(
+            requestHandler: (request) => new Future.value(_middlewareResponse),
+            responseHandler: (response) => fail('should not be called'));
+        var handler = const Stack()
+            .addMiddleware(middleware)
+            .addHandler(syncHandler);
+
+        return makeSimpleRequest(handler).then((response) {
+          expect(response.headers['from'], 'middleware');
+        });
+      });
+    });
+  });
+
+  group('responseHandler', () {
+    test('innerHandler sync response is seen, replaced value continues', () {
+      var handler = const Stack().addMiddleware(createMiddleware(
+          responseHandler: (response) {
+        expect(response.headers['from'], 'handler');
+        return _middlewareResponse;
+      })).addHandler((request) {
+        return syncHandler(request, headers: {'from' : 'handler'} );
+      });
+
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.headers['from'], 'middleware');
+      });
+    });
+
+    test('innerHandler async response is seen, async value continues', () {
+      var handler = const Stack().addMiddleware(
+          createMiddleware(responseHandler: (response) {
+        expect(response.headers['from'], 'handler');
+        return new Future.value(_middlewareResponse);
+      })).addHandler((request) {
+        return new Future(() => syncHandler(
+            request, headers: {'from' : 'handler'} ));
+      });
+
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.headers['from'], 'middleware');
+      });
+    });
+  });
+
+  group('error handling', () {
+    test('sync error thrown by requestHandler bubbles down', () {
+      var handler = const Stack()
+          .addMiddleware(createMiddleware(
+              requestHandler: (request) => throw 'middleware error'))
+          .addHandler(_failHandler);
+
+      expect(makeSimpleRequest(handler), throwsA('middleware error'));
+    });
+
+    test('async error thrown by requestHandler bubbles down', () {
+      var handler = const Stack()
+          .addMiddleware(createMiddleware(requestHandler: (request) =>
+              new Future.error('middleware error')))
+          .addHandler(_failHandler);
+
+      expect(makeSimpleRequest(handler), throwsA('middleware error'));
+    });
+
+    test('throw from responseHandler does not hit error handler', () {
+      var middleware = createMiddleware(responseHandler: (response) {
+        throw 'middleware error';
+      }, errorHandler: (e, s) => fail('should never get here'));
+
+      var handler = const Stack().addMiddleware(middleware)
+          .addHandler(syncHandler);
+
+      expect(makeSimpleRequest(handler), throwsA('middleware error'));
+    });
+
+    test('requestHandler throw does not hit errorHandlers', () {
+      var middleware = createMiddleware(
+          requestHandler: (request) {
+            throw 'middleware error';
+          },
+          errorHandler: (e, s) => fail('should never get here'));
+
+      var handler = const Stack().addMiddleware(middleware)
+          .addHandler(syncHandler);
+
+      expect(makeSimpleRequest(handler), throwsA('middleware error'));
+    });
+
+    test('inner handler throws, is caught by errorHandler with response', () {
+      var middleware = createMiddleware(
+          errorHandler: (error, stack) {
+            expect(error, 'bad handler');
+            return _middlewareResponse;
+          });
+
+      var handler = const Stack().addMiddleware(middleware)
+          .addHandler((request) {
+        throw 'bad handler';
+      });
+
+      return makeSimpleRequest(handler).then((response) {
+        expect(response.headers['from'], 'middleware');
+      });
+    });
+
+    test('inner handler throws, is caught by errorHandler and rethrown', () {
+      var middleware = createMiddleware(errorHandler: (error, stack) {
+        expect(error, 'bad handler');
+        throw error;
+      });
+
+      var handler = const Stack().addMiddleware(middleware)
+          .addHandler((request) {
+        throw 'bad handler';
+      });
+
+      expect(makeSimpleRequest(handler), throwsA('bad handler'));
+    });
+  });
+}
+
+_failHandler(Request request) => fail('should never get here');
+
+final Response _middlewareResponse =
+    new Response.ok('middleware content', headers: {'from': 'middleware'});
diff --git a/pkg/shelf/test/harness_console.dart b/pkg/shelf/test/harness_console.dart
new file mode 100644
index 0000000..4b61b73
--- /dev/null
+++ b/pkg/shelf/test/harness_console.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*
+ * This file imports all individual tests files and allows them to be run
+ * all at once.
+ *
+ * It also exposes `testCore` which is used by `hop_runner` to rust tests via
+ * Hop.
+ */
+library harness_console;
+
+import 'package:unittest/unittest.dart';
+
+import 'create_middleware_test.dart' as create_middleware;
+import 'http_date_test.dart' as http_date;
+import 'log_middleware_test.dart' as log_middleware;
+import 'media_type_test.dart' as media_type;
+import 'request_test.dart' as request;
+import 'response_test.dart' as response;
+import 'shelf_io_test.dart' as shelf_io;
+import 'stack_test.dart' as stack;
+import 'string_scanner_test.dart' as string_scanner;
+
+void main() {
+  groupSep = ' - ';
+
+  group('createMiddleware', create_middleware.main);
+  group('http_date', http_date.main);
+  group('logRequests', log_middleware.main);
+  group('MediaType', media_type.main);
+  group('Request', request.main);
+  group('Response', response.main);
+  group('shelf_io', shelf_io.main);
+  group('Stack', stack.main);
+  group('StringScanner', string_scanner.main);
+}
diff --git a/pkg/shelf/test/http_date_test.dart b/pkg/shelf/test/http_date_test.dart
new file mode 100644
index 0000000..4af874f
--- /dev/null
+++ b/pkg/shelf/test/http_date_test.dart
@@ -0,0 +1,315 @@
+// 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 shelf.http_date_test;
+
+import 'package:shelf/src/util.dart';
+import 'package:unittest/unittest.dart';
+
+void main() {
+  group("parse", () {
+    group("RFC 1123", () {
+      test("parses the example date", () {
+        var date = parseHttpDate("Sun, 06 Nov 1994 08:49:37 GMT");
+        expect(date.day, equals(6));
+        expect(date.month, equals(DateTime.NOVEMBER));
+        expect(date.year, equals(1994));
+        expect(date.hour, equals(8));
+        expect(date.minute, equals(49));
+        expect(date.second, equals(37));
+        expect(date.timeZoneName, equals("UTC"));
+      });
+
+      test("whitespace is required", () {
+        expect(() => parseHttpDate("Sun,06 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 199408:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:49:37GMT"),
+            throwsFormatException);
+      });
+
+      test("exactly one space is required", () {
+        expect(() => parseHttpDate("Sun,  06 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06  Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov  1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994  08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:49:37  GMT"),
+            throwsFormatException);
+      });
+
+      test("requires precise number lengths", () {
+        expect(() => parseHttpDate("Sun, 6 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 8:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:9:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:49:7 GMT"),
+            throwsFormatException);
+      });
+
+      test("requires reasonable numbers", () {
+        expect(() => parseHttpDate("Sun, 00 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 31 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 32 Aug 1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 24:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:60:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun, 06 Nov 1994 08:49:60 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows short weekday names", () {
+        expect(() => parseHttpDate("Sunday, 6 Nov 1994 08:49:37 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows short month names", () {
+        expect(() => parseHttpDate("Sun, 6 November 1994 08:49:37 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows GMT", () {
+        expect(() => parseHttpDate("Sun, 6 Nov 1994 08:49:37 PST"),
+            throwsFormatException);
+      });
+
+      test("disallows trailing whitespace", () {
+        expect(() => parseHttpDate("Sun, 6 Nov 1994 08:49:37 GMT "),
+            throwsFormatException);
+      });
+    });
+
+    group("RFC 850", () {
+      test("parses the example date", () {
+        var date = parseHttpDate("Sunday, 06-Nov-94 08:49:37 GMT");
+        expect(date.day, equals(6));
+        expect(date.month, equals(DateTime.NOVEMBER));
+        expect(date.year, equals(1994));
+        expect(date.hour, equals(8));
+        expect(date.minute, equals(49));
+        expect(date.second, equals(37));
+        expect(date.timeZoneName, equals("UTC"));
+      });
+
+      test("whitespace is required", () {
+        expect(() => parseHttpDate("Sunday,06-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-9408:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:49:37GMT"),
+            throwsFormatException);
+      });
+
+      test("exactly one space is required", () {
+        expect(() => parseHttpDate("Sunday,  06-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94  08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:49:37  GMT"),
+            throwsFormatException);
+      });
+
+      test("requires precise number lengths", () {
+        expect(() => parseHttpDate("Sunday, 6-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-1994 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 8:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:9:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:49:7 GMT"),
+            throwsFormatException);
+      });
+
+      test("requires reasonable numbers", () {
+        expect(() => parseHttpDate("Sunday, 00-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 31-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 32-Aug-94 08:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 24:49:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:60:37 GMT"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sunday, 06-Nov-94 08:49:60 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows long weekday names", () {
+        expect(() => parseHttpDate("Sun, 6-Nov-94 08:49:37 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows short month names", () {
+        expect(() => parseHttpDate("Sunday, 6-November-94 08:49:37 GMT"),
+            throwsFormatException);
+      });
+
+      test("only allows GMT", () {
+        expect(() => parseHttpDate("Sunday, 6-Nov-94 08:49:37 PST"),
+            throwsFormatException);
+      });
+
+      test("disallows trailing whitespace", () {
+        expect(() => parseHttpDate("Sunday, 6-Nov-94 08:49:37 GMT "),
+            throwsFormatException);
+      });
+    });
+
+    group("asctime()", () {
+      test("parses the example date", () {
+        var date = parseHttpDate("Sun Nov  6 08:49:37 1994");
+        expect(date.day, equals(6));
+        expect(date.month, equals(DateTime.NOVEMBER));
+        expect(date.year, equals(1994));
+        expect(date.hour, equals(8));
+        expect(date.minute, equals(49));
+        expect(date.second, equals(37));
+        expect(date.timeZoneName, equals("UTC"));
+      });
+
+      test("parses a date with a two-digit day", () {
+        var date = parseHttpDate("Sun Nov 16 08:49:37 1994");
+        expect(date.day, equals(16));
+        expect(date.month, equals(DateTime.NOVEMBER));
+        expect(date.year, equals(1994));
+        expect(date.hour, equals(8));
+        expect(date.minute, equals(49));
+        expect(date.second, equals(37));
+        expect(date.timeZoneName, equals("UTC"));
+      });
+
+      test("whitespace is required", () {
+        expect(() => parseHttpDate("SunNov  6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  608:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:371994"),
+            throwsFormatException);
+      });
+
+      test("the right amount of whitespace is required", () {
+        expect(() => parseHttpDate("Sun  Nov  6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov   6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov 6 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6  08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:37  1994"),
+            throwsFormatException);
+      });
+
+      test("requires precise number lengths", () {
+        expect(() => parseHttpDate("Sun Nov 016 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 8:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:9:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:7 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:37 94"),
+            throwsFormatException);
+      });
+
+      test("requires reasonable numbers", () {
+        expect(() => parseHttpDate("Sun Nov 0 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov 31 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Aug 32 08:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 24:49:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:60:37 1994"),
+            throwsFormatException);
+
+        expect(() => parseHttpDate("Sun Nov  6 08:49:60 1994"),
+            throwsFormatException);
+      });
+
+      test("only allows short weekday names", () {
+        expect(() => parseHttpDate("Sunday Nov 0 08:49:37 1994"),
+            throwsFormatException);
+      });
+
+      test("only allows short month names", () {
+        expect(() => parseHttpDate("Sun November 0 08:49:37 1994"),
+            throwsFormatException);
+      });
+
+      test("disallows trailing whitespace", () {
+        expect(() => parseHttpDate("Sun November 0 08:49:37 1994 "),
+            throwsFormatException);
+      });
+    });
+  });
+}
diff --git a/pkg/shelf/test/log_middleware_test.dart b/pkg/shelf/test/log_middleware_test.dart
new file mode 100644
index 0000000..d8da8fa
--- /dev/null
+++ b/pkg/shelf/test/log_middleware_test.dart
@@ -0,0 +1,61 @@
+// 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 shelf.log_middleware_test;
+
+import 'package:shelf/shelf.dart';
+import 'package:unittest/unittest.dart';
+
+import 'test_util.dart';
+
+void main() {
+  bool gotLog;
+
+  setUp(() {
+    gotLog = false;
+  });
+
+  var logger = (msg, isError) {
+    expect(gotLog, isFalse);
+    gotLog = true;
+    expect(isError, isFalse);
+    expect(msg, contains('GET'));
+    expect(msg, contains('[200]'));
+  };
+
+  test('logs a request with a synchronous response', () {
+    var handler = const Stack()
+        .addMiddleware(logRequests(logger: logger))
+        .addHandler(syncHandler);
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(gotLog, isTrue);
+    });
+  });
+
+  test('logs a request with an asynchronous response', () {
+    var handler = const Stack()
+        .addMiddleware(logRequests(logger: logger))
+        .addHandler(asyncHandler);
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(gotLog, isTrue);
+    });
+  });
+
+  test('logs a request with an asynchronous response', () {
+    var handler = const Stack()
+        .addMiddleware(logRequests(logger: (msg, isError) {
+      expect(gotLog, isFalse);
+      gotLog = true;
+      expect(isError, isTrue);
+      expect(msg, contains('\tGET\t/'));
+      expect(msg, contains('testing logging throw'));
+    })).addHandler((request) {
+      throw 'testing logging throw';
+    });
+
+    expect(makeSimpleRequest(handler), throwsA('testing logging throw'));
+  });
+}
diff --git a/pkg/shelf/test/media_type_test.dart b/pkg/shelf/test/media_type_test.dart
new file mode 100644
index 0000000..382ea46
--- /dev/null
+++ b/pkg/shelf/test/media_type_test.dart
@@ -0,0 +1,163 @@
+// 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 shelf.media_type_test;
+
+import 'package:shelf/src/media_type.dart';
+import 'package:unittest/unittest.dart';
+
+void main() {
+  group("parse", () {
+    test("parses a simple MIME type", () {
+      var type = new MediaType.parse("text/plain");
+      expect(type.type, equals("text"));
+      expect(type.subtype, equals("plain"));
+    });
+
+    test("allows leading whitespace", () {
+      expect(new MediaType.parse(" text/plain").mimeType, equals("text/plain"));
+      expect(new MediaType.parse("\ttext/plain").mimeType,
+          equals("text/plain"));
+    });
+
+    test("allows trailing whitespace", () {
+      expect(new MediaType.parse("text/plain ").mimeType, equals("text/plain"));
+      expect(new MediaType.parse("text/plain\t").mimeType,
+          equals("text/plain"));
+    });
+
+    test("disallows separators in the MIME type", () {
+      expect(() => new MediaType.parse("te(xt/plain"), throwsFormatException);
+      expect(() => new MediaType.parse("text/pla=in"), throwsFormatException);
+    });
+
+    test("disallows whitespace around the slash", () {
+      expect(() => new MediaType.parse("text /plain"), throwsFormatException);
+      expect(() => new MediaType.parse("text/ plain"), throwsFormatException);
+    });
+
+    test("parses parameters", () {
+      var type = new MediaType.parse("text/plain;foo=bar;baz=bang");
+      expect(type.mimeType, equals("text/plain"));
+      expect(type.parameters, equals({"foo": "bar", "baz": "bang"}));
+    });
+
+    test("allows whitespace around the semicolon", () {
+      var type = new MediaType.parse("text/plain ; foo=bar ; baz=bang");
+      expect(type.mimeType, equals("text/plain"));
+      expect(type.parameters, equals({"foo": "bar", "baz": "bang"}));
+    });
+
+    test("disallows whitespace around the equals", () {
+      expect(() => new MediaType.parse("text/plain; foo =bar"),
+          throwsFormatException);
+      expect(() => new MediaType.parse("text/plain; foo= bar"),
+          throwsFormatException);
+    });
+
+    test("disallows separators in the parameters", () {
+      expect(() => new MediaType.parse("text/plain; fo:o=bar"),
+          throwsFormatException);
+      expect(() => new MediaType.parse("text/plain; foo=b@ar"),
+          throwsFormatException);
+    });
+
+    test("parses quoted parameters", () {
+      var type = new MediaType.parse(
+          'text/plain; foo="bar space"; baz="bang\\\\escape"');
+      expect(type.mimeType, equals("text/plain"));
+      expect(type.parameters, equals({
+        "foo": "bar space",
+        "baz": "bang\\escape"
+      }));
+    });
+  });
+
+  group("change", () {
+    var type;
+    setUp(() {
+      type = new MediaType.parse("text/plain; foo=bar; baz=bang");
+    });
+
+    test("uses the existing fields by default", () {
+      var newType = type.change();
+      expect(newType.type, equals("text"));
+      expect(newType.subtype, equals("plain"));
+      expect(newType.parameters, equals({"foo": "bar", "baz": "bang"}));
+    });
+
+    test("[type] overrides the existing type", () {
+      expect(type.change(type: "new").type, equals("new"));
+    });
+
+    test("[subtype] overrides the existing subtype", () {
+      expect(type.change(subtype: "new").subtype, equals("new"));
+    });
+
+    test("[mimeType] overrides the existing type and subtype", () {
+      var newType = type.change(mimeType: "image/png");
+      expect(newType.type, equals("image"));
+      expect(newType.subtype, equals("png"));
+    });
+
+    test("[parameters] overrides and adds to existing parameters", () {
+      expect(type.change(parameters: {
+        "foo": "zap",
+        "qux": "fblthp"
+      }).parameters, equals({
+        "foo": "zap",
+        "baz": "bang",
+        "qux": "fblthp"
+      }));
+    });
+
+    test("[clearParameters] removes existing parameters", () {
+      expect(type.change(clearParameters: true).parameters, isEmpty);
+    });
+
+    test("[clearParameters] with [parameters] removes before adding", () {
+      var newType = type.change(
+          parameters: {"foo": "zap"},
+          clearParameters: true);
+      expect(newType.parameters, equals({"foo": "zap"}));
+    });
+
+    test("[type] with [mimeType] is illegal", () {
+      expect(() => type.change(type: "new", mimeType: "image/png"),
+          throwsArgumentError);
+    });
+
+    test("[subtype] with [mimeType] is illegal", () {
+      expect(() => type.change(subtype: "new", mimeType: "image/png"),
+          throwsArgumentError);
+    });
+  });
+
+  group("toString", () {
+    test("serializes a simple MIME type", () {
+      expect(new MediaType("text", "plain").toString(), equals("text/plain"));
+    });
+
+    test("serializes a token parameter as a token", () {
+      expect(new MediaType("text", "plain", {"foo": "bar"}).toString(),
+          equals("text/plain; foo=bar"));
+    });
+
+    test("serializes a non-token parameter as a quoted string", () {
+      expect(new MediaType("text", "plain", {"foo": "bar baz"}).toString(),
+          equals('text/plain; foo="bar baz"'));
+    });
+
+    test("escapes a quoted string as necessary", () {
+      expect(new MediaType("text", "plain", {"foo": 'bar"\x7Fbaz'}).toString(),
+          equals('text/plain; foo="bar\\"\\\x7Fbaz"'));
+    });
+
+    test("serializes multiple parameters", () {
+      expect(new MediaType("text", "plain", {
+        "foo": "bar", "baz": "bang"
+      }).toString(), equals("text/plain; foo=bar; baz=bang"));
+    });
+  });
+}
diff --git a/pkg/shelf/test/message_test.dart b/pkg/shelf/test/message_test.dart
new file mode 100644
index 0000000..57f32c4
--- /dev/null
+++ b/pkg/shelf/test/message_test.dart
@@ -0,0 +1,163 @@
+// 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 shelf.message_test;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:shelf/src/message.dart';
+import 'package:unittest/unittest.dart';
+
+class _TestMessage extends Message {
+  _TestMessage(Map<String, String> headers, Stream<List<int>> body)
+      : super(body, headers: headers);
+}
+
+Message _createMessage({Map<String, String> headers, Stream<List<int>> body}) {
+  if (body == null) body = new Stream.fromIterable([]);
+  return new _TestMessage(headers, body);
+}
+
+void main() {
+  group('headers', () {
+    test('message headers are case insensitive', () {
+      var message = _createMessage(headers: {'foo': 'bar'});
+
+      expect(message.headers, containsPair('foo', 'bar'));
+      expect(message.headers, containsPair('Foo', 'bar'));
+      expect(message.headers, containsPair('FOO', 'bar'));
+    });
+
+    test('null header value becomes empty, immutable', () {
+      var message = _createMessage();
+      expect(message.headers, isEmpty);
+      expect(() => message.headers['h1'] = 'value1', throwsUnsupportedError);
+    });
+
+    test('headers are immutable', () {
+      var message = _createMessage(headers: {'h1': 'value1'});
+      expect(() => message.headers['h1'] = 'value1', throwsUnsupportedError);
+      expect(() => message.headers['h1'] = 'value2', throwsUnsupportedError);
+      expect(() => message.headers['h2'] = 'value2', throwsUnsupportedError);
+    });
+  });
+  group("readAsString", () {
+    test("supports a null body", () {
+      var request = _createMessage();
+      expect(request.readAsString(), completion(equals("")));
+    });
+
+    test("supports a Stream<List<int>> body", () {
+      var controller = new StreamController();
+      var request = _createMessage(body: controller.stream);
+      expect(request.readAsString(), completion(equals("hello, world")));
+
+      controller.add([104, 101, 108, 108, 111, 44]);
+      return new Future(() {
+        controller
+          ..add([32, 119, 111, 114, 108, 100])
+          ..close();
+      });
+    });
+
+    test("defaults to UTF-8", () {
+      var request = _createMessage(body: new Stream.fromIterable([[195, 168]]));
+      expect(request.readAsString(), completion(equals("è")));
+    });
+
+    test("the content-type header overrides the default", () {
+      var request = _createMessage(
+          headers: {'content-type': 'text/plain; charset=iso-8859-1'},
+          body: new Stream.fromIterable([[195, 168]]));
+      expect(request.readAsString(), completion(equals("è")));
+    });
+
+    test("an explicit encoding overrides the content-type header", () {
+      var request = _createMessage(
+          headers: {'content-type': 'text/plain; charset=iso-8859-1'},
+          body: new Stream.fromIterable([[195, 168]]));
+      expect(request.readAsString(LATIN1), completion(equals("è")));
+    });
+  });
+
+  group("read", () {
+    test("supports a null body", () {
+      var request = _createMessage();
+      expect(request.read().toList(), completion(isEmpty));
+    });
+
+    test("supports a Stream<List<int>> body", () {
+      var controller = new StreamController();
+      var request = _createMessage(body: controller.stream);
+      expect(request.read().toList(), completion(equals([
+        [104, 101, 108, 108, 111, 44],
+        [32, 119, 111, 114, 108, 100]
+      ])));
+
+      controller.add([104, 101, 108, 108, 111, 44]);
+      return new Future(() {
+        controller
+          ..add([32, 119, 111, 114, 108, 100])
+          ..close();
+      });
+    });
+  });
+
+  group("contentLength", () {
+    test("is null without a content-length header", () {
+      var request = _createMessage();
+      expect(request.contentLength, isNull);
+    });
+
+    test("comes from the content-length header", () {
+      var request = _createMessage(headers: {
+        'content-length': '42'
+      });
+      expect(request.contentLength, 42);
+    });
+  });
+
+  group("mimeType", () {
+    test("is null without a content-type header", () {
+      expect(_createMessage().mimeType, isNull);
+    });
+
+    test("comes from the content-type header", () {
+      expect(_createMessage(headers: {
+        'content-type': 'text/plain'
+      }).mimeType, equals('text/plain'));
+    });
+
+    test("doesn't include parameters", () {
+      expect(_createMessage(headers: {
+        'content-type': 'text/plain; foo=bar; bar=baz'
+      }).mimeType, equals('text/plain'));
+    });
+  });
+
+  group("encoding", () {
+    test("is null without a content-type header", () {
+      expect(_createMessage().encoding, isNull);
+    });
+
+    test("is null without a charset parameter", () {
+      expect(_createMessage(headers: {
+        'content-type': 'text/plain'
+      }).encoding, isNull);
+    });
+
+    test("is null with an unrecognized charset parameter", () {
+      expect(_createMessage(headers: {
+        'content-type': 'text/plain; charset=fblthp'
+      }).encoding, isNull);
+    });
+
+    test("comes from the content-type charset parameter", () {
+      expect(_createMessage(headers: {
+        'content-type': 'text/plain; charset=iso-8859-1'
+      }).encoding, equals(LATIN1));
+    });
+  });
+}
diff --git a/pkg/shelf/test/request_test.dart b/pkg/shelf/test/request_test.dart
new file mode 100644
index 0000000..72a87a6
--- /dev/null
+++ b/pkg/shelf/test/request_test.dart
@@ -0,0 +1,181 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.request_test;
+
+import 'dart:async';
+
+import 'package:shelf/shelf.dart';
+import 'package:unittest/unittest.dart';
+
+import 'test_util.dart';
+
+Request _request([Map<String, String> headers, Stream<List<int>> body]) {
+  return new Request("GET", LOCALHOST_URI, headers: headers, body: body);
+}
+
+void main() {
+  group('constructor', () {
+    test('protocolVersion defaults to "1.1"', () {
+      var request = new Request('GET', LOCALHOST_URI);
+      expect(request.protocolVersion, '1.1');
+    });
+
+    test('provide non-default protocolVersion', () {
+      var request = new Request('GET', LOCALHOST_URI, protocolVersion: '1.0');
+      expect(request.protocolVersion, '1.0');
+    });
+
+    test('requestedUri must be absolute', () {
+      expect(() => new Request('GET', Uri.parse('/path')),
+          throwsArgumentError);
+    });
+
+    test('if uri is null, scriptName must be null', () {
+      expect(() => new Request('GET', Uri.parse('/path'),
+          scriptName: '/script/name'), throwsArgumentError);
+    });
+
+    test('if scriptName is null, uri must be null', () {
+      var relativeUri = new Uri(path: '/cool/beans.html');
+      expect(() => new Request('GET', Uri.parse('/path'),
+          url: relativeUri), throwsArgumentError);
+    });
+
+    test('uri must be relative', () {
+      var relativeUri = Uri.parse('http://localhost/test');
+
+      expect(() => new Request('GET', LOCALHOST_URI,
+          url: relativeUri, scriptName: '/news'),
+          throwsArgumentError);
+
+      // NOTE: explicitly testing fragments due to Issue 18053
+      relativeUri = Uri.parse('http://localhost/test#fragment');
+
+      expect(() => new Request('GET', LOCALHOST_URI,
+          url: relativeUri, scriptName: '/news'),
+          throwsArgumentError);
+    });
+
+    test('uri and scriptName', () {
+      var pathInfo = '/pages/page.html?utm_source=ABC123';
+      var scriptName = '/assets/static';
+      var fullUrl = 'http://localhost/other_path/other_resource.asp';
+      var request = new Request('GET', Uri.parse(fullUrl),
+          url: Uri.parse(pathInfo), scriptName: scriptName);
+
+      expect(request.scriptName, scriptName);
+      expect(request.url.path, '/pages/page.html');
+      expect(request.url.query, 'utm_source=ABC123');
+    });
+
+    test('minimal uri', () {
+      var pathInfo = '/';
+      var scriptName = '/assets/static';
+      var fullUrl = 'http://localhost$scriptName$pathInfo';
+      var request = new Request('GET', Uri.parse(fullUrl),
+          url: Uri.parse(pathInfo), scriptName: scriptName);
+
+      expect(request.scriptName, scriptName);
+      expect(request.url.path, '/');
+      expect(request.url.query, '');
+    });
+
+    test('invalid url', () {
+      var testUrl = 'page';
+      var scriptName = '/assets/static';
+      var fullUrl = 'http://localhost$scriptName$testUrl';
+
+      expect(() => new Request('GET', Uri.parse(fullUrl),
+          url: Uri.parse(testUrl), scriptName: scriptName),
+          throwsArgumentError);
+    });
+
+    test('scriptName with no leading slash', () {
+      var pathInfo = '/page';
+      var scriptName = 'assets/static';
+      var fullUrl = 'http://localhost/assets/static/pages';
+
+      expect(() => new Request('GET',Uri.parse(fullUrl),
+          url: Uri.parse(pathInfo), scriptName: scriptName),
+          throwsArgumentError);
+
+      pathInfo = '/assets/static/page';
+      scriptName = '/';
+      fullUrl = 'http://localhost/assets/static/pages';
+
+      expect(() => new Request('GET',Uri.parse(fullUrl),
+          url: Uri.parse(pathInfo), scriptName: scriptName),
+          throwsArgumentError);
+    });
+
+    test('scriptName that is only a slash', () {
+      var pathInfo = '/assets/static/page';
+      var scriptName = '/';
+      var fullUrl = 'http://localhost/assets/static/pages';
+
+      expect(() => new Request('GET',Uri.parse(fullUrl),
+          url: Uri.parse(pathInfo), scriptName: scriptName),
+          throwsArgumentError);
+    });
+  });
+
+  group("ifModifiedSince", () {
+    test("is null without an If-Modified-Since header", () {
+      var request = _request();
+      expect(request.ifModifiedSince, isNull);
+    });
+
+    test("comes from the Last-Modified header", () {
+      var request = _request({
+        'if-modified-since': 'Sun, 06 Nov 1994 08:49:37 GMT'
+      });
+      expect(request.ifModifiedSince,
+          equals(DateTime.parse("1994-11-06 08:49:37z")));
+    });
+  });
+
+  group("readAsString", () {
+    test("supports a null body", () {
+      var request = _request();
+      expect(request.readAsString(), completion(equals("")));
+    });
+
+    test("supports a Stream<List<int>> body", () {
+      var controller = new StreamController();
+      var request = _request({}, controller.stream);
+      expect(request.readAsString(), completion(equals("hello, world")));
+
+      controller.add([104, 101, 108, 108, 111, 44]);
+      return new Future(() {
+        controller
+          ..add([32, 119, 111, 114, 108, 100])
+          ..close();
+      });
+    });
+  });
+
+  group("read", () {
+    test("supports a null body", () {
+      var request = _request();
+      expect(request.read().toList(), completion(isEmpty));
+    });
+
+    test("supports a Stream<List<int>> body", () {
+      var controller = new StreamController();
+      var request = _request({}, controller.stream);
+      expect(request.read().toList(), completion(equals([
+        [104, 101, 108, 108, 111, 44],
+        [32, 119, 111, 114, 108, 100]
+      ])));
+
+      controller.add([104, 101, 108, 108, 111, 44]);
+      return new Future(() {
+        controller
+          ..add([32, 119, 111, 114, 108, 100])
+          ..close();
+      });
+    });
+  });
+}
diff --git a/pkg/shelf/test/response_test.dart b/pkg/shelf/test/response_test.dart
new file mode 100644
index 0000000..9ee47c5
--- /dev/null
+++ b/pkg/shelf/test/response_test.dart
@@ -0,0 +1,160 @@
+// 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 shelf.response_test;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:shelf/shelf.dart';
+import 'package:unittest/unittest.dart';
+
+void main() {
+  group("readAsString", () {
+    test("supports a null body", () {
+      var response = new Response(200);
+      expect(response.readAsString(), completion(equals("")));
+    });
+
+    test("supports a String body", () {
+      var response = new Response.ok("hello, world");
+      expect(response.readAsString(), completion(equals("hello, world")));
+    });
+
+    test("supports a Stream<List<int>> body", () {
+      var controller = new StreamController();
+      var response = new Response.ok(controller.stream);
+      expect(response.readAsString(), completion(equals("hello, world")));
+
+      controller.add([104, 101, 108, 108, 111, 44]);
+      return new Future(() {
+        controller
+          ..add([32, 119, 111, 114, 108, 100])
+          ..close();
+      });
+    });
+  });
+
+  group("read", () {
+    test("supports a null body", () {
+      var response = new Response(200);
+      expect(response.read().toList(), completion(isEmpty));
+    });
+
+    test("supports a String body", () {
+      var response = new Response.ok("hello, world");
+      expect(response.read().toList(), completion(equals([[
+        104, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100
+      ]])));
+    });
+
+    test("supports a Stream<List<int>> body", () {
+      var controller = new StreamController();
+      var response = new Response.ok(controller.stream);
+      expect(response.read().toList(), completion(equals([
+        [104, 101, 108, 108, 111, 44],
+        [32, 119, 111, 114, 108, 100]
+      ])));
+
+      controller.add([104, 101, 108, 108, 111, 44]);
+      return new Future(() {
+        controller
+          ..add([32, 119, 111, 114, 108, 100])
+          ..close();
+      });
+    });
+  });
+
+  group("new Response", () {
+    test("defaults to encoding a String as UTF-8", () {
+      expect(new Response.ok("è").read().toList(),
+          completion(equals([[195, 168]])));
+    });
+
+    test("uses the explicit encoding if available", () {
+      expect(new Response.ok("è", encoding: LATIN1).read().toList(),
+          completion(equals([[232]])));
+    });
+
+    test("adds an explicit encoding to the content-type", () {
+      var response = new Response.ok("è",
+          encoding: LATIN1,
+          headers: {'content-type': 'text/plain'});
+      expect(response.headers,
+          containsPair('content-type', 'text/plain; charset=iso-8859-1'));
+    });
+
+    test("sets an absent content-type to application/octet-stream in order to "
+        "set the charset", () {
+      var response = new Response.ok("è", encoding: LATIN1);
+      expect(response.headers, containsPair('content-type',
+          'application/octet-stream; charset=iso-8859-1'));
+    });
+
+    test("overwrites an existing charset if given an explicit encoding", () {
+      var response = new Response.ok("è",
+          encoding: LATIN1,
+          headers: {'content-type': 'text/plain; charset=whatever'});
+      expect(response.headers,
+          containsPair('content-type', 'text/plain; charset=iso-8859-1'));
+    });
+  });
+
+  group("new Response.internalServerError without a body", () {
+    test('sets the body to "Internal Server Error"', () {
+      var response = new Response.internalServerError();
+      expect(response.readAsString(),
+          completion(equals("Internal Server Error")));
+    });
+
+    test('sets the content-type header to text/plain', () {
+      var response = new Response.internalServerError();
+      expect(response.headers, containsPair('content-type', 'text/plain'));
+    });
+
+    test('preserves content-type parameters', () {
+      var response = new Response.internalServerError(headers: {
+        'content-type': 'application/octet-stream; param=whatever'
+      });
+      expect(response.headers,
+          containsPair('content-type', 'text/plain; param=whatever'));
+    });
+  });
+
+  group("Response redirect", () {
+    test("sets the location header for a String", () {
+      var response = new Response.found('/foo');
+      expect(response.headers, containsPair('location', '/foo'));
+    });
+
+    test("sets the location header for a Uri", () {
+      var response = new Response.found(new Uri(path: '/foo'));
+      expect(response.headers, containsPair('location', '/foo'));
+    });
+  });
+
+  group("expires", () {
+    test("is null without an Expires header", () {
+      expect(new Response.ok("okay!").expires, isNull);
+    });
+
+    test("comes from the Expires header", () {
+      expect(new Response.ok("okay!", headers: {
+        'expires': 'Sun, 06 Nov 1994 08:49:37 GMT'
+      }).expires, equals(DateTime.parse("1994-11-06 08:49:37z")));
+    });
+  });
+
+  group("lastModified", () {
+    test("is null without a Last-Modified header", () {
+      expect(new Response.ok("okay!").lastModified, isNull);
+    });
+
+    test("comes from the Last-Modified header", () {
+      expect(new Response.ok("okay!", headers: {
+        'last-modified': 'Sun, 06 Nov 1994 08:49:37 GMT'
+      }).lastModified, equals(DateTime.parse("1994-11-06 08:49:37z")));
+    });
+  });
+}
diff --git a/pkg/shelf/test/shelf_io_test.dart b/pkg/shelf/test/shelf_io_test.dart
new file mode 100644
index 0000000..5152a69
--- /dev/null
+++ b/pkg/shelf/test/shelf_io_test.dart
@@ -0,0 +1,222 @@
+// 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 shelf_io_test;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:http/http.dart' as http;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:shelf/shelf.dart';
+import 'package:shelf/shelf_io.dart' as shelf_io;
+
+import 'test_util.dart';
+
+void main() {
+  test('sync handler returns a value to the client', () {
+    _scheduleServer(syncHandler);
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.OK);
+      expect(response.body, 'Hello from /');
+    });
+  });
+
+  test('async handler returns a value to the client', () {
+    _scheduleServer(asyncHandler);
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.OK);
+      expect(response.body, 'Hello from /');
+    });
+  });
+
+  test('sync null response leads to a 500', () {
+    _scheduleServer((request) => null);
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.INTERNAL_SERVER_ERROR);
+      expect(response.body, 'Internal Server Error');
+    });
+  });
+
+  test('async null response leads to a 500', () {
+    _scheduleServer((request) => new Future.value(null));
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.INTERNAL_SERVER_ERROR);
+      expect(response.body, 'Internal Server Error');
+    });
+  });
+
+  test('thrown error leads to a 500', () {
+    _scheduleServer((request) {
+      throw new UnsupportedError('test');
+    });
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.INTERNAL_SERVER_ERROR);
+      expect(response.body, 'Internal Server Error');
+    });
+  });
+
+  test('async error leads to a 500', () {
+    _scheduleServer((request) {
+      return new Future.error('test');
+    });
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.INTERNAL_SERVER_ERROR);
+      expect(response.body, 'Internal Server Error');
+    });
+  });
+
+  test('Request is populated correctly', () {
+    var path = '/foo/bar?qs=value#anchor';
+
+    _scheduleServer((request) {
+      expect(request.contentLength, 0);
+      expect(request.method, 'GET');
+
+      var expectedUrl = 'http://localhost:$_serverPort$path';
+      expect(request.requestedUri, Uri.parse(expectedUrl));
+
+      expect(request.url.path, '/foo/bar');
+      expect(request.url.pathSegments, ['foo', 'bar']);
+      expect(request.protocolVersion, '1.1');
+      expect(request.url.query, 'qs=value');
+      expect(request.scriptName, '');
+
+      return syncHandler(request);
+    });
+
+    return schedule(() => http.get('http://localhost:$_serverPort$path'))
+        .then((response) {
+      expect(response.statusCode, HttpStatus.OK);
+      expect(response.body, 'Hello from /foo/bar');
+    });
+  });
+
+  test('custom response headers are received by the client', () {
+    _scheduleServer((request) {
+      return new Response.ok('Hello from /', headers: {
+        'test-header': 'test-value',
+        'test-list': 'a, b, c'
+      });
+    });
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, HttpStatus.OK);
+      expect(response.headers['test-header'], 'test-value');
+      expect(response.body, 'Hello from /');
+    });
+  });
+
+  test('custom status code is received by the client', () {
+    _scheduleServer((request) {
+      return new Response(299, body: 'Hello from /');
+    });
+
+    return _scheduleGet().then((response) {
+      expect(response.statusCode, 299);
+      expect(response.body, 'Hello from /');
+    });
+  });
+
+  test('custom request headers are received by the handler', () {
+    _scheduleServer((request) {
+      expect(request.headers, containsPair('custom-header', 'client value'));
+
+      // dart:io HttpServer splits multi-value headers into an array
+      // validate that they are combined correctly
+      expect(request.headers, containsPair('multi-header', 'foo,bar,baz'));
+      return syncHandler(request);
+    });
+
+    var headers = {
+      'custom-header': 'client value',
+      'multi-header': 'foo,bar,baz'
+    };
+
+    return _scheduleGet(headers: headers).then((response) {
+      expect(response.statusCode, HttpStatus.OK);
+      expect(response.body, 'Hello from /');
+    });
+  });
+
+  test('post with empty content', () {
+    _scheduleServer((request) {
+      expect(request.mimeType, isNull);
+      expect(request.encoding, isNull);
+      expect(request.method, 'POST');
+      expect(request.contentLength, 0);
+
+      return request.readAsString().then((body) {
+        expect(body, '');
+        return syncHandler(request);
+      });
+    });
+
+    return _schedulePost().then((response) {
+      expect(response.statusCode, HttpStatus.OK);
+      expect(response.stream.bytesToString(), completion('Hello from /'));
+    });
+  });
+
+  test('post with request content', () {
+    _scheduleServer((request) {
+      expect(request.mimeType, 'text/plain');
+      expect(request.encoding, UTF8);
+      expect(request.method, 'POST');
+      expect(request.contentLength, 9);
+
+      return request.readAsString().then((body) {
+        expect(body, 'test body');
+        return syncHandler(request);
+      });
+    });
+
+    return _schedulePost(body: 'test body').then((response) {
+      expect(response.statusCode, HttpStatus.OK);
+      expect(response.stream.bytesToString(), completion('Hello from /'));
+    });
+  });
+}
+
+int _serverPort;
+
+Future _scheduleServer(Handler handler) {
+  return schedule(() => shelf_io.serve(handler, 'localhost', 0).then((server) {
+    currentSchedule.onComplete.schedule(() {
+      _serverPort = null;
+      return server.close(force: true);
+    });
+
+    _serverPort = server.port;
+  }));
+}
+
+Future<http.Response> _scheduleGet({Map<String, String> headers}) {
+  if (headers == null) headers = {};
+
+  return schedule(() =>
+      http.get('http://localhost:$_serverPort/', headers: headers));
+}
+
+Future<http.StreamedResponse> _schedulePost({Map<String, String> headers,
+    String body}) {
+
+  return schedule(() {
+
+    var request = new http.Request('POST',
+        Uri.parse('http://localhost:$_serverPort/'));
+
+    if (headers != null) request.headers.addAll(headers);
+    if (body != null) request.body = body;
+
+    return request.send();
+  });
+}
diff --git a/pkg/shelf/test/stack_test.dart b/pkg/shelf/test/stack_test.dart
new file mode 100644
index 0000000..8ff29d6
--- /dev/null
+++ b/pkg/shelf/test/stack_test.dart
@@ -0,0 +1,91 @@
+// 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 shelf.shelf_stack_test;
+
+import 'package:shelf/shelf.dart';
+import 'package:unittest/unittest.dart';
+
+import 'test_util.dart';
+
+void main() {
+  test('compose middleware with Stack', () {
+    int accessLocation = 0;
+
+    var middlewareA = createMiddleware(requestHandler: (request) {
+      expect(accessLocation, 0);
+      accessLocation = 1;
+      return null;
+    }, responseHandler: (response) {
+      expect(accessLocation, 4);
+      accessLocation = 5;
+      return response;
+    });
+
+    var middlewareB = createMiddleware(requestHandler: (request) {
+      expect(accessLocation, 1);
+      accessLocation = 2;
+      return null;
+    }, responseHandler: (response) {
+      expect(accessLocation, 3);
+      accessLocation = 4;
+      return response;
+    });
+
+    var handler = const Stack()
+        .addMiddleware(middlewareA)
+        .addMiddleware(middlewareB)
+        .addHandler((request) {
+      expect(accessLocation, 2);
+      accessLocation = 3;
+      return syncHandler(request);
+    });
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(response, isNotNull);
+      expect(accessLocation, 5);
+    });
+  });
+
+  test('Stack can be used as middleware', () {
+    int accessLocation = 0;
+
+    var middlewareA = createMiddleware(requestHandler: (request) {
+      expect(accessLocation, 0);
+      accessLocation = 1;
+      return null;
+    }, responseHandler: (response) {
+      expect(accessLocation, 4);
+      accessLocation = 5;
+      return response;
+    });
+
+    var middlewareB = createMiddleware(requestHandler: (request) {
+      expect(accessLocation, 1);
+      accessLocation = 2;
+      return null;
+    }, responseHandler: (response) {
+      expect(accessLocation, 3);
+      accessLocation = 4;
+      return response;
+    });
+
+    var innerStack = const Stack()
+        .addMiddleware(middlewareA)
+        .addMiddleware(middlewareB);
+
+    var handler = const Stack()
+        .addMiddleware(innerStack.middleware)
+        .addHandler((request) {
+      expect(accessLocation, 2);
+      accessLocation = 3;
+      return syncHandler(request);
+    });
+
+    return makeSimpleRequest(handler).then((response) {
+      expect(response, isNotNull);
+      expect(accessLocation, 5);
+    });
+  });
+}
diff --git a/pkg/shelf/test/string_scanner_test.dart b/pkg/shelf/test/string_scanner_test.dart
new file mode 100644
index 0000000..4d3d259
--- /dev/null
+++ b/pkg/shelf/test/string_scanner_test.dart
@@ -0,0 +1,266 @@
+// 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 shelf.string_scanner_test;
+
+import 'package:shelf/src/string_scanner.dart';
+import 'package:unittest/unittest.dart';
+
+void main() {
+  group('with an empty string', () {
+    var scanner;
+    setUp(() {
+      scanner = new StringScanner('');
+    });
+
+    test('is done', () {
+      expect(scanner.isDone, isTrue);
+    });
+
+    test('rest is empty', () {
+      expect(scanner.rest, isEmpty);
+    });
+
+    test('lastMatch is null', () {
+      expect(scanner.lastMatch, isNull);
+    });
+
+    test('position is zero', () {
+      expect(scanner.position, equals(0));
+    });
+
+    test("scan returns false and doesn't change the state", () {
+      expect(scanner.scan(new RegExp('.')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test("expect throws a FormatException and doesn't change the state", () {
+      expect(() => scanner.expect(new RegExp('.'), 'error'),
+          throwsFormatException);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test("matches returns false and doesn't change the state", () {
+      expect(scanner.matches(new RegExp('.')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test('setting position to 1 throws an ArgumentError', () {
+      expect(() {
+        scanner.position = 1;
+      }, throwsArgumentError);
+    });
+
+    test('setting position to -1 throws an ArgumentError', () {
+      expect(() {
+        scanner.position = -1;
+      }, throwsArgumentError);
+    });
+  });
+
+  group('at the beginning of a string', () {
+    var scanner;
+    setUp(() {
+      scanner = new StringScanner('foo bar');
+    });
+
+    test('is not done', () {
+      expect(scanner.isDone, isFalse);
+    });
+
+    test('rest is the whole string', () {
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test('lastMatch is null', () {
+      expect(scanner.lastMatch, isNull);
+    });
+
+    test('position is zero', () {
+      expect(scanner.position, equals(0));
+    });
+
+    test("a matching scan returns true and changes the state", () {
+      expect(scanner.scan(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch[1], equals('oo'));
+      expect(scanner.position, equals(3));
+      expect(scanner.rest, equals(' bar'));
+    });
+
+    test("a non-matching scan returns false and sets lastMatch to null", () {
+      expect(scanner.matches(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch, isNotNull);
+
+      expect(scanner.scan(new RegExp('b(..)')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test("a matching expect changes the state", () {
+      scanner.expect(new RegExp('f(..)'), 'error');
+      expect(scanner.lastMatch[1], equals('oo'));
+      expect(scanner.position, equals(3));
+      expect(scanner.rest, equals(' bar'));
+    });
+
+    test("a non-matching expect throws a FormatException and sets lastMatch to "
+        "null", () {
+      expect(scanner.matches(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch, isNotNull);
+
+      expect(() => scanner.expect(new RegExp('b(..)'), 'error'),
+          throwsFormatException);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test("a matching matches returns true and only changes lastMatch", () {
+      expect(scanner.matches(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch[1], equals('oo'));
+      expect(scanner.position, equals(0));
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test("a non-matching matches returns false and doesn't change the state",
+        () {
+      expect(scanner.matches(new RegExp('b(..)')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test('setting position to 1 moves the cursor forward', () {
+      scanner.position = 1;
+      expect(scanner.position, equals(1));
+      expect(scanner.rest, equals('oo bar'));
+
+      expect(scanner.scan(new RegExp('oo.')), isTrue);
+      expect(scanner.lastMatch[0], equals('oo '));
+      expect(scanner.position, equals(4));
+      expect(scanner.rest, equals('bar'));
+    });
+
+    test('setting position beyond the string throws an ArgumentError', () {
+      expect(() {
+        scanner.position = 8;
+      }, throwsArgumentError);
+    });
+
+    test('setting position to -1 throws an ArgumentError', () {
+      expect(() {
+        scanner.position = -1;
+      }, throwsArgumentError);
+    });
+
+    test('scan accepts any Pattern', () {
+      expect(scanner.scan('foo'), isTrue);
+      expect(scanner.lastMatch[0], equals('foo'));
+      expect(scanner.position, equals(3));
+      expect(scanner.rest, equals(' bar'));
+    });
+
+    test('scans multiple times', () {
+      expect(scanner.scan(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch[1], equals('oo'));
+      expect(scanner.position, equals(3));
+      expect(scanner.rest, equals(' bar'));
+
+      expect(scanner.scan(new RegExp(' b(..)')), isTrue);
+      expect(scanner.lastMatch[1], equals('ar'));
+      expect(scanner.position, equals(7));
+      expect(scanner.rest, equals(''));
+      expect(scanner.isDone, isTrue);
+    });
+  });
+
+  group('at the end of a string', () {
+    var scanner;
+    setUp(() {
+      scanner = new StringScanner('foo bar');
+      expect(scanner.scan('foo bar'), isTrue);
+    });
+
+    test('is done', () {
+      expect(scanner.isDone, isTrue);
+    });
+
+    test('rest is empty', () {
+      expect(scanner.rest, isEmpty);
+    });
+
+    test('position is zero', () {
+      expect(scanner.position, equals(7));
+    });
+
+    test("scan returns false and sets lastMatch to null", () {
+      expect(scanner.scan(new RegExp('.')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(7));
+    });
+
+    test("expect throws a FormatException and sets lastMatch to null", () {
+      expect(() => scanner.expect(new RegExp('.'), 'error'),
+          throwsFormatException);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(7));
+    });
+
+    test("matches returns false sets lastMatch to null", () {
+      expect(scanner.matches(new RegExp('.')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(7));
+    });
+
+    test('setting position to 1 moves the cursor backward', () {
+      scanner.position = 1;
+      expect(scanner.position, equals(1));
+      expect(scanner.rest, equals('oo bar'));
+
+      expect(scanner.scan(new RegExp('oo.')), isTrue);
+      expect(scanner.lastMatch[0], equals('oo '));
+      expect(scanner.position, equals(4));
+      expect(scanner.rest, equals('bar'));
+    });
+
+    test('setting position beyond the string throws an ArgumentError', () {
+      expect(() {
+        scanner.position = 8;
+      }, throwsArgumentError);
+    });
+
+    test('setting position to -1 throws an ArgumentError', () {
+      expect(() {
+        scanner.position = -1;
+      }, throwsArgumentError);
+    });
+  });
+
+  group('a scanner constructed with a custom position', () {
+    test('starts scanning from that position', () {
+      var scanner = new StringScanner('foo bar', position: 1);
+      expect(scanner.position, equals(1));
+      expect(scanner.rest, equals('oo bar'));
+
+      expect(scanner.scan(new RegExp('oo.')), isTrue);
+      expect(scanner.lastMatch[0], equals('oo '));
+      expect(scanner.position, equals(4));
+      expect(scanner.rest, equals('bar'));
+    });
+
+    test('throws an ArgumentError if the position is -1', () {
+      expect(() => new StringScanner('foo bar', position: -1),
+          throwsArgumentError);
+    });
+
+    test('throws an ArgumentError if the position is beyond the string', () {
+      expect(() => new StringScanner('foo bar', position: 8),
+          throwsArgumentError);
+    });
+  });
+}
diff --git a/pkg/shelf/test/test_util.dart b/pkg/shelf/test/test_util.dart
new file mode 100644
index 0000000..10afe99
--- /dev/null
+++ b/pkg/shelf/test/test_util.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.test_util;
+
+import 'dart:async';
+
+import 'package:shelf/shelf.dart';
+import 'package:shelf/src/util.dart';
+
+/// A simple, synchronous handler for [Request].
+///
+/// By default, replies with a status code 200, empty headers, and
+/// `Hello from ${request.url.path}`.
+Response syncHandler(Request request, {int statusCode,
+    Map<String, String> headers}) {
+  if (statusCode == null) statusCode = 200;
+  return new Response(statusCode, headers: headers,
+      body: 'Hello from ${request.url.path}');
+}
+
+/// Calls [syncHandler] and wraps the response in a [Future].
+Future<Response> asyncHandler(Request request) =>
+    new Future(() => syncHandler(request));
+
+/// Makes a simple GET request to [handler] and returns the result.
+Future<Response> makeSimpleRequest(Handler handler) =>
+    syncFuture(() => handler(_request));
+
+final _request = new Request('GET', LOCALHOST_URI);
+
+final LOCALHOST_URI = Uri.parse('http://localhost/');
diff --git a/pkg/shelf/tool/hop_runner.dart b/pkg/shelf/tool/hop_runner.dart
new file mode 100644
index 0000000..77783f9
--- /dev/null
+++ b/pkg/shelf/tool/hop_runner.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library shelf.hop_runner;
+
+import 'dart:async';
+import 'dart:io';
+import 'package:hop/hop.dart';
+import 'package:hop/hop_tasks.dart';
+import 'package:hop_docgen/hop_docgen.dart';
+import '../test/harness_console.dart' as test_console;
+
+void main(List<String> args) {
+  addTask('test', createUnitTestTask(test_console.main));
+
+  //
+  // Analyzer
+  //
+  addTask('analyze_libs', createAnalyzerTask(_getLibs));
+
+  addTask('docs', createDocGenTask('../compiled_dartdoc_viewer'));
+
+  runHop(args);
+}
+
+Future<List<String>> _getLibs() {
+  return new Directory('lib').list()
+      .where((FileSystemEntity fse) => fse is File)
+      .map((File file) => file.path)
+      .toList();
+}
diff --git a/pkg/smoke/lib/codegen/generator.dart b/pkg/smoke/lib/codegen/generator.dart
index 42c5455..920462d 100644
--- a/pkg/smoke/lib/codegen/generator.dart
+++ b/pkg/smoke/lib/codegen/generator.dart
@@ -182,10 +182,11 @@
     var args = {};
 
     if (_getters.isNotEmpty) {
-      args['getters'] = _getters.map((n) => '#$n: (o) => o.$n');
+      args['getters'] = _getters.map((n) => '${_symbol(n)}: (o) => o.$n');
     }
     if (_setters.isNotEmpty) {
-      args['setters'] = _setters.map((n) => '#$n: (o, v) { o.$n = v; }');
+      args['setters'] = _setters.map(
+          (n) => '${_symbol(n)}: (o, v) { o.$n = v; }');
     }
 
     if (_parents.isNotEmpty) {
@@ -210,7 +211,7 @@
           sb.write('{\n');
           members.forEach((name, decl) {
             var decl = members[name].asCode(_libraryPrefix);
-            sb.write('$spaces        #$name: $decl,\n');
+            sb.write('$spaces        ${_symbol(name)}: $decl,\n');
           });
           sb.write('$spaces      }');
         }
@@ -231,7 +232,7 @@
         } else {
           sb.write('{\n');
           for (var name in members) {
-            sb.write('$spaces        #$name: $className.$name,\n');
+            sb.write('$spaces        ${_symbol(name)}: $className.$name,\n');
           }
           sb.write('$spaces      }');
         }
@@ -241,7 +242,7 @@
     }
 
     if (_names.isNotEmpty) {
-      args['names'] = _names.map((n) => "#$n: r'$n'");
+      args['names'] = _names.map((n) => "${_symbol(n)}: r'$n'");
     }
 
     buffer..write(spaces)
@@ -285,7 +286,8 @@
 
   String asCode(Map<String, String> libraryPrefixes) {
     var sb = new StringBuffer();
-    sb.write("const Declaration(#$name, ${type.asCode(libraryPrefixes)}");
+    sb.write('const Declaration(${_symbol(name)}, '
+        '${type.asCode(libraryPrefixes)}');
     if (kind != 'FIELD') sb.write(', kind: $kind');
     if (isFinal) sb.write(', isFinal: true');
     if (isStatic) sb.write(', isStatic: true');
@@ -455,3 +457,6 @@
     "import 'package:smoke/static.dart' show "
         "useGeneratedCode, StaticConfiguration;",
   ];
+
+_symbol(String name) =>
+   name.contains('[') ? "const Symbol('$name')" : '#$name';
diff --git a/pkg/smoke/lib/mirrors.dart b/pkg/smoke/lib/mirrors.dart
index d30baa2..87071c9 100644
--- a/pkg/smoke/lib/mirrors.dart
+++ b/pkg/smoke/lib/mirrors.dart
@@ -24,15 +24,7 @@
 
 /// Implements [ObjectAccessorService] using mirrors.
 class ReflectiveObjectAccessorService implements ObjectAccessorService {
-  read(Object object, Symbol name) {
-    var decl = getDeclaration(object.runtimeType, name);
-    if (decl != null && decl.isMethod) {
-      // TODO(sigmund,jmesserly): remove this once dartbug.com/13002 is fixed.
-      return new _MethodClosure(object, name);
-    } else {
-      return reflect(object).getField(name).reflectee;
-    }
-  }
+  read(Object object, Symbol name) => reflect(object).getField(name).reflectee;
 
   void write(Object object, Symbol name, value) {
     reflect(object).setField(name, value);
@@ -218,7 +210,18 @@
 
 ClassMirror _safeSuperclass(ClassMirror type) {
   try {
-    return type.superclass;
+    var t = type.superclass;
+    // TODO(sigmund): workaround for darbug.com/17779.
+    // Interceptor is leaked by dart2js. It has the same methods as Object
+    // (including noSuchMethod), and our code above assumes that it doesn't
+    // exist. Most queries exclude Object, so they should exclude Interceptor
+    // too. We don't check for t.simpleName == #Interceptor because depending on
+    // dart2js optimizations it may be #Interceptor or #num/Interceptor.
+    // Checking for a private library seems to reliably filter this out.
+    if (t != null && t.owner != null && t.owner.isPrivate) {
+      t = _objectType;
+    }
+    return t;
   } on UnsupportedError catch (e) {
     // Note: dart2js throws UnsupportedError when the type is not reflectable.
     return _objectType;
@@ -315,24 +318,3 @@
       ..write(annotations)
       ..write(')')).toString();
 }
-
-class _MethodClosure extends Function {
-  final receiver;
-  final Symbol methodName;
-
-  _MethodClosure(this.receiver, this.methodName);
-
-  // Technically we could just use noSuchMethod to implement [call], but we
-  // don't for 3 reasons:
-  //   * noSuchMethod makes the code a lot bigger.
-  //   * even with noSuchMethod, an analyzer bug requires to declare [call] (see
-  //     dartbug.com/16078).
-  //   * having [call] also allows `is` checks to work for functions of 0
-  //     through 3 arguments.  We depend on this in
-  //     `polymer_expressions/lib/eval.dart` to check whether a function is a
-  //     filter (takes a single argument). (Note that it's possible to include
-  //     both [call] and [noSuchMethod], which would make instance-of checks
-  //     work with the signature of [call], but will allow invoking the function
-  //     using [noSuchMethod].
-  call([a, b, c]) => invoke(receiver, methodName, [a, b, c], adjust: true);
-}
diff --git a/pkg/smoke/lib/src/default_transformer.dart b/pkg/smoke/lib/src/default_transformer.dart
index 49962a9..2a7d9ec 100644
--- a/pkg/smoke/lib/src/default_transformer.dart
+++ b/pkg/smoke/lib/src/default_transformer.dart
@@ -17,9 +17,13 @@
   DefaultTransformer.asPlugin();
 
   /// Only apply to `lib/src/implementation.dart`.
-  Future<bool> isPrimary(Asset input) => new Future.value(
-      input.id.package == 'smoke' &&
-      input.id.path == 'lib/src/implementation.dart');
+  // TODO(nweiz): This should just take an AssetId when barback <0.13.0 support
+  // is dropped.
+  Future<bool> isPrimary(idOrAsset) {
+    var id = idOrAsset is AssetId ? idOrAsset : idOrAsset.id;
+    return new Future.value(
+        id.package == 'smoke' && id.path == 'lib/src/implementation.dart');
+  }
 
   Future apply(Transform transform) {
     var id = transform.primaryInput.id;
diff --git a/pkg/smoke/pubspec.yaml b/pkg/smoke/pubspec.yaml
index f6da7d8..96c398d 100644
--- a/pkg/smoke/pubspec.yaml
+++ b/pkg/smoke/pubspec.yaml
@@ -1,5 +1,5 @@
 name: smoke
-version: 0.1.0-pre.2.dev
+version: 0.1.0-pre.3.dev
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: "https://api.dartlang.org/apidocs/channels/be/#smoke"
 description: >
@@ -7,18 +7,16 @@
   can be replaced with non-reflective calls using code generation. See README.md
   for mode details.
 dependencies:
-  barback: ">=0.9.0 <0.12.0"
+  barback: ">=0.9.0 <0.14.0"
   logging: ">=0.9.0 <0.10.0"
-# TODO(sigmund): uncomment this once we have some easier way to do global
-# app-level transformers or a way to enable this selectively from the
-# application package.
-#transformers:
-#- smoke/src/default_transformer:
-#    # TODO(sigmund): include this once this feature is available in the stable
-#    # channel, or when we really need some other feature in the dev channel.
-#    $include: lib/src/implementation.dart
+# 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.
+transformers:
+- smoke/src/default_transformer:
+    $include: lib/src/implementation.dart
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
   path: ">=1.0.0 <2.0.0"
 environment:
-  sdk: ">=1.2.0 <2.0.0"
+  sdk: ">=1.3.0-dev.7.9 <2.0.0"
diff --git a/pkg/smoke/test/codegen/generator_test.dart b/pkg/smoke/test/codegen/generator_test.dart
index b646cd6..ca8b000 100644
--- a/pkg/smoke/test/codegen/generator_test.dart
+++ b/pkg/smoke/test/codegen/generator_test.dart
@@ -112,6 +112,10 @@
         new TypeIdentifier('dart:core', 'Function'), isMethod: true,
         annotations: [new ConstExpression.constructor(null, 'Annotation',
           [new ConstExpression.string("hi")], const {})]);
+    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), '[]',
+        new TypeIdentifier('dart:core', 'Function'), isMethod: true);
+    var symbol = "const Symbol('[]')";
+    var details = "$symbol, Function, kind: METHOD";
     checkResults(generator,
         imports: ["import 'a.dart' as smoke_0;"],
         initCall:
@@ -119,6 +123,7 @@
             '    checkedMode: false,\n'
             '    declarations: {\n'
             '      smoke_0.A: {\n'
+            '        $symbol: const Declaration($details),\n'
             '        #bar: const Declaration(#bar, Function, kind: METHOD, '
                            'annotations: const [const Annotation(\'hi\')]),\n'
             '        #foo: const Declaration(#foo, int, isFinal: true),\n'
diff --git a/pkg/smoke/test/common.dart b/pkg/smoke/test/common.dart
index 13a8ebb..eaffd25 100644
--- a/pkg/smoke/test/common.dart
+++ b/pkg/smoke/test/common.dart
@@ -122,6 +122,7 @@
     expect(smoke.hasNoSuchMethod(A), isFalse);
     expect(smoke.hasNoSuchMethod(E), isTrue);
     expect(smoke.hasNoSuchMethod(E2), isTrue);
+    expect(smoke.hasNoSuchMethod(int), isFalse);
   });
 
   test('has instance method', () {
diff --git a/pkg/json/LICENSE b/pkg/string_scanner/LICENSE
similarity index 100%
copy from pkg/json/LICENSE
copy to pkg/string_scanner/LICENSE
diff --git a/pkg/string_scanner/README.md b/pkg/string_scanner/README.md
new file mode 100644
index 0000000..90660fc
--- /dev/null
+++ b/pkg/string_scanner/README.md
@@ -0,0 +1,37 @@
+This package exposes a `StringScanner` type that makes it easy to parse a string
+using a series of `Pattern`s. For example:
+
+```dart
+import 'dart:math';
+
+import 'package:string_scanner/string_scanner.dart';
+
+num parseNumber(String source) {
+  // Scan a number ("1", "1.5", "-3").
+  var scanner = new StringScanner(source);
+
+  // [Scanner.scan] tries to consume a [Pattern] and returns whether or not it
+  // succeeded. It will move the scan pointer past the end of the pattern.
+  var negative = scanner.scan("-");
+
+  // [Scanner.expect] consumes a [Pattern] and throws a [FormatError] if it
+  // fails. Like [Scanner.scan], it will move the scan pointer forward.
+  scanner.expect(new RegExp(r"\d+"));
+
+  // [Scanner.lastMatch] holds the [MatchData] for the most recent call to
+  // [Scanner.scan], [Scanner.expect], or [Scanner.matches].
+  var number = int.parse(scanner.lastMatch[0]);
+
+  if (scanner.scan(".")) {
+    scanner.expect(new RegExp(r"\d+"));
+    var decimal = scanner.lastMatch[0];
+    number += int.parse(decimal) / math.pow(10, decimal.length);
+  }
+
+  // [Scanner.expectDone] will throw a [FormatError] if there's any input that
+  // hasn't yet been consumed.
+  scanner.expectDone();
+
+  return (negative ? -1 : 1) * number;
+}
+```
diff --git a/pkg/string_scanner/lib/string_scanner.dart b/pkg/string_scanner/lib/string_scanner.dart
new file mode 100644
index 0000000..3e3913b
--- /dev/null
+++ b/pkg/string_scanner/lib/string_scanner.dart
@@ -0,0 +1,169 @@
+// 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.
+
+/// A library for parsing strings using a sequence of patterns.
+library string_scanner;
+
+import 'dart:math' as math;
+
+/// When compiled to JS, forward slashes are always escaped in [RegExp.pattern].
+///
+/// See issue 17998.
+final _slashAutoEscape = new RegExp("/").pattern == "\\/";
+
+// TODO(nweiz): Add some integration between this and source maps.
+/// A class that scans through a string using [Pattern]s.
+class StringScanner {
+  /// The string being scanned through.
+  final String string;
+
+  /// The current position of the scanner in the string, in characters.
+  int get position => _position;
+  set position(int position) {
+    if (position < 0 || position > string.length) {
+      throw new ArgumentError("Invalid position $position");
+    }
+
+    _position = position;
+  }
+  int _position = 0;
+
+  /// The data about the previous match made by the scanner.
+  ///
+  /// If the last match failed, this will be `null`.
+  Match get lastMatch => _lastMatch;
+  Match _lastMatch;
+
+  /// The portion of the string that hasn't yet been scanned.
+  String get rest => string.substring(position);
+
+  /// Whether the scanner has completely consumed [string].
+  bool get isDone => position == string.length;
+
+  /// Creates a new [StringScanner] that starts scanning from [position].
+  ///
+  /// [position] defaults to 0, the beginning of the string.
+  StringScanner(this.string, {int position}) {
+    if (position != null) this.position = position;
+  }
+
+  /// If [pattern] matches at the current position of the string, scans forward
+  /// until the end of the match.
+  ///
+  /// Returns whether or not [pattern] matched.
+  bool scan(Pattern pattern) {
+    var success = matches(pattern);
+    if (success) _position = _lastMatch.end;
+    return success;
+  }
+
+  /// If [pattern] matches at the current position of the string, scans forward
+  /// until the end of the match.
+  ///
+  /// If [pattern] did not match, throws a [FormatException] describing the
+  /// position of the failure. [name] is used in this error as the expected name
+  /// of the pattern being matched; if it's `null`, the pattern itself is used
+  /// instead.
+  void expect(Pattern pattern, {String name}) {
+    if (scan(pattern)) return;
+
+    if (name == null) {
+      if (pattern is RegExp) {
+        var source = pattern.pattern;
+        if (!_slashAutoEscape) source = source.replaceAll("/", "\\/");
+        name = "/$source/";
+      } else {
+        name = pattern.toString()
+            .replaceAll("\\", "\\\\").replaceAll('"', '\\"');
+        name = '"$name"';
+      }
+    }
+    _fail(name);
+  }
+
+  /// If the string has not been fully consumed, this throws a
+  /// [FormatException].
+  void expectDone() {
+    if (isDone) return;
+    _fail("no more input");
+  }
+
+  /// Returns whether or not [pattern] matches at the current position of the
+  /// string.
+  ///
+  /// This doesn't move the scan pointer forward.
+  bool matches(Pattern pattern) {
+    _lastMatch = pattern.matchAsPrefix(string, position);
+    return _lastMatch != null;
+  }
+
+  /// Throws a [FormatException] with [message] as well as a detailed
+  /// description of the location of the error in the string.
+  ///
+  /// [match] is the match information for the span of the string with which the
+  /// error is associated. This should be a match returned by this scanner's
+  /// [lastMatch] property. By default, the error is associated with the last
+  /// match.
+  ///
+  /// If [position] and/or [length] are passed, they are used as the error span
+  /// instead. If only [length] is passed, [position] defaults to the current
+  /// position; if only [position] is passed, [length] defaults to 1.
+  ///
+  /// It's an error to pass [match] at the same time as [position] or [length].
+  void error(String message, {Match match, int position, int length}) {
+    if (match != null && (position != null || length != null)) {
+      throw new ArgumentError("Can't pass both match and position/length.");
+    }
+
+    if (position != null && position < 0) {
+      throw new RangeError("position must be greater than or equal to 0.");
+    }
+
+    if (length != null && length < 1) {
+      throw new RangeError("length must be greater than or equal to 0.");
+    }
+
+    if (match == null && position == null && length == null) match = lastMatch;
+    if (position == null) {
+      position = match == null ? this.position : match.start;
+    }
+    if (length == null) length = match == null ? 1 : match.end - match.start;
+
+    var newlines = "\n".allMatches(string.substring(0, position)).toList();
+    var line = newlines.length + 1;
+    var column;
+    var lastLine;
+    if (newlines.isEmpty) {
+      column = position + 1;
+      lastLine = string.substring(0, position);
+    } else {
+      column = position - newlines.last.end + 1;
+      lastLine = string.substring(newlines.last.end, position);
+    }
+
+    var remaining = string.substring(position);
+    var nextNewline = remaining.indexOf("\n");
+    if (nextNewline == -1) {
+      lastLine += remaining;
+    } else {
+      length = math.min(length, nextNewline);
+      lastLine += remaining.substring(0, nextNewline);
+    }
+
+    var spaces = new List.filled(column - 1, ' ').join();
+    var underline = new List.filled(length, '^').join();
+
+    throw new FormatException(
+        "Error on line $line, column $column: $message\n"
+        "$lastLine\n"
+        "$spaces$underline");
+  }
+
+  // TODO(nweiz): Make this handle long lines more gracefully.
+  /// Throws a [FormatException] describing that [name] is expected at the
+  /// current position in the string.
+  void _fail(String name) {
+    error("expected $name.", position: this.position, length: 1);
+  }
+}
diff --git a/pkg/string_scanner/pubspec.yaml b/pkg/string_scanner/pubspec.yaml
new file mode 100644
index 0000000..3035901
--- /dev/null
+++ b/pkg/string_scanner/pubspec.yaml
@@ -0,0 +1,10 @@
+name: string_scanner
+version: 0.0.1
+author: "Dart Team <misc@dartlang.org>"
+homepage: http://www.dartlang.org
+description: >
+  A class for parsing strings using a sequence of patterns.
+dev_dependencies:
+  unittest: ">=0.10.0 <0.11.0"
+environment:
+  sdk: ">=1.2.0 <2.0.0"
diff --git a/pkg/string_scanner/test/error_format_test.dart b/pkg/string_scanner/test/error_format_test.dart
new file mode 100644
index 0000000..1187344
--- /dev/null
+++ b/pkg/string_scanner/test/error_format_test.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.error_format_test;
+
+import 'package:string_scanner/string_scanner.dart';
+import 'package:unittest/unittest.dart';
+
+void main() {
+  test('points to the first unconsumed character', () {
+    var scanner = new StringScanner('foo bar baz');
+    scanner.expect('foo ');
+    expect(() => scanner.expect('foo'), throwsFormattedError('''
+Expected "foo" on line 1, column 5.
+foo bar baz
+    ^'''));
+  });
+
+  test('prints the correct line', () {
+    var scanner = new StringScanner('foo bar baz\ndo re mi\nearth fire water');
+    scanner.expect('foo bar baz\ndo ');
+    expect(() => scanner.expect('foo'), throwsFormattedError('''
+Expected "foo" on line 2, column 4.
+do re mi
+   ^'''));
+  });
+
+  test('handles the beginning of the string correctly', () {
+    var scanner = new StringScanner('foo bar baz');
+    expect(() => scanner.expect('zap'), throwsFormattedError('''
+Expected "zap" on line 1, column 1.
+foo bar baz
+^'''));
+  });
+
+  test('handles the end of the string correctly', () {
+    var scanner = new StringScanner('foo bar baz');
+    scanner.expect('foo bar baz');
+    expect(() => scanner.expect('bang'), throwsFormattedError('''
+Expected "bang" on line 1, column 12.
+foo bar baz
+           ^'''));
+  });
+
+  test('handles an empty string correctly', () {
+    expect(() => new StringScanner('').expect('foo'), throwsFormattedError('''
+Expected "foo" on line 1, column 1.
+
+^'''));
+  });
+
+  group("expected name", () {
+    test("uses the provided name", () {
+      expect(() => new StringScanner('').expect('foo bar', name: 'zap'),
+          throwsFormattedError('''
+Expected zap on line 1, column 1.
+
+^'''));
+    });
+
+    test("escapes string quotes", () {
+      expect(() => new StringScanner('').expect('foo"bar'),
+          throwsFormattedError('''
+Expected "foo\\"bar" on line 1, column 1.
+
+^'''));
+    });
+
+    test("escapes string backslashes", () {
+      expect(() => new StringScanner('').expect('foo\\bar'),
+          throwsFormattedError('''
+Expected "foo\\\\bar" on line 1, column 1.
+
+^'''));
+    });
+
+    test("prints PERL-style regexps", () {
+      expect(() => new StringScanner('').expect(new RegExp(r'foo')),
+          throwsFormattedError('''
+Expected /foo/ on line 1, column 1.
+
+^'''));
+    });
+
+    test("escape regexp forward slashes", () {
+      expect(() => new StringScanner('').expect(new RegExp(r'foo/bar')),
+          throwsFormattedError('''
+Expected /foo\\/bar/ on line 1, column 1.
+
+^'''));
+    });
+
+    test("does not escape regexp backslashes", () {
+      expect(() => new StringScanner('').expect(new RegExp(r'foo\bar')),
+          throwsFormattedError('''
+Expected /foo\\bar/ on line 1, column 1.
+
+^'''));
+    });
+  });
+}
+
+Matcher throwsFormattedError(String format) {
+  return throwsA(predicate((error) {
+    expect(error, isFormatException);
+    expect(error.message, equals(format));
+    return true;
+  }));
+}
diff --git a/pkg/string_scanner/test/error_test.dart b/pkg/string_scanner/test/error_test.dart
new file mode 100644
index 0000000..6432197
--- /dev/null
+++ b/pkg/string_scanner/test/error_test.dart
@@ -0,0 +1,168 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.error_test;
+
+import 'package:string_scanner/string_scanner.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+void main() {
+  test('defaults to the last match', () {
+    var scanner = new StringScanner('foo bar baz');
+    scanner.expect('foo ');
+    scanner.expect('bar');
+    expect(() => scanner.error('oh no!'), throwsFormattedError('''
+Error on line 1, column 5: oh no!
+foo bar baz
+    ^^^'''));
+  });
+
+  group("with match", () {
+    test('supports an earlier match', () {
+      var scanner = new StringScanner('foo bar baz');
+      scanner.expect('foo ');
+      var match = scanner.lastMatch;
+      scanner.expect('bar');
+      expect(() => scanner.error('oh no!', match: match),
+          throwsFormattedError('''
+Error on line 1, column 1: oh no!
+foo bar baz
+^^^^'''));
+    });
+
+    test('supports a match on a previous line', () {
+      var scanner = new StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      scanner.expect('foo bar baz\ndo ');
+      scanner.expect('re');
+      var match = scanner.lastMatch;
+      scanner.expect(' mi\nearth ');
+      expect(() => scanner.error('oh no!', match: match),
+          throwsFormattedError('''
+Error on line 2, column 4: oh no!
+do re mi
+   ^^'''));
+    });
+
+    test('supports a multiline match', () {
+      var scanner = new StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      scanner.expect('foo bar ');
+      scanner.expect('baz\ndo');
+      var match = scanner.lastMatch;
+      scanner.expect(' re mi');
+      expect(() => scanner.error('oh no!', match: match),
+          throwsFormattedError('''
+Error on line 1, column 9: oh no!
+foo bar baz
+        ^^^'''));
+    });
+
+    test('supports a match after position', () {
+      var scanner = new StringScanner('foo bar baz');
+      scanner.expect('foo ');
+      scanner.expect('bar');
+      var match = scanner.lastMatch;
+      scanner.position = 0;
+      expect(() => scanner.error('oh no!', match: match),
+          throwsFormattedError('''
+Error on line 1, column 5: oh no!
+foo bar baz
+    ^^^'''));
+    });
+  });
+
+  group("with position and/or length", () {
+    test('defaults to length 1', () {
+      var scanner = new StringScanner('foo bar baz');
+      scanner.expect('foo ');
+      expect(() => scanner.error('oh no!', position: 1),
+          throwsFormattedError('''
+Error on line 1, column 2: oh no!
+foo bar baz
+ ^'''));
+    });
+
+    test('defaults to the current position', () {
+      var scanner = new StringScanner('foo bar baz');
+      scanner.expect('foo ');
+      expect(() => scanner.error('oh no!', length: 3),
+          throwsFormattedError('''
+Error on line 1, column 5: oh no!
+foo bar baz
+    ^^^'''));
+    });
+
+    test('supports an earlier position', () {
+      var scanner = new StringScanner('foo bar baz');
+      scanner.expect('foo ');
+      expect(() => scanner.error('oh no!', position: 1, length: 2),
+          throwsFormattedError('''
+Error on line 1, column 2: oh no!
+foo bar baz
+ ^^'''));
+    });
+
+    test('supports a position on a previous line', () {
+      var scanner = new StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      scanner.expect('foo bar baz\ndo re mi\nearth');
+      expect(() => scanner.error('oh no!', position: 15, length: 2),
+          throwsFormattedError('''
+Error on line 2, column 4: oh no!
+do re mi
+   ^^'''));
+    });
+
+    test('supports a multiline length', () {
+      var scanner = new StringScanner('foo bar baz\ndo re mi\nearth fire water');
+      scanner.expect('foo bar baz\ndo re mi\nearth');
+      expect(() => scanner.error('oh no!', position: 8, length: 8),
+          throwsFormattedError('''
+Error on line 1, column 9: oh no!
+foo bar baz
+        ^^^'''));
+    });
+
+    test('supports a position after the current one', () {
+      var scanner = new StringScanner('foo bar baz');
+      expect(() => scanner.error('oh no!', position: 4, length: 3),
+          throwsFormattedError('''
+Error on line 1, column 5: oh no!
+foo bar baz
+    ^^^'''));
+    });
+  });
+
+  group("argument errors", () {
+    var scanner;
+    setUp(() {
+      scanner = new StringScanner('foo bar baz');
+      scanner.scan('foo');
+    });
+
+    test("if match is passed with position", () {
+      expect(
+          () => scanner.error("oh no!", match: scanner.lastMatch, position: 1),
+          throwsArgumentError);
+    });
+
+    test("if match is passed with length", () {
+      expect(
+          () => scanner.error("oh no!", match: scanner.lastMatch, length: 1),
+          throwsArgumentError);
+    });
+
+    test("if position is negative", () {
+      expect(() => scanner.error("oh no!", position: -1), throwsArgumentError);
+    });
+
+    test("if position is outside the string", () {
+      expect(() => scanner.error("oh no!", position: 100), throwsArgumentError);
+    });
+
+    test("if length is zero", () {
+      expect(() => scanner.error("oh no!", length: 0), throwsArgumentError);
+    });
+  });
+}
diff --git a/pkg/string_scanner/test/expect_error_test.dart b/pkg/string_scanner/test/expect_error_test.dart
new file mode 100644
index 0000000..3596e15
--- /dev/null
+++ b/pkg/string_scanner/test/expect_error_test.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.expect_error_test;
+
+import 'package:string_scanner/string_scanner.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+void main() {
+  test('points to the first unconsumed character', () {
+    var scanner = new StringScanner('foo bar baz');
+    scanner.expect('foo ');
+    expect(() => scanner.expect('foo'), throwsFormattedError('''
+Error on line 1, column 5: expected "foo".
+foo bar baz
+    ^'''));
+  });
+
+  test('prints the correct line', () {
+    var scanner = new StringScanner('foo bar baz\ndo re mi\nearth fire water');
+    scanner.expect('foo bar baz\ndo ');
+    expect(() => scanner.expect('foo'), throwsFormattedError('''
+Error on line 2, column 4: expected "foo".
+do re mi
+   ^'''));
+  });
+
+  test('handles the beginning of the string correctly', () {
+    var scanner = new StringScanner('foo bar baz');
+    expect(() => scanner.expect('zap'), throwsFormattedError('''
+Error on line 1, column 1: expected "zap".
+foo bar baz
+^'''));
+  });
+
+  test('handles the end of the string correctly', () {
+    var scanner = new StringScanner('foo bar baz');
+    scanner.expect('foo bar baz');
+    expect(() => scanner.expect('bang'), throwsFormattedError('''
+Error on line 1, column 12: expected "bang".
+foo bar baz
+           ^'''));
+  });
+
+  test('handles an empty string correctly', () {
+    expect(() => new StringScanner('').expect('foo'), throwsFormattedError('''
+Error on line 1, column 1: expected "foo".
+
+^'''));
+  });
+
+  group("expected name", () {
+    test("uses the provided name", () {
+      expect(() => new StringScanner('').expect('foo bar', name: 'zap'),
+          throwsFormattedError('''
+Error on line 1, column 1: expected zap.
+
+^'''));
+    });
+
+    test("escapes string quotes", () {
+      expect(() => new StringScanner('').expect('foo"bar'),
+          throwsFormattedError('''
+Error on line 1, column 1: expected "foo\\"bar".
+
+^'''));
+    });
+
+    test("escapes string backslashes", () {
+      expect(() => new StringScanner('').expect('foo\\bar'),
+          throwsFormattedError('''
+Error on line 1, column 1: expected "foo\\\\bar".
+
+^'''));
+    });
+
+    test("prints PERL-style regexps", () {
+      expect(() => new StringScanner('').expect(new RegExp(r'foo')),
+          throwsFormattedError('''
+Error on line 1, column 1: expected /foo/.
+
+^'''));
+    });
+
+    test("escape regexp forward slashes", () {
+      expect(() => new StringScanner('').expect(new RegExp(r'foo/bar')),
+          throwsFormattedError('''
+Error on line 1, column 1: expected /foo\\/bar/.
+
+^'''));
+    });
+
+    test("does not escape regexp backslashes", () {
+      expect(() => new StringScanner('').expect(new RegExp(r'foo\bar')),
+          throwsFormattedError('''
+Error on line 1, column 1: expected /foo\\bar/.
+
+^'''));
+    });
+  });
+}
diff --git a/pkg/string_scanner/test/string_scanner_test.dart b/pkg/string_scanner/test/string_scanner_test.dart
new file mode 100644
index 0000000..0cab627
--- /dev/null
+++ b/pkg/string_scanner/test/string_scanner_test.dart
@@ -0,0 +1,267 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.string_scanner_test;
+
+import 'package:string_scanner/string_scanner.dart';
+import 'package:unittest/unittest.dart';
+
+void main() {
+  group('with an empty string', () {
+    var scanner;
+    setUp(() {
+      scanner = new StringScanner('');
+    });
+
+    test('is done', () {
+      expect(scanner.isDone, isTrue);
+      expect(scanner.expectDone, isNot(throwsFormatException));
+    });
+
+    test('rest is empty', () {
+      expect(scanner.rest, isEmpty);
+    });
+
+    test('lastMatch is null', () {
+      expect(scanner.lastMatch, isNull);
+    });
+
+    test('position is zero', () {
+      expect(scanner.position, equals(0));
+    });
+
+    test("scan returns false and doesn't change the state", () {
+      expect(scanner.scan(new RegExp('.')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test("expect throws a FormatException and doesn't change the state", () {
+      expect(() => scanner.expect(new RegExp('.')), throwsFormatException);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test("matches returns false and doesn't change the state", () {
+      expect(scanner.matches(new RegExp('.')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+    });
+
+    test('setting position to 1 throws an ArgumentError', () {
+      expect(() {
+        scanner.position = 1;
+      }, throwsArgumentError);
+    });
+
+    test('setting position to -1 throws an ArgumentError', () {
+      expect(() {
+        scanner.position = -1;
+      }, throwsArgumentError);
+    });
+  });
+
+  group('at the beginning of a string', () {
+    var scanner;
+    setUp(() {
+      scanner = new StringScanner('foo bar');
+    });
+
+    test('is not done', () {
+      expect(scanner.isDone, isFalse);
+      expect(scanner.expectDone, throwsFormatException);
+    });
+
+    test('rest is the whole string', () {
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test('lastMatch is null', () {
+      expect(scanner.lastMatch, isNull);
+    });
+
+    test('position is zero', () {
+      expect(scanner.position, equals(0));
+    });
+
+    test("a matching scan returns true and changes the state", () {
+      expect(scanner.scan(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch[1], equals('oo'));
+      expect(scanner.position, equals(3));
+      expect(scanner.rest, equals(' bar'));
+    });
+
+    test("a non-matching scan returns false and sets lastMatch to null", () {
+      expect(scanner.matches(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch, isNotNull);
+
+      expect(scanner.scan(new RegExp('b(..)')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test("a matching expect changes the state", () {
+      scanner.expect(new RegExp('f(..)'));
+      expect(scanner.lastMatch[1], equals('oo'));
+      expect(scanner.position, equals(3));
+      expect(scanner.rest, equals(' bar'));
+    });
+
+    test("a non-matching expect throws a FormatException and sets lastMatch to "
+        "null", () {
+      expect(scanner.matches(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch, isNotNull);
+
+      expect(() => scanner.expect(new RegExp('b(..)')), throwsFormatException);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test("a matching matches returns true and only changes lastMatch", () {
+      expect(scanner.matches(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch[1], equals('oo'));
+      expect(scanner.position, equals(0));
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test("a non-matching matches returns false and doesn't change the state",
+        () {
+      expect(scanner.matches(new RegExp('b(..)')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(0));
+      expect(scanner.rest, equals('foo bar'));
+    });
+
+    test('setting position to 1 moves the cursor forward', () {
+      scanner.position = 1;
+      expect(scanner.position, equals(1));
+      expect(scanner.rest, equals('oo bar'));
+
+      expect(scanner.scan(new RegExp('oo.')), isTrue);
+      expect(scanner.lastMatch[0], equals('oo '));
+      expect(scanner.position, equals(4));
+      expect(scanner.rest, equals('bar'));
+    });
+
+    test('setting position beyond the string throws an ArgumentError', () {
+      expect(() {
+        scanner.position = 8;
+      }, throwsArgumentError);
+    });
+
+    test('setting position to -1 throws an ArgumentError', () {
+      expect(() {
+        scanner.position = -1;
+      }, throwsArgumentError);
+    });
+
+    test('scan accepts any Pattern', () {
+      expect(scanner.scan('foo'), isTrue);
+      expect(scanner.lastMatch[0], equals('foo'));
+      expect(scanner.position, equals(3));
+      expect(scanner.rest, equals(' bar'));
+    });
+
+    test('scans multiple times', () {
+      expect(scanner.scan(new RegExp('f(..)')), isTrue);
+      expect(scanner.lastMatch[1], equals('oo'));
+      expect(scanner.position, equals(3));
+      expect(scanner.rest, equals(' bar'));
+
+      expect(scanner.scan(new RegExp(' b(..)')), isTrue);
+      expect(scanner.lastMatch[1], equals('ar'));
+      expect(scanner.position, equals(7));
+      expect(scanner.rest, equals(''));
+      expect(scanner.isDone, isTrue);
+      expect(scanner.expectDone, isNot(throwsFormatException));
+    });
+  });
+
+  group('at the end of a string', () {
+    var scanner;
+    setUp(() {
+      scanner = new StringScanner('foo bar');
+      expect(scanner.scan('foo bar'), isTrue);
+    });
+
+    test('is done', () {
+      expect(scanner.isDone, isTrue);
+      expect(scanner.expectDone, isNot(throwsFormatException));
+    });
+
+    test('rest is empty', () {
+      expect(scanner.rest, isEmpty);
+    });
+
+    test('position is zero', () {
+      expect(scanner.position, equals(7));
+    });
+
+    test("scan returns false and sets lastMatch to null", () {
+      expect(scanner.scan(new RegExp('.')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(7));
+    });
+
+    test("expect throws a FormatException and sets lastMatch to null", () {
+      expect(() => scanner.expect(new RegExp('.')), throwsFormatException);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(7));
+    });
+
+    test("matches returns false sets lastMatch to null", () {
+      expect(scanner.matches(new RegExp('.')), isFalse);
+      expect(scanner.lastMatch, isNull);
+      expect(scanner.position, equals(7));
+    });
+
+    test('setting position to 1 moves the cursor backward', () {
+      scanner.position = 1;
+      expect(scanner.position, equals(1));
+      expect(scanner.rest, equals('oo bar'));
+
+      expect(scanner.scan(new RegExp('oo.')), isTrue);
+      expect(scanner.lastMatch[0], equals('oo '));
+      expect(scanner.position, equals(4));
+      expect(scanner.rest, equals('bar'));
+    });
+
+    test('setting position beyond the string throws an ArgumentError', () {
+      expect(() {
+        scanner.position = 8;
+      }, throwsArgumentError);
+    });
+
+    test('setting position to -1 throws an ArgumentError', () {
+      expect(() {
+        scanner.position = -1;
+      }, throwsArgumentError);
+    });
+  });
+
+  group('a scanner constructed with a custom position', () {
+    test('starts scanning from that position', () {
+      var scanner = new StringScanner('foo bar', position: 1);
+      expect(scanner.position, equals(1));
+      expect(scanner.rest, equals('oo bar'));
+
+      expect(scanner.scan(new RegExp('oo.')), isTrue);
+      expect(scanner.lastMatch[0], equals('oo '));
+      expect(scanner.position, equals(4));
+      expect(scanner.rest, equals('bar'));
+    });
+
+    test('throws an ArgumentError if the position is -1', () {
+      expect(() => new StringScanner('foo bar', position: -1),
+          throwsArgumentError);
+    });
+
+    test('throws an ArgumentError if the position is beyond the string', () {
+      expect(() => new StringScanner('foo bar', position: 8),
+          throwsArgumentError);
+    });
+  });
+}
diff --git a/pkg/string_scanner/test/utils.dart b/pkg/string_scanner/test/utils.dart
new file mode 100644
index 0000000..eee93d8
--- /dev/null
+++ b/pkg/string_scanner/test/utils.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library string_scanner.test.utils;
+
+import 'package:unittest/unittest.dart';
+
+/// Returns a matcher that asserts that a closure throws a [FormatException]
+/// with the given [message].
+Matcher throwsFormattedError(String message) {
+  return throwsA(predicate((error) {
+    expect(error, isFormatException);
+    expect(error.message, equals(message));
+    return true;
+  }));
+}
diff --git a/pkg/template_binding/CHANGELOG.md b/pkg/template_binding/CHANGELOG.md
new file mode 100644
index 0000000..a8f1aa9
--- /dev/null
+++ b/pkg/template_binding/CHANGELOG.md
@@ -0,0 +1,16 @@
+# changelog
+
+This file contains highlights of what changes on each version of the
+template_binding package.
+
+#### Pub version 0.10.0-pre.1.dev
+  * 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).
+
+#### Pub version 0.10.0-pre.0
+  * Ported JS code as of commit [fcb7a5][] 
+
+[fcb7a5]: https://github.com/Polymer/TemplateBinding/commit/fcb7a502794f19544f2d4b77c96eebb70830591d
+[51df59]: https://github.com/Polymer/TemplateBinding/commit/51df59c16e0922dec041cfe604016aac00918d5d
diff --git a/pkg/template_binding/lib/src/mustache_tokens.dart b/pkg/template_binding/lib/src/mustache_tokens.dart
index be84d26..7478d92 100644
--- a/pkg/template_binding/lib/src/mustache_tokens.dart
+++ b/pkg/template_binding/lib/src/mustache_tokens.dart
@@ -5,7 +5,11 @@
 library template_binding.src.mustache_tokens;
 
 import 'package:observe/observe.dart';
-import 'package:template_binding/template_binding.dart';
+
+// Dart note: this was added to decouple the parse function below from the rest
+// of template_binding. This allows using this code in command-line tools as
+// well.
+typedef Function DelegateFunctionFactory(String pathString);
 
 /**
  * Represents a set of parsed tokens from a {{ mustache binding expression }}.
@@ -74,8 +78,7 @@
    *
    * Returns null if there are no matches. Otherwise returns the parsed tokens.
    */
-  static MustacheTokens parse(String s, String name, node,
-      BindingDelegate delegate) {
+  static MustacheTokens parse(String s, [DelegateFunctionFactory fnFactory]) {
     if (s == null || s.isEmpty) return null;
 
     var tokens = null;
@@ -112,15 +115,18 @@
       var pathString = s.substring(startIndex + 2, endIndex).trim();
       tokens.add(oneTime); // ONETIME?
       onlyOneTime = onlyOneTime && oneTime;
-      tokens.add(new PropertyPath(pathString)); // PATH
-      var delegateFn = delegate == null ? null :
-          delegate.prepareBinding(pathString, name, node);
-      tokens.add(delegateFn);
+      var delegateFn = fnFactory == null ? null : fnFactory(pathString);
+      if (delegateFn == null) {
+        tokens.add(new PropertyPath(pathString)); // PATH
+      } else {
+        tokens.add(null);
+      }
+      tokens.add(delegateFn); // DELEGATE_FN
 
       lastIndex = endIndex + 2;
     }
 
-    if (lastIndex == length) tokens.add('');
+    if (lastIndex == length) tokens.add(''); // TEXT
 
     return new MustacheTokens._(tokens, onlyOneTime);
   }
diff --git a/pkg/template_binding/lib/src/template_iterator.dart b/pkg/template_binding/lib/src/template_iterator.dart
index 66d44f5..cc519f2 100644
--- a/pkg/template_binding/lib/src/template_iterator.dart
+++ b/pkg/template_binding/lib/src/template_iterator.dart
@@ -17,13 +17,21 @@
 // See: https://github.com/polymer/TemplateBinding/issues/59
 bool _toBoolean(value) => null != value && false != value;
 
+// Dart note: this was added to decouple the MustacheTokens.parse function from
+// the rest of template_binding.
+_getDelegateFactory(name, node, delegate) {
+  if (delegate == null) return null;
+  return (pathString) => delegate.prepareBinding(pathString, name, node);
+}
+
 _InstanceBindingMap _getBindings(Node node, BindingDelegate delegate) {
   if (node is Element) {
     return _parseAttributeBindings(node, delegate);
   }
 
   if (node is Text) {
-    var tokens = MustacheTokens.parse(node.text, 'text', node, delegate);
+    var tokens = MustacheTokens.parse(node.text,
+        _getDelegateFactory('text', node, delegate));
     if (tokens != null) return new _InstanceBindingMap(['text', tokens]);
   }
 
@@ -46,7 +54,7 @@
 
   var v = element.attributes[name];
   if (v == '') v = '{{}}';
-  return MustacheTokens.parse(v, name, element, delegate);
+  return MustacheTokens.parse(v, _getDelegateFactory(name, element, delegate));
 }
 
 _InstanceBindingMap _parseAttributeBindings(Element element,
@@ -72,7 +80,8 @@
       return;
     }
 
-    var tokens = MustacheTokens.parse(value, name, element, delegate);
+    var tokens = MustacheTokens.parse(value,
+        _getDelegateFactory(name, element, delegate));
     if (tokens != null) {
       if (bindings == null) bindings = [];
       bindings..add(name)..add(tokens);
@@ -88,7 +97,8 @@
 
     // Treat <template if> as <template bind if>
     if (result._if != null && result._bind == null && result._repeat == null) {
-      result._bind = MustacheTokens.parse('{{}}', 'bind', element, delegate);
+      result._bind = MustacheTokens.parse('{{}}',
+          _getDelegateFactory('bind', element, delegate));
     }
 
     return result;
@@ -430,13 +440,26 @@
           instanceBindings = instance.instanceBindings;
           instanceNodes = instance.nodes;
         } else {
-          instanceBindings = [];
-          if (_instanceModelFn != null) {
-            model = _instanceModelFn(model);
-          }
-          if (model != null) {
-            fragment = _templateExt.createInstance(model, delegate,
-                instanceBindings);
+          try {
+            instanceBindings = [];
+            if (_instanceModelFn != null) {
+              model = _instanceModelFn(model);
+            }
+            if (model != null) {
+              fragment = _templateExt.createInstance(model, delegate,
+                  instanceBindings);
+            }
+          } catch (e, s) {
+            // Dart note: we propagate errors asynchronously here to avoid
+            // disrupting the rendering flow. This is different than in the JS
+            // implementation but it should probably be fixed there too. Dart
+            // hits this case more because non-existing properties in
+            // [PropertyPath] are treated as errors, while JS treats them as
+            // null/undefined.
+            // TODO(sigmund): this should be a synchronous throw when this is
+            // called from createInstance, but that requires enough refactoring
+            // that it should be done upstream first. See dartbug.com/17789.
+            new Completer().completeError(e, s);
           }
         }
 
diff --git a/pkg/template_binding/pubspec.yaml b/pkg/template_binding/pubspec.yaml
index 2bd4c1d..b23462f 100644
--- a/pkg/template_binding/pubspec.yaml
+++ b/pkg/template_binding/pubspec.yaml
@@ -1,5 +1,5 @@
 name: template_binding
-version: 0.10.0-pre.0
+version: 0.10.0-pre.1
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: >
   Extends the capabilities of the HTML Template Element by enabling it to
@@ -7,7 +7,7 @@
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
   logging: ">=0.9.0 <0.10.0"
-  observe: ">=0.10.0-pre.0 <0.11.0"
+  observe: ">=0.10.0-pre.3 <0.11.0"
 dev_dependencies:
   web_components: ">=0.3.1 <0.4.0"
   unittest: ">=0.10.0 <0.11.0"
diff --git a/pkg/template_binding/test/node_bind_test.dart b/pkg/template_binding/test/node_bind_test.dart
index 93bcd8f..cfe8d7c 100644
--- a/pkg/template_binding/test/node_bind_test.dart
+++ b/pkg/template_binding/test/node_bind_test.dart
@@ -70,8 +70,9 @@
   test('Path unreachable', () {
     var text = testDiv.append(new Text('hi'));
     var model = 1;
-    nodeBind(text).bind('text', new PathObserver(model, 'a'));
-    expect(text.text, '');
+    var pathObserver = new PathObserver(model, 'a');
+    expect(() => nodeBind(text).bind('text', pathObserver), throws);
+    expect(text.text, 'hi');
   });
 
   test('Observer is Model', () {
diff --git a/pkg/template_binding/test/template_binding_test.dart b/pkg/template_binding/test/template_binding_test.dart
index c2ac5a9..4757ac0 100644
--- a/pkg/template_binding/test/template_binding_test.dart
+++ b/pkg/template_binding/test/template_binding_test.dart
@@ -157,15 +157,22 @@
     // and would cause the template to not be expanded.
     var m = toObservable({ 'predicate': null, 'bound': 1 });
     var template = div.firstChild;
-    templateBind(template).model = m;
+    bool errorSeen = false;
+    runZoned(() {
+      templateBind(template).model = m;
+    }, onError: (e, s) {
+      expect(e, isNoSuchMethodError);
+      errorSeen = true;
+    });
     return new Future(() {
       expect(div.nodes.length, 1);
 
       m['predicate'] = 1;
 
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:');
+      expect(errorSeen, isFalse);
+    }).then(nextMicrotask).then((_) {
+      expect(errorSeen, isTrue);
+      expect(div.nodes.length, 1);
 
       m['bound'] = toObservable({ 'value': 2 });
 
@@ -234,14 +241,18 @@
     // undefined, and would cause the template to not be expanded.
     var m = toObservable({ 'predicate': 1, 'bound': 1 });
     var template = div.firstChild;
-    templateBind(template).model = m;
+    bool errorSeen = false;
+    runZoned(() {
+      templateBind(template).model = m;
+    }, onError: (e, s) {
+      expect(e, isNoSuchMethodError);
+      errorSeen = true;
+    });
 
     return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'value:');
-
+      expect(div.nodes.length, 1);
       m['bound'] = toObservable({ 'value': 2 });
-
+      expect(errorSeen, isTrue);
     }).then(endOfMicrotask).then((_) {
       expect(div.nodes.length, 2);
       expect(div.lastChild.text, 'value:2');
@@ -2199,6 +2210,33 @@
     });
   });
 
+  test('CreateInstance - sync error', () {
+    var div = createTestHtml('<template>{{foo}}</template>');
+    var outer = templateBind(div.nodes.first);
+    var model = 1; // model is missing 'foo' should throw.
+    expect(() => outer.createInstance(model, new TestBindingSyntax()),
+        throwsA(isNoSuchMethodError));
+  });
+
+  test('CreateInstance - async error', () {
+    var div = createTestHtml(
+      '<template>'
+        '<template bind="{{b}}">'
+          '{{ foo }}:{{ replaceme }}'
+        '</template>'
+      '</template>');
+    var outer = templateBind(div.nodes.first);
+    var model = toObservable({'b': 1}); // missing 'foo' should throw.
+
+    bool seen = false;
+    runZoned(() => outer.createInstance(model, new TestBindingSyntax()),
+      onError: (e) {
+        expect(e, isNoSuchMethodError);
+        seen = true;
+      });
+    return new Future(() { expect(seen, isTrue); });
+  });
+
   test('Repeat - svg', () {
     var div = createTestHtml(
         '<svg width="400" height="110">'
diff --git a/pkg/third_party/html5lib/CHANGELOG.md b/pkg/third_party/html5lib/CHANGELOG.md
index 7c97280..dd64e89 100644
--- a/pkg/third_party/html5lib/CHANGELOG.md
+++ b/pkg/third_party/html5lib/CHANGELOG.md
@@ -3,6 +3,9 @@
 This file contains highlights of what changes on each version of the html5lib
 package.
 
+#### Pub version 0.10.0
+  * fix how document fragments are added in NodeList.add/addAll/insertAll.
+
 #### Pub version 0.9.2-dev
   * add Node.text, Node.append, Document.documentElement
   * add Text.data, deprecate Node.value and Text.value.
diff --git a/pkg/third_party/html5lib/lib/dom.dart b/pkg/third_party/html5lib/lib/dom.dart
index b81c1ff..973e5ae 100644
--- a/pkg/third_party/html5lib/lib/dom.dart
+++ b/pkg/third_party/html5lib/lib/dom.dart
@@ -651,7 +651,11 @@
   }
 
   void add(Node value) {
-    super.add(_setParent(value));
+    if (value is DocumentFragment) {
+      addAll(value.nodes);
+    } else {
+      super.add(_setParent(value));
+    }
   }
 
   void addLast(Node value) => add(value);
@@ -660,17 +664,21 @@
     // Note: we need to be careful if collection is another NodeList.
     // In particular:
     //   1. we need to copy the items before updating their parent pointers,
+    //     _flattenDocFragments does a copy internally.
     //   2. we should update parent pointers in reverse order. That way they
     //      are removed from the original NodeList (if any) from the end, which
     //      is faster.
-    var list = (collection is NodeList || collection is! List)
-        ? collection.toList() : collection as List;
+    var list = _flattenDocFragments(collection);
     for (var node in list.reversed) _setParent(node);
     super.addAll(list);
   }
 
   void insert(int index, Node value) {
-    super.insert(index, _setParent(value));
+    if (value is DocumentFragment) {
+      insertAll(index, value.nodes);
+    } else {
+      super.insert(index, _setParent(value));
+    }
   }
 
   Node removeLast() => super.removeLast()..parent = null;
@@ -683,8 +691,13 @@
   }
 
   void operator []=(int index, Node value) {
-    this[index].parent = null;
-    super[index] = _setParent(value);
+    if (value is DocumentFragment) {
+      removeAt(index);
+      insertAll(index, value.nodes);
+    } else {
+      this[index].parent = null;
+      super[index] = _setParent(value);
+    }
   }
 
   // TODO(jmesserly): These aren't implemented in DOM _NodeListImpl, see
@@ -698,8 +711,7 @@
     // Note: see comment in [addAll]. We need to be careful about the order of
     // operations if [from] is also a NodeList.
     for (int i = rangeLength - 1; i >= 0; i--) {
-      this[start + i].parent = null;
-      super[start + i] = _setParent(from[startFrom + i]);
+      this[start + i] = from[startFrom + i];
     }
   }
 
@@ -727,9 +739,26 @@
     super.retainWhere(test);
   }
 
-  void insertAll(int index, List<Node> nodes) {
-    for (var node in nodes) _setParent(node);
-    super.insertAll(index, nodes);
+  void insertAll(int index, Iterable<Node> collection) {
+    // Note: we need to be careful how we copy nodes. See note in addAll.
+    var list = _flattenDocFragments(collection);
+    for (var node in list.reversed) _setParent(node);
+    super.insertAll(index, list);
+  }
+
+  _flattenDocFragments(Iterable<Node> collection) {
+    // Note: this function serves two purposes:
+    //  * it flattens document fragments
+    //  * it creates a copy of [collections] when `collection is NodeList`.
+    var result = [];
+    for (var node in collection) {
+      if (node is DocumentFragment) {
+        result.addAll(node.nodes);
+      } else {
+        result.add(node);
+      }
+    }
+    return result;
   }
 }
 
diff --git a/pkg/third_party/html5lib/pubspec.yaml b/pkg/third_party/html5lib/pubspec.yaml
index 79f76ba..75038c6 100644
--- a/pkg/third_party/html5lib/pubspec.yaml
+++ b/pkg/third_party/html5lib/pubspec.yaml
@@ -1,5 +1,5 @@
 name: html5lib
-version: 0.9.2
+version: 0.10.0
 author: Dart Team <misc@dartlang.org>
 description: A library for working with HTML documents.
 homepage: http://pub.dartlang.org/packages/html5lib
diff --git a/pkg/third_party/html5lib/test/dom_test.dart b/pkg/third_party/html5lib/test/dom_test.dart
index 43a9637..99dfb01 100644
--- a/pkg/third_party/html5lib/test/dom_test.dart
+++ b/pkg/third_party/html5lib/test/dom_test.dart
@@ -20,6 +20,12 @@
       expect(parse('<foo123>').body.querySelector('foo123'), isNotNull);
     });
 
+    test('built from fragments', () {
+      var doc = parse('<body>');
+      doc.body.nodes.add(parseFragment('<x-foo>'));
+      expect(doc.body.querySelector('x-foo'), isNotNull);
+    });
+
     test('123 - invalid', () {
       var doc = parse('<123>');
       expect(() => doc.body.querySelector('123'), throwsUnimplementedError);
@@ -30,4 +36,172 @@
       expect(() => doc.body.querySelector('x\\ny'), throwsUnimplementedError);
     });
   });
+
+  group('Node.querySelectorAll type selectors', () {
+    test('x-foo', () {
+      expect(parse('<x-foo>').body.querySelectorAll('x-foo').length, 1);
+    });
+
+    test('-x-foo', () {
+      var doc = parse('<body><-x-foo>');
+      expect(doc.body.outerHtml, equals('<body>&lt;-x-foo&gt;</body>'));
+      expect(doc.body.querySelectorAll('-x-foo').length, 0);
+    });
+
+    test('foo123', () {
+      expect(parse('<foo123>').body.querySelectorAll('foo123').length, 1);
+    });
+
+    test('built from fragments', () {
+      var doc = parse('<body>');
+      doc.body.nodes.add(parseFragment('<x-foo></x-foo><x-foo>'));
+      expect(doc.body.querySelectorAll('x-foo').length, 2);
+    });
+
+    test('123 - invalid', () {
+      var doc = parse('<123>');
+      expect(() => doc.body.querySelectorAll('123'), throwsUnimplementedError);
+    });
+
+    test('x\\ny - not implemented', () {
+      var doc = parse('<x\\ny>');
+      expect(() => doc.body.querySelectorAll('x\\ny'),
+        throwsUnimplementedError);
+    });
+  });
+
+  group('fragments are flattened', () {
+    test('add', () {
+      var doc = parse('<body>');
+      doc.body.nodes.add(parseFragment('<x-foo>'));
+      expect(doc.body.nodes[0].localName, 'x-foo');
+      doc.body.nodes.add(parseFragment('<x-bar>'));
+      expect(doc.body.nodes[1].localName, 'x-bar');
+    });
+
+    test('addLast', () {
+      var doc = parse('<body>');
+      doc.body.nodes.addLast(parseFragment('<x-foo>'));
+      expect(doc.body.nodes[0].localName, 'x-foo');
+      doc.body.nodes.addLast(parseFragment('<x-bar>'));
+      expect(doc.body.nodes[1].localName, 'x-bar');
+    });
+
+    test('addAll', () {
+      var doc = parse('<body><x-a></x-a>');
+      doc.body.nodes.addAll([parseFragment('<x-b></x-b><x-c></x-c>')]);
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'x-b');
+      expect(doc.body.nodes[2].localName, 'x-c');
+    });
+
+    test('insert', () {
+      var doc = parse('<body><x-a></x-a>');
+      doc.body.nodes.insert(0, parseFragment('<x-b></x-b><x-c></x-c>'));
+      expect(doc.body.nodes[0].localName, 'x-b');
+      expect(doc.body.nodes[1].localName, 'x-c');
+      expect(doc.body.nodes[2].localName, 'x-a');
+
+      doc = parse('<body><x-a></x-a>');
+      doc.body.nodes.insert(1, parseFragment('<x-b></x-b><x-c></x-c>'));
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'x-b');
+      expect(doc.body.nodes[2].localName, 'x-c');
+
+      doc = parse('<body><x-a></x-a>');
+      doc.body.nodes.insert(0, parseFragment('<x-b></x-b>'));
+      doc.body.nodes.insert(1, parseFragment('<x-c></x-c>'));
+      expect(doc.body.nodes[0].localName, 'x-b');
+      expect(doc.body.nodes[1].localName, 'x-c');
+      expect(doc.body.nodes[2].localName, 'x-a');
+    });
+
+    test('insertAll', () {
+      var doc = parse('<body><x-a></x-a>');
+      doc.body.nodes.insertAll(0, [parseFragment('<x-b></x-b><x-c></x-c>')]);
+      expect(doc.body.nodes[0].localName, 'x-b');
+      expect(doc.body.nodes[1].localName, 'x-c');
+      expect(doc.body.nodes[2].localName, 'x-a');
+      expect(doc.body.nodes.length, 3);
+
+      doc = parse('<body><x-a></x-a>');
+      doc.body.nodes.insertAll(1, [parseFragment('<x-b></x-b><x-c></x-c>')]);
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'x-b');
+      expect(doc.body.nodes[2].localName, 'x-c');
+
+      doc = parse('<body><x-a></x-a>');
+      doc.body.nodes.insertAll(0, [parseFragment('<x-b></x-b>')]);
+      doc.body.nodes.insertAll(1, [parseFragment('<x-c></x-c>')]);
+      expect(doc.body.nodes[0].localName, 'x-b');
+      expect(doc.body.nodes[1].localName, 'x-c');
+      expect(doc.body.nodes[2].localName, 'x-a');
+    });
+
+    test('operator []=', () {
+      var doc = parse('<body><x-a></x-a>');
+      doc.body.nodes[0] = parseFragment('<x-b></x-b><x-c></x-c>');
+      expect(doc.body.nodes[0].localName, 'x-b');
+      expect(doc.body.nodes[1].localName, 'x-c');
+      expect(doc.body.nodes.length, 2);
+
+      doc = parse('<body><x-a></x-a><x-b></x-b><x-c></x-c>');
+      doc.body.nodes[1] = parseFragment('<y-b></y-b><y-c></y-c>');
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'y-b');
+      expect(doc.body.nodes[2].localName, 'y-c');
+      expect(doc.body.nodes[3].localName, 'x-c');
+      expect(doc.body.nodes.length, 4);
+    });
+
+    test('setRange', () {
+      var fragment = parseFragment('<y-b></y-b><y-c></y-c>');
+      var doc = parse('<body><x-a></x-a><x-b></x-b><x-c></x-c>');
+      doc.body.nodes.setRange(1, 2, fragment.nodes, 0);
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'y-b');
+      expect(doc.body.nodes[2].localName, 'y-c');
+      expect(doc.body.nodes.length, 3);
+
+      fragment = parseFragment('<y-b></y-b><y-c></y-c>');
+      doc = parse('<body><x-a></x-a><x-b></x-b><x-c></x-c>');
+      doc.body.nodes.setRange(1, 1, [fragment], 0);
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'y-b');
+      expect(doc.body.nodes[2].localName, 'y-c');
+      expect(doc.body.nodes[3].localName, 'x-c');
+      expect(doc.body.nodes.length, 4);
+    });
+
+    test('replaceRange', () {
+      var fragment = parseFragment('<y-b></y-b><y-c></y-c>');
+      var doc = parse('<body><x-a></x-a><x-b></x-b><x-c></x-c>');
+      doc.body.nodes.replaceRange(1, 2, fragment.nodes);
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'y-b');
+      expect(doc.body.nodes[2].localName, 'y-c');
+      expect(doc.body.nodes[3].localName, 'x-c');
+      expect(doc.body.nodes.length, 4);
+
+      fragment = parseFragment('<y-b></y-b><y-c></y-c>');
+      doc = parse('<body><x-a></x-a><x-b></x-b><x-c></x-c>');
+      doc.body.nodes.replaceRange(1, 2, [fragment]);
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'y-b');
+      expect(doc.body.nodes[2].localName, 'y-c');
+      expect(doc.body.nodes[3].localName, 'x-c');
+      expect(doc.body.nodes.length, 4);
+    });
+
+    test('replaceWith', () {
+      var fragment = parseFragment('<y-b></y-b><y-c></y-c>');
+      var doc = parse('<body><x-a></x-a><x-b></x-b><x-c></x-c>');
+      doc.body.nodes[1].replaceWith(fragment);
+      expect(doc.body.nodes[0].localName, 'x-a');
+      expect(doc.body.nodes[1].localName, 'y-b');
+      expect(doc.body.nodes[2].localName, 'y-c');
+      expect(doc.body.nodes[3].localName, 'x-c');
+      expect(doc.body.nodes.length, 4);
+    });
+  });
 }
diff --git a/pkg/unittest/CHANGELOG.md b/pkg/unittest/CHANGELOG.md
index f51fdee5..aff56ca 100644
--- a/pkg/unittest/CHANGELOG.md
+++ b/pkg/unittest/CHANGELOG.md
@@ -1,4 +1,11 @@
-# Changelog - unittest
+##0.10.1+2
+
+* Fixed deprecation message for `mock`.
+
+##0.10.1+1
+
+* Fixed CHANGELOG
+* Moved to triple-slash for all doc comments.
 
 ##0.10.1
 
diff --git a/pkg/unittest/lib/compact_vm_config.dart b/pkg/unittest/lib/compact_vm_config.dart
index 362b5f8..aee1405 100644
--- a/pkg/unittest/lib/compact_vm_config.dart
+++ b/pkg/unittest/lib/compact_vm_config.dart
@@ -28,8 +28,10 @@
   ReceivePort _receivePort;
 
   DateTime _start;
-  int _pass = 0;
-  int _fail = 0;
+  Set<int> _passing = new Set();
+  Set<int> _failing = new Set();
+  int get _pass => _passing.length;
+  int get _fail => _failing.length;
 
   void onInit() {
     _receivePort = new ReceivePort();
@@ -43,17 +45,17 @@
 
   void onTestStart(TestCase test) {
     super.onTestStart(test);
-    _progressLine(_start, _pass, _fail, test.description);
+    _progressLine(test.description);
   }
 
   void onTestResult(TestCase test) {
     super.onTestResult(test);
     if (test.result == PASS) {
-      _pass++;
-      _progressLine(_start, _pass, _fail, test.description);
+      _passing.add(test.id);
+      _progressLine(test.description);
     } else {
-      _fail++;
-      _progressLine(_start, _pass, _fail, test.description);
+      _failing.add(test.id);
+      _progressLine(test.description);
       _print();
       if (test.message != '') {
         _print(indent(test.message));
@@ -66,9 +68,9 @@
   }
 
   void onTestResultChanged(TestCase test) {
-    _pass--;
-    _fail++;
-    _progressLine(_start, _pass, _fail, test.description);
+    _passing.remove(test.id);
+    _failing.add(test.id);
+    _progressLine(test.description);
     _print();
     if (test.message != '') {
       _print(indent(test.message));
@@ -94,11 +96,11 @@
     if (passed == 0 && failed == 0 && errors == 0 && uncaughtError == null) {
       _print('\nNo tests ran.');
     } else if (failed == 0 && errors == 0 && uncaughtError == null) {
-      _progressLine(_start, _pass, _fail, 'All tests passed!', _NONE);
+      _progressLine('All tests passed!', _NONE);
       _print();
       success = true;
     } else {
-      _progressLine(_start, _pass, _fail, 'Some tests failed.', _RED);
+      _progressLine('Some tests failed.', _RED);
       _print();
       if (uncaughtError != null) {
         _print('Top-level uncaught error: $uncaughtError');
@@ -111,20 +113,19 @@
 
   final int _nonVisiblePrefix = 1 + _GREEN.length + _NONE.length;
 
-  void _progressLine(DateTime startTime, int passed, int failed, String message,
-      [String color = _NONE]) {
-    var duration = (new DateTime.now()).difference(startTime);
+  void _progressLine(String message, [String color = _NONE]) {
+    var duration = (new DateTime.now()).difference(_start);
     var buffer = new StringBuffer();
     // \r moves back to the beginning of the current line.
     buffer.write('\r${_timeString(duration)} ');
     buffer.write(_GREEN);
     buffer.write('+');
-    buffer.write(passed);
+    buffer.write(_pass);
     buffer.write(_NONE);
-    if (failed != 0) {
+    if (_fail != 0) {
       buffer.write(_RED);
       buffer.write(' -');
-      buffer.write(failed);
+      buffer.write(_fail);
       buffer.write(_NONE);
     }
     buffer.write(': ');
@@ -134,7 +135,7 @@
     // sequences too. Because these sequences are not visible characters, we
     // make sure they are not counted towards the limit.
     int nonVisible = _nonVisiblePrefix + color.length  +
-        (failed != 0 ? (_RED.length + _NONE.length) : 0);
+        (_fail != 0 ? (_RED.length + _NONE.length) : 0);
     int len = buffer.length - nonVisible;
     var mx = MAX_LINE - len;
     buffer.write(_snippet(message, MAX_LINE - len));
diff --git a/pkg/unittest/lib/mock.dart b/pkg/unittest/lib/mock.dart
index dac5096..18b6537 100644
--- a/pkg/unittest/lib/mock.dart
+++ b/pkg/unittest/lib/mock.dart
@@ -2,10 +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.
 
-/// `unittest.mock` has been moved to the `matcher` package.
+/// `unittest.mock` has been moved to the `mock` package.
 ///
-/// Add `matcher` to your `pubspec.yaml` file and import it via
-/// `import 'package:matcher/mirror_matchers.dart';`
+/// Add `mock` to your `pubspec.yaml` file and import it via
+/// `import 'package:mock/mock.dart';`
 @deprecated
 library unittest.mock;
 
diff --git a/pkg/unittest/pubspec.yaml b/pkg/unittest/pubspec.yaml
index 2f01eff..0370e35 100644
--- a/pkg/unittest/pubspec.yaml
+++ b/pkg/unittest/pubspec.yaml
@@ -1,5 +1,5 @@
 name: unittest
-version: 0.10.1+1
+version: 0.10.1+2
 author: Dart Team <misc@dartlang.org>
 description: A library for writing dart unit tests.
 homepage: http://www.dartlang.org
diff --git a/pkg/web_components/lib/build.log b/pkg/web_components/lib/build.log
index b83bef4..2dfd8d5 100644
--- a/pkg/web_components/lib/build.log
+++ b/pkg/web_components/lib/build.log
@@ -1,48 +1,43 @@
 BUILD LOG
 ---------
-Build Time: 2014-03-04T18:07:47
+Build Time: 2014-04-01T15:17:50
 
 NODEJS INFORMATION
 ==================
-nodejs: v0.8.21
-chai: 1.9.0
-grunt: 0.4.2
-grunt-audit: 0.0.2
+nodejs: v0.10.26
+chai: 1.9.1
+grunt: 0.4.4
+grunt-audit: 0.0.3
 grunt-concat-sourcemap: 0.4.1
-grunt-contrib-concat: 0.3.0
-grunt-contrib-uglify: 0.3.2
-grunt-contrib-yuidoc: 0.5.0
-grunt-karma: 0.6.2
-karma: 0.10.9
-karma-chrome-launcher: 0.1.2
-karma-coffee-preprocessor: 0.1.2
+grunt-contrib-concat: 0.4.0
+grunt-karma: 0.8.2
+grunt-contrib-uglify: 0.3.3
+grunt-contrib-yuidoc: 0.5.2
+karma: 0.12.2
 karma-crbot-reporter: 0.0.4
 karma-firefox-launcher: 0.1.3
-karma-html2js-preprocessor: 0.1.0
-karma-ie-launcher: 0.1.1
-karma-jasmine: 0.1.5
-karma-mocha: 0.1.1
-karma-phantomjs-launcher: 0.1.2
-karma-requirejs: 0.2.1
+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.17.1
-requirejs: 2.1.10
+Platform: 0.2.2
 
 REPO REVISIONS
 ==============
-CustomElements: f68d8e2f1e624b427ccd2630303ecbf407b06f73
-HTMLImports: cae0c94f3be4b492c0db686ffdd0288b49dbdfe7
-NodeBind: 62f7e53baee55d5821747227de9b407da1c261ec
-PointerEvents: f2964bcc070231c41391cb864fa0c6578031592c
-PointerGestures: 96be1f398a50dadd8ec359060cceb6b24fd38452
-ShadowDOM: e1d3e2629473c50b6dd14cce3b82a48602bc150a
-TemplateBinding: 08008af605298aaf2d56ef34d4af4df70679ea61
+CustomElements: 9b997ca97533147f5f17bd666c06e5fa1a13219e
+HTMLImports: 5f44b337ef6508271dd594f1ec086fac2be3cb0c
+NodeBind: b040e791f573b04cf06fdbc7d407712d46f4fca6
+PointerEvents: 86c341c7ef946dc295cb93a2b5ebebde69dbdcb7
+PointerGestures: e5ec43dcef5a20d789c7e4c09dd206cdb6664a27
+ShadowDOM: 4fe518f54bfdace322866822f9a5c99f41169a10
+TemplateBinding: 9dc4c42334b00716cec2826cb17dda6044c4aeb4
 WeakMap: a0947a9a0f58f5733f464755c3b86de624b00a5d
-observe-js: 3d7b5aa5eb7b403ee7be398280113f7cc36e448a
-platform: 8135b9beaffb6fa77843dbd06370bc9dc1919db4
-polymer-expressions: 470cced7cf167bd164f0b924ceb088dd7a8240b9
+observe-js: 5db3ef588f3fdca7d44cdd24e3bf59b6d547b8c0
+platform: b4641125892409501e82ba3f44add15ab10be274
+polymer-expressions: 1749343a75fc3aa84d691f14c4582a6d1a7f39f1
+platform-dev: ccb7c307ee78d6694b4ca9e2422996f0cbe4a07c
 
 BUILD HASHES
 ============
-build/platform.js: edb4c188b2f609c3da6f4e650703539f440919bb
\ 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 6fa2b7b..9fa19b5 100644
--- a/pkg/web_components/lib/platform.concat.js
+++ b/pkg/web_components/lib/platform.concat.js
@@ -52,12 +52,6 @@
 (function(global) {
   'use strict';
 
-  var PROP_ADD_TYPE = 'add';
-  var PROP_UPDATE_TYPE = 'update';
-  var PROP_RECONFIGURE_TYPE = 'reconfigure';
-  var PROP_DELETE_TYPE = 'delete';
-  var ARRAY_SPLICE_TYPE = 'splice';
-
   // Detect and do basic sanity checking on Object/Array.observe.
   function detectObjectObserve() {
     if (typeof Object.observe !== 'function' ||
@@ -72,44 +66,29 @@
     }
 
     var test = {};
+    var arr = [];
     Object.observe(test, callback);
+    Array.observe(arr, callback);
     test.id = 1;
     test.id = 2;
     delete test.id;
+    arr.push(1, 2);
+    arr.length = 0;
+
     Object.deliverChangeRecords(callback);
-    if (records.length !== 3)
+    if (records.length !== 5)
       return false;
 
-    // TODO(rafaelw): Remove this when new change record type names make it to
-    // chrome release.
-    if (records[0].type == 'new' &&
-        records[1].type == 'updated' &&
-        records[2].type == 'deleted') {
-      PROP_ADD_TYPE = 'new';
-      PROP_UPDATE_TYPE = 'updated';
-      PROP_RECONFIGURE_TYPE = 'reconfigured';
-      PROP_DELETE_TYPE = 'deleted';
-    } else if (records[0].type != 'add' ||
-               records[1].type != 'update' ||
-               records[2].type != 'delete') {
-      console.error('Unexpected change record names for Object.observe. ' +
-                    'Using dirty-checking instead');
+    if (records[0].type != 'add' ||
+        records[1].type != 'update' ||
+        records[2].type != 'delete' ||
+        records[3].type != 'splice' ||
+        records[4].type != 'splice') {
       return false;
     }
+
     Object.unobserve(test, callback);
-
-    test = [0];
-    Array.observe(test, callback);
-    test[1] = 1;
-    test.length = 0;
-    Object.deliverChangeRecords(callback);
-    if (records.length != 2)
-      return false;
-    if (records[0].type != ARRAY_SPLICE_TYPE ||
-        records[1].type != ARRAY_SPLICE_TYPE) {
-      return false;
-    }
-    Array.unobserve(test, callback);
+    Array.unobserve(arr, callback);
 
     return true;
   }
@@ -268,7 +247,7 @@
       for (var i = 0; i < this.length; i++) {
         if (i)
           obj = obj[this[i - 1]];
-        if (!obj)
+        if (!isObject(obj))
           return;
         observe(obj);
       }
@@ -478,7 +457,7 @@
     var resetScheduled = false;
 
     function observe(obj) {
-      if (!isObject(obj))
+      if (!obj)
         return;
 
       var index = toRemove.indexOf(obj);
@@ -679,7 +658,14 @@
 
   var runningMicrotaskCheckpoint = false;
 
-  var hasDebugForceFullDelivery = typeof Object.deliverAllChangeRecords == 'function';
+  var hasDebugForceFullDelivery = hasObserve && (function() {
+    try {
+      eval('%RunMicrotasks()');
+      return true;
+    } catch (ex) {
+      return false;
+    }
+  })();
 
   global.Platform = global.Platform || {};
 
@@ -688,7 +674,7 @@
       return;
 
     if (hasDebugForceFullDelivery) {
-      Object.deliverAllChangeRecords();
+      eval('%RunMicrotasks()');
       return;
     }
 
@@ -1118,10 +1104,11 @@
     }
   }
 
-  var expectedRecordTypes = {};
-  expectedRecordTypes[PROP_ADD_TYPE] = true;
-  expectedRecordTypes[PROP_UPDATE_TYPE] = true;
-  expectedRecordTypes[PROP_DELETE_TYPE] = true;
+  var expectedRecordTypes = {
+    add: true,
+    update: true,
+    delete: true
+  };
 
   function notifyFunction(object, name) {
     if (typeof Object.observe !== 'function')
@@ -1145,7 +1132,7 @@
     var value = observable.open(function(newValue, oldValue) {
       value = newValue;
       if (notify)
-        notify(PROP_UPDATE_TYPE, oldValue);
+        notify('update', oldValue);
     });
 
     Object.defineProperty(target, name, {
@@ -1187,10 +1174,10 @@
       if (!(record.name in oldValues))
         oldValues[record.name] = record.oldValue;
 
-      if (record.type == PROP_UPDATE_TYPE)
+      if (record.type == 'update')
         continue;
 
-      if (record.type == PROP_ADD_TYPE) {
+      if (record.type == 'add') {
         if (record.name in removed)
           delete removed[record.name];
         else
@@ -1587,12 +1574,12 @@
     for (var i = 0; i < changeRecords.length; i++) {
       var record = changeRecords[i];
       switch(record.type) {
-        case ARRAY_SPLICE_TYPE:
+        case 'splice':
           mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);
           break;
-        case PROP_ADD_TYPE:
-        case PROP_UPDATE_TYPE:
-        case PROP_DELETE_TYPE:
+        case 'add':
+        case 'update':
+        case 'delete':
           if (!isIndex(record.name))
             continue;
           var index = toNumber(record.name);
@@ -1641,16 +1628,6 @@
   global.CompoundObserver = CompoundObserver;
   global.Path = Path;
   global.ObserverTransform = ObserverTransform;
-
-  // TODO(rafaelw): Only needed for testing until new change record names
-  // make it to release.
-  global.Observer.changeRecordTypes = {
-    add: PROP_ADD_TYPE,
-    update: PROP_UPDATE_TYPE,
-    reconfigure: PROP_RECONFIGURE_TYPE,
-    'delete': PROP_DELETE_TYPE,
-    splice: ARRAY_SPLICE_TYPE
-  };
 })(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);
 
 // prepoulate window.Platform.flags for default controls

@@ -1666,7 +1643,8 @@
     o = o.split('=');

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

   });

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

+  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++) {

@@ -1684,13 +1662,19 @@
   // 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);

+  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: {}};

@@ -2570,6 +2554,9 @@
   function setTreeScope(node, treeScope) {
     if (node.treeScope_ !== treeScope) {
       node.treeScope_ = treeScope;
+      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {
+        sr.treeScope_.parent = treeScope;
+      }
       for (var child = node.firstChild; child; child = child.nextSibling) {
         setTreeScope(child, treeScope);
       }
@@ -2766,8 +2753,17 @@
     if (handledEventsTable.get(originalEvent))
       return;
     handledEventsTable.set(originalEvent, true);
+    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));
+  }
 
-    return dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));
+  function isLoadLikeEvent(event) {
+    switch (event.type) {
+      case 'beforeunload':
+      case 'load':
+      case 'unload':
+        return true;
+    }
+    return false;
   }
 
   function dispatchEvent(event, originalWrapperTarget) {
@@ -2779,15 +2775,15 @@
     scope.renderAllPending();
     var eventPath = retarget(originalWrapperTarget);
 
-    // For window load events the load event is dispatched at the window but
+    // For window "load" events the "load" event is dispatched at the window but
     // the target is set to the document.
     //
     // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end
     //
     // TODO(arv): Find a less hacky way to do this.
-    if (event.type === 'load' &&
-        eventPath.length === 2 &&
-        eventPath[0].target instanceof wrappers.Document) {
+    if (eventPath.length === 2 &&
+        eventPath[0].target instanceof wrappers.Document &&
+        isLoadLikeEvent(event)) {
       eventPath.shift();
     }
 
@@ -2857,17 +2853,26 @@
 
     if ('relatedTarget' in event) {
       var originalEvent = unwrap(event);
+      var unwrappedRelatedTarget = originalEvent.relatedTarget;
+
       // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no
       // way to have relatedTarget return the adjusted target but worse is that
       // the originalEvent might not have a relatedTarget so we hit an assert
       // when we try to wrap it.
-      if (originalEvent.relatedTarget) {
-        var relatedTarget = wrap(originalEvent.relatedTarget);
+      if (unwrappedRelatedTarget) {
+        // In IE we can get objects that are not EventTargets at this point.
+        // Safari does not have an EventTarget interface so revert to checking
+        // for addEventListener as an approximation.
+        if (unwrappedRelatedTarget instanceof Object &&
+            unwrappedRelatedTarget.addEventListener) {
+          var relatedTarget = wrap(unwrappedRelatedTarget);
 
-        var adjusted = adjustRelatedTarget(currentTarget, relatedTarget);
-        if (adjusted === target)
-          return true;
-
+          var adjusted = adjustRelatedTarget(currentTarget, relatedTarget);
+          if (adjusted === target)
+            return true;
+        } else {
+          adjusted = null;
+        }
         relatedTargetTable.set(event, adjusted);
       }
     }
@@ -2954,10 +2959,14 @@
    * @constructor
    */
   function Event(type, options) {
-    if (type instanceof OriginalEvent)
-      this.impl = type;
-    else
+    if (type instanceof OriginalEvent) {
+      var impl = type;
+      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')
+        return new BeforeUnloadEvent(impl);
+      this.impl = impl;
+    } else {
       return wrap(constructEvent(OriginalEvent, 'Event', type, options));
+    }
   }
   Event.prototype = {
     get target() {
@@ -3040,7 +3049,11 @@
 
   var relatedTargetProto = {
     get relatedTarget() {
-      return relatedTargetTable.get(this) || wrap(unwrap(this).relatedTarget);
+      var relatedTarget = relatedTargetTable.get(this);
+      // relatedTarget can be null.
+      if (relatedTarget !== undefined)
+        return relatedTarget;
+      return wrap(unwrap(this).relatedTarget);
     }
   };
 
@@ -3129,8 +3142,12 @@
     configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');
   }
 
+  // Safari 7 does not yet have BeforeUnloadEvent.
+  // https://bugs.webkit.org/show_bug.cgi?id=120849
+  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;
+
   function BeforeUnloadEvent(impl) {
-    Event.call(this);
+    Event.call(this, impl);
   }
   BeforeUnloadEvent.prototype = Object.create(Event.prototype);
   mixin(BeforeUnloadEvent.prototype, {
@@ -3142,6 +3159,9 @@
     }
   });
 
+  if (OriginalBeforeUnloadEvent)
+    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);
+
   function isValidListener(fun) {
     if (typeof fun === 'function')
       return true;
@@ -3470,6 +3490,7 @@
   var registerWrapper = scope.registerWrapper;
   var setTreeScope = scope.setTreeScope;
   var unwrap = scope.unwrap;
+  var unwrapIfNeeded = scope.unwrapIfNeeded;
   var wrap = scope.wrap;
   var wrapIfNeeded = scope.wrapIfNeeded;
   var wrappers = scope.wrappers;
@@ -4118,7 +4139,8 @@
     compareDocumentPosition: function(otherNode) {
       // This only wraps, it therefore only operates on the composed DOM and not
       // the logical DOM.
-      return originalCompareDocumentPosition.call(this.impl, unwrap(otherNode));
+      return originalCompareDocumentPosition.call(this.impl,
+                                                  unwrapIfNeeded(otherNode));
     },
 
     normalize: function() {
@@ -4305,6 +4327,12 @@
       }
       wrapperList.length = i;
       return wrapperList;
+    },
+
+    remove: function() {
+      var p = this.parentNode;
+      if (p)
+        p.removeChild(this);
     }
   };
 
@@ -5247,8 +5275,14 @@
     remove: function(indexOrNode) {
       // Spec only allows index but implementations allow index or node.
       // remove() is also allowed which is same as remove(undefined)
+      if (indexOrNode === undefined) {
+        HTMLElement.prototype.remove.call(this);
+        return;
+      }
+
       if (typeof indexOrNode === 'object')
         indexOrNode = unwrap(indexOrNode);
+
       unwrap(this).remove(indexOrNode);
     },
 
@@ -6768,7 +6802,15 @@
   if (document.registerElement) {
     var originalRegisterElement = document.registerElement;
     Document.prototype.registerElement = function(tagName, object) {
-      var prototype = object.prototype;
+      var prototype, extendsOption;
+      if (object !== undefined) {
+        prototype = object.prototype;
+        extendsOption = object.extends;
+      }
+
+      if (!prototype)
+        prototype = Object.create(HTMLElement.prototype);
+
 
       // If we already used the object as a prototype for another custom
       // element.
@@ -6829,13 +6871,13 @@
       });
 
       var p = {prototype: newPrototype};
-      if (object.extends)
-        p.extends = object.extends;
+      if (extendsOption)
+        p.extends = extendsOption;
 
       function CustomElementConstructor(node) {
         if (!node) {
-          if (object.extends) {
-            return document.createElement(object.extends, tagName);
+          if (extendsOption) {
+            return document.createElement(extendsOption, tagName);
           } else {
             return document.createElement(tagName);
           }
@@ -7037,6 +7079,31 @@
 
 })(window.ShadowDOMPolyfill);
 
+/**
+ * Copyright 2014 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+  'use strict';
+
+  var unwrap = scope.unwrap;
+
+  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that
+  // requires wrapping. Since it is only a method we do not need a real wrapper,
+  // we can just override the method.
+
+  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;
+  var OriginalDataTransferSetDragImage =
+      OriginalDataTransfer.prototype.setDragImage;
+
+  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {
+    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);
+  };
+
+})(window.ShadowDOMPolyfill);
+
 // Copyright 2013 The Polymer Authors. All rights reserved.
 // Use of this source code is goverened by a BSD-style
 // license that can be found in the LICENSE file.
@@ -7207,7 +7274,7 @@
 
   Shimmed features:
 
-  * :host, :ancestor: ShadowDOM allows styling of the shadowRoot's host
+  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host
   element using the :host rule. To shim this feature, the :host styles are 
   reformatted and prefixed with a given scope name and promoted to a 
   document level stylesheet.
@@ -7381,7 +7448,7 @@
     def.rootStyles = styles;
     def.scopeStyles = def.rootStyles;
     var extendee = this.registry[def.extendsName];
-    if (extendee && (!root || root.querySelector('shadow'))) {
+    if (extendee) {
       def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);
     }
     return def;
@@ -7476,7 +7543,7 @@
     var unscoped = this.extractUnscopedRulesFromCssText(cssText);
     cssText = this.insertPolyfillHostInCssText(cssText);
     cssText = this.convertColonHost(cssText);
-    cssText = this.convertColonAncestor(cssText);
+    cssText = this.convertColonHostContext(cssText);
     cssText = this.convertCombinators(cssText);
     if (scopeSelector) {
       var self = this, cssText;
@@ -7525,7 +7592,7 @@
         this.colonHostPartReplacer);
   },
   /*
-   * convert a rule like :ancestor(.foo) > .bar { }
+   * convert a rule like :host-context(.foo) > .bar { }
    *
    * to
    *
@@ -7533,15 +7600,15 @@
    * 
    * and
    *
-   * :ancestor(.foo:host) .bar { ... }
+   * :host-context(.foo:host) .bar { ... }
    * 
    * to
    * 
    * scopeName.foo .bar { ... }
   */
-  convertColonAncestor: function(cssText) {
-    return this.convertColonRule(cssText, cssColonAncestorRe,
-        this.colonAncestorPartReplacer);
+  convertColonHostContext: function(cssText) {
+    return this.convertColonRule(cssText, cssColonHostContextRe,
+        this.colonHostContextPartReplacer);
   },
   convertColonRule: function(cssText, regExp, partReplacer) {
     // p1 = :host, p2 = contents of (), p3 rest of rule
@@ -7559,7 +7626,7 @@
       }
     });
   },
-  colonAncestorPartReplacer: function(host, part, suffix) {
+  colonHostContextPartReplacer: function(host, part, suffix) {
     if (part.match(polyfillHost)) {
       return this.colonHostPartReplacer(host, part, suffix);
     } else {
@@ -7573,7 +7640,10 @@
    * Convert ^ and ^^ combinators by replacing with space.
   */
   convertCombinators: function(cssText) {
-    return cssText.replace(/\^\^/g, ' ').replace(/\^/g, ' ');
+    for (var i=0; i < combinatorsRe.length; i++) {
+      cssText = cssText.replace(combinatorsRe[i], ' ');
+    }
+    return cssText;
   },
   // change a selector like 'div' to 'name div'
   scopeRules: function(cssRules, scopeSelector) {
@@ -7646,17 +7716,31 @@
     return scoped;
   },
   insertPolyfillHostInCssText: function(selector) {
-    return selector.replace(hostRe, polyfillHost).replace(colonHostRe,
-        polyfillHost).replace(colonAncestorRe, polyfillAncestor);
+    return selector.replace(colonHostContextRe, polyfillHostContext).replace(
+        colonHostRe, polyfillHost);
   },
   propertiesFromRule: function(rule) {
+    var cssText = rule.style.cssText;
     // TODO(sorvell): Safari cssom incorrectly removes quotes from the content
     // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)
-    if (rule.style.content && !rule.style.content.match(/['"]+/)) {
-      return rule.style.cssText.replace(/content:[^;]*;/g, 'content: \'' + 
+    // don't replace attr rules
+    if (rule.style.content && !rule.style.content.match(/['"]+|attr/)) {
+      cssText = cssText.replace(/content:[^;]*;/g, 'content: \'' + 
           rule.style.content + '\';');
     }
-    return rule.style.cssText;
+    // TODO(sorvell): we can workaround this issue here, but we need a list
+    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53
+    //
+    // inherit rules can be omitted from cssText
+    // TODO(sorvell): remove when Blink bug is fixed:
+    // https://code.google.com/p/chromium/issues/detail?id=358273
+    var style = rule.style;
+    for (var i in style) {
+      if (style[i] === 'initial') {
+        cssText += i + ': initial; ';
+      }
+    }
+    return cssText;
   },
   replaceTextInStyles: function(styles, action) {
     if (styles && action) {
@@ -7692,21 +7776,28 @@
     cssPartRe = /::part\(([^)]*)\)/gim,
     // note: :host pre-processed to -shadowcsshost.
     polyfillHost = '-shadowcsshost',
-    // note: :ancestor pre-processed to -shadowcssancestor.
-    polyfillAncestor = '-shadowcssancestor',
+    // note: :host-context pre-processed to -shadowcsshostcontext.
+    polyfillHostContext = '-shadowcsscontext',
     parenSuffix = ')(?:\\((' +
         '(?:\\([^)(]*\\)|[^)(]*)+?' +
         ')\\))?([^,{]*)';
     cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),
-    cssColonAncestorRe = new RegExp('(' + polyfillAncestor + parenSuffix, 'gim'),
+    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),
     selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$',
-    hostRe = /@host/gim,
     colonHostRe = /\:host/gim,
-    colonAncestorRe = /\:ancestor/gim,
+    colonHostContextRe = /\:host-context/gim,
     /* host name without combinator */
     polyfillHostNoCombinator = polyfillHost + '-no-combinator',
     polyfillHostRe = new RegExp(polyfillHost, 'gim'),
-    polyfillAncestorRe = new RegExp(polyfillAncestor, 'gim');
+    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),
+    combinatorsRe = [
+      /\^\^/g,
+      /\^/g,
+      /\/shadow\//g,
+      /\/shadow-deep\//g,
+      /::shadow/g,
+      /\/deep\//g
+    ];
 
 function stylesToCssText(styles, preserveComments) {
   var cssText = '';
@@ -7918,30 +8009,18 @@
   window.wrap = window.unwrap = function(n){
     return n;
   }
-
-  var originalCreateShadowRoot = Element.prototype.webkitCreateShadowRoot;
-  Element.prototype.webkitCreateShadowRoot = function() {
-    var elderRoot = this.webkitShadowRoot;
-    var root = originalCreateShadowRoot.call(this);
-    root.olderShadowRoot = elderRoot;
-    root.host = this;
-    CustomElements.watchShadow(this);
-    return root;
-  }
-
-  Object.defineProperties(Element.prototype, {
-    shadowRoot: {
-      get: function() {
-        return this.webkitShadowRoot;
-      }
-    },
-    createShadowRoot: {
-      value: function() {
-        return this.webkitCreateShadowRoot();
-      }
+  
+  addEventListener('DOMContentLoaded', function() {
+    if (CustomElements.useNative === false) {
+      var originalCreateShadowRoot = Element.prototype.createShadowRoot;
+      Element.prototype.createShadowRoot = function() {
+        var root = originalCreateShadowRoot.call(this);
+        CustomElements.watchShadow(this);
+        return root;
+      };
     }
   });
-
+  
   window.templateContent = function(inTemplate) {
     // if MDV exists, it may need to boostrap this template to reveal content
     if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
@@ -9789,23 +9868,38 @@
     },
     fetch: function(url, elt) {
       flags.load && console.log('fetch', url, elt);
-      var receiveXhr = function(err, resource) {
-        this.receive(url, elt, err, resource);
-      }.bind(this);
-      xhr.load(url, receiveXhr);
-      // TODO(sorvell): blocked on
-      // https://code.google.com/p/chromium/issues/detail?id=257221
-      // xhr'ing for a document makes scripts in imports runnable; otherwise
-      // they are not; however, it requires that we have doctype=html in
-      // the import which is unacceptable. This is only needed on Chrome
-      // to avoid the bug above.
-      /*
-      if (isDocumentLink(elt)) {
-        xhr.loadDocument(url, receiveXhr);
+      if (url.match(/^data:/)) {
+        // Handle Data URI Scheme
+        var pieces = url.split(',');
+        var header = pieces[0];
+        var body = pieces[1];
+        if(header.indexOf(';base64') > -1) {
+          body = atob(body);
+        } else {
+          body = decodeURIComponent(body);
+        }
+        setTimeout(function() {
+            this.receive(url, elt, null, body);
+        }.bind(this), 0);
       } else {
+        var receiveXhr = function(err, resource) {
+          this.receive(url, elt, err, resource);
+        }.bind(this);
         xhr.load(url, receiveXhr);
+        // TODO(sorvell): blocked on)
+        // https://code.google.com/p/chromium/issues/detail?id=257221
+        // xhr'ing for a document makes scripts in imports runnable; otherwise
+        // they are not; however, it requires that we have doctype=html in
+        // the import which is unacceptable. This is only needed on Chrome
+        // to avoid the bug above.
+        /*
+        if (isDocumentLink(elt)) {
+          xhr.loadDocument(url, receiveXhr);
+        } else {
+          xhr.load(url, receiveXhr);
+        }
+        */
       }
-      */
     },
     receive: function(url, elt, err, resource) {
       this.cache[url] = resource;
@@ -10930,6 +11024,7 @@
   scope.upgradeDocument = nop;
   scope.upgradeDocumentTree = nop;
   scope.takeRecords = nop;
+  scope.reservedTagList = [];
 
 } else {
 
@@ -10986,6 +11081,10 @@
       // offer guidance)
       throw new Error('document.registerElement: first argument (\'name\') must contain a dash (\'-\'). Argument provided was \'' + String(name) + '\'.');
     }
+    // prevent registering reserved names
+    if (isReservedTag(name)) {
+      throw new Error('Failed to execute \'registerElement\' on \'Document\': Registration failed for type \'' + String(name) + '\'. The type name is invalid.');
+    }
     // elements may only be registered once
     if (getRegisteredDefinition(name)) {
       throw new Error('DuplicateDefinitionError: a type with name \'' + String(name) + '\' is already registered');
@@ -11029,6 +11128,19 @@
     return definition.ctor;
   }
 
+  function isReservedTag(name) {
+    for (var i = 0; i < reservedTagList.length; i++) {
+      if (name === reservedTagList[i]) {
+        return true;
+      }
+    }
+  }
+
+  var reservedTagList = [
+    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',
+    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'
+  ];
+
   function ancestry(extnds) {
     var extendee = getRegisteredDefinition(extnds);
     if (extendee) {
@@ -11325,6 +11437,7 @@
 
 // exports
 scope.instanceof = isInstance;
+scope.reservedTagList = reservedTagList;
 
 // bc
 document.register = document.registerElement;
@@ -11758,7 +11871,7 @@
  */
 (function() {
   function shadowSelector(v) {
-    return 'body ^^ ' + selector(v);
+    return 'body /shadow-deep/ ' + selector(v);
   }
   function selector(v) {
     return '[touch-action="' + v + '"]';
@@ -11780,18 +11893,31 @@
     }
   ];
   var styles = '';
-  attrib2css.forEach(function(r) {
-    if (String(r) === r) {
-      styles += selector(r) + rule(r) + '\n';
-      styles += shadowSelector(r) + rule(r) + '\n';
-    } else {
-      styles += r.selectors.map(selector) + rule(r.rule) + '\n';
-      styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\n';
-    }
-  });
-  var el = document.createElement('style');
-  el.textContent = styles;
-  document.head.appendChild(el);
+  // 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);
+  }
 })();
 
 /*
@@ -11815,16 +11941,6 @@
  * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.
  */
 (function(scope) {
-  // test for DOM Level 4 Events
-  var NEW_MOUSE_EVENT = false;
-  var HAS_BUTTONS = false;
-  try {
-    var ev = new MouseEvent('click', {buttons: 1});
-    NEW_MOUSE_EVENT = true;
-    HAS_BUTTONS = ev.buttons === 1;
-    ev = null;
-  } catch(e) {
-  }
 
   var MOUSE_PROPS = [
     'bubbles',
@@ -11841,6 +11957,8 @@
     'metaKey',
     'button',
     'relatedTarget',
+    'pageX',
+    'pageY'
   ];
 
   var MOUSE_DEFAULTS = [
@@ -11857,73 +11975,23 @@
     false,
     false,
     0,
-    null
+    null,
+    0,
+    0
   ];
 
   function PointerEvent(inType, inDict) {
-    inDict = inDict || {};
-    // According to the w3c spec,
-    // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-button
-    // MouseEvent.button == 0 can mean either no mouse button depressed, or the
-    // left mouse button depressed.
-    //
-    // As of now, the only way to distinguish between the two states of
-    // MouseEvent.button is by using the deprecated MouseEvent.which property, as
-    // this maps mouse buttons to positive integers > 0, and uses 0 to mean that
-    // no mouse button is held.
-    //
-    // MouseEvent.which is derived from MouseEvent.button at MouseEvent creation,
-    // but initMouseEvent does not expose an argument with which to set
-    // MouseEvent.which. Calling initMouseEvent with a buttonArg of 0 will set
-    // MouseEvent.button == 0 and MouseEvent.which == 1, breaking the expectations
-    // of app developers.
-    //
-    // The only way to propagate the correct state of MouseEvent.which and
-    // MouseEvent.button to a new MouseEvent.button == 0 and MouseEvent.which == 0
-    // is to call initMouseEvent with a buttonArg value of -1.
-    //
-    // This is fixed with DOM Level 4's use of buttons
-    var buttons = inDict.buttons;
-    // touch has two possible buttons state: 0 and 1, rely on being told the right one
-    if (!HAS_BUTTONS && !buttons && inType !== 'touch') {
-      switch (inDict.which) {
-        case 1: buttons = 1; break;
-        case 2: buttons = 4; break;
-        case 3: buttons = 2; break;
-        default: buttons = 0;
-      }
+    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];
     }
-
-    var e;
-    if (NEW_MOUSE_EVENT) {
-      e = new MouseEvent(inType, inDict);
-    } else {
-      e = document.createEvent('MouseEvent');
-
-      // import values from the given dictionary
-      var props = {}, p;
-      for(var i = 0; i < MOUSE_PROPS.length; i++) {
-        p = MOUSE_PROPS[i];
-        props[p] = inDict[p] || MOUSE_DEFAULTS[i];
-      }
-
-      // define the properties inherited from MouseEvent
-      e.initMouseEvent(
-        inType, props.bubbles, props.cancelable, props.view, props.detail,
-        props.screenX, props.screenY, props.clientX, props.clientY, props.ctrlKey,
-        props.altKey, props.shiftKey, props.metaKey, props.button, props.relatedTarget
-      );
-    }
-
-    // make the event pass instanceof checks
-    e.__proto__ = PointerEvent.prototype;
-
-    // define the buttons property according to DOM Level 3 spec
-    if (!HAS_BUTTONS) {
-      // IE 10 has buttons on MouseEvent.prototype as a getter w/o any setting
-      // mechanism
-      Object.defineProperty(e, 'buttons', {get: function(){ return buttons; }, enumerable: true});
-    }
+    e.buttons = inDict.buttons || 0;
 
     // Spec requires that pointers without pressure specified use 0.5 for down
     // state and 0 for up state.
@@ -11931,27 +11999,26 @@
     if (inDict.pressure) {
       pressure = inDict.pressure;
     } else {
-      pressure = buttons ? 0.5 : 0;
+      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
-    Object.defineProperties(e, {
-      pointerId: { value: inDict.pointerId || 0, enumerable: true },
-      width: { value: inDict.width || 0, enumerable: true },
-      height: { value: inDict.height || 0, enumerable: true },
-      pressure: { value: pressure, enumerable: true },
-      tiltX: { value: inDict.tiltX || 0, enumerable: true },
-      tiltY: { value: inDict.tiltY || 0, enumerable: true },
-      pointerType: { value: inDict.pointerType || '', enumerable: true },
-      hwTimestamp: { value: inDict.hwTimestamp || 0, enumerable: true },
-      isPrimary: { value: inDict.isPrimary || false, enumerable: true }
-    });
+    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;
   }
 
-  // PointerEvent extends MouseEvent
-  PointerEvent.prototype = Object.create(MouseEvent.prototype);
-
   // attach to window
   if (!scope.PointerEvent) {
     scope.PointerEvent = PointerEvent;
@@ -12062,7 +12129,9 @@
     'type',
     'target',
     'currentTarget',
-    'which'
+    'which',
+    'pageX',
+    'pageY'
   ];
 
   var CLONE_DEFAULTS = [
@@ -12097,6 +12166,8 @@
     '',
     null,
     null,
+    0,
+    0,
     0
   ];
 
@@ -12115,13 +12186,12 @@
    *   - pointercancel: a pointer will no longer generate events
    */
   var dispatcher = {
-    targets: new WeakMap(),
-    handledEvents: new WeakMap(),
     pointermap: new scope.PointerMap(),
-    eventMap: {},
+    eventMap: Object.create(null),
+    captureInfo: Object.create(null),
     // Scope objects for native events.
     // This exists for ease of testing.
-    eventSources: {},
+    eventSources: Object.create(null),
     eventSourceList: [],
     /**
      * Add a new event source that will generate pointer events.
@@ -12211,7 +12281,7 @@
       // 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 (this.handledEvents.get(inEvent)) {
+      if (inEvent._handledByPE) {
         return;
       }
       var type = inEvent.type;
@@ -12219,7 +12289,7 @@
       if (fn) {
         fn(inEvent);
       }
-      this.handledEvents.set(inEvent, true);
+      inEvent._handledByPE = true;
     },
     // set up event listeners
     listen: function(target, events) {
@@ -12250,14 +12320,14 @@
      */
     makeEvent: function(inType, inEvent) {
       // relatedTarget must be null if pointer is captured
-      if (this.captureInfo) {
+      if (this.captureInfo[inEvent.pointerId]) {
         inEvent.relatedTarget = null;
       }
       var e = new PointerEvent(inType, inEvent);
       if (inEvent.preventDefault) {
         e.preventDefault = inEvent.preventDefault;
       }
-      this.targets.set(e, this.targets.get(inEvent) || inEvent.target);
+      e._target = e._target || inEvent.target;
       return e;
     },
     // make and dispatch an event in one call
@@ -12273,7 +12343,7 @@
      *    properties.
      */
     cloneEvent: function(inEvent) {
-      var eventCopy = {}, p;
+      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];
@@ -12297,33 +12367,32 @@
     getTarget: function(inEvent) {
       // if pointer capture is set, route all events for the specified pointerId
       // to the capture target
-      if (this.captureInfo) {
-        if (this.captureInfo.id === inEvent.pointerId) {
-          return this.captureInfo.target;
-        }
-      }
-      return this.targets.get(inEvent);
+      return this.captureInfo[inEvent.pointerId] || inEvent._target;
     },
     setCapture: function(inPointerId, inTarget) {
-      if (this.captureInfo) {
-        this.releaseCapture(this.captureInfo.id);
+      if (this.captureInfo[inPointerId]) {
+        this.releaseCapture(inPointerId);
       }
-      this.captureInfo = {id: inPointerId, target: inTarget};
-      var e = new PointerEvent('gotpointercapture', { bubbles: true });
+      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);
-      this.targets.set(e, inTarget);
+      e._target = inTarget;
       this.asyncDispatchEvent(e);
     },
     releaseCapture: function(inPointerId) {
-      if (this.captureInfo && this.captureInfo.id === inPointerId) {
-        var e = new PointerEvent('lostpointercapture', { bubbles: true });
-        var t = this.captureInfo.target;
-        this.captureInfo = null;
+      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);
-        this.targets.set(e, t);
+        e._target = t;
         this.asyncDispatchEvent(e);
       }
     },
@@ -12340,7 +12409,7 @@
       }
     },
     asyncDispatchEvent: function(inEvent) {
-      setTimeout(this.dispatchEvent.bind(this, inEvent), 0);
+      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent));
     }
   };
   dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
@@ -12483,6 +12552,13 @@
   // 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,
@@ -12524,6 +12600,9 @@
       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) {
@@ -12588,6 +12667,7 @@
 
 (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;
@@ -12606,7 +12686,6 @@
   
   // handler block for native touch events
   var touchEvents = {
-    scrollType: new WeakMap(),
     events: [
       'touchstart',
       'touchmove',
@@ -12631,21 +12710,21 @@
       var a = el.getAttribute(ATTRIB);
       var st = this.touchActionToScrollType(a);
       if (st) {
-        this.scrollType.set(el, st);
+        el._scrollType = st;
         dispatcher.listen(el, this.events);
         // set touch-action on shadows as well
         allShadows(el).forEach(function(s) {
-          this.scrollType.set(s, st);
+          s._scrollType = st;
           dispatcher.listen(s, this.events);
         }, this);
       }
     },
     elementRemoved: function(el) {
-      this.scrollType['delete'](el);
+      el._scrollType = undefined;
       dispatcher.unlisten(el, this.events);
       // remove touch-action from shadow
       allShadows(el).forEach(function(s) {
-        this.scrollType['delete'](s);
+        s._scrollType = undefined;
         dispatcher.unlisten(s, this.events);
       }, this);
     },
@@ -12655,9 +12734,9 @@
       var oldSt = this.touchActionToScrollType(oldValue);
       // simply update scrollType if listeners are already established
       if (st && oldSt) {
-        this.scrollType.set(el, st);
+        el._scrollType = st;
         allShadows(el).forEach(function(s) {
-          this.scrollType.set(s, st);
+          s._scrollType = st;
         }, this);
       } else if (oldSt) {
         this.elementRemoved(el);
@@ -12727,44 +12806,46 @@
       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.
-      e.pointerId = inTouch.identifier + 2;
-      e.target = findTarget(e);
+      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(this.currentTouchEvent);
+      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.type;
-      var pointers = touchMap(tl, this.touchToPointer, this);
-      // forward touch preventDefaults
-      pointers.forEach(function(p) {
-        p.preventDefault = function() {
-          this.scrolling = false;
-          this.firstXY = null;
-          inEvent.preventDefault();
-        };
-      }, this);
-      pointers.forEach(inFunction, this);
+      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 = this.scrollType.get(inEvent.currentTarget);
+        var scrollAxis = inEvent.currentTarget._scrollType;
         if (scrollAxis === 'none') {
           // this element is a touch-action: none, should never scroll
           ret = false;
@@ -12811,7 +12892,7 @@
           // index in pointermap.
           if (key !== 1 && !this.findTouch(tl, key - 2)) {
             var p = value.out;
-            d.push(this.touchToPointer(p));
+            d.push(p);
           }
         }, this);
         d.forEach(this.cancelOut, this);
@@ -13027,8 +13108,7 @@
   var dispatcher = scope.dispatcher;
 
   // only activate if this platform does not have pointer events
-  if (window.navigator.pointerEnabled === undefined) {
-    Object.defineProperty(window.navigator, 'pointerEnabled', {value: true, enumerable: true});
+  if (window.PointerEvent !== scope.PointerEvent) {
 
     if (window.navigator.msPointerEnabled) {
       var tp = window.navigator.msMaxTouchPoints;
@@ -13408,7 +13488,7 @@
       // must clone events to keep the (possibly shadowed) target correct for
       // async dispatching
       var e = this.cloneEvent(inEvent);
-      setTimeout(this.runQueue.bind(this, inHandlerFns, e), 0);
+      requestAnimationFrame(this.runQueue.bind(this, inHandlerFns, e));
     },
     // Dispatch the queued events
     runQueue: function(inHandlers, inEvent) {
@@ -13469,10 +13549,7 @@
       }
     },
     asyncDispatchEvent: function(inEvent, inTarget) {
-      var fn = function() {
-        this.dispatchEvent(inEvent, inTarget);
-      }.bind(this);
-      setTimeout(fn, 0);
+      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent, inTarget));
     },
     preventTap: function(inPointerId) {
       var t = this.recognizers.tap;
@@ -14091,7 +14168,8 @@
         pointers.push(p);
       });
       var dist = 0;
-      var points = {};
+      // 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];
@@ -14269,19 +14347,12 @@
   }
 })(window.PointerGestures);
 
-// 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.
+// 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';
@@ -14296,42 +14367,24 @@
     return typeof node.getElementById === 'function' ? node : null;
   }
 
-
   Node.prototype.bind = function(name, observable) {
     console.error('Unhandled binding to Node: ', this, name, observable);
   };
 
-  function unbind(node, name) {
-    var bindings = node.bindings;
-    if (!bindings) {
-      node.bindings = {};
-      return;
-    }
+  function updateBindings(node, name, binding) {
+    var bindings = node.bindings_;
+    if (!bindings)
+      bindings = node.bindings_ = {};
 
-    var binding = bindings[name];
-    if (!binding)
-      return;
+    if (bindings[name])
+      binding[name].close();
 
-    binding.close();
-    bindings[name] = undefined;
+    return bindings[name] = binding;
   }
 
-  Node.prototype.unbind = function(name) {
-    unbind(this, name);
-  };
-
-  Node.prototype.unbindAll = function() {
-    if (!this.bindings)
-      return;
-    var names = Object.keys(this.bindings);
-    for (var i = 0; i < names.length; i++) {
-      var binding = this.bindings[names[i]];
-      if (binding)
-        binding.close();
-    }
-
-    this.bindings = {};
-  };
+  function returnBinding(node, name, binding) {
+    return binding;
+  }
 
   function sanitizeValue(value) {
     return value == null ? '' : value;
@@ -14347,6 +14400,19 @@
     };
   }
 
+  var maybeUpdateBindings = returnBinding;
+
+  Object.defineProperty(Platform, 'enableBindingsReflection', {
+    get: function() {
+      return maybeUpdateBindings === updateBindings;
+    },
+    set: function(enable) {
+      maybeUpdateBindings = enable ? updateBindings : returnBinding;
+      return enable;
+    },
+    configurable: true
+  });
+
   Text.prototype.bind = function(name, value, oneTime) {
     if (name !== 'textContent')
       return Node.prototype.bind.call(this, name, value, oneTime);
@@ -14354,9 +14420,9 @@
     if (oneTime)
       return updateText(this, value);
 
-    unbind(this, 'textContent');
-    updateText(this, value.open(textBinding(this)));
-    return this.bindings.textContent = value;
+    var observable = value;
+    updateText(this, observable.open(textBinding(this)));
+    return maybeUpdateBindings(this, name, observable);
   }
 
   function updateAttribute(el, name, conditional, value) {
@@ -14387,11 +14453,12 @@
     if (oneTime)
       return updateAttribute(this, name, conditional, value);
 
-    unbind(this, name);
-    updateAttribute(this, name, conditional,
-        value.open(attributeBinding(this, name, conditional)));
 
-    return this.bindings[name] = value;
+    var observable = value;
+    updateAttribute(this, name, conditional,
+        observable.open(attributeBinding(this, name, conditional)));
+
+    return maybeUpdateBindings(this, name, observable);
   };
 
   var checkboxEventType;
@@ -14460,15 +14527,13 @@
     }
     input.addEventListener(eventType, eventHandler);
 
-    var capturedClose = observable.close;
-    observable.close = function() {
-      if (!capturedClose)
-        return;
-      input.removeEventListener(eventType, eventHandler);
+    return {
+      close: function() {
+        input.removeEventListener(eventType, eventHandler);
+        observable.close();
+      },
 
-      observable.close = capturedClose;
-      observable.close();
-      capturedClose = undefined;
+      observable_: observable
     }
   }
 
@@ -14512,10 +14577,10 @@
     if (input.tagName === 'INPUT' &&
         input.type === 'radio') {
       getAssociatedRadioButtons(input).forEach(function(radio) {
-        var checkedBinding = radio.bindings.checked;
+        var checkedBinding = radio.bindings_.checked;
         if (checkedBinding) {
           // Set the value directly to avoid an infinite call stack.
-          checkedBinding.setValue(false);
+          checkedBinding.observable_.setValue(false);
         }
       });
     }
@@ -14525,7 +14590,6 @@
     if (name !== 'value' && name !== 'checked')
       return HTMLElement.prototype.bind.call(this, name, value, oneTime);
 
-
     this.removeAttribute(name);
     var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;
     var postEventFn = name == 'checked' ? checkedPostEvent : noop;
@@ -14533,13 +14597,15 @@
     if (oneTime)
       return updateInput(this, name, value, sanitizeFn);
 
-    unbind(this, name);
-    bindInputEvent(this, name, value, postEventFn);
+
+    var observable = value;
+    var binding = bindInputEvent(this, name, observable, postEventFn);
     updateInput(this, name,
-                value.open(inputBinding(this, name, sanitizeFn)),
+                observable.open(inputBinding(this, name, sanitizeFn)),
                 sanitizeFn);
 
-    return this.bindings[name] = value;
+    // Checkboxes may need to update bindings of other checkboxes.
+    return updateBindings(this, name, binding);
   }
 
   HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {
@@ -14551,12 +14617,11 @@
     if (oneTime)
       return updateInput(this, 'value', value);
 
-    unbind(this, 'value');
-    bindInputEvent(this, 'value', value);
+    var observable = value;
+    var binding = bindInputEvent(this, 'value', observable);
     updateInput(this, 'value',
-                value.open(inputBinding(this, 'value', sanitizeValue)));
-
-    return this.bindings.value = value;
+                observable.open(inputBinding(this, 'value', sanitizeValue)));
+    return maybeUpdateBindings(this, name, binding);
   }
 
   function updateOption(option, value) {
@@ -14565,18 +14630,18 @@
     var selectBinding;
     var oldValue;
     if (parentNode instanceof HTMLSelectElement &&
-        parentNode.bindings &&
-        parentNode.bindings.value) {
+        parentNode.bindings_ &&
+        parentNode.bindings_.value) {
       select = parentNode;
-      selectBinding = select.bindings.value;
+      selectBinding = select.bindings_.value;
       oldValue = select.value;
     }
 
     option.value = sanitizeValue(value);
 
     if (select && select.value != oldValue) {
-      selectBinding.setValue(select.value);
-      selectBinding.discardChanges();
+      selectBinding.observable_.setValue(select.value);
+      selectBinding.observable_.discardChanges();
       Platform.performMicrotaskCheckpoint();
     }
   }
@@ -14596,10 +14661,10 @@
     if (oneTime)
       return updateOption(this, value);
 
-    unbind(this, 'value');
-    bindInputEvent(this, 'value', value);
-    updateOption(this, value.open(optionBinding(this)));
-    return this.bindings.value = value;
+    var observable = value;
+    var binding = bindInputEvent(this, 'value', observable);
+    updateOption(this, observable.open(optionBinding(this)));
+    return maybeUpdateBindings(this, name, binding);
   }
 
   HTMLSelectElement.prototype.bind = function(name, value, oneTime) {
@@ -14614,27 +14679,22 @@
     if (oneTime)
       return updateInput(this, name, value);
 
-    unbind(this, name);
-    bindInputEvent(this, name, value);
+    var observable = value;
+    var binding = bindInputEvent(this, name, observable);
     updateInput(this, name,
-                value.open(inputBinding(this, name)));
-    return this.bindings[name] = value;
+                observable.open(inputBinding(this, name)));
+
+    // Option update events may need to access select bindings.
+    return updateBindings(this, name, binding);
   }
 })(this);
 
-// 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.
+// 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';
@@ -15099,8 +15159,13 @@
       if (oneTime)
         return;
 
-      this.unbind('ref');
-      return this.bindings.ref = value;
+      if (!this.bindings_) {
+        this.bindings_ = { ref: value };
+      } else {
+        this.bindings_.ref = value;
+      }
+
+      return value;
     },
 
     processBindingDirectives_: function(directives) {
@@ -15111,7 +15176,6 @@
         if (this.iterator_) {
           this.iterator_.close();
           this.iterator_ = undefined;
-          this.bindings.iterator = undefined;
         }
 
         return;
@@ -15119,8 +15183,6 @@
 
       if (!this.iterator_) {
         this.iterator_ = new TemplateIterator(this);
-        this.bindings = this.bindings || {};
-        this.bindings.iterator = this.iterator_;
       }
 
       this.iterator_.updateDependencies(directives, this.model_);
@@ -15133,14 +15195,16 @@
       return this.iterator_;
     },
 
-    createInstance: function(model, bindingDelegate, delegate_,
-                             instanceBindings_) {
+    createInstance: function(model, bindingDelegate, delegate_) {
       if (bindingDelegate)
         delegate_ = this.newDelegate_(bindingDelegate);
 
       if (!this.refContent_)
         this.refContent_ = this.ref_.content;
       var content = this.refContent_;
+      if (content.firstChild === null)
+        return emptyInstance;
+
       var map = this.bindingMap_;
       if (!map || map.content !== content) {
         // TODO(rafaelw): Setup a MutationObserver on content to detect
@@ -15155,21 +15219,32 @@
       var instance = stagingDocument.createDocumentFragment();
       instance.templateCreator_ = this;
       instance.protoContent_ = content;
-
-      var instanceRecord = {
+      instance.bindings_ = [];
+      instance.terminator_ = null;
+      var instanceRecord = instance.templateInstance_ = {
         firstNode: null,
         lastNode: null,
         model: model
       };
 
       var i = 0;
+      var collectTerminator = false;
       for (var child = content.firstChild; child; child = child.nextSibling) {
+        // The terminator of the instance is the clone of the last child of the
+        // content. If the last child is an active template, it may produce
+        // instances as a result of production, so simply collecting the last
+        // child of the instance after it has finished producing may be wrong.
+        if (child.nextSibling === null)
+          collectTerminator = true;
+
         var clone = cloneAndBindInstance(child, instance, stagingDocument,
                                          map.children[i++],
                                          model,
                                          delegate_,
-                                         instanceBindings_);
+                                         instance.bindings_);
         clone.templateInstance_ = instanceRecord;
+        if (collectTerminator)
+          instance.terminator_ = clone;
       }
 
       instanceRecord.firstNode = instance.firstChild;
@@ -15204,7 +15279,8 @@
     clear: function() {
       this.model_ = undefined;
       this.delegate_ = undefined;
-      this.bindings_ = undefined;
+      if (this.bindings_ && this.bindings_.ref)
+        this.bindings_.ref.close()
       this.refContent_ = undefined;
       if (!this.iterator_)
         return;
@@ -15309,9 +15385,14 @@
       var pathString = s.slice(startIndex + 2, endIndex).trim();
       tokens.push(oneTime); // ONE_TIME?
       onlyOneTime = onlyOneTime && oneTime;
-      tokens.push(Path.get(pathString)); // PATH
       var delegateFn = prepareBindingFn &&
                        prepareBindingFn(pathString, name, node);
+      // Don't try to parse the expression if there's a prepareBinding function
+      if (delegateFn == null) {
+        tokens.push(Path.get(pathString)); // PATH
+      } else {
+        tokens.push(null);
+      }
       tokens.push(delegateFn); // DELEGATE_FN
       lastIndex = endIndex + 2;
     }
@@ -15529,14 +15610,14 @@
     }
   });
 
+  var emptyInstance = document.createDocumentFragment();
+  emptyInstance.bindings_ = [];
+  emptyInstance.terminator_ = null;
+
   function TemplateIterator(templateElement) {
     this.closed = false;
     this.templateElement_ = templateElement;
-
-    // Flattened array of tuples:
-    //   <instanceTerminatorNode, [bindingsSetupByInstance]>
-    this.terminators = [];
-
+    this.instances = [];
     this.deps = undefined;
     this.iteratedValue = [];
     this.presentValue = undefined;
@@ -15631,63 +15712,53 @@
                                                         this.iteratedValue));
     },
 
-    getTerminatorAt: function(index) {
+    getLastInstanceNode: function(index) {
       if (index == -1)
         return this.templateElement_;
-      var terminator = this.terminators[index*2];
+      var instance = this.instances[index];
+      var terminator = instance.terminator_;
+      if (!terminator)
+        return this.getLastInstanceNode(index - 1);
+
       if (terminator.nodeType !== Node.ELEMENT_NODE ||
           this.templateElement_ === terminator) {
         return terminator;
       }
 
-      var subIterator = terminator.iterator_;
-      if (!subIterator)
+      var subtemplateIterator = terminator.iterator_;
+      if (!subtemplateIterator)
         return terminator;
 
-      return subIterator.getTerminatorAt(subIterator.terminators.length/2 - 1);
+      return subtemplateIterator.getLastTemplateNode();
     },
 
-    // TODO(rafaelw): If we inserting sequences of instances we can probably
-    // avoid lots of calls to getTerminatorAt(), or cache its result.
-    insertInstanceAt: function(index, fragment, instanceNodes,
-                               instanceBindings) {
-      var previousTerminator = this.getTerminatorAt(index - 1);
-      var terminator = previousTerminator;
-      if (fragment)
-        terminator = fragment.lastChild || terminator;
-      else if (instanceNodes)
-        terminator = instanceNodes[instanceNodes.length - 1] || terminator;
+    getLastTemplateNode: function() {
+      return this.getLastInstanceNode(this.instances.length - 1);
+    },
 
-      this.terminators.splice(index*2, 0, terminator, instanceBindings);
+    insertInstanceAt: function(index, fragment) {
+      var previousInstanceLast = this.getLastInstanceNode(index - 1);
       var parent = this.templateElement_.parentNode;
-      var insertBeforeNode = previousTerminator.nextSibling;
+      this.instances.splice(index, 0, fragment);
 
-      if (fragment) {
-        parent.insertBefore(fragment, insertBeforeNode);
-      } else if (instanceNodes) {
-        for (var i = 0; i < instanceNodes.length; i++)
-          parent.insertBefore(instanceNodes[i], insertBeforeNode);
-      }
+      parent.insertBefore(fragment, previousInstanceLast.nextSibling);
     },
 
     extractInstanceAt: function(index) {
-      var instanceNodes = [];
-      var previousTerminator = this.getTerminatorAt(index - 1);
-      var terminator = this.getTerminatorAt(index);
-      instanceNodes.instanceBindings = this.terminators[index*2 + 1];
-      this.terminators.splice(index*2, 2);
-
+      var previousInstanceLast = this.getLastInstanceNode(index - 1);
+      var lastNode = this.getLastInstanceNode(index);
       var parent = this.templateElement_.parentNode;
-      while (terminator !== previousTerminator) {
-        var node = previousTerminator.nextSibling;
-        if (node == terminator)
-          terminator = previousTerminator;
+      var instance = this.instances.splice(index, 1)[0];
 
-        parent.removeChild(node);
-        instanceNodes.push(node);
+      while (lastNode !== previousInstanceLast) {
+        var node = previousInstanceLast.nextSibling;
+        if (node == lastNode)
+          lastNode = previousInstanceLast;
+
+        instance.appendChild(parent.removeChild(node));
       }
 
-      return instanceNodes;
+      return instance;
     },
 
     getDelegateFn: function(fn) {
@@ -15721,46 +15792,50 @@
                                delegate.prepareInstancePositionChanged);
       }
 
+      // Instance Removals
       var instanceCache = new Map;
       var removeDelta = 0;
-      splices.forEach(function(splice) {
-        splice.removed.forEach(function(model) {
-          var instanceNodes =
-              this.extractInstanceAt(splice.index + removeDelta);
-          instanceCache.set(model, instanceNodes);
-        }, this);
+      for (var i = 0; i < splices.length; i++) {
+        var splice = splices[i];
+        var removed = splice.removed;
+        for (var j = 0; j < removed.length; j++) {
+          var model = removed[j];
+          var instance = this.extractInstanceAt(splice.index + removeDelta);
+          if (instance !== emptyInstance) {
+            instanceCache.set(model, instance);
+          }
+        }
 
         removeDelta -= splice.addedCount;
-      }, this);
+      }
 
-      splices.forEach(function(splice) {
+      // Instance Insertions
+      for (var i = 0; i < splices.length; i++) {
+        var splice = splices[i];
         var addIndex = splice.index;
         for (; addIndex < splice.index + splice.addedCount; addIndex++) {
           var model = this.iteratedValue[addIndex];
-          var fragment = undefined;
-          var instanceNodes = instanceCache.get(model);
-          var instanceBindings;
-          if (instanceNodes) {
+          var instance = instanceCache.get(model);
+          if (instance) {
             instanceCache.delete(model);
-            instanceBindings = instanceNodes.instanceBindings;
           } else {
-            instanceBindings = [];
-            if (this.instanceModelFn_)
+            if (this.instanceModelFn_) {
               model = this.instanceModelFn_(model);
+            }
 
-            if (model !== undefined) {
-              fragment = template.createInstance(model, undefined, delegate,
-                                                 instanceBindings);
+            if (model === undefined) {
+              instance = emptyInstance;
+            } else {
+              instance = template.createInstance(model, undefined, delegate);
             }
           }
 
-          this.insertInstanceAt(addIndex, fragment, instanceNodes,
-                                instanceBindings);
+          this.insertInstanceAt(addIndex, instance);
         }
-      }, this);
+      }
 
-      instanceCache.forEach(function(instanceNodes) {
-        this.closeInstanceBindings(instanceNodes.instanceBindings);
+      instanceCache.forEach(function(instance) {
+        this.closeInstanceBindings(instance);
       }, this);
 
       if (this.instancePositionChangedFn_)
@@ -15768,17 +15843,11 @@
     },
 
     reportInstanceMoved: function(index) {
-      var previousTerminator = this.getTerminatorAt(index - 1);
-      var terminator = this.getTerminatorAt(index);
-      if (previousTerminator === terminator)
-        return; // instance has zero nodes.
+      var instance = this.instances[index];
+      if (instance === emptyInstance)
+        return;
 
-      // 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 templateInstance = previousTerminator.nextSibling.templateInstance;
-      this.instancePositionChangedFn_(templateInstance, index);
+      this.instancePositionChangedFn_(instance.templateInstance_, index);
     },
 
     reportInstancesMoved: function(splices) {
@@ -15806,16 +15875,17 @@
       if (offset == 0)
         return;
 
-      var length = this.terminators.length / 2;
+      var length = this.instances.length;
       while (index < length) {
         this.reportInstanceMoved(index);
         index++;
       }
     },
 
-    closeInstanceBindings: function(instanceBindings) {
-      for (var i = 0; i < instanceBindings.length; i++) {
-        instanceBindings[i].close();
+    closeInstanceBindings: function(instance) {
+      var bindings = instance.bindings_;
+      for (var i = 0; i < bindings.length; i++) {
+        bindings[i].close();
       }
     },
 
@@ -15831,11 +15901,11 @@
       if (this.closed)
         return;
       this.unobserve();
-      for (var i = 1; i < this.terminators.length; i += 2) {
-        this.closeInstanceBindings(this.terminators[i]);
+      for (var i = 0; i < this.instances.length; i++) {
+        this.closeInstanceBindings(this.instances[i]);
       }
 
-      this.terminators.length = 0;
+      this.instances.length = 0;
       this.closeDeps();
       this.templateElement_.iterator_ = undefined;
       this.closed = true;
@@ -16884,19 +16954,12 @@
     };
 })(this);
 
-// Copyright 2013 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.
+// 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';
@@ -17323,10 +17386,18 @@
         return this.getValue(model, undefined, filterRegistry);
 
       var observer = new CompoundObserver();
-      this.getValue(model, observer, filterRegistry);  // captures deps.
+      // 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();
 
@@ -17470,6 +17541,23 @@
     }
   }
 
+  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 = {
@@ -17513,7 +17601,7 @@
         return prepareEventBinding(path, name, this);
       }
 
-      if (path.valid) {
+      if (!isLiteralExpression(pathString) && path.valid) {
         if (path.length == 1) {
           return function(model, node, oneTime) {
             if (oneTime)
@@ -17521,9 +17609,8 @@
 
             var scope = findScope(model, path[0]);
             return new PathObserver(scope, path);
-          }
+          };
         }
-
         return; // bail out early if pathString is simple path.
       }
 
@@ -17586,14 +17673,17 @@
 };
 
 // polling dirty checker
-var FLUSH_POLL_INTERVAL = 125;
-window.addEventListener('WebComponentsReady', function() {
-  flush();
-  // flush periodically if platform does not have object observe.
-  if (!Observer.hasObjectObserve) {
+// flush periodically if platform does not have object observe.
+if (!Observer.hasObjectObserve) {
+  var FLUSH_POLL_INTERVAL = 125;
+  window.addEventListener('WebComponentsReady', function() {
+    flush();
     scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);
-  }
-});
+  });
+} else {
+  // make flush a no-op when we have Object.observe
+  flush = function() {};
+}
 
 if (window.CustomElements && !CustomElements.useNative) {
   var originalImportNode = Document.prototype.importNode;
diff --git a/pkg/web_components/lib/platform.concat.js.map b/pkg/web_components/lib/platform.concat.js.map
index d8b6a8c..93e18ca 100644
--- a/pkg/web_components/lib/platform.concat.js.map
+++ b/pkg/web_components/lib/platform.concat.js.map
@@ -45,6 +45,7 @@
     "../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",
@@ -103,21 +104,21 @@
     "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;A;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;A;AChlDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;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;A;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;A;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;ACztBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;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;A;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;A;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;A;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;A;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;A;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;A;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;A;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;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;A;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;A;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;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;A;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;A;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;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;A;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;A;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;A;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;A;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;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;A;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;A;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;A;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;A;ACzTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;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,oB;ACzsBA,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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,K;AC1DA,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;A;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;A;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;A;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;A;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;A;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;A;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;A;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;A;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;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;A;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;A;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;A;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;A;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,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;A;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;A;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;A;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;A;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;A;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;A;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;ACpUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;AACA;A;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;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;A;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;A;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;A;AC1OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;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;A;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;A;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtsCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;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;A;AChqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A",
+  "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 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  var PROP_ADD_TYPE = 'add';\n  var PROP_UPDATE_TYPE = 'update';\n  var PROP_RECONFIGURE_TYPE = 'reconfigure';\n  var PROP_DELETE_TYPE = 'delete';\n  var ARRAY_SPLICE_TYPE = 'splice';\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    Object.observe(test, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 3)\n      return false;\n\n    // TODO(rafaelw): Remove this when new change record type names make it to\n    // chrome release.\n    if (records[0].type == 'new' &&\n        records[1].type == 'updated' &&\n        records[2].type == 'deleted') {\n      PROP_ADD_TYPE = 'new';\n      PROP_UPDATE_TYPE = 'updated';\n      PROP_RECONFIGURE_TYPE = 'reconfigured';\n      PROP_DELETE_TYPE = 'deleted';\n    } else if (records[0].type != 'add' ||\n               records[1].type != 'update' ||\n               records[2].type != 'delete') {\n      console.error('Unexpected change record names for Object.observe. ' +\n                    'Using dirty-checking instead');\n      return false;\n    }\n    Object.unobserve(test, callback);\n\n    test = [0];\n    Array.observe(test, callback);\n    test[1] = 1;\n    test.length = 0;\n    Object.deliverChangeRecords(callback);\n    if (records.length != 2)\n      return false;\n    if (records[0].type != ARRAY_SPLICE_TYPE ||\n        records[1].type != ARRAY_SPLICE_TYPE) {\n      return false;\n    }\n    Array.unobserve(test, 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 (!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 (!isObject(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 = typeof Object.deliverAllChangeRecords == 'function';\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      Object.deliverAllChangeRecords();\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  expectedRecordTypes[PROP_ADD_TYPE] = true;\n  expectedRecordTypes[PROP_UPDATE_TYPE] = true;\n  expectedRecordTypes[PROP_DELETE_TYPE] = true;\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(PROP_UPDATE_TYPE, 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 == PROP_UPDATE_TYPE)\n        continue;\n\n      if (record.type == PROP_ADD_TYPE) {\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 ARRAY_SPLICE_TYPE:\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case PROP_ADD_TYPE:\n        case PROP_UPDATE_TYPE:\n        case PROP_DELETE_TYPE:\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\n  // TODO(rafaelw): Only needed for testing until new change record names\n  // make it to release.\n  global.Observer.changeRecordTypes = {\n    add: PROP_ADD_TYPE,\n    update: PROP_UPDATE_TYPE,\n    reconfigure: PROP_RECONFIGURE_TYPE,\n    'delete': PROP_DELETE_TYPE,\n    splice: ARRAY_SPLICE_TYPE\n  };\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 || 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  // 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 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 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\n    return dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\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 (event.type === 'load' &&\n        eventPath.length === 2 &&\n        eventPath[0].target instanceof wrappers.Document) {\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      // 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 (originalEvent.relatedTarget) {\n        var relatedTarget = wrap(originalEvent.relatedTarget);\n\n        var adjusted = adjustRelatedTarget(currentTarget, relatedTarget);\n        if (adjusted === target)\n          return true;\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      this.impl = type;\n    else\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\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      return relatedTargetTable.get(this) || 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  function BeforeUnloadEvent(impl) {\n    Event.call(this);\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  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",
+    "/**\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 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, unwrap(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanUpNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var unwrap = scope.unwrap;\n  var unwrapIfNeeded = scope.unwrapIfNeeded;\n  var wrap = scope.wrap;\n  var wrapIfNeeded = scope.wrapIfNeeded;\n  var wrappers = scope.wrappers;\n\n  function assertIsNodeWrapper(node) {\n    assert(node instanceof Node);\n  }\n\n  function createOneElementNodeList(node) {\n    var nodes = new NodeList();\n    nodes[0] = node;\n    nodes.length = 1;\n    return nodes;\n  }\n\n  var surpressMutations = false;\n\n  /**\n   * Called before node is inserted into a node to enqueue its removal from its\n   * old parent.\n   * @param {!Node} node The node that is about to be removed.\n   * @param {!Node} parent The parent node that the node is being removed from.\n   * @param {!NodeList} nodes The collected nodes.\n   */\n  function enqueueRemovalForInsertedNodes(node, parent, nodes) {\n    enqueueMutation(parent, 'childList', {\n      removedNodes: nodes,\n      previousSibling: node.previousSibling,\n      nextSibling: node.nextSibling\n    });\n  }\n\n  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {\n    enqueueMutation(df, 'childList', {\n      removedNodes: nodes\n    });\n  }\n\n  /**\n   * Collects nodes from a DocumentFragment or a Node for removal followed\n   * by an insertion.\n   *\n   * This updates the internal pointers for node, previousNode and nextNode.\n   */\n  function collectNodes(node, parentNode, previousNode, nextNode) {\n    if (node instanceof DocumentFragment) {\n      var nodes = collectNodesForDocumentFragment(node);\n\n      // The extra loop is to work around bugs with DocumentFragments in IE.\n      surpressMutations = true;\n      for (var i = nodes.length - 1; i >= 0; i--) {\n        node.removeChild(nodes[i]);\n        nodes[i].parentNode_ = parentNode;\n      }\n      surpressMutations = false;\n\n      for (var i = 0; i < nodes.length; i++) {\n        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;\n        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;\n      }\n\n      if (previousNode)\n        previousNode.nextSibling_ = nodes[0];\n      if (nextNode)\n        nextNode.previousSibling_ = nodes[nodes.length - 1];\n\n      return nodes;\n    }\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent) {\n      // This will enqueue the mutation record for the removal as needed.\n      oldParent.removeChild(node);\n    }\n\n    node.parentNode_ = parentNode;\n    node.previousSibling_ = previousNode;\n    node.nextSibling_ = nextNode;\n    if (previousNode)\n      previousNode.nextSibling_ = node;\n    if (nextNode)\n      nextNode.previousSibling_ = node;\n\n    return nodes;\n  }\n\n  function collectNodesNative(node) {\n    if (node instanceof DocumentFragment)\n      return collectNodesForDocumentFragment(node);\n\n    var nodes = createOneElementNodeList(node);\n    var oldParent = node.parentNode;\n    if (oldParent)\n      enqueueRemovalForInsertedNodes(node, oldParent, nodes);\n    return nodes;\n  }\n\n  function collectNodesForDocumentFragment(node) {\n    var nodes = new NodeList();\n    var i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      nodes[i++] = child;\n    }\n    nodes.length = i;\n    enqueueRemovalForInsertedDocumentFragment(node, nodes);\n    return nodes;\n  }\n\n  function snapshotNodeList(nodeList) {\n    // NodeLists are not live at the moment so just return the same object.\n    return nodeList;\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-inserted\n  function nodeWasAdded(node, treeScope) {\n    setTreeScope(node, treeScope);\n    node.nodeIsInserted_();\n  }\n\n  function nodesWereAdded(nodes, parent) {\n    var treeScope = getTreeScope(parent);\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasAdded(nodes[i], treeScope);\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#node-is-removed\n  function nodeWasRemoved(node) {\n    setTreeScope(node, new TreeScope(node, null));\n  }\n\n  function nodesWereRemoved(nodes) {\n    for (var i = 0; i < nodes.length; i++) {\n      nodeWasRemoved(nodes[i]);\n    }\n  }\n\n  function ensureSameOwnerDocument(parent, child) {\n    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?\n        parent : parent.ownerDocument;\n    if (ownerDoc !== child.ownerDocument)\n      ownerDoc.adoptNode(child);\n  }\n\n  function adoptNodesIfNeeded(owner, nodes) {\n    if (!nodes.length)\n      return;\n\n    var ownerDoc = owner.ownerDocument;\n\n    // All nodes have the same ownerDocument when we get here.\n    if (ownerDoc === nodes[0].ownerDocument)\n      return;\n\n    for (var i = 0; i < nodes.length; i++) {\n      scope.adoptNodeNoRemove(nodes[i], ownerDoc);\n    }\n  }\n\n  function unwrapNodesForInsertion(owner, nodes) {\n    adoptNodesIfNeeded(owner, nodes);\n    var length = nodes.length;\n\n    if (length === 1)\n      return unwrap(nodes[0]);\n\n    var df = unwrap(owner.ownerDocument.createDocumentFragment());\n    for (var i = 0; i < length; i++) {\n      df.appendChild(unwrap(nodes[i]));\n    }\n    return df;\n  }\n\n  function clearChildNodes(wrapper) {\n    if (wrapper.firstChild_ !== undefined) {\n      var child = wrapper.firstChild_;\n      while (child) {\n        var tmp = child;\n        child = child.nextSibling_;\n        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;\n      }\n    }\n    wrapper.firstChild_ = wrapper.lastChild_ = undefined;\n  }\n\n  function removeAllChildNodes(wrapper) {\n    if (wrapper.invalidateShadowRenderer()) {\n      var childWrapper = wrapper.firstChild;\n      while (childWrapper) {\n        assert(childWrapper.parentNode === wrapper);\n        var nextSibling = childWrapper.nextSibling;\n        var childNode = unwrap(childWrapper);\n        var parentNode = childNode.parentNode;\n        if (parentNode)\n          originalRemoveChild.call(parentNode, childNode);\n        childWrapper.previousSibling_ = childWrapper.nextSibling_ =\n            childWrapper.parentNode_ = null;\n        childWrapper = nextSibling;\n      }\n      wrapper.firstChild_ = wrapper.lastChild_ = null;\n    } else {\n      var node = unwrap(wrapper);\n      var child = node.firstChild;\n      var nextSibling;\n      while (child) {\n        nextSibling = child.nextSibling;\n        originalRemoveChild.call(node, child);\n        child = nextSibling;\n      }\n    }\n  }\n\n  function invalidateParent(node) {\n    var p = node.parentNode;\n    return p && p.invalidateShadowRenderer();\n  }\n\n  function cleanupNodes(nodes) {\n    for (var i = 0, n; i < nodes.length; i++) {\n      n = nodes[i];\n      n.parentNode.removeChild(n);\n    }\n  }\n\n  var originalImportNode = document.importNode;\n  var originalCloneNode = window.Node.prototype.cloneNode;\n\n  function cloneNode(node, deep, opt_doc) {\n    var clone;\n    if (opt_doc)\n      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, false));\n\n    if (deep) {\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        clone.appendChild(cloneNode(child, true, opt_doc));\n      }\n\n      if (node instanceof wrappers.HTMLTemplateElement) {\n        var cloneContent = clone.content;\n        for (var child = node.content.firstChild;\n             child;\n             child = child.nextSibling) {\n         cloneContent.appendChild(cloneNode(child, true, opt_doc));\n        }\n      }\n    }\n    // TODO(arv): Some HTML elements also clone other data like value.\n    return clone;\n  }\n\n  function contains(self, child) {\n    if (!child || getTreeScope(self) !== getTreeScope(child))\n      return false;\n\n    for (var node = child; node; node = node.parentNode) {\n      if (node === self)\n        return true;\n    }\n    return false;\n  }\n\n  var OriginalNode = window.Node;\n\n  /**\n   * This represents a wrapper of a native DOM node.\n   * @param {!Node} original The original DOM node, aka, the visual DOM node.\n   * @constructor\n   * @extends {EventTarget}\n   */\n  function Node(original) {\n    assert(original instanceof OriginalNode);\n\n    EventTarget.call(this, original);\n\n    // These properties are used to override the visual references with the\n    // logical ones. If the value is undefined it means that the logical is the\n    // same as the visual.\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.parentNode_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.firstChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.lastChild_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.nextSibling_ = undefined;\n\n    /**\n     * @type {Node|undefined}\n     * @private\n     */\n    this.previousSibling_ = undefined;\n\n    this.treeScope_ = undefined;\n  }\n\n  var OriginalDocumentFragment = window.DocumentFragment;\n  var originalAppendChild = OriginalNode.prototype.appendChild;\n  var originalCompareDocumentPosition =\n      OriginalNode.prototype.compareDocumentPosition;\n  var originalInsertBefore = OriginalNode.prototype.insertBefore;\n  var originalRemoveChild = OriginalNode.prototype.removeChild;\n  var originalReplaceChild = OriginalNode.prototype.replaceChild;\n\n  var isIe = /Trident/.test(navigator.userAgent);\n\n  var removeChildOriginalHelper = isIe ?\n      function(parent, child) {\n        try {\n          originalRemoveChild.call(parent, child);\n        } catch (ex) {\n          if (!(parent instanceof OriginalDocumentFragment))\n            throw ex;\n        }\n      } :\n      function(parent, child) {\n        originalRemoveChild.call(parent, child);\n      };\n\n  Node.prototype = Object.create(EventTarget.prototype);\n  mixin(Node.prototype, {\n    appendChild: function(childWrapper) {\n      return this.insertBefore(childWrapper, null);\n    },\n\n    insertBefore: function(childWrapper, refWrapper) {\n      assertIsNodeWrapper(childWrapper);\n\n      var refNode;\n      if (refWrapper) {\n        if (isWrapper(refWrapper)) {\n          refNode = unwrap(refWrapper);\n        } else {\n          refNode = refWrapper;\n          refWrapper = wrap(refNode);\n        }\n      } else {\n        refWrapper = null;\n        refNode = null;\n      }\n\n      refWrapper && assert(refWrapper.parentNode === this);\n\n      var nodes;\n      var previousNode =\n          refWrapper ? refWrapper.previousSibling : this.lastChild;\n\n      var useNative = !this.invalidateShadowRenderer() &&\n                      !invalidateParent(childWrapper);\n\n      if (useNative)\n        nodes = collectNodesNative(childWrapper);\n      else\n        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);\n\n      if (useNative) {\n        ensureSameOwnerDocument(this, childWrapper);\n        clearChildNodes(this);\n        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);\n      } else {\n        if (!previousNode)\n          this.firstChild_ = nodes[0];\n        if (!refWrapper)\n          this.lastChild_ = nodes[nodes.length - 1];\n\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\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 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",
@@ -130,7 +131,7 @@
     "// 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 (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\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",
+    "// 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",
@@ -146,13 +147,14 @@
     "// 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 = object.prototype;\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 (object.extends)\n        p.extends = object.extends;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (object.extends) {\n            return document.createElement(object.extends, 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 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, :ancestor: 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 && (!root || root.querySelector('shadow'))) {\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.convertColonAncestor(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 :ancestor(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :ancestor(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonAncestor: function(cssText) {\n    return this.convertColonRule(cssText, cssColonAncestorRe,\n        this.colonAncestorPartReplacer);\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  colonAncestorPartReplacer: 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    return cssText.replace(/\\^\\^/g, ' ').replace(/\\^/g, ' ');\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(hostRe, polyfillHost).replace(colonHostRe,\n        polyfillHost).replace(colonAncestorRe, polyfillAncestor);\n  },\n  propertiesFromRule: function(rule) {\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    if (rule.style.content && !rule.style.content.match(/['\"]+/)) {\n      return rule.style.cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    return rule.style.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: :ancestor pre-processed to -shadowcssancestor.\n    polyfillAncestor = '-shadowcssancestor',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonAncestorRe = new RegExp('(' + polyfillAncestor + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    hostRe = /@host/gim,\n    colonHostRe = /\\:host/gim,\n    colonAncestorRe = /\\:ancestor/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillAncestorRe = new RegExp(polyfillAncestor, 'gim');\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 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 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  var originalCreateShadowRoot = Element.prototype.webkitCreateShadowRoot;\n  Element.prototype.webkitCreateShadowRoot = function() {\n    var elderRoot = this.webkitShadowRoot;\n    var root = originalCreateShadowRoot.call(this);\n    root.olderShadowRoot = elderRoot;\n    root.host = this;\n    CustomElements.watchShadow(this);\n    return root;\n  }\n\n  Object.defineProperties(Element.prototype, {\n    shadowRoot: {\n      get: function() {\n        return this.webkitShadowRoot;\n      }\n    },\n    createShadowRoot: {\n      value: function() {\n        return this.webkitCreateShadowRoot();\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})();",
+    "/*\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);",
@@ -165,44 +167,44 @@
     "/*\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      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    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\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\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    // 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 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;\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 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 ^^ ' + 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  attrib2css.forEach(function(r) {\n    if (String(r) === r) {\n      styles += selector(r) + rule(r) + '\\n';\n      styles += shadowSelector(r) + rule(r) + '\\n';\n    } else {\n      styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n      styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n    }\n  });\n  var el = document.createElement('style');\n  el.textContent = styles;\n  document.head.appendChild(el);\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  // test for DOM Level 4 Events\n  var NEW_MOUSE_EVENT = false;\n  var HAS_BUTTONS = false;\n  try {\n    var ev = new MouseEvent('click', {buttons: 1});\n    NEW_MOUSE_EVENT = true;\n    HAS_BUTTONS = ev.buttons === 1;\n    ev = null;\n  } catch(e) {\n  }\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  ];\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  ];\n\n  function PointerEvent(inType, inDict) {\n    inDict = inDict || {};\n    // According to the w3c spec,\n    // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-button\n    // MouseEvent.button == 0 can mean either no mouse button depressed, or the\n    // left mouse button depressed.\n    //\n    // As of now, the only way to distinguish between the two states of\n    // MouseEvent.button is by using the deprecated MouseEvent.which property, as\n    // this maps mouse buttons to positive integers > 0, and uses 0 to mean that\n    // no mouse button is held.\n    //\n    // MouseEvent.which is derived from MouseEvent.button at MouseEvent creation,\n    // but initMouseEvent does not expose an argument with which to set\n    // MouseEvent.which. Calling initMouseEvent with a buttonArg of 0 will set\n    // MouseEvent.button == 0 and MouseEvent.which == 1, breaking the expectations\n    // of app developers.\n    //\n    // The only way to propagate the correct state of MouseEvent.which and\n    // MouseEvent.button to a new MouseEvent.button == 0 and MouseEvent.which == 0\n    // is to call initMouseEvent with a buttonArg value of -1.\n    //\n    // This is fixed with DOM Level 4's use of buttons\n    var buttons = inDict.buttons;\n    // touch has two possible buttons state: 0 and 1, rely on being told the right one\n    if (!HAS_BUTTONS && !buttons && inType !== 'touch') {\n      switch (inDict.which) {\n        case 1: buttons = 1; break;\n        case 2: buttons = 4; break;\n        case 3: buttons = 2; break;\n        default: buttons = 0;\n      }\n    }\n\n    var e;\n    if (NEW_MOUSE_EVENT) {\n      e = new MouseEvent(inType, inDict);\n    } else {\n      e = document.createEvent('MouseEvent');\n\n      // import values from the given dictionary\n      var props = {}, p;\n      for(var i = 0; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        props[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n\n      // define the properties inherited from MouseEvent\n      e.initMouseEvent(\n        inType, props.bubbles, props.cancelable, props.view, props.detail,\n        props.screenX, props.screenY, props.clientX, props.clientY, props.ctrlKey,\n        props.altKey, props.shiftKey, props.metaKey, props.button, props.relatedTarget\n      );\n    }\n\n    // make the event pass instanceof checks\n    e.__proto__ = PointerEvent.prototype;\n\n    // define the buttons property according to DOM Level 3 spec\n    if (!HAS_BUTTONS) {\n      // IE 10 has buttons on MouseEvent.prototype as a getter w/o any setting\n      // mechanism\n      Object.defineProperty(e, 'buttons', {get: function(){ return buttons; }, enumerable: true});\n    }\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 = buttons ? 0.5 : 0;\n    }\n\n    // define the properties of the PointerEvent interface\n    Object.defineProperties(e, {\n      pointerId: { value: inDict.pointerId || 0, enumerable: true },\n      width: { value: inDict.width || 0, enumerable: true },\n      height: { value: inDict.height || 0, enumerable: true },\n      pressure: { value: pressure, enumerable: true },\n      tiltX: { value: inDict.tiltX || 0, enumerable: true },\n      tiltY: { value: inDict.tiltY || 0, enumerable: true },\n      pointerType: { value: inDict.pointerType || '', enumerable: true },\n      hwTimestamp: { value: inDict.hwTimestamp || 0, enumerable: true },\n      isPrimary: { value: inDict.isPrimary || false, enumerable: true }\n    });\n    return e;\n  }\n\n  // PointerEvent extends MouseEvent\n  PointerEvent.prototype = Object.create(MouseEvent.prototype);\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(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  ];\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  ];\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    targets: new WeakMap(),\n    handledEvents: new WeakMap(),\n    pointermap: new scope.PointerMap(),\n    eventMap: {},\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: {},\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 (this.handledEvents.get(inEvent)) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      this.handledEvents.set(inEvent, 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) {\n        inEvent.relatedTarget = null;\n      }\n      var e = new PointerEvent(inType, inEvent);\n      if (inEvent.preventDefault) {\n        e.preventDefault = inEvent.preventDefault;\n      }\n      this.targets.set(e, this.targets.get(inEvent) || 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 = {}, 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      if (this.captureInfo) {\n        if (this.captureInfo.id === inEvent.pointerId) {\n          return this.captureInfo.target;\n        }\n      }\n      return this.targets.get(inEvent);\n    },\n    setCapture: function(inPointerId, inTarget) {\n      if (this.captureInfo) {\n        this.releaseCapture(this.captureInfo.id);\n      }\n      this.captureInfo = {id: inPointerId, target: inTarget};\n      var e = new PointerEvent('gotpointercapture', { bubbles: true });\n      this.implicitRelease = this.releaseCapture.bind(this, inPointerId);\n      document.addEventListener('pointerup', this.implicitRelease);\n      document.addEventListener('pointercancel', this.implicitRelease);\n      this.targets.set(e, inTarget);\n      this.asyncDispatchEvent(e);\n    },\n    releaseCapture: function(inPointerId) {\n      if (this.captureInfo && this.captureInfo.id === inPointerId) {\n        var e = new PointerEvent('lostpointercapture', { bubbles: true });\n        var t = this.captureInfo.target;\n        this.captureInfo = null;\n        document.removeEventListener('pointerup', this.implicitRelease);\n        document.removeEventListener('pointercancel', this.implicitRelease);\n        this.targets.set(e, 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      setTimeout(this.dispatchEvent.bind(this, inEvent), 0);\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(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  // 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      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 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    scrollType: new WeakMap(),\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        this.scrollType.set(el, st);\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          this.scrollType.set(s, st);\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      this.scrollType['delete'](el);\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        this.scrollType['delete'](s);\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        this.scrollType.set(el, st);\n        allShadows(el).forEach(function(s) {\n          this.scrollType.set(s, 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 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      e.pointerId = inTouch.identifier + 2;\n      e.target = findTarget(e);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.button = 0;\n      e.buttons = this.typeToButtons(this.currentTouchEvent);\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      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent.type;\n      var pointers = touchMap(tl, this.touchToPointer, this);\n      // forward touch preventDefaults\n      pointers.forEach(function(p) {\n        p.preventDefault = function() {\n          this.scrolling = false;\n          this.firstXY = null;\n          inEvent.preventDefault();\n        };\n      }, this);\n      pointers.forEach(inFunction, this);\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 = this.scrollType.get(inEvent.currentTarget);\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(this.touchToPointer(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  // 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.navigator.pointerEnabled === undefined) {\n    Object.defineProperty(window.navigator, 'pointerEnabled', {value: true, enumerable: true});\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/**\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      setTimeout(this.runQueue.bind(this, inHandlerFns, e), 0);\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      var fn = function() {\n        this.dispatchEvent(inEvent, inTarget);\n      }.bind(this);\n      setTimeout(fn, 0);\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(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      var points = {};\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 * 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 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(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\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  function unbind(node, name) {\n    var bindings = node.bindings;\n    if (!bindings) {\n      node.bindings = {};\n      return;\n    }\n\n    var binding = bindings[name];\n    if (!binding)\n      return;\n\n    binding.close();\n    bindings[name] = undefined;\n  }\n\n  Node.prototype.unbind = function(name) {\n    unbind(this, name);\n  };\n\n  Node.prototype.unbindAll = function() {\n    if (!this.bindings)\n      return;\n    var names = Object.keys(this.bindings);\n    for (var i = 0; i < names.length; i++) {\n      var binding = this.bindings[names[i]];\n      if (binding)\n        binding.close();\n    }\n\n    this.bindings = {};\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  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    unbind(this, 'textContent');\n    updateText(this, value.open(textBinding(this)));\n    return this.bindings.textContent = value;\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    unbind(this, name);\n    updateAttribute(this, name, conditional,\n        value.open(attributeBinding(this, name, conditional)));\n\n    return this.bindings[name] = value;\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    var capturedClose = observable.close;\n    observable.close = function() {\n      if (!capturedClose)\n        return;\n      input.removeEventListener(eventType, eventHandler);\n\n      observable.close = capturedClose;\n      observable.close();\n      capturedClose = undefined;\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.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\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    unbind(this, name);\n    bindInputEvent(this, name, value, postEventFn);\n    updateInput(this, name,\n                value.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    return this.bindings[name] = value;\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    unbind(this, 'value');\n    bindInputEvent(this, 'value', value);\n    updateInput(this, 'value',\n                value.open(inputBinding(this, 'value', sanitizeValue)));\n\n    return this.bindings.value = value;\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.setValue(select.value);\n      selectBinding.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    unbind(this, 'value');\n    bindInputEvent(this, 'value', value);\n    updateOption(this, value.open(optionBinding(this)));\n    return this.bindings.value = value;\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    unbind(this, name);\n    bindInputEvent(this, name, value);\n    updateInput(this, name,\n                value.open(inputBinding(this, name)));\n    return this.bindings[name] = value;\n  }\n})(this);\n",
-    "// 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(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      this.unbind('ref');\n      return this.bindings.ref = 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          this.bindings.iterator = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n        this.bindings = this.bindings || {};\n        this.bindings.iterator = this.iterator_;\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                             instanceBindings_) {\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      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\n      var instanceRecord = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instanceBindings_);\n        clone.templateInstance_ = instanceRecord;\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      this.bindings_ = undefined;\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      tokens.push(Path.get(pathString)); // PATH\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\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  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n\n    // Flattened array of tuples:\n    //   <instanceTerminatorNode, [bindingsSetupByInstance]>\n    this.terminators = [];\n\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    getTerminatorAt: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var terminator = this.terminators[index*2];\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subIterator = terminator.iterator_;\n      if (!subIterator)\n        return terminator;\n\n      return subIterator.getTerminatorAt(subIterator.terminators.length/2 - 1);\n    },\n\n    // TODO(rafaelw): If we inserting sequences of instances we can probably\n    // avoid lots of calls to getTerminatorAt(), or cache its result.\n    insertInstanceAt: function(index, fragment, instanceNodes,\n                               instanceBindings) {\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = previousTerminator;\n      if (fragment)\n        terminator = fragment.lastChild || terminator;\n      else if (instanceNodes)\n        terminator = instanceNodes[instanceNodes.length - 1] || terminator;\n\n      this.terminators.splice(index*2, 0, terminator, instanceBindings);\n      var parent = this.templateElement_.parentNode;\n      var insertBeforeNode = previousTerminator.nextSibling;\n\n      if (fragment) {\n        parent.insertBefore(fragment, insertBeforeNode);\n      } else if (instanceNodes) {\n        for (var i = 0; i < instanceNodes.length; i++)\n          parent.insertBefore(instanceNodes[i], insertBeforeNode);\n      }\n    },\n\n    extractInstanceAt: function(index) {\n      var instanceNodes = [];\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = this.getTerminatorAt(index);\n      instanceNodes.instanceBindings = this.terminators[index*2 + 1];\n      this.terminators.splice(index*2, 2);\n\n      var parent = this.templateElement_.parentNode;\n      while (terminator !== previousTerminator) {\n        var node = previousTerminator.nextSibling;\n        if (node == terminator)\n          terminator = previousTerminator;\n\n        parent.removeChild(node);\n        instanceNodes.push(node);\n      }\n\n      return instanceNodes;\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      var instanceCache = new Map;\n      var removeDelta = 0;\n      splices.forEach(function(splice) {\n        splice.removed.forEach(function(model) {\n          var instanceNodes =\n              this.extractInstanceAt(splice.index + removeDelta);\n          instanceCache.set(model, instanceNodes);\n        }, this);\n\n        removeDelta -= splice.addedCount;\n      }, this);\n\n      splices.forEach(function(splice) {\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var fragment = undefined;\n          var instanceNodes = instanceCache.get(model);\n          var instanceBindings;\n          if (instanceNodes) {\n            instanceCache.delete(model);\n            instanceBindings = instanceNodes.instanceBindings;\n          } else {\n            instanceBindings = [];\n            if (this.instanceModelFn_)\n              model = this.instanceModelFn_(model);\n\n            if (model !== undefined) {\n              fragment = template.createInstance(model, undefined, delegate,\n                                                 instanceBindings);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, fragment, instanceNodes,\n                                instanceBindings);\n        }\n      }, this);\n\n      instanceCache.forEach(function(instanceNodes) {\n        this.closeInstanceBindings(instanceNodes.instanceBindings);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = this.getTerminatorAt(index);\n      if (previousTerminator === terminator)\n        return; // instance has zero nodes.\n\n      // We must use the first node of the instance, because any subsequent\n      // nodes may have been generated by sub-templates.\n      // TODO(rafaelw): This is brittle WRT instance mutation -- e.g. if the\n      // first node was removed by script.\n      var templateInstance = previousTerminator.nextSibling.templateInstance;\n      this.instancePositionChangedFn_(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.terminators.length / 2;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instanceBindings) {\n      for (var i = 0; i < instanceBindings.length; i++) {\n        instanceBindings[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 = 1; i < this.terminators.length; i += 2) {\n        this.closeInstanceBindings(this.terminators[i]);\n      }\n\n      this.terminators.length = 0;\n      this.closeDeps();\n      this.templateElement_.iterator_ = undefined;\n      this.closed = true;\n    }\n  };\n\n  // Polyfill-specific API.\n  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;\n})(this);\n",
+    "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part of the polymer project is also\n// subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n\n(function(global) {\n  'use strict';\n\n  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 2013 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  // 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      this.getValue(model, observer, filterRegistry);  // captures deps.\n      var self = this;\n\n      function valueFn() {\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 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 (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\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\nvar FLUSH_POLL_INTERVAL = 125;\nwindow.addEventListener('WebComponentsReady', function() {\n  flush();\n  // flush periodically if platform does not have object observe.\n  if (!Observer.hasObjectObserve) {\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  }\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"
+    "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part 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 d48fd19..b8a5c3f 100644
--- a/pkg/web_components/lib/platform.js
+++ b/pkg/web_components/lib/platform.js
@@ -28,11 +28,12 @@
  * (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.0-e3985da
-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(a){"use strict";function b(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={};if(Object.observe(c,a),c.id=1,c.id=2,delete c.id,Object.deliverChangeRecords(a),3!==b.length)return!1;if("new"==b[0].type&&"updated"==b[1].type&&"deleted"==b[2].type)L="new",M="updated",N="reconfigured",O="deleted";else if("add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type)return console.error("Unexpected change record names for Object.observe. Using dirty-checking instead"),!1;return Object.unobserve(c,a),c=[0],Array.observe(c,a),c[1]=1,c.length=0,Object.deliverChangeRecords(a),2!=b.length?!1:b[0].type!=P||b[1].type!=P?!1:(Array.unobserve(c,a),!0)}function c(){if(a.document&&"securityPolicy"in a.document&&!a.document.securityPolicy.allowsEval)return!1;try{var b=new Function("","return true;");return b()}catch(c){return!1}}function d(a){return+a===a>>>0}function e(a){return+a}function f(a){return a===Object(a)}function g(a,b){return a===b?0!==a||1/a===1/b:S(a)&&S(b)?!0:a!==a&&b!==b}function h(a){return"string"!=typeof a?!1:(a=a.trim(),""==a?!0:"."==a[0]?!1:$.test(a))}function i(a,b){if(b!==_)throw Error("Use Path.get to retrieve path objects");return""==a.trim()?this:d(a)?(this.push(a),this):(a.split(/\s*\.\s*/).filter(function(a){return a}).forEach(function(a){this.push(a)},this),void(R&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())))}function j(a){if(a instanceof i)return a;null==a&&(a=""),"string"!=typeof a&&(a=String(a));var b=ab[a];if(b)return b;if(!h(a))return bb;var b=new i(a,_);return ab[a]=b,b}function k(b){for(var c=0;db>c&&b.check_();)c++;return a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=c),c>0}function l(a){for(var b in a)return!1;return!0}function m(a){return l(a.added)&&l(a.removed)&&l(a.changed)}function n(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 o(){if(!eb.length)return!1;for(var a=0;a<eb.length;a++)eb[a]();return eb.length=0,!0}function p(){function a(a){b&&b.state_===kb&&!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),gb.push(this)}}}function q(a,b,c){var d=gb.pop()||p();return d.open(a),d.observe(b,c),d}function r(){function a(b){if(f(b)){var c=j.indexOf(b);c>=0?(j[c]=void 0,i.push(b)):i.indexOf(b)<0&&(i.push(b),Object.observe(b,e)),a(Object.getPrototypeOf(b))}}function b(){var b=j===hb?[]:j;j=i,i=b;var c;for(var d in g)c=g[d],c&&c.state_==kb&&c.iterateObjects_(a);for(var f=0;f<j.length;f++){var h=j[f];h&&Object.unobserve(h,e)}j.length=0}function c(){l=!1,k&&b()}function d(){l||(k=!0,l=!0,fb(c))}function e(){b();var a;for(var c in g)a=g[c],a&&a.state_==kb&&a.check_()}var g=[],h=0,i=[],j=hb,k=!1,l=!1,m={object:void 0,objects:i,open:function(b){g[b.id_]=b,h++,b.iterateObjects_(a)},close:function(a){if(g[a.id_]=void 0,h--,h)return void d();k=!1;for(var b=0;b<i.length;b++)Object.unobserve(i[b],e),t.unobservedCount++;g.length=0,i.length=0,ib.push(this)},reset:d};return m}function s(a,b){return cb&&cb.object===b||(cb=ib.pop()||r(),cb.object=b),cb.open(a),cb}function t(){this.state_=jb,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nb++}function u(a){t._allObserversCount++,pb&&ob.push(a)}function v(){t._allObserversCount--}function w(a){t.call(this),this.value_=a,this.oldObject_=void 0}function x(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");w.call(this,a)}function y(a,b){t.call(this),this.object_=a,this.path_=b instanceof i?b:j(b),this.directObserver_=void 0}function z(){t.call(this),this.value_=[],this.directObserver_=void 0,this.observed_=[]}function A(a){return a}function B(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||A,this.setValueFn_=c||A,this.dontPassThroughSet_=d}function C(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 D(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];tb[g.type]?(g.name in c||(c[g.name]=g.oldValue),g.type!=M&&(g.type!=L?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 E(a,b,c){return{index:a,removed:b,addedCount:c}}function F(){}function G(a,b,c,d,e,f){return yb.calcSplices(a,b,c,d,e,f)}function H(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 I(a,b,c,d){for(var e=E(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=H(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 J(a,b){for(var c=[],f=0;f<b.length;f++){var g=b[f];switch(g.type){case P:I(c,g.index,g.removed.slice(),g.addedCount);break;case L:case M:case O:if(!d(g.name))continue;var h=e(g.name);if(0>h)continue;I(c,h,[g.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(g))}}return c}function K(a,b){var c=[];return J(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(G(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var L="add",M="update",N="reconfigure",O="delete",P="splice",Q=b(),R=c(),S=a.Number.isNaN||function(b){return"number"==typeof b&&a.isNaN(b)},T="__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},U="[$_a-zA-Z]",V="[$_a-zA-Z0-9]",W=U+"+"+V+"*",X="(?:[0-9]|[1-9]+[0-9]+)",Y="(?:"+W+"|"+X+")",Z="(?:"+Y+")(?:\\s*\\.\\s*"+Y+")*",$=new RegExp("^"+Z+"$"),_={},ab={};i.get=j,i.prototype=T({__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]]),!a)return;b(a)}},compiledGetValueFromFn:function(){var a=this.map(function(a){return d(a)?'["'+a+'"]':"."+a}),b="",c="obj";b+="if (obj != null";for(var e=0;e<this.length-1;e++){{this[e]}c+=a[e],b+=" &&\n     "+c+" != null"}return b+=")\n",c+=a[e],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(!f(a))return!1;a=a[this[c]]}return f(a)?(a[this[c]]=b,!0):!1}});var bb=new i("",_);bb.valid=!1,bb.getValueFrom=bb.setValueFrom=function(){};var cb,db=1e3,eb=[],fb=Q?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){o(),b=!1}),function(c){eb.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eb.push(a)}}(),gb=[],hb=[],ib=[],jb=0,kb=1,lb=2,mb=3,nb=1;t.prototype={open:function(a,b){if(this.state_!=jb)throw Error("Observer has already been opened.");return u(this),this.callback_=a,this.target_=b,this.state_=kb,this.connect_(),this.value_},close:function(){this.state_==kb&&(v(this),this.state_=lb,this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0)},deliver:function(){this.state_==kb&&k(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){t._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var ob,pb=!Q;t._allObserversCount=0,pb&&(ob=[]);var qb=!1,rb="function"==typeof Object.deliverAllChangeRecords;a.Platform=a.Platform||{},a.Platform.performMicrotaskCheckpoint=function(){if(!qb){if(rb)return void Object.deliverAllChangeRecords();if(pb){qb=!0;var b,c,d=0;do{d++,c=ob,ob=[],b=!1;for(var e=0;e<c.length;e++){var f=c[e];f.state_==kb&&(f.check_()&&(b=!0),ob.push(f))}o()&&(b=!0)}while(db>d&&b);a.testingExposeCycleCount&&(a.dirtyCheckCycleCount=d),qb=!1}}},pb&&(a.Platform.clearObservers=function(){ob=[]}),w.prototype=T({__proto__:t.prototype,arrayObserve:!1,connect_:function(){Q?this.directObserver_=q(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(Q){if(!a)return!1;c={},b=D(this.value_,a,c)}else c=this.oldObject_,b=n(this.value_,this.oldObject_);return m(b)?!1:(Q||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){Q?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==kb&&(Q?this.directObserver_.deliver(!1):k(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),x.prototype=T({__proto__:w.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(Q){if(!a)return!1;b=K(this.value_,a)}else b=G(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(Q||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),x.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)})},y.prototype=T({__proto__:t.prototype,connect_:function(){Q&&(this.directObserver_=s(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||g(this.value_,c)?!1:(this.report_([this.value_,c]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var sb={};z.prototype=T({__proto__:t.prototype,connect_:function(){if(this.check_(void 0,!0),Q){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==sb){b=!0;break}return this.directObserver_?b?void this.directObserver_.reset():(this.directObserver_.close(),void(this.directObserver_=void 0)):void(b&&(this.directObserver_=s(this,a)))}},closeObservers_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===sb&&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_!=jb&&this.state_!=mb)throw Error("Cannot add paths once started.");this.observed_.push(a,b instanceof i?b:j(b))},addObserver:function(a){if(this.state_!=jb&&this.state_!=mb)throw Error("Cannot add observers once started.");a.open(this.deliver,this),this.observed_.push(sb,a)},startReset:function(){if(this.state_!=kb)throw Error("Can only reset while open");this.state_=mb,this.closeObservers_()},finishReset:function(){if(this.state_!=mb)throw Error("Can only finishReset after startReset");return this.state_=kb,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==sb&&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],h=f===sb?e.discardChanges():e.getValueFrom(f);b?this.value_[d/2]=h:g(h,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=h)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),B.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),!g(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 tb={};tb[L]=!0,tb[M]=!0,tb[O]=!0,t.defineComputedProperty=function(a,b,c){var d=C(a,b),e=c.open(function(a,b){e=a,d&&d(M,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 ub=0,vb=1,wb=2,xb=3;F.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(ub):(e.push(vb),d=g),b--,c--):f==h?(e.push(xb),b--,d=h):(e.push(wb),c--,d=i)}else e.push(xb),b--;else e.push(wb),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=E(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[E(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 ub:j&&(l.push(j),j=void 0),m++,n++;break;case vb:j||(j=E(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case wb:j||(j=E(m,[],0)),j.addedCount++,m++;break;case xb:j||(j=E(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 yb=new F;a.Observer=t,a.Observer.runEOM_=fb,a.Observer.hasObjectObserve=Q,a.ArrayObserver=x,a.ArrayObserver.calculateSplices=function(a,b){return yb.calculateSplices(a,b)},a.ArraySplice=F,a.ObjectObserver=w,a.PathObserver=y,a.CompoundObserver=z,a.Path=i,a.ObserverTransform=B,a.Observer.changeRecordTypes={add:L,update:M,reconfigure:N,"delete":O,splice:P}}("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.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.firstChild;d;d=d.nextSibling)c(d,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 P.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)&&O(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 K(a)===K(b)}function m(a){return R.get(a)?void 0:(R.set(a,!0),n(O(a),O(a.target)))}function n(b,c){if(S.get(b))throw new Error("InvalidStateError");S.set(b,!0),a.renderAllPending();var d=g(c);return"load"===b.type&&2===d.length&&d[0].target instanceof P.Document&&d.shift(),$.set(b,d),o(b,d)&&p(b,d)&&q(b,d),W.set(b,t.NONE),U.delete(b,null),S.delete(b),b.defaultPrevented}function o(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=t.CAPTURING_PHASE,!r(b[d],a,c)))return!1}return!0}function p(a,b){var c=t.AT_TARGET;return r(b[0],a,c)}function q(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=t.AT_TARGET;else{if(!d||Y.get(a))continue;c=t.BUBBLING_PHASE}if(!r(b[e],a,c))return}}function r(a,b,c){var d=a.target,e=a.currentTarget,f=Q.get(e);if(!f)return!0;if("relatedTarget"in b){var g=N(b);if(g.relatedTarget){var h=O(g.relatedTarget),j=i(e,h);if(j===d)return!0;V.set(b,j)}}W.set(b,c);var k=b.type,l=!1;T.set(b,d),U.set(b,e);for(var m=0;m<f.length;m++){var n=f[m];if(n.removed)l=!0;else if(!(n.type!==k||!n.capture&&c===t.CAPTURING_PHASE||n.capture&&c===t.BUBBLING_PHASE))try{if("function"==typeof n.handler?n.handler.call(e,b):n.handler.handleEvent(b),Y.get(b))return!1}catch(o){window.onerror?window.onerror(o.message):console.error(o,o.stack)}}if(l){var p=f.slice();f.length=0;for(var m=0;m<p.length;m++)p[m].removed||f.push(p[m])}return!X.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){return a instanceof _?void(this.impl=a):O(x(_,"Event",a,b))}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:N(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):O(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&L(e.prototype,c),d)try{M(d,e,new d("temp"))}catch(f){M(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=N(arguments[b]);var c=N(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(ib)return new a(c,u(d));var e=N(document.createEvent(b)),f=hb[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=N(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(){t.call(this)}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 P.ShadowRoot&&(a=a.host),N(a)}function D(a,b){var c=Q.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=N(a);c;c=c.parentNode)if(D(O(c),b))return!0;return!1}function F(a){J(a,lb)}function G(b,c,d,e){a.renderAllPending();for(var f=O(mb.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 H(a){return function(){var b=Z.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=Z.get(this);d||(d=Object.create(null),Z.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=a.forwardMethodsToWrapper,K=a.getTreeScope,L=a.mixin,M=a.registerWrapper,N=a.unwrap,O=a.wrap,P=a.wrappers,Q=(new WeakMap,new WeakMap),R=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;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 _=window.Event;_.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return T.get(this)},get currentTarget(){return U.get(this)},get eventPhase(){return W.get(this)},get path(){var a=new P.NodeList,b=$.get(this);if(b){for(var c=0,d=b.length-1,e=K(U.get(this)),f=0;d>=f;f++){var g=b[f].currentTarget,h=K(g);h.contains(e)&&(f!==d||g instanceof P.Node)&&(a[c++]=g)}a.length=c}return a},stopPropagation:function(){X.set(this,!0)},stopImmediatePropagation:function(){X.set(this,!0),Y.set(this,!0)}},M(_,t,document.createEvent("Event"));
-var ab=v("UIEvent",t),bb=v("CustomEvent",t),cb={get relatedTarget(){return V.get(this)||O(N(this).relatedTarget)}},db=L({initMouseEvent:w("initMouseEvent",14)},cb),eb=L({initFocusEvent:w("initFocusEvent",5)},cb),fb=v("MouseEvent",ab,db),gb=v("FocusEvent",ab,eb),hb=Object.create(null),ib=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!ib){var jb=function(a,b,c){if(c){var d=hb[c];b=L(L({},d),b)}hb[a]=b};jb("Event",{bubbles:!1,cancelable:!1}),jb("CustomEvent",{detail:null},"Event"),jb("UIEvent",{view:null,detail:0},"Event"),jb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),jb("FocusEvent",{relatedTarget:null},"UIEvent")}y.prototype=Object.create(t.prototype),L(y.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}});var kb=window.EventTarget,lb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;lb.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=Q.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],Q.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=Q.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=N(b),d=c.type;R.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return N(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},kb&&M(kb,B);var mb=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=bb,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=gb,a.wrappers.MouseEvent=fb,a.wrappers.UIEvent=ab}(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);N=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;N=!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&&U.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,U.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=K(c?O.call(c,a.impl,!1):P.call(a.impl,!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof M.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 Q),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.wrap,L=a.wrapIfNeeded,M=a.wrappers,N=!1,O=document.importNode,P=window.Node.prototype.cloneNode,Q=window.Node,R=window.DocumentFragment,S=(Q.prototype.appendChild,Q.prototype.compareDocumentPosition),T=Q.prototype.insertBefore,U=Q.prototype.removeChild,V=Q.prototype.replaceChild,W=/Trident/.test(navigator.userAgent),X=W?function(a,b){try{U.call(a,b)}catch(c){if(!(a instanceof R))throw c}}:function(a,b){U.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=K(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),T.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?T.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&&X(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),X(this.impl,f);return N||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=K(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),V.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&&V.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_:K(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:K(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:K(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:K(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:K(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,L(a))},compareDocumentPosition:function(a){return S.call(this.impl,J(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(Q,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}},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){"object"==typeof a&&(a=f(a)),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):c.extends?document.createElement(c.extends,b):document.createElement(b)}var e=c.prototype;if(a.nativePrototypeTable.get(e))throw new Error("NotSupportedError");for(var f,g=Object.getPrototypeOf(e),h=[];g&&!(f=a.nativePrototypeTable.get(g));)h.push(g),g=Object.getPrototypeOf(g);if(!f)throw new Error("NotSupportedError");for(var i=Object.create(f),j=h.length-1;j>=0;j--)i=Object.create(i);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(a){var b=e[a];b&&(i[a]=function(){A(this)instanceof d||y(this),b.apply(A(this),arguments)})});var k={prototype:i};c.extends&&(k.extends=c.extends),d.prototype=e,d.prototype.constructor=d,a.constructorTable.set(i,d),a.nativePrototypeTable.set(e,i);F.call(z(this),b,k);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";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||a&&!a.querySelector("shadow")||(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.convertColonAncestor(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)},convertColonAncestor:function(a){return this.convertColonRule(a,cssColonAncestorRe,this.colonAncestorPartReplacer)},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})},colonAncestorPartReplacer: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){return a.replace(/\^\^/g," ").replace(/\^/g," ")},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(hostRe,s).replace(colonHostRe,s).replace(colonAncestorRe,t)},propertiesFromRule:function(a){return a.style.content&&!a.style.content.match(/['"]+/)?a.style.cssText.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"):a.style.cssText},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="-shadowcssancestor",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonAncestorRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",hostRe=/@host/gim,colonHostRe=/\:host/gim,colonAncestorRe=/\:ancestor/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillAncestorRe=new RegExp(t,"gim");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};var a=Element.prototype.webkitCreateShadowRoot;Element.prototype.webkitCreateShadowRoot=function(){var b=this.webkitShadowRoot,c=a.call(this);return c.olderShadowRoot=b,c.host=this,CustomElements.watchShadow(this),c},Object.defineProperties(Element.prototype,{shadowRoot:{get:function(){return this.webkitShadowRoot}},createShadowRoot:{value:function(){return this.webkitCreateShadowRoot()}}}),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){c.load&&console.log("fetch",a,d);var e=function(b,c){this.receive(a,d,b,c)}.bind(this);b.load(a,e)},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,f){var g=f||{};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(m(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!g.prototype)throw new Error("Options missing required prototype property");return g.__name=b.toLowerCase(),g.lifecycle=g.lifecycle||{},g.ancestry=c(g.extends),d(g),e(g),k(g.prototype),n(g.__name,g),g.ctor=o(g),g.ctor.prototype=g.prototype,g.prototype.constructor=g.ctor,a.ready&&a.upgradeDocumentTree(document),g.ctor}function c(a){var b=m(a);return b?c(b.extends).concat([b]):[]}function d(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 e(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 f(a){return g(z(a.tag),a)}function g(b,c){return c.is&&b.setAttribute("is",c.is),b.removeAttribute("unresolved"),h(b,c),b.__upgraded__=!0,j(b),a.insertedNode(b),a.upgradeSubtree(b),b}function h(a,b){Object.__proto__?a.__proto__=b.prototype:(i(a,b.prototype,b.native),a.__proto__=b.prototype)}function i(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 j(a){a.createdCallback&&a.createdCallback()}function k(a){if(!a.setAttribute._polyfilled){var b=a.setAttribute;a.setAttribute=function(a,c){l.call(this,a,c,b)};var c=a.removeAttribute;a.removeAttribute=function(a){l.call(this,a,null,c)},a.setAttribute._polyfilled=!0}}function l(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 m(a){return a?x[a.toLowerCase()]:void 0}function n(a,b){x[a]=b}function o(a){return function(){return f(a)}}function p(a,b,c){return a===y?q(b,c):A(a,b)}function q(a,b){var c=m(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=q(a);return d.setAttribute("is",b),d}var d=z(a);return a.indexOf("-")>=0&&h(d,HTMLElement),d}function r(a){if(!a.__upgraded__&&a.nodeType===Node.ELEMENT_NODE){var b=a.getAttribute("is"),c=m(b||a.localName);if(c){if(b&&c.tag==a.localName)return g(a,c);if(!b&&!c.extends)return g(a,c)}}}function s(b){var c=B.call(this,b);return a.upgradeAll(c),c}a||(a=window.CustomElements={flags:{}});var t=a.flags,u=Boolean(document.registerElement),v=!t.register&&u&&!window.ShadowDOMPolyfill;if(v){var w=function(){};a.registry={},a.upgradeElement=w,a.watchShadow=w,a.upgrade=w,a.upgradeAll=w,a.upgradeSubtree=w,a.observeDocument=w,a.upgradeDocument=w,a.upgradeDocumentTree=w,a.takeRecords=w}else{var x={},y="http://www.w3.org/1999/xhtml",z=document.createElement.bind(document),A=document.createElementNS.bind(document),B=Node.prototype.cloneNode;document.registerElement=b,document.createElement=q,document.createElementNS=p,Node.prototype.cloneNode=s,a.registry=x,a.upgrade=r}var C;C=Object.__proto__||v?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=C,document.register=document.registerElement,a.hasNative=u,a.useNative=v}(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 ^^ "+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="";d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",e+=a(d)+c(d)+"\n"):(e+=d.selectors.map(b)+c(d.rule)+"\n",e+=d.selectors.map(a)+c(d.rule)+"\n")});var f=document.createElement("style");f.textContent=e,document.head.appendChild(f)}(),function(a){function b(a,e){e=e||{};var f=e.buttons;if(!d&&!f&&"touch"!==a)switch(e.which){case 1:f=1;break;case 2:f=4;break;case 3:f=2;break;default:f=0}var i;if(c)i=new MouseEvent(a,e);else{i=document.createEvent("MouseEvent");for(var j,k={},l=0;l<g.length;l++)j=g[l],k[j]=e[j]||h[l];i.initMouseEvent(a,k.bubbles,k.cancelable,k.view,k.detail,k.screenX,k.screenY,k.clientX,k.clientY,k.ctrlKey,k.altKey,k.shiftKey,k.metaKey,k.button,k.relatedTarget)}i.__proto__=b.prototype,d||Object.defineProperty(i,"buttons",{get:function(){return f},enumerable:!0});var m=0;return m=e.pressure?e.pressure:f?.5:0,Object.defineProperties(i,{pointerId:{value:e.pointerId||0,enumerable:!0},width:{value:e.width||0,enumerable:!0},height:{value:e.height||0,enumerable:!0},pressure:{value:m,enumerable:!0},tiltX:{value:e.tiltX||0,enumerable:!0},tiltY:{value:e.tiltY||0,enumerable:!0},pointerType:{value:e.pointerType||"",enumerable:!0},hwTimestamp:{value:e.hwTimestamp||0,enumerable:!0},isPrimary:{value:e.isPrimary||!1,enumerable:!0}}),i}var c=!1,d=!1;try{var e=new MouseEvent("click",{buttons:1});c=!0,d=1===e.buttons,e=null}catch(f){}var g=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget"],h=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null];b.prototype=Object.create(MouseEvent.prototype),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"],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],d="undefined"!=typeof SVGElementInstance,e={targets:new WeakMap,handledEvents:new WeakMap,pointermap:new a.PointerMap,eventMap:{},eventSources:{},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(!this.handledEvents.get(a)){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),this.handledEvents.set(a,!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.relatedTarget=null);var c=new PointerEvent(a,b);return b.preventDefault&&(c.preventDefault=b.preventDefault),this.targets.set(c,this.targets.get(b)||b.target),c},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var e,f={},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&&this.captureInfo.id===a.pointerId?this.captureInfo.target:this.targets.get(a)},setCapture:function(a,b){this.captureInfo&&this.releaseCapture(this.captureInfo.id),this.captureInfo={id:a,target:b};var c=new PointerEvent("gotpointercapture",{bubbles:!0});this.implicitRelease=this.releaseCapture.bind(this,a),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease),this.targets.set(c,b),this.asyncDispatchEvent(c)},releaseCapture:function(a){if(this.captureInfo&&this.captureInfo.id===a){var b=new PointerEvent("lostpointercapture",{bubbles:!0}),c=this.captureInfo.target;this.captureInfo=null,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease),this.targets.set(b,c),this.asyncDispatchEvent(b)}},dispatchEvent:a.external.dispatchEvent||function(a){var b=this.getTarget(a);return b?b.dispatchEvent(a):void 0},asyncDispatchEvent:function(a){setTimeout(this.dispatchEvent.bind(this,a),0)}};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={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,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=e}(window.PointerEventsPolyfill),function(a){var b,c=a.dispatcher,d=a.findTarget,e=a.targetFinding.allShadows.bind(a.targetFinding),f=c.pointermap,g=Array.prototype.map.call.bind(Array.prototype.map),h=2500,i=200,j="touch-action",k=!1,l={scrollType:new WeakMap,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&&(this.scrollType.set(a,d),c.listen(a,this.events),e(a).forEach(function(a){this.scrollType.set(a,d),c.listen(a,this.events)},this))},elementRemoved:function(a){this.scrollType["delete"](a),c.unlisten(a,this.events),e(a).forEach(function(a){this.scrollType["delete"](a),c.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(j),d=this.touchActionToScrollType(c),f=this.touchActionToScrollType(b);d&&f?(this.scrollType.set(a,d),e(a).forEach(function(a){this.scrollType.set(a,d)},this)):f?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===f.pointers()||1===f.pointers()&&f.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=c.cloneEvent(a);return b.pointerId=a.identifier+2,b.target=d(b),b.bubbles=!0,b.cancelable=!0,b.detail=this.clickCount,b.button=0,b.buttons=this.typeToButtons(this.currentTouchEvent),b.width=a.webkitRadiusX||a.radiusX||0,b.height=a.webkitRadiusY||a.radiusY||0,b.pressure=a.webkitForce||a.force||.5,b.isPrimary=this.isPrimaryTouch(a),b.pointerType=this.POINTER_TYPE,b},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a.type;var d=g(c,this.touchToPointer,this);d.forEach(function(b){b.preventDefault=function(){this.scrolling=!1,this.firstXY=null,a.preventDefault()}},this),d.forEach(b,this)},shouldScroll:function(a){if(this.firstXY){var b,c=this.scrollType.get(a.currentTarget);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(f.pointers()>=b.length){var c=[];f.forEach(function(a,d){if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(this.touchToPointer(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){f.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=f.get(b.pointerId);if(d){var e=d.out,g=d.outTarget;c.move(b),e&&g!==b.target&&(e.relatedTarget=b.target,b.relatedTarget=g,e.target=g,b.target?(c.leaveOut(e),c.enterOver(b)):(b.target=g,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){f["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(void 0===window.navigator.pointerEnabled){if(Object.defineProperty(window.navigator,"pointerEnabled",{value:!0,enumerable:!0}),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);setTimeout(this.runQueue.bind(this,a,c),0)},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){var c=function(){this.dispatchEvent(a,b)}.bind(this);setTimeout(c,0)},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={},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){var c=a.bindings;if(!c)return void(a.bindings={});var d=c[b];d&&(d.close(),c[b]=void 0)}function c(a){return null==a?"":a}function d(a,b){a.data=c(b)}function e(a){return function(b){return d(a,b)}}function f(a,b,d,e){return d?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,c(e))}function g(a,b,c){return function(d){f(a,b,c,d)}}function h(a){switch(a.type){case"checkbox":return s;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function i(a,b,d,e){a[b]=(e||c)(d)}function j(a,b,c){return function(d){return i(a,b,d,c)}}function k(){}function l(a,b,c,d){function e(){c.setValue(a[b]),c.discardChanges(),(d||k)(a),Platform.performMicrotaskCheckpoint()}var f=h(a);a.addEventListener(f,e);var g=c.close;c.close=function(){g&&(a.removeEventListener(f,e),c.close=g,c.close(),g=void 0)}}function m(a){return Boolean(a)}function n(b){if(b.form)return r(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 r(d,function(a){return a!=b&&!a.form})}function o(a){"INPUT"===a.tagName&&"radio"===a.type&&n(a).forEach(function(a){var b=a.bindings.checked;b&&b.setValue(!1)})}function p(a,b){var d,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings&&g.bindings.value&&(d=g,e=d.bindings.value,f=d.value),a.value=c(b),d&&d.value!=f&&(e.setValue(d.value),e.discardChanges(),Platform.performMicrotaskCheckpoint())}function q(a){return function(b){p(a,b)}}var r=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.unbind=function(a){b(this,a)},Node.prototype.unbindAll=function(){if(this.bindings){for(var a=Object.keys(this.bindings),b=0;b<a.length;b++){var c=this.bindings[a[b]];c&&c.close()}this.bindings={}}},Text.prototype.bind=function(a,c,f){return"textContent"!==a?Node.prototype.bind.call(this,a,c,f):f?d(this,c):(b(this,"textContent"),d(this,c.open(e(this))),this.bindings.textContent=c)},Element.prototype.bind=function(a,c,d){var e="?"==a[a.length-1];return e&&(this.removeAttribute(a),a=a.slice(0,-1)),d?f(this,a,e,c):(b(this,a),f(this,a,e,c.open(g(this,a,e))),this.bindings[a]=c)};var s;!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),s=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,d,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,d,e);this.removeAttribute(a);var f="checked"==a?m:c,g="checked"==a?o:k;return e?i(this,a,d,f):(b(this,a),l(this,a,d,g),i(this,a,d.open(j(this,a,f)),f),this.bindings[a]=d)},HTMLTextAreaElement.prototype.bind=function(a,d,e){return"value"!==a?HTMLElement.prototype.bind.call(this,a,d,e):(this.removeAttribute("value"),e?i(this,"value",d):(b(this,"value"),l(this,"value",d),i(this,"value",d.open(j(this,"value",c))),this.bindings.value=d))},HTMLOptionElement.prototype.bind=function(a,c,d){return"value"!==a?HTMLElement.prototype.bind.call(this,a,c,d):(this.removeAttribute("value"),d?p(this,c):(b(this,"value"),l(this,"value",c),p(this,c.open(q(this))),this.bindings.value=c))},HTMLSelectElement.prototype.bind=function(a,c,d){return"selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a?HTMLElement.prototype.bind.call(this,a,c,d):(this.removeAttribute(a),d?i(this,a,c):(b(this,a),l(this,a,c),i(this,a,c.open(j(this,a))),this.bindings[a]=c))}}(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,e.push(Path.get(n));var o=d&&d(n,b,c);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.terminators=[],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.unbind("ref"),this.bindings.ref=b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a.if||a.bind||a.repeat?(this.iterator_||(this.iterator_=new C(this),this.bindings=this.bindings||{},this.bindings.iterator=this.iterator_),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,this.bindings.iterator=void 0))},createInstance:function(a,b,c,d){b&&(c=this.newDelegate_(b)),this.refContent_||(this.refContent_=this.ref_.content);var e=this.refContent_,f=this.bindingMap_;f&&f.content===e||(f=B(e,c&&c.prepareBinding)||[],f.content=e,this.bindingMap_=f);var g=m(this),h=g.createDocumentFragment();h.templateCreator_=this,h.protoContent_=e;for(var i={firstNode:null,lastNode:null,model:a},j=0,k=e.firstChild;k;k=k.nextSibling){var l=A(k,h,g,f.children[j++],a,c,d);l.templateInstance_=i}return i.firstNode=h.firstChild,i.lastNode=h.lastChild,h.templateCreator_=void 0,h.protoContent_=void 0,h},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_=void 0,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}}),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)))},getTerminatorAt:function(a){if(-1==a)return this.templateElement_;var b=this.terminators[2*a];if(b.nodeType!==Node.ELEMENT_NODE||this.templateElement_===b)return b;var c=b.iterator_;return c?c.getTerminatorAt(c.terminators.length/2-1):b},insertInstanceAt:function(a,b,c,d){var e=this.getTerminatorAt(a-1),f=e;b?f=b.lastChild||f:c&&(f=c[c.length-1]||f),this.terminators.splice(2*a,0,f,d);var g=this.templateElement_.parentNode,h=e.nextSibling;if(b)g.insertBefore(b,h);else if(c)for(var i=0;i<c.length;i++)g.insertBefore(c[i],h)},extractInstanceAt:function(a){var b=[],c=this.getTerminatorAt(a-1),d=this.getTerminatorAt(a);b.instanceBindings=this.terminators[2*a+1],this.terminators.splice(2*a,2);for(var e=this.templateElement_.parentNode;d!==c;){var f=c.nextSibling;f==d&&(d=c),e.removeChild(f),b.push(f)}return b},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));var d=new D,e=0;a.forEach(function(a){a.removed.forEach(function(b){var c=this.extractInstanceAt(a.index+e);d.set(b,c)},this),e-=a.addedCount},this),a.forEach(function(a){for(var e=a.index;e<a.index+a.addedCount;e++){var f,g=this.iteratedValue[e],h=void 0,i=d.get(g);i?(d.delete(g),f=i.instanceBindings):(f=[],this.instanceModelFn_&&(g=this.instanceModelFn_(g)),void 0!==g&&(h=b.createInstance(g,void 0,c,f))),this.insertInstanceAt(e,h,i,f)}},this),d.forEach(function(a){this.closeInstanceBindings(a.instanceBindings)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.getTerminatorAt(a-1),c=this.getTerminatorAt(a);if(b!==c){var d=b.nextSibling.templateInstance;this.instancePositionChangedFn_(d,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.terminators.length/2;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=0;b<a.length;b++)a[b].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=1;a<this.terminators.length;a+=2)this.closeInstanceBindings(this.terminators[a]);this.terminators.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=s[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),s[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[w]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[w];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=v[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(){}var s=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 t={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},u={"+":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(!t[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d){return t[a](b(c,d))}},createBinaryExpression:function(a,b,c){if(!u[a])throw Error("Disallowed operator: "+a);return b=i(b),c=i(c),function(d,e){return u[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(){g.dynamicDeps&&f.startReset();var c=g.getValue(a,g.dynamicDeps?f:void 0,b);return g.dynamicDeps&&f.finishReset(),c}function e(c){return g.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver;this.getValue(a,f,b);var g=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 v={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){v[a.toLowerCase()]=a});var w="@"+Math.random().toString(36).slice(2);r.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(!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[w]=c,e}}}},a.PolymerExpressions=r,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,f=125;if(window.addEventListener("WebComponentsReady",function(){b(),Observer.hasObjectObserve||(a.flushPoll=setInterval(b,f))}),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 a60f0d9..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":["../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/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  var PROP_ADD_TYPE = 'add';\n  var PROP_UPDATE_TYPE = 'update';\n  var PROP_RECONFIGURE_TYPE = 'reconfigure';\n  var PROP_DELETE_TYPE = 'delete';\n  var ARRAY_SPLICE_TYPE = 'splice';\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    Object.observe(test, callback);\n    test.id = 1;\n    test.id = 2;\n    delete test.id;\n    Object.deliverChangeRecords(callback);\n    if (records.length !== 3)\n      return false;\n\n    // TODO(rafaelw): Remove this when new change record type names make it to\n    // chrome release.\n    if (records[0].type == 'new' &&\n        records[1].type == 'updated' &&\n        records[2].type == 'deleted') {\n      PROP_ADD_TYPE = 'new';\n      PROP_UPDATE_TYPE = 'updated';\n      PROP_RECONFIGURE_TYPE = 'reconfigured';\n      PROP_DELETE_TYPE = 'deleted';\n    } else if (records[0].type != 'add' ||\n               records[1].type != 'update' ||\n               records[2].type != 'delete') {\n      console.error('Unexpected change record names for Object.observe. ' +\n                    'Using dirty-checking instead');\n      return false;\n    }\n    Object.unobserve(test, callback);\n\n    test = [0];\n    Array.observe(test, callback);\n    test[1] = 1;\n    test.length = 0;\n    Object.deliverChangeRecords(callback);\n    if (records.length != 2)\n      return false;\n    if (records[0].type != ARRAY_SPLICE_TYPE ||\n        records[1].type != ARRAY_SPLICE_TYPE) {\n      return false;\n    }\n    Array.unobserve(test, 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 (!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 (!isObject(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 = typeof Object.deliverAllChangeRecords == 'function';\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      Object.deliverAllChangeRecords();\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  expectedRecordTypes[PROP_ADD_TYPE] = true;\n  expectedRecordTypes[PROP_UPDATE_TYPE] = true;\n  expectedRecordTypes[PROP_DELETE_TYPE] = true;\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(PROP_UPDATE_TYPE, 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 == PROP_UPDATE_TYPE)\n        continue;\n\n      if (record.type == PROP_ADD_TYPE) {\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 ARRAY_SPLICE_TYPE:\n          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);\n          break;\n        case PROP_ADD_TYPE:\n        case PROP_UPDATE_TYPE:\n        case PROP_DELETE_TYPE:\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\n  // TODO(rafaelw): Only needed for testing until new change record names\n  // make it to release.\n  global.Observer.changeRecordTypes = {\n    add: PROP_ADD_TYPE,\n    update: PROP_UPDATE_TYPE,\n    reconfigure: PROP_RECONFIGURE_TYPE,\n    'delete': PROP_DELETE_TYPE,\n    splice: ARRAY_SPLICE_TYPE\n  };\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 || 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  // 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 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\n    return dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\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 (event.type === 'load' &&\n        eventPath.length === 2 &&\n        eventPath[0].target instanceof wrappers.Document) {\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      // 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 (originalEvent.relatedTarget) {\n        var relatedTarget = wrap(originalEvent.relatedTarget);\n\n        var adjusted = adjustRelatedTarget(currentTarget, relatedTarget);\n        if (adjusted === target)\n          return true;\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      this.impl = type;\n    else\n      return wrap(constructEvent(OriginalEvent, 'Event', type, options));\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      return relatedTargetTable.get(this) || 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  function BeforeUnloadEvent(impl) {\n    Event.call(this);\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  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 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, unwrap(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\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 (typeof indexOrNode === 'object')\n        indexOrNode = unwrap(indexOrNode);\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 = object.prototype;\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 (object.extends)\n        p.extends = object.extends;\n\n      function CustomElementConstructor(node) {\n        if (!node) {\n          if (object.extends) {\n            return document.createElement(object.extends, 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","// 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, :ancestor: 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 && (!root || root.querySelector('shadow'))) {\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.convertColonAncestor(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 :ancestor(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :ancestor(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonAncestor: function(cssText) {\n    return this.convertColonRule(cssText, cssColonAncestorRe,\n        this.colonAncestorPartReplacer);\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  colonAncestorPartReplacer: 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    return cssText.replace(/\\^\\^/g, ' ').replace(/\\^/g, ' ');\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(hostRe, polyfillHost).replace(colonHostRe,\n        polyfillHost).replace(colonAncestorRe, polyfillAncestor);\n  },\n  propertiesFromRule: function(rule) {\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    if (rule.style.content && !rule.style.content.match(/['\"]+/)) {\n      return rule.style.cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    return rule.style.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: :ancestor pre-processed to -shadowcssancestor.\n    polyfillAncestor = '-shadowcssancestor',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonAncestorRe = new RegExp('(' + polyfillAncestor + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    hostRe = /@host/gim,\n    colonHostRe = /\\:host/gim,\n    colonAncestorRe = /\\:ancestor/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillAncestorRe = new RegExp(polyfillAncestor, 'gim');\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  var originalCreateShadowRoot = Element.prototype.webkitCreateShadowRoot;\n  Element.prototype.webkitCreateShadowRoot = function() {\n    var elderRoot = this.webkitShadowRoot;\n    var root = originalCreateShadowRoot.call(this);\n    root.olderShadowRoot = elderRoot;\n    root.host = this;\n    CustomElements.watchShadow(this);\n    return root;\n  }\n\n  Object.defineProperties(Element.prototype, {\n    shadowRoot: {\n      get: function() {\n        return this.webkitShadowRoot;\n      }\n    },\n    createShadowRoot: {\n      value: function() {\n        return this.webkitCreateShadowRoot();\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      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    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\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    // 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 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;\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 ^^ ' + 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  attrib2css.forEach(function(r) {\n    if (String(r) === r) {\n      styles += selector(r) + rule(r) + '\\n';\n      styles += shadowSelector(r) + rule(r) + '\\n';\n    } else {\n      styles += r.selectors.map(selector) + rule(r.rule) + '\\n';\n      styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\\n';\n    }\n  });\n  var el = document.createElement('style');\n  el.textContent = styles;\n  document.head.appendChild(el);\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  // test for DOM Level 4 Events\n  var NEW_MOUSE_EVENT = false;\n  var HAS_BUTTONS = false;\n  try {\n    var ev = new MouseEvent('click', {buttons: 1});\n    NEW_MOUSE_EVENT = true;\n    HAS_BUTTONS = ev.buttons === 1;\n    ev = null;\n  } catch(e) {\n  }\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  ];\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  ];\n\n  function PointerEvent(inType, inDict) {\n    inDict = inDict || {};\n    // According to the w3c spec,\n    // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-button\n    // MouseEvent.button == 0 can mean either no mouse button depressed, or the\n    // left mouse button depressed.\n    //\n    // As of now, the only way to distinguish between the two states of\n    // MouseEvent.button is by using the deprecated MouseEvent.which property, as\n    // this maps mouse buttons to positive integers > 0, and uses 0 to mean that\n    // no mouse button is held.\n    //\n    // MouseEvent.which is derived from MouseEvent.button at MouseEvent creation,\n    // but initMouseEvent does not expose an argument with which to set\n    // MouseEvent.which. Calling initMouseEvent with a buttonArg of 0 will set\n    // MouseEvent.button == 0 and MouseEvent.which == 1, breaking the expectations\n    // of app developers.\n    //\n    // The only way to propagate the correct state of MouseEvent.which and\n    // MouseEvent.button to a new MouseEvent.button == 0 and MouseEvent.which == 0\n    // is to call initMouseEvent with a buttonArg value of -1.\n    //\n    // This is fixed with DOM Level 4's use of buttons\n    var buttons = inDict.buttons;\n    // touch has two possible buttons state: 0 and 1, rely on being told the right one\n    if (!HAS_BUTTONS && !buttons && inType !== 'touch') {\n      switch (inDict.which) {\n        case 1: buttons = 1; break;\n        case 2: buttons = 4; break;\n        case 3: buttons = 2; break;\n        default: buttons = 0;\n      }\n    }\n\n    var e;\n    if (NEW_MOUSE_EVENT) {\n      e = new MouseEvent(inType, inDict);\n    } else {\n      e = document.createEvent('MouseEvent');\n\n      // import values from the given dictionary\n      var props = {}, p;\n      for(var i = 0; i < MOUSE_PROPS.length; i++) {\n        p = MOUSE_PROPS[i];\n        props[p] = inDict[p] || MOUSE_DEFAULTS[i];\n      }\n\n      // define the properties inherited from MouseEvent\n      e.initMouseEvent(\n        inType, props.bubbles, props.cancelable, props.view, props.detail,\n        props.screenX, props.screenY, props.clientX, props.clientY, props.ctrlKey,\n        props.altKey, props.shiftKey, props.metaKey, props.button, props.relatedTarget\n      );\n    }\n\n    // make the event pass instanceof checks\n    e.__proto__ = PointerEvent.prototype;\n\n    // define the buttons property according to DOM Level 3 spec\n    if (!HAS_BUTTONS) {\n      // IE 10 has buttons on MouseEvent.prototype as a getter w/o any setting\n      // mechanism\n      Object.defineProperty(e, 'buttons', {get: function(){ return buttons; }, enumerable: true});\n    }\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 = buttons ? 0.5 : 0;\n    }\n\n    // define the properties of the PointerEvent interface\n    Object.defineProperties(e, {\n      pointerId: { value: inDict.pointerId || 0, enumerable: true },\n      width: { value: inDict.width || 0, enumerable: true },\n      height: { value: inDict.height || 0, enumerable: true },\n      pressure: { value: pressure, enumerable: true },\n      tiltX: { value: inDict.tiltX || 0, enumerable: true },\n      tiltY: { value: inDict.tiltY || 0, enumerable: true },\n      pointerType: { value: inDict.pointerType || '', enumerable: true },\n      hwTimestamp: { value: inDict.hwTimestamp || 0, enumerable: true },\n      isPrimary: { value: inDict.isPrimary || false, enumerable: true }\n    });\n    return e;\n  }\n\n  // PointerEvent extends MouseEvent\n  PointerEvent.prototype = Object.create(MouseEvent.prototype);\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  ];\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  ];\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    targets: new WeakMap(),\n    handledEvents: new WeakMap(),\n    pointermap: new scope.PointerMap(),\n    eventMap: {},\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: {},\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 (this.handledEvents.get(inEvent)) {\n        return;\n      }\n      var type = inEvent.type;\n      var fn = this.eventMap && this.eventMap[type];\n      if (fn) {\n        fn(inEvent);\n      }\n      this.handledEvents.set(inEvent, 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) {\n        inEvent.relatedTarget = null;\n      }\n      var e = new PointerEvent(inType, inEvent);\n      if (inEvent.preventDefault) {\n        e.preventDefault = inEvent.preventDefault;\n      }\n      this.targets.set(e, this.targets.get(inEvent) || 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 = {}, 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      if (this.captureInfo) {\n        if (this.captureInfo.id === inEvent.pointerId) {\n          return this.captureInfo.target;\n        }\n      }\n      return this.targets.get(inEvent);\n    },\n    setCapture: function(inPointerId, inTarget) {\n      if (this.captureInfo) {\n        this.releaseCapture(this.captureInfo.id);\n      }\n      this.captureInfo = {id: inPointerId, target: inTarget};\n      var e = new PointerEvent('gotpointercapture', { bubbles: true });\n      this.implicitRelease = this.releaseCapture.bind(this, inPointerId);\n      document.addEventListener('pointerup', this.implicitRelease);\n      document.addEventListener('pointercancel', this.implicitRelease);\n      this.targets.set(e, inTarget);\n      this.asyncDispatchEvent(e);\n    },\n    releaseCapture: function(inPointerId) {\n      if (this.captureInfo && this.captureInfo.id === inPointerId) {\n        var e = new PointerEvent('lostpointercapture', { bubbles: true });\n        var t = this.captureInfo.target;\n        this.captureInfo = null;\n        document.removeEventListener('pointerup', this.implicitRelease);\n        document.removeEventListener('pointercancel', this.implicitRelease);\n        this.targets.set(e, 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      setTimeout(this.dispatchEvent.bind(this, inEvent), 0);\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  // 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      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 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    scrollType: new WeakMap(),\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        this.scrollType.set(el, st);\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          this.scrollType.set(s, st);\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      this.scrollType['delete'](el);\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        this.scrollType['delete'](s);\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        this.scrollType.set(el, st);\n        allShadows(el).forEach(function(s) {\n          this.scrollType.set(s, 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 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      e.pointerId = inTouch.identifier + 2;\n      e.target = findTarget(e);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.button = 0;\n      e.buttons = this.typeToButtons(this.currentTouchEvent);\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      return e;\n    },\n    processTouches: function(inEvent, inFunction) {\n      var tl = inEvent.changedTouches;\n      this.currentTouchEvent = inEvent.type;\n      var pointers = touchMap(tl, this.touchToPointer, this);\n      // forward touch preventDefaults\n      pointers.forEach(function(p) {\n        p.preventDefault = function() {\n          this.scrolling = false;\n          this.firstXY = null;\n          inEvent.preventDefault();\n        };\n      }, this);\n      pointers.forEach(inFunction, this);\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 = this.scrollType.get(inEvent.currentTarget);\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(this.touchToPointer(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.navigator.pointerEnabled === undefined) {\n    Object.defineProperty(window.navigator, 'pointerEnabled', {value: true, enumerable: true});\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      setTimeout(this.runQueue.bind(this, inHandlerFns, e), 0);\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      var fn = function() {\n        this.dispatchEvent(inEvent, inTarget);\n      }.bind(this);\n      setTimeout(fn, 0);\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      var points = {};\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 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(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\n  Node.prototype.bind = function(name, observable) {\n    console.error('Unhandled binding to Node: ', this, name, observable);\n  };\n\n  function unbind(node, name) {\n    var bindings = node.bindings;\n    if (!bindings) {\n      node.bindings = {};\n      return;\n    }\n\n    var binding = bindings[name];\n    if (!binding)\n      return;\n\n    binding.close();\n    bindings[name] = undefined;\n  }\n\n  Node.prototype.unbind = function(name) {\n    unbind(this, name);\n  };\n\n  Node.prototype.unbindAll = function() {\n    if (!this.bindings)\n      return;\n    var names = Object.keys(this.bindings);\n    for (var i = 0; i < names.length; i++) {\n      var binding = this.bindings[names[i]];\n      if (binding)\n        binding.close();\n    }\n\n    this.bindings = {};\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  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    unbind(this, 'textContent');\n    updateText(this, value.open(textBinding(this)));\n    return this.bindings.textContent = value;\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    unbind(this, name);\n    updateAttribute(this, name, conditional,\n        value.open(attributeBinding(this, name, conditional)));\n\n    return this.bindings[name] = value;\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    var capturedClose = observable.close;\n    observable.close = function() {\n      if (!capturedClose)\n        return;\n      input.removeEventListener(eventType, eventHandler);\n\n      observable.close = capturedClose;\n      observable.close();\n      capturedClose = undefined;\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.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\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    unbind(this, name);\n    bindInputEvent(this, name, value, postEventFn);\n    updateInput(this, name,\n                value.open(inputBinding(this, name, sanitizeFn)),\n                sanitizeFn);\n\n    return this.bindings[name] = value;\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    unbind(this, 'value');\n    bindInputEvent(this, 'value', value);\n    updateInput(this, 'value',\n                value.open(inputBinding(this, 'value', sanitizeValue)));\n\n    return this.bindings.value = value;\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.setValue(select.value);\n      selectBinding.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    unbind(this, 'value');\n    bindInputEvent(this, 'value', value);\n    updateOption(this, value.open(optionBinding(this)));\n    return this.bindings.value = value;\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    unbind(this, name);\n    bindInputEvent(this, name, value);\n    updateInput(this, name,\n                value.open(inputBinding(this, name)));\n    return this.bindings[name] = value;\n  }\n})(this);\n","// 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(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      this.unbind('ref');\n      return this.bindings.ref = 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          this.bindings.iterator = undefined;\n        }\n\n        return;\n      }\n\n      if (!this.iterator_) {\n        this.iterator_ = new TemplateIterator(this);\n        this.bindings = this.bindings || {};\n        this.bindings.iterator = this.iterator_;\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                             instanceBindings_) {\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      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\n      var instanceRecord = {\n        firstNode: null,\n        lastNode: null,\n        model: model\n      };\n\n      var i = 0;\n      for (var child = content.firstChild; child; child = child.nextSibling) {\n        var clone = cloneAndBindInstance(child, instance, stagingDocument,\n                                         map.children[i++],\n                                         model,\n                                         delegate_,\n                                         instanceBindings_);\n        clone.templateInstance_ = instanceRecord;\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      this.bindings_ = undefined;\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      tokens.push(Path.get(pathString)); // PATH\n      var delegateFn = prepareBindingFn &&\n                       prepareBindingFn(pathString, name, node);\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  function TemplateIterator(templateElement) {\n    this.closed = false;\n    this.templateElement_ = templateElement;\n\n    // Flattened array of tuples:\n    //   <instanceTerminatorNode, [bindingsSetupByInstance]>\n    this.terminators = [];\n\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    getTerminatorAt: function(index) {\n      if (index == -1)\n        return this.templateElement_;\n      var terminator = this.terminators[index*2];\n      if (terminator.nodeType !== Node.ELEMENT_NODE ||\n          this.templateElement_ === terminator) {\n        return terminator;\n      }\n\n      var subIterator = terminator.iterator_;\n      if (!subIterator)\n        return terminator;\n\n      return subIterator.getTerminatorAt(subIterator.terminators.length/2 - 1);\n    },\n\n    // TODO(rafaelw): If we inserting sequences of instances we can probably\n    // avoid lots of calls to getTerminatorAt(), or cache its result.\n    insertInstanceAt: function(index, fragment, instanceNodes,\n                               instanceBindings) {\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = previousTerminator;\n      if (fragment)\n        terminator = fragment.lastChild || terminator;\n      else if (instanceNodes)\n        terminator = instanceNodes[instanceNodes.length - 1] || terminator;\n\n      this.terminators.splice(index*2, 0, terminator, instanceBindings);\n      var parent = this.templateElement_.parentNode;\n      var insertBeforeNode = previousTerminator.nextSibling;\n\n      if (fragment) {\n        parent.insertBefore(fragment, insertBeforeNode);\n      } else if (instanceNodes) {\n        for (var i = 0; i < instanceNodes.length; i++)\n          parent.insertBefore(instanceNodes[i], insertBeforeNode);\n      }\n    },\n\n    extractInstanceAt: function(index) {\n      var instanceNodes = [];\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = this.getTerminatorAt(index);\n      instanceNodes.instanceBindings = this.terminators[index*2 + 1];\n      this.terminators.splice(index*2, 2);\n\n      var parent = this.templateElement_.parentNode;\n      while (terminator !== previousTerminator) {\n        var node = previousTerminator.nextSibling;\n        if (node == terminator)\n          terminator = previousTerminator;\n\n        parent.removeChild(node);\n        instanceNodes.push(node);\n      }\n\n      return instanceNodes;\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      var instanceCache = new Map;\n      var removeDelta = 0;\n      splices.forEach(function(splice) {\n        splice.removed.forEach(function(model) {\n          var instanceNodes =\n              this.extractInstanceAt(splice.index + removeDelta);\n          instanceCache.set(model, instanceNodes);\n        }, this);\n\n        removeDelta -= splice.addedCount;\n      }, this);\n\n      splices.forEach(function(splice) {\n        var addIndex = splice.index;\n        for (; addIndex < splice.index + splice.addedCount; addIndex++) {\n          var model = this.iteratedValue[addIndex];\n          var fragment = undefined;\n          var instanceNodes = instanceCache.get(model);\n          var instanceBindings;\n          if (instanceNodes) {\n            instanceCache.delete(model);\n            instanceBindings = instanceNodes.instanceBindings;\n          } else {\n            instanceBindings = [];\n            if (this.instanceModelFn_)\n              model = this.instanceModelFn_(model);\n\n            if (model !== undefined) {\n              fragment = template.createInstance(model, undefined, delegate,\n                                                 instanceBindings);\n            }\n          }\n\n          this.insertInstanceAt(addIndex, fragment, instanceNodes,\n                                instanceBindings);\n        }\n      }, this);\n\n      instanceCache.forEach(function(instanceNodes) {\n        this.closeInstanceBindings(instanceNodes.instanceBindings);\n      }, this);\n\n      if (this.instancePositionChangedFn_)\n        this.reportInstancesMoved(splices);\n    },\n\n    reportInstanceMoved: function(index) {\n      var previousTerminator = this.getTerminatorAt(index - 1);\n      var terminator = this.getTerminatorAt(index);\n      if (previousTerminator === terminator)\n        return; // instance has zero nodes.\n\n      // We must use the first node of the instance, because any subsequent\n      // nodes may have been generated by sub-templates.\n      // TODO(rafaelw): This is brittle WRT instance mutation -- e.g. if the\n      // first node was removed by script.\n      var templateInstance = previousTerminator.nextSibling.templateInstance;\n      this.instancePositionChangedFn_(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.terminators.length / 2;\n      while (index < length) {\n        this.reportInstanceMoved(index);\n        index++;\n      }\n    },\n\n    closeInstanceBindings: function(instanceBindings) {\n      for (var i = 0; i < instanceBindings.length; i++) {\n        instanceBindings[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 = 1; i < this.terminators.length; i += 2) {\n        this.closeInstanceBindings(this.terminators[i]);\n      }\n\n      this.terminators.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 2013 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  // 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      this.getValue(model, observer, filterRegistry);  // captures deps.\n      var self = this;\n\n      function valueFn() {\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 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 (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\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\nvar FLUSH_POLL_INTERVAL = 125;\nwindow.addEventListener('WebComponentsReady', function() {\n  flush();\n  // flush periodically if platform does not have object observe.\n  if (!Observer.hasObjectObserve) {\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  }\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 8ed3bca..7a3fa76 100644
--- a/pkg/web_components/pubspec.yaml
+++ b/pkg/web_components/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_components
-version: 0.3.2
+version: 0.3.3
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: https://www.dartlang.org/polymer-dart/
 description: >
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 24d6de1..496e7c0 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -85,23 +85,11 @@
         })
         .then((HttpClientResponse response) {
           // Only create a ByteBuilder, if multiple chunks are received.
-          var bufferOrBuilder;
+          var builder = new BytesBuilder(copy: false);
           response.listen(
-            (data) {
-              if (bufferOrBuilder == null) {
-                bufferOrBuilder = data;
-              } else {
-                if (bufferOrBuilder is! BytesBuilder) {
-                  bufferOrBuilder = new BytesBuilder()
-                      ..add(bufferOrBuilder);
-                }
-                bufferOrBuilder.add(data);
-              }
-            },
+            builder.add,
             onDone: () {
-              var data = bufferOrBuilder;
-              if (data is BytesBuilder) data = data.takeBytes();
-              _requestCompleted(data, response);
+              _requestCompleted(builder.takeBytes(), response);
               // Close the client to stop any timers currently held alive.
               _client.close();
             },
diff --git a/runtime/bin/dbg_connection.cc b/runtime/bin/dbg_connection.cc
index 45edc0c7..0d92133 100644
--- a/runtime/bin/dbg_connection.cc
+++ b/runtime/bin/dbg_connection.cc
@@ -252,8 +252,7 @@
         const char* end = r.EndOfObject();
         // Get debug message queue corresponding to isolate.
         MessageParser msg_parser(start, (end - start));
-        Dart_IsolateId isolate_id =
-            static_cast<Dart_IsolateId>(msg_parser.GetIntParam("isolateId"));
+        Dart_IsolateId isolate_id = msg_parser.GetInt64Param("isolateId");
         if (!DbgMsgQueueList::AddIsolateMessage(isolate_id,
                                                 cmd_idx,
                                                 msgbuf_->buf(),
@@ -430,8 +429,7 @@
 void DebuggerConnectionHandler::HandleInterruptCmd(DbgMessage* in_msg) {
   MessageParser msg_parser(in_msg->buffer(), in_msg->buffer_len());
   int msg_id = msg_parser.MessageId();
-  Dart_IsolateId isolate_id =
-      static_cast<Dart_IsolateId>(msg_parser.GetIntParam("isolateId"));
+  Dart_IsolateId isolate_id = msg_parser.GetInt64Param("isolateId");
   if (isolate_id == ILLEGAL_ISOLATE_ID || Dart_GetIsolate(isolate_id) == NULL) {
     in_msg->SendErrorReply(msg_id, "Invalid isolate specified");
     return;
diff --git a/runtime/bin/dbg_message.cc b/runtime/bin/dbg_message.cc
index d0b6541..d47474f 100644
--- a/runtime/bin/dbg_message.cc
+++ b/runtime/bin/dbg_message.cc
@@ -68,6 +68,16 @@
 }
 
 
+int64_t MessageParser::GetInt64Param(const char* name) const {
+  const char* params = Params();
+  ASSERT(params != NULL);
+  dart::JSONReader r(params);
+  r.Seek(name);
+  ASSERT(r.Type() == dart::JSONReader::kInteger);
+  return strtoll(r.ValueChars(), NULL, 10);
+}
+
+
 intptr_t MessageParser::GetOptIntParam(const char* name,
                                        intptr_t default_val) const {
   const char* params = Params();
diff --git a/runtime/bin/dbg_message.h b/runtime/bin/dbg_message.h
index 23c08fc..20120e1 100644
--- a/runtime/bin/dbg_message.h
+++ b/runtime/bin/dbg_message.h
@@ -45,6 +45,7 @@
   const char* Params() const;
   bool HasParam(const char* name) const;
   intptr_t GetIntParam(const char* name) const;
+  int64_t GetInt64Param(const char* name) const;
   intptr_t GetOptIntParam(const char* name, intptr_t default_val) const;
 
   // GetStringParam mallocs the buffer that it returns. Caller must free.
diff --git a/runtime/bin/net/nss.gyp b/runtime/bin/net/nss.gyp
index 7e5ae598..0a3f777 100644
--- a/runtime/bin/net/nss.gyp
+++ b/runtime/bin/net/nss.gyp
@@ -67,6 +67,14 @@
           ]}],
         ],
       },
+      # Added by Dart.
+      'Dart_simarm64_Base': {
+        'defines': [
+          'NSS_X86_OR_X64',
+          'NSS_X64',
+          'NSS_USE_64',
+        ],
+      },
     },
     'conditions': [
       ['OS=="win"', {
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index 844d09e..c41b808 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -674,11 +674,6 @@
   if (pipe(fds) != 0) {
     return -1;
   }
-  if (!FDUtils::SetNonBlocking(fds[0])) {
-    VOID_TEMP_FAILURE_RETRY(close(fds[0]));
-    VOID_TEMP_FAILURE_RETRY(close(fds[1]));
-    return -1;
-  }
   ThreadSignalBlocker blocker(kSignalsCount, kSignals);
   MutexLocker lock(signal_mutex);
   SignalInfo* handler = signal_handlers;
@@ -700,8 +695,10 @@
     }
     int status = sigaction(signal, &act, NULL);
     if (status < 0) {
+      int err = errno;
       VOID_TEMP_FAILURE_RETRY(close(fds[0]));
       VOID_TEMP_FAILURE_RETRY(close(fds[1]));
+      errno = err;
       return -1;
     }
   }
diff --git a/runtime/bin/resources_sources.gypi b/runtime/bin/resources_sources.gypi
index bbe1754..8b6d508 100644
--- a/runtime/bin/resources_sources.gypi
+++ b/runtime/bin/resources_sources.gypi
@@ -10,76 +10,82 @@
     'vmservice/server.dart',
     'vmservice/vmservice_io.dart',
 # Observatory sources
+    'vmservice/client/deployed/web/bootstrap_css/css/bootstrap.min.css',
+    'vmservice/client/deployed/web/bootstrap_css/fonts/glyphicons-halflings-regular.eot',
+    'vmservice/client/deployed/web/bootstrap_css/fonts/glyphicons-halflings-regular.svg',
+    'vmservice/client/deployed/web/bootstrap_css/fonts/glyphicons-halflings-regular.ttf',
+    'vmservice/client/deployed/web/bootstrap_css/fonts/glyphicons-halflings-regular.woff',
+    'vmservice/client/deployed/web/bootstrap_css/LICENSE',
+    'vmservice/client/deployed/web/bootstrap_css/README.google',
+    'vmservice/client/deployed/web/favicon.ico',
+    'vmservice/client/deployed/web/img/isolate_icon.png',
+    'vmservice/client/deployed/web/index.html',
     'vmservice/client/deployed/web/index.html_bootstrap.dart.js',
-    'vmservice/client/deployed/web/packages/browser/interop.js',
+    'vmservice/client/deployed/web/index.html_bootstrap.dart.js.map',
+    'vmservice/client/deployed/web/index_devtools.html',
+    'vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js',
+    'vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js.map',
     'vmservice/client/deployed/web/packages/browser/dart.js',
+    'vmservice/client/deployed/web/packages/browser/interop.js',
+    'vmservice/client/deployed/web/packages/custom_element/custom-elements.debug.js',
+    'vmservice/client/deployed/web/packages/custom_element/custom-elements.min.js',
+    'vmservice/client/deployed/web/packages/html_import/html_import.debug.js',
+    'vmservice/client/deployed/web/packages/html_import/html_import.min.js',
+    'vmservice/client/deployed/web/packages/html_import/src/boot.js',
+    'vmservice/client/deployed/web/packages/html_import/src/HTMLImports.js',
+    'vmservice/client/deployed/web/packages/html_import/src/Parser.js',
+    'vmservice/client/deployed/web/packages/html_import/tools/loader/loader.js',
     'vmservice/client/deployed/web/packages/mutation_observer/mutation_observer.js',
     'vmservice/client/deployed/web/packages/mutation_observer/mutation_observer.min.js',
     'vmservice/client/deployed/web/packages/observatory/elements.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/service_ref.html',
     'vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/sliding_checkbox.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/service_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/collapsible_content.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/img/isolate_icon.png',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/curly_block.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/observatory_element.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/response_viewer.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html',
     'vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html',
     'vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/collapsible_content.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/curly_block.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/eval_link.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html',
     'vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html',
     'vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html',
-    'vmservice/client/deployed/web/packages/shadow_dom/shadow_dom.min.js',
-    'vmservice/client/deployed/web/packages/shadow_dom/shadow_dom.debug.js',
-    'vmservice/client/deployed/web/packages/shadow_dom/src/platform/patches-shadowdom-polyfill-before.js',
-    'vmservice/client/deployed/web/packages/shadow_dom/src/platform/platform-init.js',
-    'vmservice/client/deployed/web/packages/shadow_dom/src/platform/patches-shadowdom-polyfill.js',
-    'vmservice/client/deployed/web/packages/html_import/html_import.min.js',
-    'vmservice/client/deployed/web/packages/html_import/html_import.debug.js',
-    'vmservice/client/deployed/web/packages/html_import/tools/loader/loader.js',
-    'vmservice/client/deployed/web/packages/html_import/src/HTMLImports.js',
-    'vmservice/client/deployed/web/packages/html_import/src/boot.js',
-    'vmservice/client/deployed/web/packages/html_import/src/Parser.js',
-    'vmservice/client/deployed/web/packages/custom_element/custom-elements.debug.js',
-    'vmservice/client/deployed/web/packages/custom_element/custom-elements.min.js',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/img/isolate_icon.png',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/observatory_element.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/response_viewer.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/service_ref.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/service_view.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/sliding_checkbox.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html',
+    'vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html',
     'vmservice/client/deployed/web/packages/polymer/boot.js',
-    'vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js',
-    'vmservice/client/deployed/web/img/isolate_icon.png',
-    'vmservice/client/deployed/web/index_devtools.html',
-    'vmservice/client/deployed/web/bootstrap_css/fonts/glyphicons-halflings-regular.ttf',
-    'vmservice/client/deployed/web/bootstrap_css/fonts/glyphicons-halflings-regular.svg',
-    'vmservice/client/deployed/web/bootstrap_css/fonts/glyphicons-halflings-regular.eot',
-    'vmservice/client/deployed/web/bootstrap_css/fonts/glyphicons-halflings-regular.woff',
-    'vmservice/client/deployed/web/bootstrap_css/css/bootstrap.min.css',
-    'vmservice/client/deployed/web/bootstrap_css/README.google',
-    'vmservice/client/deployed/web/bootstrap_css/LICENSE',
-    'vmservice/client/deployed/web/favicon.ico',
-    'vmservice/client/deployed/web/index.html',
+    'vmservice/client/deployed/web/packages/shadow_dom/shadow_dom.debug.js',
+    'vmservice/client/deployed/web/packages/shadow_dom/shadow_dom.min.js',
+    'vmservice/client/deployed/web/packages/shadow_dom/src/platform/patches-shadowdom-polyfill-before.js',
+    'vmservice/client/deployed/web/packages/shadow_dom/src/platform/patches-shadowdom-polyfill.js',
+    'vmservice/client/deployed/web/packages/shadow_dom/src/platform/platform-init.js',
   ],
 }
 
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index 1d10d75..f4b6629 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -289,7 +289,7 @@
         font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
-    <div>
+    <span>
       <template if="{{ isUnexpected(ref.serviceType) }}">
         unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
@@ -299,24 +299,30 @@
       </template>
 
       <template if="{{ isNull(ref.serviceType) }}">
-        <div title="{{ hoverText }}">{{ ref['preview'] }}</div>
+        <div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
       </template>
 
       <template if="{{ (isString(ref.serviceType) ||
                         isBool(ref.serviceType) ||
                         isInt(ref.serviceType)) ||
                         isDouble(ref.serviceType)) }}">
-        <a href="{{ url }}">{{ ref['preview'] }}</a>
+        <a href="{{ url }}">{{ ref['valueAsString'] }}</a>
       </template>
 
-      <template if="{{ isClosure(ref.serviceType) }}">
+      <template if="{{ (isType(ref.serviceType)) }}">
+        <a href="{{ url }}">{{ ref['user_name'] }}</a>
+      </template>
+
+      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
+                       ref['closureFunc'] != null}}">
         <a href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
           {{ ref['closureFunc']['user_name'] }}
         </a>
       </template>
 
-      <template if="{{ isInstance(ref.serviceType) }}">
+      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
+                       ref['closureFunc'] == null}}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
@@ -349,8 +355,7 @@
           </div>
         </curly-block>
       </template>
-
-    </div>
+    </span>
   </template>
   
 </polymer-element>
@@ -435,22 +440,27 @@
 
 
 <polymer-element name="field-ref" extends="service-ref">
-<template>
-<div>
-  <template if="{{ ref['final'] }}"> final </template>
-  <template if="{{ ref['const'] }}"> const </template>
-  <template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp; !ref['final'] &amp;&amp; !ref['const']) }}">
-  var
+  <template>
+    <div>
+      <template if="{{ ref['static'] }}">static</template>
+      <template if="{{ ref['final'] }}">final</template>
+      <template if="{{ ref['const'] }}">const</template>
+      <template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp;
+                        !ref['final'] &amp;&amp; !ref['const']) }}">
+        var
+      </template>
+      <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
+        <instance-ref ref="{{ ref['declared_type'] }}"></instance-ref>
+      </template>
+      <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+    </div>
   </template>
-  <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
-  </template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</div>
-</template>  </polymer-element><polymer-element name="function-ref" extends="service-ref">
+  
+</polymer-element>
+<polymer-element name="function-ref" extends="service-ref">
   <template><!-- These comments are here to allow newlines.
      --><template if="{{ qualified &amp;&amp; !hasParent &amp;&amp; hasClass }}"><!--
-       --><class-ref ref="{{ ref['class'] }}"></class-ref>.</template><!--
+       --><class-ref ref="{{ ref['owner'] }}"></class-ref>.</template><!--
      --><template if="{{ qualified &amp;&amp; hasParent }}"><!--
        --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
           </function-ref>.<!--
@@ -521,7 +531,7 @@
         <div class="memberItem">
           <div class="memberName">script</div>
           <div class="memberValue">
-            <script-ref ref="{{ cls['script'] }}" line="{{ cls['line'] }}">
+            <script-ref ref="{{ cls['script'] }}" pos="{{ cls['tokenPos'] }}">
             </script-ref>
           </div>
         </div>
@@ -624,9 +634,14 @@
   
 </polymer-element>
 <polymer-element name="code-ref" extends="service-ref">
-<template>
-  <a href="{{ url }}">{{ name }}</a>
-</template>
+  <template>
+    <template if="{{ code.isDartCode }}">
+      <a href="{{ url }}">{{ name }}</a>
+    </template>
+    <template if="{{ !code.isDartCode }}">
+      <span>{{ name }}</span>
+    </template>
+  </template>
 
 </polymer-element><polymer-element name="code-view" extends="observatory-element">
   <template>
@@ -746,8 +761,56 @@
   </template>
   
 </polymer-element>
+<polymer-element name="eval-link">
+  <template>
+    <style>
+      .idle {
+        color: #0489c3;
+        cursor: pointer;
+      }
+      .busy {
+        color: #aaa;
+        cursor: wait;
+      }
+    </style>
+
+    <template if="{{ busy }}">
+      <span class="busy">[evaluate]</span>
+    </template>
+    <template if="{{ !busy }}">
+      <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
+    </template>
+    <template if="{{ result != null }}">
+      = <instance-ref ref="{{ result }}"></instance-ref>
+    </template>
+
+  </template>
+  
+</polymer-element>
 <polymer-element name="field-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
@@ -762,103 +825,245 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-          <template if="{{ field['static'] }}">static</template>
-          <template if="{{ field['final'] }}">final</template>
-          <template if="{{ field['const'] }}">const</template>
-          {{ field['user_name'] }} ({{ field['name'] }})
-          <class-ref ref="{{ field['owner'] }}"></class-ref>
+    <div class="content">
+      <h1>
+        <template if="{{ field['static'] }}">static</template>
+        <template if="{{ field['final'] }}">final</template>
+        <template if="{{ field['const'] }}">const</template>
+        <template if="{{ (field['declared_type']['name'] == 'dynamic' &amp;&amp;
+                         !field['final'] &amp;&amp; !field['const']) }}">
+          var
+        </template>
+        <template if="{{ (field['declared_type']['user_name'] != 'dynamic') }}">
+          {{ field['declared_type']['user_name'] }}
+        </template>
+        {{ field['user_name'] }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">owner</div>
+          <div class="memberValue">
+            <template if="{{ field['owner'].serviceType == 'Class' }}">
+              <class-ref ref="{{ field['owner'] }}"></class-ref>
+            </template>
+            <template if="{{ field['owner'].serviceType != 'Class' }}">
+              <library-ref ref="{{ field['owner'] }}"></library-ref>
+            </template>
+          </div>
         </div>
-        <div class="panel-body">
-        <template if="{{ field['guard_class'] == 'dynamic'}}">
-          <div class="alert alert-danger">
-            Field has been assigned multiple types. If a field is only ever
-            assigned a single type, performance may improve.
+        <div class="memberItem">
+          <div class="memberName">script</div>
+          <div class="memberValue">
+            <script-ref ref="{{ field['script'] }}"></script-ref>
+          </div>
+        </div>
+        <template if="{{ !field['static'] }}">
+          <div class="memberItem" title="The types observed for this field at runtime.  Fields that are observed to have a single type at runtime or to never be null may allow for additional optimization.">
+            <div class="memberName">observed types</div>
+            <div class="memberValue">
+              <template if="{{ field['guard_class'] == 'dynamic' }}">
+                various
+              </template>
+              <template if="{{ field['guard_class'] == 'unknown' }}">
+                none
+              </template>
+              <template if="{{ field['guard_class'] != 'unknown' &amp;&amp;
+                            field['guard_class'] != 'dynamic' }}">
+                <class-ref ref="{{ field['guard_class'] }}"></class-ref>
+                <template if="{{ field['guard_nullable'] }}">
+                  — null observed
+                </template>
+                <template if="{{ !field['guard_nullable'] }}">
+                  — null not observed
+                </template>
+              </template>
+            </div>
           </div>
         </template>
-        <template if="{{ (field['guard_class'] != 'dynamic') &amp;&amp; (field['guard_class'] != 'unknown') }}">
-          <div class="alert alert-success">Field has monomorphic type</div>
-          <template if="{{ (field['guard_class'] != 'dynamic') &amp;&amp;
-                        field['guard_nullable'] }}">
-            <div class="alert alert-info">
-              Field has been assigned null. If a field is never assigned null,
-              performance may improve.
+        <template if="{{ field['value'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">static value</div>
+            <div class="memberValue">
+              <instance-ref ref="{{ field['value'] }}"></instance-ref>
             </div>
-          </template>
-          <blockquote>
-            <class-ref ref="{{ field['guard_class'] }}"></class-ref>
-          </blockquote>
+          </div>
         </template>
-        </div>
       </div>
     </div>
-  </div>
+  </template>
+  
+</polymer-element>
+<polymer-element name="script-inset" extends="observatory-element">
+  <template>
+    <style>
+      .sourceInset {
+        padding-left: 15%;
+        padding-right: 15%;
+      }
+      .grayBox {
+        width: 100%;
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+     }
+    </style>
+    <div class="sourceInset">
+      <content></content>
+      <div class="grayBox">
+        <template if="{{ coverage == true }}">
+          <table>
+            <tbody>
+              <tr template="" repeat="{{ line in lines }}">
+                <td style="{{ hitStyle(line) }}"><span>  </span></td>
+                <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
+                <td>&nbsp;</td>
+                <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
+              </tr>
+            </tbody>
+          </table>
+        </template>
+        <template if="{{ coverage == false }}">
+          <table>
+            <tbody>
+              <tr template="" repeat="{{ line in lines }}">
+                <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
+                <td>&nbsp;</td>
+                <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
+              </tr>
+            </tbody>
+          </table>
+        </template>
+      </div>
+    </div>
   </template>
   
 </polymer-element>
 <polymer-element name="function-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
-      <template if="{{ function['owner']['type'] == '@Class' }}">
+      <template if="{{ function['owner'].serviceType == 'Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
         <class-nav-menu cls="{{ function['owner'] }}"></class-nav-menu>
       </template>
-      <template if="{{ function['owner']['type'] == '@Library' }}">
+      <template if="{{ function['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
       <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-          {{ function['user_name'] }} ({{ function['name'] }})
-          <class-ref ref="{{ function['class'] }}"></class-ref>
-        </div>
-        <div class="panel-body">
-          <div>
-          <code-ref ref="{{ function['code'] }}"></code-ref>
-          <code-ref ref="{{ function['unoptimized_code'] }}"></code-ref>
+    <div class="content">
+      <h1>function {{ qualifiedName }}</h1>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">kind</div>
+          <div class="memberValue">
+            <template if="{{ function['is_static'] }}">static</template>
+            <template if="{{ function['is_const'] }}">const</template>
+            {{ kind }}
           </div>
-          <table class="table table-hover">
-            <tbody>
-              <tr>
-                <td>static</td><td>{{ function['is_static'] }}</td>
-              </tr>
-              <tr>
-                <td>Const</td><td>{{ function['is_const'] }}</td>
-              </tr>
-              <tr>
-                <td>Optimizable</td><td>{{ function['is_optimizable'] }}</td>
-              </tr>
-              <tr>
-                <td>Inlinable</td><td>{{ function['is_inlinable'] }}</td>
-              </tr>
-              <tr>
-                <td>Kind</td><td>{{ function['kind'] }}</td>
-              </tr>
-              <tr>
-                <td>Usage Count</td><td>{{ function['usage_counter'] }}</td>
-              </tr>
-              <tr>
-                <td>Optimized Call Site Count</td><td>{{ function['optimized_call_site_count'] }}</td>
-              </tr>
-              <tr>
-                <td>Deoptimizations</td><td>{{ function['deoptimizations'] }}</td>
-              </tr>
-            </tbody>
-          </table>
         </div>
-      </div>
+        <template if="{{ function['parent'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">parent function</div>
+            <div class="memberValue">
+              <function-ref ref="{{ function['parent'] }}"></function-ref>
+            </div>
+          </div>
+        </template>
+        <div class="memberItem">
+          <div class="memberName">owner</div>
+          <div class="memberValue">
+            <template if="{{ function['owner'].serviceType == 'Class' }}">
+              <class-ref ref="{{ function['owner'] }}"></class-ref>
+            </template>
+            <template if="{{ function['owner'].serviceType != 'Class' }}">
+              <library-ref ref="{{ function['owner'] }}"></library-ref>
+            </template>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">script</div>
+          <div class="memberValue">
+            <script-ref ref="{{ function['script'] }}" pos="{{ function['tokenPos'] }}">
+            </script-ref>
+          </div>
+        </div>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ function['code'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">optimized code</div>
+            <div class="memberValue">
+              <code-ref ref="{{ function['code'] }}"></code-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ function['unoptimized_code'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">unoptimized code</div>
+            <div class="memberValue">
+              <code-ref ref="{{ function['unoptimized_code'] }}"></code-ref>
+            </div>
+              <div class="memberValue">
+                <span title="This count is used to determine when a function will be optimized.  It is a combination of call counts and other factors.">
+                  (usage count: {{ function['usage_counter'] }})
+                </span>
+             </div>
+           </div>
+         </template>
+         <div class="memberItem">
+           <div class="memberName">deoptimizations</div>
+           <div class="memberValue">{{ function['deoptimizations'] }}</div>
+         </div>
+         <div class="memberItem">
+           <div class="memberName">optimizable</div>
+           <div class="memberValue">{{ function['is_optimizable'] }}</div>
+         </div>
+         <div class="memberItem">
+           <div class="memberName">inlinable</div>
+           <div class="memberValue">{{ function['is_inlinable'] }}</div>
+         </div>
+         <template if="{{ function.name != function.vmName }}">
+           <div class="memberItem">
+             <div class="memberName">vm name</div>
+             <div class="memberValue">{{ function.vmName }}</div>
+           </div>
+         </template>
+       </div>
     </div>
-  </div>
+
+    <hr>
+    <script-inset script="{{ function['script'] }}" pos="{{ function['tokenPos'] }}" endpos="{{ function['endTokenPos'] }}">
+    </script-inset>
+
+    <br>
   </template>
   
 </polymer-element>
@@ -894,9 +1099,7 @@
 
       <div class="col-md-1">{{ isolate.mainPort }}</div>
 
-      <!-- TODO(turnidge): Use function-ref when it can take isolate param -->
       <div class="col-md-4">
-
         <div class="row">
           <isolate-ref ref="{{ isolate }}"></isolate-ref>
         </div>
@@ -911,33 +1114,6 @@
       </div>
 
       <div class="col-md-2">
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['total'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">total</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['dart'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">dart</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['compile'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">compile</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['gc'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">gc</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['init'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">init</p></div>
-        </div>
-      </div>
-      <div class="col-md-2">
         <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
@@ -953,20 +1129,19 @@
         ( <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a> )
       </div>
     </div>
-    <div class="row">
-      <div class="col-md-3">
-      </div>
-      <div class="col-md-6">
-        <template if="{{ isolate.topFrame != null }}">
-          <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
-          (<script-ref ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
-          <br>
-          <pre>{{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
-        </template>
-      </div>
-      <div class="col-md-3">
-      </div>
+
+    <div class="content">
+      <template repeat="{{ key in isolate.counters.keys }}">
+        <div class="memberValue">{{ key }} ({{ isolate.counters[key] }})</div>
+      </template>
     </div>
+
+    <template if="{{ isolate.topFrame != null }}">
+      <script-inset script="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}">
+        <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
+        (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+      </script-inset>
+    </template>
   </template>
   
 </polymer-element>
@@ -996,6 +1171,9 @@
         padding-left: 15%;
         padding-right: 15%;
       }
+      .miniProfileChart {
+        width: 80%;
+      }
     </style>
 
     <nav-bar>
@@ -1030,7 +1208,8 @@
               @
               <function-ref ref="{{ isolate.topFrame['function'] }}">
               </function-ref>
-              (<script-ref ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
+              (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}">
+              </script-ref>)
             </template>
 
             <template if="{{ isolate.idle }}">
@@ -1072,11 +1251,11 @@
       <hr>
     </template>
 
+    <br>
+
     <template if="{{ isolate.topFrame != null }}">
-      <br>
-      <div class="sourceInset">
-        <pre>          {{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
-      </div>
+      <script-inset script="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}">
+      </script-inset>
     </template>
 
     <br>
@@ -1162,7 +1341,14 @@
     <hr>
 
     <div class="content">
-      <div id="tagProfileChart" class="col-md-8" style="height: 400px"></div>
+      <div class="memberValue">Isolate execution</div>
+      <template repeat="{{ key in isolate.counters.keys }}">
+        <div class="memberValue">{{ key }} ({{ isolate.counters[key] }})</div>
+      </template>
+    </div>
+
+    <div class="content">
+      <div id="tagProfileChart" class="miniProfileChart" style="height: 600px"></div>
     </div>
 
     <hr>
@@ -1215,7 +1401,12 @@
     <template if="{{ instance['error'] == null }}">
       <div class="content">
         <!-- TODO(turnidge): Handle null instances. -->
-        <h1>instance of {{ instance['class']['user_name'] }}</h1>
+        <template if="{{ isType(instance.serviceType) }}">
+          <h1>type {{ instance['user_name'] }}</h1>
+        </template>
+        <template if="{{ !isType(instance.serviceType) }}">
+          <h1>instance of {{ instance['class']['user_name'] }}</h1>
+        </template>
         <div class="memberList">
           <div class="memberItem">
             <div class="memberName">class</div>
@@ -1224,16 +1415,43 @@
               </class-ref>
             </div>
           </div>
-          <template if="{{ instance['preview'] != null }}">
+          <template if="{{ instance['valueAsString'] != null }}">
             <div class="memberItem">
-              <div class="memberName">preview</div>
-              <div class="memberValue">{{ instance['preview'] }}</div>
+              <div class="memberName">value</div>
+              <div class="memberValue">{{ instance['valueAsString'] }}</div>
             </div>
           </template>
           <div class="memberItem">
             <div class="memberName">size</div>
             <div class="memberValue">{{ instance['size'] | formatSize }}</div>
           </div>
+          <template if="{{ instance['type_class'] != null }}">
+            <div class="memberItem">
+              <div class="memberName">type class</div>
+              <div class="memberValue">
+                <class-ref ref="{{ instance['type_class'] }}">
+                </class-ref>
+              </div>
+            </div>
+          </template>
+          <template if="{{ instance['closureFunc'] != null }}">
+            <div class="memberItem">
+              <div class="memberName">closure function</div>
+              <div class="memberValue">
+                <function-ref ref="{{ instance['closureFunc'] }}">
+                </function-ref>
+              </div>
+            </div>
+          </template>
+
+          <div class="memberItem">&nbsp;</div>
+
+          <div class="memberItem">
+            <div class="memberName">toString()</div>
+            <div class="memberValue">
+              <eval-link callback="{{ eval }}" expr="toString()"></eval-link>
+            </div>
+          </div>
         </div>
       </div>
 
@@ -1303,31 +1521,10 @@
 </polymer-element>
 <polymer-element name="json-view" extends="observatory-element">
   <template>
-    <template bind="" if="{{ valueType == 'Primitive' }}">
-      <span>{{primitiveString}}</span>
-    </template>
-    <template bind="" if="{{ valueType == 'List' }}">
-      <table class="table table-condensed table-bordered">
-        <caption class="text-left">List, {{list.length}}</caption>
-        <tbody>
-          <tr template="" repeat="{{item in list)}}">
-            <th>{{counter}}</th>
-            <td><json-view json="{{item}}"></json-view></td>
-          </tr>
-        </tbody>
-      </table>
-    </template>
-    <template if="{{ valueType == 'Map' }}">
-      <table class="table table-condensed table-bordered">
-        <caption class="text-left">Map, {{keys.length}}</caption>
-        <tbody>
-          <tr template="" repeat="{{key in keys}}">
-            <th>{{key}}</th>
-            <td><json-view json="{{value(key)}}"></json-view></td>
-          </tr>
-        </tbody>
-      </table>
-    </template>
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+    </nav-bar>
+      <pre>{{ mapAsString }}</pre>
   </template>
   
 </polymer-element>
@@ -1629,6 +1826,7 @@
         <tbody>
           <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
             <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
+              <span id="expand" style="cursor: pointer;">{{ row.expander }}</span>
               <code-ref ref="{{ row.code }}"></code-ref>
             </td>
             <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
@@ -1725,22 +1923,9 @@
     </nav-refresh>
   </nav-bar>
 
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel-heading">Script source for: {{ script.name }}</div>
-      <div class="panel-body">
-        <table style="width:100%">
-          <tbody>
-          <tr template="" repeat="{{ line in script.lines }}">
-            <td style="{{ hitsStyle(line) }}">  </td>
-            <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
-            <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
-          </tr>
-          </tbody>
-        </table>
-      </div>
-    </div>
-  </div>
+  <script-inset id="scriptInset" script="{{ script }}" pos="{{ script.firstTokenPos }}" endpos="{{ script.lastTokenPos }}">
+  <h1>script {{ script.name }}</h1>
+  </script-inset>
 </template>
 
 </polymer-element>
@@ -1767,7 +1952,7 @@
       </div>
       <div class="col-md-9">
         <function-ref ref="{{ frame['function'] }}"></function-ref>
-        ( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
+        ( <script-ref ref="{{ frame['script'] }}" pos="{{ frame['tokenPos'] }}">
         </script-ref> )
 
         <curly-block>
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 743b49c..c00fe7b 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
@@ -53,7 +53,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBW:"__$msg",gCO:"_oldPieChart",gDu:"exclusiveTicks",gFm:"machine",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gKx:"__$callGraphChecked",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gN7:"__$library",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQt:"__$uncheckedText",gRd:"line",gSB:"__$active",gSF:"root",gSw:"lines",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",geb:"__$json",gfF:"inclusiveTicks",gfn:"__$text",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",glb:"__$cls",glc:"__$error",glh:"__$qualified",gmC:"__$object",gnx:"__$callback",goH:"columns",goY:"__$isolate",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",gtT:"code",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked",gzw:"__$line"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",fM:"_pageSeparationColor",he:"hitStyleNone",iJN:"hitStyleExecuted",nK:"_freeColor",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function (reflectionData) {
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gKx:"__$callGraphChecked",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gN7:"__$library",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gX7:"__$mapAsString",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",ga:"a",ga3:"__$text",ga4:"text",gb:"b",gbV:"_combinedDataTable",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gkg:"_combinedChart",glb:"__$cls",glc:"__$error",glh:"__$qualified",gmC:"__$object",gnx:"__$callback",goH:"columns",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",gt7:"__$pos",gtT:"code",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",Vn:"hitStyleNotExecuted",aW:"hitStyleExecuted",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function (reflectionData) {
   "use strict";
   function map(x){x={x:x};delete x.x;return x}
     function processStatics(descriptor) {
@@ -149,7 +149,9 @@
     var optionalParametersAreNamed = (optionalParameterInfo & 1) === 1;
     var isIntercepted = requiredParameterCount + optionalParameterCount != funcs[0].length;
     var functionTypeIndex = array[2];
-    var isReflectable = array.length > 3 * optionalParameterCount + 2 * requiredParameterCount + 3
+    var unmangledNameIndex =  3 * optionalParameterCount + 2 * requiredParameterCount + 3;
+    var isReflectable = array.length > unmangledNameIndex;
+
     if (getterStubName) {
       f = tearOff(funcs, array, isStatic, name, isIntercepted);
       if (isStatic) init.globalFunctions[name] = f;
@@ -166,7 +168,6 @@
       }
     }
     if (isReflectable) {
-      var unmangledNameIndex = 3 * optionalParameterCount + 2 * requiredParameterCount + 3;
       var unmangledName = array[unmangledNameIndex];
       var reflectionName = unmangledName + ":" + requiredParameterCount + ":" + optionalParameterCount;
       if (isGetter) {
@@ -252,7 +253,7 @@
 })
 ([["_foreign_helper","dart:_foreign_helper",,H,{
 "^":"",
-Lt:{
+HT:{
 "^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
 "^":"",
 x:[function(a){return void 0},"call$1","DK",2,0,null,6,[]],
@@ -266,8 +267,9 @@
 x=Object.getPrototypeOf(a)
 if(y===x)return z.i
 if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
-if(w==null)return C.vB
-return w},"call$1","mz",2,0,null,6,[]],
+if(w==null){y=Object.getPrototypeOf(a)
+if(y==null||y===Object.prototype)return C.ZQ
+else return C.vB}return w},"call$1","mz",2,0,null,6,[]],
 e1:[function(a){var z,y,x,w
 z=$.Au
 if(z==null)return
@@ -290,78 +292,79 @@
 return y[x][b]},"call$2","BJ",4,0,null,11,[],12,[]],
 Gv:{
 "^":"a;",
-n:[function(a,b){return a===b},"call$1","gUJ",2,0,null,109,[]],
+n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
-bu:[function(a){return H.a5(a)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,336,[]],
+bu:function(a){return H.a5(a)},
+T:function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},
 gbx:function(a){return new H.cu(H.dJ(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 kn:{
 "^":"bool/Gv;",
-bu:[function(a){return String(a)},"call$0","gXo",0,0,null],
+bu:function(a){return String(a)},
 giO:function(a){return a?519018:218159},
 gbx:function(a){return C.HL},
 $isbool:true},
 Jh:{
 "^":"Null/Gv;",
-n:[function(a,b){return null==b},"call$1","gUJ",2,0,null,109,[]],
-bu:[function(a){return"null"},"call$0","gXo",0,0,null],
+n:function(a,b){return null==b},
+bu:function(a){return"null"},
 giO:function(a){return 0},
 gbx:function(a){return C.Qf}},
-QI:{
+Ue1:{
 "^":"Gv;",
 giO:function(a){return 0},
 gbx:function(a){return C.CS}},
 FP:{
-"^":"QI;"},
+"^":"Ue1;"},
 is:{
-"^":"QI;"},
+"^":"Ue1;"},
 Q:{
 "^":"List/Gv;",
-h:[function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
-a.push(b)},"call$1","ght",2,0,null,30,[]],
-KI:[function(a,b){if(b<0||b>=a.length)throw H.b(new P.bJ("value "+b))
+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(new P.bJ("value "+b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
-return a.splice(b,1)[0]},"call$1","gNM",2,0,null,15,[]],
-xe:[function(a,b,c){if(b<0||b>a.length)throw H.b(new P.bJ("value "+b))
+return a.splice(b,1)[0]},
+xe:function(a,b,c){if(b<0||b>a.length)throw H.b(new P.bJ("value "+b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
-a.splice(b,0,c)},"call$2","gJe",4,0,null,15,[],30,[]],
-oF:[function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
-H.IC(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
-Rz:[function(a,b){var z
+a.splice(b,0,c)},
+oF:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
+H.IC(a,b,c)},
+Rz:function(a,b){var z
 if(!!a.fixed$length)H.vh(P.f("remove"))
 for(z=0;z<a.length;++z)if(J.de(a[z],b)){a.splice(z,1)
-return!0}return!1},"call$1","guH",2,0,null,132,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,117,[]],
-FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,281,[]],
-V1:[function(a){this.sB(a,0)},"call$0","gRa",0,0,null],
-aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,117,[]],
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
-zV:[function(a,b){var z,y,x,w
+return!0}return!1},
+ev:function(a,b){return H.VM(new H.U5(a,b),[null])},
+FV:function(a,b){var z
+for(z=J.GP(b);z.G();)this.h(a,z.gl())},
+V1:function(a){this.sB(a,0)},
+aN:function(a,b){return H.bQ(a,b)},
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},119,[]],
+zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
 y.fixed$length=init
 for(x=0;x<a.length;++x){w=H.d(a[x])
 if(x>=z)return H.e(y,x)
-y[x]=w}return y.join(b)},"call$1","gNU",0,2,null,337,338,[]],
-eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,198,[]],
-Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","gRV",2,0,null,15,[]],
-D6:[function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
+y[x]=w}return y.join(b)},
+eR:function(a,b){return H.q9(a,b,null,null)},
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
+D6:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c==null)c=a.length
 else{if(typeof c!=="number"||Math.floor(c)!==c)throw H.b(new P.AT(c))
 if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))}if(b===c)return H.VM([],[H.Kp(a,0)])
-return H.VM(a.slice(b,c),[H.Kp(a,0)])},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
-Mu:[function(a,b,c){H.K0(a,b,c)
-return H.q9(a,b,c,null)},"call$2","gYf",4,0,null,123,[],124,[]],
+return H.VM(a.slice(b,c),[H.Kp(a,0)])},
+Jk:function(a,b){return this.D6(a,b,null)},
+Mu:function(a,b,c){H.K0(a,b,c)
+return H.q9(a,b,c,null)},
 gtH:function(a){if(a.length>0)return a[0]
 throw H.b(new P.lj("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
-UZ:[function(a,b,c){var z,y
+UZ:function(a,b,c){var z,y
 if(!!a.fixed$length)H.vh(P.f("removeRange"))
 z=a.length
 y=J.Wx(b)
@@ -371,25 +374,29 @@
 if(typeof c!=="number")return H.s(c)
 H.tb(a,c,a,b,z-c)
 if(typeof b!=="number")return H.s(b)
-this.sB(a,z-(c-b))},"call$2","gYH",4,0,null,123,[],124,[]],
-YW:[function(a,b,c,d,e){if(!!a.immutable$list)H.vh(P.f("set range"))
-H.qG(a,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-Vr:[function(a,b){return H.Ck(a,b)},"call$1","gGI",2,0,null,117,[]],
-GT:[function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
-H.rd(a,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,339,132,[],123,[]],
-Pk:[function(a,b,c){return H.lO(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
-tg:[function(a,b){var z
+this.sB(a,z-(c-b))},
+YW:function(a,b,c,d,e){if(!!a.immutable$list)H.vh(P.f("set range"))
+H.qG(a,b,c,d,e)},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+Vr:function(a,b){return H.Ck(a,b)},
+GT:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
+H.rd(a,b)},
+XU:function(a,b,c){return H.TK(a,b,c,a.length)},
+u8:function(a,b){return this.XU(a,b,0)},
+Pk:function(a,b,c){return H.lO(a,b,a.length-1)},
+cn:function(a,b){return this.Pk(a,b,null)},
+tg:function(a,b){var z
 for(z=0;z<a.length;++z)if(J.de(a[z],b))return!0
-return!1},"call$1","gdj",2,0,null,109,[]],
+return!1},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
-bu:[function(a){return H.mx(a,"[","]")},"call$0","gXo",0,0,null],
-tt:[function(a,b){var z
+bu:function(a){return H.mx(a,"[","]")},
+tt:function(a,b){var z
 if(b)return H.VM(a.slice(),[H.Kp(a,0)])
 else{z=H.VM(a.slice(),[H.Kp(a,0)])
 z.fixed$length=init
-return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,340,341,[]],
+return z}},
+br:function(a){return this.tt(a,!0)},
 gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
 giO:function(a){return H.eQ(a)},
 gB:function(a){return a.length},
@@ -397,13 +404,13 @@
 if(b<0)throw H.b(new P.bJ("value "+H.d(b)))
 if(!!a.fixed$length)H.vh(P.f("set length"))
 a.length=b},
-t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
+t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
+return a[b]},
+u:function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
+a[b]=c},
 $isList:true,
 $isList:true,
 $askF:null,
@@ -425,7 +432,7 @@
 $isJt:true},
 P:{
 "^":"num/Gv;",
-iM:[function(a,b){var z
+iM:function(a,b){var z
 if(typeof b!=="number")throw H.b(new P.AT(b))
 if(a<b)return-1
 else if(a>b)return 1
@@ -433,72 +440,72 @@
 if(this.gzP(a)===z)return 0
 if(this.gzP(a))return-1
 return 1}return 0}else if(isNaN(a)){if(this.gG0(b))return 0
-return 1}else return-1},"call$1","gYc",2,0,null,187,[]],
+return 1}else return-1},
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
 gx8:function(a){return isFinite(a)},
-JV:[function(a,b){return a%b},"call$1","gDH",2,0,null,187,[]],
-yu:[function(a){var z
+JV:function(a,b){return a%b},
+yu:function(a){var z
 if(a>=-2147483648&&a<=2147483647)return a|0
 if(isFinite(a)){z=a<0?Math.ceil(a):Math.floor(a)
-return z+0}throw H.b(P.f(''+a))},"call$0","gDi",0,0,null],
-HG:[function(a){return this.yu(this.UD(a))},"call$0","gA0",0,0,null],
-UD:[function(a){if(a<0)return-Math.round(-a)
-else return Math.round(a)},"call$0","gW0",0,0,null],
-yM:[function(a,b){var z
+return z+0}throw H.b(P.f(''+a))},
+HG:function(a){return this.yu(this.UD(a))},
+UD:function(a){if(a<0)return-Math.round(-a)
+else return Math.round(a)},
+yM:function(a,b){var z
 if(b>20)throw H.b(P.C3(b))
 z=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+z
-return z},"call$1","gfE",2,0,null,342,[]],
-WZ:[function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
-return a.toString(b)},"call$1","gEI",2,0,null,34,[]],
-bu:[function(a){if(a===0&&1/a<0)return"-0.0"
-else return""+a},"call$0","gXo",0,0,null],
+return z},
+WZ:function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
+return a.toString(b)},
+bu:function(a){if(a===0&&1/a<0)return"-0.0"
+else return""+a},
 giO:function(a){return a&0x1FFFFFFF},
-J:[function(a){return-a},"call$0","gVd",0,0,null],
-g:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a+b},"call$1","gF1n",2,0,null,109,[]],
-W:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a-b},"call$1","gTG",2,0,null,109,[]],
-V:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a/b},"call$1","gJj",2,0,null,109,[]],
-U:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a*b},"call$1","gEH",2,0,null,109,[]],
-Y:[function(a,b){var z
+J:function(a){return-a},
+g:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+return a+b},
+W:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+return a-b},
+V:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
+return a/b},
+U:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
+return a*b},
+Y:function(a,b){var z
 if(typeof b!=="number")throw H.b(new P.AT(b))
 z=a%b
 if(z===0)return 0
 if(z>0)return z
 if(b<0)return z-b
-else return z+b},"call$1","gQR",2,0,null,109,[]],
-Z:[function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
+else return z+b},
+Z:function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
 else{if(typeof b!=="number")H.vh(new P.AT(b))
-return this.yu(a/b)}},"call$1","guP",2,0,null,109,[]],
-cU:[function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},"call$1","gPf",2,0,null,109,[]],
-O:[function(a,b){if(b<0)throw H.b(new P.AT(b))
-return b>31?0:a<<b>>>0},"call$1","gq8",2,0,null,109,[]],
-W4:[function(a,b){return b>31?0:a<<b>>>0},"call$1","gGu",2,0,null,109,[]],
-m:[function(a,b){var z
+return this.yu(a/b)}},
+cU:function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},
+O:function(a,b){if(b<0)throw H.b(new P.AT(b))
+return b>31?0:a<<b>>>0},
+W4:function(a,b){return b>31?0:a<<b>>>0},
+m:function(a,b){var z
 if(b<0)throw H.b(new P.AT(b))
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
-z=a>>z>>>0}return z},"call$1","gyp",2,0,null,109,[]],
-GG:[function(a,b){var z
+z=a>>z>>>0}return z},
+GG:function(a,b){var z
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
-z=a>>z>>>0}return z},"call$1","gMe",2,0,null,109,[]],
-i:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return(a&b)>>>0},"call$1","gAU",2,0,null,109,[]],
-w:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return(a^b)>>>0},"call$1","gttE",2,0,null,109,[]],
-C:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a<b},"call$1","gix",2,0,null,109,[]],
-D:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a>b},"call$1","gh1",2,0,null,109,[]],
-E:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a<=b},"call$1","gER",2,0,null,109,[]],
-F:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a>=b},"call$1","gNH",2,0,null,109,[]],
+z=a>>z>>>0}return z},
+i:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
+return(a&b)>>>0},
+w:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+return(a^b)>>>0},
+C:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+return a<b},
+D:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+return a>b},
+E:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
+return a<=b},
+F:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
+return a>=b},
 $isnum:true,
 static:{"^":"SAz,N6l"}},
 im:{
@@ -520,12 +527,12 @@
 "^":"VP;"},
 O:{
 "^":"String/Gv;",
-j:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
+j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
-return a.charCodeAt(b)},"call$1","gSu",2,0,null,15,[]],
-dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,343,[]],
-wL:[function(a,b,c){var z,y,x,w
+return a.charCodeAt(b)},
+dd:function(a,b){return H.ZT(a,b)},
+wL:function(a,b,c){var z,y,x,w
 if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
 z=a.length
 y=b.length
@@ -535,22 +542,23 @@
 if(w>=y)H.vh(P.N(w))
 w=b.charCodeAt(w)
 if(x>=z)H.vh(P.N(x))
-if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,339,14,[],123,[]],
-g:[function(a,b){if(typeof b!=="string")throw H.b(P.u(b))
-return a+b},"call$1","gF1n",2,0,null,109,[]],
-Tc:[function(a,b){var z,y
+if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},
+g:function(a,b){if(typeof b!=="string")throw H.b(P.u(b))
+return a+b},
+Tc:function(a,b){var z,y
 z=b.length
 y=a.length
 if(z>y)return!1
-return b===this.yn(a,y-z)},"call$1","gvi",2,0,null,109,[]],
-h8:[function(a,b,c){return H.ys(a,b,c)},"call$2","gcB",4,0,null,110,[],111,[]],
-Fr:[function(a,b){return a.split(b)},"call$1","gOG",2,0,null,103,[]],
-Qi:[function(a,b,c){var z
+return b===this.yn(a,y-z)},
+h8:function(a,b,c){return H.ys(a,b,c)},
+Fr:function(a,b){return a.split(b)},
+Qi:function(a,b,c){var z
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 z=c+b.length
 if(z>a.length)return!1
-return b===a.substring(c,z)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,339,103,[],15,[]],
-Nj:[function(a,b,c){var z
+return b===a.substring(c,z)},
+nC:function(a,b){return this.Qi(a,b,0)},
+Nj:function(a,b,c){var z
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
@@ -558,9 +566,10 @@
 if(z.C(b,0))throw H.b(P.N(b))
 if(z.D(b,c))throw H.b(P.N(b))
 if(J.z8(c,a.length))throw H.b(P.N(c))
-return a.substring(b,c)},function(a,b){return this.Nj(a,b,null)},"yn","call$2",null,"gKj",2,2,null,82,85,[],133,[]],
-hc:[function(a){return a.toLowerCase()},"call$0","gCW",0,0,null],
-bS:[function(a){var z,y,x,w,v
+return a.substring(b,c)},
+yn:function(a,b){return this.Nj(a,b,null)},
+hc:function(a){return a.toLowerCase()},
+bS:function(a){var z,y,x,w,v
 z=a.trim()
 y=z.length
 if(y===0)return z
@@ -569,8 +578,8 @@
 w=y-1
 v=this.j(z,w)===133?J.r9(z,w):y
 if(x===0&&v===y)return z
-return z.substring(x,v)},"call$0","gZH",0,0,null],
-U:[function(a,b){var z,y
+return z.substring(x,v)},
+U:function(a,b){var z,y
 if(typeof b!=="number")return H.s(b)
 if(0>=b)return""
 if(b===1||a.length===0)return a
@@ -578,33 +587,36 @@
 for(z=a,y="";!0;){if((b&1)===1)y=z+y
 b=b>>>1
 if(b===0)break
-z+=z}return y},"call$1","gEH",2,0,null,344,[]],
-XU:[function(a,b,c){var z,y,x,w
+z+=z}return y},
+XU:function(a,b,c){var z,y,x,w
 if(b==null)H.vh(new P.AT(null))
 if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
 if(typeof b==="string")return a.indexOf(b,c)
 z=J.x(b)
 if(!!z.$isVR){y=b.yk(a,c)
 return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
-return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,339,103,[],123,[]],
-Pk:[function(a,b,c){var z,y,x
+return-1},
+u8:function(a,b){return this.XU(a,b,0)},
+Pk:function(a,b,c){var z,y,x
 c=a.length
 if(typeof b==="string"){z=b.length
 y=a.length
 if(c+z>y)c=y-z
 return a.lastIndexOf(b,c)}for(z=J.rY(b),x=c;x>=0;--x)if(z.wL(b,a,x)!=null)return x
-return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,103,[],123,[]],
-Is:[function(a,b,c){if(b==null)H.vh(new P.AT(null))
+return-1},
+cn:function(a,b){return this.Pk(a,b,null)},
+Is:function(a,b,c){if(b==null)H.vh(new P.AT(null))
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
-return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,339,109,[],85,[]],
+return H.m2(a,b,c)},
+tg:function(a,b){return this.Is(a,b,0)},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
-iM:[function(a,b){var z
+iM:function(a,b){var z
 if(typeof b!=="string")throw H.b(new P.AT(b))
 if(a===b)z=0
 else z=a<b?-1:1
-return z},"call$1","gYc",2,0,null,109,[]],
-bu:[function(a){return a},"call$0","gXo",0,0,null],
+return z},
+bu:function(a){return a},
 giO:function(a){var z,y,x
 for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
 y=536870911&y+((524287&y)<<10>>>0)
@@ -613,18 +625,18 @@
 return 536870911&y+((16383&y)<<15>>>0)},
 gbx:function(a){return C.Db},
 gB:function(a){return a.length},
-t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
+t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,15,[]],
+return a[b]},
 $isString:true,
 static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
 default:return!1}},"call$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
-for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
+for(z=a.length;b<z;){if(b>=z)H.vh(new P.bJ("value "+b))
 y=a.charCodeAt(b)
 if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"call$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
 for(z=a.length;b>0;b=y){y=b-1
-if(y>=z)H.vh(P.N(y))
+if(y>=z)H.vh(new P.bJ("value "+y))
 x=a.charCodeAt(y)
 if(x!==32&&x!==13&&!J.Ga(x))break}return b},"call$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
 "^":"",
@@ -739,7 +751,7 @@
 y.toString
 self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
 z=new H.XO(w,null)
-throw H.b(P.FM(z))}},"call$1","o3",2,0,null,22,[]],
+throw H.b(P.FM(z))}},"call$1","eR",2,0,null,22,[]],
 Ws:[function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
@@ -757,17 +769,17 @@
 z.il=new H.fP(null)
 return z.h7(a)}else{z=new H.NO(new H.X1())
 z.il=new H.fP(null)
-return z.h7(a)}},"call$1","hX",2,0,null,24,[]],
+return z.h7(a)}},"call$1","YH",2,0,null,24,[]],
 Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
 else return a},"call$1","m6",2,0,null,24,[]],
 VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","lF",2,0,null,28,[]],
 ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,28,[]],
 PK:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){this.b.call$1(this.a.a)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 JO:{
-"^":"Tp:115;a,c",
+"^":"Tp:117;a,c",
 call$0:[function(){this.c.call$2(this.a.a,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 f0:{
@@ -791,10 +803,10 @@
 $.jk().dartPrint = function (object) {}}}},
 aX:{
 "^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,pa",
-v8:[function(a,b){if(!this.Qy.n(0,a))return
+v8:function(a,b){if(!this.Qy.n(0,a))return
 if(this.lJ.h(0,b)&&!this.RW)this.RW=!0
-this.PC()},"call$2","gfU",4,0,null,345,[],346,[]],
-NR:[function(a){var z,y,x,w,v,u
+this.PC()},
+NR:function(a){var z,y,x,w,v,u
 if(!this.RW)return
 z=this.lJ
 z.Rz(0,a)
@@ -809,26 +821,26 @@
 if(w<0||w>=u)return H.e(v,w)
 v[w]=x
 if(w===y.eZ)y.VW()
-y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gXF",2,0,null,346,[]],
-iK:[function(a){var z=this.Jp
+y.qT=y.qT+1}this.RW=!1}this.PC()},
+iK:function(a){var z=this.Jp
 if(z==null){z=[]
 this.Jp=z}if(J.kE(z,a))return
-this.Jp.push(a)},"call$1","gYd",2,0,null,347,[]],
-Hh:[function(a){var z=this.Jp
+this.Jp.push(a)},
+Hh:function(a){var z=this.Jp
 if(z==null)return
-J.V1(z,a)},"call$1","gr9",2,0,null,347,[]],
-MZ:[function(a,b){if(!this.PX.n(0,a))return
-this.pa=b},"call$2","gvm",4,0,null,345,[],348,[]],
-Wq:[function(a,b){if(J.de(b,2))init.globalState.Xz.Rk.NZ(0,new H.IY(this,new H.oU(a),"ping"))
-else J.Sq(a,null)},"call$2","gWL",4,0,null,347,[],349,[]],
-vV:[function(a,b){var z,y
+J.V1(z,a)},
+MZ:function(a,b){if(!this.PX.n(0,a))return
+this.pa=b},
+Wq:function(a,b){if(J.de(b,2))init.globalState.Xz.Rk.NZ(0,new H.IY(this,new H.oU(a),"ping"))
+else J.Sq(a,null)},
+vV:function(a,b){var z,y
 z=init.globalState.N0
 init.globalState.N0=this
 $=this.En
 y=null
 try{y=b.call$0()}finally{init.globalState.N0=z
-if(z!=null)$=z.gEn()}return y},"call$1","gZm",2,0,null,143,[]],
-Ds:[function(a){var z=J.U6(a)
+if(z!=null)$=z.gEn()}return y},
+Ds:function(a){var z=J.U6(a)
 switch(z.t(a,0)){case"pause":this.v8(z.t(a,1),z.t(a,2))
 break
 case"resume":this.NR(z.t(a,1))
@@ -841,24 +853,24 @@
 break
 case"ping":this.Wq(z.t(a,1),z.t(a,2))
 break
-default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gEd",2,0,null,24,[]],
-Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,350,[]],
-aU:[function(a,b){var z=this.Gx
+default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},
+Zt:function(a){return this.Gx.t(0,a)},
+aU:function(a,b){var z=this.Gx
 if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
-z.u(0,a,b)},"call$2","gPn",4,0,null,350,[],351,[]],
-PC:[function(){if(this.Gx.X5-this.fW.X5>0||this.RW)init.globalState.i2.u(0,this.jO,this)
-else this.UM()},"call$0","gi8",0,0,null],
-UM:[function(){init.globalState.i2.Rz(0,this.jO)
+z.u(0,a,b)},
+PC:function(){if(this.Gx.X5-this.fW.X5>0||this.RW)init.globalState.i2.u(0,this.jO,this)
+else this.UM()},
+UM:function(){init.globalState.i2.Rz(0,this.jO)
 var z=this.Jp
-if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)},"call$0","gAh",0,0,null],
+if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)},
 $isaX:true},
 oU:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){J.Sq(this.a,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
 "^":"a;Rk,GL",
-Jc:[function(){var z,y,x,w,v
+Jc:function(){var z,y,x,w,v
 z=this.Rk
 y=z.av
 if(y===z.eZ)return
@@ -869,8 +881,8 @@
 v=x[y]
 x[y]=null
 z.av=(y+1&w-1)>>>0
-return v},"call$0","gRe",0,0,null],
-xB:[function(){var z,y,x
+return v},
+xB:function(){var z,y,x
 z=this.Jc()
 if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.x4(init.globalState.Nr.jO)&&init.globalState.vu===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
 y=init.globalState
@@ -878,10 +890,10 @@
 x=H.Gy(H.B7(["command","close"],P.L5(null,null,null,null,null)))
 y.toString
 self.postMessage(x)}return!1}z.VU()
-return!0},"call$0","gad",0,0,null],
-oV:[function(){if($.C5()!=null)new H.RA(this).call$0()
-else for(;this.xB(););},"call$0","gVY",0,0,null],
-bL:[function(){var z,y,x,w,v
+return!0},
+oV:function(){if($.C5()!=null)new H.RA(this).call$0()
+else for(;this.xB(););},
+bL:function(){var z,y,x,w,v
 if(init.globalState.EF!==!0)this.oV()
 else try{this.oV()}catch(x){w=H.Ru(x)
 z=w
@@ -889,25 +901,25 @@
 w=init.globalState.vd
 v=H.Gy(H.B7(["command","error","msg",H.d(z)+"\n"+H.d(y)],P.L5(null,null,null,null,null)))
 w.toString
-self.postMessage(v)}},"call$0","gcP",0,0,null]},
+self.postMessage(v)}}},
 RA:{
-"^":"Tp:114;a",
+"^":"Tp:116;a",
 call$0:[function(){if(!this.a.xB())return
 P.rT(C.ny,this)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;F1*,i3,G1*",
-VU:[function(){if(this.F1.gRW()){this.F1.gC9().push(this)
-return}J.yn(this.F1,this.i3)},"call$0","gjF",0,0,null],
+VU:function(){if(this.F1.gRW()){this.F1.gC9().push(this)
+return}J.yn(this.F1,this.i3)},
 $isIY:true},
 JH:{
 "^":"a;"},
 jl:{
-"^":"Tp:115;a,b,c,d,e,f",
+"^":"Tp:117;a,b,c,d,e,f",
 call$0:[function(){H.Ws(this.a,this.b,this.c,this.d,this.e,this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Vg:{
-"^":"Tp:114;a,b,c,d",
+"^":"Tp:116;a,b,c,d",
 call$0:[function(){var z,y,x
 if(this.d!==!0)this.a.call$1(this.c)
 else{z=this.a
@@ -924,7 +936,7 @@
 $ishq:true},
 Z6:{
 "^":"Iy4;JE,Jz",
-zY:[function(a,b){var z,y,x,w,v
+zY:function(a,b){var z,y,x,w,v
 z={}
 y=this.Jz
 x=init.globalState.i2.t(0,y)
@@ -937,15 +949,15 @@
 if(x.gEE()===w){x.Ds(z.a)
 return}y=init.globalState.Xz
 w="receive "+H.d(b)
-y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gMT",2,0,null,24,[]],
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
+y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isZ6&&J.de(this.JE,b.JE)},
 giO:function(a){return J.td(this.JE)},
 $isZ6:true,
 $isbC:true,
 $ishq:true},
 Ua:{
-"^":"Tp:115;a,b,c",
+"^":"Tp:117;a,b,c",
 call$0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
@@ -953,13 +965,13 @@
 $isEH:true},
 ns:{
 "^":"Iy4;hQ,bv,Jz",
-zY:[function(a,b){var z,y
+zY:function(a,b){var z,y
 z=H.Gy(H.B7(["command","message","port",this,"msg",b],P.L5(null,null,null,null,null)))
 if(init.globalState.EF===!0){init.globalState.vd.toString
 self.postMessage(z)}else{y=init.globalState.XC.t(0,this.hQ)
-if(y!=null)y.postMessage(z)}},"call$1","gMT",2,0,null,24,[]],
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,109,[]],
+if(y!=null)y.postMessage(z)}},
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},
 giO:function(a){var z,y,x
 z=J.Eh(this.hQ,16)
 y=J.Eh(this.Jz,8)
@@ -972,7 +984,7 @@
 yo:{
 "^":"a;ng>,bd,P0<",
 wy:function(a){return this.bd.call$1(a)},
-cO:[function(a){var z,y
+cO:function(a){var z,y
 if(this.P0)return
 this.P0=!0
 this.bd=null
@@ -980,28 +992,28 @@
 y=this.ng
 z.Gx.Rz(0,y)
 z.fW.Rz(0,y)
-z.PC()},"call$0","gJK",0,0,null],
-FL:[function(a,b){if(this.P0)return
-this.wy(b)},"call$1","gT5",2,0,null,352,[]],
+z.PC()},
+FL:function(a,b){if(this.P0)return
+this.wy(b)},
 $isyo:true,
 static:{"^":"Vz"}},
 NA:{
 "^":"Tf;CN,il",
-DE:[function(a){if(!!a.$isZ6)return["sendport",init.globalState.oL,a.Jz,J.td(a.JE)]
+DE:function(a){if(!!a.$isZ6)return["sendport",init.globalState.oL,a.Jz,J.td(a.JE)]
 if(!!a.$isns)return["sendport",a.hQ,a.Jz,a.bv]
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
-yf:[function(a){if(!!a.$isku)return["capability",a.ng]
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
+throw H.b("Illegal underlying port "+H.d(a))},
+yf:function(a){if(!!a.$isku)return["capability",a.ng]
+throw H.b("Capability not serializable: "+H.d(a))}},
 NO:{
 "^":"Nt;il",
-DE:[function(a){if(!!a.$isZ6)return new H.Z6(a.JE,a.Jz)
+DE:function(a){if(!!a.$isZ6)return new H.Z6(a.JE,a.Jz)
 if(!!a.$isns)return new H.ns(a.hQ,a.bv,a.Jz)
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
-yf:[function(a){if(!!a.$isku)return new H.ku(a.ng)
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
+throw H.b("Illegal underlying port "+H.d(a))},
+yf:function(a){if(!!a.$isku)return new H.ku(a.ng)
+throw H.b("Capability not serializable: "+H.d(a))}},
 II:{
-"^":"fPc;RZ",
-Vf:[function(a){var z,y,x,w,v,u
+"^":"Xb;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)
@@ -1010,44 +1022,44 @@
 if(v==null)return
 u=v.Zt(w)
 if(u==null)return
-return new H.Z6(u,x)}else return new H.ns(y,w,x)},"call$1","gTm",2,0,null,73,[]],
-Op:[function(a){return new H.ku(J.UQ(a,1))},"call$1","gen",2,0,null,73,[]]},
+return new H.Z6(u,x)}else return new H.ns(y,w,x)},
+Op:function(a){return new H.ku(J.UQ(a,1))}},
 fP:{
 "^":"a;MD",
-t:[function(a,b){return b.__MessageTraverser__attached_info__},"call$1","gIA",2,0,null,6,[]],
-u:[function(a,b,c){this.MD.push(b)
-b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],353,[]],
-Hn:[function(a){this.MD=[]},"call$0","gb6",0,0,null],
-Xq:[function(){var z,y,x
+t:function(a,b){return b.__MessageTraverser__attached_info__},
+u:function(a,b,c){this.MD.push(b)
+b.__MessageTraverser__attached_info__=c},
+Hn:function(a){this.MD=[]},
+Xq:function(){var z,y,x
 for(z=this.MD.length,y=0;y<z;++y){x=this.MD
 if(y>=x.length)return H.e(x,y)
-x[y].__MessageTraverser__attached_info__=null}this.MD=null},"call$0","gt6",0,0,null]},
+x[y].__MessageTraverser__attached_info__=null}this.MD=null}},
 X1:{
 "^":"a;",
-t:[function(a,b){return},"call$1","gIA",2,0,null,6,[]],
-u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],353,[]],
-Hn:[function(a){},"call$0","gb6",0,0,null],
-Xq:[function(){},"call$0","gt6",0,0,null]},
+t:function(a,b){return},
+u:function(a,b,c){},
+Hn:function(a){},
+Xq:function(){}},
 BB:{
 "^":"a;",
-h7:[function(a){var z
+h7:function(a){var z
 if(H.VO(a))return this.Pq(a)
 this.il.Hn(0)
 z=null
-try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,28,[]],
-I8:[function(a){var z
+try{z=this.I8(a)}finally{this.il.Xq()}return z},
+I8:function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
 if(!!z.$isList)return this.wb(a)
 if(!!z.$isZ0)return this.TI(a)
 if(!!z.$isbC)return this.DE(a)
 if(!!z.$ishq)return this.yf(a)
-return this.YZ(a)},"call$1","gRQ",2,0,null,28,[]],
-YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,28,[]]},
+return this.YZ(a)},
+YZ:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
 Nt:{
 "^":"BB;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
-wb:[function(a){var z,y,x,w,v,u
+Pq:function(a){return a},
+wb:function(a){var z,y,x,w,v,u
 z=this.il.t(0,a)
 if(z!=null)return z
 y=J.U6(a)
@@ -1058,8 +1070,8 @@
 this.il.u(0,a,z)
 for(w=z.length,v=0;v<x;++v){u=this.I8(y.t(a,v))
 if(v>=w)return H.e(z,v)
-z[v]=u}return z},"call$1","gqb",2,0,null,73,[]],
-TI:[function(a){var z,y
+z[v]=u}return z},
+TI:function(a){var z,y
 z={}
 y=this.il.t(0,a)
 z.a=y
@@ -1068,32 +1080,32 @@
 z.a=y
 this.il.u(0,a,y)
 a.aN(0,new H.OW(z,this))
-return z.a},"call$1","gnM",2,0,null,151,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
+return z.a},
+DE:function(a){return H.vh(P.SY(null))},
+yf:function(a){return H.vh(P.SY(null))}},
 OW:{
-"^":"Tp:355;a,b",
+"^":"Tp:293;a,b",
 call$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,48,[],354,[],"call"],
+J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,48,[],292,[],"call"],
 $isEH:true},
 Tf:{
 "^":"BB;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
-wb:[function(a){var z,y
+Pq:function(a){return a},
+wb:function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
 y=this.CN
 this.CN=y+1
 this.il.u(0,a,y)
-return["list",y,this.mE(a)]},"call$1","gqb",2,0,null,73,[]],
-TI:[function(a){var z,y
+return["list",y,this.mE(a)]},
+TI:function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
 y=this.CN
 this.CN=y+1
 this.il.u(0,a,y)
-return["map",y,this.mE(J.qA(a.gvc(a))),this.mE(J.qA(a.gUQ(a)))]},"call$1","gnM",2,0,null,151,[]],
-mE:[function(a){var z,y,x,w,v
+return["map",y,this.mE(J.qA(a.gvc())),this.mE(J.qA(a.gUQ(a)))]},
+mE:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
 x=[]
@@ -1102,15 +1114,15 @@
 w=0
 for(;w<y;++w){v=this.I8(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
-x[w]=v}return x},"call$1","gEa",2,0,null,73,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
-fPc:{
+x[w]=v}return x},
+DE:function(a){return H.vh(P.SY(null))},
+yf:function(a){return H.vh(P.SY(null))}},
+Xb:{
 "^":"a;",
-QS:[function(a){if(H.ZR(a))return a
+QS:function(a){if(H.ZR(a))return a
 this.RZ=P.Py(null,null,null,null,null)
-return this.XE(a)},"call$1","gia",2,0,null,28,[]],
-XE:[function(a){var z,y
+return this.XE(a)},
+XE:function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 z=J.U6(a)
 switch(z.t(a,0)){case"ref":y=z.t(a,1)
@@ -1119,8 +1131,8 @@
 case"map":return this.tv(a)
 case"sendport":return this.Vf(a)
 case"capability":return this.Op(a)
-default:return this.PR(a)}},"call$1","gn0",2,0,null,28,[]],
-Dj:[function(a){var z,y,x,w,v
+default:return this.PR(a)}},
+Dj:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.t(a,1)
 x=z.t(a,2)
@@ -1130,8 +1142,8 @@
 if(typeof w!=="number")return H.s(w)
 v=0
 for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
-return x},"call$1","gMS",2,0,null,28,[]],
-tv:[function(a){var z,y,x,w,v,u,t,s
+return x},
+tv:function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
 y=J.U6(a)
 x=y.t(a,1)
@@ -1144,16 +1156,16 @@
 t=J.U6(v)
 s=0
 for(;s<u;++s)z.u(0,this.XE(y.t(w,s)),this.XE(t.t(v,s)))
-return z},"call$1","gwq",2,0,null,28,[]],
-PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,28,[]]},
+return z},
+PR:function(a){throw H.b("Unexpected serialized object")}},
 yH:{
 "^":"a;Kf,zu,p9",
-ed:[function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
+ed:function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
 if(this.p9==null)return
 H.ox()
 if(this.Kf)$.jk().clearTimeout(this.p9)
 else $.jk().clearInterval(this.p9)
-this.p9=null}else throw H.b(P.f("Canceling a timer."))},"call$0","gZS",0,0,null],
+this.p9=null}else throw H.b(P.f("Canceling a timer."))},
 Qa:function(a,b){var z,y
 if(a===0)z=$.jk().setTimeout==null||init.globalState.EF===!0
 else z=!1
@@ -1169,12 +1181,12 @@
 z.Qa(a,b)
 return z}}},
 FA:{
-"^":"Tp:114;a,b",
+"^":"Tp:116;a,b",
 call$0:[function(){this.a.p9=null
 this.b.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Av:{
-"^":"Tp:114;c,d",
+"^":"Tp:116;c,d",
 call$0:[function(){this.c.p9=null
 H.ox()
 this.d.call$0()},"call$0",null,0,0,null,"call"],
@@ -1192,12 +1204,12 @@
 z=((z^z>>>12)>>>0)*5&4294967295
 z=((z^z>>>4)>>>0)*2057&4294967295
 return(z^z>>>16)>>>0},
-n:[function(a,b){var z,y
+n:function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
 if(!!J.x(b).$isku){z=this.ng
 y=b.ng
-return z==null?y==null:z===y}return!1},"call$1","gUJ",2,0,null,109,[]],
+return z==null?y==null:z===y}return!1},
 $isku:true,
 $ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
@@ -1440,7 +1452,7 @@
 v.prototype=w
 u=!d
 if(u){t=e.length==1&&!0
-s=H.SD(z,t)}else{w.$name=f
+s=H.SD(a,z,t)}else{w.$name=f
 s=z
 t=!1}if(typeof x=="number")r=(function(s){return function(){return init.metadata[s]}})(x)
 else if(u&&typeof x=="function"){q=t?H.yS:H.eZ
@@ -1449,92 +1461,98 @@
 w[y]=s
 for(u=b.length,p=1;p<u;++p){o=b[p]
 n=o.$callName
-if(n!=null){m=d?o:H.SD(o,t)
+if(n!=null){m=d?o:H.SD(a,o,t)
 w[n]=m}}w["call*"]=z
 return v},"call$6","Xd",12,0,null,47,[],64,[],65,[],66,[],67,[],68,[]],
-vq:[function(a,b){var z=H.eZ
-switch(a){case 0:return function(F,S){return function(){return F.call(S(this))}}(b,z)
-case 1:return function(F,S){return function(a){return F.call(S(this),a)}}(b,z)
-case 2:return function(F,S){return function(a,b){return F.call(S(this),a,b)}}(b,z)
-case 3:return function(F,S){return function(a,b,c){return F.call(S(this),a,b,c)}}(b,z)
-case 4:return function(F,S){return function(a,b,c,d){return F.call(S(this),a,b,c,d)}}(b,z)
-case 5:return function(F,S){return function(a,b,c,d,e){return F.call(S(this),a,b,c,d,e)}}(b,z)
-default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],17,[]],
-SD:[function(a,b){var z,y,x,w
-if(b)return H.wg(a)
-z=a.length
-if(typeof dart_precompiled=="function")return H.vq(z,a)
-else if(z===0){y=$.bf
-if(y==null){y=H.B3("self")
-$.bf=y}y="return function(){return F.call(this."+H.d(y)+");"
-x=$.OK
-$.OK=J.WB(x,1)
-return new Function("F",y+H.d(x)+"}")(a)}else if(1<=z&&z<27){w="abcdefghijklmnopqrstuvwxyz".split("").splice(0,z).join(",")
-y="return function("+w+"){return F.call(this."
-x=$.bf
-if(x==null){x=H.B3("self")
-$.bf=x}x=y+H.d(x)+","+w+");"
-y=$.OK
-$.OK=J.WB(y,1)
-return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,17,[],69,[]],
-Z4:[function(a,b,c){var z,y
+vq:[function(a,b,c,d){var z=H.eZ
+switch(b?-1:a){case 0:return function(n,S){return function(){return S(this)[n]()}}(c,z)
+case 1:return function(n,S){return function(a){return S(this)[n](a)}}(c,z)
+case 2:return function(n,S){return function(a,b){return S(this)[n](a,b)}}(c,z)
+case 3:return function(n,S){return function(a,b,c){return S(this)[n](a,b,c)}}(c,z)
+case 4:return function(n,S){return function(a,b,c,d){return S(this)[n](a,b,c,d)}}(c,z)
+case 5:return function(n,S){return function(a,b,c,d,e){return S(this)[n](a,b,c,d,e)}}(c,z)
+default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(d,z)}},"call$4","X5",8,0,null,63,[],69,[],70,[],17,[]],
+SD:[function(a,b,c){var z,y,x,w,v,u
+if(c)return H.wg(a,b)
+z=b.$stubName
+y=b.length
+x=a[z]
+w=b==null?x==null:b===x
+if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
+if(y===0){w=$.bf
+if(w==null){w=H.B3("self")
+$.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+v=$.OK
+$.OK=J.WB(v,1)
+return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
+w="return function("+u+"){return this."
+v=$.bf
+if(v==null){v=H.B3("self")
+$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+w=$.OK
+$.OK=J.WB(w,1)
+return new Function(v+H.d(w)+"}")()},"call$3","Fw",6,0,null,47,[],17,[],71,[]],
+Z4:[function(a,b,c,d){var z,y
 z=H.eZ
 y=H.yS
-switch(a){case 0:throw H.b(H.Ef("Intercepted function with no arguments."))
-case 1:return function(f,s,r){return function(){return f.call(s(this),r(this))}}(c,z,y)
-case 2:return function(f,s,r){return function(a){return f.call(s(this),r(this),a)}}(c,z,y)
-case 3:return function(f,s,r){return function(a,b){return f.call(s(this),r(this),a,b)}}(c,z,y)
-case 4:return function(f,s,r){return function(a,b,c){return f.call(s(this),r(this),a,b,c)}}(c,z,y)
-case 5:return function(f,s,r){return function(a,b,c,d){return f.call(s(this),r(this),a,b,c,d)}}(c,z,y)
-case 6:return function(f,s,r){return function(a,b,c,d,e){return f.call(s(this),r(this),a,b,c,d,e)}}(c,z,y)
-default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],17,[]],
-wg:[function(a){var z,y,x,w,v,u
+switch(b?-1:a){case 0:throw H.b(H.Ef("Intercepted function with no arguments."))
+case 1:return function(n,s,r){return function(){return s(this)[n](r(this))}}(c,z,y)
+case 2:return function(n,s,r){return function(a){return s(this)[n](r(this),a)}}(c,z,y)
+case 3:return function(n,s,r){return function(a,b){return s(this)[n](r(this),a,b)}}(c,z,y)
+case 4:return function(n,s,r){return function(a,b,c){return s(this)[n](r(this),a,b,c)}}(c,z,y)
+case 5:return function(n,s,r){return function(a,b,c,d){return s(this)[n](r(this),a,b,c,d)}}(c,z,y)
+case 6:return function(n,s,r){return function(a,b,c,d,e){return s(this)[n](r(this),a,b,c,d,e)}}(c,z,y)
+default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(d,z,y)}},"call$4","VT",8,0,null,63,[],69,[],12,[],17,[]],
+wg:[function(a,b){var z,y,x,w,v,u,t,s
 z=H.oN()
 y=$.P4
 if(y==null){y=H.B3("receiver")
-$.P4=y}x=a.$stubName
-w=a.length
-if(typeof dart_precompiled=="function")return H.Z4(w,x,a)
-else if(w===1){y="return function(){return F.call(this."+H.d(z)+", this."+H.d(y)+");"
-v=$.OK
-$.OK=J.WB(v,1)
-return new Function("F",y+H.d(v)+"}")(a)}else if(1<w&&w<28){u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,w-1).join(",")
-y="return function("+u+"){return F.call(this."+H.d(z)+", this."+H.d(y)+", "+u+");"
-v=$.OK
-$.OK=J.WB(v,1)
-return new Function("F",y+H.d(v)+"}")(a)}else return H.Z4(w,x,a)},"call$1","FT",2,0,null,17,[]],
+$.P4=y}x=b.$stubName
+w=b.length
+v=typeof dart_precompiled=="function"
+u=a[x]
+t=b==null?u==null:b===u
+if(v||!t||w>=28)return H.Z4(w,!t,x,b)
+if(w===1){y="return function(){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+");"
+t=$.OK
+$.OK=J.WB(t,1)
+return new Function(y+H.d(t)+"}")()}s="abcdefghijklmnopqrstuvwxyz".split("").splice(0,w-1).join(",")
+y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
+t=$.OK
+$.OK=J.WB(t,1)
+return new Function(y+H.d(t)+"}")()},"call$2","FT",4,0,null,47,[],17,[]],
 Kq:[function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
 return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,47,[],64,[],65,[],66,[],67,[],12,[]],
 SE:[function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,30,[],71,[]],
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,30,[],73,[]],
 Go:[function(a,b){var z
 if(a!=null)z=typeof a==="object"&&J.x(a)[b]
 else z=!0
 if(z)return a
-H.SE(a,b)},"call$2","CY",4,0,null,30,[],71,[]],
-ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"call$1","RK",2,0,null,72,[]],
-KT:[function(a,b,c){return new H.tD(a,b,c,null)},"call$3","HN",6,0,null,74,[],75,[],76,[]],
+H.SE(a,b)},"call$2","CY",4,0,null,30,[],73,[]],
+ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"call$1","RK",2,0,null,74,[]],
+KT:[function(a,b,c){return new H.tD(a,b,c,null)},"call$3","HN",6,0,null,76,[],77,[],78,[]],
 Og:[function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.tu(z)
-return new H.fw(z,b,null)},"call$2","ZPJ",4,0,null,77,[],78,[]],
+return new H.fw(z,b,null)},"call$2","ZPJ",4,0,null,79,[],80,[]],
 N7:[function(){return C.KZ},"call$0","cI",0,0,null],
 uV:[function(a){return new H.cu(a,null)},"call$1","IZ",2,0,null,12,[]],
 VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},"call$2","Ub",4,0,null,79,[],80,[]],
+return a},"call$2","Ub",4,0,null,81,[],82,[]],
 oX:[function(a){if(a==null)return
-return a.$builtinTypeInfo},"call$1","Qn",2,0,null,79,[]],
-IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"call$2","PE",4,0,null,79,[],81,[]],
+return a.$builtinTypeInfo},"call$1","Qn",2,0,null,81,[]],
+IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"call$2","PE",4,0,null,81,[],83,[]],
 ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"call$3","Cn",6,0,null,79,[],81,[],15,[]],
+return z==null?null:z[c]},"call$3","Cn",6,0,null,81,[],83,[],15,[]],
 Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],15,[]],
+return z==null?null:z[b]},"call$2","tC",4,0,null,81,[],15,[]],
 Ko:[function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
 else if(typeof a==="number"&&Math.floor(a)===a)if(b==null)return C.jn.bu(a)
 else return b.call$1(a)
-else return},"call$2$onTypeVariable","bR",2,3,null,82,11,[],83,[]],
+else return},"call$2$onTypeVariable","bR",2,3,null,84,11,[],85,[]],
 ia:[function(a,b,c){var z,y,x,w,v,u
 if(a==null)return""
 z=P.p9("")
@@ -1544,25 +1562,25 @@
 if(v!=null)w=!1
 u=H.Ko(v,c)
 u=typeof u==="string"?u:H.d(u)
-z.vM=z.vM+u}return w?"":"<"+H.d(z)+">"},"call$3$onTypeVariable","iM",4,3,null,82,84,[],85,[],83,[]],
+z.vM=z.vM+u}return w?"":"<"+H.d(z)+">"},"call$3$onTypeVariable","iM",4,3,null,84,86,[],87,[],85,[]],
 dJ:[function(a){var z=typeof a==="object"&&a!==null&&a.constructor===Array?"List":J.x(a).constructor.builtin$cls
 return z+H.ia(a.$builtinTypeInfo,0,null)},"call$1","Yx",2,0,null,6,[]],
 Y9:[function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
 else if(typeof a=="function"){a=H.ml(a,null,b)
 if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function")b=H.ml(a,null,b)}return b},"call$2","zL",4,0,null,86,[],87,[]],
+else if(typeof a=="function")b=H.ml(a,null,b)}return b},"call$2","zL",4,0,null,88,[],89,[]],
 RB:[function(a,b,c,d){var z,y
 if(a==null)return!1
 z=H.oX(a)
 y=J.x(a)
 if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},"call$4","Ap",8,0,null,6,[],88,[],89,[],90,[]],
+return H.hv(H.Y9(y[d],z),c)},"call$4","Ap",8,0,null,6,[],90,[],91,[],92,[]],
 hv:[function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
 for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},"call$2","QY",4,0,null,91,[],92,[]],
-IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"call$3","k2",6,0,null,93,[],94,[],95,[]],
+return!0},"call$2","QY",4,0,null,93,[],94,[]],
+IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"call$3","k2",6,0,null,95,[],96,[],97,[]],
 XY:[function(a,b){var z,y
 if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="Null"
 if(b==null)return!0
@@ -1570,7 +1588,7 @@
 a=J.x(a)
 if(z!=null){y=z.slice()
 y.splice(0,0,a)}else y=a
-return H.t1(y,b)},"call$2","tk",4,0,null,96,[],92,[]],
+return H.t1(y,b)},"call$2","tk",4,0,null,98,[],94,[]],
 t1:[function(a,b){var z,y,x,w,v,u,t
 if(a===b)return!0
 if(a==null||b==null)return!0
@@ -1588,7 +1606,7 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},"call$2","Mb",4,0,null,91,[],92,[]],
+return H.hv(H.Y9(t,y),w)},"call$2","Mb",4,0,null,93,[],94,[]],
 Hc:[function(a,b,c){var z,y,x,w,v
 if(b==null&&a==null)return!0
 if(b==null)return c
@@ -1598,7 +1616,7 @@
 if(c){if(z<y)return!1}else if(z!==y)return!1
 for(x=0;x<y;++x){w=a[x]
 v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"call$3","C6",6,0,null,91,[],92,[],97,[]],
+if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"call$3","C6",6,0,null,93,[],94,[],99,[]],
 Vt:[function(a,b){var z,y,x,w,v,u
 if(b==null)return!0
 if(a==null)return!1
@@ -1609,7 +1627,7 @@
 if(!Object.hasOwnProperty.call(a,w))return!1
 v=b[w]
 u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"call$2","y3",4,0,null,91,[],92,[]],
+if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"call$2","y3",4,0,null,93,[],94,[]],
 Ly:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(!("func" in a))return!1
 if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
@@ -1631,12 +1649,12 @@
 n=w[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
 n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"call$2","Sj",4,0,null,91,[],92,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,17,[],47,[],87,[]],
+if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"call$2","Sj",4,0,null,93,[],94,[]],
+ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,17,[],47,[],89,[]],
 uc:[function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},"call$1","zB",2,0,null,98,[]],
+return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},"call$1","zB",2,0,null,100,[]],
 wzi:[function(a){return H.eQ(a)},"call$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],30,[]],
+iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,100,[],73,[],30,[]],
 w3:[function(a){var z,y,x,w,v,u
 z=$.NF.call$1(a)
 y=$.nw[z]
@@ -1662,16 +1680,16 @@
 if(v==="*")throw H.b(P.SY(z))
 if(init.leafTags[z]===true){u=H.Va(x)
 Object.defineProperty(Object.getPrototypeOf(a), init.dispatchPropertyName, {value: u, enumerable: false, writable: true, configurable: true})
-return u.i}else return H.Lc(a,x)},"call$1","eU",2,0,null,98,[]],
+return u.i}else return H.Lc(a,x)},"call$1","eU",2,0,null,100,[]],
 Lc:[function(a,b){var z,y
 z=Object.getPrototypeOf(a)
 y=J.Qu(b,z,null,null)
 Object.defineProperty(z, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
-return b},"call$2","qF",4,0,null,98,[],7,[]],
+return b},"call$2","qF",4,0,null,100,[],7,[]],
 Va:[function(a){return J.Qu(a,!1,null,!!a.$isXj)},"call$1","MlJ",2,0,null,7,[]],
 VF:[function(a,b,c){var z=b.prototype
 if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},"call$3","vi",6,0,null,99,[],100,[],8,[]],
+else return J.Qu(z,c,null,null)},"call$3","vi",6,0,null,101,[],102,[],8,[]],
 XD:[function(){if(!0===$.Bv)return
 $.Bv=!0
 H.Z1()},"call$0","Ki",0,0,null],
@@ -1704,7 +1722,7 @@
 $.NF=new H.dC(v)
 $.TX=new H.wN(u)
 $.x7=new H.VX(t)},"call$0","Hb",0,0,null],
-ud:[function(a,b){return a(b)||b},"call$2","rM",4,0,null,101,[],102,[]],
+ud:[function(a,b){return a(b)||b},"call$2","rM",4,0,null,103,[],104,[]],
 ZT:[function(a,b){var z,y,x,w,v,u
 z=H.VM([],[P.Od])
 y=b.length
@@ -1714,13 +1732,13 @@
 z.push(new H.tQ(v,b,a))
 u=v+x
 if(u===y)break
-else w=v===u?w+1:u}return z},"call$2","tl",4,0,null,107,[],108,[]],
+else w=v===u?w+1:u}return z},"call$2","tl",4,0,null,109,[],110,[]],
 m2:[function(a,b,c){var z,y
 if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
 else{z=J.x(b)
 if(!!z.$isVR){z=C.xB.yn(a,c)
 y=b.Ej
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,47,[],109,[],85,[]],
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,47,[],111,[],87,[]],
 ys:[function(a,b,c){var z,y,x,w,v
 if(typeof b==="string")if(b==="")if(a==="")return c
 else{z=P.p9("")
@@ -1733,7 +1751,7 @@
 else if(!!J.x(b).$isVR){v=b.gF4()
 v.lastIndex=0
 return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(new P.AT(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"call$3","uF",6,0,null,47,[],110,[],111,[]],
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"call$3","uF",6,0,null,47,[],112,[],113,[]],
 Zd:{
 "^":"a;"},
 xQ:{
@@ -1744,27 +1762,27 @@
 "^":"a;",
 gl0:function(a){return J.de(this.gB(this),0)},
 gor:function(a){return!J.de(this.gB(this),0)},
-bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
-Ix:[function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},"call$0","gPb",0,0,null],
-u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,48,[],354,[]],
-Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,48,[]],
-V1:[function(a){return this.Ix()},"call$0","gRa",0,0,null],
-FV:[function(a,b){return this.Ix()},"call$1","gDY",2,0,null,109,[]],
+bu:function(a){return P.vW(this)},
+Ix:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
+u:function(a,b,c){return this.Ix()},
+Rz:function(a,b){return this.Ix()},
+V1:function(a){return this.Ix()},
+FV:function(a,b){return this.Ix()},
 $isZ0:true},
 LPe:{
 "^":"pa;B>,HV,tc",
-di:[function(a){return this.gUQ(this).Vr(0,new H.LD(this,a))},"call$1","gmc",2,0,null,107,[]],
-x4:[function(a){if(typeof a!=="string")return!1
+di:function(a){return this.gUQ(this).Vr(0,new H.LD(this,a))},
+x4:function(a){if(typeof a!=="string")return!1
 if("__proto__"===a)return!1
-return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,48,[]],
-t:[function(a,b){if(!this.x4(b))return
-return this.TZ(b)},"call$1","gIA",2,0,null,48,[]],
-TZ:[function(a){return this.HV[a]},"call$1","gN4",2,0,null,48,[]],
-aN:[function(a,b){var z,y,x
+return this.HV.hasOwnProperty(a)},
+t:function(a,b){if(!this.x4(b))return
+return this.TZ(b)},
+TZ:function(a){return this.HV[a]},
+aN:function(a,b){var z,y,x
 z=this.tc
 for(y=0;y<z.length;++y){x=z[y]
-b.call$2(x,this.TZ(x))}},"call$1","gjw",2,0,null,117,[]],
-gvc:function(a){return H.VM(new H.XR(this),[H.Kp(this,0)])},
+b.call$2(x,this.TZ(x))}},
+gvc:function(){return H.VM(new H.XR(this),[H.Kp(this,0)])},
 gUQ:function(a){return H.K1(this.tc,new H.jJ(this),H.Kp(this,0),H.Kp(this,1))},
 $isyN:true},
 LD:{
@@ -1773,7 +1791,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
 jJ:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,48,[],"call"],
 $isEH:true},
 XR:{
@@ -1815,7 +1833,7 @@
 s=w+u
 if(s<0||s>=x.length)return H.e(x,s)
 v.u(0,new H.GD(t),x[s])}return v},
-ZU:[function(a){var z,y,x,w,v,u,t,s
+ZU:function(a){var z,y,x,w,v,u,t,s
 z=J.x(a)
 y=this.uk
 x=$.Dq.indexOf(y)!==-1
@@ -1831,22 +1849,22 @@
 else z=null}s=!0}else s=!1
 if(typeof u=="function"){if(!("$reflectable" in u))H.Hz(J.GL(this.gWa()))
 if(s)return new H.IW(H.zh(u),y,u,x,z)
-else return new H.A2(y,u,x,z)}else return new H.F3(z)},"call$1","gpW",2,0,null,6,[]],
-static:{"^":"Sb,HT,zl"}},
+else return new H.A2(y,u,x,z)}else return new H.F3(z)},
+static:{"^":"Sb,oY,zl"}},
 A2:{
 "^":"a;Pi<,mr,eK<,Ot",
 gpf:function(){return!1},
-Bj:[function(a,b){var z,y
+Bj:function(a,b){var z,y
 if(!this.eK){if(typeof b!=="object"||b===null||b.constructor!==Array)b=P.F(b,!0,null)
 z=a}else{y=[a]
 C.Nm.FV(y,b)
 z=this.Ot
 z=z!=null?z:a
-b=y}return this.mr.apply(z,b)},"call$2","gUT",4,0,null,147,[],87,[]]},
+b=y}return this.mr.apply(z,b)}},
 IW:{
 "^":"A2;qa,Pi,mr,eK,Ot",
 To:function(a){return this.qa.call$1(a)},
-Bj:[function(a,b){var z,y,x,w,v,u,t
+Bj:function(a,b){var z,y,x,w,v,u,t
 z=this.qa
 y=z.Rv
 x=y+z.hG
@@ -1861,45 +1879,46 @@
 else if(w<y)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too few)."))
 else if(w>x)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too many)."))
 for(t=w;t<x;++t)C.Nm.h(b,init.metadata[z.BX(0,t)])
-return this.mr.apply(v,b)},"call$2","gUT",4,0,null,147,[],87,[]]},
+return this.mr.apply(v,b)}},
 F3:{
 "^":"a;e0",
 gpf:function(){return!0},
-Bj:[function(a,b){var z=this.e0
-return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],336,[]]},
+Bj:function(a,b){var z=this.e0
+return J.jf(z==null?a:z,b)}},
 FD:{
 "^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
-XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,356,[]],
-BX:[function(a,b){var z=this.Rv
+XL:function(a){var z=this.Rn[2*a+this.hG+3]
+return init.metadata[z]},
+BX:function(a,b){var z=this.Rv
 if(J.u6(b,z))return
-return this.Rn[3+b-z]},"call$1","gkv",2,0,null,356,[]],
-Fk:[function(a){var z=this.Rv
+return this.Rn[3+b-z]},
+Fk:function(a){var z=this.Rv
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.BX(0,a)
-return this.BX(0,this.e4(a-z))},"call$1","gtW",2,0,null,356,[]],
-KE:[function(a){var z=this.Rv
+return this.BX(0,this.e4(a-z))},
+KE:function(a){var z=this.Rv
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.XL(a)
-return this.XL(this.e4(a-z))},"call$1","gX4",2,0,null,356,[]],
-e4:[function(a){var z,y,x,w,v,u,t
+return this.XL(this.e4(a-z))},
+e4:function(a){var z,y,x,w,v,u
 z={}
 if(this.NE==null){y=this.hG
 this.NE=Array(y)
 x=H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,J.im])
-for(w=this.Rv,v=this.Rn,u=0;u<y;++u){t=w+u
-x.u(0,init.metadata[v[2*t+y+3]],t)}z.a=0
-y=x.gvc(x)
+for(w=this.Rv,v=0;v<y;++v){u=w+v
+x.u(0,this.XL(u),u)}z.a=0
+y=x.gvc()
 y=P.F(y,!0,H.ip(y,"mW",0))
 H.rd(y,null)
 H.bQ(y,new H.Nv(z,this,x))}z=this.NE
 if(a<0||a>=z.length)return H.e(z,a)
-return z[a]},"call$1","gQF",2,0,null,357,[]],
-hl:[function(a){var z,y
+return z[a]},
+hl:function(a){var z,y
 z=this.AM
 if(typeof z=="number")return init.metadata[z]
 else if(typeof z=="function"){y=new a()
 H.VM(y,y["<>"])
-return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,358,[]],
+return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},
 gx5:function(){return this.mr.$reflectionName},
 static:{"^":"vS,FV,C1,H6",zh:function(a){var z,y,x,w
 z=a.$reflectionInfo
@@ -1922,7 +1941,7 @@
 z[x]=y},"call$1",null,2,0,null,12,[],"call"],
 $isEH:true},
 Cj:{
-"^":"Tp:359;a,b,c",
+"^":"Tp:294;a,b,c",
 call$2:[function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
@@ -1930,14 +1949,14 @@
 z.a=z.a+1},"call$2",null,4,0,null,12,[],52,[],"call"],
 $isEH:true},
 u8:{
-"^":"Tp:359;a,b",
+"^":"Tp:294;a,b",
 call$2:[function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"call$2",null,4,0,null,356,[],30,[],"call"],
+else this.a.a=!0},"call$2",null,4,0,null,295,[],30,[],"call"],
 $isEH:true},
 Zr:{
 "^":"a;bT,rq,Xs,Fa,Ga,EP",
-qS:[function(a){var z,y,x
+qS:function(a){var z,y,x
 z=new RegExp(this.bT).exec(a)
 if(z==null)return
 y={}
@@ -1951,7 +1970,7 @@
 if(x!==-1)y.method=z[x+1]
 x=this.EP
 if(x!==-1)y.receiver=z[x+1]
-return y},"call$1","gul",2,0,null,24,[]],
+return y},
 static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
 a=a.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
@@ -1977,19 +1996,19 @@
 }(a)},"call$1","cl",2,0,null,54,[]]}},
 W0:{
 "^":"Ge;K9,Ga",
-bu:[function(a){var z=this.Ga
+bu:function(a){var z=this.Ga
 if(z==null)return"NullError: "+H.d(this.K9)
-return"NullError: Cannot call \""+H.d(z)+"\" on null"},"call$0","gXo",0,0,null],
+return"NullError: Cannot call \""+H.d(z)+"\" on null"},
 $ismp:true,
 $isGe:true},
 az:{
 "^":"Ge;K9,Ga,EP",
-bu:[function(a){var z,y
+bu:function(a){var z,y
 z=this.Ga
 if(z==null)return"NoSuchMethodError: "+H.d(this.K9)
 y=this.EP
 if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.K9)+")"
-return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},"call$0","gXo",0,0,null],
+return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},
 $ismp:true,
 $isGe:true,
 static:{T3:function(a,b){var z,y
@@ -1999,56 +2018,56 @@
 return new H.az(a,y,z)}}},
 vV:{
 "^":"Ge;K9",
-bu:[function(a){var z=this.K9
-return C.xB.gl0(z)?"Error":"Error: "+z},"call$0","gXo",0,0,null]},
+bu:function(a){var z=this.K9
+return C.xB.gl0(z)?"Error":"Error: "+z}},
 Am:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},"call$1",null,2,0,null,159,[],"call"],
+return a},"call$1",null,2,0,null,161,[],"call"],
 $isEH:true},
 XO:{
 "^":"a;lA,ui",
-bu:[function(a){var z,y
+bu:function(a){var z,y
 z=this.ui
 if(z!=null)return z
 z=this.lA
 y=typeof z==="object"?z.stack:null
 z=y==null?"":y
 this.ui=z
-return z},"call$0","gXo",0,0,null]},
+return z}},
 dr:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){return this.a.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 TL:{
-"^":"Tp:115;b,c",
+"^":"Tp:117;b,c",
 call$0:[function(){return this.b.call$1(this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 KX:{
-"^":"Tp:115;d,e,f",
+"^":"Tp:117;d,e,f",
 call$0:[function(){return this.d.call$2(this.e,this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uZ:{
-"^":"Tp:115;UI,bK,Gq,Rm",
+"^":"Tp:117;UI,bK,Gq,Rm",
 call$0:[function(){return this.UI.call$3(this.bK,this.Gq,this.Rm)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 OQ:{
-"^":"Tp:115;w3,HZ,mG,xC,cj",
+"^":"Tp:117;w3,HZ,mG,xC,cj",
 call$0:[function(){return this.w3.call$4(this.HZ,this.mG,this.xC,this.cj)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Tp:{
 "^":"a;",
-bu:[function(a){return"Closure"},"call$0","gXo",0,0,null],
+bu:function(a){return"Closure"},
 $isTp:true,
 $isEH:true},
 Bp:{
 "^":"Tp;"},
 v:{
 "^":"Bp;nw<,jm<,EP,RA>",
-n:[function(a,b){if(b==null)return!1
+n:function(a,b){if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isv)return!1
-return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},"call$1","gUJ",2,0,null,109,[]],
+return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},
 giO:function(a){var z,y
 z=this.EP
 if(z==null)y=H.eQ(this.nw)
@@ -2063,7 +2082,7 @@
 y.fixed$length=init
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}},"call$1","ec",2,0,null,70,[]]}},
+if(z[v]===a)return v}},"call$1","ec",2,0,null,72,[]]}},
 qq:{
 "^":"a;QW"},
 dN:{
@@ -2072,22 +2091,22 @@
 "^":"a;oc>"},
 Pe:{
 "^":"Ge;G1>",
-bu:[function(a){return this.G1},"call$0","gXo",0,0,null],
+bu:function(a){return this.G1},
 $isGe:true,
 static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
 Eq:{
 "^":"Ge;G1>",
-bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"call$0","gXo",0,0,null],
+bu:function(a){return"RuntimeError: "+H.d(this.G1)},
 static:{Ef:function(a){return new H.Eq(a)}}},
 q1:{
 "^":"a;"},
 tD:{
 "^":"q1;dw,Iq,is,p6",
-BD:[function(a){var z=this.rP(a)
-return z==null?!1:H.Ly(z,this.za())},"call$1","gQ4",2,0,null,54,[]],
-rP:[function(a){var z=J.x(a)
-return"$signature" in z?z.$signature():null},"call$1","gie",2,0,null,96,[]],
-za:[function(){var z,y,x,w,v,u,t
+BD:function(a){var z=this.rP(a)
+return z==null?!1:H.Ly(z,this.za())},
+rP:function(a){var z=J.x(a)
+return"$signature" in z?z.$signature():null},
+za:function(){var z,y,x,w,v,u,t
 z={ "func": "dynafunc" }
 y=this.dw
 x=J.x(y)
@@ -2101,8 +2120,8 @@
 if(y!=null){w={}
 v=H.kU(y)
 for(x=v.length,u=0;u<x;++u){t=v[u]
-w[t]=y[t].za()}z.named=w}return z},"call$0","gGp",0,0,null],
-bu:[function(a){var z,y,x,w,v,u,t,s
+w[t]=y[t].za()}z.named=w}return z},
+bu:function(a){var z,y,x,w,v,u,t,s
 z=this.Iq
 if(z!=null)for(y=z.length,x="(",w=!1,v=0;v<y;++v,w=!0){u=z[v]
 if(w)x+=", "
@@ -2116,28 +2135,28 @@
 t=H.kU(z)
 for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
 if(w)x+=", "
-x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},"call$0","gXo",0,0,null],
+x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},
 static:{"^":"Ot",Dz:[function(a){var z,y,x
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"call$1","eL",2,0,null,73,[]]}},
+return z},"call$1","At",2,0,null,75,[]]}},
 hJ:{
 "^":"q1;",
-bu:[function(a){return"dynamic"},"call$0","gXo",0,0,null],
-za:[function(){return},"call$0","gGp",0,0,null],
+bu:function(a){return"dynamic"},
+za:function(){return},
 $ishJ:true},
 tu:{
 "^":"q1;oc>",
-za:[function(){var z,y
+za:function(){var z,y
 z=this.oc
 y=init.allClasses[z]
 if(y==null)throw H.b("no type for '"+H.d(z)+"'")
-return y},"call$0","gGp",0,0,null],
-bu:[function(a){return this.oc},"call$0","gXo",0,0,null]},
+return y},
+bu:function(a){return this.oc}},
 fw:{
 "^":"q1;oc>,re<,Et",
-za:[function(){var z,y
+za:function(){var z,y
 z=this.Et
 if(z!=null)return z
 z=this.oc
@@ -2146,42 +2165,42 @@
 if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
 for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
-return y},"call$0","gGp",0,0,null],
-bu:[function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"},"call$0","gXo",0,0,null]},
+return y},
+bu:function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"}},
 ZV:{
 "^":"Ge;K9",
-bu:[function(a){return"Unsupported operation: "+this.K9},"call$0","gXo",0,0,null],
+bu:function(a){return"Unsupported operation: "+this.K9},
 $ismp:true,
 $isGe:true,
 static:{WE:function(a){return new H.ZV(a)}}},
 cu:{
 "^":"a;LU<,ke",
-bu:[function(a){var z,y,x
+bu:function(a){var z,y,x
 z=this.ke
 if(z!=null)return z
 y=this.LU
 x=init.mangledGlobalNames[y]
 y=x==null?y:x
 this.ke=y
-return y},"call$0","gXo",0,0,null],
+return y},
 giO:function(a){return J.v1(this.LU)},
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},
 $iscu:true,
 $isuq:true},
-Lm:{
+QT:{
 "^":"a;XP<,oc>,kU>"},
 dC:{
-"^":"Tp:112;a",
-call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,96,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true},
 wN:{
-"^":"Tp:360;b",
-call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,96,[],99,[],"call"],
+"^":"Tp:296;b",
+call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,98,[],101,[],"call"],
 $isEH:true},
 VX:{
 "^":"Tp:32;c",
-call$1:[function(a){return this.c(a)},"call$1",null,2,0,null,99,[],"call"],
+call$1:[function(a){return this.c(a)},"call$1",null,2,0,null,101,[],"call"],
 $isEH:true},
 VR:{
 "^":"a;Ej,Ii,Ua",
@@ -2197,21 +2216,21 @@
 z=H.v4(z.source+"|()",z.multiline,!z.ignoreCase,!0)
 this.Ua=z
 return z},
-ej:[function(a){var z
+ej:function(a){var z
 if(typeof a!=="string")H.vh(new P.AT(a))
 z=this.Ej.exec(a)
 if(z==null)return
-return H.yx(this,z)},"call$1","gvz",2,0,null,343,[]],
-zD:[function(a){if(typeof a!=="string")H.vh(new P.AT(a))
-return this.Ej.test(a)},"call$1","guf",2,0,null,343,[]],
-dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,343,[]],
-yk:[function(a,b){var z,y
+return H.yx(this,z)},
+zD:function(a){if(typeof a!=="string")H.vh(new P.AT(a))
+return this.Ej.test(a)},
+dd:function(a,b){return new H.KW(this,b)},
+yk:function(a,b){var z,y
 z=this.gF4()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
-return H.yx(this,y)},"call$2","gow",4,0,null,14,[],123,[]],
-Bh:[function(a,b){var z,y,x,w
+return H.yx(this,y)},
+Bh:function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
 y=z.exec(a)
@@ -2221,9 +2240,14 @@
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
 C.Nm.sB(y,w)
-return H.yx(this,y)},"call$2","gm4",4,0,null,14,[],123,[]],
-wL:[function(a,b,c){if(c<0||c>J.q8(b))throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,339,14,[],123,[]],
+return H.yx(this,y)},
+wL:function(a,b,c){var z
+if(c>=0){z=J.q8(b)
+if(typeof z!=="number")return H.s(z)
+z=c>z}else z=!0
+if(z)throw H.b(P.TE(c,0,J.q8(b)))
+return this.Bh(b,c)},
+R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
 $isSP:true,
 static:{v4:[function(a,b,c,d){var z,y,x,w,v
@@ -2233,12 +2257,12 @@
 w=(function() {try {return new RegExp(a, z + y + x);} catch (e) {return e;}})()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"call$4","HU",8,0,null,103,[],104,[],105,[],106,[]]}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"call$4","HU",8,0,null,105,[],106,[],107,[],108,[]]}},
 EK:{
 "^":"a;zO,QK",
-t:[function(a,b){var z=this.QK
+t:function(a,b){var z=this.QK
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,15,[]],
+return z[b]},
 VO:function(a,b){},
 $isOd:true,
 static:{yx:function(a,b){var z=new H.EK(a,b)
@@ -2252,7 +2276,7 @@
 Pb:{
 "^":"a;VV,rv,Wh",
 gl:function(){return this.Wh},
-G:[function(){var z,y,x
+G:function(){var z,y,x
 if(this.rv==null)return!1
 z=this.Wh
 if(z!=null){z=z.QK
@@ -2265,27 +2289,27 @@
 z=this.VV.yk(this.rv,x)
 this.Wh=z
 if(z==null){this.rv=null
-return!1}return!0},"call$0","gqy",0,0,null]},
+return!1}return!0}},
 tQ:{
 "^":"a;M,J9,zO",
-t:[function(a,b){if(!J.de(b,0))H.vh(P.N(b))
-return this.zO},"call$1","gIA",2,0,null,361,[]],
+t:function(a,b){if(!J.de(b,0))H.vh(P.N(b))
+return this.zO},
 $isOd:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
 m7:[function(a){var z
 N.Jx("").To("Google Charts API loaded")
 z=J.UQ(J.UQ($.cM(),"google"),"visualization")
 $.NR=z
-return z},"call$1","vN",2,0,112,113,[]],
+return z},"call$1","vN",2,0,114,115,[]],
 mL:{
-"^":["Pi;Z6<-362,zf>-363,Eb,AJ,fz,AP,Lk",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,364,"isolate",365,366],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,367,30,[],"isolate",365],
-gn9:[function(a){return this.AJ},null,null,1,0,368,"response",365,366],
-sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,369,30,[],"response",365],
-gKw:[function(){return this.fz},null,null,1,0,370,"args",365,366],
-sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,32,30,[],"args",365],
-Da:[function(){var z,y
+"^":["Pi;Z6<-297,zf>-298,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,299,"isolate",300,301],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,302,30,[],"isolate",300],
+gn9:[function(a){return this.AJ},null,null,1,0,303,"response",300,301],
+sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,304,30,[],"response",300],
+gKw:[function(){return this.fz},null,null,1,0,305,"args",300,301],
+sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,32,30,[],"args",300],
+Da:function(){var z,y
 z=this.Z6
 z.sec(this)
 z.kI()
@@ -2293,42 +2317,43 @@
 y=z.gG2()
 H.VM(new P.Ik(y),[H.Kp(y,0)]).yI(this.gbf())
 z=z.gLi()
-H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},"call$0","gLW",0,0,null],
+H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
 kj:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"call$1","gbf",2,0,371,159,[]],
+this.Z6.Mp()},"call$1","gbf",2,0,306,161,[]],
 t1:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"call$1","gXa",2,0,372,373,[]],
+this.Z6.Mp()},"call$1","gXa",2,0,307,308,[]],
 US:function(){this.Da()},
 hq:function(){this.Da()}},
 Kf:{
 "^":"a;Yb<",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gWT:function(a){return this.Yb.nQ("getNumberOfRows")},
-Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],374,[]],
-Ti:[function(){var z=this.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gA6",0,0,null],
-aJ:[function(a,b){var z=[]
+Gl:function(a,b){this.Yb.V7("addColumn",[a,b])},
+Ti:function(){var z=this.Yb
+z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
+aJ:function(a,b){var z=[]
 C.Nm.FV(z,H.VM(new H.A8(b,P.En()),[null,null]))
-this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,375,[]]},
+this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])}},
 qu:{
 "^":"a;vR,bG>",
-u5:[function(){var z,y,x
+u5:function(){var z,y,x
 z=this.vR.nQ("getSortInfo")
 if(z!=null&&!J.de(J.UQ(z,"column"),-1)){y=this.bG
 x=J.U6(z)
 y.u(0,"sortColumn",x.t(z,"column"))
-y.u(0,"sortAscending",x.t(z,"ascending"))}},"call$0","gmf",0,0,null],
-W2:[function(a){var z=P.jT(this.bG)
-this.vR.V7("draw",[a.gYb(),z])},"call$1","gnS",2,0,null,185,[]]},
+y.u(0,"sortAscending",x.t(z,"ascending"))}},
+W2:function(a){var z=P.jT(this.bG)
+this.vR.V7("draw",[a.gYb(),z])}},
 dZ:{
-"^":"Pi;ec?,JL,AP,Lk",
-gjW:[function(){return this.JL},null,null,1,0,370,"currentHash",365,366],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",365],
-kI:[function(){var z=C.PP.aM(window)
+"^":"Pi;ec?,JL,AP,fn",
+gjW:[function(){return this.JL},null,null,1,0,305,"currentHash",300,301],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",300],
+kI:function(){var z=C.PP.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
-J.We(C.ol.gyH(window),"#/vm")},"call$0","gV3",0,0,null],
-Mp:[function(){J.We(C.ol.gyH(window),"")},"call$0","ghy",0,0,null],
-df:[function(){var z,y,x
+if(J.de(J.Co(C.ol.gyH(window)),""))J.We(C.ol.gyH(window),"#/vm")
+else this.df()},
+Mp:function(){J.We(C.ol.gyH(window),"")},
+df:function(){var z,y,x
 z=J.Co(C.ol.gyH(window))
 z=F.Wi(this,C.h1,this.JL,z)
 this.JL=z
@@ -2338,46 +2363,51 @@
 if(0>=z)return H.e(y,0)
 x=z>1?y[1]:""
 if(z>2)N.Jx("").j2("Found more than 2 #-characters in "+H.d(this.JL))
-this.ec.zf.ox(J.ZZ(this.JL,2)).ml(new G.GH(this,x))},"call$0","glq",0,0,null],
+this.ec.zf.cv(J.ZZ(this.JL,2)).ml(new G.GH(this,x))},
 static:{"^":"K3D"}},
 Qe:{
-"^":"Tp:112;a",
-call$1:[function(a){this.a.df()},"call$1",null,2,0,null,376,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){this.a.df()},"call$1",null,2,0,null,309,[],"call"],
 $isEH:true},
 GH:{
-"^":"Tp:112;a,b",
+"^":"Tp:114;a,b",
 call$1:[function(a){var z,y
 z=this.a
 y=z.ec
 y.AJ=F.Wi(y,C.mE,y.AJ,a)
 z=z.ec
-z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"call$1",null,2,0,null,98,[],"call"],
+z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"call$1",null,2,0,null,100,[],"call"],
 $isEH:true},
 Y2:{
-"^":["Pi;eT>,yt<-377,wd>-378,oH<-379",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
+"^":["Pi;eT>,yt<-310,wd>-311,oH<-312",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
+gyX:[function(a){return this.R7},null,null,1,0,305,"expander",300,301],
+Qx:function(a){return this.gyX(this).call$0()},
+syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,32,30,[],"expander",300],
 goE:function(a){return this.z3},
 soE:function(a,b){var z=this.z3
 this.z3=b
-if(z!==b)if(b)this.C4(0)
-else this.o8()},
-r8:[function(){this.soE(0,!this.z3)
-return this.z3},"call$0","gMk",0,0,null],
+if(z!==b){z=this.R7
+if(b){this.R7=F.Wi(this,C.Of,z,"\u21b3")
+this.C4(0)}else{this.R7=F.Wi(this,C.Of,z,"\u2192")
+this.o8()}}},
+r8:function(){this.soE(0,!this.z3)
+return this.z3},
 $isY2:true},
 XN:{
-"^":["Pi;WT>-378,AP,Lk",function(){return[C.J19]},null,null],
-rT:[function(a){var z,y
+"^":["Pi;WT>-311,AP,fn",function(){return[C.J19]},null,null],
+rT:function(a){var z,y
 z=this.WT
 y=J.w1(z)
 y.V1(z)
 a.C4(0)
-y.FV(z,a.wd)},"call$1","gcr",2,0,null,380,[]],
-qU:[function(a){var z,y,x
+y.FV(z,a.wd)},
+qU:function(a){var z,y,x
 z=this.WT
 y=J.U6(z)
 x=y.t(z,a)
 if(x.r8())y.oF(z,y.u8(z,x)+1,J.uw(x))
-else this.PP(x)},"call$1","gMk",2,0,null,381,[]],
-PP:[function(a){var z,y,x,w,v
+else this.PP(x)},
+PP:function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.q8(z.gwd(a))
 if(J.de(y,0))return
@@ -2388,17 +2418,17 @@
 z=this.WT
 w=J.U6(z)
 v=w.u8(z,a)+1
-w.UZ(z,v,v+y)},"call$1","gNu",2,0,null,375,[]]}}],["app_bootstrap","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/index.html_bootstrap.dart",,E,{
+w.UZ(z,v,v+y)}}}],["app_bootstrap","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/index.html_bootstrap.dart",,E,{
 "^":"",
-YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
+YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
 $.uP=!1
-F.E2()},"call$0","nE",0,0,114]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+F.E2()},"call$0","nE",0,0,116]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 d1:{
-"^":["Ds;BW%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grs:[function(a){return a.BW},null,null,1,0,384,"msg",365,385],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,386,30,[],"msg",365],
-pA:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+"^":["Ds;BW%-313,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grs:[function(a){return a.BW},null,null,1,0,315,"msg",300,316],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,317,30,[],"msg",300],
+pA:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 "@":function(){return[C.jy]},
 static:{t4:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2411,15 +2441,15 @@
 a.X0=w
 C.J0.ZL(a)
 C.J0.oX(a)
-return a},null,null,0,0,115,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[388],
+return a},null,null,0,0,117,"new BreakpointListElement$created"]}},
+"+BreakpointListElement":[319],
 Ds:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
 Tg:{
-"^":["xI;tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.OS]},
+"^":["xI;tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"@":function(){return[C.tSc]},
 static:{rt:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -2432,16 +2462,16 @@
 a.X0=w
 C.oq.ZL(a)
 C.oq.oX(a)
-return a},null,null,0,0,115,"new ClassRefElement$created"]}},
-"+ClassRefElement":[391]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+return a},null,null,0,0,117,"new ClassRefElement$created"]}},
+"+ClassRefElement":[322]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 Jc:{
-"^":["Vfx;lb%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.lb},null,null,1,0,384,"cls",365,385],
-sRu:[function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)},null,null,3,0,386,30,[],"cls",365],
-vV:[function(a,b){return J.QP(a.lb).ox(J.WB(J.F8(a.lb),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,392,212,[],"eval"],
-pA:[function(a,b){J.am(a.lb).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
-"@":function(){return[C.oY]},
+"^":["Vfx;lb%-313,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.lb},null,null,1,0,315,"cls",300,316],
+sdG:[function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)},null,null,3,0,317,30,[],"cls",300],
+vV:[function(a,b){return J.QP(a.lb).cv(J.WB(J.F8(a.lb),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,323,214,[],"eval"],
+pA:[function(a,b){J.am(a.lb).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
+"@":function(){return[C.aQx]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -2453,14 +2483,17 @@
 a.X0=w
 C.ka.ZL(a)
 C.ka.oX(a)
-return a},null,null,0,0,115,"new ClassViewElement$created"]}},
-"+ClassViewElement":[393],
+return a},null,null,0,0,117,"new ClassViewElement$created"]}},
+"+ClassViewElement":[324],
 Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 CN:{
-"^":["xI;tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.tY},null,null,1,0,325,"code",301],
+aZ:[function(a,b){Q.xI.prototype.aZ.call(this,a,b)
+this.ct(a,C.b1,0,1)},"call$1","gLe",2,0,114,232,[],"refChanged"],
 "@":function(){return[C.U8]},
 static:{On:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2474,20 +2507,20 @@
 a.X0=w
 C.IK.ZL(a)
 C.IK.oX(a)
-return a},null,null,0,0,115,"new CodeRefElement$created"]}},
-"+CodeRefElement":[391]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+return a},null,null,0,0,117,"new CodeRefElement$created"]}},
+"+CodeRefElement":[322]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":["Dsd;Xx%-394,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.Xx},null,null,1,0,395,"code",365,385],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,396,30,[],"code",365],
+"^":["Dsd;Xx%-326,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.Xx},null,null,1,0,325,"code",300,316],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,327,30,[],"code",300],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z)},"call$0","gQd",0,0,114,"enteredView"],
-pA:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
-grK:[function(a){return"panel panel-success"},null,null,1,0,370,"cssPanelClass"],
+J.SK(z)},"call$0","gQd",0,0,116,"enteredView"],
+pA:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
+grK:[function(a){return"panel panel-success"},null,null,1,0,305,"cssPanelClass"],
 "@":function(){return[C.xW]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2500,34 +2533,34 @@
 a.X0=w
 C.ux.ZL(a)
 C.ux.oX(a)
-return a},null,null,0,0,115,"new CodeViewElement$created"]}},
-"+CodeViewElement":[397],
+return a},null,null,0,0,117,"new CodeViewElement$created"]}},
+"+CodeViewElement":[328],
 Dsd:{
 "^":"uL+Pi;",
 $isd3:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 i6:{
-"^":["tuj;zh%-398,HX%-398,Uy%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gAQ:[function(a){return a.zh},null,null,1,0,370,"iconClass",365,366],
-sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",365],
-gai:[function(a){return a.HX},null,null,1,0,370,"displayValue",365,366],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",365],
-gxj:[function(a){return a.Uy},null,null,1,0,399,"collapsed"],
+"^":["tuj;zh%-329,HX%-329,Uy%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gAQ:[function(a){return a.zh},null,null,1,0,305,"iconClass",300,301],
+sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",300],
+gai:[function(a){return a.HX},null,null,1,0,305,"displayValue",300,301],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",300],
+gxj:[function(a){return a.Uy},null,null,1,0,330,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,400,401,[],"collapsed"],
+this.SS(a)},null,null,3,0,331,332,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-this.SS(a)},"call$0","gQd",0,0,114,"enteredView"],
+this.SS(a)},"call$0","gQd",0,0,116,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
 this.SS(a)
-this.SS(a)},"call$3","gl8",6,0,402,21,[],310,[],79,[],"toggleDisplay"],
+this.SS(a)},"call$3","gl8",6,0,333,21,[],334,[],81,[],"toggleDisplay"],
 SS:[function(a){var z,y
 z=a.Uy
 y=a.zh
 if(z===!0){a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-down")
 a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
-a.HX=this.ct(a,C.Jw,a.HX,"block")}},"call$0","glg",0,0,114,"_refresh"],
+a.HX=this.ct(a,C.Jw,a.HX,"block")}},"call$0","glg",0,0,116,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-398,CF<-398",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-329,CF<-329",Hv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -2541,30 +2574,30 @@
 a.X0=w
 C.j8.ZL(a)
 C.j8.oX(a)
-return a},null,null,0,0,115,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[403],
+return a},null,null,0,0,117,"new CollapsibleContentElement$created"]}},
+"+CollapsibleContentElement":[335],
 tuj:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
-"^":["LP;GV%-390,Hu%-390,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-goE:[function(a){return a.GV},null,null,1,0,399,"expanded",365,366],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,400,30,[],"expanded",365],
-gO9:[function(a){return a.Hu},null,null,1,0,399,"busy",365,366],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,400,30,[],"busy",365],
-gFR:[function(a){return a.nx},null,null,1,0,115,"callback",365,385],
+"^":["LP;GV%-321,Hu%-321,nx%-84,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+goE:[function(a){return a.GV},null,null,1,0,330,"expanded",300,301],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,331,30,[],"expanded",300],
+gO9:[function(a){return a.Hu},null,null,1,0,330,"busy",300,301],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,331,30,[],"busy",300],
+gFR:[function(a){return a.nx},null,null,1,0,117,"callback",300,316],
 Ki:function(a){return this.gFR(a).call$0()},
 AV:function(a,b,c){return this.gFR(a).call$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,30,[],"callback",365],
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,114,30,[],"callback",300],
 Ey:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
-a.Hu=this.ct(a,C.S4,a.Hu,!1)},"call$0","goJ",0,0,114,"doneCallback"],
+a.Hu=this.ct(a,C.S4,a.Hu,!1)},"call$0","goJ",0,0,116,"doneCallback"],
 AZ:[function(a,b,c,d){var z=a.Hu
 if(z===!0)return
 if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gmd",6,0,404,131,[],187,[],280,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gmd",6,0,336,133,[],189,[],282,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2580,10 +2613,10 @@
 a.X0=w
 C.O0.ZL(a)
 C.O0.oX(a)
-return a},null,null,0,0,115,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[405],
+return a},null,null,0,0,117,"new CurlyBlockElement$created"]}},
+"+CurlyBlockElement":[337],
 LP:{
-"^":"ir+Pi;",
+"^":"xc+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
 "^":"",
 G9:function(){var z,y
@@ -2593,20 +2626,20 @@
 if(y==null)return"registerElement" in document
 return J.de(J.UQ(y,"ready"),!0)},
 wJ:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){if(B.G9())return P.Ab(null,null)
 var z=H.VM(new W.RO(document,"WebComponentsReady",!1),[null])
 return z.gtH(z)},"call$0",null,0,0,null,"call"],
 $isEH: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.call$1(z.lo)},"call$2","Mn",4,0,null,116,[],117,[]],
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.call$1(z.lo)},"call$2","Mn",4,0,null,118,[],119,[]],
 Ck:[function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.call$1(z.lo)===!0)return!0
-return!1},"call$2","cs",4,0,null,116,[],117,[]],
+return!1},"call$2","cs",4,0,null,118,[],119,[]],
 n3:[function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.call$2(b,z.lo)
-return b},"call$3","hp",6,0,null,116,[],118,[],119,[]],
+return b},"call$3","hp",6,0,null,118,[],120,[],121,[]],
 mx:[function(a,b,c){var z,y,x,w
 for(y=0;x=$.RM(),y<x.length;++y){x=x[y]
 w=a
@@ -2616,13 +2649,13 @@
 z.We(a,", ")
 z.KF(c)}finally{x=$.RM()
 if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},"call$3","FQ",6,0,null,116,[],120,[],121,[]],
+x.pop()}return z.gvM()},"call$3","FQ",6,0,null,118,[],122,[],123,[]],
 rd:[function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},"call$2","xX",4,0,null,73,[],122,[]],
+H.ZE(a,0,a.length-1,b)},"call$2","xX",4,0,null,75,[],124,[]],
 K0:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 z=J.Wx(c)
-if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"call$3","Ze",6,0,null,73,[],123,[],124,[]],
+if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"call$3","Ze",6,0,null,75,[],125,[],126,[]],
 qG:[function(a,b,c,d,e){var z,y,x,w
 H.K0(a,b,c)
 z=J.xH(c,b)
@@ -2632,7 +2665,7 @@
 if(!!y.$isList){x=e
 w=d}else{w=y.eR(d,e).tt(0,!1)
 x=0}if(J.z8(J.WB(x,z),J.q8(w)))throw H.b(new P.lj("Not enough elements"))
-H.tb(w,x,a,b,z)},"call$5","it",10,0,null,73,[],123,[],124,[],110,[],125,[]],
+H.tb(w,x,a,b,z)},"call$5","it",10,0,null,75,[],125,[],126,[],112,[],127,[]],
 IC:[function(a,b,c){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
@@ -2649,36 +2682,36 @@
 H.qG(a,z,w,a,b)
 for(z=y.gA(c);z.G();b=u){v=z.gl()
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],15,[],116,[]],
+C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,75,[],15,[],118,[]],
 ed:[function(a,b,c){var z,y
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 for(z=J.GP(c);z.G();b=y){y=b+1
-C.Nm.u(a,b,z.gl())}},"call$3","Y1",6,0,null,73,[],15,[],116,[]],
+C.Nm.u(a,b,z.gl())}},"call$3","Y1",6,0,null,75,[],15,[],118,[]],
 tb:[function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
 if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"call$5","e8",10,0,null,126,[],127,[],128,[],129,[],130,[]],
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"call$5","e8",10,0,null,128,[],129,[],130,[],131,[],132,[]],
 TK:[function(a,b,c,d){var z
 if(c>=a.length)return-1
 if(c<0)c=0
 for(z=c;z<d;++z){if(z<0||z>=a.length)return H.e(a,z)
-if(J.de(a[z],b))return z}return-1},"call$4","vu",8,0,null,131,[],132,[],85,[],133,[]],
+if(J.de(a[z],b))return z}return-1},"call$4","vu",8,0,null,133,[],134,[],87,[],135,[]],
 lO:[function(a,b,c){var z,y
 if(typeof c!=="number")return c.C()
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
 for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.de(a[y],b))return y}return-1},"call$3","MW",6,0,null,131,[],132,[],85,[]],
+if(J.de(a[y],b))return y}return-1},"call$3","MW",6,0,null,133,[],134,[],87,[]],
 ZE:[function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
-else H.d4(a,b,c,d)},"call$4","UR",8,0,null,131,[],134,[],135,[],122,[]],
+else H.d4(a,b,c,d)},"call$4","UR",8,0,null,133,[],136,[],137,[],124,[]],
 w9:[function(a,b,c,d){var z,y,x,w,v,u
 for(z=J.WB(b,1),y=J.U6(a);x=J.Wx(z),x.E(z,c);z=x.g(z,1)){w=y.t(a,z)
 v=z
 while(!0){u=J.Wx(v)
 if(!(u.D(v,b)&&J.z8(d.call$2(y.t(a,u.W(v,1)),w),0)))break
 y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},"call$4","f7",8,0,null,131,[],134,[],135,[],122,[]],
+v=u.W(v,1)}y.u(a,v,w)}},"call$4","f7",8,0,null,133,[],136,[],137,[],124,[]],
 d4:[function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
 z=J.Wx(a0)
 y=J.Ts(J.WB(z.W(a0,b),1),6)
@@ -2779,32 +2812,32 @@
 k=e}else{t.u(a,i,t.t(a,j))
 d=x.W(j,1)
 t.u(a,j,h)
-j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"call$4","Hm",8,0,null,131,[],134,[],135,[],122,[]],
+j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"call$4","Hm",8,0,null,133,[],136,[],137,[],124,[]],
 aL:{
 "^":"mW;",
 gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
-aN:[function(a,b){var z,y
+aN:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.Zv(0,y))
-if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,406,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}},
 gl0:function(a){return J.de(this.gB(this),0)},
 grZ:function(a){if(J.de(this.gB(this),0))throw H.b(new P.lj("No elements"))
 return this.Zv(0,J.xH(this.gB(this),1))},
-tg:[function(a,b){var z,y
+tg:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(J.de(this.Zv(0,y),b))return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gdj",2,0,null,132,[]],
-Vr:[function(a,b){var z,y
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
+Vr:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gGI",2,0,null,407,[]],
-zV:[function(a,b){var z,y,x,w,v,u
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
+zV:function(a,b){var z,y,x,w,v,u
 z=this.gB(this)
 if(b.length!==0){y=J.x(z)
 if(y.n(z,0))return""
@@ -2823,18 +2856,18 @@
 for(;v<z;++v){u=this.Zv(0,v)
 u=typeof u==="string"?u:H.d(u)
 w.vM=w.vM+u
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,337,338,[]],
-ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,407,[]],
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
-es:[function(a,b,c){var z,y,x
+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.A8(this,b),[null,null])},"call$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},119,[]],
+es:function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=b
 x=0
 for(;x<z;++x){y=c.call$2(y,this.Zv(0,x))
-if(z!==this.gB(this))throw H.b(P.a4(this))}return y},"call$2","gTu",4,0,null,118,[],119,[]],
-eR:[function(a,b){return H.q9(this,b,null,null)},"call$1","gZo",2,0,null,130,[]],
-tt:[function(a,b){var z,y,x
+if(z!==this.gB(this))throw H.b(P.a4(this))}return y},
+eR:function(a,b){return H.q9(this,b,null,null)},
+tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
 if(typeof y!=="number")return H.s(y)
@@ -2846,7 +2879,8 @@
 if(!(x<y))break
 y=this.Zv(0,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,340,341,[]],
+z[x]=y;++x}return z},
+br:function(a){return this.tt(a,!0)},
 $isyN:true},
 nH:{
 "^":"aL;l6,SH,AN",
@@ -2867,19 +2901,19 @@
 x=this.AN
 if(x==null||J.J5(x,z))return J.xH(z,y)
 return J.xH(x,y)},
-Zv:[function(a,b){var z=J.WB(this.gjX(),b)
+Zv:function(a,b){var z=J.WB(this.gjX(),b)
 if(J.u6(b,0)||J.J5(z,this.gMa()))throw H.b(P.TE(b,0,this.gB(this)))
-return J.i4(this.l6,z)},"call$1","gRV",2,0,null,15,[]],
-eR:[function(a,b){if(J.u6(b,0))throw H.b(new P.bJ("value "+H.d(b)))
-return H.q9(this.l6,J.WB(this.SH,b),this.AN,null)},"call$1","gZo",2,0,null,130,[]],
-qZ:[function(a,b){var z,y,x
+return J.i4(this.l6,z)},
+eR:function(a,b){if(J.u6(b,0))throw H.b(new P.bJ("value "+H.d(b)))
+return H.q9(this.l6,J.WB(this.SH,b),this.AN,null)},
+qZ:function(a,b){var z,y,x
 if(J.u6(b,0))throw H.b(new P.bJ("value "+H.d(b)))
 z=this.AN
 y=this.SH
 if(z==null)return H.q9(this.l6,y,J.WB(y,b),null)
 else{x=J.WB(y,b)
 if(J.u6(z,x))return this
-return H.q9(this.l6,y,x,null)}},"call$1","gVw",2,0,null,130,[]],
+return H.q9(this.l6,y,x,null)}},
 Hd:function(a,b,c,d){var z,y,x
 z=this.SH
 y=J.Wx(z)
@@ -2893,7 +2927,7 @@
 a7:{
 "^":"a;l6,SW,G7,lo",
 gl:function(){return this.lo},
-G:[function(){var z,y,x,w
+G:function(){var z,y,x,w
 z=this.l6
 y=J.U6(z)
 x=y.gB(z)
@@ -2903,7 +2937,7 @@
 if(w>=x){this.lo=null
 return!1}this.lo=y.Zv(z,w)
 this.G7=this.G7+1
-return!0},"call$0","gqy",0,0,null]},
+return!0}},
 i1:{
 "^":"mW;l6,T6",
 mb:function(a){return this.T6.call$1(a)},
@@ -2913,7 +2947,7 @@
 gB:function(a){return J.q8(this.l6)},
 gl0:function(a){return J.FN(this.l6)},
 grZ:function(a){return this.mb(J.MQ(this.l6))},
-Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","gRV",2,0,null,15,[]],
+Zv:function(a,b){return this.mb(J.i4(this.l6,b))},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 static:{K1:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
@@ -2924,17 +2958,17 @@
 MH:{
 "^":"AC;lo,OI,T6",
 mb:function(a){return this.T6.call$1(a)},
-G:[function(){var z=this.OI
+G:function(){var z=this.OI
 if(z.G()){this.lo=this.mb(z.gl())
 return!0}this.lo=null
-return!1},"call$0","gqy",0,0,null],
+return!1},
 gl:function(){return this.lo},
 $asAC:function(a,b){return[b]}},
 A8:{
 "^":"aL;CR,T6",
 mb:function(a){return this.T6.call$1(a)},
 gB:function(a){return J.q8(this.CR)},
-Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","gRV",2,0,null,15,[]],
+Zv:function(a,b){return this.mb(J.i4(this.CR,b))},
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
@@ -2947,8 +2981,8 @@
 SO:{
 "^":"AC;OI,T6",
 mb:function(a){return this.T6.call$1(a)},
-G:[function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
-return!1},"call$0","gqy",0,0,null],
+G:function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
+return!1},
 gl:function(){return this.OI.gl()}},
 kV:{
 "^":"mW;l6,T6",
@@ -2961,14 +2995,14 @@
 "^":"a;OI,T6,C2,lo",
 mb:function(a){return this.T6.call$1(a)},
 gl:function(){return this.lo},
-G:[function(){var z,y
+G:function(){var z,y
 z=this.C2
 if(z==null)return!1
 for(y=this.OI;!z.G();){this.lo=null
 if(y.G()){this.C2=null
 z=J.GP(this.mb(y.gl()))
 this.C2=z}else return!1}this.lo=this.C2.gl()
-return!0},"call$0","gqy",0,0,null]},
+return!0}},
 ao:{
 "^":"mW;l6,Vg",
 gA:function(a){var z=this.l6
@@ -2989,17 +3023,17 @@
 $isyN:true},
 y9:{
 "^":"AC;OI,GE",
-G:[function(){var z=J.xH(this.GE,1)
+G:function(){var z=J.xH(this.GE,1)
 this.GE=z
 if(J.J5(z,0))return this.OI.G()
 this.GE=-1
-return!1},"call$0","gqy",0,0,null],
+return!1},
 gl:function(){if(J.u6(this.GE,0))return
 return this.OI.gl()}},
 AM:{
 "^":"mW;l6,FT",
-eR:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(new P.bJ("value "+H.d(b)))
-return H.ke(this.l6,J.WB(this.FT,b),H.Kp(this,0))},"call$1","gZo",2,0,null,198,[]],
+eR:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(new P.bJ("value "+H.d(b)))
+return H.ke(this.l6,J.WB(this.FT,b),H.Kp(this,0))},
 gA:function(a){var z=this.l6
 z=new H.U1(z.gA(z),this.FT)
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -3022,43 +3056,44 @@
 $isyN:true},
 U1:{
 "^":"AC;OI,FT",
-G:[function(){var z,y,x
+G:function(){var z,y,x
 z=this.OI
 y=0
 while(!0){x=this.FT
 if(typeof x!=="number")return H.s(x)
 if(!(y<x))break
 z.G();++y}this.FT=0
-return z.G()},"call$0","gqy",0,0,null],
+return z.G()},
 gl:function(){return this.OI.gl()}},
-Ma:{
+yq:{
 "^":"a;",
-G:[function(){return!1},"call$0","gqy",0,0,null],
+G:function(){return!1},
 gl:function(){return}},
 SU7:{
 "^":"a;",
 sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,30,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gJe",4,0,null,15,[],30,[]],
-oF:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gFD",4,0,null,408,[],116,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,116,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","guH",2,0,null,132,[]],
-V1:[function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},"call$0","gRa",0,0,null],
-UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$2","gYH",4,0,null,123,[],124,[]]},
+h:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
+oF:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
+FV:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
+Rz:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
+V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
+UZ:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
 Tv:{
 "^":"a;",
-u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,15,[],30,[]],
+u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gpH",4,0,null,408,[],116,[]],
-h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,30,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gJe",4,0,null,15,[],30,[]],
-oF:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gFD",4,0,null,408,[],116,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,116,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","guH",2,0,null,132,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,82,122,[]],
-V1:[function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},"call$0","gRa",0,0,null],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$2","gYH",4,0,null,123,[],124,[]],
+Mh:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
+h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+oF:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+FV:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+Rz:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
+GT:function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},
+V1:function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},
+YW:function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+UZ:function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
 $isList:true,
 $askF:null,
 $isyN:true,
@@ -3074,21 +3109,21 @@
 iK:{
 "^":"aL;CR",
 gB:function(a){return J.q8(this.CR)},
-Zv:[function(a,b){var z,y
+Zv:function(a,b){var z,y
 z=this.CR
 y=J.U6(z)
-return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","gRV",2,0,null,15,[]]},
+return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))}},
 GD:{
 "^":"a;fN>",
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isGD&&J.de(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)+"\")"},"call$0","gXo",0,0,null],
+bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
 $isGD:true,
 $iswv:true,
-static:{"^":"RWj,yq,quP,xc,Np,p1",u1:[function(a){var z,y
+static:{"^":"RWj,z3,quP,kj,Np,p1",u1:[function(a){var z,y
 z=J.U6(a)
 if(z.gl0(a)!==!0){y=$.bw().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
@@ -3099,15 +3134,15 @@
 "^":"",
 YC:[function(a){if(a==null)return
 return new H.GD(a)},"call$1","Rc",2,0,null,12,[]],
-X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,136,[]],
+X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,138,[]],
 vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
-else return new H.iu(a,4)},"call$1","Yf",2,0,137,138,[]],
+else return new H.iu(a,4)},"call$1","Yf",2,0,139,140,[]],
 jO:[function(a){var z,y
 z=$.Sl().t(0,a)
 y=J.x(a)
 if(y.n(a,"dynamic"))return $.P8()
 if(y.n(a,"void"))return $.oj()
-return H.tT(H.YC(z==null?a:z),a)},"call$1","vC",2,0,null,139,[]],
+return H.tT(H.YC(z==null?a:z),a)},"call$1","vC",2,0,null,141,[]],
 tT:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=J.U6(b)
 y=z.u8(b,"/")
@@ -3142,15 +3177,15 @@
 if(m==null||m.length===0)x=n
 else{for(z=m.length,l="dynamic",k=1;k<z;++k)l+=",dynamic"
 x=new H.bl(n,l,null,null,null,null,null,null,null,null,null,null,null,null,null,n.If)}}$.tY[b]=x
-return x},"call$2","ER",4,0,null,136,[],139,[]],
+return x},"call$2","ER",4,0,null,138,[],141,[]],
 Vv:[function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"call$1","yM",2,0,null,140,[]],
+if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"call$1","yM",2,0,null,142,[]],
 Fk:[function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.gxV())z.u(0,x.gIf(),x)}return z},"call$1","Pj",2,0,null,140,[]],
+if(x.gxV())z.u(0,x.gIf(),x)}return z},"call$1","Pj",2,0,null,142,[]],
 vE:[function(a,b){var z,y,x,w,v
 z=P.L5(null,null,null,null,null)
 z.FV(0,b)
@@ -3158,7 +3193,7 @@
 if(x.ghB()){w=x.gIf().fN
 v=J.U6(w)
 if(!!J.x(z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))).$isRY)continue}if(x.gxV())continue
-z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,140,[],141,[]],
+z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,142,[],143,[]],
 MJ:[function(a,b){var z,y,x,w
 z=[]
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();)z.push(H.jO(y.lo))
@@ -3166,14 +3201,14 @@
 x.G()
 w=x.lo
 for(;x.G();)w=new H.BI(w,x.lo,null,null,H.YC(b))
-return w},"call$2","R9",4,0,null,142,[],139,[]],
+return w},"call$2","R9",4,0,null,144,[],141,[]],
 w2:[function(a,b){var z,y,x
 z=J.U6(a)
 y=0
 while(!0){x=z.gB(a)
 if(typeof x!=="number")return H.s(x)
 if(!(y<x))break
-if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(new P.AT("Type variable not present in list."))},"call$2","CE",4,0,null,144,[],12,[]],
+if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(new P.AT("Type variable not present in list."))},"call$2","CE",4,0,null,146,[],12,[]],
 Jf:[function(a,b){var z,y,x,w,v,u,t
 z={}
 z.a=null
@@ -3189,9 +3224,9 @@
 else{z=new H.rh(z)
 if(typeof b==="number"){t=z.call$1(b)
 if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
-return P.re(C.yQ)},"call$2","xN",4,0,null,145,[],11,[]],
+return P.re(C.yQ)},"call$2","xN",4,0,null,147,[],11,[]],
 fb:[function(a,b){if(a==null)return b
-return H.YC(H.d(a.gUx().fN)+"."+H.d(b.fN))},"call$2","WS",4,0,null,145,[],146,[]],
+return H.YC(H.d(J.GL(J.Ba(a)))+"."+H.d(b.fN))},"call$2","WS",4,0,null,147,[],148,[]],
 pj:[function(a){var z,y,x,w
 z=a["@"]
 if(z!=null)return z()
@@ -3201,7 +3236,7 @@
 return H.VM(new H.A8(y,new H.ye()),[null,null]).br(0)}x=Function.prototype.toString.call(a)
 w=C.xB.cn(x,new H.VR(H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
 if(w===-1)return C.xD;++w
-return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"call$1","C7",2,0,null,147,[]],
+return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"call$1","C7",2,0,null,149,[]],
 jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=J.x(b)
 if(!!z.$isList){y=H.Mk(z.t(b,0),",")
@@ -3212,10 +3247,10 @@
 s=x[v]
 v=t}else s=null
 r=H.pS(u,s,a,c)
-if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,145,[],148,[],66,[],56,[]],
+if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,147,[],150,[],66,[],56,[]],
 Mk:[function(a,b){var z=J.U6(a)
 if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"call$2","EO",4,0,null,14,[],103,[]],
+return z.Fr(a,b)},"call$2","EO",4,0,null,14,[],105,[]],
 BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
 default:return!1}},"call$1","IX",2,0,null,12,[]],
 Y6:[function(a){var z,y
@@ -3251,14 +3286,14 @@
 m=q==null?C.xD:q()
 J.bi(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"call$0","jc",0,0,null]}},
 nI:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){return H.VM([],[P.D4])},"call$0",null,0,0,null,"call"],
 $isEH:true},
 jU:{
 "^":"a;",
-bu:[function(a){return this.gOO()},"call$0","gXo",0,0,null],
-IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,47,[]],
-Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gR6",4,0,null,47,[],172,[]],
+bu:function(a){return this.gOO()},
+IB:function(a){throw H.b(P.SY(null))},
+Hy:function(a,b){throw H.b(P.SY(null))},
 $isej:true},
 Lj:{
 "^":"jU;MA",
@@ -3267,21 +3302,21 @@
 return z.gUQ(z).XG(0,new H.mb())},
 $isej:true},
 mb:{
-"^":"Tp:410;",
-call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:339;",
+call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,338,[],"call"],
 $isEH:true},
 cb:{
 "^":"jU;If<",
-gUx:function(){return H.fb(this.gXP(),this.gIf())},
+gUx:function(a){return H.fb(this.gXP(),this.gIf())},
 gq4:function(){return J.co(this.gIf().fN,"_")},
-bu:[function(a){return this.gOO()+" on '"+H.d(this.gIf().fN)+"'"},"call$0","gXo",0,0,null],
-jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gqi",4,0,null,49,[],50,[]],
+bu:function(a){return this.gOO()+" on '"+H.d(this.gIf().fN)+"'"},
+jd:function(a,b){throw H.b(H.Ef("Should not call _invoke"))},
 $isNL:true,
 $isej:true},
 cw:{
-"^":"EE;XP<,yG,Nz,LQ,If",
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,109,[]],
+"^":"EE;XP<,zn,Nz,LQ,If",
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},
 giO:function(a){var z,y
 z=J.v1(C.Gp.LU)
 if(typeof z!=="number")return H.s(z)
@@ -3290,7 +3325,7 @@
 gOO:function(){return"TypeVariableMirror"},
 gFo:function(){return!1},
 $iscw:true,
-$isFw:true,
+$istg:true,
 $isX9:true,
 $isNL:true,
 $isej:true},
@@ -3310,7 +3345,7 @@
 Uz:{
 "^":"uh;FP<,aP,wP,le,LB,GD<,ae<,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
 gOO:function(){return"LibraryMirror"},
-gUx:function(){return this.If},
+gUx:function(a){return this.If},
 gEO:function(){return this.gm8()},
 gqh:function(){var z,y,x
 z=this.P8
@@ -3322,7 +3357,7 @@
 x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
 this.P8=z
 return z},
-PU:[function(a,b){var z,y,x,w
+PU:function(a,b){var z,y,x,w
 z=a.gfN(a)
 if(z.Tc(0,"="))throw H.b(new P.AT(""))
 y=this.gQn()
@@ -3331,14 +3366,15 @@
 if(w==null)w=this.gcc().nb.t(0,a)
 if(w==null)throw H.b(P.lr(this,H.X7(a),[b],null,null))
 w.Hy(this,b)
-return H.vn(b)},"call$2","gtd",4,0,null,70,[],172,[]],
-rN:[function(a){var z=this.gQH().nb.t(0,a)
+return H.vn(b)},
+rN:function(a){var z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,[],null,null))
-return H.vn(z.IB(this))},"call$1","gPo",2,0,null,70,[]],
-F2:[function(a,b,c){var z=this.gQH().nb.t(0,a)
+return H.vn(z.IB(this))},
+F2:function(a,b,c){var z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,b,c,null))
 if(!!J.x(z).$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
+return H.vn(z.jd(b,c))},
+CI:function(a,b){return this.F2(a,b,null)},
 gm8:function(){var z,y,x,w,v,u,t,s,r,q,p
 z=this.SD
 if(z!=null)return z
@@ -3428,15 +3464,15 @@
 "^":"cb+M2;",
 $isej:true},
 IB:{
-"^":"Tp:411;a",
+"^":"Tp:340;a",
 call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 oP:{
-"^":"Tp:411;a",
+"^":"Tp:340;a",
 call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 YX:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){return this.a},"call$0",null,0,0,null,"call"],
 $isEH:true},
 BI:{
@@ -3445,16 +3481,17 @@
 gIf:function(){var z,y
 z=this.BB
 if(z!=null)return z
-y=this.AY.gUx().fN
+y=J.GL(J.Ba(this.AY))
 z=this.XW
-z=J.kE(y," with ")===!0?H.YC(H.d(y)+", "+H.d(z.gUx().fN)):H.YC(H.d(y)+" with "+H.d(z.gUx().fN))
+z=J.kE(y," with ")===!0?H.YC(H.d(y)+", "+H.d(J.GL(J.Ba(z)))):H.YC(H.d(y)+" with "+H.d(J.GL(J.Ba(z))))
 this.BB=z
 return z},
-gUx:function(){return this.gIf()},
+gUx:function(a){return this.gIf()},
 gYK:function(){return this.XW.gYK()},
-F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
-rN:[function(a){throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
-PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,70,[],172,[]],
+F2:function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},
+CI:function(a,b){return this.F2(a,b,null)},
+rN:function(a){throw H.b(P.lr(this,a,null,null,null))},
+PU:function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},
 gkZ:function(){return[this.XW]},
 gHA:function(){return!0},
 gJi:function(){return this},
@@ -3473,8 +3510,9 @@
 iu:{
 "^":"M2;Ax<,xq",
 gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
-F2:[function(a,b,c){var z=J.GL(a)
-return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
+F2:function(a,b,c){var z=J.GL(a)
+return this.tu(a,0,z+":"+b.length+":0",b)},
+CI:function(a,b){return this.F2(a,b,null)},
 gK8:function(){var z,y,x
 z=$.eb
 y=this.Ax
@@ -3482,7 +3520,7 @@
 x=y.constructor[z]
 if(x==null){x=H.Pq()
 y.constructor[z]=x}return x},
-tu:[function(a,b,c,d){var z,y,x,w,v
+tu:function(a,b,c,d){var z,y,x,w,v
 z=this.gK8()
 y=z[c]
 if(y==null){x=$.I6().t(0,c)
@@ -3491,11 +3529,11 @@
 y=v.ZU(this.Ax)
 z[c]=y}else v=null
 if(y.gpf()){if(v==null)v=new H.LI(a,$.I6().t(0,c),b,d,[],null)
-return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gqi",8,0,null,12,[],11,[],412,[],87,[]],
-PU:[function(a,b){var z=H.d(a.gfN(a))+"="
+return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},
+PU:function(a,b){var z=H.d(a.gfN(a))+"="
 this.tu(H.YC(z),2,z,[b])
-return H.vn(b)},"call$2","gtd",4,0,null,70,[],172,[]],
-rN:[function(a){var z,y,x,w
+return H.vn(b)},
+rN:function(a){var z,y,x,w
 $loop$0:{z=this.xq
 if(typeof z=="number"||typeof a.$p=="undefined")break $loop$0
 y=a.$p(z)
@@ -3505,8 +3543,8 @@
 else{w=H.vn(x)
 y.v=x
 y.m=w
-return w}}return this.Dm(a)},"call$1","gPo",2,0,null,70,[]],
-Dm:[function(a){var z,y,x,w,v,u,t
+return w}}return this.Dm(a)},
+Dm:function(a){var z,y,x,w,v,u,t
 z=J.GL(a)
 y=this.tu(a,1,z,C.xD)
 x=this.gK8()[z]
@@ -3522,42 +3560,42 @@
 t=x.geK()?this.QN(u,v):this.x0(u,v)
 w[z]=t
 t.v=t.m=w
-return y},"call$1","gFf",2,0,null,70,[]],
-ds:[function(a,b){if(b)return(function(b){return eval(b)})("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
-else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,413,[],414,[]],
-x0:[function(a,b){if(!b)return(function(n){return(function(o){return o[n]()})})(a)
-return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],414,[]],
-QN:[function(a,b){var z=J.x(this.Ax)
+return y},
+ds:function(a,b){if(b)return(function(b){return eval(b)})("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
+else return(function(n){return(function(c){return c[n]})})(a)},
+x0:function(a,b){if(!b)return(function(n){return(function(o){return o[n]()})})(a)
+return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},
+QN:function(a,b){var z=J.x(this.Ax)
 if(!b)return(function(n,i){return(function(o){return i[n](o)})})(a,z)
-return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gDw",4,0,null,12,[],414,[]],
-n:[function(a,b){var z,y
+return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},
+n:function(a,b){var z,y
 if(b==null)return!1
 if(!!J.x(b).$isiu){z=this.Ax
 y=b.Ax
 y=z==null?y==null:z===y
 z=y}else z=!1
-return z},"call$1","gUJ",2,0,null,109,[]],
+return z},
 giO:function(a){return J.UN(H.CU(this.Ax),909522486)},
-bu:[function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},"call$0","gXo",0,0,null],
+bu:function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},
 $isiu:true,
 $isvr:true,
 $isej:true},
 mg:{
-"^":"Tp:415;a",
+"^":"Tp:341;a",
 call$2:[function(a,b){var z,y
 z=a.gfN(a)
 y=this.a
 if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,136,[],30,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,138,[],30,[],"call"],
 $isEH:true},
 bl:{
 "^":"cb;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,dk,If",
 gOO:function(){return"ClassMirror"},
-bu:[function(a){var z,y,x
+bu:function(a){var z,y,x
 z="ClassMirror on "+H.d(this.NK.gIf().fN)
 if(this.gw8()!=null){y=z+"<"
 x=this.gw8()
-z=y+x.zV(x,", ")+">"}return z},"call$0","gXo",0,0,null],
+z=y+x.zV(x,", ")+">"}return z},
 gCr:function(){for(var z=this.gw8(),z=z.gA(z);z.G();)if(!J.de(z.lo,$.P8()))return H.d(this.NK.gCr())+"<"+this.EZ+">"
 return this.NK.gCr()},
 gNy:function(){return this.NK.gNy()},
@@ -3608,8 +3646,8 @@
 z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
-PU:[function(a,b){return this.NK.PU(a,b)},"call$2","gtd",4,0,null,70,[],172,[]],
-rN:[function(a){return this.NK.rN(a)},"call$1","gPo",2,0,null,70,[]],
+PU:function(a,b){return this.NK.PU(a,b)},
+rN:function(a){return this.NK.rN(a)},
 gXP:function(){return this.NK.gXP()},
 gc9:function(){return this.NK.gc9()},
 gAY:function(){var z=this.qN
@@ -3617,7 +3655,8 @@
 z=H.Jf(this,init.metadata[J.UQ(init.typeInformation[this.NK.gCr()],0)])
 this.qN=z
 return z},
-F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
+F2:function(a,b,c){return this.NK.F2(a,b,c)},
+CI:function(a,b){return this.F2(a,b,null)},
 gHA:function(){return!1},
 gJi:function(){return this.NK},
 gkZ:function(){var z=this.qm
@@ -3626,7 +3665,8 @@
 this.qm=z
 return z},
 gq4:function(){return J.co(this.NK.gIf().fN,"_")},
-gUx:function(){return this.NK.gUx()},
+gUx:function(a){var z=this.NK
+return z.gUx(z)},
 gYj:function(){return new H.cu(this.gCr(),null)},
 gIf:function(){return this.NK.gIf()},
 $isbl:true,
@@ -3641,20 +3681,20 @@
 y=this.a
 if(J.de(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,416,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,342,[],"call"],
 $isEH:true},
 Oo:{
-"^":"Tp:112;",
-call$1:[function(a){return-1},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return-1},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 Tc:{
-"^":"Tp:112;b",
-call$1:[function(a){return this.b.call$1(a)},"call$1",null,2,0,null,92,[],"call"],
+"^":"Tp:114;b",
+call$1:[function(a){return this.b.call$1(a)},"call$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 Ax:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,417,[],"call"],
+return a},"call$1",null,2,0,null,343,[],"call"],
 $isEH:true},
 Wf:{
 "^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,dk,jE,If",
@@ -3667,7 +3707,7 @@
 z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
 this.b0=z
 return z},
-ly:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+ly:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=this.gaB().prototype
 y=H.kU(z)
 x=H.VM([],[H.Zk])
@@ -3690,13 +3730,13 @@
 p=H.ys(n,"$",".")}}else continue
 s=H.Sd(p,q,!o,o)
 x.push(s)
-s.jE=a}return x},"call$1","gqJ",2,0,null,418,[]],
+s.jE=a}return x},
 gEO:function(){var z=this.qu
 if(z!=null)return z
 z=this.ly(this)
 this.qu=z
 return z},
-ws:[function(a){var z,y,x,w
+ws:function(a){var z,y,x,w
 z=H.VM([],[P.RY])
 y=this.H8.split(";")
 if(1>=y.length)return H.e(y,1)
@@ -3706,7 +3746,7 @@
 C.Nm.FV(x,y)}H.jw(a,x,!1,z)
 w=init.statics[this.Cr]
 if(w!=null)H.jw(a,w["^"],!0,z)
-return z},"call$1","gap",2,0,null,419,[]],
+return z},
 gTH:function(){var z=this.zE
 if(z!=null)return z
 z=this.ws(this)
@@ -3741,18 +3781,18 @@
 z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
-PU:[function(a,b){var z,y
+PU:function(a,b){var z,y
 z=this.gcc().nb.t(0,a)
 if(z!=null&&z.gFo()&&J.WO(z)!==!0){y=z.gao()
 if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
 $[y]=b
-return H.vn(b)}throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,70,[],172,[]],
-rN:[function(a){var z,y
+return H.vn(b)}throw H.b(P.lr(this,H.X7(a),[b],null,null))},
+rN:function(a){var z,y
 z=this.gcc().nb.t(0,a)
 if(z!=null&&z.gFo()){y=z.gao()
 if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
 if(y in init.lazies)return H.vn($[init.lazies[y]]())
-else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
+else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))},
 gXP:function(){var z,y
 z=this.jE
 if(z==null){if(H.SG(this.Tx))this.jE=H.jO(C.nY.LU).gXP()
@@ -3784,16 +3824,17 @@
 z=H.jO(v[0])
 this.qN=z}else{z=x.n(w,"")?this:H.jO(w)
 this.qN=z}}}return J.de(z,this)?null:this.qN},
-F2:[function(a,b,c){var z=this.ghp().nb.t(0,a)
+F2:function(a,b,c){var z=this.ghp().nb.t(0,a)
 if(z==null||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
 if(!z.tB())H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
+return H.vn(z.jd(b,c))},
+CI:function(a,b){return this.F2(a,b,null)},
 gHA:function(){return!0},
 gJi:function(){return this},
-MR:[function(a){var z,y
+MR:function(a){var z,y
 z=init.typeInformation[this.Cr]
 y=z!=null?H.VM(new H.A8(J.Ld(z,1),new H.t0(a)),[null,null]).br(0):C.Me
-return H.VM(new P.Yp(y),[P.Ms])},"call$1","gki",2,0,null,145,[]],
+return H.VM(new P.Yp(y),[P.Ms])},
 gkZ:function(){var z=this.qm
 if(z!=null)return z
 z=this.MR(this)
@@ -3822,17 +3863,17 @@
 "^":"EE+M2;",
 $isej:true},
 Ei:{
-"^":"Tp:411;a",
+"^":"Tp:340;a",
 call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 Ci:{
-"^":"Tp:112;b",
+"^":"Tp:114;b",
 call$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,417,[],"call"],
+return a},"call$1",null,2,0,null,343,[],"call"],
 $isEH:true},
 t0:{
-"^":"Tp:421;a",
-call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,420,[],"call"],
+"^":"Tp:345;a",
+call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true},
 XJ:{
 "^":"cb;ao<,V5>,Fo<,n6,jE,Ay>,le,If",
@@ -3842,10 +3883,10 @@
 gc9:function(){var z=this.le
 if(z==null){z=this.n6
 z=z==null?C.xD:z()
-this.le=z}return J.kl(z,H.Yf()).br(0)},
-IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,47,[]],
-Hy:[function(a,b){if(this.V5)throw H.b(P.lr(this,H.X7(this.If),[b],null,null))
-$[this.ao]=b},"call$2","gR6",4,0,null,47,[],172,[]],
+this.le=z}return J.qA(J.kl(z,H.Yf()))},
+IB:function(a){return $[this.ao]},
+Hy:function(a,b){if(this.V5)throw H.b(P.lr(this,H.X7(this.If),[b],null,null))
+$[this.ao]=b},
 $isRY:true,
 $isNL:true,
 $isej:true,
@@ -3876,7 +3917,7 @@
 return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
 if(a>=123&&a<=126)return a-117
 if(a>=37&&a<=43)return a-27
-return 0},"call$1","fS",2,0,null,143,[]]}},
+return 0},"call$1","fS",2,0,null,145,[]]}},
 Sz:{
 "^":"iu;Ax,xq",
 gMj:function(a){var z,y,x,w,v,u,t,s
@@ -3901,7 +3942,7 @@
 s=H.Sd(t,u,!1,!1)}else s=new H.Zk(y[x],v,!1,!1,!0,!1,!1,null,null,null,null,H.YC(x))
 y.constructor[z]=s
 return s},
-bu:[function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},"call$0","gXo",0,0,null],
+bu:function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},
 $isvr:true,
 $isej:true},
 Zk:{
@@ -3911,7 +3952,7 @@
 if(z!=null)return z
 this.gc9()
 return this.H3},
-tB:[function(){return"$reflectable" in this.dl},"call$0","gX1",0,0,null],
+tB:function(){return"$reflectable" in this.dl},
 gXP:function(){return this.jE},
 gdw:function(){this.gc9()
 return this.wM},
@@ -3930,7 +3971,7 @@
 else this.wM=t.gdw()
 s=v.Mo
 for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.Rv,q=v.Rn,p=v.hG,o=0;z.G();o=h){n=z.lo
-m=init.metadata[q[2*o+p+3]]
+m=v.XL(o)
 l=q[2*o+p+3+1]
 k=J.RE(n)
 if(o<r)j=new H.fu(this,k.gAy(n),!1,!1,null,l,H.YC(m))
@@ -3940,13 +3981,13 @@
 w[o]=j}}this.H3=H.VM(new P.Yp(w),[P.Ys])
 z=H.VM(new P.Yp(J.kl(y,H.Yf())),[null])
 this.le=z}return z},
-jd:[function(a,b){if(!this.Fo&&!this.xV)throw H.b(H.Ef("Cannot invoke instance method without receiver."))
+jd:function(a,b){if(!this.Fo&&!this.xV)throw H.b(H.Ef("Cannot invoke instance method without receiver."))
 if(!J.de(this.Yq,a.length)||this.dl==null)throw H.b(P.lr(this.gXP(),this.If,a,b,null))
-return this.dl.apply($,P.F(a,!0,null))},"call$2","gqi",4,0,null,49,[],50,[]],
-IB:[function(a){if(this.lT)return this.jd([],null)
-else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,47,[]],
-Hy:[function(a,b){if(this.hB)return this.jd([b],null)
-else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gR6",4,0,null,47,[],172,[]],
+return this.dl.apply($,P.F(a,!0,null))},
+IB:function(a){if(this.lT)return this.jd([],null)
+else throw H.b(P.SY("getField on "+H.d(a)))},
+Hy:function(a,b){if(this.hB)return this.jd([b],null)
+else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},
 guU:function(){return!this.lT&&!this.hB&&!this.xV},
 $isZk:true,
 $isRS:true,
@@ -3973,19 +4014,18 @@
 gt5:function(a){return H.Jf(this.XP,this.Ay)},
 gFo:function(){return!1},
 gV5:function(a){return!1},
-gc9:function(){return J.kl(this.QY,new H.wt()).br(0)},
+gc9:function(){return J.qA(J.kl(this.QY,new H.wt()))},
 $isYs:true,
 $isRY:true,
 $isNL:true,
 $isej:true},
 wt:{
-"^":"Tp:422;",
-call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,420,[],"call"],
+"^":"Tp:346;",
+call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true},
 ng:{
 "^":"cb;Cr<,CM,If",
 gP:function(a){return this.CM},
-r6:function(a,b){return this.gP(this).call$1(b)},
 gOO:function(){return"TypedefMirror"},
 gYj:function(){return H.vh(P.SY(null))},
 gJi:function(){return H.vh(P.SY(null))},
@@ -4001,14 +4041,15 @@
 gAY:function(){return H.vh(P.SY(null))},
 gkZ:function(){return H.vh(P.SY(null))},
 gYK:function(){return H.vh(P.SY(null))},
-F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
-rN:[function(a){return H.vh(P.SY(null))},"call$1","gPo",2,0,null,70,[]],
-PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],30,[]],
+F2:function(a,b,c){return H.vh(P.SY(null))},
+CI:function(a,b){return this.F2(a,b,null)},
+rN:function(a){return H.vh(P.SY(null))},
+PU:function(a,b){return H.vh(P.SY(null))},
 gNy:function(){return H.vh(P.SY(null))},
 gw8:function(){return H.vh(P.SY(null))},
 gJi:function(){return H.vh(P.SY(null))},
 gIf:function(){return H.vh(P.SY(null))},
-gUx:function(){return H.vh(P.SY(null))},
+gUx:function(a){return H.vh(P.SY(null))},
 gq4:function(){return H.vh(P.SY(null))},
 gc9:function(){return H.vh(P.SY(null))}},
 Ar:{
@@ -4036,7 +4077,7 @@
 y.push(new H.fu(this,z.named[u],!1,!1,null,C.iH,H.YC(u)))}z=H.VM(new P.Yp(y),[P.Ys])
 this.zM=z
 return z},
-bu:[function(a){var z,y,x,w,v,u
+bu:function(a){var z,y,x,w,v,u
 z=this.o3
 if(z!=null)return z
 z=this.d9
@@ -4051,7 +4092,7 @@
 else x="ret" in z?C.xB.g(x,H.Ko(z.ret,null)):x+"dynamic"
 z=x+"'"
 this.o3=z
-return z},"call$0","gXo",0,0,null],
+return z},
 gah:function(){return H.vh(P.SY(null))},
 V7:function(a,b){return this.gah().call$2(a,b)},
 nQ:function(a){return this.gah().call$1(a)},
@@ -4060,7 +4101,7 @@
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:423;a",
+"^":"Tp:347;a",
 call$1:[function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
@@ -4068,7 +4109,7 @@
 return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 jB:{
-"^":"Tp:424;b",
+"^":"Tp:348;b",
 call$1:[function(a){var z,y
 z=this.b.call$1(a)
 y=J.x(z)
@@ -4079,33 +4120,32 @@
 return z.gCr()},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 ye:{
-"^":"Tp:422;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,420,[],"call"],
+"^":"Tp:346;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:422;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,420,[],"call"],
+"^":"Tp:346;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true},
 Oh:{
 "^":"a;nb",
 gB:function(a){return this.nb.X5},
 gl0:function(a){return this.nb.X5===0},
 gor:function(a){return this.nb.X5!==0},
-t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,48,[]],
-x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,48,[]],
-di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,30,[]],
-aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-gvc:function(a){var z=this.nb
+t:function(a,b){return this.nb.t(0,b)},
+x4:function(a){return this.nb.x4(a)},
+di:function(a){return this.nb.di(a)},
+aN:function(a,b){return this.nb.aN(0,b)},
+gvc:function(){var z=this.nb
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gUQ:function(a){var z=this.nb
 return z.gUQ(z)},
-u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,48,[],30,[]],
-FV:[function(a,b){return H.kT()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,48,[]],
-V1:[function(a){return H.kT()},"call$0","gRa",0,0,null],
+u:function(a,b,c){return H.kT()},
+FV:function(a,b){return H.kT()},
+Rz:function(a,b){H.kT()},
+V1:function(a){return H.kT()},
 $isZ0:true,
-static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","lY",0,0,null]}},
-"^":"zix<"}],["dart._js_names","dart:_js_names",,H,{
+static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","lY",0,0,null]}}}],["dart._js_names","dart:_js_names",,H,{
 "^":"",
 hY:[function(a,b){var z,y,x,w,v,u,t
 z=H.kU(a)
@@ -4114,10 +4154,10 @@
 u=a[v]
 y.u(0,v,u)
 if(w){t=J.rY(v)
-if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"call$2","BH",4,0,null,149,[],150,[]],
+if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"call$2","BH",4,0,null,151,[],152,[]],
 YK:[function(a){var z=H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,J.O])
 a.aN(0,new H.Xh(z))
-return z},"call$1","OX",2,0,null,151,[]],
+return z},"call$1","OX",2,0,null,153,[]],
 kU:[function(a){var z=H.VM((function(victim, hasOwnProperty) {
   var result = [];
   for (var key in victim) {
@@ -4126,16 +4166,16 @@
   return result;
 })(a, Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
-return z},"call$1","DF",2,0,null,147,[]],
+return z},"call$1","DF",2,0,null,149,[]],
 Xh:{
-"^":"Tp:425;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],412,[],"call"],
+"^":"Tp:350;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,141,[],349,[],"call"],
 $isEH:true}}],["dart.async","dart:async",,P,{
 "^":"",
 VH:[function(a,b){var z=H.N7()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
-else return b.cR(a)},"call$2","p3",4,0,null,152,[],153,[]],
+else return b.cR(a)},"call$2","zZ",4,0,null,154,[],155,[]],
 e4:function(a,b){var z=P.Dt(b)
 P.rT(C.ny,new P.ZC(a,z))
 return z},
@@ -4147,7 +4187,7 @@
 try{P.Cx()}catch(z){H.Ru(z)
 P.jL(C.ny,P.qZ())
 $.S6=$.S6.gaw()
-throw z}},"call$0","qZ",0,0,114],
+throw z}},"call$0","qZ",0,0,116],
 IA:[function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
@@ -4155,11 +4195,11 @@
 $.S6=z
 P.jL(C.ny,P.qZ())}else{y=new P.OM(a,null)
 z.aw=y
-$.k8=y}},"call$1","e6",2,0,null,155,[]],
+$.k8=y}},"call$1","e6",2,0,null,157,[]],
 rb:[function(a){var z
 if(J.de($.X3,C.NU)){$.X3.wr(a)
 return}z=$.X3
-z.wr(z.xi(a,!0))},"call$1","Rf",2,0,null,155,[]],
+z.wr(z.xi(a,!0))},"call$1","Rf",2,0,null,157,[]],
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -4173,56 +4213,56 @@
 return}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-$.X3.hk(y,x)}},"call$1","DC",2,0,null,156,[]],
-YE:[function(a){},"call$1","bZ",2,0,157,30,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,158,82,159,[],160,[]],
-dL:[function(){},"call$0","v3",0,0,114],
+$.X3.hk(y,x)}},"call$1","DC",2,0,null,158,[]],
+YE:[function(a){},"call$1","bZ",2,0,159,30,[]],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,160,84,161,[],162,[]],
+dL:[function(){},"call$0","v3",0,0,116],
 FE:[function(a,b,c){var z,y,x,w
 try{b.call$1(a.call$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
-c.call$2(z,y)}},"call$3","CV",6,0,null,161,[],162,[],163,[]],
+c.call$2(z,y)}},"call$3","CV",6,0,null,163,[],164,[],165,[]],
 NX:[function(a,b,c,d){a.ed()
-b.K5(c,d)},"call$4","QD",8,0,null,164,[],165,[],159,[],160,[]],
-TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,164,[],165,[]],
+b.K5(c,d)},"call$4","QD",8,0,null,166,[],167,[],161,[],162,[]],
+TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,166,[],167,[]],
 Bb:[function(a,b,c){a.ed()
-b.rX(c)},"call$3","E1",6,0,null,164,[],165,[],30,[]],
+b.rX(c)},"call$3","E1",6,0,null,166,[],167,[],30,[]],
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
 jL:[function(a,b){var z=a.gVs()
-return H.cy(z<0?0:z,b)},"call$2","et",4,0,null,166,[],155,[]],
+return H.cy(z<0?0:z,b)},"call$2","et",4,0,null,168,[],157,[]],
 PJ:[function(a){var z=$.X3
 $.X3=a
-return z},"call$1","kb",2,0,null,153,[]],
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"call$5","Gx",10,0,167,168,[],169,[],153,[],159,[],160,[]],
+return z},"call$1","kb",2,0,null,155,[]],
+L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"call$5","Gx",10,0,169,170,[],171,[],155,[],161,[],162,[]],
 T8:[function(a,b,c,d){var z,y
 if(J.de($.X3,c))return d.call$0()
 z=P.PJ(c)
 try{y=d.call$0()
-return y}finally{$.X3=z}},"call$4","AI",8,0,170,168,[],169,[],153,[],117,[]],
+return y}finally{$.X3=z}},"call$4","AI",8,0,172,170,[],171,[],155,[],119,[]],
 V7:[function(a,b,c,d,e){var z,y
 if(J.de($.X3,c))return d.call$1(e)
 z=P.PJ(c)
 try{y=d.call$1(e)
-return y}finally{$.X3=z}},"call$5","MM",10,0,171,168,[],169,[],153,[],117,[],172,[]],
+return y}finally{$.X3=z}},"call$5","MM",10,0,173,170,[],171,[],155,[],119,[],174,[]],
 Qx:[function(a,b,c,d,e,f){var z,y
 if(J.de($.X3,c))return d.call$2(e,f)
 z=P.PJ(c)
 try{y=d.call$2(e,f)
-return y}finally{$.X3=z}},"call$6","l4",12,0,173,168,[],169,[],153,[],117,[],59,[],60,[]],
-Ee:[function(a,b,c,d){return d},"call$4","EU",8,0,174,168,[],169,[],153,[],117,[]],
-cQ:[function(a,b,c,d){return d},"call$4","zi",8,0,175,168,[],169,[],153,[],117,[]],
-VI:[function(a,b,c,d){return d},"call$4","uu",8,0,176,168,[],169,[],153,[],117,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"call$4","G2",8,0,177,168,[],169,[],153,[],117,[]],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"call$5","KF",10,0,178,168,[],169,[],153,[],166,[],155,[]],
-XB:[function(a,b,c,d){H.qw(d)},"call$4","YM",8,0,179,168,[],169,[],153,[],180,[]],
-CI:[function(a){J.O2($.X3,a)},"call$1","Fl",2,0,181,180,[]],
+return y}finally{$.X3=z}},"call$6","l4",12,0,175,170,[],171,[],155,[],119,[],59,[],60,[]],
+Ee:[function(a,b,c,d){return d},"call$4","EU",8,0,176,170,[],171,[],155,[],119,[]],
+cQ:[function(a,b,c,d){return d},"call$4","zi",8,0,177,170,[],171,[],155,[],119,[]],
+VI:[function(a,b,c,d){return d},"call$4","uu",8,0,178,170,[],171,[],155,[],119,[]],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"call$4","G2",8,0,179,170,[],171,[],155,[],119,[]],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"call$5","KF",10,0,180,170,[],171,[],155,[],168,[],157,[]],
+XB:[function(a,b,c,d){H.qw(d)},"call$4","YM",8,0,181,170,[],171,[],155,[],182,[]],
+CI:[function(a){J.O2($.X3,a)},"call$1","Fl",2,0,183,182,[]],
 UA:[function(a,b,c,d,e){var z
 $.oK=P.Fl()
 z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"call$5","hn",10,0,182,168,[],169,[],153,[],183,[],184,[]],
+return new P.uo(c,d,z)},"call$5","hn",10,0,184,170,[],171,[],155,[],185,[],186,[]],
 Ca:{
 "^":"a;kc>,I4<",
 $isGe:true},
@@ -4231,65 +4271,65 @@
 JI:{
 "^":"yU;Ae@,iE@,SJ@,Y8,dB,o7,Bd,Lj,Gv,lz,Ri",
 gY8:function(){return this.Y8},
-uR:[function(a){var z=this.Ae
+uR:function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
-return(z&1)===a},"call$1","gLM",2,0,null,426,[]],
-Ac:[function(){var z=this.Ae
+return(z&1)===a},
+Ac:function(){var z=this.Ae
 if(typeof z!=="number")return z.w()
-this.Ae=z^1},"call$0","gUe",0,0,null],
+this.Ae=z^1},
 gP4:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&2)!==0},
-dK:[function(){var z=this.Ae
+dK:function(){var z=this.Ae
 if(typeof z!=="number")return z.k()
-this.Ae=z|4},"call$0","gno",0,0,null],
+this.Ae=z|4},
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){},"call$0","gp4",0,0,114],
-LP:[function(){},"call$0","gZ9",0,0,114],
+uO:[function(){},"call$0","gp4",0,0,116],
+LP:[function(){},"call$0","gZ9",0,0,116],
 static:{"^":"FJ,CM,VCd"}},
 WVu:{
 "^":"a;iE@,SJ@",
 gRW:function(){return!1},
 gP4:function(){return(this.Gv&2)!==0},
-SL:[function(){var z=this.Ip
+SL:function(){var z=this.Ip
 if(z!=null)return z
 z=P.Dt(null)
 this.Ip=z
-return z},"call$0","gop",0,0,null],
-p1:[function(a){var z,y
+return z},
+p1:function(a){var z,y
 z=a.gSJ()
 y=a.giE()
 z.siE(y)
 y.sSJ(z)
 a.sSJ(a)
-a.siE(a)},"call$1","gCL",2,0,null,164,[]],
-j0:[function(a){if(a.giE()===a)return
+a.siE(a)},
+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()}},"call$1","gOr",2,0,null,164,[]],
-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")},"call$0","gVo",0,0,null],
+if((this.Gv&2)===0&&this.iE===this)this.Of()}},
+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)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},236,[]],
+this.Iv(b)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},238,[]],
 fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,427,82,159,[],160,[]],
-cO:[function(a){var z,y
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,351,84,161,[],162,[]],
+cO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
 if(z>=4)throw H.b(this.q7())
 this.Gv=z|4
 y=this.SL()
 this.SY()
-return y},"call$0","gJK",0,0,null],
-Rg:[function(a,b){this.Iv(b)},"call$1","gHR",2,0,null,236,[]],
-V8:[function(a,b){this.pb(a,b)},"call$2","gEm",4,0,null,159,[],160,[]],
-Qj:[function(){var z=this.WX
+return y},
+Rg:function(a,b){this.Iv(b)},
+V8:function(a,b){this.pb(a,b)},
+Qj:function(){var z=this.WX
 this.WX=null
 this.Gv=this.Gv&4294967287
-C.jN.tZ(z)},"call$0","gS2",0,0,null],
-nE:[function(a){var z,y,x,w
+C.jN.tZ(z)},
+nE:function(a){var z,y,x,w
 z=this.Gv
 if((z&2)!==0)throw H.b(new P.lj("Cannot fire new event. Controller is already firing an event"))
 y=this.iE
@@ -4308,53 +4348,53 @@
 y.sAe(z&4294967293)
 y=w}else y=y.giE()
 this.Gv=this.Gv&4294967293
-if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,406,[]],
-Of:[function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
-P.ot(this.QC)},"call$0","gRj",0,0,null]},
+if(this.iE===this)this.Of()},
+Of:function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
+P.ot(this.QC)}},
 dz:{
 "^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
-Iv:[function(a){var z=this.iE
+Iv:function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.Gv=this.Gv|2
 this.iE.Rg(0,a)
 this.Gv=this.Gv&4294967293
 if(this.iE===this)this.Of()
-return}this.nE(new P.tK(this,a))},"call$1","gm9",2,0,null,236,[]],
-pb:[function(a,b){if(this.iE===this)return
-this.nE(new P.OR(this,a,b))},"call$2","gTb",4,0,null,159,[],160,[]],
-SY:[function(){if(this.iE!==this)this.nE(new P.Bg(this))
-else this.Ip.OH(null)},"call$0","gXm",0,0,null]},
+return}this.nE(new P.tK(this,a))},
+pb:function(a,b){if(this.iE===this)return
+this.nE(new P.OR(this,a,b))},
+SY:function(){if(this.iE!==this)this.nE(new P.Bg(this))
+else this.Ip.OH(null)}},
 tK:{
 "^":"Tp;a,b",
-call$1:[function(a){a.Rg(0,this.b)},"call$1",null,2,0,null,164,[],"call"],
+call$1:[function(a){a.Rg(0,this.b)},"call$1",null,2,0,null,166,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 OR:{
 "^":"Tp;a,b,c",
-call$1:[function(a){a.V8(this.b,this.c)},"call$1",null,2,0,null,164,[],"call"],
+call$1:[function(a){a.V8(this.b,this.c)},"call$1",null,2,0,null,166,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 Bg:{
 "^":"Tp;a",
-call$1:[function(a){a.Qj()},"call$1",null,2,0,null,164,[],"call"],
+call$1:[function(a){a.Qj()},"call$1",null,2,0,null,166,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"m6",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
 "^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
-Iv:[function(a){var z,y
+Iv:function(a){var z,y
 for(z=this.iE;z!==this;z=z.giE()){y=new P.LV(a,null)
 y.$builtinTypeInfo=[null]
-z.w6(y)}},"call$1","gm9",2,0,null,236,[]],
-pb:[function(a,b){var z
-for(z=this.iE;z!==this;z=z.giE())z.w6(new P.DS(a,b,null))},"call$2","gTb",4,0,null,159,[],160,[]],
-SY:[function(){var z=this.iE
+z.w6(y)}},
+pb:function(a,b){var z
+for(z=this.iE;z!==this;z=z.giE())z.w6(new P.DS(a,b,null))},
+SY:function(){var z=this.iE
 if(z!==this)for(;z!==this;z=z.giE())z.w6(C.Wj)
-else this.Ip.OH(null)},"call$0","gXm",0,0,null]},
+else this.Ip.OH(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
 ZC:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){var z,y,x,w
 try{this.b.rX(this.a.call$0())}catch(x){w=H.Ru(x)
 z=w
@@ -4367,12 +4407,12 @@
 "^":"Ia;MM",
 oo:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,428,82,30,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,352,84,30,[]],
 w0:[function(a,b){var z
 if(a==null)throw H.b(new P.AT("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(new P.lj("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,427,82,159,[],160,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,351,84,161,[],162,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -4384,51 +4424,53 @@
 gyK:function(){return this.Gv===2?null:this.As},
 go7:function(){return this.Gv===2?null:this.qV},
 gIa:function(){return this.Gv===2?null:this.o4},
-Rx:[function(a,b){var z,y
+Rx:function(a,b){var z,y
 z=$.X3
 y=H.VM(new P.vs(0,z,null,null,z.cR(a),null,P.VH(b,$.X3),null),[null])
 this.au(y)
-return y},function(a){return this.Rx(a,null)},"ml","call$2$onError",null,"grf",2,3,null,82,117,[],163,[]],
-yd:[function(a,b){var z,y,x
+return y},
+ml:function(a){return this.Rx(a,null)},
+yd:function(a,b){var z,y,x
 z=$.X3
 y=P.VH(a,z)
 x=H.VM(new P.vs(0,z,null,null,null,$.X3.cR(b),y,null),[null])
 this.au(x)
-return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],407,[]],
-YM:[function(a){var z,y
+return x},
+OA:function(a){return this.yd(a,null)},
+YM:function(a){var z,y
 z=$.X3
 y=new P.vs(0,z,null,null,null,null,null,z.Al(a))
 y.$builtinTypeInfo=this.$builtinTypeInfo
 this.au(y)
-return y},"call$1","gE1",2,0,null,406,[]],
+return y},
 gDL:function(){return this.jk},
 gcG:function(){return this.jk},
-Am:[function(a){this.Gv=4
-this.jk=a},"call$1","goU",2,0,null,30,[]],
-E6:[function(a,b){this.Gv=8
-this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,159,[],160,[]],
-au:[function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
+Am:function(a){this.Gv=4
+this.jk=a},
+E6:function(a,b){this.Gv=8
+this.jk=new P.Ca(a,b)},
+au:function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
 else{a.sBQ(this.jk)
-this.jk=a}},"call$1","gXA",2,0,null,301,[]],
-L3:[function(){var z,y,x
+this.jk=a}},
+L3:function(){var z,y,x
 z=this.jk
 this.jk=null
 for(y=null;z!=null;y=z,z=x){x=z.gBQ()
-z.sBQ(y)}return y},"call$0","gAw",0,0,null],
-rX:[function(a){var z,y
+z.sBQ(y)}return y},
+rX:function(a){var z,y
 z=J.x(a)
 if(!!z.$isb8)if(!!z.$isvs)P.A9(a,this)
 else P.k3(a,this)
 else{y=this.L3()
 this.Am(a)
-P.HZ(this,y)}},"call$1","gBO",2,0,null,30,[]],
-R8:[function(a){var z=this.L3()
+P.HZ(this,y)}},
+R8:function(a){var z=this.L3()
 this.Am(a)
-P.HZ(this,z)},"call$1","gFt",2,0,null,30,[]],
+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","call$2","call$1","gbY",2,2,158,82,159,[],160,[]],
-OH:[function(a){var z
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","call$2","call$1","gaq",2,2,160,84,161,[],162,[]],
+OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
 if(z>=4&&z===8){if(this.Gv!==0)H.vh(P.w("Future already completed"))
@@ -4436,10 +4478,10 @@
 this.Lj.wr(new P.rH(this,a))}else P.A9(a,this)}else P.k3(a,this)
 return}}if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
-this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,30,[]],
-CG:[function(a,b){if(this.Gv!==0)H.vh(new P.lj("Future already completed"))
+this.Lj.wr(new P.cX(this,a))},
+CG:function(a,b){if(this.Gv!==0)H.vh(new P.lj("Future already completed"))
 this.Gv=1
-this.Lj.wr(new P.ZL(this,a,b))},"call$2","glC",4,0,null,159,[],160,[]],
+this.Lj.wr(new P.ZL(this,a,b))},
 X8:function(a,b,c){this.CG(a,b)},
 L7:function(a,b){this.OH(a)},
 $isvs:true,
@@ -4449,14 +4491,14 @@
 return z},Vu:function(a,b,c){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
 return z},k3:[function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,33,[],79,[]],A9:[function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,33,[],81,[]],A9:[function(a,b){b.swG(!0)
 if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},"call$2","dd",4,0,null,33,[],79,[]],yE:[function(a,b){var z
+else a.au(b)},"call$2","dd",4,0,null,33,[],81,[]],yE:[function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"call$2","cN",4,0,null,33,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
+continue}else break}while(!0)},"call$2","cN",4,0,null,33,[],156,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -4494,33 +4536,33 @@
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=q}},"call$2","XX",4,0,null,33,[],154,[]]}},
+b=q}},"call$2","XX",4,0,null,33,[],156,[]]}},
 da:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){P.HZ(this.a,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pV:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 U7:{
-"^":"Tp:429;b",
-call$2:[function(a,b){this.b.K5(a,b)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
+"^":"Tp:353;b",
+call$2:[function(a,b){this.b.K5(a,b)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,84,161,[],162,[],"call"],
 $isEH:true},
 rH:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){P.A9(this.b,this.a)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 cX:{
-"^":"Tp:115;c,d",
+"^":"Tp:117;c,d",
 call$0:[function(){this.c.R8(this.d)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"Tp:115;a,b,c",
+"^":"Tp:117;a,b,c",
 call$0:[function(){this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:399;b,d,e,f",
+"^":"Tp:330;b,d,e,f",
 call$0:[function(){var z,y,x,w
 try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
@@ -4530,7 +4572,7 @@
 return!1}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 RW:{
-"^":"Tp:114;c,b,UI,bK",
+"^":"Tp:116;c,b,UI,bK",
 call$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
@@ -4566,7 +4608,7 @@
 r.b=!1}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 RT:{
-"^":"Tp:114;c,b,Gq,Rm,w3",
+"^":"Tp:116;c,b,Gq,Rm,w3",
 call$0:[function(){var z,y,x,w,v,u
 z={}
 z.a=null
@@ -4586,121 +4628,121 @@
 z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 jZ:{
-"^":"Tp:112;c,HZ",
-call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,430,[],"call"],
+"^":"Tp:114;c,HZ",
+call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,354,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:429;a,mG",
+"^":"Tp:353;a,mG",
 call$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.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,84,161,[],162,[],"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.call$0()}},
 qh:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,431,[]],
-tg:[function(a,b){var z,y
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")},355,[]],
+tg:function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
 z.a=null
-z.a=this.KR(new P.YJ(z,this,b,y),!0,new P.DO(y),y.gbY())
-return y},"call$1","gdj",2,0,null,107,[]],
-aN:[function(a,b){var z,y
+z.a=this.KR(new P.YJ(z,this,b,y),!0,new P.DO(y),y.gaq())
+return y},
+aN:function(a,b){var z,y
 z={}
 y=P.Dt(null)
 z.a=null
-z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gbY())
-return y},"call$1","gjw",2,0,null,406,[]],
-Vr:[function(a,b){var z,y
+z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gaq())
+return y},
+Vr:function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
 z.a=null
-z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gbY())
-return y},"call$1","gGI",2,0,null,407,[]],
+z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gaq())
+return y},
 gB:function(a){var z,y
 z={}
 y=P.Dt(J.im)
 z.a=0
-this.KR(new P.B5(z),!0,new P.PI(z,y),y.gbY())
+this.KR(new P.B5(z),!0,new P.PI(z,y),y.gaq())
 return y},
 gl0:function(a){var z,y
 z={}
 y=P.Dt(J.kn)
 z.a=null
-z.a=this.KR(new P.j4(z,y),!0,new P.i9(y),y.gbY())
+z.a=this.KR(new P.j4(z,y),!0,new P.i9(y),y.gaq())
 return y},
-br:[function(a){var z,y
+br:function(a){var z,y
 z=H.VM([],[H.ip(this,"qh",0)])
 y=P.Dt([J.Q,H.ip(this,"qh",0)])
-this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gbY())
-return y},"call$0","gdn",0,0,null],
-qZ:[function(a,b){var z=H.VM(new P.Zz(b,this),[null])
+this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gaq())
+return y},
+qZ:function(a,b){var z=H.VM(new P.Zz(b,this),[null])
 z.K6(this,b,null)
-return z},"call$1","gVw",2,0,null,130,[]],
-eR:[function(a,b){var z=H.VM(new P.dq(b,this),[null])
+return z},
+eR:function(a,b){var z=H.VM(new P.dq(b,this),[null])
 z.U6(this,b,null)
-return z},"call$1","gZo",2,0,null,130,[]],
+return z},
 gtH:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"qh",0))
 z.a=null
-z.a=this.KR(new P.lU(z,this,y),!0,new P.OC(y),y.gbY())
+z.a=this.KR(new P.lU(z,this,y),!0,new P.OC(y),y.gaq())
 return y},
 grZ:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"qh",0))
 z.a=null
 z.b=!1
-this.KR(new P.UH(z,this),!0,new P.Z5(z,y),y.gbY())
+this.KR(new P.UH(z,this),!0,new P.Z5(z,y),y.gaq())
 return y},
-Zv:[function(a,b){var z,y
+Zv:function(a,b){var z,y
 z={}
 z.a=b
 if(typeof b!=="number"||Math.floor(b)!==b||J.u6(b,0))throw H.b(new P.AT(z.a))
 y=P.Dt(H.ip(this,"qh",0))
 z.b=null
-z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gbY())
-return y},"call$1","gRV",2,0,null,15,[]],
+z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gaq())
+return y},
 $isqh:true},
 YJ:{
 "^":"Tp;a,b,c,d",
 call$1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,132,[],"call"],
+P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,134,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 jv:{
-"^":"Tp:115;e,f",
+"^":"Tp:117;e,f",
 call$0:[function(){return J.de(this.f,this.e)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 LB:{
-"^":"Tp:400;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,432,[],"call"],
+"^":"Tp:331;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,356,[],"call"],
 $isEH:true},
 DO:{
-"^":"Tp:115;bK",
+"^":"Tp:117;bK",
 call$0:[function(){this.bK.rX(!1)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"Tp;a,b,c,d",
-call$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"call$1",null,2,0,null,132,[],"call"],
+call$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"call$1",null,2,0,null,134,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Rl:{
-"^":"Tp:115;e,f",
+"^":"Tp:117;e,f",
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Jb:{
-"^":"Tp:112;",
-call$1:[function(a){},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 M4:{
-"^":"Tp:115;UI",
+"^":"Tp:117;UI",
 call$0:[function(){this.UI.rX(null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Jp:{
@@ -4708,45 +4750,45 @@
 call$1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,132,[],"call"],
+P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,134,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 h7:{
-"^":"Tp:115;e,f",
+"^":"Tp:117;e,f",
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pr:{
-"^":"Tp:400;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,432,[],"call"],
+"^":"Tp:331;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,356,[],"call"],
 $isEH:true},
 eN:{
-"^":"Tp:115;bK",
+"^":"Tp:117;bK",
 call$0:[function(){this.bK.rX(!1)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 B5:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=this.a
-z.a=z.a+1},"call$1",null,2,0,null,113,[],"call"],
+z.a=z.a+1},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 PI:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){this.b.rX(this.a.a)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 j4:{
-"^":"Tp:112;a,b",
-call$1:[function(a){P.Bb(this.a.a,this.b,!1)},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;a,b",
+call$1:[function(a){P.Bb(this.a.a,this.b,!1)},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 i9:{
-"^":"Tp:115;c",
+"^":"Tp:117;c",
 call$0:[function(){this.c.rX(!0)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 VV:{
 "^":"Tp;a,b",
-call$1:[function(a){this.b.push(a)},"call$1",null,2,0,null,236,[],"call"],
+call$1:[function(a){this.b.push(a)},"call$1",null,2,0,null,238,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.a,"qh")}},
 Dy:{
-"^":"Tp:115;c,d",
+"^":"Tp:117;c,d",
 call$0:[function(){this.d.rX(this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 lU:{
@@ -4755,7 +4797,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 OC:{
-"^":"Tp:115;d",
+"^":"Tp:117;d",
 call$0:[function(){this.d.Lp(new P.lj("No elements"))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
@@ -4766,7 +4808,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Z5:{
-"^":"Tp:115;a,c",
+"^":"Tp:117;a,c",
 call$0:[function(){var z=this.a
 if(z.b){this.c.rX(z.a)
 return}this.c.Lp(new P.lj("No elements"))},"call$0",null,0,0,null,"call"],
@@ -4779,7 +4821,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 ii:{
-"^":"Tp:115;a,d",
+"^":"Tp:117;a,d",
 call$0:[function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 MO:{
@@ -4787,7 +4829,7 @@
 $isMO:true},
 O9:{
 "^":"ez;",
-w4:[function(a){var z,y,x,w
+w4:function(a){var z,y,x,w
 z=this.Y8
 if((z.Gv&4)!==0)H.vh(new P.lj("Subscribing to closed stream"))
 y=$.X3
@@ -4802,100 +4844,101 @@
 z.SJ=w
 w.Ae=z.Gv&1
 if(z.iE===w)P.ot(z.nL)
-return w},"call$1","gmn",2,0,null,433,[]],
+return w},
 giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
-n:[function(a,b){if(b==null)return!1
+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},"call$1","gUJ",2,0,null,109,[]],
+return b.Y8===this.Y8},
 $isO9:true},
 yU:{
 "^":"KA;Y8<",
-tA:[function(){return this.gY8().j0(this)},"call$0","gQC",0,0,null],
-uO:[function(){this.gY8()},"call$0","gp4",0,0,114],
-LP:[function(){this.gY8()},"call$0","gZ9",0,0,114]},
+tA:function(){return this.gY8().j0(this)},
+uO:[function(){this.gY8()},"call$0","gp4",0,0,116],
+LP:[function(){this.gY8()},"call$0","gZ9",0,0,116]},
 nP:{
 "^":"a;"},
 KA:{
 "^":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
-fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,434,[]],
-fm:[function(a,b){if(b==null)b=P.AY()
-this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,35,[]],
-y5:[function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,435,[]],
-Fv:[function(a,b){var z,y,x
+fe:function(a){this.dB=this.Lj.cR(a)},
+fm:function(a,b){if(b==null)b=P.AY()
+this.o7=P.VH(b,this.Lj)},
+y5:function(a){if(a==null)a=P.v3()
+this.Bd=this.Lj.Al(a)},
+TJ:function(a,b){var z,y,x
 z=this.Gv
 if((z&8)!==0)return
 y=(z+128|4)>>>0
 this.Gv=y
 if(z<128&&this.Ri!=null){x=this.Ri
-if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,436,[]],
-QE:[function(a){var z=this.Gv
+if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},
+yy:function(a){return this.TJ(a,null)},
+QE:function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
 this.Gv=z
 if(z<128)if((z&64)!==0&&this.Ri.N6!=null)this.Ri.t2(this)
 else{z=(z&4294967291)>>>0
 this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}},"call$0","gDQ",0,0,null],
-ed:[function(){var z=(this.Gv&4294967279)>>>0
+if((z&32)===0)this.J7(this.gZ9())}}},
+ed:function(){var z=(this.Gv&4294967279)>>>0
 this.Gv=z
 if((z&8)!==0)return this.lz
 this.Ek()
-return this.lz},"call$0","gZS",0,0,null],
+return this.lz},
 gRW:function(){return this.Gv>=128},
-Ek:[function(){var z,y
+Ek:function(){var z,y
 z=(this.Gv|8)>>>0
 this.Gv=z
 if((z&64)!==0){y=this.Ri
 if(y.Gv===1)y.Gv=3}if((z&32)===0)this.Ri=null
-this.lz=this.tA()},"call$0","gbz",0,0,null],
-Rg:[function(a,b){var z=this.Gv
+this.lz=this.tA()},
+Rg:function(a,b){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.Iv(b)
-else this.w6(H.VM(new P.LV(b,null),[null]))},"call$1","gHR",2,0,null,236,[]],
-V8:[function(a,b){var z=this.Gv
+else this.w6(H.VM(new P.LV(b,null),[null]))},
+V8:function(a,b){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.pb(a,b)
-else this.w6(new P.DS(a,b,null))},"call$2","gEm",4,0,null,159,[],160,[]],
-Qj:[function(){var z=this.Gv
+else this.w6(new P.DS(a,b,null))},
+Qj:function(){var z=this.Gv
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.Gv=z
 if(z<32)this.SY()
-else this.w6(C.Wj)},"call$0","gS2",0,0,null],
-uO:[function(){},"call$0","gp4",0,0,114],
-LP:[function(){},"call$0","gZ9",0,0,114],
-tA:[function(){},"call$0","gQC",0,0,null],
-w6:[function(a){var z,y
+else this.w6(C.Wj)},
+uO:[function(){},"call$0","gp4",0,0,116],
+LP:[function(){},"call$0","gZ9",0,0,116],
+tA:function(){},
+w6:function(a){var z,y
 z=this.Ri
 if(z==null){z=new P.Qk(null,null,0)
 this.Ri=z}z.h(0,a)
 y=this.Gv
 if((y&64)===0){y=(y|64)>>>0
 this.Gv=y
-if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,376,[]],
-Iv:[function(a){var z=this.Gv
+if(y<128)this.Ri.t2(this)}},
+Iv:function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 this.Lj.m1(this.dB,a)
 this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},"call$1","gm9",2,0,null,236,[]],
-pb:[function(a,b){var z,y
+this.Kl((z&4)!==0)},
+pb:function(a,b){var z,y
 z=this.Gv
 y=new P.Vo(this,a,b)
 if((z&1)!==0){this.Gv=(z|16)>>>0
 this.Ek()
 y.call$0()}else{y.call$0()
-this.Kl((z&4)!==0)}},"call$2","gTb",4,0,null,159,[],160,[]],
-SY:[function(){this.Ek()
+this.Kl((z&4)!==0)}},
+SY:function(){this.Ek()
 this.Gv=(this.Gv|16)>>>0
-new P.qB(this).call$0()},"call$0","gXm",0,0,null],
-J7:[function(a){var z=this.Gv
+new P.qB(this).call$0()},
+J7:function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 a.call$0()
 this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},"call$1","gEq",2,0,null,155,[]],
-Kl:[function(a){var z,y,x
+this.Kl((z&4)!==0)},
+Kl:function(a){var z,y,x
 z=this.Gv
 if((z&64)!==0&&this.Ri.N6==null){z=(z&4294967231)>>>0
 this.Gv=z
@@ -4910,11 +4953,11 @@
 if(x)this.uO()
 else this.LP()
 z=(this.Gv&4294967263)>>>0
-this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,437,[]],
+this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},
 $isMO:true,
 static:{"^":"ry,bG,Q9,wd,yJ,Dr,HX,GC,bsZ"}},
 Vo:{
-"^":"Tp:114;a,b,c",
+"^":"Tp:116;a,b,c",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 y=z.Gv
@@ -4930,7 +4973,7 @@
 else y.m1(x,v)}z.Gv=(z.Gv&4294967263)>>>0},"call$0",null,0,0,null,"call"],
 $isEH:true},
 qB:{
-"^":"Tp:114;a",
+"^":"Tp:116;a",
 call$0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -4941,40 +4984,41 @@
 $isEH:true},
 ez:{
 "^":"qh;",
-KR:[function(a,b,c,d){var z=this.w4(!0===b)
+KR:function(a,b,c,d){var z=this.w4(!0===b)
 z.fe(a)
 z.fm(0,d)
 z.y5(c)
-return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gdH",2,7,null,82,82,82,438,[],163,[],439,[],433,[]],
-w4:[function(a){var z,y
+return z},
+yI:function(a){return this.KR(a,null,null,null)},
+zC:function(a,b,c){return this.KR(a,null,b,c)},
+w4:function(a){var z,y
 z=$.X3
 y=a?1:0
 y=new P.KA(null,null,null,z,y,null,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},"call$1","gmn",2,0,null,433,[]]},
+return y}},
 fIm:{
 "^":"a;aw@"},
 LV:{
 "^":"fIm;P>,aw",
-r6:function(a,b){return this.P.call$1(b)},
-dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,440,[]]},
+dP:function(a){a.Iv(this.P)}},
 DS:{
 "^":"fIm;kc>,I4<,aw",
-dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,440,[]]},
+dP:function(a){a.pb(this.kc,this.I4)}},
 JF:{
 "^":"a;",
-dP:[function(a){a.SY()},"call$1","gqp",2,0,null,440,[]],
+dP:function(a){a.SY()},
 gaw:function(){return},
 saw:function(a){throw H.b(new P.lj("No events after a done."))}},
 ht:{
 "^":"a;",
-t2:[function(a){var z=this.Gv
+t2:function(a){var z=this.Gv
 if(z===1)return
 if(z>=1){this.Gv=1
 return}P.rb(new P.CR(this,a))
-this.Gv=1},"call$1","gQu",2,0,null,440,[]]},
+this.Gv=1}},
 CR:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -4985,34 +5029,34 @@
 Qk:{
 "^":"ht;zR,N6,Gv",
 gl0:function(a){return this.N6==null},
-h:[function(a,b){var z=this.N6
+h:function(a,b){var z=this.N6
 if(z==null){this.N6=b
 this.zR=b}else{z.saw(b)
-this.N6=b}},"call$1","ght",2,0,null,376,[]],
-TO:[function(a){var z,y
+this.N6=b}},
+TO:function(a){var z,y
 z=this.zR
 y=z.gaw()
 this.zR=y
 if(y==null)this.N6=null
-z.dP(a)},"call$1","gKt",2,0,null,440,[]],
-V1:[function(a){if(this.Gv===1)this.Gv=3
+z.dP(a)},
+V1:function(a){if(this.Gv===1)this.Gv=3
 this.N6=null
-this.zR=null},"call$0","gRa",0,0,null]},
+this.zR=null}},
 v1y:{
-"^":"Tp:115;a,b,c",
+"^":"Tp:117;a,b,c",
 call$0:[function(){return this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:441;a,b",
-call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,159,[],160,[],"call"],
+"^":"Tp:357;a,b",
+call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,161,[],162,[],"call"],
 $isEH:true},
 Xa:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){return this.a.rX(this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 YR:{
 "^":"qh;",
-KR:[function(a,b,c,d){var z,y,x,w,v
+KR:function(a,b,c,d){var z,y,x,w,v
 b=!0===b
 z=H.ip(this,"YR",0)
 y=H.ip(this,"YR",1)
@@ -5023,27 +5067,29 @@
 v.fe(a)
 v.fm(0,d)
 v.y5(c)
-return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gdH",2,7,null,82,82,82,438,[],163,[],439,[],433,[]],
-Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,236,[],442,[]],
+return v},
+zC:function(a,b,c){return this.KR(a,null,b,c)},
+yI:function(a){return this.KR(a,null,null,null)},
+Ml:function(a,b){b.Rg(0,a)},
 $asqh:function(a,b){return[b]}},
 fB:{
 "^":"KA;UY,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
-Rg:[function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.Rg.call(this,this,b)},"call$1","gHR",2,0,null,236,[]],
-V8:[function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.V8.call(this,a,b)},"call$2","gEm",4,0,null,159,[],160,[]],
+Rg:function(a,b){if((this.Gv&2)!==0)return
+P.KA.prototype.Rg.call(this,this,b)},
+V8:function(a,b){if((this.Gv&2)!==0)return
+P.KA.prototype.V8.call(this,a,b)},
 uO:[function(){var z=this.Ee
 if(z==null)return
-z.yy(0)},"call$0","gp4",0,0,114],
+z.yy(0)},"call$0","gp4",0,0,116],
 LP:[function(){var z=this.Ee
 if(z==null)return
-z.QE(0)},"call$0","gZ9",0,0,114],
-tA:[function(){var z=this.Ee
+z.QE(0)},"call$0","gZ9",0,0,116],
+tA:function(){var z=this.Ee
 if(z!=null){this.Ee=null
-z.ed()}return},"call$0","gQC",0,0,null],
-vx:[function(a){this.UY.Ml(a,this)},"call$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},236,[]],
-xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,443,159,[],160,[]],
-nn:[function(){this.Qj()},"call$0","gH1",0,0,114],
+z.ed()}return},
+vx:[function(a){this.UY.Ml(a,this)},"call$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},238,[]],
+xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,358,161,[],162,[]],
+nn:[function(){this.Qj()},"call$0","gH1",0,0,116],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
@@ -5053,39 +5099,39 @@
 nO:{
 "^":"YR;qs,Sb",
 Dr:function(a){return this.qs.call$1(a)},
-Ml:[function(a,b){var z,y,x,w,v
+Ml:function(a,b){var z,y,x,w,v
 z=null
 try{z=this.Dr(a)}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,444,[],442,[]],
+return}if(z===!0)J.QM(b,a)},
 $asYR:function(a){return[a,a]},
 $asqh:null},
 t3:{
 "^":"YR;TN,Sb",
 kn:function(a){return this.TN.call$1(a)},
-Ml:[function(a,b){var z,y,x,w,v
+Ml:function(a,b){var z,y,x,w,v
 z=null
 try{z=this.kn(a)}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}J.QM(b,z)},"call$2","gOa",4,0,null,444,[],442,[]]},
+return}J.QM(b,z)}},
 Zz:{
-"^":"YR;q6,Sb",
-Ml:[function(a,b){var z
-if(J.z8(this.q6,0)){b.Rg(0,a)
-z=J.xH(this.q6,1)
-this.q6=z
-if(J.de(z,0))b.Qj()}},"call$2","gOa",4,0,null,444,[],442,[]],
+"^":"YR;Em,Sb",
+Ml:function(a,b){var z
+if(J.z8(this.Em,0)){b.Rg(0,a)
+z=J.xH(this.Em,1)
+this.Em=z
+if(J.de(z,0))b.Qj()}},
 K6:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))},
 $asYR:function(a){return[a,a]},
 $asqh:null},
 dq:{
-"^":"YR;q6,Sb",
-Ml:[function(a,b){if(J.z8(this.q6,0)){this.q6=J.xH(this.q6,1)
-return}b.Rg(0,a)},"call$2","gOa",4,0,null,444,[],442,[]],
+"^":"YR;Em,Sb",
+Ml:function(a,b){if(J.z8(this.Em,0)){this.Em=J.xH(this.Em,1)
+return}b.Rg(0,a)},
 U6:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(new P.AT(b))},
 $asYR:function(a){return[a,a]},
 $asqh:null},
@@ -5114,131 +5160,133 @@
 Id:{
 "^":"a;oh",
 gLj:function(){return this.oh},
-c1:[function(a,b,c){var z,y
+c1:function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gE2()==null;)z=z.geT(z)
-return y.gE2().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gE2",6,0,null,153,[],159,[],160,[]],
-Vn:[function(a,b){var z,y
+return y.gE2().call$5(z,new P.Id(z.geT(z)),a,b,c)},
+Vn:function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gcP()==null;)z=z.geT(z)
-return y.gcP().call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gcP",4,0,null,153,[],117,[]],
-qG:[function(a,b,c){var z,y
+return y.gcP().call$4(z,new P.Id(z.geT(z)),a,b)},
+qG:function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gJl()==null;)z=z.geT(z)
-return y.gJl().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gJl",6,0,null,153,[],117,[],172,[]],
-nA:[function(a,b,c,d){var z,y
+return y.gJl().call$5(z,new P.Id(z.geT(z)),a,b,c)},
+nA:function(a,b,c,d){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gpU()==null;)z=z.geT(z)
-return y.gpU().call$6(z,new P.Id(z.geT(z)),a,b,c,d)},"call$4","gpU",8,0,null,153,[],117,[],59,[],60,[]],
-TE:[function(a,b){var z,y
+return y.gpU().call$6(z,new P.Id(z.geT(z)),a,b,c,d)},
+TE:function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gFh(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gFh",4,0,null,153,[],117,[]],
-V6:[function(a,b){var z,y
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},
+V6:function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gXp(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,153,[],117,[]],
-mz:[function(a,b){var z,y
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},
+mz:function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gfb(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gfb",4,0,null,153,[],117,[]],
-RK:[function(a,b){var z,y,x
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},
+RK:function(a,b){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.grb()==null;)z=z.geT(z)
 x=z.geT(z)
-y.grb().call$4(z,new P.Id(x),a,b)},"call$2","grb",4,0,null,153,[],117,[]],
-pX:[function(a,b,c){var z,y
+y.grb().call$4(z,new P.Id(x),a,b)},
+pX:function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gZq()==null;)z=z.geT(z)
-return y.gZq().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gZq",6,0,null,153,[],166,[],117,[]],
-RB:[function(a,b,c){var z,y
+return y.gZq().call$5(z,new P.Id(z.geT(z)),a,b,c)},
+RB:function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gJS(y)==null;)z=z.geT(z)
-y.gJS(y).call$4(z,new P.Id(z.geT(z)),b,c)},"call$2","gJS",4,0,null,153,[],180,[]],
-ld:[function(a,b,c){var z,y,x
+y.gJS(y).call$4(z,new P.Id(z.geT(z)),b,c)},
+ld:function(a,b,c){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.giq()==null;)z=z.geT(z)
 x=z.geT(z)
-return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,153,[],183,[],184,[]]},
+return y.giq().call$5(z,new P.Id(x),a,b,c)}},
 WH:{
 "^":"a;",
-fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,445,[]],
-bH:[function(a){var z,y,x,w
+fC:function(a){return this.gC5()===a.gC5()},
+bH:function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$1","gSI",2,0,null,117,[]],
-m1:[function(a,b){var z,y,x,w
+return this.hk(z,y)}},
+m1:function(a,b){var z,y,x,w
 try{x=this.FI(a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$2","gNY",4,0,null,117,[],172,[]],
-z8:[function(a,b,c){var z,y,x,w
+return this.hk(z,y)}},
+z8:function(a,b,c){var z,y,x,w
 try{x=this.mg(a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$3","gLG",6,0,null,117,[],59,[],60,[]],
-xi:[function(a,b){var z=this.Al(a)
+return this.hk(z,y)}},
+xi:function(a,b){var z=this.Al(a)
 if(b)return new P.TF(this,z)
-else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,340,117,[],446,[]],
-oj:[function(a,b){var z=this.cR(a)
+else return new P.K5(this,z)},
+ce:function(a){return this.xi(a,!0)},
+oj:function(a,b){var z=this.cR(a)
 if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,340,117,[],446,[]],
-PT:[function(a,b){var z=this.O8(a)
+else return new P.Hs(this,z)},
+PT:function(a,b){var z=this.O8(a)
 if(b)return new P.dv(this,z)
-else return new P.ph(this,z)},"call$2$runGuarded","gma",2,3,null,340,117,[],446,[]]},
+else return new P.ph(this,z)}},
 TF:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){return this.a.bH(this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 K5:{
-"^":"Tp:115;c,d",
+"^":"Tp:117;c,d",
 call$0:[function(){return this.c.Gr(this.d)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
-"^":"Tp:112;a,b",
-call$1:[function(a){return this.a.m1(this.b,a)},"call$1",null,2,0,null,172,[],"call"],
+"^":"Tp:114;a,b",
+call$1:[function(a){return this.a.m1(this.b,a)},"call$1",null,2,0,null,174,[],"call"],
 $isEH:true},
 Hs:{
-"^":"Tp:112;c,d",
-call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,172,[],"call"],
+"^":"Tp:114;c,d",
+call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,174,[],"call"],
 $isEH:true},
 dv:{
-"^":"Tp:355;a,b",
+"^":"Tp:293;a,b",
 call$2:[function(a,b){return this.a.z8(this.b,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
 ph:{
-"^":"Tp:355;c,d",
+"^":"Tp:293;c,d",
 call$2:[function(a,b){return this.c.mg(this.d,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
 uo:{
 "^":"WH;eT>,zU<,R1",
 gC5:function(){return this.eT.gC5()},
-t:[function(a,b){var z,y
+t:function(a,b){var z,y
 z=this.R1
 y=z.t(0,b)
 if(y!=null||z.x4(b))return y
-return this.eT.t(0,b)},"call$1","gIA",2,0,null,48,[]],
-hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
-c6:[function(a,b){return new P.Id(this).ld(this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
-Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,117,[]],
-FI:[function(a,b){return new P.Id(this).qG(this,a,b)},"call$2","gJl",4,0,null,117,[],172,[]],
-mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
-Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,117,[]],
-cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gfb",2,0,null,117,[]],
-wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,117,[]],
-uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
-Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,180,[]]},
+return this.eT.t(0,b)},
+hk:function(a,b){return new P.Id(this).c1(this,a,b)},
+c6:function(a,b){return new P.Id(this).ld(this,a,b)},
+iT:function(a){return this.c6(a,null)},
+Gr:function(a){return new P.Id(this).Vn(this,a)},
+FI:function(a,b){return new P.Id(this).qG(this,a,b)},
+mg:function(a,b,c){return new P.Id(this).nA(this,a,b,c)},
+Al:function(a){return new P.Id(this).TE(this,a)},
+cR:function(a){return new P.Id(this).V6(this,a)},
+O8:function(a){return new P.Id(this).mz(this,a)},
+wr:function(a){new P.Id(this).RK(this,a)},
+uN:function(a,b){return new P.Id(this).pX(this,a,b)},
+Ch:function(a,b){new P.Id(this).RB(0,this,b)}},
 pK:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){P.IA(new P.eM(this.a,this.b))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 eM:{
-"^":"Tp:115;c,d",
+"^":"Tp:117;c,d",
 call$0:[function(){var z,y
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
@@ -5248,9 +5296,8 @@
 throw H.b(z)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Uez:{
-"^":"Tp:415;a",
-call$2:[function(a,b){if(a==null)throw H.b(new P.AT("ZoneValue key must not be null"))
-this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
+"^":"Tp:293;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 W5:{
 "^":"a;",
@@ -5282,23 +5329,24 @@
 geT:function(a){return},
 gzU:function(){return C.v8},
 gC5:function(){return this},
-fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,445,[]],
-t:[function(a,b){return},"call$1","gIA",2,0,null,48,[]],
-hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
-c6:[function(a,b){return P.UA(this,null,this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
-Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,117,[]],
-FI:[function(a,b){return P.V7(this,null,this,a,b)},"call$2","gJl",4,0,null,117,[],172,[]],
-mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
-Al:[function(a){return a},"call$1","gFh",2,0,null,117,[]],
-cR:[function(a){return a},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return a},"call$1","gfb",2,0,null,117,[]],
-wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,117,[]],
-uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
-Ch:[function(a,b){H.qw(b)
-return},"call$1","gJS",2,0,null,180,[]]}}],["dart.collection","dart:collection",,P,{
+fC:function(a){return a.gC5()===this},
+t:function(a,b){return},
+hk:function(a,b){return P.L2(this,null,this,a,b)},
+c6:function(a,b){return P.UA(this,null,this,a,b)},
+iT:function(a){return this.c6(a,null)},
+Gr:function(a){return P.T8(this,null,this,a)},
+FI:function(a,b){return P.V7(this,null,this,a,b)},
+mg:function(a,b,c){return P.Qx(this,null,this,a,b,c)},
+Al:function(a){return a},
+cR:function(a){return a},
+O8:function(a){return a},
+wr:function(a){P.Tk(this,null,this,a)},
+uN:function(a,b){return P.h8(this,null,this,a,b)},
+Ch:function(a,b){H.qw(b)
+return}}}],["dart.collection","dart:collection",,P,{
 "^":"",
-TQ:[function(a,b){return J.de(a,b)},"call$2","S5",4,0,186,131,[],187,[]],
-T9:[function(a){return J.v1(a)},"call$1","py",2,0,188,131,[]],
+TQ:[function(a,b){return J.de(a,b)},"call$2","S5",4,0,188,133,[],189,[]],
+T9:[function(a){return J.v1(a)},"call$1","py",2,0,190,133,[]],
 Py:function(a,b,c,d,e){var z
 if(a==null){z=new P.k6(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -5313,7 +5361,7 @@
 try{P.Vr(a,z)}finally{$.xb().Rz(0,a)}y=P.p9("(")
 y.We(z,", ")
 y.KF(")")
-return y.vM},"call$1","Zw",2,0,null,116,[]],
+return y.vM},"call$1","Zw",2,0,null,118,[]],
 Vr:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z=a.gA(a)
 y=0
@@ -5350,7 +5398,7 @@
 if(p==null){y+=5
 p="..."}}if(p!=null)b.push(p)
 b.push(u)
-b.push(v)},"call$2","zE",4,0,null,116,[],189,[]],
+b.push(v)},"call$2","zE",4,0,null,118,[],191,[]],
 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.b6(0,null,null,null,null,null,0),[d])},
 vW:[function(a){var z,y,x,w,v
@@ -5361,28 +5409,28 @@
 try{$.tw().push(a)
 y.KF("{")
 z.a=!0
-J.kH(a,new P.ZQ(z,y))
+J.kH(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},"call$1","DH",2,0,null,190,[]],
+z.pop()}return y.gvM()},"call$1","DH",2,0,null,192,[]],
 k6:{
 "^":"a;X5,vv,OX,OB,wV",
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-gvc:function(a){return H.VM(new P.fG(this),[H.Kp(this,0)])},
+gvc:function(){return H.VM(new P.fG(this),[H.Kp(this,0)])},
 gUQ:function(a){return H.K1(H.VM(new P.fG(this),[H.Kp(this,0)]),new P.oi(this),H.Kp(this,0),H.Kp(this,1))},
-x4:[function(a){var z,y,x
+x4:function(a){var z,y,x
 if(typeof a==="string"&&a!=="__proto__"){z=this.vv
 return z==null?!1:z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
 return y==null?!1:y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
-di:[function(a){var z=this.Ig()
+return this.aH(x[this.nm(a)],a)>=0}},
+di:function(a){var z=this.Ig()
 z.toString
-return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,30,[]],
-FV:[function(a,b){J.kH(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
-t:[function(a,b){var z,y,x,w,v,u,t
+return H.Ck(z,new P.ce(this,a))},
+FV:function(a,b){J.kH(b,new P.DJ(this))},
+t:function(a,b){var z,y,x,w,v,u,t
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)y=null
 else{x=z[b]
@@ -5393,8 +5441,8 @@
 if(v==null)return
 u=v[this.nm(b)]
 t=this.aH(u,b)
-return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,48,[]],
-u:[function(a,b,c){var z,y,x,w,v,u
+return t<0?null:u[t+1]}},
+u:function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.a0()
 this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
@@ -5409,8 +5457,8 @@
 if(u>=0)v[u+1]=c
 else{v.push(b,c)
 this.X5=this.X5+1
-this.wV=null}}}},"call$2","gj3",4,0,null,48,[],30,[]],
-Rz:[function(a,b){var z,y,x
+this.wV=null}}}},
+Rz:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
 else{z=this.OB
@@ -5420,18 +5468,18 @@
 if(x<0)return
 this.X5=this.X5-1
 this.wV=null
-return y.splice(x,2)[1]}},"call$1","guH",2,0,null,48,[]],
-V1:[function(a){if(this.X5>0){this.wV=null
+return y.splice(x,2)[1]}},
+V1:function(a){if(this.X5>0){this.wV=null
 this.OB=null
 this.OX=null
 this.vv=null
-this.X5=0}},"call$0","gRa",0,0,null],
-aN:[function(a,b){var z,y,x,w
+this.X5=0}},
+aN:function(a,b){var z,y,x,w
 z=this.Ig()
 for(y=z.length,x=0;x<y;++x){w=z[x]
 b.call$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,406,[]],
-Ig:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
+if(z!==this.wV)throw H.b(P.a4(this))}},
+Ig:function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.wV
 if(z!=null)return z
 y=Array(this.X5)
@@ -5449,35 +5497,35 @@
 for(t=0;t<v;++t){q=r[w[t]]
 p=q.length
 for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.wV=y
-return y},"call$0","gtL",0,0,null],
-dg:[function(a,b,c){if(a[b]==null){this.X5=this.X5+1
-this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
-Nv:[function(a,b){var z
+return y},
+dg:function(a,b,c){if(a[b]==null){this.X5=this.X5+1
+this.wV=null}P.cW(a,b,c)},
+Nv:function(a,b){var z
 if(a!=null&&a[b]!=null){z=P.vL(a,b)
 delete a[b]
 this.X5=this.X5-1
 this.wV=null
-return z}else return},"call$2","got",4,0,null,185,[],48,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
-aH:[function(a,b){var z,y
+return z}else return},
+nm:function(a){return J.v1(a)&0x3ffffff},
+aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
-return-1},"call$2","gXD",4,0,null,447,[],48,[]],
+return-1},
 $isZ0:true,
 static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"call$2","ME",4,0,null,185,[],48,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"call$3","rn",6,0,null,185,[],48,[],30,[]],a0:[function(){var z=Object.create(null)
+return z===a?null:z},"call$2","ME",4,0,null,187,[],48,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"call$3","rn",6,0,null,187,[],48,[],30,[]],a0:[function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
 return z},"call$0","l1",0,0,null]}},
 oi:{
-"^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,448,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,359,[],"call"],
 $isEH:true},
 ce:{
-"^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,448,[],"call"],
+"^":"Tp:114;a,b",
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,359,[],"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
@@ -5486,36 +5534,36 @@
 $signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
 PL:{
 "^":"k6;X5,vv,OX,OB,wV",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
-aH:[function(a,b){var z,y,x
+nm:function(a){return H.CU(a)&0x3ffffff},
+aH:function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gXD",4,0,null,447,[],48,[]]},
+if(x==null?b==null:x===b)return y}return-1}},
 Fq:{
 "^":"k6;y9,Q6,ac,X5,vv,OX,OB,wV",
 WV:function(a,b){return this.y9.call$2(a,b)},
 H5:function(a){return this.Q6.call$1(a)},
 Ef:function(a){return this.ac.call$1(a)},
-t:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,48,[]],
-x4:[function(a){if(this.Ef(a)!==!0)return!1
-return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,48,[]],
-Rz:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,48,[]],
-nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
-aH:[function(a,b){var z,y
+t:function(a,b){if(this.Ef(b)!==!0)return
+return P.k6.prototype.t.call(this,this,b)},
+x4:function(a){if(this.Ef(a)!==!0)return!1
+return P.k6.prototype.x4.call(this,a)},
+Rz:function(a,b){if(this.Ef(b)!==!0)return
+return P.k6.prototype.Rz.call(this,this,b)},
+nm:function(a){return this.H5(a)&0x3ffffff},
+aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(this.WV(a[y],b)===!0)return y
-return-1},"call$2","gXD",4,0,null,447,[],48,[]],
-bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
+return-1},
+bu:function(a){return P.vW(this)},
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,275,[],"call"],
+return z},"call$1",null,2,0,null,277,[],"call"],
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -5525,17 +5573,17 @@
 z=new P.EQ(z,z.Ig(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,132,[]],
-aN:[function(a,b){var z,y,x,w
+tg:function(a,b){return this.Fb.x4(b)},
+aN:function(a,b){var z,y,x,w
 z=this.Fb
 y=z.Ig()
 for(x=y.length,w=0;w<x;++w){b.call$1(y[w])
-if(y!==z.wV)throw H.b(P.a4(z))}},"call$1","gjw",2,0,null,117,[]],
+if(y!==z.wV)throw H.b(P.a4(z))}},
 $isyN:true},
 EQ:{
 "^":"a;Fb,wV,zi,fD",
 gl:function(){return this.fD},
-G:[function(){var z,y,x
+G:function(){var z,y,x
 z=this.wV
 y=this.zi
 x=this.Fb
@@ -5543,25 +5591,25 @@
 else if(y>=z.length){this.fD=null
 return!1}else{this.fD=z[y]
 this.zi=y+1
-return!0}},"call$0","gqy",0,0,null]},
+return!0}}},
 YB:{
 "^":"a;X5,vv,OX,OB,H9,lX,zN",
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-gvc:function(a){return H.VM(new P.i5(this),[H.Kp(this,0)])},
+gvc:function(){return H.VM(new P.i5(this),[H.Kp(this,0)])},
 gUQ:function(a){return H.K1(H.VM(new P.i5(this),[H.Kp(this,0)]),new P.a1(this),H.Kp(this,0),H.Kp(this,1))},
-x4:[function(a){var z,y,x
+x4:function(a){var z,y,x
 if(typeof a==="string"&&a!=="__proto__"){z=this.vv
 if(z==null)return!1
 return z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
 if(y==null)return!1
 return y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
-di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,30,[]],
-FV:[function(a,b){J.kH(b,new P.S9(this))},"call$1","gDY",2,0,null,109,[]],
-t:[function(a,b){var z,y,x,w,v,u
+return this.aH(x[this.nm(a)],a)>=0}},
+di:function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},
+FV:function(a,b){J.kH(b,new P.S9(this))},
+t:function(a,b){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)return
 y=z[b]
@@ -5573,8 +5621,8 @@
 v=w[this.nm(b)]
 u=this.aH(v,b)
 if(u<0)return
-return v[u].gS4()}},"call$1","gIA",2,0,null,48,[]],
-u:[function(a,b,c){var z,y,x,w,v,u
+return v[u].gS4()}},
+u:function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.Qs()
 this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
@@ -5586,13 +5634,13 @@
 if(v==null)x[w]=[this.pE(b,c)]
 else{u=this.aH(v,b)
 if(u>=0)v[u].sS4(c)
-else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,48,[],30,[]],
-to:[function(a,b){var z
+else v.push(this.pE(b,c))}}},
+to:function(a,b){var z
 if(this.x4(a))return this.t(0,a)
 z=b.call$0()
 this.u(0,a,z)
-return z},"call$2","gME",4,0,null,48,[],449,[]],
-Rz:[function(a,b){var z,y,x,w
+return z},
+Rz:function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
 else{z=this.OB
@@ -5602,31 +5650,31 @@
 if(x<0)return
 w=y.splice(x,1)[0]
 this.Vb(w)
-return w.gS4()}},"call$1","guH",2,0,null,48,[]],
-V1:[function(a){if(this.X5>0){this.lX=null
+return w.gS4()}},
+V1:function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
 this.OX=null
 this.vv=null
 this.X5=0
-this.zN=this.zN+1&67108863}},"call$0","gRa",0,0,null],
-aN:[function(a,b){var z,y
+this.zN=this.zN+1&67108863}},
+aN:function(a,b){var z,y
 z=this.H9
 y=this.zN
 for(;z!=null;){b.call$2(z.gkh(),z.gS4())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,406,[]],
-dg:[function(a,b,c){var z=a[b]
+z=z.gDG()}},
+dg:function(a,b,c){var z=a[b]
 if(z==null)a[b]=this.pE(b,c)
-else z.sS4(c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
-Nv:[function(a,b){var z
+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.gS4()},"call$2","got",4,0,null,185,[],48,[]],
-pE:[function(a,b){var z,y
+return z.gS4()},
+pE:function(a,b){var z,y
 z=new P.db(a,b,null,null)
 if(this.H9==null){this.lX=z
 this.H9=z}else{y=this.lX
@@ -5634,8 +5682,8 @@
 y.sDG(z)
 this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
-return z},"call$2","gTM",4,0,null,48,[],30,[]],
-Vb:[function(a){var z,y
+return z},
+Vb:function(a){var z,y
 z=a.gzQ()
 y=a.gDG()
 if(z==null)this.H9=y
@@ -5643,14 +5691,14 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,450,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
-aH:[function(a,b){var z,y
+this.zN=this.zN+1&67108863},
+nm:function(a){return J.v1(a)&0x3ffffff},
+aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gkh(),b))return y
-return-1},"call$2","gXD",4,0,null,447,[],48,[]],
-bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
+return-1},
+bu:function(a){return P.vW(this)},
 $isFo:true,
 $isZ0:true,
 static:{Qs:[function(){var z=Object.create(null)
@@ -5658,12 +5706,12 @@
 delete z["<non-identifier-key>"]
 return z},"call$0","Bs",0,0,null]}},
 a1:{
-"^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,448,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,359,[],"call"],
 $isEH:true},
 ou:{
-"^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,448,[],"call"],
+"^":"Tp:114;a,b",
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,359,[],"call"],
 $isEH:true},
 S9:{
 "^":"Tp;a",
@@ -5682,25 +5730,25 @@
 y.$builtinTypeInfo=this.$builtinTypeInfo
 y.zq=z.H9
 return y},
-tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,132,[]],
-aN:[function(a,b){var z,y,x
+tg:function(a,b){return this.Fb.x4(b)},
+aN:function(a,b){var z,y,x
 z=this.Fb
 y=z.H9
 x=z.zN
 for(;y!=null;){b.call$1(y.gkh())
 if(x!==z.zN)throw H.b(P.a4(z))
-y=y.gDG()}},"call$1","gjw",2,0,null,117,[]],
+y=y.gDG()}},
 $isyN:true},
 N6:{
 "^":"a;Fb,zN,zq,fD",
 gl:function(){return this.fD},
-G:[function(){var z=this.Fb
+G:function(){var z=this.Fb
 if(this.zN!==z.zN)throw H.b(P.a4(z))
 else{z=this.zq
 if(z==null){this.fD=null
 return!1}else{this.fD=z.gkh()
 this.zq=this.zq.gDG()
-return!0}}},"call$0","gqy",0,0,null]},
+return!0}}}},
 Rr:{
 "^":"lN;",
 gA:function(a){var z=new P.oz(this,this.Zl(),0,null)
@@ -5709,13 +5757,13 @@
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-tg:[function(a,b){var z,y,x
+tg:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
 return y==null?!1:y[b]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(b)],b)>=0}},"call$1","gdj",2,0,null,6,[]],
-Zt:[function(a){var z,y,x,w
+return this.aH(x[this.nm(b)],b)>=0}},
+Zt:function(a){var z,y,x,w
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
@@ -5724,8 +5772,8 @@
 x=y[this.nm(a)]
 w=this.aH(x,a)
 if(w<0)return
-return J.UQ(x,w)},"call$1","gQB",2,0,null,6,[]],
-h:[function(a,b){var z,y,x,w,v,u
+return J.UQ(x,w)},
+h:function(a,b){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
@@ -5747,12 +5795,11 @@
 else{if(this.aH(u,b)>=0)return!1
 u.push(b)}this.X5=this.X5+1
 this.DM=null
-return!0}},"call$1","ght",2,0,null,132,[]],
-FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,451,[]],
-Rz:[function(a,b){var z,y,x
+return!0}},
+FV:function(a,b){var z
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},
+Rz:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
 else{z=this.OB
 if(z==null)return!1
 y=z[this.nm(b)]
@@ -5761,13 +5808,13 @@
 this.X5=this.X5-1
 this.DM=null
 y.splice(x,1)
-return!0}},"call$1","guH",2,0,null,6,[]],
-V1:[function(a){if(this.X5>0){this.DM=null
+return!0}},
+V1:function(a){if(this.X5>0){this.DM=null
 this.OB=null
 this.OX=null
 this.vv=null
-this.X5=0}},"call$0","gRa",0,0,null],
-Zl:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
+this.X5=0}},
+Zl:function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.DM
 if(z!=null)return z
 y=Array(this.X5)
@@ -5785,38 +5832,38 @@
 for(t=0;t<v;++t){q=r[w[t]]
 p=q.length
 for(o=0;o<p;++o){y[u]=q[o];++u}}}this.DM=y
-return y},"call$0","gK2",0,0,null],
-cA:[function(a,b){if(a[b]!=null)return!1
+return y},
+cA:function(a,b){if(a[b]!=null)return!1
 a[b]=0
 this.X5=this.X5+1
 this.DM=null
-return!0},"call$2","gLa",4,0,null,185,[],132,[]],
-Nv:[function(a,b){if(a!=null&&a[b]!=null){delete a[b]
+return!0},
+Nv:function(a,b){if(a!=null&&a[b]!=null){delete a[b]
 this.X5=this.X5-1
 this.DM=null
-return!0}else return!1},"call$2","got",4,0,null,185,[],132,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,132,[]],
-aH:[function(a,b){var z,y
+return!0}else return!1},
+nm:function(a){return J.v1(a)&0x3ffffff},
+aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y],b))return y
-return-1},"call$2","gXD",4,0,null,447,[],132,[]],
+return-1},
 $isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 YO:{
 "^":"Rr;X5,vv,OX,OB,DM",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
-aH:[function(a,b){var z,y,x
+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},"call$2","gXD",4,0,null,447,[],132,[]]},
+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
+G:function(){var z,y,x
 z=this.DM
 y=this.zi
 x=this.O2
@@ -5824,7 +5871,7 @@
 else if(y>=z.length){this.fD=null
 return!1}else{this.fD=z[y]
 this.zi=y+1
-return!0}},"call$0","gqy",0,0,null]},
+return!0}}},
 b6:{
 "^":"lN;X5,vv,OX,OB,H9,lX,zN",
 gA:function(a){var z=H.VM(new P.zQ(this,this.zN,null,null),[null])
@@ -5833,15 +5880,15 @@
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-tg:[function(a,b){var z,y,x
+tg:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)return!1
 return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
 if(y==null)return!1
 return y[b]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(b)],b)>=0}},"call$1","gdj",2,0,null,6,[]],
-Zt:[function(a){var z,y,x,w
+return this.aH(x[this.nm(b)],b)>=0}},
+Zt:function(a){var z,y,x,w
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
@@ -5850,17 +5897,17 @@
 x=y[this.nm(a)]
 w=this.aH(x,a)
 if(w<0)return
-return J.UQ(x,w).gGc()}},"call$1","gQB",2,0,null,6,[]],
-aN:[function(a,b){var z,y
+return J.UQ(x,w).gGc()}},
+aN:function(a,b){var z,y
 z=this.H9
 y=this.zN
 for(;z!=null;){b.call$1(z.gGc())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,406,[]],
+z=z.gDG()}},
 grZ:function(a){var z=this.lX
 if(z==null)throw H.b(new P.lj("No elements"))
 return z.gGc()},
-h:[function(a,b){var z,y,x,w,v,u
+h:function(a,b){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
@@ -5880,10 +5927,10 @@
 u=w[v]
 if(u==null)w[v]=[this.xf(b)]
 else{if(this.aH(u,b)>=0)return!1
-u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,132,[]],
-FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,451,[]],
-Rz:[function(a,b){var z,y,x
+u.push(this.xf(b))}return!0}},
+FV:function(a,b){var z
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},
+Rz:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
 else{z=this.OB
@@ -5892,25 +5939,25 @@
 x=this.aH(y,b)
 if(x<0)return!1
 this.Vb(y.splice(x,1)[0])
-return!0}},"call$1","guH",2,0,null,6,[]],
-V1:[function(a){if(this.X5>0){this.lX=null
+return!0}},
+V1:function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
 this.OX=null
 this.vv=null
 this.X5=0
-this.zN=this.zN+1&67108863}},"call$0","gRa",0,0,null],
-cA:[function(a,b){if(a[b]!=null)return!1
+this.zN=this.zN+1&67108863}},
+cA:function(a,b){if(a[b]!=null)return!1
 a[b]=this.xf(b)
-return!0},"call$2","gLa",4,0,null,185,[],132,[]],
-Nv:[function(a,b){var z
+return!0},
+Nv:function(a,b){var z
 if(a==null)return!1
 z=a[b]
 if(z==null)return!1
 this.Vb(z)
 delete a[b]
-return!0},"call$2","got",4,0,null,185,[],132,[]],
-xf:[function(a){var z,y
+return!0},
+xf:function(a){var z,y
 z=new P.ef(a,null,null)
 if(this.H9==null){this.lX=z
 this.H9=z}else{y=this.lX
@@ -5918,8 +5965,8 @@
 y.sDG(z)
 this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
-return z},"call$1","gTM",2,0,null,132,[]],
-Vb:[function(a){var z,y
+return z},
+Vb:function(a){var z,y
 z=a.gzQ()
 y=a.gDG()
 if(z==null)this.H9=y
@@ -5927,13 +5974,13 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,450,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,132,[]],
-aH:[function(a,b){var z,y
+this.zN=this.zN+1&67108863},
+nm:function(a){return J.v1(a)&0x3ffffff},
+aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gGc(),b))return y
-return-1},"call$2","gXD",4,0,null,447,[],132,[]],
+return-1},
 $isz5:true,
 $isyN:true,
 $isQV:true,
@@ -5943,42 +5990,43 @@
 zQ:{
 "^":"a;O2,zN,zq,fD",
 gl:function(){return this.fD},
-G:[function(){var z=this.O2
+G:function(){var z=this.O2
 if(this.zN!==z.zN)throw H.b(P.a4(z))
 else{z=this.zq
 if(z==null){this.fD=null
 return!1}else{this.fD=z.gGc()
 this.zq=this.zq.gDG()
-return!0}}},"call$0","gqy",0,0,null]},
+return!0}}}},
 Yp:{
 "^":"w2Y;G4",
 gB:function(a){return J.q8(this.G4)},
-t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,15,[]]},
+t:function(a,b){return J.i4(this.G4,b)}},
 lN:{
 "^":"mW;",
-tt:[function(a,b){var z,y,x,w,v
+tt:function(a,b){var z,y,x,w,v
 if(b){z=H.VM([],[H.Kp(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
 z=H.VM(y,[H.Kp(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
 v=x+1
 if(x>=z.length)return H.e(z,x)
-z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,340,341,[]],
-bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
+z[x]=w}return z},
+br:function(a){return this.tt(a,!0)},
+bu:function(a){return H.mx(this,"{","}")},
 $isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"call$1","gIr",2,0,null,117,[]],
-ev:[function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},"call$1","gIR",2,0,null,117,[]],
-tg:[function(a,b){var z
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"call$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")},119,[]],
+ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
+tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.de(z.gl(),b))return!0
-return!1},"call$1","gdj",2,0,null,132,[]],
-aN:[function(a,b){var z
-for(z=this.gA(this);z.G();)b.call$1(z.gl())},"call$1","gjw",2,0,null,117,[]],
-zV:[function(a,b){var z,y,x
+return!1},
+aN:function(a,b){var z
+for(z=this.gA(this);z.G();)b.call$1(z.gl())},
+zV:function(a,b){var z,y,x
 z=this.gA(this)
 if(!z.G())return""
 y=P.p9("")
@@ -5987,35 +6035,37 @@
 else{y.KF(H.d(z.gl()))
 for(;z.G();){y.vM=y.vM+b
 x=H.d(z.gl())
-y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,337,338,[]],
-Vr:[function(a,b){var z
+y.vM=y.vM+x}}return y.vM},
+Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.call$1(z.gl())===!0)return!0
-return!1},"call$1","gGI",2,0,null,117,[]],
-tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,340,341,[]],
+return!1},
+tt:function(a,b){return P.F(this,b,H.ip(this,"mW",0))},
+br:function(a){return this.tt(a,!0)},
 gB:function(a){var z,y
 z=this.gA(this)
 for(y=0;z.G();)++y
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
-qZ:[function(a,b){return H.Dw(this,b,H.ip(this,"mW",0))},"call$1","gVw",2,0,null,198,[]],
-eR:[function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},"call$1","gZo",2,0,null,198,[]],
+qZ:function(a,b){return H.Dw(this,b,H.ip(this,"mW",0))},
+eR:function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},
 grZ:function(a){var z,y
 z=this.gA(this)
 if(!z.G())throw H.b(new P.lj("No elements"))
 do y=z.gl()
 while(z.G())
 return y},
-qA:[function(a,b,c){var z,y
+qA:function(a,b,c){var z,y
 for(z=this.gA(this);z.G();){y=z.gl()
-if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,407,[],452,[]],
-Zv:[function(a,b){var z,y,x,w
+if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},
+XG:function(a,b){return this.qA(a,b,null)},
+Zv:function(a,b){var z,y,x,w
 if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
 for(z=this.gA(this),y=b;z.G();){x=z.gl()
 w=J.x(y)
 if(w.n(y,0))return x
-y=w.W(y,1)}throw H.b(P.N(b))},"call$1","gRV",2,0,null,15,[]],
-bu:[function(a){return P.FO(this)},"call$0","gXo",0,0,null],
+y=w.W(y,1)}throw H.b(P.N(b))},
+bu:function(a){return P.FO(this)},
 $isQV:true,
 $asQV:null},
 ar:{
@@ -6028,18 +6078,18 @@
 lD:{
 "^":"a;",
 gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
-Zv:[function(a,b){return this.t(a,b)},"call$1","gRV",2,0,null,15,[]],
-aN:[function(a,b){var z,y
+Zv:function(a,b){return this.t(a,b)},
+aN:function(a,b){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.t(a,y))
-if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,406,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}},
 gl0:function(a){return J.de(this.gB(a),0)},
 gor:function(a){return!this.gl0(a)},
 grZ:function(a){if(J.de(this.gB(a),0))throw H.b(new P.lj("No elements"))
 return this.t(a,J.xH(this.gB(a),1))},
-tg:[function(a,b){var z,y,x,w
+tg:function(a,b){var z,y,x,w
 z=this.gB(a)
 y=J.x(z)
 x=0
@@ -6047,22 +6097,22 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 if(J.de(this.t(a,x),b))return!0
-if(!y.n(z,this.gB(a)))throw H.b(P.a4(a));++x}return!1},"call$1","gdj",2,0,null,132,[]],
-Vr:[function(a,b){var z,y
+if(!y.n(z,this.gB(a)))throw H.b(P.a4(a));++x}return!1},
+Vr:function(a,b){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.t(a,y))===!0)return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gGI",2,0,null,407,[]],
-zV:[function(a,b){var z
+if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
+zV:function(a,b){var z
 if(J.de(this.gB(a),0))return""
 z=P.p9("")
 z.We(a,b)
-return z.vM},"call$1","gNU",0,2,null,337,338,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,407,[]],
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
-eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,130,[]],
-tt:[function(a,b){var z,y,x
+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.A8(a,b),[null,null])},"call$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")},119,[]],
+eR:function(a,b){return H.q9(a,b,null,null)},
+tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
 C.Nm.sB(z,this.gB(a))}else{y=this.gB(a)
 if(typeof y!=="number")return H.s(y)
@@ -6074,30 +6124,31 @@
 if(!(x<y))break
 y=this.t(a,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,340,341,[]],
-h:[function(a,b){var z=this.gB(a)
+z[x]=y;++x}return z},
+br:function(a){return this.tt(a,!0)},
+h:function(a,b){var z=this.gB(a)
 this.sB(a,J.WB(z,1))
-this.u(a,z,b)},"call$1","ght",2,0,null,132,[]],
-FV:[function(a,b){var z,y,x
+this.u(a,z,b)},
+FV:function(a,b){var z,y,x
 for(z=J.GP(b);z.G();){y=z.gl()
 x=this.gB(a)
 this.sB(a,J.WB(x,1))
-this.u(a,x,y)}},"call$1","gDY",2,0,null,116,[]],
-Rz:[function(a,b){var z,y
+this.u(a,x,y)}},
+Rz:function(a,b){var z,y
 z=0
 while(!0){y=this.gB(a)
 if(typeof y!=="number")return H.s(y)
 if(!(z<y))break
 if(J.de(this.t(a,z),b)){this.YW(a,z,J.xH(this.gB(a),1),a,z+1)
 this.sB(a,J.xH(this.gB(a),1))
-return!0}++z}return!1},"call$1","guH",2,0,null,132,[]],
-V1:[function(a){this.sB(a,0)},"call$0","gRa",0,0,null],
-GT:[function(a,b){H.ZE(a,0,J.xH(this.gB(a),1),b)},"call$1","gH7",0,2,null,82,122,[]],
-pZ:[function(a,b,c){var z=J.Wx(b)
+return!0}++z}return!1},
+V1:function(a){this.sB(a,0)},
+GT:function(a,b){H.ZE(a,0,J.xH(this.gB(a),1),b)},
+pZ:function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
 z=J.Wx(c)
-if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},"call$2","gm0",4,0,null,123,[],124,[]],
-D6:[function(a,b,c){var z,y,x,w
+if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},
+D6:function(a,b,c){var z,y,x,w
 c=this.gB(a)
 this.pZ(a,b,c)
 z=J.xH(c,b)
@@ -6107,15 +6158,16 @@
 x=0
 for(;x<z;++x){w=this.t(a,b+x)
 if(x>=y.length)return H.e(y,x)
-y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
-Mu:[function(a,b,c){this.pZ(a,b,c)
-return H.q9(a,b,c,null)},"call$2","gYf",4,0,null,123,[],124,[]],
-UZ:[function(a,b,c){var z
+y[x]=w}return y},
+Jk:function(a,b){return this.D6(a,b,null)},
+Mu:function(a,b,c){this.pZ(a,b,c)
+return H.q9(a,b,c,null)},
+UZ:function(a,b,c){var z
 this.pZ(a,b,c)
 z=c-b
 this.YW(a,b,J.xH(this.gB(a),z),a,c)
-this.sB(a,J.xH(this.gB(a),z))},"call$2","gYH",4,0,null,123,[],124,[]],
-YW:[function(a,b,c,d,e){var z,y,x,w,v,u
+this.sB(a,J.xH(this.gB(a),z))},
+YW:function(a,b,c,d,e){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,this.gB(a)))H.vh(P.TE(b,0,this.gB(a)))
 z=J.Wx(c)
@@ -6133,8 +6185,9 @@
 if(x+y>v)throw H.b(new P.lj("Not enough elements"))
 if(typeof b!=="number")return H.s(b)
 if(x<b)for(u=y-1;u>=0;--u)this.u(a,b+u,z.t(w,x+u))
-else for(u=0;u<y;++u)this.u(a,b+u,z.t(w,x+u))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-XU:[function(a,b,c){var z,y
+else for(u=0;u<y;++u)this.u(a,b+u,z.t(w,x+u))},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+XU:function(a,b,c){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 if(c>=z)return-1
@@ -6143,20 +6196,22 @@
 while(!0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 if(!(y<z))break
-if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,339,132,[],85,[]],
-Pk:[function(a,b,c){var z,y
+if(J.de(this.t(a,y),b))return y;++y}return-1},
+u8:function(a,b){return this.XU(a,b,0)},
+Pk:function(a,b,c){var z,y
 c=J.xH(this.gB(a),1)
 for(z=c;y=J.Wx(z),y.F(z,0);z=y.W(z,1))if(J.de(this.t(a,z),b))return z
-return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],85,[]],
-xe:[function(a,b,c){var z=this.gB(a)
+return-1},
+cn:function(a,b){return this.Pk(a,b,null)},
+xe:function(a,b,c){var z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 z=b>z
 if(z)throw H.b(P.TE(b,0,this.gB(a)))
 if(b===this.gB(a)){this.h(a,c)
 return}this.sB(a,J.WB(this.gB(a),1))
 this.YW(a,b+1,this.gB(a),a,b)
-this.u(a,b,c)},"call$2","gJe",4,0,null,15,[],132,[]],
-oF:[function(a,b,c){var z,y
+this.u(a,b,c)},
+oF:function(a,b,c){var z,y
 if(b>=0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 z=b>z}else z=!0
@@ -6167,46 +6222,46 @@
 this.sB(a,J.WB(this.gB(a),y))
 if(typeof y!=="number")return H.s(y)
 this.YW(a,b+y,this.gB(a),a,b)
-this.Mh(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
-Mh:[function(a,b,c){var z,y
+this.Mh(a,b,c)},
+Mh:function(a,b,c){var z,y
 z=J.x(c)
 if(!!z.$isList){z=z.gB(c)
 if(typeof z!=="number")return H.s(z)
 this.zB(a,b,b+z,c)}else for(z=z.gA(c);z.G();b=y){y=b+1
-this.u(a,b,z.gl())}},"call$2","gpH",4,0,null,15,[],116,[]],
-bu:[function(a){var z
+this.u(a,b,z.gl())}},
+bu:function(a){var z
 if($.xb().tg(0,a))return"[...]"
 z=P.p9("")
 try{$.xb().h(0,a)
 z.KF("[")
 z.We(a,", ")
-z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},"call$0","gXo",0,0,null],
+z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},
 $isList:true,
 $askF:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
-ZQ:{
-"^":"Tp:355;a,b",
+LG:{
+"^":"Tp:293;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"call$2",null,4,0,null,453,[],275,[],"call"],
+z.KF(b)},"call$2",null,4,0,null,360,[],277,[],"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
 gA:function(a){var z=new P.o0(this,this.eZ,this.qT,this.av,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-aN:[function(a,b){var z,y,x
+aN:function(a,b){var z,y,x
 z=this.qT
 for(y=this.av;y!==this.eZ;y=(y+1&this.v5.length-1)>>>0){x=this.v5
 if(y<0||y>=x.length)return H.e(x,y)
 b.call$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,406,[]],
+if(z!==this.qT)H.vh(P.a4(this))}},
 gl0:function(a){return this.av===this.eZ},
 gB:function(a){return J.mQ(J.xH(this.eZ,this.av),this.v5.length-1)},
 grZ:function(a){var z,y
@@ -6217,7 +6272,7 @@
 y=J.mQ(J.xH(y,1),this.v5.length-1)
 if(y>=z.length)return H.e(z,y)
 return z[y]},
-Zv:[function(a,b){var z,y,x
+Zv:function(a,b){var z,y,x
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,this.gB(this)))throw H.b(P.TE(b,0,this.gB(this)))
 z=this.v5
@@ -6226,15 +6281,16 @@
 x=z.length
 y=(y+b&x-1)>>>0
 if(y<0||y>=x)return H.e(z,y)
-return z[y]},"call$1","gRV",2,0,null,15,[]],
-tt:[function(a,b){var z,y
+return z[y]},
+tt:function(a,b){var z,y
 if(b){z=H.VM([],[H.Kp(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
 z=H.VM(y,[H.Kp(this,0)])}this.wR(z)
-return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,340,341,[]],
-h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,132,[]],
-FV:[function(a,b){var z,y,x,w,v,u,t,s,r
+return z},
+br:function(a){return this.tt(a,!0)},
+h:function(a,b){this.NZ(0,b)},
+FV:function(a,b){var z,y,x,w,v,u,t,s,r
 z=J.x(b)
 if(!!z.$isList){y=z.gB(b)
 x=this.gB(this)
@@ -6259,22 +6315,22 @@
 H.qG(w,z,z+s,b,0)
 z=this.v5
 H.qG(z,0,r,b,s)
-this.eZ=r}}this.qT=this.qT+1}else for(z=z.gA(b);z.G();)this.NZ(0,z.gl())},"call$1","gDY",2,0,null,454,[]],
-Rz:[function(a,b){var z,y
+this.eZ=r}}this.qT=this.qT+1}else for(z=z.gA(b);z.G();)this.NZ(0,z.gl())},
+Rz:function(a,b){var z,y
 for(z=this.av;z!==this.eZ;z=(z+1&this.v5.length-1)>>>0){y=this.v5
 if(z<0||z>=y.length)return H.e(y,z)
 if(J.de(y[z],b)){this.bB(z)
 this.qT=this.qT+1
-return!0}}return!1},"call$1","guH",2,0,null,6,[]],
-V1:[function(a){var z,y,x,w,v
+return!0}}return!1},
+V1:function(a){var z,y,x,w,v
 z=this.av
 y=this.eZ
 if(z!==y){for(x=this.v5,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
 x[z]=null}this.eZ=0
 this.av=0
-this.qT=this.qT+1}},"call$0","gRa",0,0,null],
-bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
-NZ:[function(a,b){var z,y
+this.qT=this.qT+1}},
+bu:function(a){return H.mx(this,"{","}")},
+NZ:function(a,b){var z,y
 z=this.v5
 y=this.eZ
 if(y>>>0!==y||y>=z.length)return H.e(z,y)
@@ -6282,8 +6338,8 @@
 y=(y+1&this.v5.length-1)>>>0
 this.eZ=y
 if(this.av===y)this.VW()
-this.qT=this.qT+1},"call$1","gXk",2,0,null,132,[]],
-bB:[function(a){var z,y,x,w,v,u,t,s
+this.qT=this.qT+1},
+bB:function(a){var z,y,x,w,v,u,t,s
 z=this.v5.length-1
 if((a-this.av&z)>>>0<J.mQ(J.xH(this.eZ,a),z)){for(y=this.av,x=this.v5,w=x.length,v=a;v!==y;v=u){u=(v-1&z)>>>0
 if(u<0||u>=w)return H.e(x,u)
@@ -6300,8 +6356,8 @@
 if(v<0||v>=w)return H.e(x,v)
 x[v]=t}if(y>=w)return H.e(x,y)
 x[y]=null
-return a}},"call$1","gzv",2,0,null,455,[]],
-VW:[function(){var z,y,x,w
+return a}},
+VW:function(){var z,y,x,w
 z=Array(this.v5.length*2)
 z.fixed$length=init
 y=H.VM(z,[H.Kp(this,0)])
@@ -6314,8 +6370,8 @@
 H.qG(y,w,w+z,x,0)
 this.av=0
 this.eZ=this.v5.length
-this.v5=y},"call$0","gJm",0,0,null],
-wR:[function(a){var z,y,x,w
+this.v5=y},
+wR:function(a){var z,y,x,w
 z=this.av
 y=this.eZ
 if(typeof y!=="number")return H.s(y)
@@ -6330,7 +6386,7 @@
 if(typeof z!=="number")return H.s(z)
 y=this.v5
 H.qG(a,w,w+z,y,0)
-return J.WB(this.eZ,w)}},"call$1","gLR",2,0,null,79,[]],
+return J.WB(this.eZ,w)}},
 Eo:function(a,b){var z=Array(8)
 z.fixed$length=init
 this.v5=H.VM(z,[b])},
@@ -6343,11 +6399,11 @@
 if(typeof a!=="number")return a.O()
 a=(a<<2>>>0)-1
 for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}},"call$1","bD",2,0,null,191,[]]}},
+if(z===0)return a}},"call$1","bD",2,0,null,193,[]]}},
 o0:{
 "^":"a;Lz,pP,qT,Dc,fD",
 gl:function(){return this.fD},
-G:[function(){var z,y,x
+G:function(){var z,y,x
 z=this.Lz
 if(this.qT!==z.qT)H.vh(P.a4(z))
 y=this.Dc
@@ -6357,17 +6413,16 @@
 if(y>=x)return H.e(z,y)
 this.fD=z[y]
 this.Dc=(y+1&x-1)>>>0
-return!0},"call$0","gqy",0,0,null]},
+return!0}},
 qv:{
 "^":"a;G3>,Bb>,T8>",
 $isqv:true},
 jp:{
 "^":"qv;P*,G3,Bb,T8",
-r6:function(a,b){return this.P.call$1(b)},
 $asqv:function(a,b){return[a]}},
 GZ:{
 "^":"a;",
-vh:[function(a){var z,y,x,w,v,u,t,s
+vh:function(a){var z,y,x,w,v,u,t,s
 z=this.aY
 if(z==null)return-1
 y=this.iW
@@ -6401,11 +6456,11 @@
 y.T8=null
 y.Bb=null
 this.bb=this.bb+1
-return v},"call$1","gST",2,0,null,48,[]],
-Xu:[function(a){var z,y
+return v},
+Xu:function(a){var z,y
 for(z=a;y=z.T8,y!=null;z=y){z.T8=y.Bb
-y.Bb=z}return z},"call$1","gug",2,0,null,263,[]],
-bB:[function(a){var z,y,x
+y.Bb=z}return z},
+bB:function(a){var z,y,x
 if(this.aY==null)return
 if(!J.de(this.vh(a),0))return
 z=this.aY
@@ -6416,8 +6471,8 @@
 y=this.Xu(y)
 this.aY=y
 y.T8=x}this.qT=this.qT+1
-return z},"call$1","gzv",2,0,null,48,[]],
-fS:[function(a,b){var z,y
+return z},
+fS:function(a,b){var z,y
 this.P6=this.P6+1
 this.qT=this.qT+1
 if(this.aY==null){this.aY=a
@@ -6427,97 +6482,97 @@
 a.T8=y.T8
 y.T8=null}else{a.T8=y
 a.Bb=y.Bb
-y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,263,[],456,[]]},
-Ba:{
+y.Bb=null}this.aY=a}},
+Nb:{
 "^":"GZ;Cw,ac,aY,iW,P6,qT,bb",
 wS:function(a,b){return this.Cw.call$2(a,b)},
 Ef:function(a){return this.ac.call$1(a)},
-yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,457,[],458,[]],
-t:[function(a,b){if(b==null)throw H.b(new P.AT(b))
+yV:function(a,b){return this.wS(a,b)},
+t:function(a,b){if(b==null)throw H.b(new P.AT(b))
 if(this.Ef(b)!==!0)return
 if(this.aY!=null)if(J.de(this.vh(b),0))return this.aY.P
-return},"call$1","gIA",2,0,null,48,[]],
-Rz:[function(a,b){var z
+return},
+Rz:function(a,b){var z
 if(this.Ef(b)!==!0)return
 z=this.bB(b)
 if(z!=null)return z.P
-return},"call$1","guH",2,0,null,48,[]],
-u:[function(a,b,c){var z
+return},
+u:function(a,b,c){var z
 if(b==null)throw H.b(new P.AT(b))
 z=this.vh(b)
 if(J.de(z,0)){this.aY.P=c
-return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,48,[],30,[]],
-FV:[function(a,b){J.kH(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
+return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},
+FV:function(a,b){J.kH(b,new P.bF(this))},
 gl0:function(a){return this.aY==null},
 gor:function(a){return this.aY!=null},
-aN:[function(a,b){var z,y,x
+aN:function(a,b){var z,y,x
 z=H.Kp(this,0)
 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.call$2(z.gG3(x),z.gP(x))}},"call$1","gjw",2,0,null,117,[]],
+b.call$2(z.gG3(x),z.gP(x))}},
 gB:function(a){return this.P6},
-V1:[function(a){this.aY=null
+V1:function(a){this.aY=null
 this.P6=0
-this.qT=this.qT+1},"call$0","gRa",0,0,null],
-x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,48,[]],
-di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,30,[]],
-gvc:function(a){return H.VM(new P.OG(this),[H.Kp(this,0)])},
+this.qT=this.qT+1},
+x4:function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},
+di:function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},
+gvc:function(){return H.VM(new P.OG(this),[H.Kp(this,0)])},
 gUQ:function(a){var z=new P.uM(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
-$isBa:true,
+bu:function(a){return P.vW(this)},
+$isNb:true,
 $asGZ:function(a,b){return[a]},
 $asZ0:null,
 $isZ0:true,
 static:{GV:function(a,b,c,d){var z,y
 z=P.n4()
 y=new P.An(c)
-return H.VM(new P.Ba(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
+return H.VM(new P.Nb(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,275,[],"call"],
+return z},"call$1",null,2,0,null,277,[],"call"],
 $isEH:true},
 bF:{
 "^":"Tp;a",
 call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
+$signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Nb")}},
 BW:{
-"^":"Tp:459;a,b,c",
+"^":"Tp:361;a,b,c",
 call$1:[function(a){var z,y,x,w
 for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
 w=a.T8
 if(w!=null&&this.call$1(w)===!0)return!0
-a=a.Bb}return!1},"call$1",null,2,0,null,263,[],"call"],
+a=a.Bb}return!1},"call$1",null,2,0,null,265,[],"call"],
 $isEH:true},
 S6B:{
 "^":"a;",
 gl:function(){var z=this.ya
 if(z==null)return
 return this.Wb(z)},
-p0:[function(a){var z
+zw:function(a){var z
 for(z=this.Jt;a!=null;){z.push(a)
-a=J.NI(a)}},"call$1","gBl",2,0,null,263,[]],
-G:[function(){var z,y,x
+a=J.NI(a)}},
+G:function(){var z,y,x
 z=this.Dn
 if(this.qT!==z.qT)throw H.b(P.a4(z))
 y=this.Jt
 if(y.length===0){this.ya=null
 return!1}if(z.bb!==this.bb&&this.ya!=null){x=this.ya
 C.Nm.sB(y,0)
-if(x==null)this.p0(z.aY)
+if(x==null)this.zw(z.aY)
 else{z.vh(J.WI(x))
-this.p0(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
+this.zw(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
 z=y.pop()
 this.ya=z
-this.p0(J.xP(z))
-return!0},"call$0","gqy",0,0,null],
-Qf:function(a,b){this.p0(a.aY)}},
+this.zw(J.xP(z))
+return!0},
+Qf:function(a,b){this.zw(a.aY)}},
 OG:{
 "^":"mW;Dn",
 gB:function(a){return this.Dn.P6},
@@ -6544,32 +6599,32 @@
 $isyN:true},
 DN:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return J.WI(a)},"call$1","gBL",2,0,null,263,[]]},
+Wb:function(a){return J.WI(a)}},
 ZM:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return J.Vm(a)},"call$1","gBL",2,0,null,263,[]],
+Wb:function(a){return J.Vm(a)},
 $asS6B:function(a,b){return[b]}},
 HW:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a},"call$1","gBL",2,0,null,263,[]],
+Wb:function(a){return a},
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
 VQ:[function(a,b){var z=new P.JC()
-return z.call$2(null,new P.f1(z).call$1(a))},"call$2","os",4,0,null,192,[],193,[]],
+return z.call$2(null,new P.f1(z).call$1(a))},"call$2","os",4,0,null,194,[],195,[]],
 BS:[function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(new P.AT(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H4",4,0,null,33,[],193,[]],
-tp:[function(a){return a.Lt()},"call$1","BC",2,0,194,6,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H4",4,0,null,33,[],195,[]],
+tp:[function(a){return a.Lt()},"call$1","BC",2,0,196,6,[]],
 JC:{
-"^":"Tp:355;",
+"^":"Tp:293;",
 call$2:[function(a,b){return b},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 f1:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$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
@@ -6590,76 +6645,107 @@
 $asUk:function(){return[J.O,[J.Q,J.im]]}},
 Ud:{
 "^":"Ge;Ct,FN",
-bu:[function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
-else return"Converting object did not return an encodable object."},"call$0","gXo",0,0,null],
+bu:function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
+else return"Converting object did not return an encodable object."},
 static:{NM:function(a,b){return new P.Ud(a,b)}}},
 K8:{
 "^":"Ud;Ct,FN",
-bu:[function(a){return"Cyclic error in JSON stringify"},"call$0","gXo",0,0,null],
+bu:function(a){return"Cyclic error in JSON stringify"},
 static:{TP:function(a){return new P.K8(a,null)}}},
 by:{
 "^":"Uk;N5,iY",
-c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,33,[],193,[]],
-Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,30,[],195,[]],
+pW:function(a,b){return P.BS(a,this.gHe().N5)},
+kV:function(a){return this.pW(a,null)},
+Co:function(a,b){return P.Ks(a,this.gZE().Xi)},
+KP:function(a){return this.Co(a,null)},
 gZE:function(){return C.nX},
 gHe:function(){return C.A3},
 $asUk:function(){return[P.a,J.O]}},
 dI:{
 "^":"zF;Xi",
 $aszF:function(){return[P.a,J.O]}},
-Cf:{
+pz:{
 "^":"zF;N5",
 $aszF:function(){return[J.O,P.a]}},
 Sh:{
 "^":"a;iY,Vy,S7",
 Wt:function(a){return this.iY.call$1(a)},
-aK:[function(a){var z,y,x,w,v,u,t
+aK:function(a){var z,y,x,w,v,u,t,s,r
 z=J.U6(a)
 y=z.gB(a)
-x=H.VM([],[J.im])
 if(typeof y!=="number")return H.s(y)
-w=!1
+x=this.Vy
+w=0
 v=0
 for(;v<y;++v){u=z.j(a,v)
-if(u<32){x.push(92)
-switch(u){case 8:x.push(98)
+if(u>92)continue
+if(u<32){if(v>w){t=z.Nj(a,w,v)
+x.vM=x.vM+t}w=v+1
+s=P.O8(1,92,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
+switch(u){case 8:s=P.O8(1,98,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
 break
-case 9:x.push(116)
+case 9:s=P.O8(1,116,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
 break
-case 10:x.push(110)
+case 10:s=P.O8(1,110,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
 break
-case 12:x.push(102)
+case 12:s=P.O8(1,102,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
 break
-case 13:x.push(114)
+case 13:s=P.O8(1,114,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
 break
-default:x.push(117)
-t=u>>>12&15
-x.push(t<10?48+t:87+t)
-t=u>>>8&15
-x.push(t<10?48+t:87+t)
+default:s=P.O8(1,117,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
+s=P.O8(1,48,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
+s=P.O8(1,48,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
 t=u>>>4&15
-x.push(t<10?48+t:87+t)
+t=t<10?48+t:87+t
+s=P.O8(1,t,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
 t=u&15
-x.push(t<10?48+t:87+t)
-break}w=!0}else if(u===34||u===92){x.push(92)
-x.push(u)
-w=!0}else x.push(u)}z=w?P.HM(x):a
-this.Vy.KF(z)},"call$1","gPz",2,0,null,91,[]],
-WD:[function(a){var z=this.S7
-if(z.tg(0,a))throw H.b(P.TP(a))
-z.h(0,a)},"call$1","gaS",2,0,null,6,[]],
-rl:[function(a){var z,y,x,w,v
-if(!this.IS(a)){x=a
-w=this.S7
-if(w.tg(0,x))H.vh(P.TP(x))
-w.h(0,x)
+t=t<10?48+t:87+t
+s=P.O8(1,t,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
+break}}else if(u===34||u===92){if(v>w){t=z.Nj(a,w,v)
+x.vM=x.vM+t}w=v+1
+s=P.O8(1,92,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
+s=P.O8(1,u,J.im)
+t=H.eT(s)
+x.vM=x.vM+t}}if(w===0){r=typeof a==="string"?a:H.d(a)
+x.vM=x.vM+r}else if(w<y){z=z.Nj(a,w,y)
+x.vM=x.vM+z}},
+WD:function(a){var z,y,x,w
+for(z=this.S7,y=z.length,x=0;x<y;++x){w=z[x]
+if(a==null?w==null:a===w)throw H.b(P.TP(a))}z.push(a)},
+rl:function(a){var z,y,x,w
+if(!this.IS(a)){this.WD(a)
 try{z=this.Wt(a)
 if(!this.IS(z)){x=P.NM(a,null)
-throw H.b(x)}w.Rz(0,a)}catch(v){x=H.Ru(v)
+throw H.b(x)}x=this.S7
+if(0>=x.length)return H.e(x,0)
+x.pop()}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.NM(a,y))}}},"call$1","gO5",2,0,null,6,[]],
-IS:[function(a){var z,y,x,w
-z={}
+throw H.b(P.NM(a,y))}}},
+IS:function(a){var z,y,x,w,v,u
 if(typeof a==="number"){if(!C.CD.gx8(a))return!1
 this.Vy.KF(C.CD.bu(a))
 return!0}else if(a===!0){this.Vy.KF("true")
@@ -6669,61 +6755,54 @@
 z.KF("\"")
 this.aK(a)
 z.KF("\"")
-return!0}else{y=J.x(a)
-if(!!y.$isList){this.WD(a)
-z=this.Vy
-z.KF("[")
-if(J.z8(y.gB(a),0)){this.rl(y.t(a,0))
+return!0}else{z=J.x(a)
+if(!!z.$isList){this.WD(a)
+y=this.Vy
+y.KF("[")
+if(J.z8(z.gB(a),0)){this.rl(z.t(a,0))
 x=1
-while(!0){w=y.gB(a)
+while(!0){w=z.gB(a)
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
-z.vM=z.vM+","
-this.rl(y.t(a,x));++x}}z.KF("]")
-this.S7.Rz(0,a)
-return!0}else if(!!y.$isZ0){this.WD(a)
-w=this.Vy
-w.KF("{")
-z.a=!0
-y.aN(a,new P.tF(z,this))
-w.KF("}")
-this.S7.Rz(0,a)
-return!0}else return!1}},"call$1","gjQ",2,0,null,6,[]],
-static:{"^":"P3,Ib,FC,Yz,NoV,Jl,bz,eJ,Ho,ql,XI,PBv,QVv",Ks:[function(a,b){var z
+y.vM=y.vM+","
+this.rl(z.t(a,x));++x}}y.KF("]")
+this.Ei(a)
+return!0}else if(!!z.$isZ0){this.WD(a)
+y=this.Vy
+y.KF("{")
+for(w=J.GP(a.gvc()),v="\"";w.G();v=",\""){u=w.gl()
+y.vM=y.vM+v
+this.aK(u)
+y.vM=y.vM+"\":"
+this.rl(z.t(a,u))}y.KF("}")
+this.Ei(a)
+return!0}else return!1}},
+Ei:function(a){var z=this.S7
+if(0>=z.length)return H.e(z,0)
+z.pop()},
+static:{"^":"P3,Ib,FC,Yz,NoV,Jl,dH,bz,eJ,Ho,ql,XI,PBv,QVv",Ks:[function(a,b){var z
 b=P.BC()
 z=P.p9("")
-new P.Sh(b,z,P.yv(null)).rl(a)
-return z.vM},"call$2","nB",4,0,null,6,[],195,[]]}},
-tF:{
-"^":"Tp:460;a,b",
-call$2:[function(a,b){var z,y,x
-z=this.a
-y=this.b
-if(!z.a){x=y.Vy
-x.KF(",\"")}else{x=y.Vy
-x.KF("\"")}y.aK(a)
-x.KF("\":")
-y.rl(b)
-z.a=!1},"call$2",null,4,0,null,48,[],30,[],"call"],
-$isEH:true},
+new P.Sh(b,z,[]).rl(a)
+return z.vM},"call$2","nB",4,0,null,6,[],197,[]]}},
 z0:{
 "^":"ro;lH",
 goc:function(a){return"utf-8"},
 gZE:function(){return new P.om()}},
 om:{
 "^":"zF;",
-WJ:[function(a){var z,y,x
+WJ:function(a){var z,y,x
 z=J.U6(a)
 y=J.vX(z.gB(a),3)
 if(typeof y!=="number")return H.s(y)
 y=H.VM(Array(y),[J.im])
 x=new P.Rw(0,0,y)
 if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
-return C.Nm.D6(y,0,x.ZP)},"call$1","gj5",2,0,null,14,[]],
+return C.Nm.D6(y,0,x.ZP)},
 $aszF:function(){return[J.O,[J.Q,J.im]]}},
 Rw:{
 "^":"a;WF,ZP,EN",
-Lb:[function(a,b){var z,y,x,w,v
+Lb:function(a,b){var z,y,x,w,v
 z=this.EN
 y=this.ZP
 if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
@@ -6755,8 +6834,8 @@
 this.ZP=y+1
 if(y>=v)return H.e(z,y)
 z[y]=128|a&63
-return!1}},"call$2","gkL",4,0,null,461,[],462,[]],
-fJ:[function(a,b,c){var z,y,x,w,v,u,t,s
+return!1}},
+fJ:function(a,b,c){var z,y,x,w,v,u,t,s
 if(b!==c&&(J.lE(a,J.xH(c,1))&64512)===55296)c=J.xH(c,1)
 if(typeof c!=="number")return H.s(c)
 z=this.EN
@@ -6788,11 +6867,11 @@
 z[s]=128|v>>>6&63
 this.ZP=u+1
 if(u>=y)return H.e(z,u)
-z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,343,[],123,[],124,[]],
+z[u]=128|v&63}}return w},
 static:{"^":"n9"}}}],["dart.core","dart:core",,P,{
 "^":"",
 Te:[function(a){return},"call$1","Ex",2,0,null,50,[]],
-Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,196,131,[],187,[]],
+Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,198,133,[],189,[]],
 hl:[function(a){var z,y,x,w,v,u
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
@@ -6818,9 +6897,9 @@
 z.vM=y
 return y}return"Instance of '"+H.lh(a)+"'"},"call$1","Zx",2,0,null,6,[]],
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,199,131,[],187,[]],
-NS:[function(a){return H.CU(a)},"call$1","cE",2,0,200,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,33,[],34,[],163,[]],
+ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,201,133,[],189,[]],
+NS:[function(a){return H.CU(a)},"call$1","cE",2,0,202,6,[]],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,203,84,84,33,[],34,[],165,[]],
 O8:function(a,b,c){var z,y,x
 z=J.Qi(a,c)
 if(a!==0&&b!=null)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -6839,11 +6918,11 @@
 HM:function(a){return H.eT(a)},
 fc:function(a){return P.HM(P.O8(1,a,J.im))},
 HB:{
-"^":"Tp:355;a",
-call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],30,[],"call"],
+"^":"Tp:293;a",
+call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,138,[],30,[],"call"],
 $isEH:true},
 CL:{
-"^":"Tp:415;a",
+"^":"Tp:341;a",
 call$2:[function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
@@ -6853,21 +6932,21 @@
 $isEH:true},
 p4:{
 "^":"a;OF",
-bu:[function(a){return"Deprecated feature. Will be removed "+this.OF},"call$0","gXo",0,0,null]},
+bu:function(a){return"Deprecated feature. Will be removed "+this.OF}},
 a2:{
 "^":"a;",
-bu:[function(a){return this?"true":"false"},"call$0","gXo",0,0,null],
+bu:function(a){return this?"true":"false"},
 $isbool:true},
 Tx:{
 "^":"a;"},
 iP:{
 "^":"a;y3<,aL",
-n:[function(a,b){if(b==null)return!1
+n:function(a,b){if(b==null)return!1
 if(!J.x(b).$isiP)return!1
-return this.y3===b.y3&&this.aL===b.aL},"call$1","gUJ",2,0,null,109,[]],
-iM:[function(a,b){return C.CD.iM(this.y3,b.gy3())},"call$1","gYc",2,0,null,109,[]],
+return this.y3===b.y3&&this.aL===b.aL},
+iM:function(a,b){return C.CD.iM(this.y3,b.gy3())},
 giO:function(a){return this.y3},
-bu:[function(a){var z,y,x,w,v,u,t,s
+bu:function(a){var z,y,x,w,v,u,t,s
 z=this.aL
 y=P.Gq(z?H.o2(this).getUTCFullYear()+0:H.o2(this).getFullYear()+0)
 x=P.h0(z?H.o2(this).getUTCMonth()+1:H.o2(this).getMonth()+1)
@@ -6877,8 +6956,8 @@
 t=P.h0(z?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
 s=P.Vx(z?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0)
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
-else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"call$0","gXo",0,0,null],
-h:[function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},"call$1","ght",2,0,null,166,[]],
+else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},
+h:function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(new P.AT(a))},
 $isiP:true,
@@ -6916,7 +6995,7 @@
 if(typeof l!=="number")return H.s(l)
 s=J.xH(s,n*l)}k=!0}else k=!1
 j=H.zW(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"call$1","le",2,0,null,197,[]],Wu:function(a,b){var z=new P.iP(a,b)
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"call$1","le",2,0,null,199,[]],Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
 return z},Gq:[function(a){var z,y
 z=Math.abs(a)
@@ -6924,62 +7003,62 @@
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},"call$1","Cp",2,0,null,198,[]],Vx:[function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},"call$1","Cp",2,0,null,200,[]],Vx:[function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
-return"00"+a},"call$1","Dv",2,0,null,198,[]],h0:[function(a){if(a>=10)return""+a
-return"0"+a},"call$1","wI",2,0,null,198,[]]}},
+return"00"+a},"call$1","Dv",2,0,null,200,[]],h0:[function(a){if(a>=10)return""+a
+return"0"+a},"call$1","wI",2,0,null,200,[]]}},
 MF:{
-"^":"Tp:464;",
+"^":"Tp:363;",
 call$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"call$1",null,2,0,null,463,[],"call"],
+return H.BU(a,null,null)},"call$1",null,2,0,null,362,[],"call"],
 $isEH:true},
 Rq:{
-"^":"Tp:465;",
+"^":"Tp:364;",
 call$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"call$1",null,2,0,null,463,[],"call"],
+return H.IH(a,null)},"call$1",null,2,0,null,362,[],"call"],
 $isEH:true},
 a6:{
 "^":"a;Fq<",
-g:[function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},"call$1","gF1n",2,0,null,109,[]],
-W:[function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},"call$1","gTG",2,0,null,109,[]],
-U:[function(a,b){if(typeof b!=="number")return H.s(b)
-return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,466,[]],
-Z:[function(a,b){if(J.de(b,0))throw H.b(P.ts())
+g:function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},
+W:function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},
+U:function(a,b){if(typeof b!=="number")return H.s(b)
+return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},
+Z:function(a,b){if(J.de(b,0))throw H.b(P.ts())
 if(typeof b!=="number")return H.s(b)
-return P.k5(0,0,C.CD.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,467,[]],
-C:[function(a,b){return this.Fq<b.gFq()},"call$1","gix",2,0,null,109,[]],
-D:[function(a,b){return this.Fq>b.gFq()},"call$1","gh1",2,0,null,109,[]],
-E:[function(a,b){return this.Fq<=b.gFq()},"call$1","gER",2,0,null,109,[]],
-F:[function(a,b){return this.Fq>=b.gFq()},"call$1","gNH",2,0,null,109,[]],
+return P.k5(0,0,C.CD.Z(this.Fq,b),0,0,0)},
+C:function(a,b){return this.Fq<b.gFq()},
+D:function(a,b){return this.Fq>b.gFq()},
+E:function(a,b){return this.Fq<=b.gFq()},
+F:function(a,b){return this.Fq>=b.gFq()},
 gVs:function(){return C.CD.cU(this.Fq,1000)},
-n:[function(a,b){if(b==null)return!1
+n:function(a,b){if(b==null)return!1
 if(!J.x(b).$isa6)return!1
-return this.Fq===b.Fq},"call$1","gUJ",2,0,null,109,[]],
+return this.Fq===b.Fq},
 giO:function(a){return this.Fq&0x1FFFFFFF},
-iM:[function(a,b){return C.CD.iM(this.Fq,b.gFq())},"call$1","gYc",2,0,null,109,[]],
-bu:[function(a){var z,y,x,w,v
+iM:function(a,b){return C.CD.iM(this.Fq,b.gFq())},
+bu:function(a){var z,y,x,w,v
 z=new P.DW()
 y=this.Fq
 if(y<0)return"-"+H.d(P.k5(0,0,-y,0,0,0))
 x=z.call$1(C.CD.JV(C.CD.cU(y,60000000),60))
 w=z.call$1(C.CD.JV(C.CD.cU(y,1000000),60))
 v=new P.P7().call$1(C.CD.JV(y,1000000))
-return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},"call$0","gXo",0,0,null],
+return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
 $isa6:true,
-static:{"^":"Kl,S4d,pk,LoB,RD,b2,jS,ll,Do,f4,za,IJZ,iI,Vk,fm,rGr",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"Bk,S4d,pk,LoB,zj5,b2,jS,ll,Do,f4,za,IJZ,iI,Vk,fm,rGr",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Tp:424;",
+"^":"Tp:348;",
 call$1:[function(a){if(a>=100000)return H.d(a)
 if(a>=10000)return"0"+H.d(a)
 if(a>=1000)return"00"+H.d(a)
 if(a>=100)return"000"+H.d(a)
 if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},"call$1",null,2,0,null,198,[],"call"],
+return"00000"+H.d(a)},"call$1",null,2,0,null,200,[],"call"],
 $isEH:true},
 DW:{
-"^":"Tp:424;",
+"^":"Tp:348;",
 call$1:[function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},"call$1",null,2,0,null,198,[],"call"],
+return"0"+H.d(a)},"call$1",null,2,0,null,200,[],"call"],
 $isEH:true},
 Ge:{
 "^":"a;",
@@ -6987,23 +7066,23 @@
 $isGe:true},
 LK:{
 "^":"Ge;",
-bu:[function(a){return"Throw of null."},"call$0","gXo",0,0,null]},
+bu:function(a){return"Throw of null."}},
 AT:{
 "^":"Ge;G1>",
-bu:[function(a){var z=this.G1
+bu:function(a){var z=this.G1
 if(z!=null)return"Illegal argument(s): "+H.d(z)
-return"Illegal argument(s)"},"call$0","gXo",0,0,null],
+return"Illegal argument(s)"},
 static:{u:function(a){return new P.AT(a)}}},
 bJ:{
 "^":"AT;G1",
-bu:[function(a){return"RangeError: "+H.d(this.G1)},"call$0","gXo",0,0,null],
+bu:function(a){return"RangeError: "+H.d(this.G1)},
 static:{C3:function(a){return new P.bJ(a)},N:function(a){return new P.bJ("value "+H.d(a))},TE:function(a,b,c){return new P.bJ("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
 yd:{
 "^":"Ge;",
 static:{hS:function(){return new P.yd()}}},
 mp:{
 "^":"Ge;uF,UP,mP,SA,mZ",
-bu:[function(a){var z,y,x,w,v,u,t
+bu:function(a){var z,y,x,w,v,u,t
 z={}
 z.a=P.p9("")
 z.b=0
@@ -7015,70 +7094,70 @@
 t=typeof t==="string"?t:H.d(t)
 u.vM=u.vM+t}y=this.SA
 if(y!=null)y.aN(0,new P.CL(z))
-return"NoSuchMethodError : method not found: '"+H.d(this.UP)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+H.d(z.a)+"]"},"call$0","gXo",0,0,null],
+return"NoSuchMethodError : method not found: '"+H.d(this.UP)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+H.d(z.a)+"]"},
 $ismp:true,
 static:{lr:function(a,b,c,d,e){return new P.mp(a,b,c,d,e)}}},
 ub:{
 "^":"Ge;G1>",
-bu:[function(a){return"Unsupported operation: "+this.G1},"call$0","gXo",0,0,null],
+bu:function(a){return"Unsupported operation: "+this.G1},
 static:{f:function(a){return new P.ub(a)}}},
 ds:{
 "^":"Ge;G1>",
-bu:[function(a){var z=this.G1
-return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},"call$0","gXo",0,0,null],
+bu:function(a){var z=this.G1
+return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},
 $isGe:true,
 static:{SY:function(a){return new P.ds(a)}}},
 lj:{
 "^":"Ge;G1>",
-bu:[function(a){return"Bad state: "+this.G1},"call$0","gXo",0,0,null],
+bu:function(a){return"Bad state: "+this.G1},
 static:{w:function(a){return new P.lj(a)}}},
 UV:{
 "^":"Ge;YA",
-bu:[function(a){var z=this.YA
+bu:function(a){var z=this.YA
 if(z==null)return"Concurrent modification during iteration."
-return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"call$0","gXo",0,0,null],
+return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},
 static:{a4:function(a){return new P.UV(a)}}},
 TO:{
 "^":"a;",
-bu:[function(a){return"Out of Memory"},"call$0","gXo",0,0,null],
+bu:function(a){return"Out of Memory"},
 gI4:function(){return},
 $isGe:true},
 VS:{
 "^":"a;",
-bu:[function(a){return"Stack Overflow"},"call$0","gXo",0,0,null],
+bu:function(a){return"Stack Overflow"},
 gI4:function(){return},
 $isGe:true},
 t7:{
 "^":"Ge;Wo",
-bu:[function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},"call$0","gXo",0,0,null],
+bu:function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},
 static:{Gz:function(a){return new P.t7(a)}}},
 HG:{
 "^":"a;G1>",
-bu:[function(a){var z=this.G1
+bu:function(a){var z=this.G1
 if(z==null)return"Exception"
-return"Exception: "+H.d(z)},"call$0","gXo",0,0,null]},
+return"Exception: "+H.d(z)}},
 aE:{
 "^":"a;G1>",
-bu:[function(a){return"FormatException: "+H.d(this.G1)},"call$0","gXo",0,0,null],
+bu:function(a){return"FormatException: "+H.d(this.G1)},
 static:{cD:function(a){return new P.aE(a)}}},
 eV:{
 "^":"a;",
-bu:[function(a){return"IntegerDivisionByZeroException"},"call$0","gXo",0,0,null],
+bu:function(a){return"IntegerDivisionByZeroException"},
 static:{ts:function(){return new P.eV()}}},
 kM:{
 "^":"a;oc>",
-bu:[function(a){return"Expando:"+H.d(this.oc)},"call$0","gXo",0,0,null],
-t:[function(a,b){var z=H.of(b,"expando$values")
-return z==null?null:H.of(z,this.Qz())},"call$1","gIA",2,0,null,6,[]],
-u:[function(a,b,c){var z=H.of(b,"expando$values")
+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.Qz())},
+u:function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],30,[]],
-Qz:[function(){var z,y
+H.aw(b,"expando$values",z)}H.aw(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.aw(this,"expando$key",z)}return z},"call$0","gwT",0,0,null],
+H.aw(this,"expando$key",z)}return z},
 static:{"^":"bZT,rly,Ss"}},
 EH:{
 "^":"a;",
@@ -7094,13 +7173,13 @@
 $isZ0:true},
 L9:{
 "^":"a;",
-bu:[function(a){return"null"},"call$0","gXo",0,0,null]},
+bu:function(a){return"null"}},
 a:{
 "^":";",
-n:[function(a,b){return this===b},"call$1","gUJ",2,0,null,109,[]],
+n:function(a,b){return this===b},
 giO:function(a){return H.eQ(this)},
-bu:[function(a){return H.a5(this)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,336,[]],
+bu:function(a){return H.a5(this)},
+T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
 gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
@@ -7111,7 +7190,7 @@
 WU:{
 "^":"a;Qk,SU,Oq,Wn",
 gl:function(){return this.Wn},
-G:[function(){var z,y,x,w,v,u
+G:function(){var z,y,x,w,v,u
 z=this.Oq
 this.SU=z
 y=this.Qk
@@ -7127,15 +7206,15 @@
 this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
 return!0}}this.Oq=v
 this.Wn=w
-return!0},"call$0","gqy",0,0,null]},
+return!0}},
 Rn:{
 "^":"a;vM<",
 gB:function(a){return this.vM.length},
 gl0:function(a){return this.vM.length===0},
 gor:function(a){return this.vM.length!==0},
-KF:[function(a){var z=typeof a==="string"?a:H.d(a)
-this.vM=this.vM+z},"call$1","gMG",2,0,null,98,[]],
-We:[function(a,b){var z,y
+KF:function(a){var z=typeof a==="string"?a:H.d(a)
+this.vM=this.vM+z},
+We:function(a,b){var z,y
 z=J.GP(a)
 if(!z.G())return
 if(b.length===0)do{y=z.gl()
@@ -7145,9 +7224,9 @@
 for(;z.G();){this.vM=this.vM+b
 y=z.gl()
 y=typeof y==="string"?y:H.d(y)
-this.vM=this.vM+y}}},"call$2","gCA",2,2,null,337,451,[],338,[]],
-V1:[function(a){this.vM=""},"call$0","gRa",0,0,null],
-bu:[function(a){return this.vM},"call$0","gXo",0,0,null],
+this.vM=this.vM+y}}},
+V1:function(a){this.vM=""},
+bu:function(a){return this.vM},
 PD:function(a){if(typeof a==="string")this.vM=a
 else this.KF(a)},
 static:{p9:function(a){var z=new P.Rn("")
@@ -7173,18 +7252,18 @@
 if(z==="http")return 80
 if(z==="https")return 443}return this.HC},
 Ja:function(a,b){return this.tP.call$1(b)},
-x6:[function(a,b){var z,y
+x6:function(a,b){var z,y
 z=a==null
 if(z&&!0)return""
 z=!z
 if(z);y=z?P.Xc(a):C.jN.ez(b,new P.Kd()).zV(0,"/")
 if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
-return y},"call$2","gbQ",4,0,null,264,[],468,[]],
-Ky:[function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},"call$2","gAj",4,0,null,469,[],470,[]],
-uo:[function(a){if(a.length>0&&J.lE(a,0)===58)return!0
-return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,264,[]],
-SK:[function(a){var z,y,x,w,v
+return y},
+Ky:function(a,b){if(a==="")return"/"+H.d(b)
+return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
+uo:function(a){if(a.length>0&&J.lE(a,0)===58)return!0
+return J.UU(a,"/.")!==-1},
+SK:function(a){var z,y,x,w,v
 if(!this.uo(a))return a
 z=[]
 for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=!1;y.G();){w=y.lo
@@ -7196,13 +7275,13 @@
 z.pop()}x=!0}else if("."===w)x=!0
 else{z.push(w)
 x=!1}}if(x)z.push("")
-return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,264,[]],
-tb:[function(a){var z=this.ku
+return C.Nm.zV(z,"/")},
+tb:function(a){var z=this.ku
 if(""!==z){a.KF(z)
 a.KF("@")}a.KF(this.NN)
 if(!J.de(this.HC,0)){a.KF(":")
-a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,471,[]],
-bu:[function(a){var z,y
+a.KF(J.AG(this.HC))}},
+bu:function(a){var z,y
 z=P.p9("")
 y=this.Fi
 if(""!==y){z.KF(y)
@@ -7212,8 +7291,8 @@
 if(""!==y){z.KF("?")
 z.KF(y)}y=this.Ka
 if(""!==y){z.KF("#")
-z.KF(y)}return z.vM},"call$0","gXo",0,0,null],
-n:[function(a,b){var z,y
+z.KF(y)}return z.vM},
+n:function(a,b){var z,y
 if(b==null)return!1
 z=J.x(b)
 if(!z.$isiD)return!1
@@ -7223,7 +7302,7 @@
 else z=!1
 else z=!1
 else z=!1
-return z},"call$1","gUJ",2,0,null,109,[]],
+return z},
 giO:function(a){var z=new P.XZ()
 return z.call$2(this.Fi,z.call$2(this.ku,z.call$2(this.gJf(this),z.call$2(this.gtp(this),z.call$2(this.r0,z.call$2(this.tP,z.call$2(this.Ka,1)))))))},
 n3:function(a,b,c,d,e,f,g,h,i){if(h==="http"&&J.de(e,80))this.HC=0
@@ -7231,7 +7310,7 @@
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"y2,q7,tv,v5,vI,SF,fd,IL,dH,zk,yt,fC,O5,lf,qf,ML,j3,Pk,R1,qs,lL,WT,t2,H5,zst,eK,ws,Sp,aJ,JA7,wo,SQU,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+static:{"^":"y2,q7,tv,v5,vI,SF,fd,IL,hO,zk,yt,fC,O5,lf,qf,ML,j3,Pk,R1,qs,lL,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,wo,SQU,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
 x=new P.hP()
 w=new P.Uo(a1)
 v=J.U6(a1)
@@ -7288,7 +7367,7 @@
 a=x.C(k,i)?v.Nj(a1,x.g(k,1),i):""
 x=J.Wx(i)
 a0=x.C(i,u)?v.Nj(a1,x.g(i,1),u):""
-return P.R6(a0,c,b,null,z,a,null,g,e)},"call$1","rp",2,0,null,202,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
+return P.R6(a0,c,b,null,z,a,null,g,e)},"call$1","rp",2,0,null,204,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
 z=new P.iD(P.L7(b),null,null,z,i,P.LE(f,g),P.UJ(a),null,null)
 z.n3(a,b,c,d,e,f,g,h,i)
 return z},L7:[function(a){var z,y
@@ -7298,7 +7377,7 @@
 P.eg(C.xB.Nj(a,1,z))
 return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(new P.bJ("value "+y))
 if(a.charCodeAt(y)===58){P.eg(a)
-return"["+a+"]"}}return a},"call$1","jC",2,0,null,203,[]],iy:[function(a){var z,y,x,w,v,u
+return"["+a+"]"}}return a},"call$1","jC",2,0,null,205,[]],iy:[function(a){var z,y,x,w,v,u
 z=new P.hb()
 if(a==null)return""
 y=a.length
@@ -7312,7 +7391,7 @@
 if(u>=8)return H.e(C.mK,u)
 u=J.mQ(C.mK[u],C.jn.W4(1,v&15))!==0}else u=!1
 if(u);else throw H.b(new P.AT("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},"call$1","Um",2,0,null,204,[]],LE:[function(a,b){var z,y,x
+x=!1}}return x?a:a.toLowerCase()},"call$1","Um",2,0,null,206,[]],LE:[function(a,b){var z,y,x
 z={}
 y=a==null
 if(y&&!0)return""
@@ -7321,7 +7400,7 @@
 x=P.p9("")
 z.a=!0
 C.jN.aN(b,new P.yZ(z,x))
-return x.vM},"call$2","wF",4,0,null,205,[],206,[]],UJ:[function(a){return P.Xc(a)},"call$1","p7",2,0,null,207,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+return x.vM},"call$2","wF",4,0,null,207,[],208,[]],UJ:[function(a){return P.Xc(a)},"call$1","p7",2,0,null,209,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z={}
 y=J.U6(a).u8(a,"%")
 z.a=y
@@ -7366,11 +7445,11 @@
 r=l}else{z.a=t
 r=t}}if(z.b==null)return a
 if(z.c!==r)s.call$0()
-return J.AG(z.b)},"call$1","Sy",2,0,null,208,[]],q5:[function(a){var z,y
+return J.AG(z.b)},"call$1","Sy",2,0,null,210,[]],q5:[function(a){var z,y
 z=new P.Mx()
 y=a.split(".")
 if(y.length!==4)z.call$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"call$1","cf",2,0,null,203,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"call$1","cf",2,0,null,205,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=new P.kZ()
 y=new P.JT(a,z)
 if(J.q8(a)<2)z.call$1("address is too short")
@@ -7409,7 +7488,7 @@
 z.call$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.call$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.call$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.kV(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"call$1","q3",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+return P.F(s,!0,H.ip(s,"mW",0))},"call$1","q3",2,0,null,205,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -7425,35 +7504,35 @@
 y.vM=y.vM+u}else{s=P.O8(1,37,J.im)
 u=H.eT(s)
 y.vM=y.vM+u
-z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,209,210,211,[],212,[],213,[],214,[]]}},
+z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,211,212,213,[],214,[],215,[],216,[]]}},
 hP:{
-"^":"Tp:473;",
+"^":"Tp:366;",
 call$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.aa,z)
 z=J.mQ(C.aa[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,472,[],"call"],
+return z},"call$1",null,2,0,null,365,[],"call"],
 $isEH:true},
 Uo:{
-"^":"Tp:474;a",
+"^":"Tp:367;a",
 call$1:[function(a){a=J.aK(this.a,"]",a)
 if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
 return a+1},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 hb:{
-"^":"Tp:473;",
+"^":"Tp:366;",
 call$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.HE,z)
 z=J.mQ(C.HE[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,472,[],"call"],
+return z},"call$1",null,2,0,null,365,[],"call"],
 $isEH:true},
 Kd:{
-"^":"Tp:112;",
-call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,93,[],"call"],
 $isEH:true},
 yZ:{
-"^":"Tp:355;a,b",
+"^":"Tp:293;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -7464,26 +7543,26 @@
 z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 Gs:{
-"^":"Tp:473;",
+"^":"Tp:366;",
 call$1:[function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
-return z},"call$1",null,2,0,null,475,[],"call"],
+return z},"call$1",null,2,0,null,368,[],"call"],
 $isEH:true},
 pm:{
-"^":"Tp:473;",
-call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,475,[],"call"],
+"^":"Tp:366;",
+call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,368,[],"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:473;",
+"^":"Tp:366;",
 call$1:[function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.kg,z)
 z=J.mQ(C.kg[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,472,[],"call"],
+return z},"call$1",null,2,0,null,365,[],"call"],
 $isEH:true},
 wm:{
-"^":"Tp:474;b,c,d",
+"^":"Tp:367;b,c,d",
 call$1:[function(a){var z,y
 z=this.b
 y=C.xB.j(z,a)
@@ -7492,7 +7571,7 @@
 else return y},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 FB:{
-"^":"Tp:474;e",
+"^":"Tp:367;e",
 call$1:[function(a){var z,y,x,w
 for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
 if(48<=w&&w<=57)y=y*16+w-48
@@ -7501,7 +7580,7 @@
 else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 Lk:{
-"^":"Tp:114;a,f",
+"^":"Tp:116;a,f",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 y=z.b
@@ -7512,54 +7591,54 @@
 else y.KF(C.xB.Nj(w,x,v))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 XZ:{
-"^":"Tp:477;",
+"^":"Tp:370;",
 call$2:[function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"call$2",null,4,0,null,476,[],244,[],"call"],
+return b*31+z&1073741823},"call$2",null,4,0,null,369,[],246,[],"call"],
 $isEH:true},
 Mx:{
-"^":"Tp:181;",
+"^":"Tp:183;",
 call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 C9:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z,y
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.call$1("each part must be in the range of `0..255`")
-return z},"call$1",null,2,0,null,478,[],"call"],
+return z},"call$1",null,2,0,null,371,[],"call"],
 $isEH:true},
 kZ:{
-"^":"Tp:181;",
+"^":"Tp:183;",
 call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 JT:{
-"^":"Tp:479;a,b",
+"^":"Tp:372;a,b",
 call$2:[function(a,b){var z,y
 if(b-a>4)this.b.call$1("an IPv6 part can only contain a maximum of 4 hex digits")
 z=H.BU(C.xB.Nj(this.a,a,b),16,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.b.call$1("each part must be in the range of `0x0..0xFFFF`")
-return z},"call$2",null,4,0,null,123,[],124,[],"call"],
+return z},"call$2",null,4,0,null,125,[],126,[],"call"],
 $isEH:true},
 d9:{
-"^":"Tp:112;c",
+"^":"Tp:114;c",
 call$1:[function(a){var z=J.x(a)
 if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
 else return[z.m(a,8)&255,z.i(a,255)]},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rI:{
-"^":"Tp:355;",
+"^":"Tp:293;",
 call$2:[function(a,b){var z=J.Wx(a)
 b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,480,[],481,[],"call"],
+b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,373,[],374,[],"call"],
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"call$1","pq",2,0,215,21,[]],
-r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,99,[],216,[]],
-It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"call$3$onProgress$withCredentials","xF",2,5,null,82,82,217,[],218,[],219,[]],
+return"transitionend"},"call$1","pq",2,0,217,21,[]],
+r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,101,[],218,[]],
+It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"call$3$onProgress$withCredentials","xF",2,5,null,84,84,219,[],220,[],221,[]],
 lt:[function(a,b,c,d,e,f,g,h){var z,y,x
 z=W.zU
 y=H.VM(new P.Zf(P.Dt(z)),[z])
@@ -7570,18 +7649,18 @@
 z=C.MD.aM(x)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
-return y.MM},"call$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,82,82,82,82,82,82,82,217,[],220,[],218,[],221,[],222,[],223,[],224,[],219,[]],
+return y.MM},"call$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,84,84,84,84,84,84,84,219,[],222,[],220,[],223,[],224,[],225,[],226,[],221,[]],
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
 uC:[function(a){var z
 try{return!!J.x(a).$iscS}catch(z){H.Ru(z)
-return!1}},"call$1","pR",2,0,null,225,[]],
+return!1}},"call$1","pR",2,0,null,227,[]],
 C0:[function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"call$2","jx",4,0,null,226,[],30,[]],
+return a^a>>>6},"call$2","jx",4,0,null,228,[],30,[]],
 Pv:[function(a){if(a==null)return
-return W.P1(a)},"call$1","Ie",2,0,null,227,[]],
+return W.P1(a)},"call$1","Ie",2,0,null,229,[]],
 qc:[function(a){var z
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
@@ -7589,11 +7668,11 @@
 return}else return a},"call$1","Wq",2,0,null,21,[]],
 qr:[function(a){return a},"call$1","Ku",2,0,null,21,[]],
 Z9:[function(a){if(!!J.x(a).$isQF)return a
-return P.o7(a,!0)},"call$1","cj",2,0,null,96,[]],
-YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,228,[],7,[]],
-GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,47,[]],
-Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,47,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,229,47,[],12,[],230,[],231,[]],
+return P.o7(a,!0)},"call$1","cj",2,0,null,98,[]],
+YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,230,[],7,[]],
+GO:[function(a){return J.TD(a)},"call$1","V5",2,0,114,47,[]],
+Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,114,47,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,231,47,[],12,[],232,[],233,[]],
 wi:[function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Xr(d)
 if(z==null)throw H.b(new P.AT(d))
@@ -7632,15 +7711,15 @@
 Object.defineProperty(s, init.dispatchPropertyName, {value: r, enumerable: false, writable: true, configurable: true})
 q={prototype: s}
 if(!v)q.extends=e
-b.registerElement(c,q)},"call$5","uz",10,0,null,94,[],232,[],99,[],11,[],233,[]],
+b.registerElement(c,q)},"call$5","uz",10,0,null,96,[],234,[],101,[],11,[],235,[]],
 aF:[function(a){if(J.de($.X3,C.NU))return a
 if(a==null)return
-return $.X3.oj(a,!0)},"call$1","Rj",2,0,null,155,[]],
+return $.X3.oj(a,!0)},"call$1","Rj",2,0,null,157,[]],
 K2:[function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,155,[]],
+return $.X3.PT(a,!0)},"call$1","o6",2,0,null,157,[]],
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|GN|ir|uL|Ds|d1|pv|xI|Tg|Vfx|Jc|CN|Dsd|Be|tuj|i6|LP|lw|Vct|Ir|D13|rm|m8|WZq|jM|T5|AX|pva|mk|cda|pL|waa|jY|NG|V4|hx|V9|kKl|oO|V10|Kz|V11|qkb|V12|vj|LU|V13|KL|F1|V14|aQ|V15|Qa|V16|Ww|V17|tz|V18|fl|V19|Zt|V20|wM|V21|lI|XP|V22|JG|qe|knI|V23|fI|V24|HF|V25|nk|V26|ob|Nr|Uj|V27|xT|V28|uwf|I5|V29|en"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ao|xc|uL|Ds|d1|pv|xI|Tg|Vfx|Jc|CN|Dsd|Be|tuj|i6|LP|lw|Vct|Ir|D13|rm|Nr|Lt|UL|WZq|jM|qe|AX|pva|mk|cda|pL|waa|jY|NG|V4|hx|V9|kKl|oO|V10|fl|V11|qkb|V12|vj|LU|V13|KL|F1|V14|aQ|V15|Qa|V16|Ww|V17|tz|V18|Mv|V19|Zt|V20|wM|V21|lI|XP|V22|JG|V23|ov|rs|knI|V24|fI|V25|HF|V26|nk|V27|ob|Bc|Uj|V28|xT|V29|uwf|I5|V30|en"},
 zw:{
 "^":"Gv;",
 $isList:true,
@@ -7651,11 +7730,11 @@
 "%":"EntryArray"},
 Ps:{
 "^":"qE;N:target=,t5:type%,cC:hash%,Jf:host=,mH:href=",
-bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
+bu:function(a){return a.toString()},
 "%":"HTMLAnchorElement"},
 Ym:{
 "^":"qE;N:target=,cC:hash%,Jf:host=,mH:href=",
-bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
+bu:function(a){return a.toString()},
 "%":"HTMLAreaElement"},
 Xk:{
 "^":"qE;mH:href=,N:target=",
@@ -7673,7 +7752,6 @@
 "%":"HTMLBodyElement"},
 QW:{
 "^":"qE;MB:form=,oc:name%,t5:type%,P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLButtonElement"},
 Ny:{
 "^":"qE;fg:height%,R:width%",
@@ -7684,11 +7762,11 @@
 "%":";CanvasRenderingContext"},
 mj:{
 "^":"Oi;",
-A8:[function(a,b,c,d,e,f,g,h){var z
+A8:function(a,b,c,d,e,f,g,h){var z
 if(g!=null)z=!0
 else z=!1
 if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
-return}throw H.b(new P.AT("Incorrect number or type of arguments"))},"call$7","gFg",6,8,null,82,82,82,82,290,[],291,[],292,[],293,[],294,[],295,[],296,[]],
+return}throw H.b(new P.AT("Incorrect number or type of arguments"))},
 "%":"CanvasRenderingContext2D"},
 Zv:{
 "^":"KV;Rn:data=,B:length=",
@@ -7711,17 +7789,17 @@
 "%":"HTMLDataListElement"},
 QF:{
 "^":"KV;",
-JP:[function(a){return a.createDocumentFragment()},"call$0","gf8",0,0,null],
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,297,[]],
-ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,263,[],298,[]],
+JP:function(a){return a.createDocumentFragment()},
+Kb:function(a,b){return a.getElementById(b)},
+ek:function(a,b,c){return a.importNode(b,c)},
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,299,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,300,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,300,[]],
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+Ja:function(a,b){return a.querySelector(b)},
+pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 $isQF:true,
-"%":"Document|HTMLDocument|SVGDocument"},
+"%":"Document|HTMLDocument|XMLDocument"},
 Aj:{
 "^":"KV;",
 gwd:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.e7(a)),[null])
@@ -7732,11 +7810,11 @@
 x=J.w1(y)
 x.V1(y)
 x.FV(y,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,299,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,300,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,300,[]],
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+Ja:function(a,b){return a.querySelector(b)},
+pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 "%":";DocumentFragment"},
-rz:{
+rv:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
 Nh:{
@@ -7745,7 +7823,7 @@
 if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
 if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
 return z},
-bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
+bu:function(a){return a.toString()},
 $isNh:true,
 "%":"DOMException"},
 cv:{
@@ -7757,32 +7835,32 @@
 y=this.gwd(a)
 y.V1(0)
 y.FV(0,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,299,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,300,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,300,[]],
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+Ja:function(a,b){return a.querySelector(b)},
+pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 gDD:function(a){return new W.I4(a)},
 gwl:function(a){return P.T7(a.clientLeft,a.clientTop,a.clientWidth,a.clientHeight,null)},
 gD7:function(a){return P.T7(a.offsetLeft,a.offsetTop,a.offsetWidth,a.offsetHeight,null)},
-i4:[function(a){},"call$0","gQd",0,0,null],
-xo:[function(a){},"call$0","gbt",0,0,null],
-aC:[function(a,b,c,d){},"call$3","gxR",6,0,null,12,[],230,[],231,[]],
+i4:function(a){},
+xo:function(a){},
+aC:function(a,b,c,d){},
 gqn:function(a){return a.localName},
-bu:[function(a){return a.localName},"call$0","gXo",0,0,null],
-WO:[function(a,b){if(!!a.matches)return a.matches(b)
+bu:function(a){return a.localName},
+WO:function(a,b){if(!!a.matches)return a.matches(b)
 else if(!!a.webkitMatchesSelector)return a.webkitMatchesSelector(b)
 else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
 else if(!!a.msMatchesSelector)return a.msMatchesSelector(b)
 else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
-else throw H.b(P.f("Not supported on this platform"))},"call$1","geA",2,0,null,299,[]],
-bA:[function(a,b){var z=a
+else throw H.b(P.f("Not supported on this platform"))},
+bA:function(a,b){var z=a
 do{if(J.RF(z,b))return!0
 z=z.parentElement}while(z!=null)
-return!1},"call$1","gMn",2,0,null,299,[]],
-er:[function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},"call$0","gzd",0,0,null],
+return!1},
+er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
 gIW:function(a){return a.shadowRoot||a.webkitShadowRoot},
 gI:function(a){return new W.DM(a,a)},
-PN:[function(a,b){return a.getAttribute(b)},"call$1","gBy",2,0,null,12,[]],
-Zi:[function(a){return a.getBoundingClientRect()},"call$0","gfP",0,0,null],
+PN:function(a,b){return a.getAttribute(b)},
+Zi:function(a){return a.getBoundingClientRect()},
 gi9:function(a){return C.mt.f0(a)},
 gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
@@ -7800,14 +7878,14 @@
 ea:{
 "^":"Gv;It:_selector},Xt:bubbles=,t5:type=",
 gN:function(a){return W.qc(a.target)},
-aA:[function(a){return a.preventDefault()},"call$0","gnr",0,0,null],
+aA:function(a){return a.preventDefault()},
 $isea:true,
 "%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},
 D0:{
 "^":"Gv;",
 gI:function(a){return new W.Jn(a)},
-On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gtS",4,2,null,82,11,[],301,[],302,[]],
-Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],301,[],302,[]],
+On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
+Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
 $isD0:true,
 "%":";EventTarget"},
 as:{
@@ -7818,7 +7896,7 @@
 $ishH:true,
 "%":"File"},
 QU:{
-"^":"rz;tT:code=",
+"^":"rv;tT:code=",
 "%":"FileError"},
 Tq:{
 "^":"qE;B:length=,bP:method=,oc:name%,N:target=",
@@ -7826,16 +7904,16 @@
 xn:{
 "^":"Gb;",
 gB:function(a){return a.length},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
+return a[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
-Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","gRV",2,0,null,15,[]],
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
 $isList:true,
 $askF:function(){return[W.KV]},
 $isyN:true,
@@ -7846,8 +7924,9 @@
 zU:{
 "^":"wa;iC:responseText=,ys:status=",
 gn9:function(a){return W.Z9(a.response)},
-R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],303,[],304,[],305,[]],
-zY:[function(a,b){return a.send(b)},"call$1","gMT",0,2,null,82,236,[]],
+R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
+eo:function(a,b,c,d){return a.open(b,c,d)},
+zY:function(a,b){return a.send(b)},
 $iszU:true,
 "%":"XMLHttpRequest"},
 wa:{
@@ -7865,9 +7944,8 @@
 oo:function(a,b){return a.complete.call$1(b)},
 "%":"HTMLImageElement"},
 Mi:{
-"^":"qE;Tq:checked%,MB:form=,fg:height%,o6:list=,oc:name%,LA:src=,t5:type%,P:value%,R:width%",
+"^":"qE;Tq:checked%,MB:form=,fg:height%,oc:name%,LA:src=,t5:type%,P:value%,R:width%",
 RR:function(a,b){return a.accept.call$1(b)},
-r6:function(a,b){return a.value.call$1(b)},
 $isMi:true,
 $iscv:true,
 $isD0:true,
@@ -7878,7 +7956,6 @@
 "%":"HTMLKeygenElement"},
 wP:{
 "^":"qE;P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLLIElement"},
 eP:{
 "^":"qE;MB:form=",
@@ -7892,8 +7969,8 @@
 "%":"HTMLLinkElement"},
 cS:{
 "^":"Gv;cC:hash%,Jf:host=,mH:href=",
-VD:[function(a){return a.reload()},"call$0","gQU",0,0,null],
-bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
+VD:function(a){return a.reload()},
+bu:function(a){return a.toString()},
 $iscS:true,
 "%":"Location"},
 YI:{
@@ -7901,7 +7978,7 @@
 "%":"HTMLMapElement"},
 El:{
 "^":"qE;kc:error=,LA:src=",
-xW:[function(a){return a.load()},"call$0","gnB",0,0,null],
+xW:function(a){return a.load()},
 "%":"HTMLAudioElement;HTMLMediaElement"},
 zm:{
 "^":"Gv;tT:code=",
@@ -7928,22 +8005,22 @@
 "%":"HTMLMetaElement"},
 E9:{
 "^":"qE;P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLMeterElement"},
 Hw:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
 bn:{
 "^":"tH;",
-fZ:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gMT",2,2,null,82,236,[],306,[]],
+fZ:function(a,b,c){return a.send(b,c)},
+zY:function(a,b){return a.send(b)},
 "%":"MIDIOutput"},
 tH:{
 "^":"D0;jO:id=,oc:name=,t5:type=,Ye:version=",
 "%":"MIDIInput;MIDIPort"},
 Wp:{
 "^":"Mf;",
-nH:[function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
-return},"call$15","gEx",30,0,null,11,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[],314,[],315,[],316,[],317,[],318,[],319,[],320,[]],
+nH:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
+return},
 gwl:function(a){return H.VM(new P.hL(a.clientX,a.clientY),[null])},
 gD7:function(a){var z,y
 if(!!a.offsetX)return H.VM(new P.hL(a.offsetX,a.offsetY),[null])
@@ -7955,7 +8032,7 @@
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 H9:{
 "^":"Gv;",
-jh:[function(a,b,c,d,e,f,g,h,i){var z,y
+jh:function(a,b,c,d,e,f,g,h,i){var z,y
 z={}
 y=new W.Yg(z)
 y.call$2("childList",h)
@@ -7964,7 +8041,8 @@
 y.call$2("subtree",i)
 y.call$2("attributeOldValue",d)
 y.call$2("characterDataOldValue",g)
-a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],321,[],322,[],323,[],324,[],325,[],326,[],327,[]],
+a.observe(b,z)},
+yN:function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},
 "%":"MutationObserver|WebKitMutationObserver"},
 o4:{
 "^":"Gv;jL:oldValue=,N:target=,t5:type=",
@@ -7975,37 +8053,37 @@
 KV:{
 "^":"D0;p8:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,KV:parentNode=,a4:textContent%",
 gyT:function(a){return new W.e7(a)},
-wg:[function(a){var z=a.parentNode
-if(z!=null)z.removeChild(a)},"call$0","guH",0,0,null],
-Tk:[function(a,b){var z,y
+wg:function(a){var z=a.parentNode
+if(z!=null)z.removeChild(a)},
+Tk:function(a,b){var z,y
 try{z=a.parentNode
-J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,328,[]],
-aD:[function(a,b,c){var z,y,x
+J.ky(z,b,a)}catch(y){H.Ru(y)}return a},
+aD:function(a,b,c){var z,y,x
 z=J.x(b)
 if(!!z.$ise7){z=b.NL
 if(z===a)throw H.b(new P.AT(b))
-for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},"call$2","gZM",4,0,null,329,[],330,[]],
-bu:[function(a){var z=a.nodeValue
-return z==null?J.Gv.prototype.bu.call(this,a):z},"call$0","gXo",0,0,null],
-jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,331,[]],
-tg:[function(a,b){return a.contains(b)},"call$1","gdj",2,0,null,109,[]],
-mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gHc",4,0,null,331,[],330,[]],
-dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,331,[],332,[]],
+for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},
+bu:function(a){var z=a.nodeValue
+return z==null?J.Gv.prototype.bu.call(this,a):z},
+jx:function(a,b){return a.appendChild(b)},
+tg:function(a,b){return a.contains(b)},
+mK:function(a,b,c){return a.insertBefore(b,c)},
+dR:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
-"%":"DocumentType|Entity|Notation;Node"},
+"%":"DocumentType|Notation;Node"},
 yk:{
 "^":"ma;",
 gB:function(a){return a.length},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
+return a[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
-Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","gRV",2,0,null,15,[]],
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
 $isList:true,
 $askF:function(){return[W.KV]},
 $isyN:true,
@@ -8024,16 +8102,13 @@
 "%":"HTMLOptGroupElement"},
 Ql:{
 "^":"qE;MB:form=,vH:index=,ph:label%,P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 $isQl:true,
 "%":"HTMLOptionElement"},
 Xp:{
 "^":"qE;MB:form=,oc:name%,t5:type=,P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLOutputElement"},
-HD:{
+me:{
 "^":"qE;oc:name%,P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLParamElement"},
 jg:{
 "^":"Gv;tT:code=,G1:message=",
@@ -8043,10 +8118,9 @@
 "%":"ProcessingInstruction"},
 KR:{
 "^":"qE;P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLProgressElement"},
 kQ:{
-"^":"ea;",
+"^":"ea;ox:loaded=",
 $iskQ:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 LY:{
@@ -8058,7 +8132,6 @@
 "%":"HTMLScriptElement"},
 lp:{
 "^":"qE;MB:form=,B:length%,oc:name%,ig:selectedIndex%,t5:type=,P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 gbG:function(a){var z=W.vD(a.querySelectorAll("option"),null)
 z=z.ev(z,new W.Ou())
 return H.VM(new P.Yp(P.F(z,!0,H.ip(z,"mW",0))),[null])},
@@ -8066,7 +8139,7 @@
 "%":"HTMLSelectElement"},
 I0:{
 "^":"Aj;pQ:applyAuthorStyles=,Jf:host=",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,297,[]],
+Kb:function(a,b){return a.getElementById(b)},
 $isI0:true,
 "%":"ShadowRoot"},
 QR:{
@@ -8098,7 +8171,7 @@
 "%":"HTMLStyleElement"},
 Tb:{
 "^":"qE;",
-gWT:function(a){return H.VM(new W.Of(a.rows),[W.qp])},
+gWT:function(a){return H.VM(new W.uB(a.rows),[W.qp])},
 "%":"HTMLTableElement"},
 qp:{
 "^":"qE;",
@@ -8106,7 +8179,7 @@
 "%":"HTMLTableRowElement"},
 BT:{
 "^":"qE;",
-gWT:function(a){return H.VM(new W.Of(a.rows),[W.qp])},
+gWT:function(a){return H.VM(new W.uB(a.rows),[W.qp])},
 "%":"HTMLTableSectionElement"},
 yY:{
 "^":"qE;rz:content=",
@@ -8118,7 +8191,6 @@
 "%":"CDATASection|Text"},
 AE:{
 "^":"qE;MB:form=,oc:name%,WT:rows%,t5:type=,P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 $isAE:true,
 "%":"HTMLTextAreaElement"},
 R0:{
@@ -8143,8 +8215,8 @@
 if(W.uC(z)===!0)return z
 if(null==a._location_wrapper)a._location_wrapper=new W.Dk(z)
 return a._location_wrapper},
-oB:[function(a,b){return a.requestAnimationFrame(H.tR(b,1))},"call$1","gfl",2,0,null,155,[]],
-hr:[function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return
+oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
+hr:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return
   (function($this) {
    var vendors = ['ms', 'moz', 'webkit', 'o'];
    for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
@@ -8160,12 +8232,13 @@
       }, 16 /* 16ms ~= 60fps */);
    };
    $this.cancelAnimationFrame = function(id) { clearTimeout(id); }
-  })(a)},"call$0","gGO",0,0,null],
+  })(a)},
 geT:function(a){return W.Pv(a.parent)},
-cO:[function(a){return a.close()},"call$0","gJK",0,0,null],
-xc:[function(a,b,c,d){a.postMessage(P.bL(b),c)
-return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],333,[],334,[]],
-bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
+cO:function(a){return a.close()},
+xc:function(a,b,c,d){a.postMessage(P.bL(b),c)
+return},
+X6:function(a,b,c){return this.xc(a,b,c,null)},
+bu:function(a){return a.toString()},
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
@@ -8174,12 +8247,11 @@
 "%":"DOMWindow|Window"},
 Bn:{
 "^":"KV;oc:name=,P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 "%":"Attr"},
 FR:{
 "^":"Gv;QG:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,R:width=",
-bu:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},"call$0","gXo",0,0,null],
-n:[function(a,b){var z,y,x
+bu:function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},
+n:function(a,b){var z,y,x
 if(b==null)return!1
 z=J.x(b)
 if(!z.$istn)return!1
@@ -8192,7 +8264,7 @@
 if(y==null?x==null:y===x){y=a.height
 z=z.gfg(b)
 z=y==null?z==null:y===z}else z=!1}else z=!1}else z=!1
-return z},"call$1","gUJ",2,0,null,109,[]],
+return z},
 giO:function(a){var z,y,x,w,v
 z=J.v1(a.left)
 y=J.v1(a.top)
@@ -8213,16 +8285,16 @@
 Cy:{
 "^":"ecX;",
 gB:function(a){return a.length},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
+return a[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
-Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","gRV",2,0,null,15,[]],
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
 $isList:true,
 $askF:function(){return[W.KV]},
 $isyN:true,
@@ -8233,16 +8305,16 @@
 c5:{
 "^":"w1p;",
 gB:function(a){return a.length},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
+return a[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
-Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","gRV",2,0,null,15,[]],
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
 $isList:true,
 $askF:function(){return[W.yg]},
 $isyN:true,
@@ -8253,16 +8325,16 @@
 LO:{
 "^":"kEI;",
 gB:function(a){return a.length},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
+return a[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
-Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","gRV",2,0,null,15,[]],
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
 $isList:true,
 $askF:function(){return[W.uj]},
 $isyN:true,
@@ -8272,35 +8344,36 @@
 "%":"SpeechRecognitionResultList"},
 VG:{
 "^":"ar;MW,vG",
-tg:[function(a,b){return J.kE(this.vG,b)},"call$1","gdj",2,0,null,132,[]],
+tg:function(a,b){return J.kE(this.vG,b)},
 gl0:function(a){return this.MW.firstElementChild==null},
 gB:function(a){return this.vG.length},
-t:[function(a,b){var z=this.vG
+t:function(a,b){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=this.vG
+return z[b]},
+u:function(a,b,c){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,15,[],30,[]],
+this.MW.replaceChild(c,z[b])},
 sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
-h:[function(a,b){this.MW.appendChild(b)
-return b},"call$1","ght",2,0,null,30,[]],
+h:function(a,b){this.MW.appendChild(b)
+return b},
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
-FV:[function(a,b){var z,y
-for(z=J.GP(!!J.x(b).$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-Rz:[function(a,b){return!1},"call$1","guH",2,0,null,6,[]],
-xe:[function(a,b,c){var z,y,x
+FV:function(a,b){var z,y
+for(z=J.GP(!!J.x(b).$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},
+GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
+YW:function(a,b,c,d,e){throw H.b(P.SY(null))},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+Rz:function(a,b){return!1},
+xe:function(a,b,c){var z,y,x
 if(b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
 z=this.vG
 y=z.length
 x=this.MW
 if(b===y)x.appendChild(c)
 else{if(b>=y)return H.e(z,b)
-x.insertBefore(c,z[b])}},"call$2","gJe",4,0,null,15,[],132,[]],
-Mh:[function(a,b,c){throw H.b(P.SY(null))},"call$2","gpH",4,0,null,15,[],116,[]],
-V1:[function(a){J.c9(this.MW,"")},"call$0","gRa",0,0,null],
+x.insertBefore(c,z[b])}},
+Mh:function(a,b,c){throw H.b(P.SY(null))},
+V1:function(a){J.c9(this.MW,"")},
 grZ:function(a){var z=this.MW.lastElementChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
@@ -8310,17 +8383,17 @@
 wz:{
 "^":"ar;Sn,Sc",
 gB:function(a){return this.Sn.length},
-t:[function(a,b){var z=this.Sn
+t:function(a,b){var z=this.Sn
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,15,[],30,[]],
+return z[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot modify list"))},
 sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
-GT:[function(a,b){throw H.b(P.f("Cannot sort list"))},"call$1","gH7",0,2,null,82,122,[]],
+GT:function(a,b){throw H.b(P.f("Cannot sort list"))},
 grZ:function(a){return C.t5.grZ(this.Sn)},
 gDD:function(a){return W.or(this.Sc)},
-gi9:function(a){return C.mt.vo(this)},
-gVl:function(a){return C.pi.vo(this)},
-gLm:function(a){return C.i3.vo(this)},
+gi9:function(a){return C.mt.Uh(this)},
+gVl:function(a){return C.pi.Uh(this)},
+gLm:function(a){return C.i3.Uh(this)},
 nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
 $isList:true,
@@ -8332,21 +8405,21 @@
 z.nJ(a,b)
 return z}}},
 B1:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 M5:{
 "^":"Gv;"},
 Jn:{
 "^":"a;WK<",
-t:[function(a,b){return H.VM(new W.RO(this.gWK(),b,!1),[null])},"call$1","gIA",2,0,null,11,[]]},
+t:function(a,b){return H.VM(new W.RO(this.gWK(),b,!1),[null])}},
 DM:{
 "^":"Jn;WK:YO<,WK",
-t:[function(a,b){var z,y
+t:function(a,b){var z,y
 z=$.Vp()
 y=J.rY(b)
-if(z.gvc(z).Fb.x4(y.hc(b)))if(P.F7()===!0)return H.VM(new W.eu(this.YO,z.t(0,y.hc(b)),!1),[null])
-return H.VM(new W.eu(this.YO,b,!1),[null])},"call$1","gIA",2,0,null,11,[]],
+if(z.gvc().Fb.x4(y.hc(b)))if(P.F7()===!0)return H.VM(new W.eu(this.YO,z.t(0,y.hc(b)),!1),[null])
+return H.VM(new W.eu(this.YO,b,!1),[null])},
 static:{"^":"fD"}},
 RAp:{
 "^":"Gv+lD;",
@@ -8363,15 +8436,15 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Kx:{
-"^":"Tp:112;",
-call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,482,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,375,[],"call"],
 $isEH:true},
 iO:{
-"^":"Tp:355;a",
-call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,483,[],30,[],"call"],
+"^":"Tp:293;a",
+call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,376,[],30,[],"call"],
 $isEH:true},
 bU:{
-"^":"Tp:112;b,c",
+"^":"Tp:114;b,c",
 call$1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -8383,7 +8456,7 @@
 y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Yg:{
-"^":"Tp:355;a",
+"^":"Tp:293;a",
 call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 e7:{
@@ -8391,42 +8464,43 @@
 grZ:function(a){var z=this.NL.lastChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
-h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
-FV:[function(a,b){var z,y,x,w
+h:function(a,b){this.NL.appendChild(b)},
+FV:function(a,b){var z,y,x,w
 z=J.x(b)
 if(!!z.$ise7){z=b.NL
 y=this.NL
 if(z!==y)for(x=z.childNodes.length,w=0;w<x;++w)y.appendChild(z.firstChild)
-return}for(z=z.gA(b),y=this.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
-xe:[function(a,b,c){var z,y,x
+return}for(z=z.gA(b),y=this.NL;z.G();)y.appendChild(z.gl())},
+xe:function(a,b,c){var z,y,x
 if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
 z=this.NL
 y=z.childNodes
 x=y.length
 if(b===x)z.appendChild(c)
 else{if(b>=x)return H.e(y,b)
-z.insertBefore(c,y[b])}},"call$2","gJe",4,0,null,15,[],263,[]],
-oF:[function(a,b,c){var z,y
+z.insertBefore(c,y[b])}},
+oF:function(a,b,c){var z,y
 z=this.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
-Mh:[function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},"call$2","gpH",4,0,null,15,[],116,[]],
-Rz:[function(a,b){return!1},"call$1","guH",2,0,null,6,[]],
-V1:[function(a){J.c9(this.NL,"")},"call$0","gRa",0,0,null],
-u:[function(a,b,c){var z,y
+J.qD(z,c,y[b])},
+Mh:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
+Rz:function(a,b){return!1},
+V1:function(a){J.c9(this.NL,"")},
+u:function(a,b,c){var z,y
 z=this.NL
 y=z.childNodes
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
-z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,15,[],30,[]],
+z.replaceChild(c,y[b])},
 gA:function(a){return C.t5.gA(this.NL.childNodes)},
-GT:[function(a,b){throw H.b(P.f("Cannot sort Node list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
+GT:function(a,b){throw H.b(P.f("Cannot sort Node list"))},
+YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 gB:function(a){return this.NL.childNodes.length},
 sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
-t:[function(a,b){var z=this.NL.childNodes
+t:function(a,b){var z=this.NL.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,15,[]],
+return z[b]},
 $ise7:true,
 $asar:function(){return[W.KV]},
 $askF:function(){return[W.KV]},
@@ -8446,7 +8520,7 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Ou:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){return!!J.x(a).$isQl},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 yoo:{
@@ -8493,15 +8567,15 @@
 $asQV:function(){return[W.uj]}},
 tJ:{
 "^":"a;",
-FV:[function(a,b){J.kH(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
-di:[function(a){var z
-for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,30,[]],
-V1:[function(a){var z
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},"call$0","gRa",0,0,null],
-aN:[function(a,b){var z,y
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-b.call$2(y,this.t(0,y))}},"call$1","gjw",2,0,null,117,[]],
-gvc:function(a){var z,y,x,w
+FV:function(a,b){J.kH(b,new W.Zc(this))},
+di:function(a){var z
+for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},
+V1:function(a){var z
+for(z=this.gvc(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},
+aN:function(a,b){var z,y
+for(z=this.gvc(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+b.call$2(y,this.t(0,y))}},
+gvc:function(){var z,y,x,w
 z=this.MW.attributes
 y=H.VM([],[J.O])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
@@ -8518,210 +8592,224 @@
 $isZ0:true,
 $asZ0:function(){return[J.O,J.O]}},
 Zc:{
-"^":"Tp:355;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,453,[],275,[],"call"],
+"^":"Tp:293;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,360,[],277,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
-x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,48,[]],
-t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,48,[]],
-u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
-Rz:[function(a,b){var z,y
+x4:function(a){return this.MW.hasAttribute(a)},
+t:function(a,b){return this.MW.getAttribute(b)},
+u:function(a,b,c){this.MW.setAttribute(b,c)},
+Rz:function(a,b){var z,y
 z=this.MW
 y=z.getAttribute(b)
 z.removeAttribute(b)
-return y},"call$1","guH",2,0,null,48,[]],
-gB:function(a){return this.gvc(this).length},
-FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,263,[]]},
+return y},
+gB:function(a){return this.gvc().length},
+FJ:function(a){return a.namespaceURI==null}},
 nF:{
 "^":"As;QX,Kd",
-lF:[function(){var z=P.Ls(null,null,null,J.O)
+lF:function(){var z=P.Ls(null,null,null,J.O)
 this.Kd.aN(0,new W.Si(z))
-return z},"call$0","gt8",0,0,null],
-p5:[function(a){var z,y
+return z},
+p5:function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.QX,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},"call$1","gpJ",2,0,null,91,[]],
-OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,117,[]],
-O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],484,[]],
-Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,30,[]],
-xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,117,[]],
+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))},
+O4:function(a,b){return this.xz(new W.Iw(a,b))},
+qU:function(a){return this.O4(a,null)},
+Rz:function(a,b){return this.xz(new W.Fc(b))},
+xz:function(a){return this.Kd.es(0,!1,new W.hD(a))},
 yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.QX,!0,null),new W.FK()),[null,null])},
 static:{or:function(a){var z=new W.nF(a,null)
 z.yJ(a)
 return z}}},
 FK:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Si:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 vf:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Iw:{
-"^":"Tp:112;a,b",
+"^":"Tp:114;a,b",
 call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Fc:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 hD:{
-"^":"Tp:355;a",
-call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,485,[],132,[],"call"],
+"^":"Tp:293;a",
+call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,377,[],134,[],"call"],
 $isEH:true},
 I4:{
 "^":"As;MW",
-lF:[function(){var z,y,x
+lF:function(){var z,y,x
 z=P.Ls(null,null,null,J.O)
 for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
-if(x.length!==0)z.h(0,x)}return z},"call$0","gt8",0,0,null],
-p5:[function(a){P.F(a,!0,null)
-J.Pw(this.MW,a.zV(0," "))},"call$1","gpJ",2,0,null,91,[]]},
+if(x.length!==0)z.h(0,x)}return z},
+p5:function(a){P.F(a,!0,null)
+J.Pw(this.MW,a.zV(0," "))}},
 UC:{
 "^":"a;Ph",
-zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],302,[]],
-Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gVX",2,3,null,210,21,[],302,[]],
-jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,21,[],302,[]]},
+zc:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
+aM:function(a){return this.zc(a,!1)},
+Qm:function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},
+f0:function(a){return this.Qm(a,!1)},
+jl:function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},
+Uh:function(a){return this.jl(a,!1)}},
 RO:{
 "^":"qh;uv,Ph,Sg",
-KR:[function(a,b,c,d){var z=new W.Ov(0,this.uv,this.Ph,W.aF(a),this.Sg)
+KR:function(a,b,c,d){var z=new W.Ov(0,this.uv,this.Ph,W.aF(a),this.Sg)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.Zz()
-return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gdH",2,7,null,82,82,82,438,[],163,[],439,[],433,[]]},
+return z},
+zC:function(a,b,c){return this.KR(a,null,b,c)},
+yI:function(a){return this.KR(a,null,null,null)}},
 eu:{
 "^":"RO;uv,Ph,Sg",
-WO:[function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","geA",2,0,null,486,[]],
+WO:function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"qh",0)])
+return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},
 $isqh:true},
 ie:{
-"^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,376,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,309,[],"call"],
 $isEH:true},
 Ea:{
-"^":"Tp:112;b",
+"^":"Tp:114;b",
 call$1:[function(a){J.og(a,this.b)
 return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 pu:{
 "^":"qh;DI,Sg,Ph",
-WO:[function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","geA",2,0,null,486,[]],
-KR:[function(a,b,c,d){var z,y,x,w,v
+WO:function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"qh",0)])
+return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},
+KR:function(a,b,c,d){var z,y,x,w,v
 z=H.VM(new W.qO(null,P.L5(null,null,null,[P.qh,null],[P.MO,null])),[null])
 z.KS(null)
 for(y=this.DI,y=y.gA(y),x=this.Ph,w=this.Sg;y.G();){v=new W.RO(y.lo,x,w)
 v.$builtinTypeInfo=[null]
 z.h(0,v)}y=z.aV
 y.toString
-return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gdH",2,7,null,82,82,82,438,[],163,[],439,[],433,[]],
+return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},
+zC:function(a,b,c){return this.KR(a,null,b,c)},
+yI:function(a){return this.KR(a,null,null,null)},
 $isqh:true},
 i2:{
-"^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,376,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,309,[],"call"],
 $isEH:true},
 b0:{
-"^":"Tp:112;b",
+"^":"Tp:114;b",
 call$1:[function(a){J.og(a,this.b)
 return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Ov:{
 "^":"MO;VP,uv,Ph,u7,Sg",
-ed:[function(){if(this.uv==null)return
+ed:function(){if(this.uv==null)return
 this.Ns()
 this.uv=null
 this.u7=null
-return},"call$0","gZS",0,0,null],
-Fv:[function(a,b){if(this.uv==null)return
+return},
+TJ:function(a,b){if(this.uv==null)return
 this.VP=this.VP+1
-this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,436,[]],
+this.Ns()},
+yy:function(a){return this.TJ(a,null)},
 gRW:function(){return this.VP>0},
-QE:[function(a){if(this.uv==null||this.VP<=0)return
+QE:function(a){if(this.uv==null||this.VP<=0)return
 this.VP=this.VP-1
-this.Zz()},"call$0","gDQ",0,0,null],
-Zz:[function(){var z=this.u7
-if(z!=null&&this.VP<=0)J.cZ(this.uv,this.Ph,z,this.Sg)},"call$0","gBZ",0,0,null],
-Ns:[function(){var z=this.u7
-if(z!=null)J.GJ(this.uv,this.Ph,z,this.Sg)},"call$0","gEv",0,0,null]},
+this.Zz()},
+Zz:function(){var z=this.u7
+if(z!=null&&this.VP<=0)J.cZ(this.uv,this.Ph,z,this.Sg)},
+Ns:function(){var z=this.u7
+if(z!=null)J.GJ(this.uv,this.Ph,z,this.Sg)}},
 qO:{
 "^":"a;aV,eM",
-h:[function(a,b){var z,y
+h:function(a,b){var z,y
 z=this.eM
 if(z.x4(b))return
 y=this.aV
-z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},"call$1","ght",2,0,null,487,[]],
-Rz:[function(a,b){var z=this.eM.Rz(0,b)
-if(z!=null)z.ed()},"call$1","guH",2,0,null,487,[]],
+z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},
+Rz:function(a,b){var z=this.eM.Rz(0,b)
+if(z!=null)z.ed()},
 cO:[function(a){var z,y
 for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.aV.cO(0)},"call$0","gJK",0,0,114],
+this.aV.cO(0)},"call$0","gJK",0,0,116],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
 RX:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){return this.a.Rz(0,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 bO:{
-"^":"a;De",
-cN:function(a){return this.De.call$1(a)},
-zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],302,[]]},
+"^":"a;xY",
+cN:function(a){return this.xY.call$1(a)},
+zc:function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},
+aM:function(a){return this.zc(a,!1)}},
 Gm:{
 "^":"a;",
 gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.ip(a,"Gm",0)])},
-h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,30,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,116,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,82,122,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gJe",4,0,null,15,[],132,[]],
-oF:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gFD",4,0,null,15,[],116,[]],
-Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},"call$2","gpH",4,0,null,15,[],116,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","guH",2,0,null,6,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-UZ:[function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},"call$2","gYH",4,0,null,123,[],124,[]],
+h:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
+FV:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
+GT:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+oF:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+Mh:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
+Rz:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
+YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+UZ:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
 $isList:true,
 $askF:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
-Of:{
+uB:{
 "^":"ar;xa",
 gA:function(a){return H.VM(new W.Qg(J.GP(this.xa)),[null])},
 gB:function(a){return this.xa.length},
-h:[function(a,b){J.bi(this.xa,b)},"call$1","ght",2,0,null,132,[]],
-Rz:[function(a,b){return J.V1(this.xa,b)},"call$1","guH",2,0,null,132,[]],
-V1:[function(a){J.U2(this.xa)},"call$0","gRa",0,0,null],
-t:[function(a,b){var z=this.xa
+h:function(a,b){J.bi(this.xa,b)},
+Rz:function(a,b){return J.V1(this.xa,b)},
+V1:function(a){J.U2(this.xa)},
+t:function(a,b){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=this.xa
+return z[b]},
+u:function(a,b,c){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
+z[b]=c},
 sB:function(a,b){J.KM(this.xa,b)},
-GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,339,132,[],123,[]],
-Pk:[function(a,b,c){return J.ff(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
-xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gJe",4,0,null,15,[],132,[]],
-YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-UZ:[function(a,b,c){J.Y8(this.xa,b,c)},"call$2","gYH",4,0,null,123,[],124,[]]},
+GT:function(a,b){J.LH(this.xa,b)},
+XU:function(a,b,c){return J.aK(this.xa,b,c)},
+u8:function(a,b){return this.XU(a,b,0)},
+Pk:function(a,b,c){return J.ff(this.xa,b,c)},
+cn:function(a,b){return this.Pk(a,b,null)},
+xe:function(a,b,c){return J.BM(this.xa,b,c)},
+YW:function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+UZ:function(a,b,c){J.Y8(this.xa,b,c)}},
 Qg:{
 "^":"a;je",
-G:[function(){return this.je.G()},"call$0","gqy",0,0,null],
+G:function(){return this.je.G()},
 gl:function(){return this.je.QZ}},
 W9:{
 "^":"a;nj,vN,Nq,QZ",
-G:[function(){var z,y
+G:function(){var z,y
 z=this.Nq+1
 y=this.vN
 if(z<y){this.QZ=J.UQ(this.nj,z)
 this.Nq=z
 return!0}this.QZ=null
 this.Nq=y
-return!1},"call$0","gqy",0,0,null],
+return!1},
 gl:function(){return this.QZ}},
 vZ:{
-"^":"Tp:112;a,b",
+"^":"Tp:114;a,b",
 call$1:[function(a){var z=H.Va(this.b)
 Object.defineProperty(a, init.dispatchPropertyName, {value: z, enumerable: false, writable: true, configurable: true})
 a.constructor=a.__proto__.constructor
@@ -8730,22 +8818,23 @@
 dW:{
 "^":"a;Ui",
 geT:function(a){return W.P1(this.Ui.parent)},
-cO:[function(a){return this.Ui.close()},"call$0","gJK",0,0,null],
-xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],333,[],334,[]],
+cO:function(a){return this.Ui.close()},
+xc:function(a,b,c,d){this.Ui.postMessage(b,c)},
+X6:function(a,b,c){return this.xc(a,b,c,null)},
 gI:function(a){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-On:[function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},"call$3","gtS",4,2,null,82,11,[],301,[],302,[]],
-Y9:[function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},"call$3","gcF",4,2,null,82,11,[],301,[],302,[]],
+On:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
+Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 $isD0:true,
 static:{P1:[function(a){if(a===window)return a
-else return new W.dW(a)},"call$1","lG",2,0,null,234,[]]}},
+else return new W.dW(a)},"call$1","lG",2,0,null,236,[]]}},
 Dk:{
 "^":"a;WK",
 gcC:function(a){return this.WK.hash},
 scC:function(a,b){this.WK.hash=b},
 gJf:function(a){return this.WK.host},
 gmH:function(a){return this.WK.href},
-VD:[function(a){return this.WK.reload()},"call$0","gQU",0,0,null],
-bu:[function(a){return this.WK.toString()},"call$0","gXo",0,0,null],
+VD:function(a){return this.WK.reload()},
+bu:function(a){return this.WK.toString()},
 $iscS:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
 "^":"",
 hF:{
@@ -8760,58 +8849,58 @@
 "^":"Eo;mH:href=",
 "%":"SVGAltGlyphElement"},
 eG:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEBlendElement"},
 lv:{
-"^":"d5;t5:type=,UQ:values=,fg:height=,R:width=,x=,y=",
+"^":"d5;t5:type=,UQ:values=,fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
 pf:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
 NV:{
-"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
+"^":"d5;kp:operator=,fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFECompositeElement"},
 nm:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
 mCz:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEDiffuseLightingElement"},
 kK:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEDisplacementMapElement"},
 bb:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEFloodElement"},
 Ob:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
-me:{
-"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
+TM:{
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=,mH:href=",
 "%":"SVGFEImageElement"},
 oB:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEMergeElement"},
 EI:{
-"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
+"^":"d5;kp:operator=,fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEMorphologyElement"},
 MI8:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEOffsetElement"},
 ca:{
 "^":"d5;x=,y=",
 "%":"SVGFEPointLightElement"},
 um:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
 eW:{
 "^":"d5;x=,y=",
 "%":"SVGFESpotLightElement"},
 kL:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFETileElement"},
 Fu:{
-"^":"d5;t5:type=,fg:height=,R:width=,x=,y=",
+"^":"d5;t5:type=,fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 QN:{
 "^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
@@ -8831,7 +8920,7 @@
 Yd:{
 "^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGMaskElement"},
-Gr:{
+Ac:{
 "^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
 MU:{
@@ -8856,10 +8945,10 @@
 gLm:function(a){return C.i3.f0(a)},
 gE8:function(a){return C.W2.f0(a)},
 $isD0:true,
-"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement"},
+"%":"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"},
 hy:{
 "^":"zp;fg:height=,R:width=,x=,y=",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,297,[]],
+Kb:function(a,b){return a.getElementById(b)},
 $ishy:true,
 "%":"SVGSVGElement"},
 mHq:{
@@ -8874,20 +8963,20 @@
 pyk:{
 "^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGUseElement"},
-wD:{
+GN:{
 "^":"d5;mH:href=",
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
 O7:{
 "^":"As;LO",
-lF:[function(){var z,y,x,w
+lF:function(){var z,y,x,w
 z=this.LO.getAttribute("class")
 y=P.Ls(null,null,null,J.O)
 if(z==null)return y
 for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
-if(w.length!==0)y.h(0,w)}return y},"call$0","gt8",0,0,null],
-p5:[function(a){this.LO.setAttribute("class",a.zV(0," "))},"call$1","gpJ",2,0,null,91,[]]}}],["dart.dom.web_sql","dart:web_sql",,P,{
+if(w.length!==0)y.h(0,w)}return y},
+p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
 "^":"",
-TM:{
+Cf:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
 "^":"",
@@ -8896,16 +8985,16 @@
 $ishq:true,
 static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-xZ:[function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.R4, a, b)},"call$2$captureThis","oo",2,3,null,210,117,[],235,[]],
+xZ:[function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.R4, a, b)},"call$2$captureThis","oo",2,3,null,212,119,[],237,[]],
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.Ek(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"call$4","qH",8,0,null,155,[],235,[],168,[],87,[]],
+d=z}return P.wY(H.Ek(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"call$4","qH",8,0,null,157,[],237,[],170,[],89,[]],
 Dm:[function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a, b, { value: c})
-return!0}catch(z){H.Ru(z)}return!1},"call$3","Iy",6,0,null,96,[],12,[],30,[]],
+return!0}catch(z){H.Ru(z)}return!1},"call$3","Iy",6,0,null,98,[],12,[],30,[]],
 Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},"call$2","Cb",4,0,null,96,[],12,[]],
+return},"call$2","Cb",4,0,null,98,[],12,[]],
 wY:[function(a){var z
 if(a==null)return
 else{if(typeof a!=="string")if(typeof a!=="number")if(typeof a!=="boolean"){z=J.x(a)
@@ -8917,10 +9006,10 @@
 if(!!z.$isiP)return H.o2(a)
 else if(!!z.$isE4)return a.eh
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}}},"call$1","En",2,0,112,96,[]],
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}}},"call$1","En",2,0,114,98,[]],
 hE:[function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.call$1(a)
-P.Dm(a,b,z)}return z},"call$3","dw",6,0,null,96,[],68,[],237,[]],
+P.Dm(a,b,z)}return z},"call$3","dw",6,0,null,98,[],68,[],239,[]],
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
 else{if(a instanceof Object){z=J.x(a)
@@ -8928,31 +9017,32 @@
 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)}},"call$1","Xl",2,0,194,96,[]],
+else return P.ND(a)}},"call$1","Xl",2,0,196,98,[]],
 ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),new P.QS())},"call$1","ln",2,0,null,96,[]],
+else return P.iQ(a,$.Iq(),new P.QS())},"call$1","ln",2,0,null,98,[]],
 iQ:[function(a,b,c){var z=P.Om(a,b)
 if(z==null||!(a instanceof Object)){z=c.call$1(a)
-P.Dm(a,b,z)}return z},"call$3","yF",6,0,null,96,[],68,[],237,[]],
+P.Dm(a,b,z)}return z},"call$3","yF",6,0,null,98,[],68,[],239,[]],
 E4:{
 "^":"a;eh",
-t:[function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
-return P.dU(this.eh[b])},"call$1","gIA",2,0,null,71,[]],
-u:[function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
-this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],30,[]],
+t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
+return P.dU(this.eh[b])},
+u:function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
+this.eh[b]=P.wY(c)},
 giO:function(a){return 0},
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
-Bm:[function(a){return a in this.eh},"call$1","gVOe",2,0,null,71,[]],
-bu:[function(a){var z,y
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isE4&&this.eh===b.eh},
+Bm:function(a){return a in this.eh},
+bu:function(a){var z,y
 try{z=String(this.eh)
 return z}catch(y){H.Ru(y)
-return P.a.prototype.bu.call(this,this)}},"call$0","gXo",0,0,null],
-V7:[function(a,b){var z,y
+return P.a.prototype.bu.call(this,this)}},
+V7:function(a,b){var z,y
 z=this.eh
 y=b==null?null:P.F(J.kl(b,P.En()),!0,null)
-return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],19,[]],
+return P.dU(z[a].apply(z,y))},
+nQ:function(a){return this.V7(a,null)},
 $isE4:true,
 static:{zV:function(a,b){var z,y,x
 z=P.wY(a)
@@ -8961,53 +9051,53 @@
 C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).call$1(a)},"call$1","Ij",2,0,null,236,[]]}},
+return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).call$1(a)},"call$1","Ij",2,0,null,238,[]]}},
 Gn:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
 y=J.x(a)
 if(!!y.$isZ0){x={}
 z.u(0,a,x)
-for(z=J.GP(y.gvc(a));z.G();){w=z.gl()
+for(z=J.GP(a.gvc());z.G();){w=z.gl()
 x[w]=this.call$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
 z.u(0,a,v)
 C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"call$1",null,2,0,null,96,[],"call"],
+return v}else return P.wY(a)},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true},
 r7:{
 "^":"E4;eh"},
 Tz:{
 "^":"Wk;eh",
-Lu:[function(a,b){var z=J.Wx(a)
+Lu:function(a,b){var z=J.Wx(a)
 if(z.C(a,0)||z.D(a,P.E4.prototype.t.call(this,this,"length")))throw H.b(P.TE(a,0,P.E4.prototype.t.call(this,this,"length")))
 z=J.Wx(b)
-if(z.C(b,a)||z.D(b,P.E4.prototype.t.call(this,this,"length")))throw H.b(P.TE(b,a,P.E4.prototype.t.call(this,this,"length")))},"call$2","goA",4,0,null,123,[],124,[]],
-t:[function(a,b){var z
+if(z.C(b,a)||z.D(b,P.E4.prototype.t.call(this,this,"length")))throw H.b(P.TE(b,a,P.E4.prototype.t.call(this,this,"length")))},
+t:function(a,b){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},
+u:function(a,b,c){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,15,[],30,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},
 gB:function(a){return P.E4.prototype.t.call(this,this,"length")},
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
-h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,30,[]],
-FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,116,[]],
-xe:[function(a,b,c){var z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
+h:function(a,b){this.V7("push",[b])},
+FV:function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},
+xe:function(a,b,c){var z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
 if(typeof z!=="number")return H.s(z)
 z=b>=z
 if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
-this.V7("splice",[b,0,c])},"call$2","gJe",4,0,null,15,[],132,[]],
-UZ:[function(a,b,c){this.Lu(b,c)
-this.V7("splice",[b,c-b])},"call$2","gYH",4,0,null,123,[],124,[]],
-YW:[function(a,b,c,d,e){var z,y,x
+this.V7("splice",[b,0,c])},
+UZ:function(a,b,c){this.Lu(b,c)
+this.V7("splice",[b,c-b])},
+YW:function(a,b,c,d,e){var z,y,x
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,P.E4.prototype.t.call(this,this,"length")))H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
 z=J.Wx(c)
@@ -9017,8 +9107,9 @@
 if(e<0)throw H.b(new P.AT(e))
 x=[b,y]
 C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
-this.V7("splice",x)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,82,122,[]]},
+this.V7("splice",x)},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+GT:function(a,b){this.V7("sort",[b])}},
 Wk:{
 "^":"E4+lD;",
 $isList:true,
@@ -9027,41 +9118,41 @@
 $isQV:true,
 $asQV:null},
 DV:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
-return z},"call$1",null,2,0,null,96,[],"call"],
+return z},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true},
 Hp:{
-"^":"Tp:112;a",
-call$1:[function(a){return new this.a(a)},"call$1",null,2,0,null,96,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return new this.a(a)},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true},
 Nz:{
-"^":"Tp:112;",
-call$1:[function(a){return new P.r7(a)},"call$1",null,2,0,null,96,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return new P.r7(a)},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true},
 Jd:{
-"^":"Tp:112;",
-call$1:[function(a){return H.VM(new P.Tz(a),[null])},"call$1",null,2,0,null,96,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return H.VM(new P.Tz(a),[null])},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true},
 QS:{
-"^":"Tp:112;",
-call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,96,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
 VC:[function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"call$2","hj",4,0,null,226,[],30,[]],
+return a^a>>>6},"call$2","hj",4,0,null,228,[],30,[]],
 Up:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
 a^=a>>>11
-return 536870911&a+((16383&a)<<15>>>0)},"call$1","Hj",2,0,null,226,[]],
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","Hj",2,0,null,228,[]],
 J:[function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(b))
 if(a>b)return b
 if(a<b)return a
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return(a+b)*a*b
 if(a===0&&C.ON.gzP(b)||C.ON.gG0(b))return b
-return a}return a},"call$2","yT",4,0,null,131,[],187,[]],
+return a}return a},"call$2","yT",4,0,null,133,[],189,[]],
 y:[function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(b))
 if(a>b)return a
@@ -9069,14 +9160,14 @@
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},"call$2","Rb",4,0,null,131,[],187,[]],
+return a},"call$2","Rb",4,0,null,133,[],189,[]],
 KD:{
 "^":"a;",
-j1:[function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
-return Math.random()*a>>>0},"call$1","gRD",2,0,null,488,[]]},
+j1:function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
+return Math.random()*a>>>0}},
 vY:{
 "^":"a;Bo,Hz",
-o2:[function(){var z,y,x,w,v,u
+o2:function(){var z,y,x,w,v,u
 z=this.Bo
 y=4294901760*z
 x=(y&4294967295)>>>0
@@ -9085,15 +9176,15 @@
 u=v+x+this.Hz
 z=(u&4294967295)>>>0
 this.Bo=z
-this.Hz=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},"call$0","gKC",0,0,null],
-j1:[function(a){var z,y,x
+this.Hz=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
+j1:function(a){var z,y,x
 if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
 if((a&z)===0){this.o2()
 return(this.Bo&z)>>>0}do{this.o2()
 y=this.Bo
 x=y%a}while(y-x+a>=4294967296)
-return x},"call$1","gRD",2,0,null,488,[]],
+return x},
 c3:function(a){var z,y,x,w,v,u,t,s
 z=J.u6(a,0)?-1:0
 do{y=J.Wx(a)
@@ -9128,23 +9219,23 @@
 this.o2()
 this.o2()
 this.o2()},
-static:{"^":"tg,PZ,r6",r2:function(a){var z=new P.vY(0,0)
+static:{"^":"dK,PZ,r6",r2:function(a){var z=new P.vY(0,0)
 z.c3(a)
 return z}}},
 hL:{
 "^":"a;x>,y>",
-bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z,y
+bu:function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},
+n:function(a,b){var z,y
 if(b==null)return!1
 if(!J.x(b).$ishL)return!1
 z=this.x
 y=b.x
-return(z==null?y==null:z===y)&&J.de(this.y,b.y)},"call$1","gUJ",2,0,null,109,[]],
+return(z==null?y==null:z===y)&&J.de(this.y,b.y)},
 giO:function(a){var z,y
 z=J.v1(this.x)
 y=J.v1(this.y)
 return P.Up(P.VC(P.VC(0,z),y))},
-g:[function(a,b){var z,y,x
+g:function(a,b){var z,y,x
 z=this.x
 y=J.RE(b)
 x=y.gx(b)
@@ -9152,8 +9243,8 @@
 if(typeof x!=="number")return H.s(x)
 y=new P.hL(z+x,J.WB(this.y,y.gy(b)))
 y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},"call$1","gF1n",2,0,null,109,[]],
-W:[function(a,b){var z,y,x
+return y},
+W:function(a,b){var z,y,x
 z=this.x
 y=J.RE(b)
 x=y.gx(b)
@@ -9161,13 +9252,13 @@
 if(typeof x!=="number")return H.s(x)
 y=new P.hL(z-x,J.xH(this.y,y.gy(b)))
 y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},"call$1","gTG",2,0,null,109,[]],
-U:[function(a,b){var z=this.x
+return y},
+U:function(a,b){var z=this.x
 if(typeof z!=="number")return z.U()
 if(typeof b!=="number")return H.s(b)
 z=new P.hL(z*b,J.vX(this.y,b))
 z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},"call$1","gEH",2,0,null,466,[]],
+return z},
 $ishL:true},
 HDe:{
 "^":"a;",
@@ -9177,8 +9268,8 @@
 gQG:function(a){var z=this.gG6(this)
 if(typeof z!=="number")return z.g()
 return z+this.fg},
-bu:[function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+this.R+" x "+this.fg},"call$0","gXo",0,0,null],
-n:[function(a,b){var z,y,x
+bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+this.R+" x "+this.fg},
+n:function(a,b){var z,y,x
 if(b==null)return!1
 z=J.x(b)
 if(!z.$istn)return!1
@@ -9190,7 +9281,7 @@
 if(typeof x!=="number")return x.g()
 if(x+this.R===z.gT8(b)){if(typeof y!=="number")return y.g()
 z=y+this.fg===z.gQG(b)}else z=!1}else z=!1}else z=!1
-return z},"call$1","gUJ",2,0,null,109,[]],
+return z},
 giO:function(a){var z,y,x,w
 z=J.v1(this.gBb(this))
 y=this.G6
@@ -9252,9 +9343,9 @@
 $isej:true,
 $isX9:true,
 $isNL:true},
-Fw:{
+tg:{
 "^":"X9;",
-$isFw:true},
+$istg:true},
 RS:{
 "^":"a;",
 $isRS:true,
@@ -9282,26 +9373,26 @@
 $isZ0:true},
 B8q:{
 "^":"a;",
-u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,48,[],30,[]],
-FV:[function(a,b){return Q.ah()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,48,[]],
-V1:[function(a){return Q.ah()},"call$0","gRa",0,0,null],
+u:function(a,b,c){return Q.ah()},
+FV:function(a,b){return Q.ah()},
+Rz:function(a,b){Q.ah()},
+V1:function(a){return Q.ah()},
 $isZ0:true},
 Nx:{
 "^":"a;",
-t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,48,[]],
-u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
-FV:[function(a,b){this.EV.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
-V1:[function(a){this.EV.V1(0)},"call$0","gRa",0,0,null],
-x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,48,[]],
-di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,30,[]],
-aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
+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)},
+x4:function(a){return this.EV.x4(a)},
+di:function(a){return this.EV.di(a)},
+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(a){var z=this.EV
+gvc:function(){var z=this.EV
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gB:function(a){return this.EV.X5},
-Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
+Rz:function(a,b){return this.EV.Rz(0,b)},
 gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
@@ -9319,12 +9410,12 @@
 "%":"ArrayBuffer"},
 pF:{
 "^":"Gv;",
-J2:[function(a,b,c){var z=J.Wx(b)
+J2:function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,15,[],335,[]],
-ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,15,[],335,[]],
-PZ:[function(a,b,c,d){this.ZF(a,b,d+1)
-return d},"call$3","gyD",6,0,null,123,[],124,[],335,[]],
+else throw H.b(new P.AT("Invalid list index "+H.d(b)))},
+ZF:function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},
+PZ:function(a,b,c,d){this.ZF(a,b,d+1)
+return d},
 $ispF:true,
 $isHY:true,
 "%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
@@ -9336,13 +9427,14 @@
 Hg:{
 "^":"Dg;",
 gbx:function(a){return C.hN},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.GW]},
 $isyN:true,
@@ -9353,13 +9445,14 @@
 L3:{
 "^":"Dg;",
 gbx:function(a){return C.lk},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.GW]},
 $isyN:true,
@@ -9370,13 +9463,14 @@
 zz:{
 "^":"Pg;",
 gbx:function(a){return C.jV},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.im]},
 $isyN:true,
@@ -9387,13 +9481,14 @@
 dE:{
 "^":"Pg;",
 gbx:function(a){return C.Im},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.im]},
 $isyN:true,
@@ -9404,13 +9499,14 @@
 IJ:{
 "^":"Pg;",
 gbx:function(a){return C.la},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.im]},
 $isyN:true,
@@ -9420,14 +9516,15 @@
 "%":"Int8Array"},
 us:{
 "^":"Pg;",
-gbx:function(a){return C.iN},
-t:[function(a,b){var z=a.length
+gbx:function(a){return C.iG},
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.im]},
 $isyN:true,
@@ -9438,13 +9535,14 @@
 N2:{
 "^":"Pg;",
 gbx:function(a){return C.Vh},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.im]},
 $isyN:true,
@@ -9456,13 +9554,14 @@
 "^":"Pg;",
 gbx:function(a){return C.nG},
 gB:function(a){return a.length},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.im]},
 $isyN:true,
@@ -9474,13 +9573,14 @@
 "^":"Pg;",
 gbx:function(a){return C.eY},
 gB:function(a){return a.length},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.im]},
 $isyN:true,
@@ -9491,7 +9591,7 @@
 b0B:{
 "^":"pF;",
 gB:function(a){return a.length},
-oZ:[function(a,b,c,d,e){var z,y,x
+oZ:function(a,b,c,d,e){var z,y,x
 z=a.length+1
 this.ZF(a,b,z)
 this.ZF(a,c,z)
@@ -9502,12 +9602,13 @@
 if(typeof y!=="number")return H.s(y)
 if(x-e<y)throw H.b(new P.lj("Not enough elements"))
 if(e!==0||x!==y)d=d.subarray(e,e+y)
-a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],33,[],125,[]],
+a.set(d,b)},
 $isXj:true},
 Dg:{
 "^":"Ip;",
-YW:[function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
+YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(a,b,c,d,e)
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true,
 $isList:true,
 $askF:function(){return[J.GW]},
@@ -9525,8 +9626,9 @@
 "^":"Ui+SU7;"},
 Pg:{
 "^":"nA;",
-YW:[function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
+YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isPg:true,
 $isList:true,
 $askF:function(){return[J.im]},
@@ -9550,11 +9652,11 @@
 return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 Ir:{
-"^":["Vct;Py%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.Py},null,null,1,0,368,"error",365,385],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,369,30,[],"error",365],
+"^":["Vct;Py%-320,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.Py},null,null,1,0,303,"error",300,316],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,304,30,[],"error",300],
 "@":function(){return[C.uW]},
-static:{TW:[function(a){var z,y,x,w
+static:{hG:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -9565,40 +9667,40 @@
 a.X0=w
 C.OD.ZL(a)
 C.OD.oX(a)
-return a},null,null,0,0,115,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[489],
+return a},null,null,0,0,117,"new ErrorViewElement$created"]}},
+"+ErrorViewElement":[378],
 Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
 rm:{
-"^":["D13;fn%-398,Ab%-398,Ln%-490,y4%-491,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.fn},null,null,1,0,370,"text",365,366],
-sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,32,30,[],"text",365],
-gzW:[function(a){return a.Ab},null,null,1,0,370,"lineMode",365,366],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",365],
-gFR:[function(a){return a.Ln},null,null,1,0,492,"callback",365,385],
+"^":["D13;a3%-329,Ab%-329,Ln%-379,y4%-380,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.a3},null,null,1,0,305,"text",300,301],
+sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,32,30,[],"text",300],
+gzW:[function(a){return a.Ab},null,null,1,0,305,"lineMode",300,301],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",300],
+gFR:[function(a){return a.Ln},null,null,1,0,381,"callback",300,316],
 Ki:function(a){return this.gFR(a).call$0()},
 VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,493,30,[],"callback",365],
-gPK:[function(a){return a.y4},null,null,1,0,494,"results",365,366],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,495,30,[],"results",365],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,382,30,[],"callback",300],
+gPK:[function(a){return a.y4},null,null,1,0,383,"results",300,301],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,384,30,[],"results",300],
 az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
 z=this.ct(a,C.eh,a.Ab,z)
 a.Ab=z
-if(J.de(z,"1-line")){z=J.JA(a.fn,"\n"," ")
-a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,402,21,[],310,[],79,[],"updateLineMode"],
+if(J.de(z,"1-line")){z=J.JA(a.a3,"\n"," ")
+a.a3=this.ct(a,C.mi,a.a3,z)}},"call$3","gxb",6,0,333,21,[],334,[],81,[],"updateLineMode"],
 kk:[function(a,b,c,d){var z,y,x
 J.zJ(b)
-z=a.fn
-a.fn=this.ct(a,C.mi,z,"")
+z=a.a3
+a.a3=this.ct(a,C.mi,z,"")
 if(a.Ln!=null){y=H.B7([],P.L5(null,null,null,null,null))
 x=R.Jk(y)
 J.kW(x,"expr",z)
 J.BM(a.y4,0,x)
-this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,402,21,[],310,[],79,[],"eval"],
+this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,333,21,[],334,[],81,[],"eval"],
 A3:[function(a,b){var z=J.MI(J.l2(b),"expr")
-a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,496,21,[],"selectExpr"],
+a.a3=this.ct(a,C.mi,a.a3,z)},"call$1","gHo",2,0,385,21,[],"selectExpr"],
 "@":function(){return[C.Qz]},
 static:{Rp:[function(a){var z,y,x,w,v
 z=R.Jk([])
@@ -9614,19 +9716,74 @@
 a.X0=v
 C.Gh.ZL(a)
 C.Gh.oX(a)
-return a},null,null,0,0,115,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[497],
+return a},null,null,0,0,117,"new EvalBoxElement$created"]}},
+"+EvalBoxElement":[386],
 D13:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"Tp:112;a-82",
-call$1:[function(a){J.kW(this.a,"value",a)},"call$1",null,2,0,112,56,[],"call"],
+"^":"Tp:114;a-84",
+call$1:[function(a){J.kW(this.a,"value",a)},"call$1",null,2,0,114,56,[],"call"],
 $isEH:true},
-"+ YW":[498]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ YW":[387]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
-m8:{
-"^":["xI;tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+Lt:{
+"^":["Nr;TS%-321,bY%-84,jv%-329,oy%-320,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gO9:[function(a){return a.TS},null,null,1,0,330,"busy",300,301],
+sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,331,30,[],"busy",300],
+gFR:[function(a){return a.bY},null,null,1,0,117,"callback",300,316],
+Ki:function(a){return this.gFR(a).call$0()},
+VN:function(a,b){return this.gFR(a).call$1(b)},
+sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,114,30,[],"callback",300],
+gNW:[function(a){return a.jv},null,null,1,0,305,"expr",300,316],
+sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,32,30,[],"expr",300],
+gyG:[function(a){return a.oy},null,null,1,0,303,"result",300,316],
+syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,304,30,[],"result",300],
+hT:[function(a,b,c,d){var z=a.TS
+if(z===!0)return
+if(a.bY!=null){a.TS=this.ct(a,C.S4,z,!0)
+a.oy=this.ct(a,C.UY,a.oy,null)
+this.VN(a,a.jv).ml(new R.Kz(a)).YM(new R.tM(a))}},"call$3","gDf",6,0,336,133,[],189,[],282,[],"evalNow"],
+"@":function(){return[C.P9]},
+static:{fL:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.TS=!1
+a.bY=null
+a.jv=""
+a.oy=null
+a.SO=z
+a.B7=y
+a.X0=w
+C.UF.ZL(a)
+C.UF.oX(a)
+return a},null,null,0,0,117,"new EvalLinkElement$created"]}},
+"+EvalLinkElement":[388],
+Nr:{
+"^":"xc+Pi;",
+$isd3:true},
+Kz:{
+"^":"Tp:304;a-84",
+call$1:[function(a){var z,y
+z=this.a
+y=J.RE(z)
+y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"call$1",null,2,0,304,100,[],"call"],
+$isEH:true},
+"+ Kz":[387],
+tM:{
+"^":"Tp:117;b-84",
+call$0:[function(){var z,y
+z=this.b
+y=J.RE(z)
+y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"call$0",null,0,0,117,"call"],
+$isEH:true},
+"+ tM":[387]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"^":"",
+UL:{
+"^":["xI;tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.E6]},
 static:{zY:[function(a){var z,y,x,w
 z=$.Nd()
@@ -9640,14 +9797,14 @@
 a.X0=w
 C.MC.ZL(a)
 C.MC.oX(a)
-return a},null,null,0,0,115,"new FieldRefElement$created"]}},
-"+FieldRefElement":[391]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+return a},null,null,0,0,117,"new FieldRefElement$created"]}},
+"+FieldRefElement":[322]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 jM:{
-"^":["WZq;vt%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gt0:[function(a){return a.vt},null,null,1,0,384,"field",365,385],
-st0:[function(a,b){a.vt=this.ct(a,C.IV,a.vt,b)},null,null,3,0,386,30,[],"field",365],
-pA:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+"^":["WZq;vt%-313,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gt0:[function(a){return a.vt},null,null,1,0,315,"field",300,316],
+st0:[function(a,b){a.vt=this.ct(a,C.IV,a.vt,b)},null,null,3,0,317,30,[],"field",300],
+pA:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 "@":function(){return[C.vc]},
 static:{bH:[function(a){var z,y,x,w
 z=$.Nd()
@@ -9660,16 +9817,16 @@
 a.X0=w
 C.LT.ZL(a)
 C.LT.oX(a)
-return a},null,null,0,0,115,"new FieldViewElement$created"]}},
-"+FieldViewElement":[499],
+return a},null,null,0,0,117,"new FieldViewElement$created"]}},
+"+FieldViewElement":[389],
 WZq:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
 AX:{
-"^":["T5;lh%-390,qe%-390,zg%-390,AP,Lk,tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gU4:[function(a){return a.lh},null,null,1,0,399,"qualified",365,385],
-sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,400,30,[],"qualified",365],
+"^":["qe;lh%-321,qe%-321,zg%-321,AP,fn,tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gU4:[function(a){return a.lh},null,null,1,0,330,"qualified",300,316],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,331,30,[],"qualified",300],
 aZ:[function(a,b){var z,y,x
 Q.xI.prototype.aZ.call(this,a,b)
 this.ct(a,C.D2,0,1)
@@ -9679,13 +9836,13 @@
 x=y&&J.UQ(z,"parent")!=null
 a.qe=this.ct(a,C.D2,a.qe,x)
 if(y){y=J.U6(z)
-y=y.t(z,"class")!=null&&J.UQ(y.t(z,"class"),"name")!=null&&!J.de(J.UQ(y.t(z,"class"),"name"),"::")}else y=!1
-a.zg=this.ct(a,C.Mo,a.zg,y)},"call$1","gLe",2,0,157,230,[],"refChanged"],
-gRH:[function(a){return a.qe},null,null,1,0,399,"hasParent",365,366],
-sRH:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,400,30,[],"hasParent",365],
-gE7:[function(a){return a.zg},null,null,1,0,399,"hasClass",365,366],
-sE7:[function(a,b){a.zg=this.ct(a,C.Mo,a.zg,b)},null,null,3,0,400,30,[],"hasClass",365],
-"@":function(){return[C.U7Q]},
+y=y.t(z,"owner")!=null&&J.de(y.t(z,"owner").gzS(),"Class")}else y=!1
+a.zg=this.ct(a,C.Mo,a.zg,y)},"call$1","gLe",2,0,159,232,[],"refChanged"],
+gRH:[function(a){return a.qe},null,null,1,0,330,"hasParent",300,301],
+sRH:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,331,30,[],"hasParent",300],
+gE7:[function(a){return a.zg},null,null,1,0,330,"hasClass",300,301],
+sE7:[function(a,b){a.zg=this.ct(a,C.Mo,a.zg,b)},null,null,3,0,331,30,[],"hasClass",300],
+"@":function(){return[C.o3]},
 static:{Wz:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -9701,17 +9858,63 @@
 a.X0=w
 C.Xo.ZL(a)
 C.Xo.oX(a)
-return a},null,null,0,0,115,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[500],
-T5:{
+return a},null,null,0,0,117,"new FunctionRefElement$created"]}},
+"+FunctionRefElement":[390],
+qe:{
 "^":"xI+Pi;",
 $isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 mk:{
-"^":["pva;Z8%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.Z8},null,null,1,0,384,"function",365,385],
-sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,386,30,[],"function",365],
-pA:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+"^":["pva;De%-313,Iu%-329,Ru%-329,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.De},null,null,1,0,315,"function",300,316],
+sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,317,30,[],"function",300],
+gUx:[function(a){return a.Iu},null,null,1,0,305,"qualifiedName",300,316],
+sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,32,30,[],"qualifiedName",300],
+gfY:[function(a){return a.Ru},null,null,1,0,305,"kind",300,316],
+sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,32,30,[],"kind",300],
+FW:[function(a,b){var z,y,x
+z=b!=null
+y=z&&J.UQ(b,"parent")!=null?J.UQ(b,"parent"):null
+if(y!=null)return this.FW(a,y)+"."+H.d(J.UQ(b,"user_name"))
+if(z){z=J.U6(b)
+z=z.t(b,"owner")!=null&&J.de(z.t(b,"owner").gzS(),"Class")}else z=!1
+x=z?J.UQ(b,"owner"):null
+if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
+return H.d(J.UQ(b,"user_name"))},"call$1","gWd",2,0,391,17,[],"_getQualifiedName"],
+ql:[function(a,b){var z,y
+this.ct(a,C.AO,0,1)
+this.ct(a,C.fy,0,1)
+z=this.FW(a,a.De)
+a.Iu=this.ct(a,C.AO,a.Iu,z)
+z=J.UQ(a.De,"kind")
+y=a.Ru
+switch(z){case"kRegularFunction":a.Ru=this.ct(a,C.fy,y,"function")
+break
+case"kClosureFunction":a.Ru=this.ct(a,C.fy,y,"closure function")
+break
+case"kSignatureFunction":a.Ru=this.ct(a,C.fy,y,"signature function")
+break
+case"kGetterFunction":a.Ru=this.ct(a,C.fy,y,"getter function")
+break
+case"kSetterFunction":a.Ru=this.ct(a,C.fy,y,"setter function")
+break
+case"kConstructor":a.Ru=this.ct(a,C.fy,y,"constructor")
+break
+case"kImplicitGetterFunction":a.Ru=this.ct(a,C.fy,y,"implicit getter function")
+break
+case"kImplicitSetterFunction":a.Ru=this.ct(a,C.fy,y,"implicit setter function")
+break
+case"kStaticInitializer":a.Ru=this.ct(a,C.fy,y,"static initializer")
+break
+case"kMethodExtractor":a.Ru=this.ct(a,C.fy,y,"method extractor")
+break
+case"kNoSuchMethodDispatcher":a.Ru=this.ct(a,C.fy,y,"noSuchMethod dispatcher")
+break
+case"kInvokeFieldDispatcher":a.Ru=this.ct(a,C.fy,y,"invoke field dispatcher")
+break
+default:a.Ru=this.ct(a,C.fy,y,"UNKNOWN")
+break}},"call$1","gNC",2,0,159,232,[],"functionChanged"],
+pA:[function(a,b){J.am(a.De).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
@@ -9724,36 +9927,36 @@
 a.X0=w
 C.h4.ZL(a)
 C.h4.oX(a)
-return a},null,null,0,0,115,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[501],
+return a},null,null,0,0,117,"new FunctionViewElement$created"]}},
+"+FunctionViewElement":[392],
 pva:{
 "^":"uL+Pi;",
 $isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
 "^":"",
 Qb:{
 "^":"a;HW,mS",
-F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"call$0","gaw",0,0,502],
+F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"call$0","gaw",0,0,393],
 gvH:function(a){return J.Ts(this.mS,4)},
 static:{"^":"Q0z",x6:function(a,b){var z=J.RE(b)
 return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.YD(a)),z.gx(b)),4))}}},
 pL:{
-"^":["cda;hi%-82,An%-82,dW%-82,rM%-82,Ge%-82,UL%-82,PA%-398,Oh%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gys:[function(a){return a.PA},null,null,1,0,370,"status",365,366],
-sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",365],
-gyw:[function(a){return a.Oh},null,null,1,0,384,"fragmentation",365,385],
-syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,386,30,[],"fragmentation",365],
+"^":["cda;hi%-84,An%-84,dW%-84,rM%-84,Ge%-84,UL%-84,PA%-329,Oh%-313,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gys:[function(a){return a.PA},null,null,1,0,305,"status",300,301],
+sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",300],
+gyw:[function(a){return a.Oh},null,null,1,0,315,"fragmentation",300,316],
+syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,317,30,[],"fragmentation",300],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
 a.hi=z
-J.oL(z).yI(this.gmo(a))},"call$0","gQd",0,0,114,"enteredView"],
+J.oL(z).yI(this.gmo(a))},"call$0","gQd",0,0,116,"enteredView"],
 LV:[function(a,b){var z,y,x
 for(z=J.GP(b),y=0;z.G();){x=z.gl()
 if(typeof x!=="number")return H.s(x)
-y=y*256+x}return y},"call$1","gzK",2,0,503,504,[],"_packColor"],
+y=y*256+x}return y},"call$1","gzK",2,0,394,395,[],"_packColor"],
 tn:[function(a,b,c,d){J.kW(a.UL,b,c)
 J.kW(a.rM,b,d)
-J.kW(a.Ge,this.LV(a,d),b)},"call$3","gkY",6,0,505,506,[],12,[],504,[],"_addClass"],
+J.kW(a.Ge,this.LV(a,d),b)},"call$3","gAa",6,0,396,397,[],12,[],395,[],"_addClass"],
 an:[function(a,b,c){var z,y,x,w,v,u
 for(z=J.GP(J.UQ(b,"members"));z.G();){y=z.gl()
 x=J.U6(y)
@@ -9765,14 +9968,14 @@
 J.kW(a.UL,w,x)
 J.kW(a.rM,w,u)
 J.kW(a.Ge,this.LV(a,u),w)}this.tn(a,c,"Free",$.R2())
-this.tn(a,0,"",$.mI())},"call$2","gUw",4,0,507,508,[],509,[],"_updateClassList"],
+this.tn(a,0,"",$.eK())},"call$2","gUw",4,0,398,399,[],400,[],"_updateClassList"],
 LI:[function(a,b){var z=b==null?C.vT:P.r2(b)
-return[z.j1(128),z.j1(128),z.j1(128),255]},"call$1","gz4",2,0,510,506,[],"_classIdToRGBA"],
+return[z.j1(128),z.j1(128),z.j1(128),255]},"call$1","gz4",2,0,401,397,[],"_classIdToRGBA"],
 Ic:[function(a,b){var z,y,x
 z=O.x6(a.An,b)
 y=z.mS
 x=J.Cl(J.Qd(z.HW),y,J.WB(y,4))
-return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"call$1","gQe",2,0,511,512,[],"_classNameAt"],
+return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"call$1","gQe",2,0,402,403,[],"_classNameAt"],
 yl:[function(a,b){var z,y,x,w,v,u,t
 z=J.vX(a.dW,J.YD(a.An))
 y=J.Ts(O.x6(a.An,b).mS,4)
@@ -9787,7 +9990,7 @@
 if(x){x=H.BU(J.UQ(J.UQ(u,w),"object_start"),null,null)
 t=J.UQ(a.Oh,"unit_size_bytes")
 if(typeof t!=="number")return H.s(t)
-return J.WB(x,v*t)}else return 0},"call$1","gdO",2,0,513,512,[],"_addressAt"],
+return J.WB(x,v*t)}else return 0},"call$1","gdO",2,0,404,403,[],"_addressAt"],
 U8:[function(a,b){var z,y,x,w,v
 z=J.RE(b)
 y="@ 0x"+J.cR(this.yl(a,z.gD7(b)),16)
@@ -9797,7 +10000,7 @@
 w=J.Cl(J.Qd(z.HW),x,J.WB(x,4))
 v=J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,w)))
 z=J.de(v,"")?"-":H.d(v)+" "+y
-a.PA=this.ct(a,C.PM,a.PA,z)},"call$1","gmo",2,0,496,376,[],"_handleMouseMove"],
+a.PA=this.ct(a,C.PM,a.PA,z)},"call$1","gmo",2,0,385,309,[],"_handleMouseMove"],
 My:[function(a){var z,y,x,w
 z=a.Oh
 if(z==null||a.hi==null)return
@@ -9815,7 +10018,7 @@
 a.An=w
 J.No(a.hi,J.YD(w))
 J.OE(a.hi,J.kd(a.An))
-this.ps(a,0)},"call$0","gCT",0,0,114,"_updateFragmentationData"],
+this.ps(a,0)},"call$0","gCT",0,0,116,"_updateFragmentationData"],
 ps:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=J.UQ(a.Oh,"pages")
 y=J.U6(z)
@@ -9847,18 +10050,18 @@
 k=J.Ts(x.Z(y,4),n.gR(o))
 new P.hL(l,k).$builtinTypeInfo=[null]
 if(!J.u6(k,m))break
-l=$.mI()
+l=$.eK()
 J.wp(n.gRn(o),y,x.g(y,4),l)
 v=new O.Qb(o,x.g(y,4))}y=J.Vf(a.hi)
 x=a.An
 J.My(y,x,0,0,0,w,J.YD(x),m)
-P.e4(new O.WQ(a,b),null)},"call$1","guq",2,0,514,515,[],"_renderPages"],
+P.e4(new O.WQ(a,b),null)},"call$1","guq",2,0,405,406,[],"_renderPages"],
 pA:[function(a,b){var z=a.Oh
 if(z==null)return
-J.QP(z).ox("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
-YS:[function(a,b){P.e4(new O.oc(a),null)},"call$1","gR2",2,0,157,230,[],"fragmentationChanged"],
+J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"call$1","gR2",2,0,159,232,[],"fragmentationChanged"],
 "@":function(){return[C.Cu]},
-static:{"^":"nK<-82,fM<-82,SoT<-82",pn:[function(a){var z,y,x,w,v,u,t
+static:{"^":"nK<-84,RD<-84,SoT<-84",pn:[function(a){var z,y,x,w,v,u,t
 z=H.B7([],P.L5(null,null,null,null,null))
 y=H.B7([],P.L5(null,null,null,null,null))
 x=H.B7([],P.L5(null,null,null,null,null))
@@ -9875,39 +10078,39 @@
 a.X0=t
 C.pJ.ZL(a)
 C.pJ.oX(a)
-return a},null,null,0,0,115,"new HeapMapElement$created"]}},
-"+HeapMapElement":[516],
+return a},null,null,0,0,117,"new HeapMapElement$created"]}},
+"+HeapMapElement":[407],
 cda:{
 "^":"uL+Pi;",
 $isd3:true},
 WQ:{
-"^":"Tp:115;a-82,b-377",
-call$0:[function(){J.fi(this.a,J.WB(this.b,1))},"call$0",null,0,0,115,"call"],
+"^":"Tp:117;a-84,b-310",
+call$0:[function(){J.fi(this.a,J.WB(this.b,1))},"call$0",null,0,0,117,"call"],
 $isEH:true},
-"+ WQ":[498],
+"+ WQ":[387],
 aG:{
-"^":"Tp:386;a-82",
+"^":"Tp:317;a-84",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"call$1",null,2,0,386,517,[],"call"],
+y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"call$1",null,2,0,317,408,[],"call"],
 $isEH:true},
-"+ aG":[498],
+"+ aG":[387],
 aO:{
-"^":"Tp:355;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,355,21,[],518,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,293,21,[],409,[],"call"],
 $isEH:true},
-"+ aO":[498],
+"+ aO":[387],
 oc:{
-"^":"Tp:115;a-82",
-call$0:[function(){J.vP(this.a)},"call$0",null,0,0,115,"call"],
+"^":"Tp:117;a-84",
+call$0:[function(){J.vP(this.a)},"call$0",null,0,0,117,"call"],
 $isEH:true},
-"+ oc":[498]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+"+ oc":[387]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 jY:{
-"^":["waa;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-382,X3%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.Ol},null,null,1,0,384,"profile",365,385],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,386,30,[],"profile",365],
+"^":["waa;GQ%-84,J0%-84,Oc%-84,CO%-84,bV%-84,kg%-84,LY%-84,q3%-84,Ol%-313,X3%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.Ol},null,null,1,0,315,"profile",300,316],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,317,30,[],"profile",300],
 i4:[function(a){var z,y
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#table")
@@ -9934,7 +10137,7 @@
 z.bG.u(0,"allowHtml",!0)
 J.kW(J.wc(a.kg),"sortColumn",1)
 J.kW(J.wc(a.kg),"sortAscending",!1)
-this.uB(a)},"call$0","gQd",0,0,114,"enteredView"],
+this.uB(a)},"call$0","gQd",0,0,116,"enteredView"],
 hZ:[function(a){var z,y,x,w,v,u
 z=a.Ol
 if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
@@ -9958,21 +10161,21 @@
 J.qK(a.Oc,["Used",z.t(u,"used")])
 J.qK(a.Oc,["Free",J.xH(z.t(u,"capacity"),z.t(u,"used"))])
 J.qK(a.Oc,["External",z.t(u,"external")])
-this.uB(a)},"call$0","gYs",0,0,114,"_updateChartData"],
+this.uB(a)},"call$0","gYs",0,0,116,"_updateChartData"],
 uB:[function(a){if(a.q3==null||a.kg==null)return
 a.kg.u5()
 a.kg.W2(a.bV)
 a.q3.u5()
 a.q3.W2(a.LY)
 a.J0.W2(a.GQ)
-a.CO.W2(a.Oc)},"call$0","goI",0,0,114,"_draw"],
+a.CO.W2(a.Oc)},"call$0","goI",0,0,116,"_draw"],
 K1:[function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
 x=z.t(b,"old")
 for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
 for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"call$1","gbU",2,0,519,275,[],"_classHasNoAllocations"],
+return!0},"call$1","gbU",2,0,410,277,[],"_classHasNoAllocations"],
 iF:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -9984,7 +10187,7 @@
 return J.WB(J.UQ(z.t(b,"old"),3),J.UQ(z.t(b,"old"),5))
 case 6:return J.UQ(J.UQ(b,"old"),5)
 case 7:return J.UQ(J.UQ(b,"old"),1)
-case 8:return J.UQ(J.UQ(b,"old"),3)}throw H.b(P.hS())},"call$2","gym",4,0,520,275,[],15,[],"_fullTableColumnValue"],
+case 8:return J.UQ(J.UQ(b,"old"),3)}throw H.b(P.hS())},"call$2","gym",4,0,411,277,[],15,[],"_fullTableColumnValue"],
 VI:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -9998,34 +10201,34 @@
 case 5:z=J.U6(b)
 return J.WB(J.UQ(z.t(b,"new"),1),J.UQ(z.t(b,"old"),1))
 case 6:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"old"),3))}throw H.b(P.hS())},"call$2","gcY",4,0,520,275,[],15,[],"_combinedTableColumnValue"],
+return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"old"),3))}throw H.b(P.hS())},"call$2","gcY",4,0,411,277,[],15,[],"_combinedTableColumnValue"],
 pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 ii:[function(a,b,c,d){var z=a.Ol
 if(z==null)return
-J.QP(z).ox("/allocationprofile/reset").ml(new K.xj(a)).OA(new K.VB())},"call$3","gNb",6,0,402,21,[],310,[],79,[],"resetAccumulator"],
+J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB())},"call$3","gNb",6,0,333,21,[],334,[],81,[],"resetAccumulator"],
 pM:[function(a,b){this.hZ(a)
 this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gJN(a))},"call$1","gwm",2,0,157,230,[],"profileChanged"],
+this.ct(a,C.WG,[],this.gJN(a))},"call$1","gwm",2,0,159,232,[],"profileChanged"],
 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.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,521,522,[],"formattedAverage",366],
-NC:[function(a,b){var z,y
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,412,413,[],"formattedAverage",301],
+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"))},"call$1","gJN",2,0,521,522,[],"formattedCollections",366],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gJN",2,0,412,413,[],"formattedCollections",301],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,521,522,[],"formattedTotalCollectionTime",366],
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,412,413,[],"formattedTotalCollectionTime",301],
 Dd:[function(a){var z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.LY=z
 z.Gl("string","Class")
@@ -10053,9 +10256,9 @@
 a.bV.Gl("number","Current")
 a.bV.Gl("number","Allocated Since GC")
 a.bV.Gl("number","Total before GC")
-a.bV.Gl("number","Survivors after GC")},null,null,0,0,115,"created"],
+a.bV.Gl("number","Survivors after GC")},null,null,0,0,117,"created"],
 "@":function(){return[C.dA]},
-static:{"^":"BO<-82,bQj<-82,xK<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",Lz:[function(a){var z,y,x,w
+static:{"^":"BO<-84,bQj<-84,xK<-84,V1g<-84,r1<-84,d6<-84,pC<-84,DP<-84",Lz:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -10068,37 +10271,37 @@
 C.Vc.ZL(a)
 C.Vc.oX(a)
 C.Vc.Dd(a)
-return a},null,null,0,0,115,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[523],
+return a},null,null,0,0,117,"new HeapProfileElement$created"]}},
+"+HeapProfileElement":[414],
 waa:{
 "^":"uL+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:386;a-82",
+"^":"Tp:317;a-84",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,386,517,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,317,408,[],"call"],
 $isEH:true},
-"+ nx":[498],
+"+ nx":[387],
 jm:{
-"^":"Tp:355;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,355,21,[],518,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,293,21,[],409,[],"call"],
 $isEH:true},
-"+ jm":[498],
+"+ jm":[387],
 xj:{
-"^":"Tp:386;a-82",
+"^":"Tp:317;a-84",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,386,517,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,317,408,[],"call"],
 $isEH:true},
-"+ xj":[498],
+"+ xj":[387],
 VB:{
-"^":"Tp:355;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,355,21,[],518,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,293,21,[],409,[],"call"],
 $isEH:true},
-"+ VB":[498]}],["html_common","dart:html_common",,P,{
+"+ VB":[387]}],["html_common","dart:html_common",,P,{
 "^":"",
 bL:[function(a){var z,y
 z=[]
@@ -10106,14 +10309,14 @@
 new P.wO().call$0()
 return y},"call$1","Lq",2,0,null,30,[]],
 o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],238,[]],
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,212,6,[],240,[]],
 f9:[function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
 if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"call$1","D3",2,0,null,239,[]],
+y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"call$1","D3",2,0,null,241,[]],
 QO:[function(a){if(!!J.x(a).$isqS)return{data: a.Rn, height: a.fg, width: a.R}
-return a},"call$1","Gg",2,0,null,240,[]],
+return a},"call$1","Gg",2,0,null,242,[]],
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
 $.L4=z}return z},
@@ -10121,7 +10324,7 @@
 if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
 $.PN=z}return z},
 aI:{
-"^":"Tp:188;b,c",
+"^":"Tp:190;b,c",
 call$1:[function(a){var z,y,x
 z=this.b
 y=z.length
@@ -10131,23 +10334,23 @@
 return y},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rG:{
-"^":"Tp:422;d",
+"^":"Tp:346;d",
 call$1:[function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,420,[],"call"],
+return z[a]},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true},
 yh:{
-"^":"Tp:524;e",
+"^":"Tp:415;e",
 call$2:[function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,420,[],28,[],"call"],
+z[a]=b},"call$2",null,4,0,null,344,[],28,[],"call"],
 $isEH:true},
 wO:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Tm:{
-"^":"Tp:112;f,UI,bK",
+"^":"Tp:114;f,UI,bK",
 call$1:[function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
@@ -10183,11 +10386,11 @@
 w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ib:{
-"^":"Tp:355;a,Gq",
+"^":"Tp:293;a,Gq",
 call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 CA:{
-"^":"Tp:188;a,b",
+"^":"Tp:190;a,b",
 call$1:[function(a){var z,y,x,w
 z=this.a
 y=z.length
@@ -10197,19 +10400,19 @@
 return y},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 YL:{
-"^":"Tp:422;c",
+"^":"Tp:346;c",
 call$1:[function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,420,[],"call"],
+return z[a]},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true},
 KC:{
-"^":"Tp:524;d",
+"^":"Tp:415;d",
 call$2:[function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,420,[],28,[],"call"],
+z[a]=b},"call$2",null,4,0,null,344,[],28,[],"call"],
 $isEH:true},
 xL:{
-"^":"Tp:112;e,f,UI,bK",
+"^":"Tp:114;e,f,UI,bK",
 call$1:[function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -10242,127 +10445,130 @@
 $isSg:true},
 As:{
 "^":"a;",
-bu:[function(a){return this.lF().zV(0," ")},"call$0","gXo",0,0,null],
-O4:[function(a,b){var z,y
+bu:function(a){return this.lF().zV(0," ")},
+O4:function(a,b){var z,y
 z=this.lF()
 if(!z.tg(0,a)){z.h(0,a)
 y=!0}else{z.Rz(0,a)
 y=!1}this.p5(z)
-return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],484,[]],
+return y},
+qU:function(a){return this.O4(a,null)},
 gA:function(a){var z=this.lF()
 z=H.VM(new P.zQ(z,z.zN,null,null),[null])
 z.zq=z.O2.H9
 return z},
-aN:[function(a,b){this.lF().aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,337,338,[]],
+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.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,null,117,[]],
-ev:[function(a,b){var z=this.lF()
-return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},"call$1","gIR",2,0,null,117,[]],
-Vr:[function(a,b){return this.lF().Vr(0,b)},"call$1","gGI",2,0,null,117,[]],
+return H.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,416,119,[]],
+ev:function(a,b){var z=this.lF()
+return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},
+Vr:function(a,b){return this.lF().Vr(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
 gB:function(a){return this.lF().X5},
-tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,30,[]],
-Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,30,[]],
-h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,30,[]],
-Rz:[function(a,b){var z,y
+tg:function(a,b){return this.lF().tg(0,b)},
+Zt:function(a){return this.lF().tg(0,a)?a:null},
+h:function(a,b){return this.OS(new P.GE(b))},
+Rz:function(a,b){var z,y
 z=this.lF()
 y=z.Rz(0,b)
 this.p5(z)
-return y},"call$1","guH",2,0,null,30,[]],
-FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,116,[]],
+return y},
+FV:function(a,b){this.OS(new P.rl(b))},
 grZ:function(a){var z=this.lF().lX
 if(z==null)H.vh(new P.lj("No elements"))
 return z.gGc()},
-tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,340,341,[]],
-eR:[function(a,b){var z=this.lF()
-return H.ke(z,b,H.ip(z,"mW",0))},"call$1","gZo",2,0,null,198,[]],
-Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","gRV",2,0,null,15,[]],
-V1:[function(a){this.OS(new P.uQ())},"call$0","gRa",0,0,null],
-OS:[function(a){var z,y
+tt:function(a,b){return this.lF().tt(0,b)},
+br:function(a){return this.tt(a,!0)},
+eR:function(a,b){var z=this.lF()
+return H.ke(z,b,H.ip(z,"mW",0))},
+Zv:function(a,b){return this.lF().Zv(0,b)},
+V1:function(a){this.OS(new P.uQ())},
+OS:function(a){var z,y
 z=this.lF()
 y=a.call$1(z)
 this.p5(z)
-return y},"call$1","gFd",2,0,null,117,[]],
+return y},
 $isz5:true,
 $asz5:function(){return[J.O]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[J.O]}},
 GE:{
-"^":"Tp:112;a",
-call$1:[function(a){return a.h(0,this.a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return a.h(0,this.a)},"call$1",null,2,0,null,93,[],"call"],
 $isEH:true},
 rl:{
-"^":"Tp:112;a",
-call$1:[function(a){return a.FV(0,this.a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return a.FV(0,this.a)},"call$1",null,2,0,null,93,[],"call"],
 $isEH:true},
 uQ:{
-"^":"Tp:112;",
-call$1:[function(a){return a.V1(0)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return a.V1(0)},"call$1",null,2,0,null,93,[],"call"],
 $isEH:true},
 D7:{
 "^":"ar;qt,h2",
 gzT:function(){var z=this.h2
 return P.F(z.ev(z,new P.hT()),!0,W.cv)},
-aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,117,[]],
-u:[function(a,b,c){var z=this.gzT()
+aN:function(a,b){H.bQ(this.gzT(),b)},
+u:function(a,b,c){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.ZP(z[b],c)},"call$2","gj3",4,0,null,15,[],30,[]],
+J.ZP(z[b],c)},
 sB:function(a,b){var z,y
 z=this.gzT().length
 y=J.Wx(b)
 if(y.F(b,z))return
 else if(y.C(b,0))throw H.b(new P.AT("Invalid list length"))
 this.UZ(0,b,z)},
-h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
-FV:[function(a,b){var z,y
-for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
-tg:[function(a,b){return!1},"call$1","gdj",2,0,null,107,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,123,[],124,[]],
-V1:[function(a){J.c9(this.h2.NL,"")},"call$0","gRa",0,0,null],
-xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gJe",4,0,null,15,[],30,[]],
-oF:[function(a,b,c){var z,y
+h:function(a,b){this.h2.NL.appendChild(b)},
+FV:function(a,b){var z,y
+for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},
+tg:function(a,b){return!1},
+GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
+YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+UZ:function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},
+V1:function(a){J.c9(this.h2.NL,"")},
+xe:function(a,b,c){this.h2.xe(0,b,c)},
+oF:function(a,b,c){var z,y
 z=this.h2.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
-Rz:[function(a,b){return!1},"call$1","guH",2,0,null,132,[]],
+J.qD(z,c,y[b])},
+Rz:function(a,b){return!1},
 gB:function(a){return this.gzT().length},
-t:[function(a,b){var z=this.gzT()
+t:function(a,b){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,15,[]],
+return z[b]},
 gA:function(a){var z=this.gzT()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
-"^":"Tp:112;",
-call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,198,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,200,[],"call"],
 $isEH:true},
 GS:{
-"^":"Tp:112;",
-call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,286,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,288,[],"call"],
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
 NG:{
-"^":["xI;tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gD5:[function(a){var z=a.tY
 if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
 else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
 else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,370,"hoverText"],
-Qx:[function(a){return this.gus(a)},"call$0","gyX",0,0,115,"expander"],
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,305,"hoverText"],
+Qx:[function(a){return this.gus(a)},"call$0","gyX",0,0,117,"expander"],
 vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.call$0()}},"call$2","gus",4,0,525,526,[],387,[],"expandEvent"],
+c.call$0()}},"call$2","gus",4,0,417,418,[],318,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{b4:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10376,27 +10582,27 @@
 a.X0=w
 C.cp.ZL(a)
 C.cp.oX(a)
-return a},null,null,0,0,115,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[391],
+return a},null,null,0,0,117,"new InstanceRefElement$created"]}},
+"+InstanceRefElement":[322],
 Js:{
-"^":"Tp:112;a-82",
+"^":"Tp:114;a-84",
 call$1:[function(a){var z,y
 z=J.U6(a)
-if(z.t(a,"preview")!=null){z.soc(a,z.t(a,"preview"))
-a.szz(z.t(a,"preview"))}z=this.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)
 y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
-y.ct(z,C.kY,0,1)},"call$1",null,2,0,112,56,[],"call"],
+y.ct(z,C.kY,0,1)},"call$1",null,2,0,114,56,[],"call"],
 $isEH:true},
-"+ Js":[498]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[387]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["V4;Xh%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gQr:[function(a){return a.Xh},null,null,1,0,384,"instance",365,385],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,386,30,[],"instance",365],
-vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,392,212,[],"eval"],
-pA:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
-"@":function(){return[C.be]},
+"^":["V4;Xh%-313,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gQr:[function(a){return a.Xh},null,null,1,0,315,"instance",300,316],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,317,30,[],"instance",300],
+vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,323,214,[],"eval"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
+"@":function(){return[C.qlk]},
 static:{HC:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -10408,16 +10614,16 @@
 a.X0=w
 C.pU.ZL(a)
 C.pU.oX(a)
-return a},null,null,0,0,115,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[527],
+return a},null,null,0,0,117,"new InstanceViewElement$created"]}},
+"+InstanceViewElement":[419],
 V4:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 Se:{
-"^":["Y2;B1>,SF<-528,H<-528,eT,yt-377,wd-378,oH-379,z3,AP,Lk",null,function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null],
-gtT:[function(a){return J.on(this.H)},null,null,1,0,395,"code",365],
-C4:[function(a){var z,y,x,w,v,u,t,s,r
+"^":["Y2;B1>,SF<-420,H<-420,eT,yt-310,wd-311,oH-312,R7,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null],
+gtT:[function(a){return J.on(this.H)},null,null,1,0,325,"code",300],
+C4:function(a){var z,y,x,w,v,u,t,s,r
 z=this.B1
 y=J.UQ(z,"threshold")
 x=this.wd
@@ -10427,8 +10633,8 @@
 r=J.FW(s.gAv(),v.gAv())
 if(typeof y!=="number")return H.s(y)
 if(!(r>y||J.FW(J.on(s).gDu(),t.gAv())>y))continue
-w.h(x,X.SJ(z,t,s,this))}},"call$0","gDT",0,0,null],
-o8:[function(){},"call$0","gPY",0,0,null],
+w.h(x,X.SJ(z,t,s,this))}},
+o8:function(){},
 mW:function(a,b,c,d){var z,y,x,w
 z=this.SF
 y=z.gAv()
@@ -10437,15 +10643,15 @@
 if(d==null)J.bi(x,X.j6(w.gAv(),z.gAv()))
 else J.bi(x,X.j6(w.gAv(),d.H.gAv()))
 J.bi(x,X.j6(J.on(w).gDu(),y))},
-static:{j6:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","E7",4,0,null,131,[],241,[]],SJ:function(a,b,c,d){var z,y
+static:{j6:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","E7",4,0,null,133,[],243,[]],SJ:function(a,b,c,d){var z,y
 z=H.VM([],[G.Y2])
 y=d!=null?J.WB(d.yt,1):0
-z=new X.Se(a,b,c,d,y,z,[],!1,null,null)
+z=new X.Se(a,b,c,d,y,z,[],"\u2192",!1,null,null)
 z.mW(a,b,c,d)
 return z}}},
 qm:{
-"^":["Y2;B1>,tT>-394,eT,yt-377,wd-378,oH-379,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null],
-C4:[function(a){var z,y,x,w,v,u,t,s,r,q
+"^":["Y2;B1>,tT>-326,eT,yt-310,wd-311,oH-312,R7,z3,AP,fn",null,function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null],
+C4:function(a){var z,y,x,w,v,u,t,s,r,q
 z=this.B1
 y=J.U6(z)
 x=y.t(z,"threshold")
@@ -10458,8 +10664,8 @@
 q=J.FW(u.dJ(r.gtT(s)),u.QQ())
 if(typeof x!=="number")return H.s(x)
 if(!(q>x||J.FW(r.gtT(s).gDu(),w)>x))continue
-v.h(y,X.Tl(z,r.gtT(s),this))}},"call$0","gDT",0,0,null],
-o8:[function(){},"call$0","gPY",0,0,null],
+v.h(y,X.Tl(z,r.gtT(s),this))}},
+o8:function(){},
 Af:function(a,b,c){var z,y,x,w,v,u
 z=this.B1
 y=J.U6(z)
@@ -10469,30 +10675,30 @@
 if(c==null){u=y.gF1(z).RL()
 J.bi(v,X.eI(u.dJ(w),u.QQ()))}else{z=c.tT
 J.bi(v,X.eI(z.dJ(w),z.QQ()))}J.bi(v,X.eI(w.gDu(),x))},
-static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],241,[]],Tl:function(a,b,c){var z,y
+static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,133,[],243,[]],Tl:function(a,b,c){var z,y
 z=H.VM([],[G.Y2])
 y=c!=null?J.WB(c.yt,1):0
-z=new X.qm(a,b,c,y,z,[],!1,null,null)
+z=new X.qm(a,b,c,y,z,[],"\u2192",!1,null,null)
 z.Af(a,b,c)
 return z}}},
 kKl:{
-"^":["V9;pD%-382,Kx%-390,zt%-390,eH%-398,vk%-398,Xv%-398,M5%-398,ik%-398,XX%-529,qO=-82,Hm%-530,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.pD},null,null,1,0,384,"profile",365,385],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,386,30,[],"profile",365],
-gJQ:[function(a){return a.Kx},null,null,1,0,399,"callGraphChecked",365,366],
-sJQ:[function(a,b){a.Kx=this.ct(a,C.Hx,a.Kx,b)},null,null,3,0,400,30,[],"callGraphChecked",365],
-gPL:[function(a){return a.zt},null,null,1,0,399,"hideTagsChecked",365,366],
-sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,400,30,[],"hideTagsChecked",365],
-gJy:[function(a){return a.eH},null,null,1,0,370,"sampleCount",365,366],
-sJy:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,32,30,[],"sampleCount",365],
-gUo:[function(a){return a.vk},null,null,1,0,370,"refreshTime",365,366],
-sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,32,30,[],"refreshTime",365],
-gEly:[function(a){return a.Xv},null,null,1,0,370,"sampleRate",365,366],
-sEly:[function(a,b){a.Xv=this.ct(a,C.kA,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",365],
-gFZ:[function(a){return a.M5},null,null,1,0,370,"sampleDepth",365,366],
-sFZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",365],
-gNG:[function(a){return a.ik},null,null,1,0,370,"displayCutoff",365,366],
-sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",365],
+"^":["V9;pD%-313,Kx%-321,zt%-321,eH%-329,NT%-329,Xv%-329,M5%-329,ik%-329,XX%-421,qO=-84,Hm%-422,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,315,"profile",300,316],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,317,30,[],"profile",300],
+gJQ:[function(a){return a.Kx},null,null,1,0,330,"callGraphChecked",300,301],
+sJQ:[function(a,b){a.Kx=this.ct(a,C.Hx,a.Kx,b)},null,null,3,0,331,30,[],"callGraphChecked",300],
+gPL:[function(a){return a.zt},null,null,1,0,330,"hideTagsChecked",300,301],
+sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,331,30,[],"hideTagsChecked",300],
+gJy:[function(a){return a.eH},null,null,1,0,305,"sampleCount",300,301],
+sJy:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,32,30,[],"sampleCount",300],
+gUo:[function(a){return a.NT},null,null,1,0,305,"refreshTime",300,301],
+sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,32,30,[],"refreshTime",300],
+gEly:[function(a){return a.Xv},null,null,1,0,305,"sampleRate",300,301],
+sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",300],
+gIZ:[function(a){return a.M5},null,null,1,0,305,"sampleDepth",300,301],
+sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",300],
+gNG:[function(a){return a.ik},null,null,1,0,305,"displayCutoff",300,301],
+sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",300],
 pM:[function(a,b){var z,y,x,w
 z=a.pD
 if(z==null)return
@@ -10502,68 +10708,70 @@
 z=J.AG(y)
 a.eH=this.ct(a,C.XU,a.eH,z)
 z=x.bu(0)
-a.vk=this.ct(a,C.Dj,a.vk,z)
+a.NT=this.ct(a,C.Dj,a.NT,z)
 z=J.AG(J.UQ(a.pD,"depth"))
 a.M5=this.ct(a,C.bE,a.M5,z)
 w=J.UQ(a.pD,"period")
 if(typeof w!=="number")return H.s(w)
 z=C.CD.yM(1000000/w,0)
-a.Xv=this.ct(a,C.kA,a.Xv,z)
+a.Xv=this.ct(a,C.mI,a.Xv,z)
 z=J.AG(J.vX(a.XX,100))+"%"
 a.ik=this.ct(a,C.aH,a.ik,z)
 J.QP(a.pD).N3(a.pD)
 J.kW(a.pD,"threshold",a.XX)
-this.Cx(a)},"call$1","gwm",2,0,157,230,[],"profileChanged"],
-Cs:[function(a,b){this.Cx(a)},"call$1","gS5",2,0,157,230,[],"callGraphCheckedChanged"],
+this.Cx(a)},"call$1","gwm",2,0,159,232,[],"profileChanged"],
+Cs:[function(a,b){this.Cx(a)},"call$1","gS5",2,0,159,232,[],"callGraphCheckedChanged"],
 i4:[function(a){var z=R.Jk([])
 a.Hm=new G.XN(z,null,null)
-this.Cx(a)},"call$0","gQd",0,0,114,"enteredView"],
-Mm:[function(a,b){this.pA(a,null)},"call$1","gDJ",2,0,157,230,[],"hideTagsCheckedChanged"],
+this.Cx(a)},"call$0","gQd",0,0,116,"enteredView"],
+Mm:[function(a,b){this.pA(a,null)},"call$1","gDJ",2,0,159,232,[],"hideTagsCheckedChanged"],
 pA:[function(a,b){var z,y
 z=a.zt
 y=z!=null&&z===!0?"profile"+"?tags=hide":"profile"
-J.QP(a.pD).ox(y).ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+J.QP(a.pD).cv(y).ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 Cx:[function(a){var z
 if(a.pD==null)return
 z=a.Kx
 if(z!=null&&z===!0)this.QI(a)
-else this.EX(a)},"call$0","gBn",0,0,114,"_update"],
+else this.EX(a)},"call$0","gBn",0,0,116,"_update"],
 QI:[function(a){var z,y,x,w,v
 z=J.QP(a.pD).RL()
 if(z==null)N.Jx("").j2("No profile root tag.")
 try{a.Hm.rT(X.Tl(a.pD,z,null))}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-N.Jx("").xH("_buildCallersTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","geF",0,0,114,"_buildCallersTree"],
+N.Jx("").xH("_buildCallersTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","geF",0,0,116,"_buildCallersTree"],
 EX:[function(a){var z,y,x,w,v
 z=J.QP(a.pD).gBC()
 if(z==null)N.Jx("").j2("No profile trie root.")
 try{a.Hm.rT(X.SJ(a.pD,z,z,null))}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","gzo",0,0,114,"_buildStackTree"],
+N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","gzo",0,0,116,"_buildStackTree"],
 ba:[function(a){var z=a.Kx
 if(z!=null&&z===!0)this.QI(a)
-else this.EX(a)},"call$0","gvr",0,0,114,"_buildTree"],
-ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,531,375,[],"padding",366],
+else this.EX(a)},"call$0","gvr",0,0,116,"_buildTree"],
+ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,423,424,[],"padding",301],
 ZZ:[function(a,b){var z=J.bY(b.gyt(),5)
 if(z>>>0!==z||z>=5)return H.e(C.PQ,z)
-return C.PQ[z]},"call$1","gth",2,0,531,375,[],"coloring",366],
+return C.PQ[z]},"call$1","gth",2,0,423,424,[],"coloring",301],
 YF:[function(a,b,c,d){var z,y,x
-z=J.u3(d)
-if(!!J.x(z).$isqp){y=a.Hm
-x=z.rowIndex
+z=J.RE(b)
+if(!J.de(J.F8(z.gN(b)),"expand")&&!J.de(z.gN(b),d))return
+y=J.u3(d)
+if(!!J.x(y).$isqp){z=a.Hm
+x=y.rowIndex
 if(typeof x!=="number")return x.W()
-y.qU(x-1)}},"call$3","gpR",6,0,532,21,[],310,[],79,[],"toggleExpanded",366],
+z.qU(x-1)}},"call$3","gpR",6,0,425,21,[],334,[],81,[],"toggleExpanded",301],
 "@":function(){return[C.jR]},
-static:{"^":"B6<-82",jD:[function(a){var z,y,x,w
+static:{"^":"B6<-84",jD:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.eH=""
-a.vk=""
+a.NT=""
 a.Xv=""
 a.M5=""
 a.ik=""
@@ -10574,24 +10782,24 @@
 a.X0=w
 C.kS.ZL(a)
 C.kS.oX(a)
-return a},null,null,0,0,115,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[533],
+return a},null,null,0,0,117,"new IsolateProfileElement$created"]}},
+"+IsolateProfileElement":[426],
 V9:{
 "^":"uL+Pi;",
 $isd3:true},
 SV:{
-"^":"Tp:386;a-82",
+"^":"Tp:317;a-84",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,386,190,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,317,192,[],"call"],
 $isEH:true},
-"+ SV":[498]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+"+ SV":[387]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oO:{
-"^":["xI;tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.X0]},
-static:{Qm:[function(a){var z,y,x,w
+static:{Zgg:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -10603,13 +10811,13 @@
 a.X0=w
 C.LN.ZL(a)
 C.LN.oX(a)
-return a},null,null,0,0,115,"new IsolateRefElement$created"]}},
-"+IsolateRefElement":[391]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+return a},null,null,0,0,117,"new IsolateRefElement$created"]}},
+"+IsolateRefElement":[322]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
-Kz:{
-"^":["V10;Pw%-534,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,364,"isolate",365,385],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,367,30,[],"isolate",365],
+fl:{
+"^":["V10;Pw%-427,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,299,"isolate",300,316],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,302,30,[],"isolate",300],
 "@":function(){return[C.aM]},
 static:{N5:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10622,15 +10830,15 @@
 a.X0=w
 C.Qt.ZL(a)
 C.Qt.oX(a)
-return a},null,null,0,0,115,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[535],
+return a},null,null,0,0,117,"new IsolateSummaryElement$created"]}},
+"+IsolateSummaryElement":[428],
 V10:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
 Lr:{
 "^":"a;hO,Pl",
-eC:[function(a){var z,y,x,w,v,u,t,s,r,q,p
+eC:function(a){var z,y,x,w,v,u,t,s,r,q,p
 z=this.hO.Yb
 if(J.de(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
 for(y=a.gaf(),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=y.lo
@@ -10651,49 +10859,51 @@
 if(r===0){q=0
 while(!0){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].ghw().length))break
+y=J.q8(y[u].ghw())
+if(typeof y!=="number")return H.s(y)
+if(!(q<y))break
 c$1:{if(q===w)break c$1
 s.push(0)}++q}}else{q=0
 while(!0){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].ghw().length))break
+y=J.q8(y[u].ghw())
+if(typeof y!=="number")return H.s(y)
+if(!(q<y))break
 c$1:{if(q===w)break c$1
 y=a.glI()
 if(u>=y.length)return H.e(y,u)
-y=y[u].ghw()
-if(q>=y.length)return H.e(y,q)
-s.push(C.CD.yu(J.FW(y[q],r)*100))}++q}}y=[]
+s.push(C.CD.yu(J.FW(J.UQ(y[u].ghw(),q),r)*100))}++q}}y=[]
 p=new H.A8(s,P.En())
 p.$builtinTypeInfo=[null,null]
 C.Nm.FV(y,p)
 y=new P.Tz(y)
 y.$builtinTypeInfo=[null]
-z.V7("addRow",[y])}},"call$1","gpn",2,0,null,536,[]],
-W2:[function(a){var z,y
+z.V7("addRow",[y])}},
+W2:function(a){var z,y
 if(this.Pl==null){z=P.L5(null,null,null,null,null)
 y=new G.qu(null,z)
 y.vR=P.zV(J.UQ($.NR,"SteppedAreaChart"),[a])
 this.Pl=y
 z.u(0,"isStacked",!0)
 this.Pl.bG.u(0,"connectSteps",!1)
-this.Pl.bG.u(0,"vAxis",H.B7(["minValue",0,"maxValue",100],P.L5(null,null,null,null,null)))}this.Pl.W2(this.hO)},"call$1","gnS",2,0,null,132,[]]},
+this.Pl.bG.u(0,"vAxis",H.B7(["minValue",0,"maxValue",100],P.L5(null,null,null,null,null)))}this.Pl.W2(this.hO)}},
 qkb:{
-"^":["V11;oY%-534,ts%-537,e6%-538,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.oY},null,null,1,0,364,"isolate",365,385],
-sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,367,30,[],"isolate",365],
+"^":["V11;oY%-427,ts%-429,e6%-430,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.oY},null,null,1,0,299,"isolate",300,316],
+sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,302,30,[],"isolate",300],
 vV:[function(a,b){var z=a.oY
-return z.ox(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,392,212,[],"eval"],
-Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"call$0","gjB",0,0,114,"_updateTagProfile"],
+return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,323,214,[],"eval"],
+Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"call$0","gjB",0,0,116,"_updateTagProfile"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"call$0","gQd",0,0,114,"enteredView"],
+a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"call$0","gQd",0,0,116,"enteredView"],
 xo:[function(a){var z
 Z.uL.prototype.xo.call(this,a)
 z=a.ts
-if(z!=null)z.ed()},"call$0","gbt",0,0,114,"leftView"],
+if(z!=null)z.ed()},"call$0","gbt",0,0,116,"leftView"],
 Ob:[function(a){var z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#tagProfileChart")
-if(z!=null)a.e6.W2(z)},"call$0","gPE",0,0,114,"_drawTagProfileChart"],
-pA:[function(a,b){J.am(a.oY).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
-lp:[function(a,b,c,d){a.oY.ox("resume").ml(new L.IT(a))},"call$3","gDQ",6,0,404,131,[],187,[],280,[],"resume"],
+if(z!=null)a.e6.W2(z)},"call$0","gPE",0,0,116,"_drawTagProfileChart"],
+pA:[function(a,b){J.am(a.oY).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
+xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"call$3","gDQ",6,0,336,133,[],189,[],282,[],"resume"],
 "@":function(){return[C.fO]},
 static:{uD:[function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.NR,"DataTable"),null)
@@ -10708,52 +10918,120 @@
 a.X0=v
 C.Xe.ZL(a)
 C.Xe.oX(a)
-return a},null,null,0,0,115,"new IsolateViewElement$created"]}},
-"+IsolateViewElement":[539],
+return a},null,null,0,0,117,"new IsolateViewElement$created"]}},
+"+IsolateViewElement":[431],
 V11:{
 "^":"uL+Pi;",
 $isd3:true},
 BQ:{
-"^":"Tp:112;a-82",
+"^":"Tp:114;a-84",
 call$1:[function(a){var z,y,x
 z=this.a
 y=J.RE(z)
 y.ge6(z).eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
 if(x!=null)y.ge6(z).W2(x)
-y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"call$1",null,2,0,112,536,[],"call"],
+y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"call$1",null,2,0,114,432,[],"call"],
 $isEH:true},
-"+ BQ":[498],
+"+ BQ":[387],
 IT:{
-"^":"Tp:112;a-82",
-call$1:[function(a){J.am(J.Ag(this.a))},"call$1",null,2,0,112,56,[],"call"],
+"^":"Tp:114;a-84",
+call$1:[function(a){J.am(J.Ag(this.a))},"call$1",null,2,0,114,56,[],"call"],
 $isEH:true},
-"+ IT":[498]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+"+ IT":[387]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
+fM:{
+"^":"a;Fv,lp",
+KN:function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+z=this.lp
+if(z.tg(0,a))return
+z.h(0,a)
+for(y=J.GP(a.gvc()),x=this.Fv,w=J.U6(a),v=b+1;y.G();){u=y.gl()
+t=w.t(a,u)
+s=J.x(t)
+if(!!s.$isZ0){if(typeof "  "!=="number")return H.s("  ")
+r=b*"  "
+s=typeof r==="string"
+q=s?r:H.d(r)
+x.vM=x.vM+q
+p="\""+H.d(u)+"\": {\n"
+x.vM=x.vM+p
+this.KN(t,v)
+r=s?r:H.d(r)
+s=x.vM+r
+x.vM=s
+x.vM=s+"}\n"}else if(!!s.$isList){if(typeof "  "!=="number")return H.s("  ")
+r=b*"  "
+s=typeof r==="string"
+q=s?r:H.d(r)
+x.vM=x.vM+q
+p="\""+H.d(u)+"\": [\n"
+x.vM=x.vM+p
+this.lG(t,v)
+r=s?r:H.d(r)
+s=x.vM+r
+x.vM=s
+x.vM=s+"]\n"}else{if(typeof "  "!=="number")return H.s("  ")
+r=b*"  "
+r=typeof r==="string"?r:H.d(r)
+x.vM=x.vM+r
+s="\""+H.d(u)+"\": "+H.d(t)
+s=x.vM+s
+x.vM=s
+x.vM=s+"\n"}}z.Rz(0,a)},
+lG:function(a,b){var z,y,x,w,v,u,t,s,r
+z=this.lp
+if(z.tg(0,a))return
+z.h(0,a)
+for(y=J.GP(a),x=this.Fv,w=b+1;y.G();){v=y.gl()
+u=J.x(v)
+if(!!u.$isZ0){if(typeof "  "!=="number")return H.s("  ")
+t=b*"  "
+u=typeof t==="string"
+s=u?t:H.d(t)
+r=x.vM+s
+x.vM=r
+x.vM=r+"{\n"
+this.KN(v,w)
+t=u?t:H.d(t)
+u=x.vM+t
+x.vM=u
+x.vM=u+"}\n"}else if(!!u.$isList){if(typeof "  "!=="number")return H.s("  ")
+t=b*"  "
+u=typeof t==="string"
+s=u?t:H.d(t)
+r=x.vM+s
+x.vM=r
+x.vM=r+"[\n"
+this.lG(v,w)
+t=u?t:H.d(t)
+u=x.vM+t
+x.vM=u
+x.vM=u+"]\n"}else{if(typeof "  "!=="number")return H.s("  ")
+t=b*"  "
+t=typeof t==="string"?t:H.d(t)
+x.vM=x.vM+t
+t=typeof v==="string"?v:H.d(v)
+u=x.vM+t
+x.vM=u
+x.vM=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":["V12;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gvL:[function(a){return a.eb},null,null,1,0,115,"json",365,385],
-svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,30,[],"json",365],
-i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.kf=0},"call$0","gQd",0,0,114,"enteredView"],
-yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,157,230,[],"jsonChanged"],
-gf0c:[function(a){return J.AG(a.eb)},null,null,1,0,370,"primitiveString"],
-gmm:[function(a){var z=J.x(a.eb)
-if(!!z.$isZ0)return"Map"
-else if(!!z.$isList)return"List"
-return"Primitive"},null,null,1,0,370,"valueType"],
-gkG:[function(a){var z=a.kf
-a.kf=J.WB(z,1)
-return z},null,null,1,0,540,"counter"],
-go6:[function(a){var z=a.eb
-if(!!J.x(z).$isList)return z
-return[]},null,null,1,0,541,"list"],
-gvc:[function(a){var z,y
-z=a.eb
-y=J.x(z)
-if(!!y.$isZ0)return J.qA(y.gvc(z))
-return[]},null,null,1,0,541,"keys"],
-r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,32,48,[],"value"],
+"^":["V12;OZ%-313,X7%-329,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gIr:[function(a){return a.OZ},null,null,1,0,315,"map",300,316],
+ez:function(a,b){return this.gIr(a).call$1(b)},
+sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,317,30,[],"map",300],
+gdQ:[function(a){return a.X7},null,null,1,0,305,"mapAsString",300,301],
+sdQ:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,32,30,[],"mapAsString",300],
+oC:[function(a,b){var z,y,x
+z=P.p9("")
+y=P.Ls(null,null,null,null)
+x=a.OZ
+z.vM=""
+z.KF("{\n")
+new Z.fM(z,y).KN(x,0)
+z.KF("}\n")
+z=z.vM
+a.X7=this.ct(a,C.t6,a.X7,z)},"call$1","gar",2,0,159,232,[],"mapChanged"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10761,21 +11039,19 @@
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.eb=null
-a.kf=0
 a.SO=z
 a.B7=y
 a.X0=w
 C.Yt.ZL(a)
 C.Yt.oX(a)
-return a},null,null,0,0,115,"new JsonViewElement$created"]}},
-"+JsonViewElement":[542],
+return a},null,null,0,0,117,"new JsonViewElement$created"]}},
+"+JsonViewElement":[433],
 V12:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.uy]},
 static:{rA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10789,15 +11065,15 @@
 a.X0=w
 C.Z3.ZL(a)
 C.Z3.oX(a)
-return a},null,null,0,0,115,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[391]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+return a},null,null,0,0,117,"new LibraryRefElement$created"]}},
+"+LibraryRefElement":[322]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 KL:{
-"^":["V13;N7%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.N7},null,null,1,0,384,"library",365,385],
-stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,386,30,[],"library",365],
-vV:[function(a,b){return J.QP(a.N7).ox(J.WB(J.F8(a.N7),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,392,212,[],"eval"],
-pA:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+"^":["V13;N7%-313,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.N7},null,null,1,0,315,"library",300,316],
+stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,317,30,[],"library",300],
+vV:[function(a,b){return J.QP(a.N7).cv(J.WB(J.F8(a.N7),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,323,214,[],"eval"],
+pA:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 "@":function(){return[C.Oyb]},
 static:{Ro:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10810,8 +11086,8 @@
 a.X0=w
 C.MG.ZL(a)
 C.MG.oX(a)
-return a},null,null,0,0,115,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[543],
+return a},null,null,0,0,117,"new LibraryViewElement$created"]}},
+"+LibraryViewElement":[434],
 V13:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
@@ -10831,8 +11107,8 @@
 else{if(this.eT!=null)throw H.b(P.f("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."))
 $.Y4=a}},
 gSZ:function(){return this.IE()},
-Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,30,[]],
-Y6:[function(a,b,c,d){var z,y,x,w,v
+Im:function(a){return a.P>=this.gOR().P},
+Y6:function(a,b,c,d){var z,y,x,w,v
 if(a.P>=this.gOR().P){z=this.gB8()
 y=new P.iP(Date.now(),!1)
 y.EK()
@@ -10841,25 +11117,30 @@
 w=new N.HV(a,b,z,y,x,c,d)
 if($.RL)for(v=this;v!=null;){z=J.RE(v)
 z.od(v,w)
-v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,82,82,544,[],24,[],159,[],160,[]],
-X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,24,[],159,[],160,[]],
-dL:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.dL(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,24,[],159,[],160,[]],
-ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,24,[],159,[],160,[]],
-xH:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.xH(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,24,[],159,[],160,[]],
-WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,24,[],159,[],160,[]],
-IE:[function(){if($.RL||this.eT==null){var z=this.Gs
+v=z.geT(v)}else J.EY(N.Jx(""),w)}},
+X2:function(a,b,c){return this.Y6(C.VZ,a,b,c)},
+x9:function(a){return this.X2(a,null,null)},
+dL:function(a,b,c){return this.Y6(C.R5,a,b,c)},
+J4:function(a){return this.dL(a,null,null)},
+ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
+To:function(a){return this.ZG(a,null,null)},
+xH:function(a,b,c){return this.Y6(C.UP,a,b,c)},
+j2:function(a){return this.xH(a,null,null)},
+WB:function(a,b,c){return this.Y6(C.cV,a,b,c)},
+hh:function(a){return this.WB(a,null,null)},
+IE:function(){if($.RL||this.eT==null){var z=this.Gs
 if(z==null){z=P.bK(null,null,!0,N.HV)
 this.Gs=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.Jx("").IE()},"call$0","gnc",0,0,null],
-od:[function(a,b){var z=this.Gs
+return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.Jx("").IE()},
+od:function(a,b){var z=this.Gs
 if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(b)}},"call$1","gBq",2,0,null,29,[]],
+z.Iv(b)}},
 QL:function(a,b,c){var z=this.eT
 if(z!=null)J.Tr(z).u(0,this.oc,this)},
 $isTJ:true,
 static:{"^":"DY",Jx:function(a){return $.U0().to(a,new N.dG(a))}}},
 dG:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(new P.AT("name shouldn't start with a '.'"))
@@ -10873,31 +11154,30 @@
 $isEH:true},
 qV:{
 "^":"a;oc>,P>",
-r6:function(a,b){return this.P.call$1(b)},
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
-C:[function(a,b){var z=J.Vm(b)
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isqV&&this.P===b.P},
+C:function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P<z},"call$1","gix",2,0,null,109,[]],
-E:[function(a,b){var z=J.Vm(b)
+return this.P<z},
+E:function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P<=z},"call$1","gER",2,0,null,109,[]],
-D:[function(a,b){var z=J.Vm(b)
+return this.P<=z},
+D:function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P>z},"call$1","gh1",2,0,null,109,[]],
-F:[function(a,b){var z=J.Vm(b)
+return this.P>z},
+F:function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P>=z},"call$1","gNH",2,0,null,109,[]],
-iM:[function(a,b){var z=J.Vm(b)
+return this.P>=z},
+iM:function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P-z},"call$1","gYc",2,0,null,109,[]],
+return this.P-z},
 giO:function(a){return this.P},
-bu:[function(a){return this.oc},"call$0","gXo",0,0,null],
+bu:function(a){return this.oc},
 $isqV:true,
 static:{"^":"V7K,tmj,EL,LkO,reI,pd,Wr,MHK,ow,lM,B9"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
-bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},"call$0","gXo",0,0,null],
+bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
 $isHV:true,
 static:{"^":"xO"}}}],["","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
 "^":"",
@@ -10909,14 +11189,14 @@
 J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(H.B7(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],P.L5(null,null,null,null,null)))])
 z.MM.ml(G.vN()).ml(new F.Lb())},"call$0","qg",0,0,null],
 em:{
-"^":"Tp:546;",
-call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,545,[],"call"],
+"^":"Tp:436;",
+call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.z2(a)))},"call$1",null,2,0,null,435,[],"call"],
 $isEH:true},
 Lb:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){N.Jx("").To("Initializing Polymer")
-A.Ok()},"call$1",null,2,0,null,113,[],"call"],
-$isEH:true}}],["metadata","file:///usr/local/google/home/johnmccutchan/dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
+A.Ok()},"call$1",null,2,0,null,115,[],"call"],
+$isEH:true}}],["metadata","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
 jh:{
 "^":"a;T9,Bu",
@@ -10931,7 +11211,7 @@
 "^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 F1:{
-"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["uL;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.nW]},
 static:{aD:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10944,16 +11224,16 @@
 a.X0=w
 C.kD.ZL(a)
 C.kD.oX(a)
-return a},null,null,0,0,115,"new NavBarElement$created"]}},
-"+NavBarElement":[547],
+return a},null,null,0,0,117,"new NavBarElement$created"]}},
+"+NavBarElement":[437],
 aQ:{
-"^":["V14;KU%-398,V4%-398,Jo%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,370,"link",365,385],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",365],
-gdU:[function(a){return a.V4},null,null,1,0,370,"anchor",365,385],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",365],
-grZ:[function(a){return a.Jo},null,null,1,0,399,"last",365,385],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,400,30,[],"last",365],
+"^":["V14;KU%-329,V4%-329,Jo%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,305,"link",300,316],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",300],
+gdU:[function(a){return a.V4},null,null,1,0,305,"anchor",300,316],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",300],
+grZ:[function(a){return a.Jo},null,null,1,0,330,"last",300,316],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,331,30,[],"last",300],
 "@":function(){return[C.u7]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10969,17 +11249,17 @@
 a.X0=w
 C.SU.ZL(a)
 C.SU.oX(a)
-return a},null,null,0,0,115,"new NavMenuElement$created"]}},
-"+NavMenuElement":[548],
+return a},null,null,0,0,117,"new NavMenuElement$created"]}},
+"+NavMenuElement":[438],
 V14:{
 "^":"uL+Pi;",
 $isd3:true},
 Qa:{
-"^":["V15;KU%-398,V4%-398,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,370,"link",365,385],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",365],
-gdU:[function(a){return a.V4},null,null,1,0,370,"anchor",365,385],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",365],
+"^":["V15;KU%-329,V4%-329,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,305,"link",300,316],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",300],
+gdU:[function(a){return a.V4},null,null,1,0,305,"anchor",300,316],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",300],
 "@":function(){return[C.nh]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10994,26 +11274,26 @@
 a.X0=w
 C.nn.ZL(a)
 C.nn.oX(a)
-return a},null,null,0,0,115,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[549],
+return a},null,null,0,0,117,"new NavMenuItemElement$created"]}},
+"+NavMenuItemElement":[439],
 V15:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":["V16;rU%-82,SB%-390,Hq%-398,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFR:[function(a){return a.rU},null,null,1,0,115,"callback",365,385],
+"^":["V16;rU%-84,SB%-321,Hq%-329,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFR:[function(a){return a.rU},null,null,1,0,117,"callback",300,316],
 Ki:function(a){return this.gFR(a).call$0()},
 VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,30,[],"callback",365],
-gxw:[function(a){return a.SB},null,null,1,0,399,"active",365,385],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,400,30,[],"active",365],
-gph:[function(a){return a.Hq},null,null,1,0,370,"label",365,385],
-sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,32,30,[],"label",365],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,114,30,[],"callback",300],
+gxw:[function(a){return a.SB},null,null,1,0,330,"active",300,316],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,331,30,[],"active",300],
+gph:[function(a){return a.Hq},null,null,1,0,305,"label",300,316],
+sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,32,30,[],"label",300],
 Ty:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gyr",6,0,402,21,[],310,[],79,[],"buttonClick"],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,114,"refreshDone"],
+if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gyr",6,0,333,21,[],334,[],81,[],"buttonClick"],
+ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,116,"refreshDone"],
 "@":function(){return[C.XG]},
 static:{zN:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11028,15 +11308,15 @@
 a.X0=w
 C.J7.ZL(a)
 C.J7.oX(a)
-return a},null,null,0,0,115,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[550],
+return a},null,null,0,0,117,"new NavRefreshElement$created"]}},
+"+NavRefreshElement":[440],
 V16:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["V17;Jo%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,399,"last",365,385],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,400,30,[],"last",365],
+"^":["V17;Jo%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,330,"last",300,316],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,331,30,[],"last",300],
 "@":function(){return[C.hr]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11050,17 +11330,17 @@
 a.X0=w
 C.lx.ZL(a)
 C.lx.oX(a)
-return a},null,null,0,0,115,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[551],
+return a},null,null,0,0,117,"new TopNavMenuElement$created"]}},
+"+TopNavMenuElement":[441],
 V17:{
 "^":"uL+Pi;",
 $isd3:true},
-fl:{
-"^":["V18;Jo%-390,iy%-534,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,399,"last",365,385],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,400,30,[],"last",365],
-gF1:[function(a){return a.iy},null,null,1,0,364,"isolate",365,385],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,367,30,[],"isolate",365],
+Mv:{
+"^":["V18;Jo%-321,iy%-427,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,330,"last",300,316],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,331,30,[],"last",300],
+gF1:[function(a){return a.iy},null,null,1,0,299,"isolate",300,316],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,302,30,[],"isolate",300],
 "@":function(){return[C.zaS]},
 static:{Du:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11074,17 +11354,17 @@
 a.X0=w
 C.RR.ZL(a)
 C.RR.oX(a)
-return a},null,null,0,0,115,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[552],
+return a},null,null,0,0,117,"new IsolateNavMenuElement$created"]}},
+"+IsolateNavMenuElement":[442],
 V18:{
 "^":"uL+Pi;",
 $isd3:true},
 Zt:{
-"^":["V19;Ap%-382,Jo%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.Ap},null,null,1,0,384,"library",365,385],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,386,30,[],"library",365],
-grZ:[function(a){return a.Jo},null,null,1,0,399,"last",365,385],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,400,30,[],"last",365],
+"^":["V19;Ap%-313,Jo%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.Ap},null,null,1,0,315,"library",300,316],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,317,30,[],"library",300],
+grZ:[function(a){return a.Jo},null,null,1,0,330,"last",300,316],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,331,30,[],"last",300],
 "@":function(){return[C.KI]},
 static:{fg:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11098,17 +11378,17 @@
 a.X0=w
 C.ct.ZL(a)
 C.ct.oX(a)
-return a},null,null,0,0,115,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[553],
+return a},null,null,0,0,117,"new LibraryNavMenuElement$created"]}},
+"+LibraryNavMenuElement":[443],
 V19:{
 "^":"uL+Pi;",
 $isd3:true},
 wM:{
-"^":["V20;Au%-382,Jo%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.Au},null,null,1,0,384,"cls",365,385],
-sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,386,30,[],"cls",365],
-grZ:[function(a){return a.Jo},null,null,1,0,399,"last",365,385],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,400,30,[],"last",365],
+"^":["V20;Au%-313,Jo%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Au},null,null,1,0,315,"cls",300,316],
+sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,317,30,[],"cls",300],
+grZ:[function(a){return a.Jo},null,null,1,0,330,"last",300,316],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,331,30,[],"last",300],
 "@":function(){return[C.qJ]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11122,30 +11402,30 @@
 a.X0=w
 C.ae.ZL(a)
 C.ae.oX(a)
-return a},null,null,0,0,115,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[554],
+return a},null,null,0,0,117,"new ClassNavMenuElement$created"]}},
+"+ClassNavMenuElement":[444],
 V20:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 lI:{
-"^":["V21;k5%-390,Oe%-555,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzj:[function(a){return a.k5},null,null,1,0,399,"devtools",365,385],
-szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,400,30,[],"devtools",365],
-guw:[function(a){return a.Oe},null,null,1,0,556,"app",365,366],
-suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,557,30,[],"app",365],
+"^":["V21;k5%-321,Oe%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,330,"devtools",300,316],
+szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,331,30,[],"devtools",300],
+guw:[function(a){return a.Oe},null,null,1,0,446,"app",300,301],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,447,30,[],"app",300],
 ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null)
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.PI()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.hq()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null)
+a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
-z.aq()
+z.SC()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.US()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,115,"created"],
+a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,117,"created"],
 "@":function(){return[C.bd]},
 static:{fv:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11160,19 +11440,19 @@
 C.k0.ZL(a)
 C.k0.oX(a)
 C.k0.ZB(a)
-return a},null,null,0,0,115,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[558],
+return a},null,null,0,0,117,"new ObservatoryApplicationElement$created"]}},
+"+ObservatoryApplicationElement":[448],
 V21:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,114,"enteredView"],
-xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,114,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,559,12,[],230,[],231,[],"attributeChanged"],
-gpQ:[function(a){return!0},null,null,1,0,399,"applyAuthorStyles"],
-OZ:[function(a,b){var z,y,x,w
+"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,116,"enteredView"],
+xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,116,"leftView"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,449,12,[],232,[],233,[],"attributeChanged"],
+gpQ:[function(a){return!0},null,null,1,0,330,"applyAuthorStyles"],
+Kn:[function(a,b){var z,y,x,w
 if(b==null)return"-"
 z=J.LL(J.vX(b,1000))
 y=C.jn.cU(z,3600000)
@@ -11181,7 +11461,7 @@
 z=C.jn.Y(z,60000)
 w=C.jn.cU(z,1000)
 z=C.jn.Y(z,1000)
-return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gjC",2,0,560,561,[],"formatTimePrecise"],
+return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gjC",2,0,450,451,[],"formatTimePrecise"],
 Om:[function(a,b){var z,y,x,w
 if(b==null)return"-"
 z=J.LL(J.vX(b,1000))
@@ -11192,31 +11472,31 @@
 P.p9("")
 if(y!==0)return""+y+"h "+x+"m "+w+"s"
 if(x!==0)return""+x+"m "+w+"s"
-return""+w+"s"},"call$1","gSs",2,0,560,561,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,560,28,[],"formatSeconds"],
+return""+w+"s"},"call$1","gSs",2,0,450,451,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,450,28,[],"formatSeconds"],
 Ze:[function(a,b){var z=J.Wx(b)
 if(z.C(b,1024))return H.d(b)+"B"
 else if(z.C(b,1048576))return""+C.CD.yu(C.CD.UD(z.V(b,1024)))+"KB"
 else if(z.C(b,1073741824))return""+C.CD.yu(C.CD.UD(z.V(b,1048576)))+"MB"
 else if(z.C(b,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(b,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,424,562,[],"formatSize"],
+else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,348,452,[],"formatSize"],
 at:[function(a,b){var z,y,x
 z=J.U6(b)
 y=J.UQ(z.t(b,"script"),"user_name")
 x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,563,564,[],"fileAndLine"],
-b1:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,565,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,565,11,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,453,454,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,455,11,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,455,11,[],"isError"],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gKo",2,0,565,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,565,11,[],"isBool"],
-ff:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,565,11,[],"isString"],
-rW:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,565,11,[],"isInstance"],
-F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,565,11,[],"isClosure"],
-JG:[function(a,b){return J.de(b,"Double")},"call$1","gmL",2,0,565,11,[],"isDouble"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gKo",2,0,455,11,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,455,11,[],"isBool"],
+ff:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,455,11,[],"isString"],
+rW:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,455,11,[],"isInstance"],
+JG:[function(a,b){return J.de(b,"Double")},"call$1","gUu",2,0,455,11,[],"isDouble"],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,565,11,[],"isList"],
-Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Double","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,565,11,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,455,11,[],"isList"],
+tR:[function(a,b){return J.de(b,"Type")},"call$1","gqNn",2,0,455,11,[],"isType"],
+Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"call$1","gaE",2,0,455,11,[],"isUnexpected"],
 "@":function(){return[C.Br]},
 static:{ew:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11229,12 +11509,12 @@
 a.X0=w
 C.Pf.ZL(a)
 C.Pf.oX(a)
-return a},null,null,0,0,115,"new ObservatoryElement$created"],Ce:[function(a,b){var z,y,x,w
+return a},null,null,0,0,117,"new ObservatoryElement$created"],Ce:[function(a,b){var z,y,x,w
 for(z=J.Wx(a),y="";x=J.Wx(b),x.D(b,1);){w=x.W(b,1)
 if(typeof w!=="number")H.vh(new P.AT(w))
 if(z.C(a,Math.pow(10,w)))y+="0"
-b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,242,30,[],243,[],"_zeroPad"]}},
-"+ObservatoryElement":[566]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,244,30,[],245,[],"_zeroPad"]}},
+"+ObservatoryElement":[456]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -11243,42 +11523,41 @@
 z=P.bK(this.gl1(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"call$0","gqw",0,0,114],
-ni:[function(a){a.AP=null},"call$0","gl1",0,0,114],
+k0:[function(a){},"call$0","gqw",0,0,116],
+ni:[function(a){a.AP=null},"call$0","gl1",0,0,116],
 BN:[function(a){var z,y,x
-z=a.Lk
-a.Lk=null
+z=a.fn
+a.fn=null
 if(this.gnz(a)&&z!=null){y=a.AP
-x=H.VM(new P.Yp(z),[T.z2])
+x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"call$0","gDx",0,0,399],
+return!0}return!1},"call$0","gDx",0,0,330],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gyWA",6,0,null,256,[],230,[],231,[]],
-nq:[function(a,b){if(!this.gnz(a))return
-if(a.Lk==null){a.Lk=[]
-P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,29,[]],
+ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
+nq:function(a,b){if(!this.gnz(a))return
+if(a.fn==null){a.fn=[]
+P.rb(this.gDx(a))}a.fn.push(b)},
 $isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
 "^":"",
-z2:{
+yj:{
 "^":"a;",
-$isz2:true},
+$isyj:true},
 qI:{
-"^":"z2;WA>,oc>,jL>,zZ>",
-bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"call$0","gXo",0,0,null],
+"^":"yj;WA>,oc>,jL>,zZ>",
+bu:function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
 $isqI:true}}],["observe.src.compound_path_observer","package:observe/src/compound_path_observer.dart",,Y,{
 "^":"",
 J3:{
-"^":"Pi;b9,kK,Sv,rk,YX,B6,AP,Lk",
+"^":"Pi;b9,kK,Sv,rk,YX,B6,AP,fn",
 kb:function(a){return this.rk.call$1(a)},
 gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,115,"value",365],
-r6:function(a,b){return this.gP(this).call$1(b)},
-wE:[function(a){var z,y,x,w,v
+gP:[function(a){return this.Sv},null,null,1,0,117,"value",300],
+wE:function(a){var z,y,x,w,v
 if(this.YX)return
 this.YX=!0
 z=this.geu()
@@ -11287,30 +11566,30 @@
 w.dB=v.cR(z)
 w.o7=P.VH(P.AY(),v)
 w.Bd=v.Al(P.v3())
-x.push(w)}this.Ow()},"call$0","gM",0,0,null],
+x.push(w)}this.Ow()},
 TF:[function(a){if(this.B6)return
 this.B6=!0
-P.rb(this.gMc())},"call$1","geu",2,0,157,113,[]],
+P.rb(this.gMc())},"call$1","geu",2,0,159,115,[]],
 Ow:[function(){var z,y
 this.B6=!1
 z=this.b9
 if(z.length===0)return
 y=H.VM(new H.A8(z,new Y.E5()),[null,null]).br(0)
 if(this.rk!=null)y=this.kb(y)
-this.Sv=F.Wi(this,C.ls,this.Sv,y)},"call$0","gMc",0,0,114],
-cO:[function(a){var z,y
+this.Sv=F.Wi(this,C.ls,this.Sv,y)},"call$0","gMc",0,0,116],
+cO:function(a){var z,y
 z=this.b9
 if(z.length===0)return
 if(this.YX)for(y=this.kK,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)y.lo.ed()
 C.Nm.sB(z,0)
 C.Nm.sB(this.kK,0)
-this.Sv=null},"call$0","gJK",0,0,null],
-k0:[function(a){return this.wE(0)},"call$0","gqw",0,0,115],
-ni:[function(a){return this.cO(0)},"call$0","gl1",0,0,115],
+this.Sv=null},
+k0:[function(a){return this.wE(0)},"call$0","gqw",0,0,117],
+ni:[function(a){return this.cO(0)},"call$0","gl1",0,0,117],
 $isJ3:true},
 E5:{
-"^":"Tp:112;",
-call$1:[function(a){return J.Vm(a)},"call$1",null,2,0,null,96,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return J.Vm(a)},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
 Y3:[function(){var z,y,x,w,v,u,t,s,r,q
@@ -11340,34 +11619,34 @@
 z=new O.o5(z)
 return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"call$0","Zq",0,0,null],
 o5:{
-"^":"Tp:567;a",
+"^":"Tp:457;a",
 call$2:[function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.b5(z))},"call$2",null,4,0,null,169,[],153,[],"call"],
+a.RK(b,new O.b5(z))},"call$2",null,4,0,null,171,[],155,[],"call"],
 $isEH:true},
 b5:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){this.a.a=!1
 O.Y3()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"Tp:170;b",
+"^":"Tp:172;b",
 call$4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"call$4",null,8,0,null,168,[],169,[],153,[],117,[],"call"],
+return new O.Zb(this.b,b,c,d)},"call$4",null,8,0,null,170,[],171,[],155,[],119,[],"call"],
 $isEH:true},
 Zb:{
-"^":"Tp:115;c,d,e,f",
+"^":"Tp:117;c,d,e,f",
 call$0:[function(){this.c.call$2(this.d,this.e)
 return this.f.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 id:{
-"^":"Tp:568;UI",
+"^":"Tp:458;UI",
 call$4:[function(a,b,c,d){if(d==null)return d
-return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,168,[],169,[],153,[],117,[],"call"],
+return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,170,[],171,[],155,[],119,[],"call"],
 $isEH:true},
 iV:{
-"^":"Tp:112;bK,Gq,Rm,w3",
+"^":"Tp:114;bK,Gq,Rm,w3",
 call$1:[function(a){this.bK.call$2(this.Gq,this.Rm)
 return this.w3.call$1(a)},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
@@ -11396,7 +11675,7 @@
 l=J.WB(J.UQ(m,t),1)
 if(v>=w)return H.e(x,v)
 k=J.WB(J.UQ(x[v],n),1)
-J.kW(x[v],t,P.J(l,k))}}return x},"call$6","cL",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
+J.kW(x[v],t,P.J(l,k))}}return x},"call$6","cL",12,0,null,246,[],247,[],248,[],249,[],250,[],251,[]],
 Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p
 z=a.length
 y=z-1
@@ -11424,10 +11703,10 @@
 w=r
 y=t}else{v.push(2)
 x=u.W(x,1)
-w=q}}}return H.VM(new H.iK(v),[null]).br(0)},"call$1","fZ",2,0,null,250,[]],
+w=q}}}return H.VM(new H.iK(v),[null]).br(0)},"call$1","fZ",2,0,null,252,[]],
 rB:[function(a,b,c){var z,y,x
 for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},"call$3","UF",6,0,null,251,[],252,[],253,[]],
+return c},"call$3","QI",6,0,null,253,[],254,[],255,[]],
 xU:[function(a,b,c){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
@@ -11438,7 +11717,7 @@
 u=z.t(a,y)
 w=J.xH(w,1)
 u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},"call$3","M9",6,0,null,251,[],252,[],253,[]],
+if(!u)break;++v}return v},"call$3","M9",6,0,null,253,[],254,[],255,[]],
 jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.Wx(c)
 y=J.Wx(f)
@@ -11487,7 +11766,7 @@
 y.$builtinTypeInfo=[null]
 s=new G.DA(a,y,t,n,0)}J.bi(s.Il,z.t(d,o));++o
 break}if(s!=null)p.push(s)
-return p},"call$6","mu",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
+return p},"call$6","mu",12,0,null,246,[],247,[],248,[],249,[],250,[],251,[]],
 m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.RE(b)
 y=z.gWA(b)
@@ -11528,11 +11807,11 @@
 q.sjr(J.WB(q.gjr(),m))
 if(typeof m!=="number")return H.s(m)
 s+=m
-t=!0}else t=!1}if(!t)a.push(u)},"call$2","pE",4,0,null,254,[],29,[]],
+t=!0}else t=!1}if(!t)a.push(u)},"call$2","pE",4,0,null,256,[],29,[]],
 xl:[function(a,b){var z,y
 z=H.VM([],[G.DA])
 for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"call$2","bN",4,0,null,73,[],255,[]],
+return z},"call$2","l0",4,0,null,75,[],257,[]],
 u2:[function(a,b){var z,y,x,w,v,u
 if(b.length===1)return b
 z=[]
@@ -11542,21 +11821,21 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.de(v,x[u]))z.push(w)
 continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","AH",4,0,null,73,[],255,[]],
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","AH",4,0,null,75,[],257,[]],
 DA:{
 "^":"a;WA>,ok<,Il<,jr@,dM",
 gvH:function(a){return this.jr},
 gRt:function(){return this.ok},
 gNg:function(){return this.dM},
-ck:[function(a){var z=this.jr
+ck:function(a){var z=this.jr
 if(typeof z!=="number")return H.s(z)
 z=a<z
 if(z)return!1
 if(!J.de(this.dM,J.q8(this.ok.G4)))return!0
 z=J.WB(this.jr,this.dM)
 if(typeof z!=="number")return H.s(z)
-return a<z},"call$1","gcW",2,0,null,48,[]],
-bu:[function(a){return"#<ListChangeRecord index: "+H.d(this.jr)+", removed: "+H.d(this.ok)+", addedCount: "+H.d(this.dM)+">"},"call$0","gXo",0,0,null],
+return a<z},
+bu:function(a){return"#<ListChangeRecord index: "+H.d(this.jr)+", removed: "+H.d(this.ok)+", addedCount: "+H.d(this.dM)+">"},
 $isDA:true,
 static:{XM:function(a,b,c,d){var z
 if(d==null)d=[]
@@ -11572,12 +11851,12 @@
 "^":"",
 Wi:[function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},"call$4","Ha",8,0,null,98,[],256,[],230,[],231,[]],
+return d},"call$4","Ha",8,0,null,100,[],258,[],232,[],233,[]],
 d3:{
 "^":"a;",
 $isd3:true},
 lS:{
-"^":"Tp:355;a,b",
+"^":"Tp:293;a,b",
 call$2:[function(a,b){var z,y,x,w,v
 z=this.b
 y=z.wv.rN(a).gAx()
@@ -11587,23 +11866,22 @@
 x.a=v
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
-z.V2.u(0,a,y)}},"call$2",null,4,0,null,12,[],230,[],"call"],
+z.V2.u(0,a,y)}},"call$2",null,4,0,null,12,[],232,[],"call"],
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
 xh:{
-"^":"Pi;L1,AP,Lk",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",365],
-r6:function(a,b){return this.gP(this).call$1(b)},
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},231,[],"value",365],
-bu:[function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"},"call$0","gXo",0,0,null]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+"^":"Pi;L1,AP,fn",
+gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",300],
+sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},233,[],"value",300],
+bu:function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
-"^":"er;b3,xg,h3,AP,Lk",
+"^":"er;b3,xg,h3,AP,fn",
 gvp:function(){var z=this.xg
 if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
 this.xg=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.h3.length},null,null,1,0,540,"length",365],
+gB:[function(a){return this.h3.length},null,null,1,0,459,"length",300],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.h3
 y=z.length
@@ -11631,10 +11909,10 @@
 u=[]
 w=new P.Yp(u)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,422,30,[],"length",365],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,346,30,[],"length",300],
 t:[function(a,b){var z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},15,[],"[]",365],
+return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[J.im]}},this.$receiver,"wn")},15,[],"[]",300],
 u:[function(a,b,c){var z,y,x,w
 z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -11646,10 +11924,10 @@
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[J.im,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",365],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,399,"isEmpty",365],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,399,"isNotEmpty",365],
-Mh:[function(a,b,c){var z,y,x
+z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[J.im,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",300],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,330,"isEmpty",300],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,330,"isNotEmpty",300],
+Mh:function(a,b,c){var z,y,x
 z=J.x(c)
 if(!z.$isList&&!z.$isz5)c=z.br(c)
 y=J.q8(c)
@@ -11658,8 +11936,8 @@
 z=x==null?z!=null:x!==z}else z=!1
 if(z&&J.z8(y,0)){z=this.h3
 H.K0(z,b,y)
-this.iH(G.XM(this,b,y,H.q9(z,b,y,null).br(0)))}H.ed(this.h3,b,c)},"call$2","gpH",4,0,null,15,[],116,[]],
-h:[function(a,b){var z,y,x,w
+this.iH(G.XM(this,b,y,H.q9(z,b,y,null).br(0)))}H.ed(this.h3,b,c)},
+h:function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
 this.nU(y,y+1)
@@ -11667,8 +11945,8 @@
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)this.iH(G.XM(this,y,1,null))
-C.Nm.h(z,b)},"call$1","ght",2,0,null,30,[]],
-FV:[function(a,b){var z,y,x,w
+C.Nm.h(z,b)},
+FV:function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
 C.Nm.FV(z,b)
@@ -11677,11 +11955,11 @@
 z=this.xg
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.iH(G.XM(this,y,x,null))},"call$1","gDY",2,0,null,116,[]],
-Rz:[function(a,b){var z,y
+if(z&&x>0)this.iH(G.XM(this,y,x,null))},
+Rz:function(a,b){var z,y
 for(z=this.h3,y=0;y<z.length;++y)if(J.de(z[y],b)){this.UZ(0,y,y+1)
-return!0}return!1},"call$1","guH",2,0,null,132,[]],
-UZ:[function(a,b,c){var z,y,x,w,v,u,t
+return!0}return!1},
+UZ:function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
 if(!z||b>this.h3.length)H.vh(P.TE(b,0,this.h3.length))
 y=!(c<b)
@@ -11708,8 +11986,8 @@
 z=z.br(0)
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},"call$2","gYH",4,0,null,123,[],124,[]],
-oF:[function(a,b,c){var z,y,x,w
+this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
+oF:function(a,b,c){var z,y,x,w
 if(b<0||b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
 z=J.x(c)
 if(!z.$isList&&!z.$isz5)c=z.br(c)
@@ -11725,8 +12003,8 @@
 z=this.xg
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&y>0)this.iH(G.XM(this,b,y,null))},"call$2","gFD",4,0,null,15,[],116,[]],
-xe:[function(a,b,c){var z,y,x
+if(z&&y>0)this.iH(G.XM(this,b,y,null))},
+xe:function(a,b,c){var z,y,x
 if(b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
 z=this.h3
 y=z.length
@@ -11741,21 +12019,21 @@
 y=x==null?y!=null:x!==y}else y=!1
 if(y)this.iH(G.XM(this,b,1,null))
 if(b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gJe",4,0,null,15,[],132,[]],
-iH:[function(a){var z,y
+z[b]=c},
+iH:function(a){var z,y
 z=this.xg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
 if(this.b3==null){this.b3=[]
-P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,29,[]],
-nU:[function(a,b){var z,y
+P.rb(this.gL6())}this.b3.push(a)},
+nU:function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
 y=J.x(b)
 this.ct(this,C.ai,z,y.n(b,0))
-this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gdX",4,0,null,230,[],231,[]],
-oC:[function(){var z,y,x
+this.ct(this,C.nZ,!z,!y.n(b,0))},
+Ju:[function(){var z,y,x
 z=this.b3
 if(z==null)return!1
 y=G.u2(this,z)
@@ -11766,7 +12044,7 @@
 if(x){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"call$0","gL6",0,0,399],
+return!0}return!1},"call$0","gL6",0,0,330],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -11774,32 +12052,31 @@
 "^":"ar+Pi;",
 $isd3:true},
 Bj:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){this.a.xg=null},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
 HA:{
-"^":"z2;G3>,jL>,zZ>,JD,dr",
-bu:[function(a){var z
+"^":"yj;G3>,jL>,zZ>,JD,dr",
+bu:function(a){var z
 if(this.JD)z="insert"
 else z=this.dr?"remove":"set"
-return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"call$0","gXo",0,0,null],
+return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
 $isHA:true},
 qC:{
-"^":"Pi;Zp,AP,Lk",
-gvc:[function(a){var z=this.Zp
-return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",365],
+"^":"Pi;Zp,AP,fn",
+gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",300],
 gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.QV,b]}},this.$receiver,"qC")},"values",365],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.QV,b]}},this.$receiver,"qC")},"values",300],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,540,"length",365],
+return z.gB(z)},null,null,1,0,459,"length",300],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,399,"isEmpty",365],
+return z.gB(z)===0},null,null,1,0,330,"isEmpty",300],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,399,"isNotEmpty",365],
-di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,569,30,[],"containsValue",365],
-x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,569,48,[],"containsKey",365],
-t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},48,[],"[]",365],
+return z.gB(z)!==0},null,null,1,0,330,"isNotEmpty",300],
+di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,460,30,[],"containsValue",300],
+x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,460,48,[],"containsKey",300],
+t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},48,[],"[]",300],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -11810,9 +12087,9 @@
 w=v==null?w!=null:v!==w}else w=!1
 if(w){z=z.gB(z)
 if(y!==z){F.Wi(this,C.Wn,y,z)
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},48,[],30,[],"[]=",365],
-FV:[function(a,b){J.kH(b,new V.zT(this))},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){var z,y,x,w,v
+this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},48,[],30,[],"[]=",300],
+FV:function(a,b){J.kH(b,new V.zT(this))},
+Rz:function(a,b){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
 x=z.Rz(0,b)
@@ -11820,24 +12097,24 @@
 if(w!=null){v=w.iE
 w=v==null?w!=null:v!==w}else w=!1
 if(w&&y!==z.gB(z)){this.nq(this,H.VM(new V.HA(b,x,null,!1,!0),[null,null]))
-F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","guH",2,0,null,48,[]],
-V1:[function(a){var z,y,x,w
+F.Wi(this,C.Wn,y,z.gB(z))}return x},
+V1:function(a){var z,y,x,w
 z=this.Zp
 y=z.gB(z)
 x=this.AP
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x&&y>0){z.aN(0,new V.Lo(this))
-F.Wi(this,C.Wn,y,0)}z.V1(0)},"call$0","gRa",0,0,null],
-aN:[function(a,b){return this.Zp.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
+F.Wi(this,C.Wn,y,0)}z.V1(0)},
+aN:function(a,b){return this.Zp.aN(0,b)},
+bu:function(a){return P.vW(this)},
 $isqC:true,
 $isZ0:true,
 static:{WF:function(a,b,c){var z=V.Bq(a,b,c)
 z.FV(0,a)
 return z},Bq:function(a,b,c){var z,y
 z=J.x(a)
-if(!!z.$isBa)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
+if(!!z.$isNb)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
 else y=!!z.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.Py(null,null,null,b,c),null,null),[b,c])
 return y}}},
 zT:{
@@ -11846,7 +12123,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:355;a",
+"^":"Tp:293;a",
 call$2:[function(a,b){var z=this.a
 z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
@@ -11865,8 +12142,8 @@
 return x}if(L.M6(y,C.fz)){x=J.UQ(a,J.GL(b))
 return x}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't get "+H.d(b)+" in "+H.d(a))
-return},"call$2","MT",4,0,null,6,[],71,[]],
-h6:[function(a,b,c){var z,y,x,w
+return},"call$2","MT",4,0,null,6,[],73,[]],
+ir:[function(a,b,c){var z,y,x,w
 if(a==null)return!1
 x=b
 if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
@@ -11876,7 +12153,7 @@
 return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
 return!0}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"call$3","nV",6,0,null,6,[],71,[],30,[]],
+return!1},"call$3","J6",6,0,null,6,[],73,[],30,[]],
 TH:[function(a,b){var z
 for(;!J.de(a,$.aA());){z=a.gYK().nb
 if(z.x4(b))return!0
@@ -11901,9 +12178,9 @@
 if(a==="")return!0
 if(0>=a.length)return H.e(a,0)
 if(a[0]===".")return!1
-return $.tN().zD(a)},"call$1","wf",2,0,null,91,[]],
+return $.tN().zD(a)},"call$1","wf",2,0,null,93,[]],
 WR:{
-"^":"Pi;ay,YB,BK,kN,cs,cT,AP,Lk",
+"^":"Pi;ay,YB,BK,kN,cs,cT,AP,fn",
 E4:function(a){return this.cT.call$1(a)},
 gWA:function(a){var z=this.kN
 if(0>=z.length)return H.e(z,0)
@@ -11914,8 +12191,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",365],
-r6:function(a,b){return this.gP(this).call$1(b)},
+return C.Nm.grZ(this.kN)},null,null,1,0,117,"value",300],
 sP:[function(a,b){var z,y,x,w
 z=this.BK
 y=z.length
@@ -11929,19 +12205,19 @@
 if(w<0||w>=x.length)return H.e(x,w)
 x=x[w]
 if(w>=z.length)return H.e(z,w)
-if(L.h6(x,z[w],b)){z=this.kN
+if(L.ir(x,z[w],b)){z=this.kN
 if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,570,231,[],"value",365],
+z[y]=b}},null,null,3,0,461,233,[],"value",300],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
-this.XI()},"call$0","gqw",0,0,114],
+this.XI()},"call$0","gqw",0,0,116],
 ni:[function(a){var z,y
 for(z=0;y=this.cs,z<y.length;++z){y=y[z]
 if(y!=null){y.ed()
 y=this.cs
 if(z>=y.length)return H.e(y,z)
-y[z]=null}}O.Pi.prototype.ni.call(this,this)},"call$0","gl1",0,0,114],
-Zy:[function(a){var z,y,x,w,v,u
+y[z]=null}}O.Pi.prototype.ni.call(this,this)},"call$0","gl1",0,0,116],
+Zy:function(a){var z,y,x,w,v,u
 if(a==null)a=this.BK.length
 z=this.BK
 y=z.length-1
@@ -11956,8 +12232,9 @@
 if(w===y&&x)u=this.E4(u)
 v=this.kN;++w
 if(w>=v.length)return H.e(v,w)
-v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gJh",0,3,null,82,124,[]],
-hd:[function(a){var z,y,x,w,v,u,t,s,r
+v[w]=u}},
+ov:function(){return this.Zy(null)},
+hd:function(a){var z,y,x,w,v,u,t,s,r
 for(z=this.BK,y=z.length-1,x=this.cT!=null,w=a,v=null,u=null;w<=y;w=s){t=this.kN
 s=w+1
 r=t.length
@@ -11974,8 +12251,8 @@
 t[s]=u}this.ij(a)
 if(this.gnz(this)&&!J.de(v,u)){z=new T.qI(this,C.ls,v,u)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}},"call$1$start","gHi",0,3,null,339,123,[]],
-Rl:[function(a,b){var z,y
+this.nq(this,z)}},
+Rl:function(a,b){var z,y
 if(b==null)b=this.BK.length
 if(typeof b!=="number")return H.s(b)
 z=a
@@ -11983,8 +12260,10 @@
 if(z>=y.length)return H.e(y,z)
 y=y[z]
 if(y!=null)y.ed()
-this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,339,82,123,[],124,[]],
-Kh:[function(a){var z,y,x,w,v
+this.Kh(z)}},
+XI:function(){return this.Rl(0,null)},
+ij:function(a){return this.Rl(a,null)},
+Kh:function(a){var z,y,x,w,v
 z=this.kN
 if(a>=z.length)return H.e(z,a)
 y=z[a]
@@ -12006,7 +12285,7 @@
 w.o7=P.VH(P.AY(),z)
 w.Bd=z.Al(P.v3())
 if(a>=v.length)return H.e(v,a)
-v[a]=w}}},"call$1","gzm",2,0,null,420,[]],
+v[a]=w}}},
 d4:function(a,b,c){var z,y,x,w
 if(this.YB)for(z=J.rr(b).split("."),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),y=this.BK;z.G();){x=z.lo
 if(J.de(x,""))continue
@@ -12023,23 +12302,23 @@
 z.d4(a,b,c)
 return z}}},
 qL:{
-"^":"Tp:112;",
-call$1:[function(a){return},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 Px:{
-"^":"Tp:571;a,b,c",
+"^":"Tp:462;a,b,c",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"call$1",null,2,0,null,255,[],"call"],
+return}},"call$1",null,2,0,null,257,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:572;d,e,f",
+"^":"Tp:463;d,e,f",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"call$1",null,2,0,null,255,[],"call"],
+return}},"call$1",null,2,0,null,257,[],"call"],
 $isEH:true},
 Md:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){return new H.VR(H.v4("^(?:(?:[$_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)},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
@@ -12051,10 +12330,10 @@
 return y}if(!!z.$isQV){z=z.ez(a,R.np())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"call$1","np",2,0,112,30,[]],
+return x}return a},"call$1","np",2,0,114,30,[]],
 km:{
-"^":"Tp:355;a",
-call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,453,[],275,[],"call"],
+"^":"Tp:293;a",
+call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,360,[],277,[],"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 JX:[function(){var z,y
@@ -12079,17 +12358,17 @@
 if(!(!!x.$isRY&&!x.gV5(y)))w=!!x.$isRS&&y.glT()
 else w=!0
 if(w)for(w=J.GP(y.gc9());w.G();)if(!!J.x(w.lo.gAx()).$isyL){if(!x.$isRS||A.bc(a,y)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
-b.u(0,y.gIf(),y)}break}}return b},"call$2","Cd",4,0,null,257,[],258,[]],
+b.u(0,y.gIf(),y)}break}}return b},"call$2","Cd",4,0,null,259,[],260,[]],
 Oy:[function(a,b){var z,y
 do{z=a.gYK().nb.t(0,b)
 y=J.x(z)
 if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
 a=a.gAY()}while(!J.de(a,$.H8()))
-return},"call$2","il",4,0,null,257,[],71,[]],
+return},"call$2","il",4,0,null,259,[],73,[]],
 bc:[function(a,b){var z,y
 z=H.u1(H.d(b.gIf().fN)+"=")
 y=a.gYK().nb.t(0,new H.GD(z))
-return!!J.x(y).$isRS&&y.ghB()},"call$2","i8",4,0,null,257,[],259,[]],
+return!!J.x(y).$isRS&&y.ghB()},"call$2","i8",4,0,null,259,[],261,[]],
 YG:[function(a,b,c){var z,y,x
 z=$.cM()
 if(z==null||a==null)return
@@ -12098,7 +12377,7 @@
 if(y==null)return
 x=J.UQ(y,"ShadowCSS")
 if(x==null)return
-x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,260,[],12,[],261,[]],
+x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,262,[],12,[],263,[]],
 Hl:[function(a){var z,y,x,w,v,u
 if(a==null)return""
 w=J.RE(a)
@@ -12117,28 +12396,28 @@
 if(!!J.x(w).$isNh){y=w
 x=new H.XO(u,null)
 $.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},"call$1","BV",2,0,null,262,[]],
+return""}else throw u}},"call$1","BV",2,0,null,264,[]],
 Ad:[function(a,b){var z
-if(b==null)b=C.hG
+if(b==null)b=C.Tu
 $.Ej().u(0,a,b)
 z=$.p2().Rz(0,a)
-if(z!=null)J.Or(z)},"call$2","ZK",2,2,null,82,12,[],11,[]],
-xv:[function(a){A.pb(a,new A.Mq())},"call$1","J2",2,0,null,263,[]],
+if(z!=null)J.Or(z)},"call$2","ZK",2,2,null,84,12,[],11,[]],
+xv:[function(a){A.pb(a,new A.Mq())},"call$1","J2",2,0,null,265,[]],
 pb:[function(a,b){var z
 if(a==null)return
 b.call$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"call$2","e0",4,0,null,263,[],155,[]],
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"call$2","e0",4,0,null,265,[],157,[]],
 lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.call$3(a,b,c)
-return new A.L6(a,b)},"call$4","y4",8,0,null,264,[],12,[],263,[],265,[]],
+return new A.L6(a,b)},"call$4","y4",8,0,null,266,[],12,[],265,[],267,[]],
 z9:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"call$1","DI",2,0,null,263,[]],
+return $.od().t(0,a)},"call$1","DI",2,0,null,265,[]],
 HR:[function(a,b,c){var z,y,x
 z=H.vn(a)
 y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
 if(y!=null){x=y.gMP()
 x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,47,[],266,[],19,[]],
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,47,[],268,[],19,[]],
 Rk:[function(a,b){var z
 do{z=a.gYK().nb.t(0,b)
 if(!!J.x(z).$isRS)return z
@@ -12149,16 +12428,17 @@
 J.c9(z,J.nJ(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"call$2","tO",4,0,null,267,[],268,[]],
+b.appendChild(z)},"call$2","tO",4,0,null,269,[],270,[]],
 pX:[function(){var z=window
 C.ol.hr(z)
 C.ol.oB(z,W.aF(new A.hm()))},"call$0","ji",0,0,null],
 al:[function(a,b){var z,y,x
 z=J.x(b)
 y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
-if(J.de(y.gUx(),C.PU)||J.de(y.gUx(),C.nN))if(a!=null){x=A.h5(a)
+z=J.RE(y)
+if(J.de(z.gUx(y),C.PU)||J.de(z.gUx(y),C.nN))if(a!=null){x=A.h5(a)
 if(x!=null)return P.re(x)
-return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","bP",4,0,null,30,[],71,[]],
+return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","bP",4,0,null,30,[],73,[]],
 h5:[function(a){if(a==null)return C.Qf
 if(typeof a==="number"&&Math.floor(a)===a)return C.yw
 if(typeof a==="number")return C.O4
@@ -12174,7 +12454,7 @@
 W.wi(window,z,"polymer-element",C.Bm,null)
 A.Jv()
 A.JX()
-$.ax().ml(new A.rD())},"call$0","PB",0,0,114],
+$.ax().ml(new A.rD())},"call$0","PB",0,0,116],
 Jv:[function(){var z,y,x,w,v,u,t
 for(w=$.nT(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
 try{A.pw(z)}catch(v){u=H.Ru(v)
@@ -12204,7 +12484,7 @@
 x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
 v=$.oK
 if(v==null)H.qw(z)
-else v.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,269,[],270,[],271,[],272,[]],
+else v.call$1(z)}}return d},"call$4","fE",4,4,null,84,84,271,[],272,[],273,[],274,[]],
 pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=$.RQ()
 z.toString
@@ -12260,7 +12540,7 @@
 j=l.gYj()
 $.Ej().u(0,q,j)
 i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,273,[]],
+if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,275,[]],
 ZB:[function(a,b){var z,y,x
 for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
 break}if(!y)return
@@ -12274,10 +12554,10 @@
 z=$.oK
 if(z==null)H.qw(x)
 else z.call$1(x)
-return}a.CI(b.gIf(),C.xD)},"call$2","Ii",4,0,null,98,[],220,[]],
+return}a.CI(b.gIf(),C.xD)},"call$2","Ii",4,0,null,100,[],222,[]],
 Zj:{
-"^":"Tp:112;",
-call$1:[function(a){A.pX()},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){A.pX()},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 XP:{
 "^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,lk",
@@ -12289,7 +12569,7 @@
 if(z!=null)y=J.G6(!!J.x(z).$isTU?z:M.Ky(z))
 else y=null
 return y},
-yx:[function(a){var z,y,x,w,v
+yx:function(a){var z,y,x,w,v
 if(this.y0(a,a.RT))return
 z=a.getAttribute("extends")
 if(this.PM(a,z))return
@@ -12316,20 +12596,20 @@
 v=w.gYK().nb.t(0,C.c8)
 if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
 this.Ba(a,y)
-A.yV(a.RT)},"call$0","gGy",0,0,null],
-y0:[function(a,b){if($.Ej().t(0,b)!=null)return!1
+A.yV(a.RT)},
+y0:function(a,b){if($.Ej().t(0,b)!=null)return!1
 $.p2().u(0,b,a)
 if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
-return!0},"call$1","gox0",2,0,null,12,[]],
-PM:[function(a,b){if(b!=null&&C.xB.u8(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
-return!0}return!1},"call$1","gd7",2,0,null,261,[]],
-Ba:[function(a,b){var z,y,x,w
+return!0},
+PM:function(a,b){if(b!=null&&C.xB.u8(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
+return!0}return!1},
+Ba:function(a,b){var z,y,x,w
 for(z=a,y=null;z!=null;){x=J.RE(z)
 y=x.gQg(z).MW.getAttribute("extends")
 z=x.gP1(z)}x=document
 w=a.zx
-W.wi(window,x,b,w,y)},"call$1","gr7",2,0,null,12,[]],
-YU:[function(a,b,c){var z,y,x,w,v,u
+W.wi(window,x,b,w,y)},
+YU:function(a,b,c){var z,y,x,w,v,u
 if(c!=null&&J.YP(c)!=null){z=J.YP(c)
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
@@ -12348,21 +12628,21 @@
 if(typeof console!="undefined")console.warn(y)
 continue}y=a.Q7
 if(y==null){y=H.B7([],P.L5(null,null,null,null,null))
-a.Q7=y}y.u(0,v,u)}}},"call$2","ga2",4,0,null,257,[],573,[]],
-Vk:[function(a){var z,y
+a.Q7=y}y.u(0,v,u)}}},
+Vk:function(a){var z,y
 z=P.L5(null,null,null,J.O,P.a)
 a.xX=z
 y=a.aa
 if(y!=null)z.FV(0,J.Ng(y))
-new W.i7(a).aN(0,new A.CK(a))},"call$0","gYi",0,0,null],
-W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,574,[]],
-Mi:[function(a){var z=this.Hs(a,"[rel=stylesheet]")
+new W.i7(a).aN(0,new A.CK(a))},
+W3:function(a,b){new W.i7(a).aN(0,new A.LJ(b))},
+Mi:function(a){var z=this.Hs(a,"[rel=stylesheet]")
 a.cI=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},"call$0","gax",0,0,null],
-f6:[function(a){var z=this.Hs(a,"style[polymer-scope]")
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},
+f6:function(a){var z=this.Hs(a,"style[polymer-scope]")
 a.lD=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},"call$0","gyS",0,0,null],
-yq:[function(a){var z,y,x,w,v,u,t
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},
+yq:function(a){var z,y,x,w,v,u,t
 z=a.cI
 z.toString
 y=H.VM(new H.U5(z,new A.ZG()),[null])
@@ -12375,14 +12655,15 @@
 w.vM=t+"\n"}if(w.vM.length>0){z=document.createElement("style",null)
 J.c9(z,H.d(w))
 v=J.RE(x)
-v.mK(x,z,v.gp8(x))}}},"call$0","gnt",0,0,null],
-oP:[function(a,b,c){var z,y,x
+v.mK(x,z,v.gp8(x))}}},
+oP:function(a,b,c){var z,y,x
 z=W.vD(a.querySelectorAll(b),null)
 y=z.br(z)
 x=this.gZf(a)
 if(x!=null)C.Nm.FV(y,J.pe(x,b))
-return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gIG",2,2,null,82,486,[],575,[]],
-kO:[function(a,b){var z,y,x,w,v,u
+return y},
+Hs:function(a,b){return this.oP(a,b,null)},
+kO:function(a,b){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.Oc("[polymer-scope="+b+"]")
 for(x=a.cI,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.SO(J.GP(x.l6),x.T6),[H.Kp(x,0)]),w=x.OI;x.G();){v=A.Hl(w.gl())
@@ -12392,14 +12673,14 @@
 z.vM=u+"\n\n"}for(x=a.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.SO(J.GP(y.l6),y.T6),[H.Kp(y,0)]),x=y.OI;y.G();){w=x.gl().ghg()
 w=z.vM+w
 z.vM=w
-z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,576,[]],
-J3:[function(a,b,c){var z
+z.vM=w+"\n\n"}return z.vM},
+J3:function(a,b,c){var z
 if(b==="")return
 z=document.createElement("style",null)
 J.c9(z,b)
 z.setAttribute("element",H.d(a.RT)+"-"+c)
-return z},"call$2","gye",4,0,null,577,[],576,[]],
-q1:[function(a,b){var z,y,x,w
+return z},
+q1:function(a,b){var z,y,x,w
 if(J.de(b,$.H8()))return
 this.q1(a,b.gAY())
 for(z=b.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
@@ -12408,10 +12689,10 @@
 w=J.rY(x)
 if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
 x=w.Nj(x,0,J.xH(w.gB(x),7))
-a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},"call$1","gHv",2,0,null,257,[]],
-qC:[function(a,b){var z=P.L5(null,null,null,J.O,null)
+a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},
+qC:function(a,b){var z=P.L5(null,null,null,J.O,null)
 b.aN(0,new A.MX(z))
-return z},"call$1","gh6",2,0,null,578,[]],
+return z},
 du:function(a){a.RT=a.getAttribute("name")
 this.yx(a)},
 $isXP:true,
@@ -12420,15 +12701,15 @@
 C.zb.du(a)
 return a}}},
 q6:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){return[]},"call$0",null,0,0,null,"call"],
 $isEH:true},
 CK:{
-"^":"Tp:355;a",
+"^":"Tp:293;a",
 call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 LJ:{
-"^":"Tp:355;a",
+"^":"Tp:293;a",
 call$2:[function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
@@ -12436,38 +12717,38 @@
 if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 ZG:{
-"^":"Tp:112;",
-call$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"call$1",null,2,0,null,93,[],"call"],
 $isEH:true},
 Oc:{
-"^":"Tp:112;a",
-call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,93,[],"call"],
 $isEH:true},
 MX:{
-"^":"Tp:355;a",
+"^":"Tp:293;a",
 call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 w13:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){var z=P.L5(null,null,null,J.O,J.O)
 C.FS.aN(0,new A.r3y(z))
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 r3y:{
-"^":"Tp:355;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,579,[],580,[],"call"],
+"^":"Tp:293;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,464,[],465,[],"call"],
 $isEH:true},
 yL:{
 "^":"ndx;",
 $isyL:true},
 zs:{
-"^":["a;KM:X0=-383",function(){return[C.Nw]}],
+"^":["a;KM:X0=-314",function(){return[C.Nw]}],
 gpQ:function(a){return!1},
-Pa:[function(a){var z
+Pa:function(a){var z
 if(W.Pv(this.gM0(a).defaultView)==null)z=$.Bh>0
 else z=!0
-if(z)this.Ec(a)},"call$0","gu1",0,0,null],
-Ec:[function(a){var z,y
+if(z)this.Ec(a)},
+Ec:function(a){var z,y
 z=this.gQg(a).MW.getAttribute("is")
 y=z==null||z===""?this.gqn(a):z
 a.dZ=$.cd().t(0,y)
@@ -12477,13 +12758,13 @@
 this.Uc(a)
 $.Bh=$.Bh+1
 this.z2(a,a.dZ)
-$.Bh=$.Bh-1},"call$0","gUr",0,0,null],
-i4:[function(a){if(a.dZ==null)this.Ec(a)
-this.BT(a,!0)},"call$0","gQd",0,0,null],
-xo:[function(a){this.x3(a)},"call$0","gbt",0,0,null],
-z2:[function(a,b){if(b!=null){this.z2(a,J.lB(b))
-this.d0(a,b)}},"call$1","gET",2,0,null,581,[]],
-d0:[function(a,b){var z,y,x,w
+$.Bh=$.Bh-1},
+i4:function(a){if(a.dZ==null)this.Ec(a)
+this.BT(a,!0)},
+xo:function(a){this.x3(a)},
+z2:function(a,b){if(b!=null){this.z2(a,J.lB(b))
+this.d0(a,b)}},
+d0:function(a,b){var z,y,x,w
 z=J.RE(b)
 y=z.Ja(b,"template")
 if(y!=null)if(J.Vs(a.dZ).MW.hasAttribute("lightdom")===!0){this.Se(a,y)
@@ -12492,15 +12773,15 @@
 if(!J.x(x).$isI0)return
 w=z.gQg(b).MW.getAttribute("name")
 if(w==null)return
-a.B7.u(0,w,x)},"call$1","gEB",2,0,null,582,[]],
-Se:[function(a,b){var z,y
+a.B7.u(0,w,x)},
+Se:function(a,b){var z,y
 if(b==null)return
 z=!!J.x(b).$isTU?b:M.Ky(b)
 y=z.ZK(a,a.SO)
 this.jx(a,y)
 this.lj(a,a)
-return y},"call$1","gAt",2,0,null,260,[]],
-Tp:[function(a,b){var z,y
+return y},
+Tp:function(a,b){var z,y
 if(b==null)return
 this.gIW(a)
 z=this.er(a)
@@ -12510,15 +12791,15 @@
 y=!!J.x(b).$isTU?b:M.Ky(b)
 z.appendChild(y.ZK(a,a.SO))
 this.lj(a,z)
-return z},"call$1","gCS",2,0,null,260,[]],
-lj:[function(a,b){var z,y,x,w
+return z},
+lj:function(a,b){var z,y,x,w
 for(z=J.pe(b,"[id]"),z=z.gA(z),y=a.X0,x=J.w1(y);z.G();){w=z.lo
-x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,380,[]],
-aC:[function(a,b,c,d){var z=J.x(b)
-if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},"call$3","gxR",6,0,null,12,[],230,[],231,[]],
-Z2:[function(a){J.Ng(a.dZ).aN(0,new A.WC(a))},"call$0","gGN",0,0,null],
-fk:[function(a){if(J.ak(a.dZ)==null)return
-this.gQg(a).aN(0,this.ghW(a))},"call$0","goQ",0,0,null],
+x.u(y,J.F8(w),w)}},
+aC:function(a,b,c,d){var z=J.x(b)
+if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},
+Z2:function(a){J.Ng(a.dZ).aN(0,new A.WC(a))},
+fk:function(a){if(J.ak(a.dZ)==null)return
+this.gQg(a).aN(0,this.ghW(a))},
 D3:[function(a,b,c){var z,y,x,w
 z=this.B2(a,b)
 if(z==null)return
@@ -12526,20 +12807,20 @@
 y=H.vn(a)
 x=y.rN(z.gIf()).gAx()
 w=Z.Zh(c,x,A.al(x,z))
-if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,583,12,[],30,[]],
-B2:[function(a,b){var z=J.ak(a.dZ)
+if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,466,12,[],30,[]],
+B2:function(a,b){var z=J.ak(a.dZ)
 if(z==null)return
-return z.t(0,b)},"call$1","gHf",2,0,null,12,[]],
-TW:[function(a,b){if(b==null)return
+return z.t(0,b)},
+TW:function(a,b){if(b==null)return
 if(typeof b==="boolean")return b?"":null
 else if(typeof b==="string"||typeof b==="number"&&Math.floor(b)===b||typeof b==="number")return H.d(b)
-return},"call$1","gt4",2,0,null,30,[]],
-Id:[function(a,b){var z,y
+return},
+Id:function(a,b){var z,y
 z=H.vn(a).rN(b).gAx()
 y=this.TW(a,z)
 if(y!=null)this.gQg(a).MW.setAttribute(J.GL(b),y)
-else if(typeof z==="boolean")this.gQg(a).Rz(0,J.GL(b))},"call$1","gQp",2,0,null,12,[]],
-Z1:[function(a,b,c,d){var z,y,x,w,v,u,t
+else if(typeof z==="boolean")this.gQg(a).Rz(0,J.GL(b))},
+Z1:function(a,b,c,d){var z,y,x,w,v,u,t
 if(a.dZ==null)this.Ec(a)
 z=this.B2(a,b)
 if(z==null)return J.Jj(M.Ky(a),b,c,d)
@@ -12557,10 +12838,10 @@
 t.bw(a,y,c,d)
 this.Id(a,z.gIf())
 J.kW(J.QE(M.Ky(a)),b,t)
-return t}},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]],
+return t}},
 gCd:function(a){return J.QE(M.Ky(a))},
-Ih:[function(a,b){return J.MV(M.Ky(a),b)},"call$1","gC8",2,0,null,12,[]],
-x3:[function(a){var z,y
+Ih:function(a,b){return J.MV(M.Ky(a),b)},
+x3:function(a){var z,y
 if(a.Uk===!0)return
 $.P5().J4("["+H.d(this.gqn(a))+"] asyncUnbindAll")
 z=a.oq
@@ -12569,7 +12850,7 @@
 else z=new A.S0(null,null)
 z.M3=y
 z.ih=P.rT(C.ny,z.gv6(z))
-a.oq=z},"call$0","gpj",0,0,null],
+a.oq=z},
 GB:[function(a){var z,y
 if(a.Uk===!0)return
 z=a.Wz
@@ -12578,27 +12859,28 @@
 J.AA(M.Ky(a))
 y=this.gIW(a)
 for(;y!=null;){A.xv(y)
-y=y.olderShadowRoot}a.Uk=!0},"call$0","gJg",0,0,114],
-BT:[function(a,b){var z
+y=y.olderShadowRoot}a.Uk=!0},"call$0","gJg",0,0,116],
+BT:function(a,b){var z
 if(a.Uk===!0){$.P5().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
 return}$.P5().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
 z=a.oq
 if(z!=null){z.TP(0)
 a.oq=null}if(b===!0)return
-A.pb(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,584,[]],
-Xl:[function(a){var z,y,x,w,v
+A.pb(this.gIW(a),new A.TV())},
+oW:function(a){return this.BT(a,null)},
+Xl:function(a){var z,y,x,w,v
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
 if(z!=null)for(x=H.VM(new P.i5(z),[H.Kp(z,0)]),w=x.Fb,x=H.VM(new P.N6(w,w.zN,null,null),[H.Kp(x,0)]),x.zq=x.Fb.H9;x.G();){v=x.fD
-this.rJ(a,v,H.vn(a).rN(v),null)}if(z!=null||y!=null)a.Wz=this.gUj(a).yI(this.gnu(a))},"call$0","gJx",0,0,null],
+this.rJ(a,v,H.vn(a).rN(v),null)}if(z!=null||y!=null)a.Wz=this.gUj(a).yI(this.gnu(a))},
 Pv:[function(a,b){var z,y,x,w,v
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
 x=P.L5(null,null,null,P.wv,A.bS)
 for(w=J.GP(b);w.G();){v=w.gl()
 if(!J.x(v).$isqI)continue
-J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,585,586,[]],
-rJ:[function(a,b,c,d){var z,y,x,w,v
+J.iF(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,467,468,[]],
+rJ:function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
 y=z.t(0,b)
@@ -12615,23 +12897,23 @@
 x=H.d(J.GL(b))+"__array"
 v=a.Sa
 if(v==null){v=P.L5(null,null,null,J.O,P.MO)
-a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],30,[],247,[]],
-l5:[function(a,b){var z=a.Sa.Rz(0,b)
+a.Sa=v}v.u(0,x,w)}},
+l5:function(a,b){var z=a.Sa.Rz(0,b)
 if(z==null)return!1
 z.ed()
-return!0},"call$1","gbe",2,0,null,12,[]],
-C0:[function(a){var z=a.Sa
+return!0},
+C0:function(a){var z=a.Sa
 if(z==null)return
 for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)z.lo.ed()
 a.Sa.V1(0)
-a.Sa=null},"call$0","gNX",0,0,null],
-Uc:[function(a){var z,y
+a.Sa=null},
+Uc:function(a){var z,y
 z=J.yxg(a.dZ)
 if(z.gl0(z))return
 y=$.SS()
 if(y.Im(C.R5))y.J4("["+H.d(this.gqn(a))+"] addHostListeners: "+H.d(z))
-this.UH(a,a,z.gvc(z),this.gD4(a))},"call$0","gxD",0,0,null],
-UH:[function(a,b,c,d){var z,y,x,w,v,u,t
+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)
 v=w.Ph
@@ -12639,7 +12921,7 @@
 t=new W.Ov(0,w.uv,v,W.aF(d),u)
 t.$builtinTypeInfo=[H.Kp(w,0)]
 w=t.u7
-if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,263,[],587,[],301,[]],
+if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},
 iw:[function(a,b){var z,y,x,w,v,u,t
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
@@ -12651,15 +12933,15 @@
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,588,376,[]],
-ea:[function(a,b,c,d){var z,y
+this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,469,309,[]],
+ea:function(a,b,c,d){var z,y
 z=$.SS()
 y=z.Im(C.R5)
 if(y)z.J4(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
 if(!!J.x(c).$isEH)H.Ek(c,d,P.Te(null))
 else if(typeof c==="string")A.HR(b,new H.GD(H.u1(c)),d)
 else z.j2("invalid callback")
-if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],589,[],19,[]],
+if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},
 $iszs:true,
 $isTU:true,
 $isd3:true,
@@ -12667,30 +12949,30 @@
 $isD0:true,
 $isKV:true},
 WC:{
-"^":"Tp:355;a",
+"^":"Tp:293;a",
 call$2:[function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).call$0())
 z.t(0,a)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 Xi:{
-"^":"Tp:115;b",
+"^":"Tp:117;b",
 call$0:[function(){return this.b},"call$0",null,0,0,null,"call"],
 $isEH:true},
 TV:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){var z=J.x(a)
-if(!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
+if(!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,200,[],"call"],
 $isEH:true},
 Mq:{
-"^":"Tp:112;",
-call$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"call$1",null,2,0,null,263,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"call$1",null,2,0,null,265,[],"call"],
 $isEH:true},
 Oa:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){return new A.bS(this.a.jL,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 n1:{
-"^":"Tp:355;b,c,d,e",
+"^":"Tp:293;b,c,d,e",
 call$2:[function(a,b){var z,y,x
 z=this.e
 if(z!=null&&z.x4(a))J.Jr(this.b,a)
@@ -12700,14 +12982,14 @@
 if(y!=null){z=this.b
 x=J.RE(b)
 J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],590,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],470,[],"call"],
 $isEH:true},
 xf:{
-"^":"Tp:112;a,b,c",
-call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,586,[],"call"],
+"^":"Tp:114;a,b,c",
+call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,468,[],"call"],
 $isEH:true},
 L6:{
-"^":"Tp:355;a,b",
+"^":"Tp:293;a,b",
 call$2:[function(a,b){var z,y,x
 z=$.SS()
 if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
@@ -12716,10 +12998,10 @@
 if(x!=null)y=x
 z=J.f5(b).t(0,y)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,283,[],263,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,285,[],265,[],"call"],
 $isEH:true},
 Rs:{
-"^":"Tp:112;c,d,e",
+"^":"Tp:114;c,d,e",
 call$1:[function(a){var z,y,x,w,v,u
 z=this.e
 y=A.z9(z)
@@ -12731,42 +13013,42 @@
 u=L.Sk(v,C.xB.yn(w,1),null)
 w=u.gP(u)}else v=y
 u=J.x(a)
-x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,376,[],"call"],
+x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,309,[],"call"],
 $isEH:true},
 uJ:{
-"^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,591,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,471,[],"call"],
 $isEH:true},
 hm:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){var z,y,x
 z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
 for(y=z.gA(z);y.G();){x=J.pP(y.lo)
 x.h(0,"polymer-unveil")
 x.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
-y.gtH(y).ml(new A.Ji(z))}},"call$1",null,2,0,null,113,[],"call"],
+y.gtH(y).ml(new A.Ji(z))}},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 Ji:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z
-for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"call$1",null,2,0,null,113,[],"call"],
+for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 Bf:{
 "^":"TR;I6,iU,Jq,dY,qP,ZY,xS,PB,eS,ay",
-cO:[function(a){if(this.qP==null)return
+cO:function(a){if(this.qP==null)return
 this.Jq.ed()
-X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null],
-EC:[function(a){this.dY=a
-this.I6.PU(this.iU,a)},"call$1","gH0",2,0,null,231,[]],
+X.TR.prototype.cO.call(this,this)},
+EC:function(a){this.dY=a
+this.I6.PU(this.iU,a)},
 aL4:[function(a){var z,y,x,w
 for(z=J.GP(a),y=this.iU;z.G();){x=z.gl()
 if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
 z=this.dY
 if(z==null?w!=null:z!==w)J.ta(this.xS,w)
-return}}},"call$1","giz",2,0,592,255,[]],
+return}}},"call$1","giz",2,0,472,257,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
-ir:{
-"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+xc:{
+"^":["Ao;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 oX:function(a){this.Pa(a)},
 static:{G7:function(a){var z,y,x,w
 z=$.Nd()
@@ -12781,14 +13063,14 @@
 C.Iv.oX(a)
 return a}}},
 jpR:{
-"^":["qE+zs;KM:X0=-383",function(){return[C.Nw]}],
+"^":["qE+zs;KM:X0=-314",function(){return[C.Nw]}],
 $iszs:true,
 $isTU:true,
 $isd3:true,
 $iscv:true,
 $isD0:true,
 $isKV:true},
-GN:{
+Ao:{
 "^":"jpR+Pi;",
 $isd3:true},
 bS:{
@@ -12799,44 +13081,44 @@
 S0:{
 "^":"a;M3,ih",
 Ws:function(){return this.M3.call$0()},
-TP:[function(a){var z=this.ih
+TP:function(a){var z=this.ih
 if(z!=null){z.ed()
-this.ih=null}},"call$0","gol",0,0,null],
+this.ih=null}},
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"call$0","gv6",0,0,114]},
+this.Ws()}},"call$0","gv6",0,0,116]},
 V3:{
 "^":"a;ns",
 $isV3:true},
 rD:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){var z=$.mC().MM
 if(z.Gv!==0)H.vh(new P.lj("Future already completed"))
 z.OH(null)
-return},"call$1",null,2,0,null,113,[],"call"],
+return},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 Fn:{
-"^":"Tp:112;",
-call$1:[function(a){return!!J.x(a).$isRS},"call$1",null,2,0,null,593,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return!!J.x(a).$isRS},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 e3:{
-"^":"Tp:112;",
-call$1:[function(a){return!!J.x(a).$isMs},"call$1",null,2,0,null,593,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return!!J.x(a).$isMs},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 pM:{
-"^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,591,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,471,[],"call"],
 $isEH:true},
 Mh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
 "^":"",
 Zh:[function(a,b,c){var z,y,x
-z=J.UQ($.CT(),c.gUx())
+z=J.UQ($.CT(),J.Ba(c))
 if(z!=null)return z.call$2(a,b)
 try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},"call$3","jo",6,0,null,30,[],274,[],11,[]],
+return a}},"call$3","jo",6,0,null,30,[],276,[],11,[]],
 W6:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){var z=P.L5(null,null,null,null,null)
 z.u(0,C.AZ,new Z.Lf())
 z.u(0,C.ok,new Z.fT())
@@ -12847,60 +13129,60 @@
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Lf:{
-"^":"Tp:355;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],115,[],"call"],
 $isEH:true},
 fT:{
-"^":"Tp:355;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],115,[],"call"],
 $isEH:true},
 pp:{
-"^":"Tp:355;",
+"^":"Tp:293;",
 call$2:[function(a,b){var z,y
 try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},"call$2",null,4,0,null,28,[],594,[],"call"],
+return b}},"call$2",null,4,0,null,28,[],474,[],"call"],
 $isEH:true},
 nl:{
-"^":"Tp:355;",
-call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,28,[],113,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,28,[],115,[],"call"],
 $isEH:true},
 ik:{
-"^":"Tp:355;",
-call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,28,[],594,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,28,[],474,[],"call"],
 $isEH:true},
 mf:{
-"^":"Tp:112;a",
-call$1:[function(a){return this.a},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return this.a},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 LfS:{
-"^":"Tp:355;",
-call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,28,[],594,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,28,[],474,[],"call"],
 $isEH:true},
 HK:{
-"^":"Tp:112;b",
-call$1:[function(a){return this.b},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;b",
+call$1:[function(a){return this.b},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 ul:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
+if(!!z.$isZ0)z=J.vo(a.gvc(),new T.o8(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"call$1","qP",2,0,194,275,[]],
+return z},"call$1","qP",2,0,196,277,[]],
 PX:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.kl(z.gvc(a),new T.ex(a)).zV(0,";")
+if(!!z.$isZ0)z=J.kl(a.gvc(),new T.ex(a)).zV(0,";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"call$1","Fx",2,0,194,275,[]],
+return z},"call$1","Fx",2,0,196,277,[]],
 o8:{
-"^":"Tp:112;a",
-call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,453,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,360,[],"call"],
 $isEH:true},
 ex:{
-"^":"Tp:112;a",
-call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,453,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,360,[],"call"],
 $isEH:true},
 e9:{
-"^":"ve;",
-cl:[function(a,b,c){var z,y,x
+"^":"T4p;",
+op:[function(a,b,c){var z,y,x
 if(a==null)return
 z=new Y.hc(H.VM([],[Y.Pn]),P.p9(""),new P.WU(a,0,0,null),null)
 y=new U.tc()
@@ -12913,38 +13195,37 @@
 if(M.wR(c)){z=J.x(b)
 z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"call$3","gca",6,0,595,264,[],12,[],263,[]],
-CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,260,[]]},
+return new T.Xy(this,b,x)},"call$3","gca",6,0,475,266,[],12,[],265,[]],
+CE:function(a){return new T.uK(this)}},
 Xy:{
-"^":"Tp:355;a,b,c",
+"^":"Tp:293;a,b,c",
 call$2:[function(a,b){var z
 if(!J.x(a).$isz6){z=this.a.nF
 a=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}z=!!J.x(b).$iscv
 if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
 if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"call$2",null,4,0,null,283,[],263,[],"call"],
+return T.FL(this.c,a,null)},"call$2",null,4,0,null,285,[],265,[],"call"],
 $isEH:true},
 uK:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z
 if(!!J.x(a).$isz6)z=a
 else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,283,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,285,[],"call"],
 $isEH:true},
 mY:{
-"^":"Pi;a9,Cu,uI,Y7,AP,Lk",
+"^":"Pi;a9,Cu,uI,Y7,AP,fn",
 u0:function(a){return this.uI.call$1(a)},
 KX:[function(a){var z,y
 z=this.Y7
-if(!!J.x(a).$isfk){y=J.kl(a.bm,new T.mB(this,a)).tt(0,!1)
+if(!!J.x(a).$isfk){y=J.OS(J.kl(a.bm,new T.mB(this,a)),!1)
 this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,275,[]],
-gP:[function(a){return this.Y7},null,null,1,0,115,"value",365],
-r6:function(a,b){return this.gP(this).call$1(b)},
+this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,114,277,[]],
+gP:[function(a){return this.Y7},null,null,1,0,117,"value",300],
 sP:[function(a,b){var z,y,x
 try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
 if(!!J.x(x).$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,275,[],"value",365],
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,114,277,[],"value",300],
 yB:function(a,b,c){var z,y,x,w
 y=this.Cu
 y.gju().yI(this.gUG()).fm(0,new T.GX(this))
@@ -12952,23 +13233,23 @@
 y.gLl()
 this.KX(y.gLl())}catch(x){w=H.Ru(x)
 if(!!J.x(w).$isB0){z=w
-$.eH().j2("Error evaluating expression '"+H.d(y)+"': "+J.yj(z))}else throw x}},
+$.eH().j2("Error evaluating expression '"+H.d(y)+"': "+J.z2(z))}else throw x}},
 static:{FL:function(a,b,c){var z=new T.mY(b,a.RR(0,new K.G1(b,P.NZ(null,null))),c,null,null,null)
 z.yB(a,b,c)
 return z}}},
 GX:{
-"^":"Tp:112;a",
-call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,21,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 mB:{
-"^":"Tp:112;a,b",
+"^":"Tp:114;a,b",
 call$1:[function(a){var z=P.L5(null,null,null,null,null)
 z.u(0,this.b.F5,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,420,[],"call"],
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 XF:{
-"^":"xh;vq,L1,AP,Lk",
+"^":"xh;vq,L1,AP,fn",
 vb:function(a,b){this.vq.yI(new B.bX(b,this))},
 $asxh:function(a){return[null]},
 static:{z4:function(a,b){var z=H.VM(new B.XF(a,null,null,null),[b])
@@ -12977,13 +13258,13 @@
 bX:{
 "^":"Tp;a,b",
 call$1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,420,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"CV",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
 OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
 J.UK(z,new K.Ed(b))
-return z.gLv()},"call$2","ly",4,0,null,276,[],268,[]],
+return z.gLv()},"call$2","ly",4,0,null,278,[],270,[]],
 jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
@@ -13011,78 +13292,78 @@
 throw H.b(K.kG("filter must implement Transformer: "+H.d(r)))}p=K.OH(t,c)
 if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
-else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,276,[],30,[],268,[]],
+else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,278,[],30,[],270,[]],
 ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
-return a},"call$1","W1",2,0,null,275,[]],
+return a},"call$1","W1",2,0,null,277,[]],
 wJY:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 zOQ:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 W6o:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.vX(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.vX(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 MdQ:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 YJG:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 DOe:{
-"^":"Tp:355;",
-call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 lPa:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 Ufa:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 Raa:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 w0:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.Bl(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.Bl(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 w4:{
-"^":"Tp:355;",
-call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 w5:{
-"^":"Tp:355;",
-call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 w7:{
-"^":"Tp:355;",
+"^":"Tp:293;",
 call$2:[function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.call$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},"call$2",null,4,0,null,131,[],117,[],"call"],
+throw H.b(K.kG("Filters must be a one-argument function."))},"call$2",null,4,0,null,133,[],119,[],"call"],
 $isEH:true},
 w10:{
-"^":"Tp:112;",
-call$1:[function(a){return a},"call$1",null,2,0,null,131,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return a},"call$1",null,2,0,null,133,[],"call"],
 $isEH:true},
 w11:{
-"^":"Tp:112;",
-call$1:[function(a){return J.Z7(a)},"call$1",null,2,0,null,131,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return J.Z7(a)},"call$1",null,2,0,null,133,[],"call"],
 $isEH:true},
 w12:{
-"^":"Tp:112;",
-call$1:[function(a){return a!==!0},"call$1",null,2,0,null,131,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return a!==!0},"call$1",null,2,0,null,133,[],"call"],
 $isEH:true},
 c4:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 z6:{
@@ -13092,7 +13373,7 @@
 z=H.vn(this.k8)
 this.G9=z
 return z},
-t:[function(a,b){var z,y,x,w
+t:function(a,b){var z,y,x,w
 if(J.de(b,"this"))return this.k8
 else{z=this.bq.Zp
 if(z.x4(b))return K.ci(z.t(0,b))
@@ -13104,33 +13385,33 @@
 if(w)return K.ci(this.gCH().rN(y).gAx())
 else if(!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
 if(z!=null)return K.ci(z.t(0,b))
-else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},"call$1","gIA",2,0,null,12,[]],
-tI:[function(a){var z
+else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},
+tI:function(a){var z
 if(J.de(a,"this"))return
 else{z=this.bq
 if(z.Zp.x4(a))return z
 else{z=H.u1(a)
 if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return this.k8}}z=this.eT
-if(z!=null)return z.tI(a)},"call$1","gXe",2,0,null,12,[]],
-tg:[function(a,b){var z
+if(z!=null)return z.tI(a)},
+tg:function(a,b){var z
 if(this.bq.Zp.x4(b))return!0
 else{z=H.u1(b)
 if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return!0}z=this.eT
 if(z!=null)return z.tg(0,b)
-return!1},"call$1","gdj",2,0,null,12,[]],
+return!1},
 $isz6:true},
 Ay:{
 "^":"a;bO?,Lv<",
 gju:function(){var z=this.k6
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
 gLl:function(){return this.Lv},
-eC:[function(a){return this.Qh(a)},"call$1","gpn",2,0,null,268,[]],
-Qh:[function(a){},"call$1","gVj",2,0,null,268,[]],
-DX:[function(a){var z
+eC:function(a){return this.Qh(a)},
+Qh:function(a){},
+DX:function(a){var z
 this.yc(0,a)
 z=this.bO
-if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,268,[]],
-yc:[function(a,b){var z,y,x
+if(z!=null)z.DX(a)},
+yc:function(a,b){var z,y,x
 z=this.tj
 if(z!=null){z.ed()
 this.tj=null}y=this.Lv
@@ -13138,31 +13419,31 @@
 z=this.Lv
 if(z==null?y!=null:z!==y){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
-x.Iv(z)}},"call$1","gcz",2,0,null,268,[]],
-bu:[function(a){return this.KL.bu(0)},"call$0","gXo",0,0,null],
+x.Iv(z)}},
+bu:function(a){return this.KL.bu(0)},
 $ishw:true},
 Ed:{
 "^":"d2;Jd",
-xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,21,[]],
-ky:[function(a){J.UK(a.gT8(a),this)
-a.yc(0,this.Jd)},"call$1","gXf",2,0,null,280,[]]},
+xn:function(a){a.yc(0,this.Jd)},
+ky:function(a){J.UK(a.gT8(a),this)
+a.yc(0,this.Jd)}},
 G1:{
 "^":"fr;Jd,ZGj",
-W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,21,[]],
-LT:[function(a){return a.wz.RR(0,this)},"call$1","gaT",2,0,null,21,[]],
-co:[function(a){var z,y
+W9:function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},
+LT:function(a){return a.wz.RR(0,this)},
+co:function(a){var z,y
 z=J.UK(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(y)
-return y},"call$1","gEW",2,0,null,361,[]],
-CU:[function(a){var z,y,x
+return y},
+CU:function(a){var z,y,x
 z=J.UK(a.ghP(),this)
 y=J.UK(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","gA2",2,0,null,420,[]],
-ZR:[function(a){var z,y,x,w,v
+return x},
+ZR:function(a){var z,y,x,w,v
 z=J.UK(a.ghP(),this)
 y=a.gre()
 if(y==null)x=null
@@ -13171,55 +13452,55 @@
 x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
 if(x!=null)H.bQ(x,new K.Os(v))
-return v},"call$1","gES",2,0,null,420,[]],
-ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gvs",2,0,null,277,[]],
-o0:[function(a){var z,y
+return v},
+ti:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
+o0:function(a){var z,y
 z=H.VM(new H.A8(a.gPu(a),this.gnG()),[null,null]).tt(0,!1)
 y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.B8(y))
-return y},"call$1","gX7",2,0,null,277,[]],
-YV:[function(a){var z,y,x
+return y},
+YV:function(a){var z,y,x
 z=J.UK(a.gG3(a),this)
 y=J.UK(a.gv4(),this)
 x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","ghH",2,0,null,21,[]],
-qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,420,[]],
-im:[function(a){var z,y,x
+return x},
+qv:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
+im:function(a){var z,y,x
 z=J.UK(a.gBb(a),this)
 y=J.UK(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},"call$1","glf",2,0,null,96,[]],
-Hx:[function(a){var z,y
+return x},
+Hx:function(a){var z,y
 z=J.UK(a.gwz(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(y)
-return y},"call$1","ghe",2,0,null,96,[]],
-ky:[function(a){var z,y,x
+return y},
+ky:function(a){var z,y,x
 z=J.UK(a.gBb(a),this)
 y=J.UK(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},"call$1","gXf",2,0,null,420,[]]},
+return x}},
 Os:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
-return z},"call$1",null,2,0,null,131,[],"call"],
+return z},"call$1",null,2,0,null,133,[],"call"],
 $isEH:true},
 B8:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
 return z},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Wh:{
 "^":"Ay;KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
+Qh:function(a){this.Lv=a.gk8()},
+RR:function(a,b){return b.W9(this)},
 $asAy:function(){return[U.EZ]},
 $isEZ:true,
 $ishw:true},
@@ -13227,29 +13508,28 @@
 "^":"Ay;KL,bO,tj,Lv,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-r6:function(a,b){return this.gP(this).call$1(b)},
-Qh:[function(a){var z=this.KL
-this.Lv=z.gP(z)},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
+Qh:function(a){var z=this.KL
+this.Lv=z.gP(z)},
+RR:function(a,b){return b.ti(this)},
 $asAy:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
 $ishw:true},
 ev:{
 "^":"Ay;Pu>,KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
+Qh:function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},
+RR:function(a,b){return b.o0(this)},
 $asAy:function(){return[U.kB]},
 $iskB:true,
 $ishw:true},
 ID:{
-"^":"Tp:355;",
+"^":"Tp:293;",
 call$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"call$2",null,4,0,null,190,[],21,[],"call"],
+return a},"call$2",null,4,0,null,192,[],21,[],"call"],
 $isEH:true},
 qR:{
 "^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
+RR:function(a,b){return b.YV(this)},
 $asAy:function(){return[U.wk]},
 $iswk:true,
 $ishw:true},
@@ -13257,37 +13537,36 @@
 "^":"Ay;KL,bO,tj,Lv,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-r6:function(a,b){return this.gP(this).call$1(b)},
-Qh:[function(a){var z,y,x
+Qh:function(a){var z,y,x
 z=this.KL
 this.Lv=J.UQ(a,z.gP(z))
 y=a.tI(z.gP(z))
 x=J.x(y)
 if(!!x.$isd3){z=H.u1(z.gP(z))
-this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
+this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},
+RR:function(a,b){return b.qv(this)},
 $asAy:function(){return[U.w6]},
 $isw6:true,
 $ishw:true},
 Qv:{
-"^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,586,[],"call"],
+"^":"Tp:114;a,b,c",
+call$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,468,[],"call"],
 $isEH:true},
 Xm:{
-"^":"Tp:112;d",
-call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
+"^":"Tp:114;d",
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,282,[],"call"],
 $isEH:true},
 mv:{
 "^":"Ay;wz<,KL,bO,tj,Lv,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
-Qh:[function(a){var z,y
+Qh:function(a){var z,y
 z=this.KL
 y=$.ww().t(0,z.gkp(z))
 if(J.de(z.gkp(z),"!")){z=this.wz.gLv()
 this.Lv=y.call$1(z==null?!1:z)}else{z=this.wz
-this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
+this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},
+RR:function(a,b){return b.Hx(this)},
 $asAy:function(){return[U.jK]},
 $isjK:true,
 $ishw:true},
@@ -13295,7 +13574,7 @@
 "^":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
-Qh:[function(a){var z,y,x
+Qh:function(a){var z,y,x
 z=this.KL
 y=$.Ra().t(0,z.gkp(z))
 if(J.de(z.gkp(z),"&&")||J.de(z.gkp(z),"||")){z=this.Bb.gLv()
@@ -13305,20 +13584,20 @@
 else{x=this.Bb
 if(x.gLv()==null||this.T8.gLv()==null)this.Lv=null
 else{if(J.de(z.gkp(z),"|")&&!!J.x(x.gLv()).$iswn)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
-this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
+this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},
+RR:function(a,b){return b.im(this)},
 $asAy:function(){return[U.uk]},
 $isuk:true,
 $ishw:true},
 uA:{
-"^":"Tp:112;a,b",
-call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;a,b",
+call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 vl:{
 "^":"Ay;hP<,KL,bO,tj,Lv,k6",
 goc:function(a){var z=this.KL
 return z.goc(z)},
-Qh:[function(a){var z,y,x,w
+Qh:function(a){var z,y,x,w
 z=this.hP.gLv()
 if(z==null){this.Lv=null
 return}y=H.vn(z)
@@ -13326,45 +13605,45 @@
 w=new H.GD(H.u1(x.goc(x)))
 this.Lv=y.rN(w).gAx()
 x=J.x(z)
-if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.Li(this,a,w))},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.Li(this,a,w))},
+RR:function(a,b){return b.co(this)},
 $asAy:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
 Li:{
-"^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,586,[],"call"],
+"^":"Tp:114;a,b,c",
+call$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,468,[],"call"],
 $isEH:true},
 WK:{
-"^":"Tp:112;d",
-call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
+"^":"Tp:114;d",
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,282,[],"call"],
 $isEH:true},
 iT:{
 "^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
-Qh:[function(a){var z,y,x
+Qh:function(a){var z,y,x
 z=this.hP.gLv()
 if(z==null){this.Lv=null
 return}y=this.Jn.gLv()
 x=J.U6(z)
 this.Lv=x.t(z,y)
-if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},
+RR:function(a,b){return b.CU(this)},
 $asAy:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
 tE:{
-"^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,586,[],"call"],
+"^":"Tp:114;a,b,c",
+call$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,468,[],"call"],
 $isEH:true},
 ey:{
-"^":"Tp:112;d",
-call$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,280,[],"call"],
+"^":"Tp:114;d",
+call$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,282,[],"call"],
 $isEH:true},
 fa:{
 "^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
 gbP:function(a){var z=this.KL
 return z.gbP(z)},
-Qh:[function(a){var z,y,x,w,v
+Qh:function(a){var z,y,x,w,v
 z=this.re
 z.toString
 y=H.VM(new H.A8(z,new K.WW()),[null,null]).br(0)
@@ -13376,26 +13655,26 @@
 v=new H.GD(H.u1(z.gbP(z)))
 this.Lv=w.F2(v,y,null).Ax
 z=J.x(x)
-if(!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,v))}},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
+if(!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,v))}},
+RR:function(a,b){return b.ZR(this)},
 $asAy:function(){return[U.Jy]},
 $isJy:true,
 $ishw:true},
 WW:{
-"^":"Tp:112;",
-call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,131,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,133,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:572;a,b,c",
-call$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,586,[],"call"],
+"^":"Tp:463;a,b,c",
+call$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,468,[],"call"],
 $isEH:true},
 a9:{
-"^":"Tp:112;d",
-call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
+"^":"Tp:114;d",
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,282,[],"call"],
 $isEH:true},
 VA:{
 "^":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
-Qh:[function(a){var z,y,x,w
+Qh:function(a){var z,y,x,w
 z=this.Bb
 y=this.T8.gLv()
 x=J.x(y)
@@ -13403,26 +13682,26 @@
 if(!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
 x=J.Vm(z)
 w=y!=null?y:C.xD
-this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
+this.Lv=new K.fk(x,w)},
+RR:function(a,b){return b.ky(this)},
 $asAy:function(){return[U.K9]},
 $isK9:true,
 $ishw:true},
 J1:{
-"^":"Tp:112;a,b",
-call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;a,b",
+call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 fk:{
 "^":"a;F5,bm",
 $isfk:true},
 wL:{
-"^":"a:112;lR,ex",
-call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,596,[]],
+"^":"a:114;lR,ex",
+call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,476,[]],
 $iswL:true,
 $isEH:true},
 B0:{
 "^":"a;G1>",
-bu:[function(a){return"EvalException: "+this.G1},"call$0","gXo",0,0,null],
+bu:function(a){return"EvalException: "+this.G1},
 $isB0:true,
 static:{kG:function(a){return new K.B0(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
 "^":"",
@@ -13432,59 +13711,58 @@
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},"call$2","xV",4,0,null,131,[],187,[]],
+if(!J.de(y,b[z]))return!1}return!0},"call$2","xV",4,0,null,133,[],189,[]],
 au:[function(a){a.toString
-return U.xk(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,277,[]],
+return U.xk(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,279,[]],
 Zm:[function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"call$2","uN",4,0,null,226,[],30,[]],
+return a^a>>>6},"call$2","uN",4,0,null,228,[],30,[]],
 xk:[function(a){if(typeof a!=="number")return H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},"call$1","UY",2,0,null,226,[]],
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","Zy",2,0,null,228,[]],
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,597,21,[],131,[]],
-F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,21,[],190,[],131,[]]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,477,21,[],133,[]],
+F2:function(a,b,c){return new U.Jy(a,b,c)}},
 hw:{
 "^":"a;",
 $ishw:true},
 EZ:{
 "^":"hw;",
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
+RR:function(a,b){return b.W9(this)},
 $isEZ:true},
 no:{
 "^":"hw;P>",
-r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){var z=this.P
-return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.ti(this)},
+bu:function(a){var z=this.P
+return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},
+n:function(a,b){var z
 if(b==null)return!1
 z=H.RB(b,"$isno",[H.Kp(this,0)],"$asno")
-return z&&J.de(J.Vm(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
+return z&&J.de(J.Vm(b),this.P)},
 giO:function(a){return J.v1(this.P)},
 $isno:true},
 kB:{
 "^":"hw;Pu>",
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return"{"+H.d(this.Pu)+"}"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.o0(this)},
+bu:function(a){return"{"+H.d(this.Pu)+"}"},
+n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},
 giO:function(a){return U.au(this.Pu)},
 $iskB:true},
 wk:{
 "^":"hw;G3>,v4<",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return H.d(this.G3)+": "+H.d(this.v4)},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.YV(this)},
+bu:function(a){return H.d(this.G3)+": "+H.d(this.v4)},
+n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$iswk&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$iswk&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},
 giO:function(a){var z,y
 z=J.v1(this.G3.P)
 y=J.v1(this.v4)
@@ -13492,31 +13770,30 @@
 $iswk:true},
 XC:{
 "^":"hw;wz",
-RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return"("+H.d(this.wz)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
+RR:function(a,b){return b.LT(this)},
+bu:function(a){return"("+H.d(this.wz)+")"},
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isXC&&J.de(b.wz,this.wz)},
 giO:function(a){return J.v1(this.wz)},
 $isXC:true},
 w6:{
 "^":"hw;P>",
-r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return this.P},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.qv(this)},
+bu:function(a){return this.P},
+n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$isw6&&J.de(z.gP(b),this.P)},
 giO:function(a){return J.v1(this.P)},
 $isw6:true},
 jK:{
 "^":"hw;kp>,wz<",
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.Hx(this)},
+bu:function(a){return H.d(this.kp)+" "+H.d(this.wz)},
+n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},
 giO:function(a){var z,y
 z=J.v1(this.kp)
 y=J.v1(this.wz)
@@ -13524,12 +13801,12 @@
 $isjK:true},
 uk:{
 "^":"hw;kp>,Bb>,T8>",
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.im(this)},
+bu:function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},
+n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(z.gBb(b),this.Bb)&&J.de(z.gT8(b),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(z.gBb(b),this.Bb)&&J.de(z.gT8(b),this.T8)},
 giO:function(a){var z,y,x
 z=J.v1(this.kp)
 y=J.v1(this.Bb)
@@ -13538,12 +13815,12 @@
 $isuk:true},
 K9:{
 "^":"hw;Bb>,T8>",
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+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.$isK9&&J.de(z.gBb(b),this.Bb)&&J.de(z.gT8(b),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$isK9&&J.de(z.gBb(b),this.Bb)&&J.de(z.gT8(b),this.T8)},
 giO:function(a){var z,y
 z=this.Bb
 z=z.giO(z)
@@ -13552,10 +13829,10 @@
 $isK9:true},
 zX:{
 "^":"hw;hP<,Jn<",
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return H.d(this.hP)+"["+H.d(this.Jn)+"]"},"call$0","gXo",0,0,null],
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,96,[]],
+RR:function(a,b){return b.CU(this)},
+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.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.Jn)
@@ -13563,12 +13840,12 @@
 $iszX:true},
 x9:{
 "^":"hw;hP<,oc>",
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return H.d(this.hP)+"."+H.d(this.oc)},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.co(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.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.oc)
@@ -13576,12 +13853,12 @@
 $isx9:true},
 Jy:{
 "^":"hw;hP<,bP>,re<",
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.ZR(this)},
+bu:function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},
+n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},
 giO:function(a){var z,y,x
 z=J.v1(this.hP)
 y=J.v1(this.bP)
@@ -13589,21 +13866,22 @@
 return U.xk(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:355;",
-call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,598,[],599,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,478,[],479,[],"call"],
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
 "^":"a;Sk,GP,qM,fL",
-XJ:[function(a,b){var z
+XJ:function(a,b){var z
 if(!(a!=null&&!J.de(J.Iz(this.fL.lo),a)))z=b!=null&&!J.de(J.Vm(this.fL.lo),b)
 else z=!0
 if(z)throw H.b(Y.RV("Expected "+H.d(b)+": "+H.d(this.fL.lo)))
-this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,600,[],30,[]],
-o9:[function(){if(this.fL.lo==null){this.Sk.toString
+this.fL.G()},
+w5:function(){return this.XJ(null,null)},
+o9:function(){if(this.fL.lo==null){this.Sk.toString
 return C.OL}var z=this.Dl()
-return z==null?null:this.BH(z,0)},"call$0","gVPD",0,0,null],
-BH:[function(a,b){var z,y,x,w
+return z==null?null:this.BH(z,0)},
+BH:function(a,b){var z,y,x,w
 for(;z=this.fL.lo,z!=null;)if(J.de(J.Iz(z),9))if(J.de(J.Vm(this.fL.lo),"(")){y=this.qj()
 this.Sk.toString
 a=new U.Jy(a,null,y)}else if(J.de(J.Vm(this.fL.lo),"[")){x=this.eY()
@@ -13616,16 +13894,16 @@
 this.Sk.toString
 a=new U.K9(a,w)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
 else break
-return a},"call$2","gHr",4,0,null,134,[],601,[]],
-qL:[function(a,b){var z,y
+return a},
+qL:function(a,b){var z,y
 z=J.x(b)
 if(!!z.$isw6){z=z.gP(b)
 this.Sk.toString
 return new U.x9(a,z)}else if(!!z.$isJy&&!!J.x(b.ghP()).$isw6){z=J.Vm(b.ghP())
 y=b.gre()
 this.Sk.toString
-return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},"call$2","gE5",4,0,null,134,[],135,[]],
-Tw:[function(a){var z,y,x
+return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
+Tw:function(a){var z,y,x
 z=this.fL.lo
 this.w5()
 y=this.Dl()
@@ -13635,8 +13913,8 @@
 if(!x)break
 y=this.BH(y,this.fL.lo.gG8())}x=J.Vm(z)
 this.Sk.toString
-return new U.uk(x,a,y)},"call$1","gvB",2,0,null,134,[]],
-Dl:[function(){var z,y,x,w
+return new U.uk(x,a,y)},
+Dl:function(){var z,y,x,w
 if(J.de(J.Iz(this.fL.lo),8)){z=J.Vm(this.fL.lo)
 y=J.x(z)
 if(y.n(z,"+")||y.n(z,"-")){this.w5()
@@ -13656,8 +13934,8 @@
 return new U.jK(z,w)}}}else if(y.n(z,"!")){this.w5()
 w=this.BH(this.Ai(),11)
 this.Sk.toString
-return new U.jK(z,w)}}return this.Ai()},"call$0","gna",0,0,null],
-Ai:[function(){var z,y,x
+return new U.jK(z,w)}}return this.Ai()},
+Ai:function(){var z,y,x
 switch(J.Iz(this.fL.lo)){case 10:z=J.Vm(this.fL.lo)
 y=J.x(z)
 if(y.n(z,"this")){this.w5()
@@ -13674,8 +13952,8 @@
 this.Sk.toString
 return new U.XC(x)}else if(J.de(J.Vm(this.fL.lo),"{"))return this.Wc()
 return
-default:return}},"call$0","gUN",0,0,null],
-Wc:[function(){var z,y,x
+default:return}},
+Wc:function(){var z,y,x
 z=[]
 do{this.w5()
 if(J.de(J.Iz(this.fL.lo),9)&&J.de(J.Vm(this.fL.lo),"}"))break
@@ -13688,8 +13966,8 @@
 z.push(new U.wk(x,this.o9()))
 y=this.fL.lo}while(y!=null&&J.de(J.Vm(y),","))
 this.XJ(9,"}")
-return new U.kB(z)},"call$0","grL",0,0,null],
-Cy:[function(){var z,y,x
+return new U.kB(z)},
+Cy:function(){var z,y,x
 if(J.de(J.Vm(this.fL.lo),"true")){this.w5()
 this.Sk.toString
 return H.VM(new U.no(!0),[null])}if(J.de(J.Vm(this.fL.lo),"false")){this.w5()
@@ -13703,8 +13981,8 @@
 y=new U.w6(z)
 x=this.qj()
 if(x==null)return y
-else return new U.Jy(y,null,x)},"call$0","gbc",0,0,null],
-qj:[function(){var z,y
+else return new U.Jy(y,null,x)},
+qj:function(){var z,y
 z=this.fL.lo
 if(z!=null&&J.de(J.Iz(z),9)&&J.de(J.Vm(this.fL.lo),"(")){y=[]
 do{this.w5()
@@ -13712,96 +13990,96 @@
 y.push(this.o9())
 z=this.fL.lo}while(z!=null&&J.de(J.Vm(z),","))
 this.XJ(9,")")
-return y}return},"call$0","gCg",0,0,null],
-eY:[function(){var z,y
+return y}return},
+eY:function(){var z,y
 z=this.fL.lo
 if(z!=null&&J.de(J.Iz(z),9)&&J.de(J.Vm(this.fL.lo),"[")){this.w5()
 y=this.o9()
 this.XJ(9,"]")
-return y}return},"call$0","gw7",0,0,null],
-qF:[function(){var z,y
+return y}return},
+qF:function(){var z,y
 z=J.Vm(this.fL.lo)
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},"call$0","gJA",0,0,null],
-pT:[function(a){var z,y
+return y},
+pT:function(a){var z,y
 z=H.BU(H.d(a)+H.d(J.Vm(this.fL.lo)),null,null)
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,337,602,[]],
-yj:[function(a){var z,y
+return y},
+Ud:function(){return this.pT("")},
+yj:function(a){var z,y
 z=H.IH(H.d(a)+H.d(J.Vm(this.fL.lo)),null)
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,337,602,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+return y},
+tw:function(){return this.yj("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,278,116,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,280,118,[]],
 Ae:{
-"^":"a;vH>-377,P>-603",
-r6:function(a,b){return this.P.call$1(b)},
+"^":"a;vH>-310,P>-480",
 n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,112,96,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,540,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,370,"toString"],
+return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,114,98,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,459,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,305,"toString"],
 $isAe:true,
 "@":function(){return[C.Nw]},
 "<>":[3],
 static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
 "+IndexedValue":[0],
 Bt:{
-"^":"mW;YR",
-gA:function(a){var z=new K.vR(J.GP(this.YR),0,null)
+"^":"mW;ty",
+gA:function(a){var z=new K.vR(J.GP(this.ty),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.YR)},
-gl0:function(a){return J.FN(this.YR)},
+gB:function(a){return J.q8(this.ty)},
+gl0:function(a){return J.FN(this.ty)},
 grZ:function(a){var z,y
-z=this.YR
+z=this.ty
 y=J.U6(z)
 z=new K.Ae(J.xH(y.gB(z),1),y.grZ(z))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-Zv:[function(a,b){var z=new K.Ae(b,J.i4(this.YR,b))
+Zv:function(a,b){var z=new K.Ae(b,J.i4(this.ty,b))
 z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},"call$1","gRV",2,0,null,15,[]],
+return z},
 $asmW:function(a){return[[K.Ae,a]]},
 $asQV:function(a){return[[K.Ae,a]]}},
 vR:{
-"^":"AC;WS,wX,CD",
-gl:function(){return this.CD},
-G:[function(){var z,y
-z=this.WS
-if(z.G()){y=this.wX
-this.wX=y+1
-this.CD=H.VM(new K.Ae(y,z.gl()),[null])
-return!0}this.CD=null
-return!1},"call$0","gqy",0,0,null],
+"^":"AC;XY,vk,CK",
+gl:function(){return this.CK},
+G:function(){var z,y
+z=this.XY
+if(z.G()){y=this.vk
+this.vk=y+1
+this.CK=H.VM(new K.Ae(y,z.gl()),[null])
+return!0}this.CK=null
+return!1},
 $asAC:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{
 "^":"",
 y1:[function(a,b){var z,y,x
 if(a.gYK().nb.x4(b))return a.gYK().nb.t(0,b)
 z=a.gAY()
-if(z!=null&&!J.de(z.gUx(),C.PU)){y=Z.y1(a.gAY(),b)
+if(z!=null&&!J.de(J.Ba(z),C.PU)){y=Z.y1(a.gAY(),b)
 if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return},"call$2","Nb",4,0,null,279,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return},"call$2","rz",4,0,null,281,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
 wX:[function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
 case 118:return 11
-default:return a}},"call$1","uO",2,0,null,280,[]],
+default:return a}},"call$1","uO",2,0,null,282,[]],
 Pn:{
 "^":"a;fY>,P>,G8<",
-r6:function(a,b){return this.P.call$1(b)},
-bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"call$0","gXo",0,0,null],
+bu:function(a){return"("+this.fY+", '"+this.P+"')"},
 $isPn:true},
 hc:{
 "^":"a;MV,zy,jI,VQ",
-zl:[function(){var z,y,x,w,v,u,t,s,r
+zl:function(){var z,y,x,w,v,u,t,s,r
 z=this.jI
 this.VQ=z.G()?z.Wn:null
 for(y=this.MV;x=this.VQ,x!=null;)if(x===32||x===9||x===160)this.VQ=z.G()?z.Wn:null
@@ -13828,8 +14106,8 @@
 t=H.eT(s)}y.push(new Y.Pn(8,t,C.dj.t(0,t)))}else if(C.Nm.tg(C.iq,this.VQ)){s=P.O8(1,this.VQ,J.im)
 r=H.eT(s)
 y.push(new Y.Pn(9,r,C.dj.t(0,r)))
-this.VQ=z.G()?z.Wn:null}else this.VQ=z.G()?z.Wn:null}return y},"call$0","gty",0,0,null],
-DS:[function(){var z,y,x,w,v
+this.VQ=z.G()?z.Wn:null}else this.VQ=z.G()?z.Wn:null}return y},
+DS:function(){var z,y,x,w,v
 z=this.VQ
 y=this.jI
 x=y.G()?y.Wn:null
@@ -13845,8 +14123,8 @@
 w.vM=w.vM+x}x=y.G()?y.Wn:null
 this.VQ=x}this.MV.push(new Y.Pn(1,w.vM,0))
 w.vM=""
-this.VQ=y.G()?y.Wn:null},"call$0","gPJ",0,0,null],
-zI:[function(){var z,y,x,w,v,u
+this.VQ=y.G()?y.Wn:null},
+zI:function(){var z,y,x,w,v,u
 z=this.jI
 y=this.zy
 while(!0){x=this.VQ
@@ -13862,8 +14140,8 @@
 z=this.MV
 if(C.Nm.tg(C.Qy,u))z.push(new Y.Pn(10,u,0))
 else z.push(new Y.Pn(2,u,0))
-y.vM=""},"call$0","gLo",0,0,null],
-jj:[function(){var z,y,x,w,v
+y.vM=""},
+jj:function(){var z,y,x,w,v
 z=this.jI
 y=this.zy
 while(!0){x=this.VQ
@@ -13878,8 +14156,8 @@
 if(typeof z!=="number")return H.s(z)
 if(48<=z&&z<=57)this.e1()
 else this.MV.push(new Y.Pn(3,".",11))}else{this.MV.push(new Y.Pn(6,y.vM,0))
-y.vM=""}},"call$0","gCga",0,0,null],
-e1:[function(){var z,y,x,w,v
+y.vM=""}},
+e1:function(){var z,y,x,w,v
 z=this.zy
 z.KF(P.fc(46))
 y=this.jI
@@ -13891,51 +14169,51 @@
 x=H.eT(v)
 z.vM=z.vM+x
 this.VQ=y.G()?y.Wn:null}this.MV.push(new Y.Pn(7,z.vM,0))
-z.vM=""},"call$0","gpS",0,0,null]},
+z.vM=""}},
 hA:{
 "^":"a;G1>",
-bu:[function(a){return"ParseException: "+this.G1},"call$0","gXo",0,0,null],
+bu:function(a){return"ParseException: "+this.G1},
 static:{RV:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,604,91,[]]},
+DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,481,93,[]]},
 d2:{
 "^":"fr;",
-W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,21,[]],
-LT:[function(a){a.wz.RR(0,this)
-this.xn(a)},"call$1","gaT",2,0,null,21,[]],
-co:[function(a){J.UK(a.ghP(),this)
-this.xn(a)},"call$1","gEW",2,0,null,420,[]],
-CU:[function(a){J.UK(a.ghP(),this)
+W9:function(a){return this.xn(a)},
+LT:function(a){a.wz.RR(0,this)
+this.xn(a)},
+co:function(a){J.UK(a.ghP(),this)
+this.xn(a)},
+CU:function(a){J.UK(a.ghP(),this)
 J.UK(a.gJn(),this)
-this.xn(a)},"call$1","gA2",2,0,null,420,[]],
-ZR:[function(a){var z
+this.xn(a)},
+ZR:function(a){var z
 J.UK(a.ghP(),this)
 z=a.gre()
 if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gES",2,0,null,420,[]],
-ti:[function(a){return this.xn(a)},"call$1","gvs",2,0,null,277,[]],
-o0:[function(a){var z
+this.xn(a)},
+ti:function(a){return this.xn(a)},
+o0:function(a){var z
 for(z=a.gPu(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gX7",2,0,null,277,[]],
-YV:[function(a){J.UK(a.gG3(a),this)
+this.xn(a)},
+YV:function(a){J.UK(a.gG3(a),this)
 J.UK(a.gv4(),this)
-this.xn(a)},"call$1","ghH",2,0,null,21,[]],
-qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,420,[]],
-im:[function(a){J.UK(a.gBb(a),this)
+this.xn(a)},
+qv:function(a){return this.xn(a)},
+im:function(a){J.UK(a.gBb(a),this)
 J.UK(a.gT8(a),this)
-this.xn(a)},"call$1","glf",2,0,null,96,[]],
-Hx:[function(a){J.UK(a.gwz(),this)
-this.xn(a)},"call$1","ghe",2,0,null,96,[]],
-ky:[function(a){J.UK(a.gBb(a),this)
+this.xn(a)},
+Hx:function(a){J.UK(a.gwz(),this)
+this.xn(a)},
+ky:function(a){J.UK(a.gBb(a),this)
 J.UK(a.gT8(a),this)
-this.xn(a)},"call$1","gXf",2,0,null,280,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
+this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 JG:{
-"^":["V22;kW%-555,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-guw:[function(a){return a.kW},null,null,1,0,556,"app",365,385],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,557,30,[],"app",365],
+"^":["V22;kW%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,446,"app",300,316],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,447,30,[],"app",300],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
@@ -13948,28 +14226,98 @@
 a.X0=w
 C.Cc.ZL(a)
 C.Cc.oX(a)
-return a},null,null,0,0,115,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[605],
+return a},null,null,0,0,117,"new ResponseViewerElement$created"]}},
+"+ResponseViewerElement":[482],
 V22:{
 "^":"uL+Pi;",
-$isd3:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+$isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
+"^":"",
+ov:{
+"^":["V23;QV%-483,t7%-310,hX%-310,FZ%-321,Bs%-484,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.QV},null,null,1,0,485,"script",300,316],
+sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,486,30,[],"script",300],
+gBV:[function(a){return a.t7},null,null,1,0,459,"pos",300,316],
+sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,346,30,[],"pos",300],
+gJb:[function(a){return a.hX},null,null,1,0,459,"endPos",300,316],
+sJb:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,346,30,[],"endPos",300],
+gHp:[function(a){return a.FZ},null,null,1,0,330,"coverage",300,316],
+sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,331,30,[],"coverage",300],
+gSw:[function(a){return a.Bs},null,null,1,0,487,"lines",300,301],
+sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,488,30,[],"lines",300],
+rh:[function(a,b){this.VH(a)
+this.ct(a,C.du,0,1)},"call$1","grO",2,0,159,232,[],"scriptChanged"],
+Ly:[function(a,b){this.VH(a)},"call$1","gXN",2,0,159,232,[],"posChanged"],
+xx:[function(a,b){this.ct(a,C.Cv,0,1)
+this.ct(a,C.du,0,1)},"call$1","gTA",2,0,114,232,[],"coverageChanged"],
+qEQ:[function(a,b){var z,y
+z=a.QV
+if(z==null||a.FZ!==!0)return"min-width:32px;"
+y=J.UQ(z.gu9(),b.gRd())
+if(y==null)return"min-width:32px;"
+if(J.de(y,0))return"min-width:32px;background-color:red"
+return"min-width:32px;background-color:green"},"call$1","gL0",2,0,489,182,[],"hitStyle",301],
+VH:[function(a){var z,y,x,w,v
+if(J.iS(a.QV)!==!0){J.SK(a.QV).ml(new T.ZJ(a))
+return}this.ct(a,C.Cv,0,1)
+J.U2(a.Bs)
+z=a.QV.q6(a.t7)
+y=a.hX
+x=a.QV
+if(y==null)J.bi(a.Bs,J.UQ(J.Ew(x),J.xH(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.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}},"call$0","gI2",0,0,116,"_updateProperties"],
+"@":function(){return[C.OLi]},
+static:{"^":"bN<-84,aW<-84,Vn<-84",T5:[function(a){var z,y,x,w,v
+z=R.Jk([])
+y=$.Nd()
+x=P.Py(null,null,null,J.O,W.I0)
+w=J.O
+v=W.cv
+v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
+a.FZ=!1
+a.Bs=z
+a.SO=y
+a.B7=x
+a.X0=v
+C.HD.ZL(a)
+C.HD.oX(a)
+return a},null,null,0,0,117,"new ScriptInsetElement$created"]}},
+"+ScriptInsetElement":[490],
+V23:{
+"^":"uL+Pi;",
+$isd3:true},
+ZJ:{
+"^":"Tp:114;a-84",
+call$1:[function(a){var z,y
+z=this.a
+y=J.RE(z)
+if(J.iS(y.gQV(z))===!0)y.VH(z)},"call$1",null,2,0,114,115,[],"call"],
+$isEH:true},
+"+ ZJ":[387]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 knI:{
-"^":["qe;zw%-377,AP,Lk,tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRd:[function(a){return a.zw},null,null,1,0,540,"line",365,385],
-sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,422,30,[],"line",365],
-gD5:[function(a){var z,y
-if(a.tY==null)return Q.xI.prototype.gD5.call(this,a)
-z=J.u6(a.zw,0)
-y=a.tY
-if(z)return y.gzz()
-else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,370,"hoverText"],
+"^":["rs;jJ%-310,AP,fn,tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gBV:[function(a){return a.jJ},null,null,1,0,459,"pos",300,316],
+sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,346,30,[],"pos",300],
+gD5:[function(a){var z=a.tY
+if(z==null)return Q.xI.prototype.gD5.call(this,a)
+return z.gzz()},null,null,1,0,305,"hoverText"],
+Ly:[function(a,b){this.r6(a,null)},"call$1","gXN",2,0,159,232,[],"posChanged"],
+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)}},"call$1","gvo",2,0,159,115,[],"_updateProperties"],
 goc:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
-z=J.u6(a.zw,0)
+if(J.J5(a.jJ,0)){z=J.iS(a.tY)
 y=a.tY
-if(z)return J.O6(y)
-else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,370,"name"],
+if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.jJ))
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,305,"name"],
+gO3:[function(a){var z,y
+if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
+if(J.J5(a.jJ,0)){z=J.iS(a.tY)
+y=a.tY
+if(z===!0)return Q.xI.prototype.gO3.call(this,a)+"#line="+H.d(y.q6(a.jJ))
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,305,"url"],
 "@":function(){return[C.Ur]},
 static:{Th:[function(a){var z,y,x,w
 z=$.Nd()
@@ -13977,43 +14325,35 @@
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.zw=-1
+a.jJ=-1
 a.Pe=!1
 a.SO=z
 a.B7=y
 a.X0=w
 C.c0.ZL(a)
 C.c0.oX(a)
-return a},null,null,0,0,115,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[606],
-qe:{
+return a},null,null,0,0,117,"new ScriptRefElement$created"]}},
+"+ScriptRefElement":[491],
+rs:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V23;Uz%-607,HJ%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.Uz},null,null,1,0,608,"script",365,385],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,609,30,[],"script",365],
-gnN:[function(a){return a.HJ},null,null,1,0,399,"showCoverage",365,385],
-snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,400,30,[],"showCoverage",365],
+"^":["V24;Uz%-483,HJ%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,485,"script",300,316],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,486,30,[],"script",300],
+gnN:[function(a){return a.HJ},null,null,1,0,330,"showCoverage",300,316],
+snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,331,30,[],"showCoverage",300],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Uz
 if(z==null)return
-J.SK(z)},"call$0","gQd",0,0,114,"enteredView"],
-da:[function(a){this.ct(a,C.YH,0,1)},"call$0","gze",0,0,114,"_triggerHitRefresh"],
-ib:[function(a,b){this.ct(a,C.YH,0,1)},"call$1","gKg",2,0,112,230,[],"showCoverageChanged"],
-PQ:[function(a,b){var z,y
-z=a.Uz
-if(z==null||a.HJ!==!0)return"min-width:32px;"
-y=J.UQ(z.gu9(),J.f2(b))
-if(y==null)return"min-width:32px;"
-if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"call$1","go1",2,0,610,180,[],"hitsStyle",366],
-pA:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
-j9:[function(a,b){J.IQ(J.QP(a.Uz)).ml(new U.l0(a,b))},"call$1","gWp",2,0,157,387,[],"refreshCoverage"],
+J.SK(z)},"call$0","gQd",0,0,116,"enteredView"],
+ib:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"call$1","gKg",2,0,114,232,[],"showCoverageChanged"],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"call$1","gWp",2,0,159,318,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
-static:{"^":"he<-82,iJN<-82,oM<-82",Ry:[function(a){var z,y,x,w
+static:{Ry:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -14025,17 +14365,11 @@
 a.X0=w
 C.cJ.ZL(a)
 C.cJ.oX(a)
-return a},null,null,0,0,115,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[611],
-V23:{
+return a},null,null,0,0,117,"new ScriptViewElement$created"]}},
+"+ScriptViewElement":[492],
+V24:{
 "^":"uL+Pi;",
-$isd3:true},
-l0:{
-"^":"Tp:112;a-82,b-82",
-call$1:[function(a){J.ni(this.a,C.YH,0,1)
-this.b.call$0()},"call$1",null,2,0,112,113,[],"call"],
-$isEH:true},
-"+ l0":[498]}],["service","package:observatory/service.dart",,D,{
+$isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
 ac:function(a,b){var z,y,x,w,v,u,t,s
 if(b==null)return
@@ -14057,22 +14391,25 @@
 u=D.N8
 t=new V.qC(P.Py(null,null,null,w,u),null,null)
 t.$builtinTypeInfo=[w,u]
-s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,null,!1,null,null,a,null,null,!1,null,null,null,null)
+s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"Error":s=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null)
+case"Error":s=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"Isolate":z=P.L5(null,null,null,J.O,D.af)
-x=[]
-x.$builtinTypeInfo=[J.O]
+case"Isolate":z=new V.qC(P.Py(null,null,null,null,null),null,null)
+z.$builtinTypeInfo=[null,null]
+z=R.Jk(z)
+x=P.L5(null,null,null,J.O,D.af)
 w=[]
-w.$builtinTypeInfo=[D.e5]
-v=P.L5(null,null,null,J.O,J.GW)
-v=R.Jk(v)
-s=new D.bv(!1,!1,!1,!1,z,new D.tL(x,w,null,null,20,0),null,null,null,null,null,null,v,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null)
+w.$builtinTypeInfo=[J.O]
+v=[]
+v.$builtinTypeInfo=[D.e5]
+u=P.L5(null,null,null,J.O,J.GW)
+u=R.Jk(u)
+s=new D.bv(z,!1,!1,!1,!1,x,new D.tL(w,v,null,null,20,0),null,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"ServiceError":s=new D.fJ(null,null,null,null,a,null,null,!1,null,null,null,null)
+case"ServiceError":s=new D.fJ(null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"ServiceException":s=new D.hR(null,null,null,null,null,a,null,null,!1,null,null,null,null)
+case"ServiceException":s=new D.hR(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Script":z=D.c2
 x=[]
@@ -14083,21 +14420,21 @@
 w=J.im
 v=new V.qC(P.Py(null,null,null,z,w),null,null)
 v.$builtinTypeInfo=[z,w]
-s=new D.rj(x,v,null,null,null,null,null,null,a,null,null,!1,null,null,null,null)
+s=new D.rj(x,v,null,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 default:z=new V.qC(P.Py(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
-s=new D.SI(z,a,null,null,!1,null,null,null,null)}s.eC(b)
+s=new D.SI(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
 return s},
 D5:[function(a){var z
 if(a!=null){z=J.U6(a)
 z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
-return z},"call$1","SSc",2,0,null,190,[]],
+return z},"call$1","SSc",2,0,null,192,[]],
 ES:[function(a,b){var z=J.x(a)
 if(!!z.$isSI)return
 if(!!z.$isqC)D.Gf(a,b)
-else if(!!z.$iswn)D.f3(a,b)},"call$2","Ja",4,0,null,281,[],145,[]],
-Gf:[function(a,b){a.aN(0,new D.UZ(a,b))},"call$2","Xb",4,0,null,151,[],145,[]],
+else if(!!z.$iswn)D.f3(a,b)},"call$2","Ja",4,0,null,283,[],147,[]],
+Gf:[function(a,b){a.aN(0,new D.UZ(a,b))},"call$2","nV",4,0,null,153,[],147,[]],
 f3:[function(a,b){var z,y,x,w,v,u
 for(z=a.h3,y=0;y<z.length;++y){x=z[y]
 w=J.x(x)
@@ -14106,33 +14443,37 @@
 else u=!1
 if(u)a.u(0,y,b.Zr(x))
 else if(!!w.$iswn)D.f3(x,b)
-else if(v)D.Gf(x,b)}},"call$2","PV",4,0,null,73,[],145,[]],
+else if(v)D.Gf(x,b)}},"call$2","PV",4,0,null,75,[],147,[]],
 af:{
 "^":"Pi;bN@,GR@",
-gXP:[function(){return this.P3},null,null,1,0,612,"owner",365],
+gXP:[function(){return this.P3},null,null,1,0,493,"owner",300],
 gzf:[function(a){var z=this.P3
-return z.gzf(z)},null,null,1,0,613,"vm",365],
+return z.gzf(z)},null,null,1,0,494,"vm",300],
 gF1:[function(a){var z=this.P3
-return z.gF1(z)},null,null,1,0,364,"isolate",365],
-gjO:[function(a){return this.KG},null,null,1,0,370,"id",365],
-gzS:[function(){return this.mQ},null,null,1,0,370,"serviceType",365],
+return z.gF1(z)},null,null,1,0,299,"isolate",300],
+gjO:[function(a){return this.KG},null,null,1,0,305,"id",300],
+gzS:[function(){return this.mQ},null,null,1,0,305,"serviceType",300],
 gPj:[function(a){var z,y
 z=this.gF1(this)
 y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,370,"link",365],
-gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,370,"hashLink",365],
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,305,"link",300],
+gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,305,"hashLink",300],
+gox:function(a){return this.kT},
 gUm:function(){return!1},
 gM8:function(){return!1},
-goc:[function(a){return this.gbN()},null,null,1,0,370,"name",365,366],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",365],
-gzz:[function(){return this.gGR()},null,null,1,0,370,"vmName",365,366],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",365],
-xW:[function(a){if(this.kT)return P.Ab(this,null)
-return this.VD(0)},"call$0","gnB",0,0,null],
-VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
+goc:[function(a){return this.gbN()},null,null,1,0,305,"name",300,301],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",300],
+gzz:[function(){return this.gGR()},null,null,1,0,305,"vmName",300,301],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",300],
+xW:function(a){if(this.kT)return P.Ab(this,null)
+return this.VD(0)},
+VD:function(a){var z
+if(J.de(this.KG,""))return P.Ab(this,null)
 if(this.kT&&this.gM8())return P.Ab(this,null)
-return this.gzf(this).jU(this.gPj(this)).ml(new D.Pa(this))},"call$0","gQU",0,0,null],
-eC:[function(a){var z,y,x,w
+z=this.VR
+if(z==null){z=this.gzf(this).jU(this.gPj(this)).ml(new D.Pa(this)).YM(new D.jI(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")
@@ -14141,10 +14482,10 @@
 w=this.KG
 if(w!=null&&!J.de(w,z.t(a,"id")));this.KG=z.t(a,"id")
 this.mQ=x
-this.bF(0,a,y)},"call$1","gpn",2,0,null,151,[]],
+this.bF(0,a,y)},
 $isaf:true},
 Pa:{
-"^":"Tp:614;a",
+"^":"Tp:495;a",
 call$1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -14152,24 +14493,28 @@
 y=this.a
 if(!J.de(z,y.mQ))return D.ac(y.P3,a)
 y.eC(a)
-return y},"call$1",null,2,0,null,151,[],"call"],
+return y},"call$1",null,2,0,null,153,[],"call"],
+$isEH:true},
+jI:{
+"^":"Tp:117;b",
+call$0:[function(){this.b.VR=null},"call$0",null,0,0,null,"call"],
 $isEH:true},
 u0g:{
 "^":"af;"},
 zM:{
 "^":"O1w;Li<,G2<",
-gzf:[function(a){return this},null,null,1,0,613,"vm",365],
-gF1:[function(a){return},null,null,1,0,364,"isolate",365],
+gzf:[function(a){return this},null,null,1,0,494,"vm",300],
+gF1:[function(a){return},null,null,1,0,299,"isolate",300],
 gi2:[function(){var z=this.z7
-return z.gUQ(z)},null,null,1,0,615,"isolates",365],
-gPj:[function(a){return H.d(this.KG)},null,null,1,0,370,"link",365],
-gYe:[function(a){return this.Ox},null,null,1,0,370,"version",365,366],
-sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,32,30,[],"version",365],
-ghs:[function(){return this.GY},null,null,1,0,370,"architecture",365,366],
-shs:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,32,30,[],"architecture",365],
-gI2:[function(){return this.Rp},null,null,1,0,616,"uptime",365,366],
-sI2:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,617,30,[],"uptime",365],
-hV:[function(a){var z,y,x,w
+return z.gUQ(z)},null,null,1,0,496,"isolates",300],
+gPj:[function(a){return H.d(this.KG)},null,null,1,0,305,"link",300],
+gYe:[function(a){return this.Ox},null,null,1,0,305,"version",300,301],
+sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,32,30,[],"version",300],
+gF6:[function(){return this.GY},null,null,1,0,305,"architecture",300,301],
+sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,32,30,[],"architecture",300],
+gUn:[function(){return this.Rp},null,null,1,0,497,"uptime",300,301],
+sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,498,30,[],"uptime",300],
+hV:function(a){var z,y,x,w
 z=$.rc().R4(0,a)
 if(z==null)return
 y=z.QK
@@ -14178,8 +14523,8 @@
 if(0>=y.length)return H.e(y,0)
 y=J.q8(y[0])
 if(typeof y!=="number")return H.s(y)
-return C.xB.yn(x,w+y)},"call$1","goe",2,0,null,413,[]],
-jz:[function(a){var z,y,x
+return C.xB.yn(x,w+y)},
+jz:function(a){var z,y,x
 z=$.PY().R4(0,a)
 if(z==null)return""
 y=z.QK
@@ -14187,21 +14532,27 @@
 if(0>=y.length)return H.e(y,0)
 y=J.q8(y[0])
 if(typeof y!=="number")return H.s(y)
-return J.Nj(a,0,x+y)},"call$1","gj6",2,0,null,413,[]],
-Zr:[function(a){throw H.b(P.SY(null))},"call$1","gOJ",2,0,null,151,[]],
-Tn:[function(a){var z
+return J.Nj(a,0,x+y)},
+Zr:function(a){throw H.b(P.SY(null))},
+Tn:function(a){var z
 if(a==="")return P.Ab(null,null)
 z=this.z7.t(0,a)
 if(z!=null)return P.Ab(z,null)
-return this.VD(0).ml(new D.MZ(this,a))},"call$1","gFB",2,0,null,618,[]],
-ox:[function(a){var z,y,x
-if(J.co(a,"isolates/")){z=this.jz(a)
-y=this.hV(a)
-return this.Tn(z).ml(new D.oe(this,y))}x=this.A4.t(0,a)
-if(x!=null)return J.am(x)
-return this.jU(a).ml(new D.kk(this,a))},"call$1","gUb",2,0,null,413,[]],
-jU:[function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.mR(this),new D.bp())},"call$1","gzF",2,0,null,413,[]],
-bF:[function(a,b,c){var z,y
+return this.VD(0).ml(new D.MZ(this,a))},
+cv:function(a){var z,y,x,w,v
+z={}
+z.a=a
+y=J.uH(a,"#")
+if(0>=y.length)return H.e(y,0)
+a=y[0]
+z.a=a
+if(J.co(a,"isolates/")){x=this.jz(z.a)
+w=this.hV(z.a)
+return this.Tn(x).ml(new D.oe(this,w))}v=this.A4.t(0,z.a)
+if(v!=null)return J.am(v)
+return this.jU(z.a).ml(new D.kk(z,this))},
+jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.mR(this),new D.bp())},
+bF:function(a,b,c){var z,y
 if(c)return
 this.kT=!0
 z=J.U6(b)
@@ -14211,8 +14562,8 @@
 this.GY=F.Wi(this,C.US,this.GY,y)
 y=z.t(b,"uptime")
 this.Rp=F.Wi(this,C.mh,this.Rp,y)
-this.l9(z.t(b,"isolates"))},"call$2","gYh",4,0,null,151,[],619,[]],
-l9:[function(a){var z,y,x,w,v,u
+this.l9(z.t(b,"isolates"))},
+l9:function(a){var z,y,x,w,v,u
 z=this.z7
 y=P.L5(null,null,null,J.O,D.bv)
 for(x=J.GP(a);x.G();){w=x.gl()
@@ -14222,7 +14573,7 @@
 else{u=D.ac(this,w)
 y.u(0,v,u)
 N.Jx("").To("New isolate '"+H.d(u.KG)+"'")}}y.aN(0,new D.Yu())
-this.z7=y},"call$1","geV",2,0,null,620,[]],
+this.z7=y},
 Lw:function(){this.bN=this.ct(this,C.YS,this.bN,"vm")
 this.GR=this.ct(this,C.KS,this.GR,"vm")
 this.A4.u(0,"vm",this)
@@ -14233,32 +14584,32 @@
 "^":"u0g+Pi;",
 $isd3:true},
 MZ:{
-"^":"Tp:112;a,b",
+"^":"Tp:114;a,b",
 call$1:[function(a){if(!J.x(a).$iszM)return
 return this.a.z7.t(0,this.b)},"call$1",null,2,0,null,56,[],"call"],
 $isEH:true},
 oe:{
-"^":"Tp:112;a,b",
+"^":"Tp:114;b,c",
 call$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.am(a)
-else return a.ox(z)},"call$1",null,2,0,null,16,[],"call"],
+else return a.cv(z)},"call$1",null,2,0,null,16,[],"call"],
 $isEH:true},
 kk:{
-"^":"Tp:614;c,d",
+"^":"Tp:495;a,d",
 call$1:[function(a){var z,y
-z=this.c
+z=this.d
 y=D.ac(z,a)
-if(y.gUm())z.A4.to(this.d,new D.QZ(y))
-return y},"call$1",null,2,0,null,151,[],"call"],
+if(y.gUm())z.A4.to(this.a.a,new D.QZ(y))
+return y},"call$1",null,2,0,null,153,[],"call"],
 $isEH:true},
 QZ:{
-"^":"Tp:115;e",
+"^":"Tp:117;e",
 call$0:[function(){return this.e},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Ey:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z,y,x,w,v
 try{w=C.xr.kV(a)
 z=R.Jk(w)
@@ -14274,53 +14625,53 @@
 P.JS(x)
 w=H.B7(["type","ServiceException","id","","kind","DecodeException","response",a,"message","Could not decode JSON: "+H.d(y)],P.L5(null,null,null,null,null))
 w=R.Jk(w)
-return P.Vu(D.ac(this.a,w),null,null)}},"call$1",null,2,0,null,517,[],"call"],
+return P.Vu(D.ac(this.a,w),null,null)}},"call$1",null,2,0,null,408,[],"call"],
 $isEH:true},
 tm:{
-"^":"Tp:112;b",
+"^":"Tp:114;b",
 call$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)},"call$1",null,2,0,null,159,[],"call"],
+return P.Vu(a,null,null)},"call$1",null,2,0,null,161,[],"call"],
 $isEH:true},
 Gk:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){return!!J.x(a).$isfJ},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 mR:{
-"^":"Tp:112;c",
+"^":"Tp:114;c",
 call$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)},"call$1",null,2,0,null,373,[],"call"],
+return P.Vu(a,null,null)},"call$1",null,2,0,null,308,[],"call"],
 $isEH:true},
 bp:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){return!!J.x(a).$ishR},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Yu:{
-"^":"Tp:355;",
-call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,618,[],16,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,499,[],16,[],"call"],
 $isEH:true},
 e5:{
 "^":"a;SP<,hw<,wZ",
 gaQ:function(){return this.wZ},
-Bv:[function(a){var z,y,x,w,v
+Bv:function(a){var z,y,x,w,v
 z=this.hw
 H.ed(z,0,a)
 for(y=z.length,x=0;x<y;++x){w=this.wZ
 v=z[x]
 if(typeof v!=="number")return H.s(v)
-this.wZ=w+v}},"call$1","gh4",2,0,null,621,[]],
-nZ:[function(a,b){var z,y,x,w,v,u,t
+this.wZ=w+v}},
+nZ:function(a,b){var z,y,x,w,v,u,t
 for(z=this.hw,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.t(a,v)
 if(v>=w)return H.e(b,v)
 u=J.xH(u,b[v])
 z[v]=u
 t=this.wZ
 if(typeof u!=="number")return H.s(u)
-this.wZ=t+u}},"call$2","gNx",4,0,null,621,[],622,[]],
-wY:[function(a,b){var z,y,x,w,v,u
+this.wZ=t+u}},
+wY:function(a,b){var z,y,x,w,v,u
 z=J.U6(b)
 y=this.hw
 x=y.length
@@ -14330,14 +14681,14 @@
 if(!(w<v))break
 u=z.t(b,w)
 if(w>=x)return H.e(y,w)
-y[w]=J.z8(y[w],u)?y[w]:u;++w}},"call$1","gA5",2,0,null,621,[]],
-CJ:[function(){var z,y,x
-for(z=this.hw,y=z.length,x=0;x<y;++x)z[x]=0},"call$0","gWI",0,0,null],
+y[w]=J.z8(y[w],u)?y[w]:u;++w}},
+CJ:function(){var z,y,x
+for(z=this.hw,y=z.length,x=0;x<y;++x)z[x]=0},
 $ise5:true},
 tL:{
 "^":"a;af<,lI<,TR,yP,hD,RP",
 gZ0:function(){return this.TR},
-xZ:[function(a,b){var z,y,x,w,v,u
+xZ:function(a,b){var z,y,x,w,v,u
 this.TR=a
 z=J.U6(b)
 y=z.t(b,"counters")
@@ -14365,43 +14716,45 @@
 this.yP.wY(0,y)
 z=this.lI
 z.push(u)
-if(z.length>this.hD)C.Nm.KI(z,0)},"call$2","gaI",4,0,null,44,[],536,[]]},
+if(z.length>this.hD)C.Nm.KI(z,0)}},
 bv:{
-"^":["uz4;l2,No,EY,eU,A4,KJ,v9,zb,bN:KT@,GR:f5@,Er,cL,LE<-623,Cf,W1,p2,Hw,S9,yv,BC@-528,FF,bj,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null],
-gzf:[function(a){return this.P3},null,null,1,0,613,"vm",365],
-gF1:[function(a){return this},null,null,1,0,364,"isolate",365],
+"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,zb,bN:KT@,GR:f5@,Er,cL,LE<-500,Cf,W1,p2,Hw,S9,yv,BC@-420,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+gzf:[function(a){return this.P3},null,null,1,0,494,"vm",300],
+gF1:[function(a){return this},null,null,1,0,299,"isolate",300],
+ghw:[function(){return this.V3},null,null,1,0,501,"counters",300,301],
+shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,495,30,[],"counters",300],
 gPj:function(a){return this.KG},
 gHP:function(){return"#/"+H.d(this.KG)},
-gko:[function(){return this.l2},null,null,1,0,399,"pausedOnStart",365,366],
-sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,400,30,[],"pausedOnStart",365],
-geB:[function(){return this.No},null,null,1,0,399,"pausedOnExit",365,366],
-seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,400,30,[],"pausedOnExit",365],
-gLd:[function(){return this.EY},null,null,1,0,399,"running",365,366],
-sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,400,30,[],"running",365],
-gaj:[function(){return this.eU},null,null,1,0,399,"idle",365,366],
-saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,400,30,[],"idle",365],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,624,413,[],"relativeLink",365],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,624,413,[],"relativeHashLink",365],
-RL:[function(){return this.A4.t(0,"code/tag-0")},"call$0","gOT",0,0,null],
-N3:[function(a){var z,y,x,w
+gko:[function(){return this.l2},null,null,1,0,330,"pausedOnStart",300,301],
+sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,331,30,[],"pausedOnStart",300],
+geB:[function(){return this.No},null,null,1,0,330,"pausedOnExit",300,301],
+seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,331,30,[],"pausedOnExit",300],
+gLd:[function(){return this.EY},null,null,1,0,330,"running",300,301],
+sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,331,30,[],"running",300],
+gaj:[function(){return this.eU},null,null,1,0,330,"idle",300,301],
+saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,331,30,[],"idle",300],
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,502,503,[],"relativeLink",300],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,502,503,[],"relativeHashLink",300],
+RL:function(){return this.A4.t(0,"code/tag-0")},
+N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
 for(x=J.GP(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
 this.c2()
 this.pl(a,z)
 w=y.t(a,"exclusive_trie")
-if(w!=null)this.BC=this.KQ(w,z)},"call$1","gNk",2,0,null,625,[]],
-c2:[function(){var z=this.A4
-z.gUQ(z).aN(0,new D.iz())},"call$0","gKW",0,0,null],
-pl:[function(a,b){var z,y,x,w
+if(w!=null)this.BC=this.KQ(w,z)},
+c2:function(){var z=this.A4
+z.gUQ(z).aN(0,new D.iz())},
+pl:function(a,b){var z,y,x,w
 z=J.U6(a)
 y=z.t(a,"codes")
 x=z.t(a,"samples")
 for(z=J.GP(y);z.G();){w=z.gl()
-J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,625,[],626,[]],
-Ms:[function(a){return this.ox("coverage").ml(this.gJJ())},"call$0","gWp",0,0,null],
-ZA:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"call$1","gJJ",2,0,627,628,[]],
-Zr:[function(a){var z,y,x
+J.UQ(w,"code").eL(w,b,x)}},
+Ms:function(a){return this.cv("coverage").ml(this.gJJ())},
+ZA:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"call$1","gJJ",2,0,504,505,[]],
+Zr:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
 y=this.A4
@@ -14409,36 +14762,36 @@
 if(x!=null)return x
 x=D.ac(this,a)
 if(x.gUm())y.u(0,z,x)
-return x},"call$1","gOJ",2,0,null,151,[]],
-ox:[function(a){var z=this.A4.t(0,a)
+return x},
+cv:function(a){var z=this.A4.t(0,a)
 if(z!=null)return J.am(z)
-return this.P3.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this,a))},"call$1","gUb",2,0,null,413,[]],
-gVc:[function(){return this.v9},null,null,1,0,384,"rootLib",365,366],
-sVc:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,386,30,[],"rootLib",365],
-gf4:[function(){return this.zb},null,null,1,0,629,"topFrame",365,366],
-sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,614,30,[],"topFrame",365],
-goc:[function(a){return this.KT},null,null,1,0,370,"name",365,366],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",365],
-gzz:[function(){return this.f5},null,null,1,0,370,"vmName",365,366],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",365],
-gv1:[function(){return this.Er},null,null,1,0,370,"mainPort",365,366],
-sv1:[function(a){this.Er=F.Wi(this,C.wT,this.Er,a)},null,null,3,0,32,30,[],"mainPort",365],
-gw2:[function(){return this.cL},null,null,1,0,630,"entry",365,366],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,631,30,[],"entry",365],
-gCi:[function(){return this.Cf},null,null,1,0,540,"newHeapUsed",365,366],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,422,30,[],"newHeapUsed",365],
-gcu:[function(){return this.W1},null,null,1,0,540,"oldHeapUsed",365,366],
-scu:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,422,30,[],"oldHeapUsed",365],
-gab:[function(){return this.p2},null,null,1,0,540,"newHeapCapacity",365,366],
-sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,422,30,[],"newHeapCapacity",365],
-gRy:[function(){return this.Hw},null,null,1,0,540,"oldHeapCapacity",365,366],
-sRy:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,422,30,[],"oldHeapCapacity",365],
-gNh:[function(a){return this.S9},null,null,1,0,370,"fileAndLine",365,366],
+return this.P3.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this,a))},
+gVc:[function(){return this.v9},null,null,1,0,315,"rootLib",300,301],
+sVc:[function(a){this.v9=F.Wi(this,C.xe,this.v9,a)},null,null,3,0,317,30,[],"rootLib",300],
+gf4:[function(){return this.zb},null,null,1,0,501,"topFrame",300,301],
+sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,495,30,[],"topFrame",300],
+goc:[function(a){return this.KT},null,null,1,0,305,"name",300,301],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",300],
+gzz:[function(){return this.f5},null,null,1,0,305,"vmName",300,301],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",300],
+gv1:[function(){return this.Er},null,null,1,0,305,"mainPort",300,301],
+sv1:[function(a){this.Er=F.Wi(this,C.wT,this.Er,a)},null,null,3,0,32,30,[],"mainPort",300],
+gw2:[function(){return this.cL},null,null,1,0,506,"entry",300,301],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,507,30,[],"entry",300],
+gCi:[function(){return this.Cf},null,null,1,0,459,"newHeapUsed",300,301],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,346,30,[],"newHeapUsed",300],
+gcu:[function(){return this.W1},null,null,1,0,459,"oldHeapUsed",300,301],
+scu:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,346,30,[],"oldHeapUsed",300],
+gab:[function(){return this.p2},null,null,1,0,459,"newHeapCapacity",300,301],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,346,30,[],"newHeapCapacity",300],
+gRy:[function(){return this.Hw},null,null,1,0,459,"oldHeapCapacity",300,301],
+sRy:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,346,30,[],"oldHeapCapacity",300],
+gNh:[function(a){return this.S9},null,null,1,0,305,"fileAndLine",300,301],
 at:function(a,b){return this.gNh(this).call$1(b)},
-sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",365],
-gkc:[function(a){return this.yv},null,null,1,0,632,"error",365,366],
-skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,633,30,[],"error",365],
-bF:[function(a,b,c){var z,y,x,w
+sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",300],
+gkc:[function(a){return this.yv},null,null,1,0,508,"error",300,301],
+skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,509,30,[],"error",300],
+bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z=J.U6(b)
 y=z.t(b,"mainPort")
 this.Er=F.Wi(this,C.wT,this.Er,y)
@@ -14451,19 +14804,44 @@
 D.ES(b,this)
 if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(b))
 return}y=z.t(b,"rootLib")
-this.v9=F.Wi(this,C.iF,this.v9,y)
+this.v9=F.Wi(this,C.xe,this.v9,y)
 if(z.t(b,"entry")!=null){y=z.t(b,"entry")
 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.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
-x=H.B7([],P.L5(null,null,null,null,null))
-J.kH(z.t(b,"timers"),new D.Qq(x))
+x=z.t(b,"tagCounters")
+if(x!=null){y=J.U6(x)
+w=y.t(x,"names")
+v=y.t(x,"counters")
+y=J.U6(v)
+u=0
+t=0
+while(!0){s=y.gB(v)
+if(typeof s!=="number")return H.s(s)
+if(!(t<s))break
+s=y.t(v,t)
+if(typeof s!=="number")return H.s(s)
+u+=s;++t}s=H.B7([],P.L5(null,null,null,null,null))
+s=R.Jk(s)
+this.V3=F.Wi(this,C.MR,this.V3,s)
+if(u===0){y=J.U6(w)
+t=0
+while(!0){s=y.gB(w)
+if(typeof s!=="number")return H.s(s)
+if(!(t<s))break
+J.kW(this.V3,y.t(w,t),"0.0%");++t}}else{s=J.U6(w)
+t=0
+while(!0){r=s.gB(w)
+if(typeof r!=="number")return H.s(r)
+if(!(t<r))break
+J.kW(this.V3,s.t(w,t),C.CD.yM(J.FW(y.t(v,t),u)*100,2)+"%");++t}}}q=H.B7([],P.L5(null,null,null,null,null))
+J.kH(z.t(b,"timers"),new D.Qq(q))
 y=this.LE
-w=J.w1(y)
-w.u(y,"total",x.t(0,"time_total_runtime"))
-w.u(y,"compile",x.t(0,"time_compilation"))
-w.u(y,"gc",0)
-w.u(y,"init",J.WB(J.WB(J.WB(x.t(0,"time_script_loading"),x.t(0,"time_creating_snapshot")),x.t(0,"time_isolate_initialization")),x.t(0,"time_bootstrap")))
-w.u(y,"dart",x.t(0,"time_dart_execution"))
+s=J.w1(y)
+s.u(y,"total",q.t(0,"time_total_runtime"))
+s.u(y,"compile",q.t(0,"time_compilation"))
+s.u(y,"gc",0)
+s.u(y,"init",J.WB(J.WB(J.WB(q.t(0,"time_script_loading"),q.t(0,"time_creating_snapshot")),q.t(0,"time_isolate_initialization")),q.t(0,"time_bootstrap")))
+s.u(y,"dart",q.t(0,"time_dart_execution"))
 y=J.UQ(z.t(b,"heap"),"usedNew")
 this.Cf=F.Wi(this,C.IO,this.Cf,y)
 y=J.UQ(z.t(b,"heap"),"usedOld")
@@ -14482,14 +14860,14 @@
 y=this.l2!==!0&&this.No!==!0&&y!==!0
 this.eU=F.Wi(this,C.q2,this.eU,y)
 z=z.t(b,"error")
-this.yv=F.Wi(this,C.YU,this.yv,z)},"call$2","gYh",4,0,null,151,[],619,[]],
-m7:[function(){return this.P3.jU(H.d(this.KG)+"/profile/tag").ml(new D.AP(this))},"call$0","gTK",0,0,null],
-KQ:[function(a,b){this.FF=0
+this.yv=F.Wi(this,C.YU,this.yv,z)},
+m7:function(){return this.P3.jU(H.d(this.KG)+"/profile/tag").ml(new D.AP(this))},
+KQ:function(a,b){this.FF=0
 this.bj=a
 if(a==null)return
 if(J.u6(J.q8(a),3))return
-return this.AW(b)},"call$2","gTh",4,0,null,236,[],626,[]],
-AW:[function(a){var z,y,x,w,v,u,t,s,r,q
+return this.AW(b)},
+AW:function(a){var z,y,x,w,v,u,t,s,r,q
 z=this.bj
 y=this.FF
 if(typeof y!=="number")return y.g()
@@ -14517,15 +14895,15 @@
 y=u.Jv
 t=q.Av
 if(typeof t!=="number")return H.s(t)
-u.Jv=y+t}return u},"call$1","gyi",2,0,null,626,[]],
+u.Jv=y+t}return u},
 $isbv:true,
 static:{"^":"ZW"}},
 uz4:{
 "^":"u0g+Pi;",
 $isd3:true},
 iz:{
-"^":"Tp:112;",
-call$1:[function(a){if(!!J.x(a).$iskx){a.jv=F.Wi(a,C.QK,a.jv,0)
+"^":"Tp:114;",
+call$1:[function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
 a.Du=0
 a.fF=0
 a.mM=F.Wi(a,C.EF,a.mM,"")
@@ -14535,42 +14913,42 @@
 J.U2(a.Oo)}},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 oa:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=J.U6(a)
-z.t(a,"script").SC(z.t(a,"hits"))},"call$1",null,2,0,null,634,[],"call"],
+z.t(a,"script").vW(z.t(a,"hits"))},"call$1",null,2,0,null,510,[],"call"],
 $isEH:true},
 KQ:{
-"^":"Tp:614;a,b",
+"^":"Tp:495;a,b",
 call$1:[function(a){var z,y
 z=this.a
 y=D.ac(z,a)
 if(y.gUm())z.A4.to(this.b,new D.Ai(y))
-return y},"call$1",null,2,0,null,151,[],"call"],
+return y},"call$1",null,2,0,null,153,[],"call"],
 $isEH:true},
 Ai:{
-"^":"Tp:115;c",
+"^":"Tp:117;c",
 call$0:[function(){return this.c},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Qq:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,635,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,511,[],"call"],
 $isEH:true},
 AP:{
-"^":"Tp:614;a",
+"^":"Tp:495;a",
 call$1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.KJ
 y.xZ(z/1000,a)
-return y},"call$1",null,2,0,null,190,[],"call"],
+return y},"call$1",null,2,0,null,192,[],"call"],
 $isEH:true},
 SI:{
-"^":"af;RF,P3,KG,mQ,kT,bN,GR,AP,Lk",
+"^":"af;RF,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
 gUm:function(){return(J.de(this.mQ,"Class")||J.de(this.mQ,"Function")||J.de(this.mQ,"Library"))&&!J.co(this.KG,$.n7)},
 gM8:function(){return this.gUm()},
-bu:[function(a){return P.vW(this.RF)},"call$0","gXo",0,0,null],
-bF:[function(a,b,c){var z,y,x
+bu:function(a){return P.vW(this.RF)},
+bF:function(a,b,c){var z,y,x
 this.kT=!c
 z=this.RF
 z.V1(0)
@@ -14580,34 +14958,33 @@
 this.bN=this.ct(0,C.YS,this.bN,x)
 y=y.t(0,"name")
 this.GR=this.ct(this,C.KS,this.GR,y)
-D.ES(z,this.P3)},"call$2","gYh",4,0,null,151,[],619,[]],
-FV:[function(a,b){return this.RF.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
-V1:[function(a){return this.RF.V1(0)},"call$0","gRa",0,0,null],
-di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,275,[]],
-x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,453,[]],
-aN:[function(a,b){return this.RF.Zp.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
-t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,453,[]],
-u:[function(a,b,c){this.RF.u(0,b,c)
-return c},"call$2","gj3",4,0,null,453,[],275,[]],
+D.ES(z,this.P3)},
+FV:function(a,b){return this.RF.FV(0,b)},
+V1:function(a){return this.RF.V1(0)},
+di:function(a){return this.RF.Zp.di(a)},
+x4:function(a){return this.RF.Zp.x4(a)},
+aN:function(a,b){return this.RF.Zp.aN(0,b)},
+Rz:function(a,b){return this.RF.Rz(0,b)},
+t:function(a,b){return this.RF.Zp.t(0,b)},
+u:function(a,b,c){this.RF.u(0,b,c)
+return c},
 gl0:function(a){var z=this.RF.Zp
 return z.gB(z)===0},
 gor:function(a){var z=this.RF.Zp
 return z.gB(z)!==0},
-gvc:function(a){var z=this.RF.Zp
-return z.gvc(z)},
+gvc:function(){return this.RF.Zp.gvc()},
 gUQ:function(a){var z=this.RF.Zp
 return z.gUQ(z)},
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 BN:[function(a){var z=this.RF
-return z.BN(z)},"call$0","gDx",0,0,399],
-nq:[function(a,b){var z=this.RF
-return z.nq(z,b)},"call$1","giA",2,0,null,29,[]],
-ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gyWA",6,0,null,256,[],230,[],231,[]],
-k0:[function(a){return},"call$0","gqw",0,0,114],
+return z.BN(z)},"call$0","gDx",0,0,330],
+nq:function(a,b){var z=this.RF
+return z.nq(z,b)},
+ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
+k0:[function(a){return},"call$0","gqw",0,0,116],
 ni:[function(a){this.RF.AP=null
-return},"call$0","gl1",0,0,114],
+return},"call$0","gl1",0,0,116],
 gUj:function(a){var z=this.RF
 return z.gUj(z)},
 gnz:function(a){var z,y
@@ -14623,16 +15000,16 @@
 $isd3:true,
 static:{"^":"n7"}},
 pD:{
-"^":"wVq;J6,LD,jo,Ne,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",
-gfY:[function(a){return this.J6},null,null,1,0,370,"kind",365,366],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",365],
-gG1:[function(a){return this.LD},null,null,1,0,370,"message",365,366],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",365],
-gFA:[function(a){return this.jo},null,null,1,0,384,"exception",365,366],
-sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,386,30,[],"exception",365],
-gK7:[function(){return this.Ne},null,null,1,0,384,"stacktrace",365,366],
-sK7:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,386,30,[],"stacktrace",365],
-bF:[function(a,b,c){var z,y,x
+"^":"wVq;J6,LD,jo,Ne,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+gfY:[function(a){return this.J6},null,null,1,0,305,"kind",300,301],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",300],
+gG1:[function(a){return this.LD},null,null,1,0,305,"message",300,301],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",300],
+gFA:[function(a){return this.jo},null,null,1,0,315,"exception",300,301],
+sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,317,30,[],"exception",300],
+gK7:[function(){return this.Ne},null,null,1,0,315,"stacktrace",300,301],
+sK7:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,317,30,[],"stacktrace",300],
+bF:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"kind")
 this.J6=F.Wi(this,C.fy,this.J6,y)
@@ -14646,17 +15023,17 @@
 z="DartError "+H.d(this.J6)
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},"call$2","gYh",4,0,null,151,[],619,[]]},
+this.GR=this.ct(this,C.KS,this.GR,z)}},
 wVq:{
 "^":"af+Pi;",
 $isd3:true},
 fJ:{
-"^":"dZL;J6,LD,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",
-gfY:[function(a){return this.J6},null,null,1,0,370,"kind",365,366],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",365],
-gG1:[function(a){return this.LD},null,null,1,0,370,"message",365,366],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",365],
-bF:[function(a,b,c){var z,y
+"^":"dZL;J6,LD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+gfY:[function(a){return this.J6},null,null,1,0,305,"kind",300,301],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",300],
+gG1:[function(a){return this.LD},null,null,1,0,305,"message",300,301],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",300],
+bF:function(a,b,c){var z,y
 this.kT=!0
 z=J.U6(b)
 y=z.t(b,"kind")
@@ -14666,20 +15043,20 @@
 z="ServiceError "+H.d(this.J6)
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},"call$2","gYh",4,0,null,151,[],619,[]],
+this.GR=this.ct(this,C.KS,this.GR,z)},
 $isfJ:true},
 dZL:{
 "^":"af+Pi;",
 $isd3:true},
 hR:{
-"^":"w8F;J6,LD,IV,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",
-gfY:[function(a){return this.J6},null,null,1,0,370,"kind",365,366],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",365],
-gG1:[function(a){return this.LD},null,null,1,0,370,"message",365,366],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",365],
-gn9:[function(a){return this.IV},null,null,1,0,115,"response",365,366],
-sn9:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,112,30,[],"response",365],
-bF:[function(a,b,c){var z,y
+"^":"w8F;J6,LD,IV,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+gfY:[function(a){return this.J6},null,null,1,0,305,"kind",300,301],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",300],
+gG1:[function(a){return this.LD},null,null,1,0,305,"message",300,301],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",300],
+gn9:[function(a){return this.IV},null,null,1,0,117,"response",300,301],
+sn9:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,114,30,[],"response",300],
+bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
 this.J6=F.Wi(this,C.fy,this.J6,y)
@@ -14690,23 +15067,34 @@
 z="ServiceException "+H.d(this.J6)
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},"call$2","gYh",4,0,null,151,[],619,[]],
+this.GR=this.ct(this,C.KS,this.GR,z)},
 $ishR:true},
 w8F:{
 "^":"af+Pi;",
 $isd3:true},
 c2:{
-"^":["a;Rd>-377,a4>-398",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd<-310,a4>-329",function(){return[C.Nw]},function(){return[C.Nw]}],
 $isc2:true},
 rj:{
-"^":["V4b;Sw<-82,u9<-82,Gz,J6,mB,wA,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gtD:[function(a){return this.Gz},null,null,1,0,368,"library",365,366],
-stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,369,30,[],"library",365],
-gfY:[function(a){return this.J6},null,null,1,0,370,"kind",365,366],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",365],
+"^":["V4b;Sw>-84,u9<-84,Gz,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gtD:[function(a){return this.Gz},null,null,1,0,303,"library",300,301],
+stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,304,30,[],"library",300],
+gfY:[function(a){return this.J6},null,null,1,0,305,"kind",300,301],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",300],
+gVB:[function(){return this.wJ},null,null,1,0,459,"firstTokenPos",300,301],
+sVB:[function(a){var z=this.wJ
+if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Gd,z,a)
+z.$builtinTypeInfo=[null]
+this.nq(this,z)}this.wJ=a},null,null,3,0,346,30,[],"firstTokenPos",300],
+gSKw:[function(){return this.lx},null,null,1,0,459,"lastTokenPos",300,301],
+sSKw:[function(a){var z=this.lx
+if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.kA,z,a)
+z.$builtinTypeInfo=[null]
+this.nq(this,z)}this.lx=a},null,null,3,0,346,30,[],"lastTokenPos",300],
 gUm:function(){return!0},
 gM8:function(){return!0},
-bF:[function(a,b,c){var z,y,x
+q6:function(a){return this.y6.t(0,a)},
+bF:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"kind")
 this.J6=F.Wi(this,C.fy,this.J6,y)
@@ -14718,9 +15106,43 @@
 this.bN=this.ct(this,C.YS,this.bN,y)
 y=this.wA
 this.GR=this.ct(this,C.KS,this.GR,y)
-this.W8(z.t(b,"source"))},"call$2","gYh",4,0,null,151,[],619,[]],
-SC:[function(a){var z,y,x,w,v
-if(!this.kT)this.xW(0)
+this.W8(z.t(b,"source"))
+this.up(z.t(b,"tokenPosTable"))},
+up:function(a){var z,y,x,w,v,u,t,s,r
+if(a==null)return
+this.y6=H.B7([],P.L5(null,null,null,null,null))
+this.FB=H.B7([],P.L5(null,null,null,null,null))
+this.wJ=F.Wi(this,C.Gd,this.wJ,null)
+this.lx=F.Wi(this,C.kA,this.lx,null)
+for(z=J.GP(a);z.G();){y=z.gl()
+x=J.U6(y)
+w=x.t(y,0)
+v=1
+while(!0){u=x.gB(y)
+if(typeof u!=="number")return H.s(u)
+if(!(v<u))break
+t=x.t(y,v)
+s=x.t(y,v+1)
+u=this.wJ
+if(u==null){if(this.gnz(this)&&!J.de(u,t)){u=new T.qI(this,C.Gd,u,t)
+u.$builtinTypeInfo=[null]
+this.nq(this,u)}this.wJ=t
+u=this.lx
+if(this.gnz(this)&&!J.de(u,t)){u=new T.qI(this,C.kA,u,t)
+u.$builtinTypeInfo=[null]
+this.nq(this,u)}this.lx=t}else{u=J.Bl(u,t)?this.wJ:t
+r=this.wJ
+if(this.gnz(this)&&!J.de(r,u)){r=new T.qI(this,C.Gd,r,u)
+r.$builtinTypeInfo=[null]
+this.nq(this,r)}this.wJ=u
+u=J.J5(this.lx,t)?this.lx:t
+r=this.lx
+if(this.gnz(this)&&!J.de(r,u)){r=new T.qI(this,C.kA,r,u)
+r.$builtinTypeInfo=[null]
+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,v
 z=J.U6(a)
 y=this.u9
 x=J.w1(y)
@@ -14729,8 +15151,8 @@
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
 x.u(y,z.t(a,w),z.t(a,w+1))
-w+=2}},"call$1","gHS",2,0,null,636,[]],
-W8:[function(a){var z,y,x,w,v
+w+=2}},
+W8:function(a){var z,y,x,w,v
 this.kT=!1
 if(a==null)return
 z=J.uH(a,"\n")
@@ -14741,7 +15163,7 @@
 x.V1(y)
 N.Jx("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
 for(w=0;w<z.length;w=v){v=w+1
-x.h(y,new D.c2(v,z[w]))}},"call$1","gI3",2,0,null,33,[]]},
+x.h(y,new D.c2(v,z[w]))}}},
 V4b:{
 "^":"af+Pi;",
 $isd3:true},
@@ -14749,28 +15171,28 @@
 "^":"a;Yu<,Du<,fF<",
 $isN8:true},
 Q4:{
-"^":["Pi;Yu<-377,Fm<-398,L4<-398,AP,Lk",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null],
+"^":["Pi;Yu<-310,Fm<-329,L4<-329,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null],
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,370,"formattedAddress",365],
+return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,305,"formattedAddress",300],
 Io:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
 if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,637,143,[],"formattedInclusive",365],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,512,145,[],"formattedInclusive",300],
 HU:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,637,143,[],"formattedExclusive",365],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,512,145,[],"formattedExclusive",300],
 $isQ4:true,
-static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","I9",4,0,null,131,[],241,[]]}},
+static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","I9",4,0,null,133,[],243,[]]}},
 WAE:{
 "^":"a;uX",
-bu:[function(a){return this.uX},"call$0","gXo",0,0,null],
+bu:function(a){return this.uX},
 static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.nj
 else if(z.n(a,"Dart"))return C.l8
@@ -14778,7 +15200,7 @@
 else if(z.n(a,"Reused"))return C.yP
 else if(z.n(a,"Tag"))return C.oA
 N.Jx("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.hS())},"call$1","J6",2,0,null,91,[]]}},
+throw H.b(P.hS())},"call$1","Ma",2,0,null,93,[]]}},
 Vi:{
 "^":"a;tT>,Av<",
 $isVi:true},
@@ -14786,24 +15208,24 @@
 "^":"a;tT>,Av<,wd>,Jv",
 $ist9:true},
 kx:{
-"^":["Zqa;J6,jv,Du@-377,fF@-377,vg@-377,Mb@-377,VS<-82,ci<-82,va<-82,Oo<-82,mM,qH,Ni,MO,oc*,zz@,TD,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,638,"kind",365,366],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,639,30,[],"kind",365],
-glt:[function(){return this.jv},null,null,1,0,540,"totalSamplesInProfile",365,366],
-slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,422,30,[],"totalSamplesInProfile",365],
-gAg:[function(){return this.mM},null,null,1,0,370,"formattedInclusiveTicks",365,366],
-sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",365],
-ga3:[function(){return this.qH},null,null,1,0,370,"formattedExclusiveTicks",365,366],
-sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",365],
-gL1E:[function(){return this.Ni},null,null,1,0,384,"objectPool",365,366],
-sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,386,30,[],"objectPool",365],
-gMj:[function(a){return this.MO},null,null,1,0,384,"function",365,366],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,386,30,[],"function",365],
+"^":["Zqa;J6,xM,Du@-310,fF@-310,vg@-310,Mb@-310,VS<-84,ci<-84,va<-84,Oo<-84,mM,qH,Ni,MO,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,513,"kind",300,301],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,514,30,[],"kind",300],
+glt:[function(){return this.xM},null,null,1,0,459,"totalSamplesInProfile",300,301],
+slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,346,30,[],"totalSamplesInProfile",300],
+gAg:[function(){return this.mM},null,null,1,0,305,"formattedInclusiveTicks",300,301],
+sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",300],
+gN8:[function(){return this.qH},null,null,1,0,305,"formattedExclusiveTicks",300,301],
+sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",300],
+gL1E:[function(){return this.Ni},null,null,1,0,315,"objectPool",300,301],
+sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,317,30,[],"objectPool",300],
+gMj:[function(a){return this.MO},null,null,1,0,315,"function",300,301],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,317,30,[],"function",300],
 gUm:function(){return!0},
 gM8:function(){return!0},
-VD:[function(a){if(J.de(this.J6,C.l8))return D.af.prototype.VD.call(this,this)
-return P.Ab(this,null)},"call$0","gQU",0,0,null],
-fp:[function(a,b,c){var z,y,x,w,v,u
+VD:function(a){if(J.de(this.J6,C.l8))return D.af.prototype.VD.call(this,this)
+return P.Ab(this,null)},
+fp:function(a,b,c){var z,y,x,w,v,u
 z=J.U6(b)
 y=J.w1(a)
 x=0
@@ -14814,9 +15236,9 @@
 u=H.BU(z.t(b,x+1),null,null)
 if(v>>>0!==v||v>=c.length)return H.e(c,v)
 y.h(a,new D.Vi(c[v],u))
-x+=2}y.GT(a,new D.fx())},"call$3","goR",6,0,null,640,[],236,[],641,[]],
-eL:[function(a,b,c){var z,y
-this.jv=F.Wi(this,C.QK,this.jv,c)
+x+=2}y.GT(a,new D.fx())},
+eL:function(a,b,c){var z,y
+this.xM=F.Wi(this,C.QK,this.xM,c)
 z=J.U6(a)
 this.fF=H.BU(z.t(a,"inclusive_ticks"),null,null)
 this.Du=H.BU(z.t(a,"exclusive_ticks"),null,null)
@@ -14824,11 +15246,11 @@
 this.fp(this.ci,z.t(a,"callees"),b)
 y=z.t(a,"ticks")
 if(y!=null)this.pd(y)
-z=D.Vb(this.fF,this.jv)+" ("+H.d(this.fF)+")"
+z=D.Vb(this.fF,this.xM)+" ("+H.d(this.fF)+")"
 this.mM=F.Wi(this,C.EF,this.mM,z)
-z=D.Vb(this.Du,this.jv)+" ("+H.d(this.Du)+")"
-this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,642,[],626,[],643,[]],
-bF:[function(a,b,c){var z,y,x,w
+z=D.Vb(this.Du,this.xM)+" ("+H.d(this.Du)+")"
+this.qH=F.Wi(this,C.uU,this.qH,z)},
+bF:function(a,b,c){var z,y,x,w
 z=J.U6(b)
 this.oc=z.t(b,"user_name")
 this.zz=z.t(b,"name")
@@ -14848,10 +15270,10 @@
 y=J.U6(z)
 this.kT=!J.de(y.gB(z),0)||!J.de(this.J6,C.l8)
 z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
-this.TD=F.Wi(this,C.zS,this.TD,z)},"call$2","gYh",4,0,null,190,[],619,[]],
-gvS:[function(){return this.TD},null,null,1,0,399,"hasDisassembly",365,366],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,400,30,[],"hasDisassembly",365],
-xs:[function(a){var z,y,x,w,v,u,t,s
+this.TD=F.Wi(this,C.zS,this.TD,z)},
+gvS:[function(){return this.TD},null,null,1,0,330,"hasDisassembly",300,301],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,331,30,[],"hasDisassembly",300],
+xs:function(a){var z,y,x,w,v,u,t,s
 z=this.va
 y=J.w1(z)
 y.V1(z)
@@ -14864,8 +15286,8 @@
 t=x.t(a,w+2)
 s=!J.de(x.t(a,w),"")?H.BU(x.t(a,w),null,null):0
 y.h(z,new D.Q4(s,u,t,null,null))
-w+=3}},"call$1","gxk",2,0,null,644,[]],
-pd:[function(a){var z,y,x,w,v,u
+w+=3}},
+pd:function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=this.Oo
 x=J.w1(y)
@@ -14875,41 +15297,42 @@
 if(!(w<v))break
 u=H.BU(z.t(a,w),16,null)
 x.u(y,u,new D.N8(u,H.BU(z.t(a,w+1),null,null),H.BU(z.t(a,w+2),null,null)))
-w+=3}},"call$1","gfi",2,0,null,645,[]],
-tg:[function(a,b){J.J5(b,this.vg)
-return!1},"call$1","gdj",2,0,null,646,[]],
-QQ:[function(){return this.F3(this.VS)},"call$0","gZzZ",0,0,null],
-dJ:[function(a){return this.Ov(this.VS,a)},"call$1","gf7",2,0,null,143,[]],
-F3:[function(a){var z,y,x
+w+=3}},
+tg:function(a,b){J.J5(b,this.vg)
+return!1},
+QQ:function(){return this.F3(this.VS)},
+dJ:function(a){return this.Ov(this.VS,a)},
+F3:function(a){var z,y,x
 for(z=J.GP(a),y=0;z.G();){x=z.gl().gAv()
 if(typeof x!=="number")return H.s(x)
-y+=x}return y},"call$1","gh9",2,0,null,640,[]],
-Ov:[function(a,b){var z,y
+y+=x}return y},
+Ov:function(a,b){var z,y
 for(z=J.GP(a);z.G();){y=z.gl()
-if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,640,[],143,[]],
+if(J.de(J.on(y),b))return y.gAv()}return 0},
+gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,330,"isDartCode",300],
 $iskx:true,
-static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],241,[]]}},
+static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,133,[],243,[]]}},
 Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 fx:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 UZ:{
-"^":"Tp:355;a,b",
+"^":"Tp:293;a,b",
 call$2:[function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
 if(y&&D.D5(b))this.a.u(0,a,this.b.Zr(b))
 else if(!!z.$iswn)D.f3(b,this.b)
-else if(y)D.Gf(b,this.b)},"call$2",null,4,0,null,453,[],275,[],"call"],
+else if(y)D.Gf(b,this.b)},"call$2",null,4,0,null,360,[],277,[],"call"],
 $isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
 "^":"",
 HF:{
-"^":["V24;jA%-647,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.jA},null,null,1,0,648,"error",365,385],
-skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,649,30,[],"error",365],
+"^":["V25;jA%-515,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.jA},null,null,1,0,516,"error",300,316],
+skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,517,30,[],"error",300],
 "@":function(){return[C.uvO]},
 static:{qa:[function(a){var z,y,x,w
 z=$.Nd()
@@ -14922,16 +15345,16 @@
 a.X0=w
 C.SX.ZL(a)
 C.SX.oX(a)
-return a},null,null,0,0,115,"new ServiceErrorViewElement$created"]}},
-"+ServiceErrorViewElement":[650],
-V24:{
+return a},null,null,0,0,117,"new ServiceErrorViewElement$created"]}},
+"+ServiceErrorViewElement":[518],
+V25:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
 "^":"",
 nk:{
-"^":["V25;Xc%-651,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFA:[function(a){return a.Xc},null,null,1,0,652,"exception",365,385],
-sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,653,30,[],"exception",365],
+"^":["V26;Xc%-519,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFA:[function(a){return a.Xc},null,null,1,0,520,"exception",300,316],
+sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,521,30,[],"exception",300],
 "@":function(){return[C.vr3]},
 static:{dS:[function(a){var z,y,x,w
 z=$.Nd()
@@ -14944,30 +15367,30 @@
 a.X0=w
 C.Vd.ZL(a)
 C.Vd.oX(a)
-return a},null,null,0,0,115,"new ServiceExceptionViewElement$created"]}},
-"+ServiceExceptionViewElement":[654],
-V25:{
+return a},null,null,0,0,117,"new ServiceExceptionViewElement$created"]}},
+"+ServiceExceptionViewElement":[522],
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
 XK:{
-"^":"zM;Jf>,Ox,GY,Rp,Li,G2,A4,z7,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",
-z6:[function(a,b){var z
+"^":"zM;Jf>,Ox,GY,Rp,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+z6:function(a,b){var z
 N.Jx("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
 z=this.Jf
 if(typeof z!=="string")return z.g()
-return W.It(J.WB(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,413,[]],
-aq:function(){this.Jf="http://"+H.d(J.cP(C.ol.gyH(window)))+"/"}},
+return W.It(J.WB(z,b),null,null).OA(new U.dT())},
+SC:function(){this.Jf="http://"+H.d(J.cP(C.ol.gyH(window)))+"/"}},
 dT:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){var z
 N.Jx("").hh("HttpRequest.getString failed.")
 z=J.RE(a)
 z.gN(a)
-return C.xr.KP(H.B7(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],P.L5(null,null,null,null,null)))},"call$1",null,2,0,null,159,[],"call"],
+return C.xr.KP(H.B7(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],P.L5(null,null,null,null,null)))},"call$1",null,2,0,null,161,[],"call"],
 $isEH:true},
 ho:{
-"^":"zM;ja,yb,Ox,GY,Rp,Li,G2,A4,z7,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",
+"^":"zM;ja,yb,Ox,GY,Rp,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
 bI:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -14977,8 +15400,8 @@
 z=this.ja
 v=z.t(0,y)
 z.Rz(0,y)
-J.Xf(v,w)},"call$1","gVx",2,0,157,22,[]],
-z6:[function(a,b){var z,y,x
+J.Xf(v,w)},"call$1","gVx",2,0,159,22,[]],
+z6:function(a,b){var z,y,x
 z=""+this.yb
 y=H.B7([],P.L5(null,null,null,null,null))
 y.u(0,"id",z)
@@ -14988,15 +15411,15 @@
 x=H.VM(new P.Zf(P.Dt(null)),[null])
 this.ja.u(0,z,x)
 J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
-return x.MM},"call$1","gpV",2,0,null,264,[]],
+return x.MM},
 PI:function(){var z=C.Ns.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
 N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 ob:{
-"^":["V26;mC%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gWA:[function(a){return a.mC},null,null,1,0,368,"object",365,385],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,369,30,[],"object",365],
+"^":["V27;mC%-320,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gWA:[function(a){return a.mC},null,null,1,0,303,"object",300,316],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,304,30,[],"object",300],
 hu:[function(a){var z
 switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
 J.CJ(z,a.mC)
@@ -15005,7 +15428,7 @@
 J.oJ(z,a.mC)
 return z
 case"Class":z=W.r3("class-view",null)
-J.At(z,a.mC)
+J.ve(z,a.mC)
 return z
 case"Code":z=W.r3("code-view",null)
 J.fH(z,a.mC)
@@ -15022,7 +15445,7 @@
 case"HeapMap":z=W.r3("heap-map",null)
 J.Nf(z,a.mC)
 return z
-case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"String":z=W.r3("instance-view",null)
+case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"String":case"Type":z=W.r3("instance-view",null)
 J.ti(z,a.mC)
 return z
 case"Isolate":z=W.r3("isolate-view",null)
@@ -15049,7 +15472,9 @@
 case"VM":z=W.r3("vm-view",null)
 J.rK(z,a.mC)
 return z
-default:return}},"call$0","gbs",0,0,655,"_constructElementForObject"],
+default:z=W.r3("json-view",null)
+J.wD(z,a.mC)
+return z}},"call$0","gbs",0,0,523,"_constructElementForObject"],
 fa:[function(a,b){var z,y,x
 a.textContent=""
 z=a.mC
@@ -15058,7 +15483,7 @@
 x=this.hu(a)
 if(x==null){N.Jx("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"call$1","gYQ",2,0,112,230,[],"objectChanged"],
+N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"call$1","gYQ",2,0,114,232,[],"objectChanged"],
 "@":function(){return[C.hpj]},
 static:{zy:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15071,33 +15496,33 @@
 a.X0=w
 C.ZO.ZL(a)
 C.ZO.oX(a)
-return a},null,null,0,0,115,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[656],
-V26:{
+return a},null,null,0,0,117,"new ServiceObjectViewElement$created"]}},
+"+ServiceObjectViewElement":[524],
+V27:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["pv;tY%-389,Pe%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gnv:[function(a){return a.tY},null,null,1,0,368,"ref",365,385],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,369,30,[],"ref",365],
-gjT:[function(a){return a.Pe},null,null,1,0,399,"internal",365,385],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,400,30,[],"internal",365],
+"^":["pv;tY%-320,Pe%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gnv:[function(a){return a.tY},null,null,1,0,303,"ref",300,316],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,304,30,[],"ref",300],
+gjT:[function(a){return a.Pe},null,null,1,0,330,"internal",300,316],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,331,30,[],"internal",300],
 aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.bA,"",this.gD5(a))},"call$1","gLe",2,0,157,230,[],"refChanged"],
+this.ct(a,C.bA,"",this.gD5(a))},"call$1","gLe",2,0,159,232,[],"refChanged"],
 gO3:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,370,"url"],
+return z.gHP()},null,null,1,0,305,"url"],
 gOL:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,370,"serviceId"],
+return J.F8(z)},null,null,1,0,305,"serviceId"],
 gD5:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,370,"hoverText"],
+return z.gzz()},null,null,1,0,305,"hoverText"],
 goc:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,370,"name"],
+return J.O6(z)},null,null,1,0,305,"name"],
 "@":function(){return[C.JD]},
 static:{lK:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15111,22 +15536,22 @@
 a.X0=w
 C.wU.ZL(a)
 C.wU.oX(a)
-return a},null,null,0,0,115,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[657],
+return a},null,null,0,0,117,"new ServiceRefElement$created"]}},
+"+ServiceRefElement":[525],
 pv:{
 "^":"uL+Pi;",
 $isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
 "^":"",
 Uj:{
-"^":["Nr;kF%-390,IK%-398,Qt%-398,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gTq:[function(a){return a.kF},null,null,1,0,399,"checked",365,385],
-sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,400,30,[],"checked",365],
-gEu:[function(a){return a.IK},null,null,1,0,370,"checkedText",365,385],
-sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",365],
-gRY:[function(a){return a.Qt},null,null,1,0,370,"uncheckedText",365,385],
-sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,32,30,[],"uncheckedText",365],
+"^":["Bc;kF%-321,IK%-329,Qt%-329,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gTq:[function(a){return a.kF},null,null,1,0,330,"checked",300,316],
+sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,331,30,[],"checked",300],
+gEu:[function(a){return a.IK},null,null,1,0,305,"checkedText",300,316],
+sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",300],
+gRY:[function(a){return a.Qt},null,null,1,0,305,"uncheckedText",300,316],
+sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,32,30,[],"uncheckedText",300],
 RC:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.wb,a.kF,z)},"call$3","gR7",6,0,402,21,[],658,[],79,[],"change"],
+a.kF=this.ct(a,C.wb,a.kF,z)},"call$3","gBk",6,0,333,21,[],526,[],81,[],"change"],
 "@":function(){return[C.mS]},
 static:{Al:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15139,16 +15564,16 @@
 a.X0=w
 C.fA.ZL(a)
 C.fA.oX(a)
-return a},null,null,0,0,115,"new SlidingCheckboxElement$created"]}},
-"+SlidingCheckboxElement":[659],
-Nr:{
-"^":"ir+Pi;",
+return a},null,null,0,0,117,"new SlidingCheckboxElement$created"]}},
+"+SlidingCheckboxElement":[527],
+Bc:{
+"^":"xc+Pi;",
 $isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 xT:{
-"^":["V27;Va%-660,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.Va},null,null,1,0,629,"frame",365,385],
-sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,614,30,[],"frame",365],
+"^":["V28;Va%-528,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.Va},null,null,1,0,501,"frame",300,316],
+sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,495,30,[],"frame",300],
 "@":function(){return[C.Xv]},
 static:{an:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15161,17 +15586,17 @@
 a.X0=w
 C.dX.ZL(a)
 C.dX.oX(a)
-return a},null,null,0,0,115,"new StackFrameElement$created"]}},
-"+StackFrameElement":[661],
-V27:{
+return a},null,null,0,0,117,"new StackFrameElement$created"]}},
+"+StackFrameElement":[529],
+V28:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 uwf:{
-"^":["V28;B3%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtN:[function(a){return a.B3},null,null,1,0,384,"trace",365,385],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,386,30,[],"trace",365],
-pA:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+"^":["V29;B3%-313,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtN:[function(a){return a.B3},null,null,1,0,315,"trace",300,316],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,317,30,[],"trace",300],
+pA:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 "@":function(){return[C.js]},
 static:{bV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15184,9 +15609,9 @@
 a.X0=w
 C.bg.ZL(a)
 C.bg.oX(a)
-return a},null,null,0,0,115,"new StackTraceElement$created"]}},
-"+StackTraceElement":[662],
-V28:{
+return a},null,null,0,0,117,"new StackTraceElement$created"]}},
+"+StackTraceElement":[530],
+V29:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
@@ -15194,7 +15619,7 @@
 if(!!z.$isQl)return C.i3.f0(a)
 switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
 case"radio":case"select-multiple":case"select-one":return z.gi9(a)
-default:return z.gLm(a)}},"call$1","nc",2,0,null,132,[]],
+default:return z.gLm(a)}},"call$1","tF",2,0,null,134,[]],
 iX:[function(a,b){var z,y,x,w,v,u,t,s
 z=M.pN(a,b)
 y=J.x(a)
@@ -15206,7 +15631,7 @@
 if(s==null)continue
 if(u==null)u=P.Py(null,null,null,null,null)
 u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,263,[],282,[]],
+return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,265,[],284,[]],
 HP:[function(a,b,c,d,e){var z,y,x
 if(b==null)return
 if(b.gN2()!=null){z=b.gN2()
@@ -15216,16 +15641,16 @@
 if(z.gwd(b)==null)return
 y=b.gTe()-a.childNodes.length
 for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,263,[],151,[],283,[],282,[],284,[]],
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","K4",10,0,null,265,[],153,[],285,[],284,[],286,[]],
 bM:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
 if(!!z.$isQF||!!z.$isI0||!!z.$ishy)return a
-return},"call$1","ay",2,0,null,263,[]],
+return},"call$1","ay",2,0,null,265,[]],
 pN:[function(a,b){var z,y
 z=J.x(a)
 if(!!z.$iscv)return M.F5(a,b)
 if(!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"call$2","vw",4,0,null,263,[],282,[]],
+if(y!=null)return["text",y]}return},"call$2","vw",4,0,null,265,[],284,[]],
 F5:[function(a,b){var z,y,x
 z={}
 z.a=null
@@ -15236,7 +15661,7 @@
 if(y==null){x=[]
 z.a=x
 y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,132,[],282,[]],
+y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,134,[],284,[]],
 Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 for(z=J.U6(a),y=d!=null,x=!!J.x(b).$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
 u=z.t(a,w+1)
@@ -15266,7 +15691,7 @@
 t.push(L.Sk(j,l,null))}o.wE(0)
 p=o
 s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},"call$4","NJ",6,2,null,82,289,[],263,[],283,[],284,[]],
+if(y)d.push(i)}},"call$4","NJ",6,2,null,84,291,[],265,[],285,[],286,[]],
 F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s
 z=a.length
 if(z===0)return
@@ -15282,13 +15707,13 @@
 v=t+2}if(v===z)w.push("")
 z=new M.HS(w,null)
 z.Yn(w)
-return z},"call$4","jF",8,0,null,91,[],12,[],263,[],282,[]],
+return z},"call$4","jF",8,0,null,93,[],12,[],265,[],284,[]],
 SH:[function(a,b){var z,y
 z=a.firstChild
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
 for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"call$2","St",4,0,null,207,[],283,[]],
+z=z.nextSibling}},"call$2","St",4,0,null,209,[],285,[]],
 Ky:[function(a){var z,y,x,w
 z=$.rw()
 z.toString
@@ -15303,15 +15728,15 @@
 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.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
 z.u(0,a,x)
-return x},"call$1","La",2,0,null,263,[]],
+return x},"call$1","La",2,0,null,265,[]],
 wR:[function(a){var z=J.x(a)
 if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
 else z=!0
 else z=!1
-return z},"call$1","xS",2,0,null,198,[]],
+return z},"call$1","xS",2,0,null,200,[]],
 V2:{
 "^":"TU;N1,mD,Ck",
-Z1:[function(a,b,c,d){var z,y,x,w,v
+Z1:function(a,b,c,d){var z,y,x,w,v
 J.MV(this.glN(),b)
 if(!!J.x(this.gN1()).$isQl&&J.de(b,"value")){z=H.Go(this.gN1(),"$isQl")
 z.toString
@@ -15328,21 +15753,21 @@
 y=d!=null?d:""
 x=new M.D8(w,z,c,null,null,v,y)
 x.Og(z,v,c,d)}this.gCd(this).u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]]},
+return x}},
 D8:{
 "^":"TR;Y0,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
-EC:[function(a){var z,y
+EC:function(a){var z,y
 if(this.Y0){z=null!=a&&!1!==a
 y=this.eS
 if(z)J.Vs(X.TR.prototype.gH.call(this)).MW.setAttribute(y,"")
 else J.Vs(X.TR.prototype.gH.call(this)).Rz(0,y)}else{z=J.Vs(X.TR.prototype.gH.call(this))
 y=a==null?"":H.d(a)
-z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,30,[]]},
+z.MW.setAttribute(this.eS,y)}}},
 zP:{
 "^":"NP;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return M.NP.prototype.gH.call(this)},
-EC:[function(a){var z,y,x,w,v
+EC:function(a){var z,y,x,w,v
 z=J.u3(M.NP.prototype.gH.call(this))
 y=J.x(z)
 if(!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
@@ -15350,14 +15775,14 @@
 v=x}else{w=null
 v=null}}else{w=null
 v=null}M.NP.prototype.EC.call(this,a)
-if(v!=null&&v.gqP()!=null&&!J.de(y.gP(z),w))v.FC(null)},"call$1","gH0",2,0,null,231,[]]},
+if(v!=null&&v.gqP()!=null&&!J.de(y.gP(z),w))v.FC(null)}},
 H2:{
 "^":"TR;",
-cO:[function(a){if(this.qP==null)return
+cO:function(a){if(this.qP==null)return
 this.Ca.ed()
-X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null]},
+X.TR.prototype.cO.call(this,this)}},
 lP:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
@@ -15374,32 +15799,32 @@
 return x.length===1?C.mt:C.Nm.gtH(x)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 fTP:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ppY:{
-"^":"Tp:112;b",
+"^":"Tp:114;b",
 call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 NP:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
-EC:[function(a){var z=this.gH()
-J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,231,[]],
+EC:function(a){var z=this.gH()
+J.ta(z,a==null?"":H.d(a))},
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"call$1","gqf",2,0,157,21,[]]},
+O.Y3()},"call$1","gqf",2,0,159,21,[]]},
 jt:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
-EC:[function(a){var z=X.TR.prototype.gH.call(this)
-J.rP(z,null!=a&&!1!==a)},"call$1","gH0",2,0,null,231,[]],
+EC:function(a){var z=X.TR.prototype.gH.call(this)
+J.rP(z,null!=a&&!1!==a)},
 FC:[function(a){var z,y,x
 z=J.Hf(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)
 if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
 x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
-if(x!=null)J.ta(x,!1)}O.Y3()},"call$1","gqf",2,0,157,21,[]],
+if(x!=null)J.ta(x,!1)}O.Y3()},"call$1","gqf",2,0,159,21,[]],
 static:{kv:[function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
@@ -15408,9 +15833,9 @@
 return z.ev(z,new M.r0(a))}else{y=M.bM(a)
 if(y==null)return C.xD
 x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.jz(a))}},"call$1","VE",2,0,null,132,[]]}},
+return x.ev(x,new M.jz(a))}},"call$1","VE",2,0,null,134,[]]}},
 r0:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z,y
 z=this.a
 y=J.x(a)
@@ -15419,23 +15844,23 @@
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},"call$1",null,2,0,null,286,[],"call"],
+return z},"call$1",null,2,0,null,288,[],"call"],
 $isEH:true},
 jz:{
-"^":"Tp:112;b",
+"^":"Tp:114;b",
 call$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,286,[],"call"],
+return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,288,[],"call"],
 $isEH:true},
 SA:{
 "^":"H2;Dh,Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
-EC:[function(a){var z
+EC:function(a){var z
 this.C7()
 if(this.Gh(a)===!0)return
 z=new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.K2(new M.hB(this)),2))
 C.S2.yN(z,X.TR.prototype.gH.call(this),!0,!0)
-this.Dh=z},"call$1","gH0",2,0,null,231,[]],
-Gh:[function(a){var z,y,x
+this.Dh=z},
+Gh:function(a){var z,y,x
 z=this.eS
 y=J.x(z)
 if(y.n(z,"selectedIndex")){x=M.qb(a)
@@ -15443,33 +15868,33 @@
 z=J.m4(X.TR.prototype.gH.call(this))
 return z==null?x==null:z===x}else if(y.n(z,"value")){z=X.TR.prototype.gH.call(this)
 J.ta(z,a==null?"":H.d(a))
-return J.de(J.Vm(X.TR.prototype.gH.call(this)),a)}},"call$1","goz",2,0,null,231,[]],
-C7:[function(){var z=this.Dh
+return J.de(J.Vm(X.TR.prototype.gH.call(this)),a)}},
+C7:function(){var z=this.Dh
 if(z!=null){z.disconnect()
-this.Dh=null}},"call$0","glnT",0,0,null],
+this.Dh=null}},
 FC:[function(a){var z,y
 this.C7()
 z=this.eS
 y=J.x(z)
 if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"call$1","gqf",2,0,157,21,[]],
+J.ta(this.xS,z)}},"call$1","gqf",2,0,159,21,[]],
 $isSA:true,
 static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
 return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,30,[]]}},
 hB:{
-"^":"Tp:355;a",
+"^":"Tp:293;a",
 call$2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,28,[],663,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,28,[],531,[],"call"],
 $isEH:true},
 nv:{
-"^":"Tp:112;",
-call$1:[function(a){return 0},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return 0},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 ee:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
-Z1:[function(a,b,c,d){var z,y,x
+Z1:function(a,b,c,d){var z,y,x
 z=J.x(b)
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 y=this.gN1()
@@ -15487,23 +15912,23 @@
 x.Og(z,"checked",c,d)
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}y.u(0,b,z)
-return z},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]]},
+return z}},
 K6:{
 "^":"a;Cd>,wd>,N2<,Te<"},
 TU:{
 "^":"a;N1<,mD,Ck?",
-Z1:[function(a,b,c,d){var z
+Z1:function(a,b,c,d){var z
 window
 z="Unhandled binding to Node: "+H.d(this)+" "+H.d(b)+" "+H.d(c)+" "+H.d(d)
-if(typeof console!="undefined")console.error(z)},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]],
-Ih:[function(a,b){var z
+if(typeof console!="undefined")console.error(z)},
+Ih:function(a,b){var z
 if(this.mD==null)return
 z=this.gCd(this).Rz(0,b)
-if(z!=null)J.wC(z)},"call$1","gC8",2,0,null,12,[]],
-GB:[function(a){var z,y
+if(z!=null)J.wC(z)},
+GB:function(a){var z,y
 if(this.mD==null)return
 for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(y!=null)J.wC(y)}this.mD=null},"call$0","gJg",0,0,null],
+if(y!=null)J.wC(y)}this.mD=null},
 gCd:function(a){var z=this.mD
 if(z==null){z=P.L5(null,null,null,J.O,X.TR)
 this.mD=z}return z},
@@ -15515,7 +15940,7 @@
 ug:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
-Z1:[function(a,b,c,d){var z,y,x
+Z1:function(a,b,c,d){var z,y,x
 if(J.de(b,"selectedindex"))b="selectedIndex"
 z=J.x(b)
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
@@ -15529,12 +15954,12 @@
 x.Og(y,b,c,d)
 x.Ca=M.IP(y).yI(x.gqf())
 z.u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]]},
+return x}},
 DT:{
 "^":"V2;lr,xT?,kr<,Mf,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
 gN1:function(){return this.N1},
 glN:function(){return!!J.x(this.N1).$isDT?this.N1:this},
-Z1:[function(a,b,c,d){var z
+Z1:function(a,b,c,d){var z
 d=d!=null?d:""
 z=this.kr
 if(z==null){z=new M.TG(this,[],null,!1,!1,!1,!1,!1,null,null,null,null,null,null,null,null,!1,null,null)
@@ -15559,8 +15984,8 @@
 z=new M.p8(this,c,b,d)
 this.gCd(this).u(0,b,z)
 return z
-default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]],
-Ih:[function(a,b){var z
+default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},
+Ih:function(a,b){var z
 switch(b){case"bind":z=this.kr
 if(z==null)return
 z.js=!1
@@ -15586,11 +16011,11 @@
 this.gCd(this).Rz(0,b)
 return
 default:M.TU.prototype.Ih.call(this,this,b)
-return}},"call$1","gC8",2,0,null,12,[]],
-jq:[function(){var z=this.kr
+return}},
+jq:function(){var z=this.kr
 if(!z.t9){z.t9=!0
-P.rb(z.gjM())}},"call$0","gTd",0,0,null],
-a5:[function(a,b,c){var z,y,x,w,v,u,t
+P.rb(z.gjM())}},
+a5:function(a,b,c){var z,y,x,w,v,u,t
 z=this.gnv(this)
 z=!!J.x(z).$isTU?z:M.Ky(z)
 y=J.G6(z)
@@ -15605,7 +16030,8 @@
 w=u}t=M.Fz(y,w)
 M.HP(t,x,a,b,c)
 M.SH(t,a)
-return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,283,[],282,[],284,[]],
+return t},
+ZK:function(a,b){return this.a5(a,b,null)},
 gk8:function(){return this.lr},
 gzH:function(){return this.xT},
 gnv:function(a){var z,y,x,w
@@ -15620,7 +16046,7 @@
 this.Sy()
 z=this.jH
 return z!=null?z:H.Go(this.N1,"$isyY").content},
-wh:[function(a){var z,y,x,w,v,u
+wh:function(a){var z,y,x,w,v,u
 if(this.mj===!0)return!1
 M.oR()
 this.mj=!0
@@ -15639,7 +16065,8 @@
 if(a!=null)v.sQO(a)
 else if(y)M.KE(v,this.N1,u)
 else M.GM(J.G6(v))
-return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,664,[]],
+return!0},
+Sy:function(){return this.wh(null)},
 $isDT:true,
 static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
 z=J.Lh(b,a,!1)
@@ -15649,17 +16076,17 @@
 else y=!1
 if(y)return z
 for(x=J.Q8(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"call$2","G0",4,0,null,263,[],285,[]],TA:[function(a){var z,y,x,w
+return z},"call$2","G0",4,0,null,265,[],287,[]],TA:[function(a){var z,y,x,w
 z=J.VN(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
 if(y==null){y=z.implementation.createHTMLDocument("")
 for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","lA",2,0,null,260,[]],eX:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","lA",2,0,null,262,[]],eX:[function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gKV(a).insertBefore(y,a)
-for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=x.lo
+for(x=C.Nm.br(z.gQg(a).gvc()),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=x.lo
 switch(w){case"template":v=z.gQg(a).MW
 v.getAttribute(w)
 v.removeAttribute(w)
@@ -15669,25 +16096,25 @@
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
-break}}return y},"call$1","Bw",2,0,null,286,[]],KE:[function(a,b,c){var z,y,x,w
+break}}return y},"call$1","Bw",2,0,null,288,[]],KE:[function(a,b,c){var z,y,x,w
 z=J.G6(a)
 if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,260,[],286,[],287,[]],GM:[function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,262,[],288,[],289,[]],GM:[function(a){var z,y
 z=new M.OB()
 y=J.MK(a,$.cz())
 if(M.wR(a))z.call$1(a)
-y.aN(y,z)},"call$1","DR",2,0,null,288,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},"call$1","DR",2,0,null,290,[]],oR:[function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
 J.c9(z,H.d($.cz())+" { display: none; }")
 document.head.appendChild(z)},"call$0","Lv",0,0,null]}},
 OB:{
-"^":"Tp:157;",
-call$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},"call$1",null,2,0,null,260,[],"call"],
+"^":"Tp:159;",
+call$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},"call$1",null,2,0,null,262,[],"call"],
 $isEH:true},
 Uf:{
-"^":"Tp:112;",
-call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,453,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,360,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
@@ -15696,19 +16123,18 @@
 return z.N1},
 gk8:function(){return this.lr},
 gP:function(a){return J.Vm(this.gND())},
-r6:function(a,b){return this.gP(this).call$1(b)},
 sP:function(a,b){J.ta(this.gND(),b)},
 gND:function(){var z=J.x(this.lr)
 if((!!z.$isWR||!!z.$isJ3)&&J.de(this.ay,"value"))return this.lr
 return L.Sk(this.lr,this.ay,null)},
-cO:[function(a){var z=this.ud
+cO:function(a){var z=this.ud
 if(z==null)return
 z.Ih(0,this.eS)
 this.lr=null
-this.ud=null},"call$0","gJK",0,0,null],
+this.ud=null},
 $isTR:true},
 NW:{
-"^":"Tp:355;a,b,c,d",
+"^":"Tp:293;a,b,c,d",
 call$2:[function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)if(z.n(a,"if")){this.a.b=!0
@@ -15739,7 +16165,7 @@
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"call$1","gBg",2,0,665,30,[]],
+return y+H.d(z[3])},"call$1","gBg",2,0,532,30,[]],
 b5:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
@@ -15750,7 +16176,7 @@
 if(t>=z.length)return H.e(z,t)
 u=z[t]
 u=typeof u==="string"?u:H.d(u)
-y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,666,667,[]],
+y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,533,534,[]],
 Yn:function(a){this.bX=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
 "^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -15771,8 +16197,8 @@
 u=this.eD
 v.push(L.Sk(z,u,null))
 w.wE(0)}this.FS=w.gUj(w).yI(new M.R7(this))
-this.Az(w.gP(w))},"call$0","gjM",0,0,115],
-Az:[function(a){var z,y,x,w
+this.Az(w.gP(w))},"call$0","gjM",0,0,117],
+Az:function(a){var z,y,x,w
 z=this.xG
 this.Gb()
 y=J.x(a)
@@ -15784,8 +16210,8 @@
 x=this.xG
 x=x!=null?x:[]
 w=G.jj(x,0,J.q8(x),y,0,J.q8(y))
-if(w.length!==0)this.El(w)},"call$1","ghC",2,0,null,231,[]],
-wx:[function(a){var z,y,x,w
+if(w.length!==0)this.El(w)},
+wx:function(a){var z,y,x,w
 z=J.x(a)
 if(z.n(a,-1))return this.e9.N1
 y=this.YC
@@ -15797,8 +16223,8 @@
 if(z)return x
 w=M.Ky(x).gkr()
 if(w==null)return x
-return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gKD",2,0,null,15,[]],
-lP:[function(a,b,c,d){var z,y,x,w,v,u
+return w.wx(C.jn.cU(w.YC.length,2)-1)},
+lP:function(a,b,c,d){var z,y,x,w,v,u
 z=J.Wx(a)
 y=this.wx(z.W(a,1))
 x=b!=null
@@ -15810,8 +16236,8 @@
 v=J.TZ(this.e9.N1)
 u=J.tx(y)
 if(x)v.insertBefore(b,u)
-else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,15,[],207,[],668,[],284,[]],
-MC:[function(a){var z,y,x,w,v,u,t,s
+else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},
+MC:function(a){var z,y,x,w,v,u,t,s
 z=[]
 z.$builtinTypeInfo=[W.KV]
 y=J.Wx(a)
@@ -15827,7 +16253,7 @@
 if(s==null?w==null:s===w)w=x
 v=s.parentNode
 if(v!=null)v.removeChild(s)
-z.push(s)}return new M.Ya(z,t)},"call$1","gtx",2,0,null,15,[]],
+z.push(s)}return new M.Ya(z,t)},
 El:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 if(this.pq)return
 z=this.e9
@@ -15851,14 +16277,14 @@
 k=null}else{m=[]
 if(this.DO!=null)o=this.Mv(o)
 k=o!=null?z.a5(o,x,m):null
-l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,669,254,[]],
-uS:[function(a){var z
-for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,284,[]],
-Gb:[function(){var z=this.IY
+l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,535,256,[]],
+uS:function(a){var z
+for(z=J.GP(a);z.G();)J.wC(z.gl())},
+Gb:function(){var z=this.IY
 if(z==null)return
 z.ed()
-this.IY=null},"call$0","gY2",0,0,null],
-cO:[function(a){var z,y
+this.IY=null},
+cO:function(a){var z,y
 if(this.pq)return
 this.Gb()
 for(z=this.YC,y=1;y<z.length;y+=2)this.uS(z[y])
@@ -15866,30 +16292,30 @@
 z=this.FS
 if(z!=null){z.ed()
 this.FS=null}this.e9.kr=null
-this.pq=!0},"call$0","gJK",0,0,null]},
+this.pq=!0}},
 VU:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){return[a]},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:670;a",
+"^":"Tp:536;a",
 call$1:[function(a){var z,y,x
 z=J.U6(a)
 y=z.t(a,0)
 x=z.t(a,1)
 if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"call$1",null,2,0,null,667,[],"call"],
+return this.a?y:[y]},"call$1",null,2,0,null,534,[],"call"],
 $isEH:true},
 R7:{
-"^":"Tp:112;b",
-call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,401,[],"call"],
+"^":"Tp:114;b",
+call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,332,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
 $isYa:true},
 XT:{
 "^":"TU;N1,mD,Ck",
-Z1:[function(a,b,c,d){var z,y,x
+Z1:function(a,b,c,d){var z,y,x
 if(!J.de(b,"text"))return M.TU.prototype.Z1.call(this,this,b,c,d)
 this.Ih(0,b)
 z=this.gCd(this)
@@ -15898,15 +16324,15 @@
 x=new M.ic(y,c,null,null,"text",x)
 x.Og(y,"text",c,d)
 z.u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]]},
+return x}},
 ic:{
 "^":"TR;qP,ZY,xS,PB,eS,ay",
-EC:[function(a){var z=this.qP
-J.c9(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,231,[]]},
+EC:function(a){var z=this.qP
+J.c9(z,a==null?"":H.d(a))}},
 wl:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
-Z1:[function(a,b,c,d){var z,y,x
+Z1:function(a,b,c,d){var z,y,x
 if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
 J.MV(!!J.x(z).$isTU?z:this,b)
@@ -15918,9 +16344,9 @@
 x.Og(y,"value",c,d)
 x.Ca=M.IP(y).yI(x.gqf())
 z.u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
+return x}}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
 "^":"",
-ve:{
+T4p:{
 "^":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{
 "^":"",
 TR:{
@@ -15928,16 +16354,15 @@
 gH:function(){return this.qP},
 gk8:function(){return this.ZY},
 gP:function(a){return J.Vm(this.xS)},
-r6:function(a,b){return this.gP(this).call$1(b)},
 sP:function(a,b){J.ta(this.xS,b)},
-cO:[function(a){var z
+cO:function(a){var z
 if(this.qP==null)return
 z=this.PB
 if(z!=null)z.ed()
 this.PB=null
 this.xS=null
 this.qP=null
-this.ZY=null},"call$0","gJK",0,0,null],
+this.ZY=null},
 Og:function(a,b,c,d){var z,y
 z=J.x(this.ZY)
 z=(!!z.$isWR||!!z.$isJ3)&&J.de(d,"value")
@@ -15948,13 +16373,13 @@
 this.EC(J.Vm(this.xS))},
 $isTR:true},
 VD:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,401,[],"call"],
+return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,332,[],"call"],
 $isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
 "^":"",
 I5:{
-"^":["xI;tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.Ye]},
 static:{cF:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15968,16 +16393,16 @@
 a.X0=w
 C.V8.ZL(a)
 C.V8.oX(a)
-return a},null,null,0,0,115,"new VMRefElement$created"]}},
-"+VMRefElement":[391]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
+return a},null,null,0,0,117,"new VMRefElement$created"]}},
+"+VMRefElement":[322]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
 "^":"",
 en:{
-"^":["V29;ID%-363,lc%-671,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzf:[function(a){return a.ID},null,null,1,0,613,"vm",365,385],
-szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,672,30,[],"vm",365],
-gkc:[function(a){return a.lc},null,null,1,0,632,"error",365,385],
-skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,633,30,[],"error",365],
-pA:[function(a,b){J.am(a.ID).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+"^":["V30;ID%-298,lc%-537,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzf:[function(a){return a.ID},null,null,1,0,494,"vm",300,316],
+szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,538,30,[],"vm",300],
+gkc:[function(a){return a.lc},null,null,1,0,508,"error",300,316],
+skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,509,30,[],"error",300],
+pA:[function(a,b){J.am(a.ID).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 "@":function(){return[C.Hk]},
 static:{oH:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15990,9 +16415,9 @@
 a.X0=w
 C.nt.ZL(a)
 C.nt.oX(a)
-return a},null,null,0,0,115,"new VMViewElement$created"]}},
-"+VMViewElement":[673],
-V29:{
+return a},null,null,0,0,117,"new VMViewElement$created"]}},
+"+VMViewElement":[539],
+V30:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
@@ -16071,10 +16496,10 @@
 N.TJ.$isa=true
 P.wv.$iswv=true
 P.wv.$isa=true
+T.yj.$isyj=true
+T.yj.$isa=true
 J.kn.$isbool=true
 J.kn.$isa=true
-T.z2.$isz2=true
-T.z2.$isa=true
 W.OJ.$isea=true
 W.OJ.$isa=true
 A.XP.$isXP=true
@@ -16102,9 +16527,9 @@
 P.ej.$isa=true
 P.RY.$isej=true
 P.RY.$isa=true
-P.Fw.$isX9=true
-P.Fw.$isej=true
-P.Fw.$isa=true
+P.tg.$isX9=true
+P.tg.$isej=true
+P.tg.$isa=true
 P.X9.$isX9=true
 P.X9.$isej=true
 P.X9.$isa=true
@@ -16153,7 +16578,9 @@
 W.I0.$isKV=true
 W.I0.$isD0=true
 W.I0.$isa=true
+D.af.$isaf=true
 D.af.$isa=true
+D.bv.$isaf=true
 D.bv.$isa=true
 W.cx.$isea=true
 W.cx.$isa=true
@@ -16166,6 +16593,7 @@
 W.zU.$isa=true
 W.kQ.$isea=true
 W.kQ.$isa=true
+D.kx.$isaf=true
 D.kx.$isa=true
 D.t9.$isa=true
 W.qp.$iscv=true
@@ -16200,6 +16628,7 @@
 V.qC.$isZ0=true
 V.qC.$isa=true
 D.SI.$isSI=true
+D.SI.$isaf=true
 D.SI.$isqC=true
 D.SI.$asqC=[null,null]
 D.SI.$isZ0=true
@@ -16232,8 +16661,10 @@
 O.Qb.$isQb=true
 O.Qb.$isa=true
 D.fJ.$isfJ=true
+D.fJ.$isaf=true
 D.fJ.$isa=true
 D.hR.$ishR=true
+D.hR.$isaf=true
 D.hR.$isa=true
 P.EH.$isEH=true
 P.EH.$isa=true
@@ -16278,8 +16709,9 @@
 J.AG=function(a){return J.x(a).bu(a)}
 J.AK=function(a){return J.RE(a).Zi(a)}
 J.Ag=function(a){return J.RE(a).goY(a)}
-J.At=function(a,b){return J.RE(a).sRu(a,b)}
+J.Aw=function(a,b){return J.RE(a).sHp(a,b)}
 J.BM=function(a,b,c){return J.w1(a).xe(a,b,c)}
+J.Ba=function(a){return J.RE(a).gUx(a)}
 J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
 J.CC=function(a){return J.RE(a).gmH(a)}
@@ -16290,6 +16722,7 @@
 J.EY=function(a,b){return J.RE(a).od(a,b)}
 J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
 J.Eh=function(a,b){return J.Wx(a).O(a,b)}
+J.Ew=function(a){return J.RE(a).gSw(a)}
 J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
 J.F6=function(a,b){return J.RE(a).stD(a,b)}
 J.F8=function(a){return J.RE(a).gjO(a)}
@@ -16336,6 +16769,7 @@
 J.O2=function(a,b){return J.RE(a).Ch(a,b)}
 J.O6=function(a){return J.RE(a).goc(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
+J.OS=function(a,b){return J.w1(a).tt(a,b)}
 J.Or=function(a){return J.RE(a).yx(a)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
 J.Q5=function(a){return J.RE(a).gwl(a)}
@@ -16407,13 +16841,13 @@
 return J.x(a).n(a,b)}
 J.dk=function(a,b){return J.RE(a).sMj(a,b)}
 J.e2=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
-J.f2=function(a){return J.RE(a).gRd(a)}
 J.f5=function(a){return J.RE(a).gI(a)}
 J.fH=function(a,b){return J.RE(a).stT(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.fi=function(a,b){return J.RE(a).ps(a,b)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
-J.iG=function(a,b){return J.RE(a).szZ(a,b)}
+J.iF=function(a,b){return J.RE(a).szZ(a,b)}
+J.iS=function(a){return J.RE(a).gox(a)}
 J.iZ=function(a){return J.RE(a).gzZ(a)}
 J.ja=function(a,b){return J.w1(a).Vr(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
@@ -16432,7 +16866,6 @@
 J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
 return J.Wx(a).i(a,b)}
 J.nJ=function(a){return J.RE(a).ga4(a)}
-J.ni=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
 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).gE8(a)}
@@ -16465,9 +16898,11 @@
 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.ve=function(a,b){return J.RE(a).sdG(a,b)}
 J.vo=function(a,b){return J.w1(a).ev(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wC=function(a){return J.RE(a).cO(a)}
+J.wD=function(a,b){return J.w1(a).sIr(a,b)}
 J.wc=function(a){return J.RE(a).gbG(a)}
 J.wp=function(a,b,c,d){return J.w1(a).zB(a,b,c,d)}
 J.xH=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
@@ -16476,9 +16911,9 @@
 J.xR=function(a){return J.RE(a).ghf(a)}
 J.xq=function(a){return J.RE(a).gUj(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yj=function(a){return J.RE(a).gG1(a)}
 J.yn=function(a,b){return J.RE(a).vV(a,b)}
 J.yxg=function(a){return J.RE(a).gGd(a)}
+J.z2=function(a){return J.RE(a).gG1(a)}
 J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
 return J.Wx(a).D(a,b)}
 J.zH=function(a){return J.RE(a).gt5(a)}
@@ -16487,7 +16922,7 @@
 C.J0=B.d1.prototype
 C.KZ=new H.hJ()
 C.OL=new U.EZ()
-C.Gw=new H.Ma()
+C.Gw=new H.yq()
 C.E3=new J.Q()
 C.Fm=new J.kn()
 C.yX=new J.GW()
@@ -16524,6 +16959,7 @@
 C.E6=new A.V3("field-ref")
 C.aM=new A.V3("isolate-summary")
 C.Is=new A.V3("response-viewer")
+C.OLi=new A.V3("script-inset")
 C.nh=new A.V3("nav-menu-item")
 C.KI=new A.V3("library-nav-menu")
 C.hpj=new A.V3("service-view")
@@ -16531,8 +16967,9 @@
 C.nu=new A.V3("function-view")
 C.jR=new A.V3("isolate-profile")
 C.xW=new A.V3("code-view")
-C.oY=new A.V3("class-view")
+C.aQx=new A.V3("class-view")
 C.fO=new A.V3("isolate-view")
+C.P9=new A.V3("eval-link")
 C.mS=new A.V3("sliding-checkbox")
 C.Hk=new A.V3("vm-view")
 C.Oyb=new A.V3("library-view")
@@ -16540,7 +16977,7 @@
 C.hr=new A.V3("top-nav-menu")
 C.js=new A.V3("stack-trace")
 C.Ur=new A.V3("script-ref")
-C.OS=new A.V3("class-ref")
+C.tSc=new A.V3("class-ref")
 C.jy=new A.V3("breakpoint-list")
 C.VW=new A.V3("instance-ref")
 C.Ye=new A.V3("vm-ref")
@@ -16555,16 +16992,17 @@
 C.u7=new A.V3("nav-menu")
 C.KH=new A.V3("json-view")
 C.X0=new A.V3("isolate-ref")
-C.U7Q=new A.V3("function-ref")
+C.o3=new A.V3("function-ref")
 C.uy=new A.V3("library-ref")
 C.vc=new A.V3("field-view")
 C.JD=new A.V3("service-ref")
 C.nW=new A.V3("nav-bar")
 C.DKS=new A.V3("curly-block")
-C.be=new A.V3("instance-view")
+C.qlk=new A.V3("instance-view")
 C.ny=new P.a6(0)
 C.OD=F.Ir.prototype
 C.Gh=L.rm.prototype
+C.UF=R.Lt.prototype
 C.mt=H.VM(new W.UC("change"),[W.ea])
 C.pi=H.VM(new W.UC("click"),[W.Wp])
 C.MD=H.VM(new W.UC("error"),[W.kQ])
@@ -16573,7 +17011,7 @@
 C.fK=H.VM(new W.UC("load"),[W.kQ])
 C.Ns=H.VM(new W.UC("message"),[W.cx])
 C.W2=H.VM(new W.UC("mousemove"),[W.Wp])
-C.MC=D.m8.prototype
+C.MC=D.UL.prototype
 C.LT=A.jM.prototype
 C.Xo=U.AX.prototype
 C.h4=N.mk.prototype
@@ -16582,10 +17020,10 @@
 C.W3=W.zU.prototype
 C.cp=B.NG.prototype
 C.pU=Z.hx.prototype
-C.RR=A.fl.prototype
+C.RR=A.Mv.prototype
 C.kS=X.kKl.prototype
 C.LN=N.oO.prototype
-C.Qt=D.Kz.prototype
+C.Qt=D.fl.prototype
 C.Xe=L.qkb.prototype
 C.Nm=J.Q.prototype
 C.ON=J.GW.prototype
@@ -16724,7 +17162,7 @@
   hooks.prototypeForTag = prototypeForTagFixed;
 }
 C.xr=new P.by(null,null)
-C.A3=new P.Cf(null)
+C.A3=new P.pz(null)
 C.nX=new P.dI(null)
 C.Yt=Z.vj.prototype
 C.VZ=new N.qV("FINER",400)
@@ -16747,7 +17185,7 @@
 C.xu=I.makeConstantList([43,45,42,47,33,38,60,61,62,63,94,124])
 C.u0=I.makeConstantList(["==","!=","<=",">=","||","&&"])
 C.Me=H.VM(I.makeConstantList([]),[P.Ms])
-C.dn=H.VM(I.makeConstantList([]),[P.Fw])
+C.dn=H.VM(I.makeConstantList([]),[P.tg])
 C.hU=H.VM(I.makeConstantList([]),[P.X9])
 C.iH=H.VM(I.makeConstantList([]),[J.im])
 C.xD=I.makeConstantList([])
@@ -16774,9 +17212,11 @@
 C.t5=W.yk.prototype
 C.k0=V.lI.prototype
 C.Pf=Z.uL.prototype
+C.ZQ=J.FP.prototype
 C.zb=A.XP.prototype
-C.Iv=A.ir.prototype
+C.Iv=A.xc.prototype
 C.Cc=Q.JG.prototype
+C.HD=T.ov.prototype
 C.c0=A.knI.prototype
 C.cJ=U.fI.prototype
 C.SX=R.HF.prototype
@@ -16803,17 +17243,23 @@
 C.lH=new H.GD("checkedText")
 C.XA=new H.GD("cls")
 C.b1=new H.GD("code")
+C.MR=new H.GD("counters")
+C.Xs=new H.GD("coverage")
 C.h1=new H.GD("currentHash")
 C.Na=new H.GD("devtools")
 C.aH=new H.GD("displayCutoff")
 C.Jw=new H.GD("displayValue")
 C.nN=new H.GD("dynamic")
+C.Gr=new H.GD("endPos")
 C.tP=new H.GD("entry")
 C.YU=new H.GD("error")
 C.ne=new H.GD("exception")
 C.mr=new H.GD("expanded")
+C.Of=new H.GD("expander")
+C.Yy=new H.GD("expr")
 C.IV=new H.GD("field")
 C.CX=new H.GD("fileAndLine")
+C.Gd=new H.GD("firstTokenPos")
 C.Aq=new H.GD("formattedAverage")
 C.WG=new H.GD("formattedCollections")
 C.uU=new H.GD("formattedExclusiveTicks")
@@ -16826,7 +17272,7 @@
 C.zS=new H.GD("hasDisassembly")
 C.D2=new H.GD("hasParent")
 C.lb=new H.GD("hideTagsChecked")
-C.YH=new H.GD("hitsStyle")
+C.du=new H.GD("hitStyle")
 C.bA=new H.GD("hoverText")
 C.AZ=new H.GD("dart.core.String")
 C.Di=new H.GD("iconClass")
@@ -16836,16 +17282,18 @@
 C.ai=new H.GD("isEmpty")
 C.nZ=new H.GD("isNotEmpty")
 C.Z8=new H.GD("isolate")
-C.Gd=new H.GD("json")
 C.fy=new H.GD("kind")
 C.hf=new H.GD("label")
 C.QL=new H.GD("last")
+C.kA=new H.GD("lastTokenPos")
 C.Wn=new H.GD("length")
 C.EV=new H.GD("library")
-C.Cv=new H.GD("line")
 C.eh=new H.GD("lineMode")
+C.Cv=new H.GD("lines")
 C.dB=new H.GD("link")
 C.wT=new H.GD("mainPort")
+C.p3=new H.GD("map")
+C.t6=new H.GD("mapAsString")
 C.PC=new H.GD("dart.core.int")
 C.ch=new H.GD("message")
 C.UX=new H.GD("msg")
@@ -16859,20 +17307,23 @@
 C.ap=new H.GD("oldHeapUsed")
 C.wq=new H.GD("pausedOnExit")
 C.NT=new H.GD("pausedOnStart")
+C.Kl=new H.GD("pos")
 C.vb=new H.GD("profile")
 C.zc=new H.GD("qualified")
+C.AO=new H.GD("qualifiedName")
 C.kY=new H.GD("ref")
 C.Dj=new H.GD("refreshTime")
 C.c8=new H.GD("registerCallback")
 C.mE=new H.GD("response")
+C.UY=new H.GD("result")
 C.Aa=new H.GD("results")
-C.iF=new H.GD("rootLib")
+C.xe=new H.GD("rootLib")
 C.X8=new H.GD("running")
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
 C.XU=new H.GD("sampleCount")
 C.bE=new H.GD("sampleDepth")
-C.kA=new H.GD("sampleRate")
+C.mI=new H.GD("sampleRate")
 C.fX=new H.GD("script")
 C.eC=new H.GD("[]=")
 C.V0=new H.GD("showCoverage")
@@ -16887,21 +17338,20 @@
 C.mh=new H.GD("uptime")
 C.Fh=new H.GD("url")
 C.ls=new H.GD("value")
-C.eR=new H.GD("valueType")
 C.zn=new H.GD("version")
 C.RJ=new H.GD("vm")
 C.KS=new H.GD("vmName")
 C.v6=new H.GD("void")
 C.lx=A.tz.prototype
 C.n8=H.uV('qC')
-C.WP=new H.Lm(C.n8,"K",0)
+C.WP=new H.QT(C.n8,"K",0)
 C.SL=H.uV('Ae')
-C.xC=new H.Lm(C.SL,"V",0)
+C.xC=new H.QT(C.SL,"V",0)
 C.QJ=H.uV('xh')
-C.wW=new H.Lm(C.QJ,"T",0)
+C.wW=new H.QT(C.QJ,"T",0)
 C.Gsc=H.uV('wn')
-C.io=new H.Lm(C.Gsc,"E",0)
-C.nz=new H.Lm(C.n8,"V",0)
+C.io=new H.QT(C.Gsc,"E",0)
+C.nz=new H.QT(C.n8,"V",0)
 C.RP=H.uV('hx')
 C.Ln=H.uV('Dg')
 C.z6Y=H.uV('Tg')
@@ -16915,12 +17365,12 @@
 C.GTO=H.uV('F1')
 C.nY=H.uV('a')
 C.Yc=H.uV('iP')
+C.Pt=H.uV('ov')
 C.jRs=H.uV('Be')
-C.P9=H.uV('oO')
+C.Ow=H.uV('oO')
 C.PT=H.uV('I2')
 C.P0k=H.uV('lI')
 C.T1=H.uV('Wy')
-C.hG=H.uV('ir')
 C.aj=H.uV('fI')
 C.UrY=H.uV('kKl')
 C.cK=H.uV('I5')
@@ -16936,22 +17386,22 @@
 C.X6M=H.uV('jM')
 C.yiu=H.uV('knI')
 C.dUi=H.uV('Uj')
-C.iN=H.uV('yc')
+C.U9=H.uV('UL')
+C.iG=H.uV('yc')
 C.cNA=H.uV('NG')
 C.HI=H.uV('Pg')
 C.ab=H.uV('xI')
 C.lk=H.uV('mJ')
 C.lpG=H.uV('LU')
 C.Ch=H.uV('KL')
-C.pI=H.uV('fl')
+C.raB=H.uV('fl')
 C.jV=H.uV('rF')
 C.OdR=H.uV('pL')
 C.ix=H.uV('HF')
 C.wE=H.uV('vj')
+C.yB=H.uV('Mv')
 C.JW=H.uV('Ww')
 C.qo=H.uV('jY')
-C.wH=H.uV('Kz')
-C.cx5=H.uV('m8')
 C.l49=H.uV('uL')
 C.yQ=H.uV('EH')
 C.Im=H.uV('X6')
@@ -16960,14 +17410,16 @@
 C.px=H.uV('tz')
 C.epC=H.uV('Jc')
 C.JA3=H.uV('b0B')
-C.piC=H.uV('nk')
+C.PF=H.uV('nk')
 C.qY=H.uV('wM')
 C.Db=H.uV('String')
 C.BP=H.uV('qkb')
+C.Tu=H.uV('xc')
 C.bh=H.uV('i6')
 C.Bm=H.uV('XP')
 C.hg=H.uV('hd')
 C.Fv=H.uV('ob')
+C.leN=H.uV('Lt')
 C.HL=H.uV('bool')
 C.Qf=H.uV('Null')
 C.HH=H.uV('dynamic')
@@ -16976,7 +17428,7 @@
 C.hI=H.uV('Ir')
 C.CS=H.uV('vm')
 C.hN=H.uV('oI')
-C.LF=H.uV('xT')
+C.R4R=H.uV('xT')
 C.vB=J.is.prototype
 C.xM=new P.z0(!1)
 C.V8=X.I5.prototype
@@ -17015,8 +17467,8 @@
 $.uP=!0
 $.n7="objects/"
 $.To=null
-$.Dq=["A3","A8","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cs","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","F6","FL","FV","Fr","Fv","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Md","Mh","Mi","Mm","Ms","Mu","My","NC","NZ","Nj","O","OP","OZ","Ob","Om","On","PM","PN","PQ","PZ","Pa","Pk","Pv","Q0","QE","QI","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vp","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","aZ","an","at","az","b1","bA","bF","bS","ba","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","ff","fk","fm","g","gA","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBP","gBW","gBb","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gE7","gE8","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHq","gHu","gI","gID","gIF","gIK","gIW","gIt","gJ0","gJQ","gJS","gJf","gJo","gJy","gKK","gKM","gKU","gKV","gKx","gLA","gLY","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gN7","gNF","gNG","gNh","gNl","gO3","gO9","gOL","gOc","gOe","gOh","gOl","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQb","gQg","gQr","gQt","gR","gRA","gRH","gRY","gRd","gRn","gRu","gSB","gSR","gT8","gTq","gU4","gUL","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVE","gVa","gVe","gVl","gWA","gWT","gX3","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","gdW","gdt","ge6","geH","geT","geb","gey","gf0c","gfN","gfY","gfc","gfg","gfn","ghU","ghf","ghi","gho","gi9","giC","giO","gig","gik","giy","gjA","gjL","gjO","gjT","gk5","gkF","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","glb","glc","glh","gm2","gmC","gmH","gmm","gn9","gnN","gng","gnv","gnx","gnz","go6","goE","goY","goc","gor","gp8","gpD","gpQ","gph","gq3","gqO","gqe","gqn","grK","grM","grU","grZ","grs","grz","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtp","gts","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gwl","gx","gx8","gxA","gxX","gxj","gxr","gxw","gy","gy4","gyH","gyT","gys","gyw","gz1","gzP","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","kk","l5","lj","lp","m","mK","n","nC","nH","ni","nq","oB","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","rW","ra","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBP","sBW","sBb","sCO","sCY","sCd","sCj","sE7","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHq","sHu","sID","sIF","sIK","sIt","sJ0","sJQ","sJS","sJf","sJo","sJy","sKK","sKM","sKU","sKV","sKx","sLA","sLY","sLn","sLx","sM0","sM5","sMB","sMj","sN","sN7","sNF","sNG","sNh","sNl","sO3","sO9","sOc","sOe","sOh","sOl","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQb","sQr","sQt","sR","sRA","sRH","sRY","sRd","sRn","sRu","sSB","sT8","sTq","sU4","sUL","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sVe","sWA","sWT","sX3","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","sdW","sdt","se6","seH","seT","seb","sfN","sfY","sfc","sfg","sfn","shU","shf","shi","sho","siC","sig","sik","siy","sjA","sjL","sjO","sjT","sk5","skF","skG","skU","skW","skc","skf","skg","skp","slb","slc","slh","sm2","smC","smH","sn9","snN","sng","snv","snx","so6","soE","soY","soc","sp8","spD","spQ","sph","sq3","sqO","sqe","srM","srU","srZ","srs","srz","st0","st5","stD","stN","stT","stY","sts","suD","suw","svH","svL","svk","svt","swd","sx","sxA","sxX","sxj","sxr","sxw","sy","sy4","syT","sys","syw","sz1","szW","szZ","szf","szg","szh","szj","szt","szw","t","tZ","tg","tn","tt","u","u8","uB","ub","vQ","vV","w","wE","wL","wY","wg","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yl","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY"]
-$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.zw1,B.d1,{created:B.t4},C.xFi,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.JR},C.tf,A.Zt,{created:A.fg},C.pkU,Q.JG,{created:Q.Zo},C.GTO,A.F1,{created:A.aD},C.jRs,F.Be,{created:F.Fe},C.P9,N.oO,{created:N.Qm},C.P0k,V.lI,{created:V.fv},C.hG,A.ir,{created:A.G7},C.aj,U.fI,{created:U.Ry},C.UrY,X.kKl,{created:X.jD},C.cK,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.Wz},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.cNA,B.NG,{created:B.b4},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.pI,A.fl,{created:A.Du},C.OdR,O.pL,{created:O.pn},C.ix,R.HF,{created:R.qa},C.wE,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.wH,D.Kz,{created:D.N5},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.ew},C.FU,R.lw,{created:R.fR},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.JA3,H.b0B,{"":H.UI},C.piC,D.nk,{created:D.dS},C.qY,A.wM,{created:A.lT},C.BP,L.qkb,{created:L.uD},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.ri,W.yy,{},C.hI,F.Ir,{created:F.TW},C.LF,K.xT,{created:K.an}]
+$.Dq=["A3","A8","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cs","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","Kn","LI","LV","Ly","Md","Mh","Mi","Mm","Ms","Mu","My","NZ","Nj","O","OP","Ob","Om","On","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","QI","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","aZ","an","at","az","b1","bA","bF","bS","ba","br","bu","cO","cU","cn","ct","d0","dR","dd","du","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","ff","fk","fm","g","gA","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBP","gBV","gBW","gBb","gBs","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE7","gE8","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gHu","gI","gID","gIF","gIK","gIW","gIZ","gIr","gIt","gIu","gJ0","gJQ","gJS","gJb","gJf","gJo","gJy","gKK","gKM","gKU","gKV","gKx","gLA","gLY","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gN7","gNF","gNG","gNT","gNW","gNh","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQV","gQb","gQg","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gSB","gSR","gSw","gT8","gTS","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVa","gVe","gVl","gWA","gWT","gX3","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZf","ga3","ga4","gai","gbG","gbP","gbV","gbY","gbx","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","gig","gik","giy","gjA","gjJ","gjL","gjO","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkg","gkp","gl0","glb","glc","glh","gm2","gmC","gmH","gn9","gnN","gng","gnv","gnx","gnz","goE","goY","goc","gor","gox","goy","gp8","gpD","gpQ","gph","gq3","gqO","gqe","gqn","grK","grM","grU","grZ","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","guD","guw","gvH","gvt","gwd","gwl","gx","gx8","gxA","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gz1","gzP","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hT","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","mK","n","nC","nH","ni","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rW","ra","rh","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBP","sBV","sBW","sBb","sBs","sCO","sCY","sCd","sCj","sDe","sE7","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sHu","sID","sIF","sIK","sIZ","sIr","sIt","sIu","sJ0","sJQ","sJS","sJb","sJf","sJo","sJy","sKK","sKM","sKU","sKV","sKx","sLA","sLY","sLn","sLx","sM0","sM5","sMB","sMj","sN","sN7","sNF","sNG","sNT","sNW","sNh","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQV","sQb","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSw","sT8","sTS","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sVa","sVe","sWA","sWT","sX3","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sa3","sa4","sai","sbG","sbP","sbV","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","sig","sik","siy","sjA","sjJ","sjL","sjO","sjT","sjv","sk5","skF","skU","skW","skc","skg","skp","slb","slc","slh","sm2","smC","smH","sn9","snN","sng","snv","snx","soE","soY","soc","sox","soy","sp8","spD","spQ","sph","sq3","sqO","sqe","srM","srU","srZ","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","suD","suw","svH","svt","swd","sx","sxA","sxX","sxj","sxr","sxw","sy","sy4","syG","syT","syX","sys","syw","sz1","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vQ","vV","w","wE","wL","wY","wg","x3","xU","xW","xc","xe","xo","xx","y0","yM","yN","yc","yl","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY"]
+$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.zw1,B.d1,{created:B.t4},C.xFi,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.JR},C.tf,A.Zt,{created:A.fg},C.pkU,Q.JG,{created:Q.Zo},C.GTO,A.F1,{created:A.aD},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.P0k,V.lI,{created:V.fv},C.aj,U.fI,{created:U.Ry},C.UrY,X.kKl,{created:X.jD},C.cK,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.Wz},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.cNA,B.NG,{created:B.b4},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.raB,D.fl,{created:D.N5},C.OdR,O.pL,{created:O.pn},C.ix,R.HF,{created:R.qa},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.ew},C.FU,R.lw,{created:R.fR},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.JA3,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.qY,A.wM,{created:A.lT},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.leN,R.Lt,{created:R.fL},C.ri,W.yy,{},C.hI,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
 I.$lazy($,"globalThis","DX","jk",function(){return function() { return this; }()})
 I.$lazy($,"globalWindow","cO","C5",function(){return $.jk().window})
 I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
@@ -17077,7 +17529,7 @@
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(o) { this.o = o; }})
 I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
-I.$lazy($,"_pageSeparationColor","fM","mI",function(){return[0,0,0,255]})
+I.$lazy($,"_pageSeparationColor","RD","eK",function(){return[0,0,0,255]})
 I.$lazy($,"_loggers","DY","U0",function(){return H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,N.TJ])})
 I.$lazy($,"_logger","G3","iU",function(){return N.Jx("Observable.dirtyCheck")})
 I.$lazy($,"objectType","XV","aA",function(){return P.re(C.nY)})
@@ -17115,11 +17567,11 @@
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().call$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(C.uE),new M.Uf()).zV(0,", ")})
+I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.Uf()).zV(0,", ")})
 I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
 
 init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.JB,P.AN,P.JB,null,P.MN]},"self","parent",{func:"UW",args:[P.JB,P.AN,P.JB,{func:"NT"}]},{func:"wD",args:[P.JB,P.AN,P.JB,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.JB,P.AN,P.JB,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.JB,P.AN,P.JB,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.JB,P.AN,P.JB,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.JB,P.AN,P.JB,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JB,P.AN,P.JB,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.JB,P.AN,P.JB,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.JB,P.AN,P.JB,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.JB,args:[P.JB,P.AN,P.JB,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","nativeImageData","imageData","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","imagedata","dx","dy","dirtyX","dirtyY","dirtyWidth","dirtyHeight","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newNodes","refChild","newChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.zM,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:J.O},{func:"lrq",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","label","row","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"root","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Ds,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Vfx,D.kx,{func:"bR",ret:D.kx},{func:"FH",args:[D.kx]},F.Dsd,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.tuj,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","at","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","id","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"VG",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"UC",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"Dt",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"HE",ret:J.im,args:[J.im,J.im]},"byte","buffer","xhr","header","shouldAdd","prevValue","selector","stream","max",F.Vct,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.D13,H.Tp,A.WZq,U.T5,N.pva,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.im,args:[[P.QV,J.im]]},"color",{func:"S1",void:true,args:[J.im,J.O,[P.QV,J.im]]},"classId",{func:"D8",void:true,args:[null,J.im]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.im],args:[J.im]},{func:"D9",ret:J.O,args:[[P.hL,J.im]]},"point",{func:"Dp",ret:J.im,args:[[P.hL,J.im]]},{func:"j4",void:true,args:[J.im]},"startPage",O.cda,"response","st",{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.waa,{func:"iR",args:[J.im,null]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V4,D.t9,J.GW,G.XN,{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V9,D.bv,D.V10,"tagProfile",P.tU,L.Lr,L.V11,{func:"cH",ret:J.im},{func:"r5",ret:J.Q},Z.V12,M.V13,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V14,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V21,{func:"a7",void:true,args:[J.O,null,null]},{func:"nxg",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"YI",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.AN,P.JB]},{func:"TB",args:[P.JB,P.AN,P.JB,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"Ym",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V22,A.qe,D.rj,{func:"ls",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Yg",ret:J.O,args:[D.c2]},U.V23,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"JC",args:[V.qC]},{func:"dtC",ret:[P.QV,D.bv]},{func:"m3",ret:J.GW},{func:"Uu",args:[J.GW]},"isolateId","mapIsRef","newIsolates","counters","old_counters",[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"profile","codeTable",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"c7",ret:V.qC},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V24,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V25,{func:"nR",ret:Z.uL},U.V26,Q.pv,"details",Q.Nr,V.qC,K.V27,X.V28,"y","instanceRef",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"Gm",args:[J.Q]},D.pD,{func:"AfY",args:[D.zM]},U.V29,];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isSuperCall","stubName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"ny"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.JB,P.AN,P.JB,null,P.MN]},"self","parent",{func:"UW",args:[P.JB,P.AN,P.JB,{func:"ny"}]},{func:"wD",args:[P.JB,P.AN,P.JB,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.JB,P.AN,P.JB,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.JB,P.AN,P.JB,{func:"ny"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.JB,P.AN,P.JB,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.JB,P.AN,P.JB,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JB,P.AN,P.JB,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.JB,P.AN,P.JB,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.JB,P.AN,P.JB,J.O]},"line",{func:"kx",void:true,args:[J.O]},{func:"Nf",ret:P.JB,args:[P.JB,P.AN,P.JB,P.aY,P.Z0]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","nativeImageData","imageData","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","val",{func:"bh",args:[null,null]},{func:"Za",args:[J.O,null]},"parameter",{func:"np",args:[null,J.O]},G.dZ,D.zM,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:J.O},{func:"lrq",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event",J.im,[J.Q,G.Y2],[J.Q,J.O],D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Ds,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Vfx,{func:"bR",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},F.Dsd,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",R.tuj,{func:"ZT",void:true,args:[null,null,null]},R.LP,"library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},{func:"lv",args:[P.wv,null]},"typeArgument","tv","i",{func:"VG",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"UC",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},"reflectiveName",{func:"ag",args:[J.O,J.O]},{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each","k",{func:"Yz",ret:J.kn,args:[P.jp]},"matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"Dt",ret:J.im,args:[J.im]},"digit","part",{func:"GF",ret:J.im,args:[null,null]},"byteString",{func:"HE",ret:J.im,args:[J.im,J.im]},"byte","buffer","xhr","header","prevValue",F.Vct,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.D13,H.Tp,R.Nr,A.WZq,U.qe,{func:"fO",ret:J.O,args:[D.SI]},N.pva,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.im,args:[[P.QV,J.im]]},"color",{func:"S1",void:true,args:[J.im,J.O,[P.QV,J.im]]},"classId",{func:"D8",void:true,args:[null,J.im]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.im],args:[J.im]},{func:"D9",ret:J.O,args:[[P.hL,J.im]]},"point",{func:"Dp",ret:J.im,args:[[P.hL,J.im]]},{func:"j4",void:true,args:[J.im]},"startPage",O.cda,"response","st",{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.waa,{func:"iR",args:[J.im,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[J.O]}]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V4,D.t9,J.GW,G.XN,{func:"Ta",ret:J.O,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V9,D.bv,D.V10,P.tU,L.Lr,L.V11,"tagProfile",Z.V12,M.V13,"rec",{func:"IM",args:[N.HV]},Z.uL,A.V14,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V21,{func:"Z8",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"YI",ret:J.kn,args:[J.O]},A.xc,{func:"B4",args:[P.AN,P.JB]},{func:"TB",args:[P.JB,P.AN,P.JB,{func:"Dv",args:[null]}]},{func:"cH",ret:J.im},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.yj]]},"onName","eventType",{func:"rj",void:true,args:[J.O,J.O]},{func:"Ym",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"pair","p",{func:"YT",void:true,args:[[J.Q,T.yj]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item",3,{func:"qo",args:[U.hw]},Q.V22,D.rj,[J.Q,D.c2],{func:"ls",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[J.Q,D.c2]},{func:"oe",args:[[J.Q,D.c2]]},{func:"Yg",ret:J.O,args:[D.c2]},T.V23,A.rs,U.V24,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"JC",args:[V.qC]},{func:"dtC",ret:[P.QV,D.bv]},{func:"m3",ret:J.GW},{func:"mV",args:[J.GW]},"isolateId",[P.Z0,J.O,J.GW],{func:"c7",ret:V.qC},{func:"zs",ret:J.O,args:[J.O]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V25,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V26,{func:"nR",ret:Z.uL},U.V27,Q.pv,"details",Q.Bc,V.qC,K.V28,X.V29,"y",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"Gm",args:[J.Q]},D.pD,{func:"AfY",args:[D.zM]},U.V30,];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js.map b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js.map
index 0e1d9fa..4399908 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js.map
+++ b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js.map
@@ -1,7 +1,7 @@
 {
   "version": 3,
   "sourceRoot": "",
-  "sources": ["file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/interceptors.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_rti.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_array.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/iterable.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/sort.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_number.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_string.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/regexp_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/isolate_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/queue.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/collection_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/timer.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/native_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/core_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/string_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/constant_map.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/symbol.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/chart.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/logging/logging.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/application.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/change_notifier.dart","file:///Users/turnidge/dart/dart-sdk/lib/js/dart2js/js_dart2js.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/location_manager.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/dart2js/html_dart2js.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/view_model.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/index.html_bootstrap.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/loader.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/breakpoint_list.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/instance.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable_map.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/class_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/class_view.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/uri.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/code_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/code_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/collapsible_content.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/curly_block.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/custom_element/polyfill.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/future.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/lists.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/list.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_mirrors.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/linked_hash_map.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_names.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/async_error.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/schedule_microtask.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/async_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream_controller.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/broadcast_stream_controller.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream_impl.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream_pipe.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/duration.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/zone.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/internal_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/future_impl.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/hash_map.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/iterable.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/maps.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/collections.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/hash_set.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/list.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/splay_tree.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/convert_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/convert/json.dart","file:///Users/turnidge/dart/dart-sdk/lib/convert/utf.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/comparable.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/errors.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/string.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/exceptions.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/list.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/print.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/annotations.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/bool.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/date_time.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/expando.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/null.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/object.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/string_buffer.dart","file:///Users/turnidge/dart/dart-sdk/lib/convert/codec.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/conversions.dart","file:///Users/turnidge/dart/dart-sdk/lib/svg/dart2js/svg_dart2js.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/filtered_element_list.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/isolate_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/jenkins_smi_hash.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/math.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/math_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/point.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/rectangle.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/mirrors_patch.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/collection/src/unmodifiable_wrappers.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/collection/wrappers.dart","file:///Users/turnidge/dart/dart-sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_primitives.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/error_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/eval_box.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/to_observable.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/field_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/field_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/function_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/service_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/function_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/heap_map.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/heap_profile.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/observatory_element.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/device.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/css_class_set.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/instance_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/instance_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_profile.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_summary.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/json_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/library_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/library_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/nav_bar.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/observatory_application.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/service_html.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/service/object.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/change_record.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/compound_path_observer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/dirty_check.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/list_diff.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable_list.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable_box.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/path_observer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/boot.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/declaration.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/template_binding.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/node_binding.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/job.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/deserialize.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/polymer_expressions.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/tokenizer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/parser.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/eval.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/visitor.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/async.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/expression.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/src/globals.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/src/mirrors.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/response_viewer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/script_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/script_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/service_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/sliding_checkbox.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/stack_frame.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/stack_trace.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/input_bindings.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/instance_binding_map.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/template.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/template_iterator.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/input_element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/node.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/select_element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/text.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/text_area_element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/vm_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/vm_view.dart"],
-  "names": ["getInterceptor","makeDispatchRecord","getNativeInterceptor","initNativeDispatch","lookupAndCacheInterceptor","int","map","findInterceptorConstructorForType","findIndexForNativeSubclassType","findConstructorForNativeSubclassType","bool","Primitives","String","dynamic","invocation","Type","getRuntimeTypeString","length","IterableMixinWorkaround","Iterable","list","E","List","_rangeCheck","Lists","_doSort","a","Iterator","iterable","factory","b","isNegative","num","roundToDouble","double","allMatchesInStringUnchecked","Match","string","other","substring","stringReplaceAllUnchecked","pattern","_isWhitespace","regExp","_match","stringContainsUnchecked","static","_callInIsolate","isolate","_globalState","weakPorts","_addRegistration","entry","rootContext","computeThisScriptD8","_deserializeMessage","msg","_add","events","workerIds","_serializeMessage","fillLiteralMap","_log","print","supportsWorkers","_visited","_Manager","isWorker","fromCommandLine","topEventLoop","isolates","managers","mainManager","pauseCapability","pauseTokens","isPaused","_length","delayedEvents","_head","_table","_tail","_grow","_modificationCount","isolateStatics","code","message","addPause","removePause","RawReceivePortImpl","ports","_updateGlobalState","id","_IsolateEvent","dequeue","event","next","runIteration","_runHelper","fn","context","mirrorFunctionCacheName","mirrorInvokeCacheName","replyTo","topLevel","_isolateId","_receivePort","_workerId","_receivePortId","_isClosed","_handler","_id","visitSendPort","port","visitCapability","x","SendPort","Capability","operator","tagged","traverse","isPrimitive","visitPrimitive","_dispatch","visitList","visitMap","visitObject","copy","Map","_nextFreeRefId","_serializeList","result","deserialize","_deserialized","_deserializeHelper","_deserializeList","_deserializeMap","deserializeSendPort","deserializeCapability","deserializeObject","dartList","keys","values","_inEventLoop","_handle","_once","TimerImpl","convertDartClosureToJS","callback","value","match","handleError","digitsPart","source","name","getRuntimeTypeInfo","joinArguments","objectTypeName","array","_current","_fromCharCodeApply","stringFromCodePoints","receiver","positionalArguments","arguments","namedArguments","function","functionNoSuchMethod","info","data","defaultArguments","iae","ioore","wrapException","toStringWrapper","JS","throwExpression","unwrapException","saveStackTrace","nsme","notClosure","nullCall","nullLiteralCall","undefCall","undefLiteralCall","nullProperty","undefProperty","undefLiteralProperty","object","invokeClosure","JS_CALL_IN_ISOLATE","functionCounter","forwardCallTo","functions","forwardInterceptedCallTo","cspForwardCall","computeFieldNamed","selfFieldNameCache","cspForwardInterceptedCall","BoundClosure","closureFromTearOff","Closure","property","interceptedTypeCast","propertyTypeCastError","RuntimeFunctionType","RuntimeType","Object","getRuntimeTypeArguments","substitute","getRuntimeTypeArgument","getTypeArgumentByIndex","type","onTypeVariable","_contents","runtimeTypeToString","invokeOn","areSubtypes","isSubtype","computeSignature","isFunctionSubtype","names","areAssignable","areAssignableMaps","getTagFunction","alternateTagFunction","makeLeafDispatchRecord","patchInteriorProto","makeDefaultDispatchRecord","initNativeDispatchFlag","initNativeDispatchContinue","dispatchRecordsForInstanceTags","interceptorsForUncacheableTags","initHooks","tags","prototypeForTagFunction","applyHooksTransformer","haystack","needle","_nativeRegExp","regexp","Maps","_throwUnmodifiable","V","_jsObject","containsKey","_keys","f","_map","Symbol","_memberName","mangledNames","unmangledName","_kind","_arguments","_namedArgumentNames","_getCachedInvocation","_internalName","symbol","memberName","throwInvalidReflectionError","isIntercepted","cachedInterceptor","jsFunction","interceptor","requiredParameterCount","computeFunctionRti","functionType","setRuntimeTypeInfo","namedArgumentList","matchTypeError","_pattern","_argumentsExpr","_expr","_method","_receiver","_message","JsNoSuchMethodError","_trace","_exception","closure","_self","_target","receiverFieldNameCache","CastErrorImplementation","RuntimeError","_extractFunctionTypeObjectFrom","toRti","returnType","parameterTypes","listToRti","optionalParameterTypes","namedParameters","extractKeys","rti","argument","UnimplementedNoSuchMethodError","_unmangledName","_typeName","get","_nativeGlobalRegExp","makeNative","_nativeAnchoredRegExp","_nativeGlobalVersion","_nativeAnchoredVersion","_execAnchored","_MatchImplementation","_re","_string","_regExp","Logger","_api","Isolate","__$isolate","set","notifyPropertyChangeHelper","ServiceObject","__$response","__$args","locationManager","ObservatoryApplication","_initOnce","_chart","props","options","table","__$currentHash","hashChangeEvent","_tryResume","_wrapZone","setDefaultHash","requestCurrentHash","window","currentHash","parts","_app","_expanded","onShow","onHide","expanded","rows","root","row","_collapse","_librariesToLoad","_useDirtyChecking","i37","ServiceMap","__$msg","notifyPropertyChange","BreakpointListElement","ClassRefElement","__$cls","Future","cls","_uriEncode","ClassViewElement","CodeRefElement","Code","__$code","CodeViewElement","__$iconClass","__$displayValue","_collapsed","_refresh","CollapsibleContentElement","__$expanded","__$busy","__$callback","doneCallback","CurlyBlockElement","js","customElements","_isReady","document","combine","_toStringList","from","otherList","dst","src","_insertionSort","_dualPivotQuicksort","compare","action","elementAt","test","fold","_iterable","_endOrLength","_start","_startIndex","_endIndex","SubListIterable","_index","_f","T","_iterator","_source","_currentExpansion","_takeCount","_remaining","_skipCount","SkipIterable","_name","toString","s","InstanceMirror","TypeMirror","mangledGlobalNames","reflectClassByName","mangledName","JsCache","classMirrors","reflectClassByMangledName","originalDeclaration","referent","fields","superclassName","mixins","reflectMixinApplication","typeVariables","method","ClassMirror","it","ownerClass","findTypeVariableIndex","typeVariable","getTypeArgument","reflectClass","owner","JSArray","splitFields","fieldSpecification","fieldsMetadata","key","_cachedLibraries","librariesByName","library","_splitRe","libraries","_prettyName","_getField","LibraryMirror","currentJsMirrorSystem","_isRoot","computeQualifiedName","simpleName","n","_invoke","DeclarationMirror","_functionMirrors","_cachedClasses","_classes","__functions","__variables","setterSymbol","mirror","reflect","__members","_jsFunction","_cachedFunctionMirrors","_functions","_globalObject","_cachedFields","parseCompactFieldSpecification","_compactFieldSpecification","_cachedFunctions","_cachedGetters","_cachedSetters","_cachedVariables","_fields","_cachedMembers","__classes","__getters","__setters","_cachedDeclarations","_cachedMetadata","_metadata","Function","addToResult","_cachedSimpleName","superclass","mixin","superName","reflectee","_classInvocationCache","reflectiveNames","reflectiveName","cacheEntry","_getterCache","_getFieldSlow","_newProbeFn","_newInterceptedGetterFn","_newGetterFn","objectHashCode","Error","typeArguments","_class","_typeArguments","_cachedTypeArguments","addTypeArgument","_cachedMethods","_cachedConstructors","filterConstructors","_methods","filterMembers","__constructors","JsLibraryMirror","_superclass","typeMirrorFromRuntimeTypeRepresentation","typeInformation","_cachedSuperinterfaces","_mangledName","typeArgument","tv","_jsConstructorOrInterceptor","_jsConstructor","isReflectiveDataInPrototype","reflectionName","_getMethodsWithOwner","_fieldsDescriptor","_fieldsMetadata","_getFieldsWithOwner","_cachedMethodsMap","filterMethods","_owner","reflectType","JsMirrorSystem","extractMetadata","__methods","_getSuperinterfacesWithOwner","_cachedTypeVariables","_type","_metadataFunction","_jsName","isFinal","descriptor","fieldInformation","field","fieldCode","accessorName","MethodMirror","callName","_parameters","metadata","_returnType","_parameterCount","ownerType","isConstructor","optionalParameterCount","parameter","formals","raw","isStatic","isGetter","_setField","isSetter","isOperatorName","metadataList","JsFunctionTypeMirror","_cachedReturnType","_typeData","_cachedParameters","_cachedToString","_throw","errorHandler","zone","_nextCallback","_lastCallback","_asyncRunCallbackLoop","_createTimer","Zone","_previous","_next","notificationHandler","_runUserCode","onSuccess","userCode","onError","subscription","future","_cancelAndErrorClosure","Timer","_duration","self","ZoneCallback","ZoneUnaryCallback","ZoneBinaryCallback","_scheduleAsyncCallback","printString","printToZone","_BroadcastStreamController","_eventState","_state","_Future","_doneFuture","previous","_removeListener","_callOnCancel","_addEventError","_sendData","_sendError","_ensureDoneFuture","_sendDone","_addStreamState","addState","_runGuarded","_onCancel","_forEachListener","link","computation","_FutureOnValue","_onValueCallback","_FutureErrorTest","_errorTestCallback","_onErrorCallback","_FutureAction","_whenCompleteActionCallback","_registerErrorHandler","_addListener","_resultOrListeners","_AsyncError","_zone","listener","current","_chainFutures","_removeListeners","_setValue","_propagateToListeners","_setError","_complete","_asyncComplete","target","internalFuture","asyncError","_propagateMultipleListeners","handleValueCallback","handleWhenCompleteCallback","_completeError","errorCallback","completeResult","Stream","_cancelAndValue","StreamSubscription","_controller","_onListen","otherStream","_onData","_onError","_onDone","_pending","_guardCallback","_onPause","lastPendingEvent","_onResume","_cancelFuture","_cancel","_addPending","pending","_checkState","sendError","sendDone","_createSubscription","_BufferingStreamSubscription","dispatch","error","stackTrace","_DelayedEvent","scheduleMicrotask","handleNext","firstPendingEvent","_cancelAndError","sink","_subscription","_stream","_ForwardingStreamSubscription","_handleData","_handleError","_handleDone","_test","_transform","_TakeStream","_SkipStream","_degelationTarget","parent","_errorZone","otherZone","run","handleUncaughtError","runUnary","runBinary","registerCallback","registerUnaryCallback","registerBinaryCallback","copiedMap","HandleUncaughtErrorHandler","RunHandler","RunUnaryHandler","RunBinaryHandler","RegisterCallbackHandler","RegisterUnaryCallbackHandler","RegisterBinaryCallbackHandler","ScheduleMicrotaskHandler","CreateTimerHandler","PrintHandler","ForkHandler","ZoneSpecification","_rootHandleUncaughtError","_rootFork","_rootRun","_rootRunUnary","_rootRunBinary","_rootScheduleMicrotask","_rootCreateTimer","_toStringVisiting","_iterablePartsToStrings","ultimateString","penultimateString","m","_strings","_nums","_rest","_findBucketIndex","_computeHashCode","_computeKeys","_newHashTable","_addHashTableEntry","_setTableEntry","_removeHashTableEntry","_getTableEntry","_validKey","_hashCode","_equals","_CustomHashMap","K","_offset","cell","_newLinkedCell","ifAbsent","_unlinkCell","_last","_first","_modifications","LinkedHashMapCell","last","_LinkedCustomHashMap","_cell","_computeElements","bucket","_elements","add","element","_set","LinkedHashSetCell","iterator","buffer","isEmpty","_iterableToString","setRange","setAll","queue","_writeToList","_nextPowerOf2","_remove","ListQueue","_queue","_position","_end","_root","_dummy","_compare","tmp","right","left","_splayCount","_SplayTreeNode","_splay","_count","_splayMax","node","_comparator","mapRoot","_addNewRoot","tree","nodes","visit","SplayTreeMap","_currentNode","_getValue","_workList","_tree","_findLeftMostDescendent","currentNode","_SplayTreeIterator","_convertJsonToDart","revive","walk","_parseJson","cause","JsonUnsupportedObjectError","JsonCyclicError","_reviver","decoder","_JsonStringifier","_toEncodableFunction","encoder","JsonEncoder","JsonDecoder","seen","stringifyJsonValue","toEncodable","escape","checkCycle","stringifyValue","stringifier","charCodes","sb","Converter","_buffer","_bufferIndex","str","_writeSurrogate","fixedList","expires","millisecondsSinceEpoch","isUtc","lazyAsJsDate","fourDigits","twoDigits","threeDigits","DateTime","duration","re","parseIntOrZero","parseDoubleOrZero","Duration","inMinutes","inSeconds","sixDigits","inMicroseconds","StackTrace","ArgumentError","RangeError","FallThroughError","_namedArguments","NoSuchMethodError","UnsupportedError","UnimplementedError","StateError","modifiedObject","ConcurrentModificationError","variableName","CyclicInitializationError","_getKey","_keyCount","_currentCodePoint","_nextPosition","objects","write","StringBuffer","host","_writeAuthority","_host","_port","scheme","_normalize","pathSegments","base","path","_hasDotSegments","output","userInfo","ss","_path","query","fragment","uri","Uri","_makePath","_makeScheme","_eitherOf","_parseIntOrZero","_makeHost","_makeQuery","_makeFragment","parseIPv6Address","isSchemeLowerCharacter","isSchemeCharacter","queryParameters","component","decodeHexDigitPair","isNormalizedHexDigit","isUnreserved","fillResult","normalizeHexDigit","bytes","parseHex","parseIPv4Address","canonicalTable","byteToHex","_schemeLowerTable","_schemeTable","_unreservedTable","isLowerCaseHexDigit","part","hex","Device","request","xhr","loadEvent","errorEvent","completer","_createElement","e","WindowBase","_DOMWindowCrossFrame","EventTarget","_convertNativeToDart_XHR_Response","convertNativeToDart_AcceptStructuredClone","_callConstructor","_callEnteredView","_callLeftView","_callAttributeChanged","_ElementFactoryProvider","_wrapBinaryZone","CanvasRenderingContext2D","_putImageData_2","convertDartToNative_ImageData","_dartDetail","DocumentFragment","Element","Node","ElementList","_querySelectorAll","querySelector","_docChildren","children","CssClassSet","Rectangle","clientLeft","clientTop","clientWidth","clientHeight","offsetLeft","offsetTop","offsetWidth","offsetHeight","_localName","elem","ShadowRoot","ElementEvents","ElementStream","changeEvent","clickEvent","inputEvent","mouseMoveEvent","_convertNativeToDart_EventTarget","Events","_initMouseEvent_1","_convertDartToNative_EventTarget","Point","_clientX","_clientY","point","override","_call","parentNode","_this","nodeValue","_rows","Location","_isDartLocation","_location_wrapper","_ensureRequestAnimationFrame","_convertNativeToDart_Window","_postMessage_2","_convertDartToNative_PrepareForStructuredClone","top","width","height","SpeechInputResult","SpeechRecognitionResult","_childElements","_element","toList","_nodeList","_elementList","_FrozenElementList","_ptr","webkitEvents","responseText","OptionElement","remove","attributes","_matches","Set","_elementCssClassSetIterable","_elementIterable","modify","_modifyWithReturnValue","_MultiElementCssClassSet","prevValue","classname","_eventType","_targetList","_useCapture","pool","_unlisten","_pauseCount","_subscriptions","stream","_StreamPool","close","_eventTypeGetter","_list","_array","_createSafe","_window","_cssClassSet","_childNodes","_convertDartFunction","_callDartFunction","_convertToJS","_toMangledNames","o","_getJsProxy","_getOwnProperty","createProxy","_defineProperty","_wrapToDart","JsObject","_getDartProxy","_convertToDart","args","_convertDataTree","_convert","_convertedObjects","convertedList","_checkRange","index","callMethod","_lo","_hi","_nextState","_Random","y","finish","currentMirrorSystem","_base","abstract","_invalidIndex","_checkIndex","_checkSublistArguments","_setRangeFast","__$error","ErrorViewElement","__$text","__$lineMode","evalType","ObservableList","__$results","text","_toObservableDeep","results","targetElement","EvalBoxElement","FieldRefElement","__$field","FieldViewElement","__$qualified","__$ref","refMap","__$hasParent","__$hasClass","FunctionRefElement","__$function","FunctionViewElement","PixelReference","_data","_dataIndex","__$status","__$fragmentation","shadowRoot","_fragmentationCanvas","_handleMouseMove","_classIdToName","_classIdToColor","_colorToClassId","_packColor","classList","member","rng","_addClass","_fragmentationData","_pageHeight","fragmentation","pages","_addressAt","_updateClassList","convertNativeToDart_ImageData","_createImageData_1","_renderPages","HeapMapElement","_updateFragmentationData","__$profile","GoogleChart","_fullChart","_newPieChart","_oldPieChart","_combinedChart","_draw","profile","_fullDataTable","_combinedDataTable","_classHasNoAllocations","_fullTableColumnValue","_combinedTableColumnValue","_newPieDataTable","heap","_oldPieDataTable","v","_updateChartData","formattedAverage","formattedTotalCollectionTime","formattedCollections","HeapProfileElement","cleanupSlots","ImageData","nativeImageData","imageData","userAgent","_isOpera","isOpera","_isWebKit","copies","readSlot","writeSlot","date","findSlot","readClasses","writeClasses","_filtered","removeRange","el","ref","expandEvent","done","InstanceRefElement","__$instance","instance","InstanceViewElement","childNode","ProfileCodeTrieNodeTreeRow","columns","formatPercent","percent","codeCaller","ProfileCallerTreeRow","__$callGraphChecked","__$hideTagsChecked","__$sampleCount","__$refreshTime","__$sampleRate","__$sampleDepth","__$displayCutoff","totalSamples","now","displayThreshold","_update","refresh","_buildCallersTree","_buildStackTree","colors","IsolateProfileElement","IsolateRefElement","IsolateSummaryElement","IsolateViewElement","__$json","json","JsonViewElement","LibraryRefElement","__$library","LibraryViewElement","Level","_level","_rootLevel","_getStream","level","fullName","LogRecord","log","_loggers","loggerName","main","c","rec","initPolymer","NavBarElement","__$link","__$anchor","__$last","NavMenuElement","NavMenuItemElement","__$active","__$label","refreshDone","NavRefreshElement","TopNavMenuElement","IsolateNavMenuElement","LibraryNavMenuElement","ClassNavMenuElement","__$devtools","__$app","ObservatoryApplicationElement","_zeroPad","frame","file","ObservatoryElement","_changes","observed","unobserved","_records","hasObservers","deliverChanges","oldValue","newValue","_observers","_value","_started","_scheduleResolve","_subs","observer","_resolve","_scheduled","_computeValue","sub","start","_delivering","_allObservables","toCheck","debugLoop","_logger","_allObservablesCount","enqueueDirtyCheck","dirtyCheckObservables","wrapCallback","wrapUnaryCallback","distances","old","math","edits","arr1","arr2","_sharedPrefix","_sharedSuffix","splice","_spliceOperationsFromEditDistances","_calcEditDistances","ops","splices","record","_unmodifiableRemoved","_addedCount","removed","_mergeSplice","records","_createInitialSplices","calcSplices","obj","_mirror","_values","_listChanges","_recordChange","_notifyChangeLength","_listRecords","deliverListChanges","projectListSplices","isInsert","isRemove","notifyChange","_getObjectProperty","_maybeHasGetter","_hasMethod","_maybeHasSetter","_safeSuperclass","validate","_pathRegExp","_isValid","_updateValues","_segments","_setObjectProperty","_observePath","_observeIndex","PathObserver","computeValue","_isPathValid","_updateObservedValues","_changeRecordMatches","_preventFlashOfUnstyledContent","style","head","_veilElements","Polymer","_ready","_waitSuper","w","_getPublishedProperties","meta","_hasSetter","getter","platform","shadowCss","sheet","jsSheet","_sheetLog","_typesByName","_waitType","waiting","_forNodeTree","child","attr","originalPrepareBinding","_shadowHost","_findMethod","receiverMirror","scope","_requestAnimationFrame","_getCoreType","dirtyCheckZoneSpec","dirtyCheckZone","_initPolymerOptimized","_registerCustomElement","_loadLibraries","customElementsReady","_loadLibrary","_discoverScripts","scripts","_rootUri","reference","_removeDotSegments","_merge","uriPath","_loaderLog","lib","_maybeInvoke","PolymerDeclaration","_super","templateBind","nodeBindFallback","waitingForType","waitingForExtendee","_supertype","_declarations","publishAttributes","_publish","_publishLC","_lowerCaseMap","inferObservers","accumulateInstanceAttributes","addAttributeDelegates","_eventDelegates","cacheSheets","cacheStyles","installLocalSheets","cssTextToScopeStyle","cssTextForScope","_shimShadowDomStyling","templateContent","registered","registerType","_notifySuper","extendee","decl","superDecl","attrs","_getProperty","_instanceAttributes","findNodes","_sheets","_styles","_cssTextFromSheet","content","sheets","styles","StyleElement","_observe","properties","registerWhenReady","blackList","delegates","matcher","MirrorSystem","_eventTranslations","prepareElement","localName","_declaration","observeProperties","copyInstanceAttributes","takeAttributes","addHostListeners","_preparingElements","parseDeclarations","cancelUnbindAll","asyncUnbindAll","declaration","parseDeclaration","elementElement","lightFromTemplate","shadowFromTemplate","_shadowRoots","syntax","append","marshalNodeReferences","createShadowRoot","applyAuthorStyles","$","attributeToProperty","propertyForAttribute","_inferPropertyType","publishLC","serializeValue","NodeBinding","_bindLog","inA","reflectPropertyToAttribute","bindings","_unbound","_unbindLog","_unbindAllJob","unbindAll","job","_timer","complete","_propertyObserver","unregisterObservers","_unbindNodeTree","observe","observeArrayValue","changes","notifyPropertyChanges","valuePairs","_observeLog","unregisterObserver","_eventsLog","addNodeListeners","hostEventListener","_reverseEventTranslations","dispatchMethod","_invokeMethod","nodeBind","publish","pair","_findController","ctrlr","p","isOptional","_node","_sub","_lastValue","_property","_observer","_PolymerBinding","_propertyValueChanged","PolymerElement","polymerCreated","stop","_callback","_typeHandlers","handler","JSON","def","prepareBinding","_tokenizer","_tokens","_advance","_parseExpression","isSemanticTemplate","prepareInstanceModel","globals","_converter","assign","_scope","_Binding","expr","vars","StreamBinding","op","filters","ident","notAssignable","l","eval","__modelMirror","model","_variables","getMemberMirror","_modelMirror","memberMirror","_updateSelf","_invalidate","_parent","visitExpression","visitInExpression","visitEmptyExpression","visitParenthesizedExpression","visitGetter","g","visitIndex","i","arg","visitInvoke","visitLiteral","visitMapLiteral","visitMapLiteralEntry","visitIdentifier","visitBinaryOperator","visitUnaryOperator","invoke","accept","entries","_UNARY_OPERATORS","_BINARY_OPERATORS","receiverValue","identifier","call","EvalException","_JenkinsSmiHash","Index","Invoke","_listEquals","_hashList","entryValue","item","_token","Expression","_astFactory","_parseUnary","_parsePrecedence","_parseArguments","_parseIndex","_makeInvokeOrGetter","_parseBinary","_parsePrimary","_parseInvokeOrIdentifier","_parseString","_parseInteger","_parseDecimal","_parseMapLiteral","MapLiteral","Literal","IndexedValue","Mirror","classMirror","kind","tokenizeString","tokenizeIdentifierOrKeyword","tokenizeNumber","tokenizeFraction","_OPERATORS","_TWO_CHAR_OPS","_PRECEDENCE","_GROUPERS","_sb","_KEYWORDS","ParseException","ResponseViewerElement","__$line","ScriptRefElement","Script","__$script","__$showCoverage","script","showCoverageChanged","line","ScriptViewElement","_upgradeObservableMap","_upgradeObservableList","ServiceObjectOwner","VM","_serviceType","__$name","__$vmName","_loaded","reload","immutable","vm","update","_isolateCache","__$version","__$architecture","__$uptime","_currentObjectMatcher","_currentIsolateMatcher","_parseIsolateId","_parseObjectId","_getIsolate","_cache","getAsMap","getString","_updateIsolates","isolateMap","oldIsolateCache","newIsolateCache","__$pausedOnStart","__$pausedOnExit","__$running","__$idle","codeTable","codeRegion","_resetProfileData","_updateProfileData","profileTrieRoot","_processProfileTrie","_processCoverage","coverageList","coverage","__$rootLib","ObservableMap","__$topFrame","__$mainPort","__$entry","__$newHeapUsed","__$oldHeapUsed","__$newHeapCapacity","__$oldHeapCapacity","__$fileAndLine","_upgradeCollection","timers","timerMap","CodeTrieNode","_trieDataCursor","_trieData","_readTrieNode","__$totalSamplesInProfile","exclusiveTicks","inclusiveTicks","__$formattedInclusiveTicks","__$formattedExclusiveTicks","callers","callees","addressTicks","scriptCoverage","timer","canCache","__$kind","__$message","_url","_shortUrl","_processSource","load","hits","scriptHits","sourceLines","lines","address","tick","CodeKind","__$objectPool","calls","codes","profileData","_resolveCalls","_processTicks","vmName","startAddress","endAddress","_processDisassembly","instructions","__$hasDisassembly","disassembly","profileTicks","_sumCallCount","_callCount","caller","count","_isServiceMap","HttpRequest","HttpVM","_outstandingRequests","_requestSerial","DartiumVM","messageEvent","_messageHandler","__$object","objectChanged","_constructElementForObject","ServiceObjectViewElement","__$internal","url","hoverText","ServiceRefElement","__$checked","__$checkedText","__$uncheckedText","input","SlidingCheckboxElement","__$frame","StackFrameElement","__$trace","trace","StackTraceElement","_checkboxEventType","_InstanceBindingMap","_getBindings","_SEMANTIC_TEMPLATE_TAGS","_createInstanceBindingMap","templateBindFallback","_processBindings","_addMapBindings","_getTreeScope","_parseAttributeBindings","_parseMustaches","tokens","delegateFn","bound","_MustacheTokens","delegate","NodeBindExtension","_expando","_eventSub","_getStreamForInputType","nodeValueChanged","conditional","select","selectBinding","div","checkbox","fired","InputElement","_getAssociatedRadioButtons","checkedBinding","treeScope","radios","SelectElement","_cancelMutationObserver","_tryUpdateValue","_onMutation","_toInt","_bindings","binding","TemplateBindExtension","_scheduleIterator","_stagingDocument","_ownerStagingDocument","_deepCloneIgnoreTemplateContent","_addTemplateInstanceRecord","BindingDelegate","_bindingDelegate","_decorate","_templateInstanceRef","_content","_templateIsDecorated","_injectStylesheet","_extractTemplateFromAttributeTemplate","templateElementExt","doc","_getOrCreateTemplateContentsOwner","_liftNonNativeChildrenIntoContent","bootstrap","stagingDocument","clone","template","_contentsOwner","d","_bootstrap","descendents","_initStyles","_ext","_model","_combinator","_singleCombinator","_listCombinator","resolve","depsChanging","_valueSub","hasRepeat","hasBind","_valueChanged","repeatModel","bindModel","repeatPath","bindPath","hasIf","ifModel","ifPath","valueObserver","iteratedValue","unobserve","_listSub","_handleSplices","_templateExt","terminators","subIter","getTerminatorAt","instanceNodes","_templateElement","previousTerminator","_BoundNodes","closed","_initPrepareFunctions","_instanceModelFn","_instancePositionChangedFn","instanceCache","extractInstanceAt","insertInstanceAt","closeInstanceBindings","valueFn","r","unbind","TextAreaElement","_pathSub","valueChanged","VMRefElement","__$vm","ServiceError","VMViewElement","globalThis","globalWindow","globalWorker","globalPostMessageDefined","thisScript","computeThisScript","noSuchMethodPattern","extractPattern","provokeCallErrorOn","notClosurePattern","nullCallPattern","nullLiteralCallPattern","undefinedCallPattern","undefinedLiteralCallPattern","nullPropertyPattern","provokePropertyErrorOn","nullLiteralPropertyPattern","undefinedPropertyPattern","undefinedLiteralPropertyPattern","validationPattern","_dynamicType","_voidType","computeLibrariesByName","computeMangledNames","computeReflectiveNames","_safeConsole","_DART_OBJECT_PROPERTY_NAME","_DART_CLOSURE_PROPERTY_NAME","_freeColor","_pageSeparationColor","objectType","_spacesRegExp","_objectType","bindPattern","_polymerSyntax","veiledElements","_libs","_allTemplatesSelectors"],
-  "mappings": "A;A,a,kB;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,C,I,C,Y,C,C,G,C,a,C,G,C,oB,C,G,C,Y,C,G,C,Q,C,G,C,iB,C,G,C,Q,C,G,C,c,C,G,C,gB,C,G,C,kB,C,G,C,a,C,G,C,iB,C,E,C,M,C,G,C,iB,C,G,C,iB,C,G,C,M,C,G,C,U,C,G,C,S,C,G,C,O,C,G,C,gB,C,G,C,c,C,G,C,S,C,G,C,U,C,G,C,G,C,G,C,S,C,G,C,qB,C,G,C,O,C,G,C,Q,C,G,C,gB,C,G,C,a,C,G,C,gB,C,G,C,Y,C,G,C,Y,C,G,C,kB,C,G,C,Q,C,G,C,kB,C,G,C,Y,C,E,C,O,C,G,C,W,C,G,C,a,C,G,C,Y,C,G,C,U,C,G,C,kB,C,G,C,M,C,G,C,W,C,G,C,M,C,G,C,O,C,G,C,gB,C,G,C,Y,C,G,C,W,C,G,C,W,C,G,C,S,C,G,C,U,C,G,C,M,C,G,C,Q,C,G,C,kB,C,G,C,a,C,G,C,e,C,G,C,S,C,G,C,iB,C,G,C,a,C,E,C,G,C,G,C,M,C,E,C,G,C,G,C,oB,C,G,C,a,C,G,C,gB,C,G,C,S,C,G,C,S,C,G,C,gB,C,G,C,S,C,G,C,sB,C,G,C,S,C,G,C,kB,C,G,C,Y,C,G,C,a,C,G,C,Y,C,G,C,Q,C,G,C,Q,C,G,C,gB,C,G,C,Q,C,G,C,U,C,G,C,c,C,G,C,S,C,G,C,W,C,G,C,a,C,G,C,S,C,G,C,Y,C,G,C,Y,C,G,C,Y,C,G,C,K,C,G,C,c,C,G,C,iB,C,G,C,a,C,G,C,M,C,G,C,Q,C,G,C,M,C,G,C,O,C,G,C,c,C,G,C,c,C,G,C,gB,C,G,C,U,C,G,C,U,C,G,C,Y,C,G,C,c,C,G,C,O,C,G,C,I,C,G,C,a,C,G,C,c,C,G,C,oB,C,G,C,S,C,C,I,C,kB,C,C,E,C,yB,C,E,C,qB,C,E,C,iB,C,E,C,kB,C,G,C,yB,C,E,C,c,C,G,C,oB,C,E,C,gB,C,G,C,0B,C,E,C,kB,C,E,C,yB,C,E,C,sB,C,E,C,Y,C,E,C,qB,C,E,C,a,C,E,C,oB,C,E,C,e,C,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A,E,mB,uB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,O,C,C,A,E,iB,qB,A,A,C,C,C,C;A,G,C,E,C;A,C,C,CAuDAA,YAOE,cACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAUAC,kBAiCE,+BAEF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAWAC;;0BAKMC;kCAKO;UAEW;UACD;;SAGjB;gBASM,KAAA,+CAIQC;WAEhB,WAGF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CA2BAC;;WACqD;GAEnD;MAAwBC,sBAAF,AAAJ;GACP,MAAGA,MACV,SAEJ,AACA,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC;EACcC;WACO;;;EAEF;8BAAjB;MAAOF,MACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQAG;EACcD;WACO;;;EAEY;8BAE/B;MAFqBF,SAGvB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CA2DEI,cAAwB,aAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEjDL,YAAiB,MAAGM,SAA+B,A,C;A,E,C,CAEnDC,YAAkB,MAAGD,SAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEpDE,mBACQ,KAAA,OAEFC,QACAA,QACAA,eACN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAC,YAAqB,gBChEPC,cDgE8B,A,C;A,K,C,I,C;A,G,C,4I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAU5CJ,YAAkB,iBAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAIrDP,YAAiB,uBAA2C,A,C;A,G,CAE5DU,YAAqB,YAAO,A,C;A,O,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CAa5BL,cAAwB,eAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGjDE,YAAkB,aAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAE3BP,YAAiB,SAAI,A,C;A,G,CAErBU,YAAqB,YAAO,A,C,C;A,E,C,C;A,G,C,K,C;A,G,CAwC5BV,YAAiB,SAAI,A,C;A,G,CAErBU,YAAqB,YAAW,A,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,K,C,C;A,C,C,C;A,G,C,U,C;A,C,C,CEnRhC,uCAJU;UAOV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAWA,mBAEY,KAAa,EAAEE;yBApBjB;gBAyBV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA,yCA3BU,iBA6BRC;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAaAR;yBA3CU,cA6CR;QAAkB,EAAE,gBACN,KAAR,sBAEF;SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYAS,cACE,kCACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMA,mBACE;MAAA,QAAA,OACE,SADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,YACEF,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,cACE,MAAOC,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC,cACE,uCACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAP;EACsB;;mBACpB;QAAkB,EAAE,oBACL;uBAAbQ;OACF,AACA,iBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAUAD,cACE,MC6xBO,qBD5xBT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA0BAE,uDACE;MAAO,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC;GAGY,KAAa,EAAEL,cACjB,KAAA,SAA+BA;aAG/BA;;GAGE,KAAe,EAAEA,cACjB,KAAA,SAAiCA,oBAGzB,2BAClB;sCAEF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAE,gBC0xBEI,WDzxBA;MC2xBO,kBD1xBT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CAEAF,eACa,AAAPJ,WAAY,MAAO;mCAEzB,A,C;A,G,CAEAI,kBACMJ;GAAO,IAAK,MAAO,GAAY;mCAErC,A,C;A,E,C,CAQA;yBAlLU;EAoLa;;GACX,UAAa,cACf,KAAA;;GAEA,UAAe,cACf,KAAA;oCAERO;aAI0B;oCAC1B;UAA6B,GAAO,MACtC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,+CAzMU,iBA2MRN;gBACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAYAR,cAA4B,MAAGQ,WAAoC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMnE,yCA9NU,YE9CRO;SAAuB,AAATC,cF+QhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAMArB,gBACE,MCosBOmB,YAAoCJ,UDnsB7C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAf,gBACE,MCqsBOmB,UADgC,AAAZJ,YDnsB7B,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAV,mBACE;QAAkB,EAAEO,gBACN,KAAR,QAAkB,QACxB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAP,YAAiB,MAAGO,cAAW,A,C;A,G,CAE/BP,YAAoB,MAAG,AAFHO,cAEW,A,C;A,E,C,CAE/BL,YAAkB,MAAGM,iBAAwD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAE7EI;KAEI;;mBAEA;UAEJ,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,CAIAK,YAAyB,uBCjCaC,8BDiCe,A,C;A,G,CAErDvB,YAAiB,MAAGM,SAA+B,A,C;A,E,CAEnDN,YAAe,gBAAoC,A,C;A,E,CAEnD;GAEgB;yBAxQN;WA2QV,A,C;A,C,C,CAEAgB;GAEY,GAAGJ,UAAgB,SAAW,KAAA,OACxC;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,2CAzRU;;GA4RE,GAAGA,UAAgB;OAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,O,C,I,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAvVAY;2CAGkC,SACxB,KAAA;;mBAER;SACF,A,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C,C;A,C,C,C;A,G,C,S,C;A,E,C,CGVAxB;;GAEW,IACP;QACc,IACd;2BAGqByB;GACfC,gBAA2B;GAC3BA,YAAY,QAChB;SAEF,8BAEID,YACF,QAEF;cAEA,SAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEApB,YAAoB,aAA4B,AAAR,MAAmB,IAAG,A,C;A,G,CAE9DA,YAAe,gBAAgC,A,C;A,G,CAO/CA,YAAkB,mBAAmC,A,C;A,E,C,CAErDsB,cAGE,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASA3B;GACW,gBAAsB,cAC7B;kBA0B8B,8BAvB9B;gBAGI,KAAA,WACR,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKAA,YAAY,MAAG4B,SAAAA,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMtCC,eACW,IACP;KAEA,qBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAmBAtB;GAG2C,UACjC,KAAA;;UAGSmB,YAAY,WAC7B;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA8BAnB,iBAEY,KAAa,UAAY,KAAA,QACnC;qBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAA,4BAEI;KAEA,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAP,YAAiB,oBAAoC,A,C;A,C,C,CAErD2B,YAAiB,SAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE1CA,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA;;;SAImB;GACN,IAAK;GACU,IACxB,MAAc;KAEd,MAAc,KAElB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAIAA,uCAE6C,OAAe,OACxD;6CAEA;MAYK,eAVT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA,cACE,sBAEM,aACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAYAA,iBAE4B,0BAC1B;uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA,cAGE,uBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA;GAG4B;GAKE;OAMwB;WAVpD,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA;GAC8B;OAMwB;WANpD,SAOF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAmBAA,2DAEE;gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAOAA,0CAC2B,KAAA,OACzB;gBACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAtB,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,M,C,I,C;A,M,C,C,G,C,S,C,C,C;A,E,C,C;A,G,C,Q,C;A,G,CA4EAK,YAAqB,YAAM,A,C;A,S,C,I,C;A,M,C,I,C;A,M,C,I,C,C;A,E,C,C;A,G,C,W,C;A,G,CAO3BA,YAAqB,YAAS,A,C;A,S,C,I,C;A,M,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,K,C,C;A,C,C,C;A,G,C,Y,C;A,C,C,CC1X9BV,6DAC2B,KAAA;GACf,SAAW,KAAA;GACX,GAAGY,cAAc,KAAA,OAC3B;uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAE,cAEE,MAAOgB,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC;GACY,KAAa,EAAEC,cACjB,KAAA,SAA+BA;EAE3B;EAAcA;GAAF,AAAd,MAA+B,MAEzC;QAAkB,WACY;GAjBpB,SAAW;GACX,UAAiB;;GAAjB,UAAiB;GAgBQ,oBAC/B,OAEJ,AACA,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,C,C,CAEAzB,0CAC8B,KAAA,OAC5B;WACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAF;EAEoB4B;EACArB;GAAF,IAAU,QAC1B;WAAgBsB,UAAiB,KACnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA3B,gBAEE,MAAO4B,aACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAiBAlB,cAGI,kBAOJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAZ;GAEyB,EAAE,cACjB,KAAA,SAA+B;0BAKhB,EADH4B;GAEL,EAAErB,SAAQ,QACvB;4BAEF,MAA0C,AAAnCwB,mBACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA7B;+CC27BQ;aDz7B2BK;+CCy7B3B;;GDv7BS,cAAY,KAAA;GACZ,cAAkB,KAAA;GACpB,OAAEA,eAAc,KAAA,OAC7B;wBACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAL,YACE,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAmEAA,yBAKE;MAAoB,aAAF,SAtKR,UAAiB;;mBA0KrB8B;WAKN,SAC+B,QAK/B;kBAC0C;GAvLhC,SAAW;GACX,UAAiB;;mBAyLrBA,oBAKN,gBACgD,QAChD;wBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMArC;;GAGY,KAAa,EAAE,cACjB,KAAA,SAA+B;uBAGrC;;+CEjBGsC,SFsBH;kBE5EkCC,WF8EpC,MAAyB,aAAH,YACe,AAA/BH,kBAAwC,QAC9C,AACA;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEApC;EAGYY;0BAQIqB;;EAAe;GAAF,AAAf,QACY,GAEtB;;GAEF;;KAAsB;GACe,AAA/BG,kBAAwC,aAC9C,AACA,SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/B;GAEmC,EAAE,cAC3B,KAAA,SAAoC,UAE5C;MAAOmC,aACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,E,C,C,C,C,C;A,G,CAEAnC,YAAiB,MAAGO,cAAW,A,C;A,G,CAE/BP,YAAoB,MAAG,AAFHO,cAEW,A,C;A,E,C,CAE/BZ;;;eAEE;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAO,YAAkB,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAQzBP,qBAIE;MAAoBY,iBAAF,WACE,UAAQ;EACR,UAAQ,GAAuB,AAAA,CAAR;QAE3C,EACkB,UAAQ,GAAuB,AAAA,CAAR;QAEzC;MAAkB,WAAQ,GAAuB,AAAA,CAAR,kBAC3C,A,C;A,G,CAEAF,YAAqB,YAAS,A,C;A,E,CAE9BV,YAAe,gBAA+B,A,C;A,C,C,CAE9CO;GAEY,GAAGK,UAAgB,SAAW,KAAA,OACxC;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,S,C,I,C;A,M,C,C,E,C,CA/KA6B,eAGe,iFAUP;QAEA,mNAuBF;QAEA,UAEN,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C,A,E,mB,uB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CGnJFC,oBACeC,SACbC,AAAAA;wBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAcA;;;;GAIMA,yBAAuB;;EA8KZA,IAAAA;KAA0B;EAGE;EAGhB;;2BAQQ,aAML,0BAiF5BC;QACAC;SAlRFF;qBAMAA;;;EAEIG;KACFC;OACSD;KACTC;KAEAA,UAEFJ,AAAAA,yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6ZEH;GAEoB,QAChB;mEAEmB,MAAOQ;yDACF,qBAC1B;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAMAR;;;gBAa6B,KAAA;GAaf,QAAS;;GAOT,QAAS;KAEf,KAAA,0CACR,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAaAA;EACYS;;OACFC,8BAEJP,oBAAgCO;EACVA;UAEhBP;EAEKO;EACGD,KAAoBC;EACjBA;EACHD,KAAoBC;;EA5UzBP,IAAAA;KAA0B;EAGE;EAGhB;;2BAQQ,aAML,0BAiF5BC;QACAC;SC0NwBM,AD/LxBC,AA6MIT;2EASAA;qBACAA,AAAAA;;;qBAGaO;EAAqBA;EACrBA;EAAaA;EACbA;EAAmBA;;;;;EAqLrBP,IAAAA;KAA0B,GAEzCU;eACAV,AAAAA;;cACuCW,KFm6BlCC,yCE55BUD,uBAEJA,yCF05BwB;;iBEvlCtB,AAFOJ,oBAGdA,KAAAA,cAAiBA,aAEnBP,AAAAA;;;YAGAA,AAAAA,yBAA6BU;aAE7BV,AAAAA;;;UAGAa,KAAKN;;eAGDP,4BACFA;EACIW,KFukCLC,iCAA8B,gCExkC7BZ;;yBAGAc,KAAMP;;iBAIFA,KAAAA;UAEZ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGAV;GACMG,4BACFA;EACIW,KFyjCDC,+BAA8B,gCE1jCjCZ;;4DAGA;;KAGQ,KAAA,UAGZ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA0VFW;GA9yByBI,kDAk0BKC;mBAlB1B;MAAO,oCA8CeA;mBA5CtB;MAAO,UAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAV,eAvzByBS,yBAyzBrB,MAAO;KAGP,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAkMElB,YACE,+EACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6FAA,YACE,+EACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAxrCmB,WAAKM,kBAAW,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEhB,WAAKA,uBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,4C,C;A,E,CA8GzCc;;;gBAeEC;;QAFoC,SAIgB;SADpDH;SAEAI;WAAsC,EAhBtCC;iBA4KkC,kBA3KlCC;QAAW,8BACXC;QAAW;GACPJ,0BACFK;;;;yCAGJ,A,C,C;A,E,C,C;A,G,C,mC,C;A,E,C,CAoEA,iBACsB,CAAA,AAAhBC,eAAqC;GACrCC,AAAAA,gBAA2B,CAACC,QAC9BA,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;GACM,CAACA,QAAU;EACfD,OAAAA;;GEunCkBE,UFrnChB,MAAMC,UP+DU5D,SAEG,sBOjEb4D;EACkBA;EA+F1BnB,AA9FIT;EC4RK6B;EAAcC;EAAAA;EAAH,CAAA,AAAL,IAAsB,QAArCD;;mBAAuBC,SACvBA;;OACaC,KAAOC,MACpBC;KAAkB,AAAlBA,OD9RE,AACAP,YAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA9D;EACYoC,mBACVA;;EAauBkC;;MATZC,mBAETnC;GACQ,UAMakC,QAJvB,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMA;OACUE,sBAEJC,QAASD,SAAYA;;aAGrBE,QAAYF;;QAGZtB,iCAEN,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAyB,YAAsC,MAAGC,AAAAA,gBAAa,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEtD,oBACMA;GAAAA,aACI,KAAA,sDAERA;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBAC,iBAE0BC;GADY,AAAnB,AE8LDf,AF9LZa,WE+iCYb,AF/iCG1B,aACjBD,AAAAA;KAEAA,AAAAA,4BAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CAyBA2C;EACMlC;EC8CcoB;OAASE,KD9CP,MCkMpBE;KAAkB,AAAlBA;EACWH;;cAAAA;EAAAA,IACXA;SACAD;KAAoB,CAAA,AAAL,IAAsB,QDpMrC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAmBApE;EACgBmF;eAjBe,AAAzB5C,2BACGA,AAAAA,uBAAkCA,AAAAA,yBAClCA,0BEyJW2B,AFxJX3B,AAAAA,mCAQC;;GApKJkB,WEoTcS,AFnTXN,aACAD,AAAAA,eACLG;EAAwBZ,KFi8CrBC,yBAA8B,gCEj8CjCW;;oBA2KA,SAEFsB,MACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMA,cACmB,aAMfC;KAGA,KAAOC,YAAiB,CAE5B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKA;GACM,AAAC/C,yBACHgD;SAGEA,qBADF;;;EAGEhD;EAAqCW,KFovCpCC,kDAA8B,gCEpvC/BZ;;qBAIN,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAzBI,cACM,CAAC+C,YAAgB,MGnUzB;gBHqUE,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,C,CAiCJ,cACMhD,AAAAA,eACFA,AAAAA,AAAAA,wBACA;OAEFA,KAAAA,QAAakD,SACf,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,M,C,CAoHiD;;;;EAzgBdjD;EA6qBJkD,IF/Q7BC;KAAwB,YACxBC;KAAsB,YEgRtBC;gCACcH,KAmMqBlD,AAAAA,wBAlMrBkD;GACV,YACFI;;EACSA;KACTA;OACSA;KACTA;KAEAA,aA9KE,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,E,C,CAmPN;;EAEwCC;EAAtBvD,AAAAA;WACK;EACjBwD;GAAAA,QAAwB;EASwB,AAA5BxD,2BACc,AAA/BA,AAAAA;;SAGCW;GAEJZ,aACFA,SACA;SAEFC;mBC1RwBQ,AD/LxBC;4CAieF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEAhD;;QAA4B;iDACV,KAAb+F,QAAgBnE,MAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAExCjC,YAAiB,MAAGoG,MAAAA,SAAgB,A,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAbS;EACpCA;GAAD,CAACA;IAEKlD,UAERkD,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,C,CAkBF;EACwB7C,KFq0BjBC,+CAA8B;GEh0B/BZ,0BAGFA,AAAAA;2BAG2BA,AAAAA,wBAAsByD;GACrC,0BAIhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEAhG;;QACE;iDACe,KAAVgG,QAAapE,OACF,KAAXkE,QAAclE,OACC,KAAfqE,QAAkBrE,MACzB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAEoB,KAAVqG;EAA+B,KAAXF;EAAmBG;6BAAAA,OAA/C;MAA6C,CAAA,AAApB,WAC3B,A,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA2BA;GACMC,QAAW,MACfA;UACAC;;EACA5D;EAAuC6D,OA5jBvCrB,AAAAA;YACAvC,AAAAA;YACAwC;OA2jBF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,iBACMkB,QAAW,MACfC;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAmEAE,yBAC8B,kBAaR9D,oBAChB+D,KAAiBA,KAAAA;aAbK,kBAiBNA,KAAgBA,KAAiBA;6CAfvD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,yBAEI,oBAAsBC;kDAG1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAiBAH,yBAC8B,gBAaCC,KAAmBA;aAZtB,gBAiBtBA,KAAiCA,KAAjBA;6CAftB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,yBAEI,gBAAoCC;kDAGxC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAcAC;;EACkB/F;EACAA;EACIA;GAGN,OAAG6B,wBACDA,AAAAA;WACO;EACHD;WACO,MACzB;0BAEA,uBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAoE,YACE,gBAAoChG,WACtC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,C,C,CAOAiG,cACE,6CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAGA,gBACEC,AAAAA;wCAEF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,YAEEA,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA,oBACE;MAAyBA,AAAAA,mBAAiB,WACrBA;qBAAAA,SAAAA;8CACrB,AACAA,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CAoCAD,cAAuB,OAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAC9B,iBAAyC,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEzC,aAAe,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CACf,WAAA,OAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAWjBE;GACMC,QAAgB,MAAOC,WAC3BxD,AAAAA;;;MAGWyD,mBAETzD,AAAAA,aAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAyD;2EAGsB,MAAOD;;uEACZ,MAAOE;4CACR,MAAOC;4CACF,MAAOb;4CACL,MAAOE,WAG5B;MAAOY,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQAA,gFAGA,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAWAJ,YAAkB,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEtBnG;EACc2C,AAAAA;GACH,QAAS;;EAER7C;6BAAAA;;mBAIV6C,AAAAA;gBACA;mBAAkB,WACNyD,QAAUtG;uBAApB0G;OACF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC;;EACa9D,AAAAA;;GACF,QAAS;EAGX;KACPA,AAAAA;gBACA3D;wBAGA;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAyG,YAA0B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3DE,YAA8B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CARjD,0BACVa;cAAKJ,QAAkBA,SACzB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAaFD,YAAkB,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEtBE;EACe1D,AAAAA;GACF,QAAS;EAEX+D,OAAAA;QAAc,GACvB/D,AAAAA;gBAGA;gBAFcgE,YAGhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAL;EACe3D,AAAAA;GACF,QAAS;EAEX+D,OAAAA;QAAc,GACvB/D,AAAAA;gBAIA;eAHWgE,QAAe3H,KAAAA,WACb2H,QAAe3H,KAAAA,YAG9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA2H;;EACY7G;IAGG;;6BAHHA;GAIV;KAAkB,WACJsG,QAAUtG;8BAAtB8G;OACF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAnB,YAA0B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3DE,YAA8B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAa/DkB,eACMX,QAAgB,QAEpBY;QAAgB,8BAChB;MAAOC,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAA;2EACsB;;OAEZnB,sBAWCA,QAVK;MAWDkB,AAAAA;WAVE,MAAOE;UACR,MAAOC;eACF,MAAOC;iBACL,MAAOC;QACjB,MAAOC,aAEpB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CASApH;;EACW4F;EAEOA,QAChBkB,AAAAA;;;EACUO;6BAAAA;GACV;KAAkB,QAChBA,QAAcN,QAAmBM,UACnC,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAZ;EACe;;EACJb,QACTkB,AAAAA;;EACYlB;EACEA;;EACJ0B;6BAAAA;;GAEV;KAAkB,QAGhBV,MAFUG,QAAmBO,UACjBP,QAAmBQ,UAEjC,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAMAH,sDAGA,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CA8DA;;GAqBoD,uBAnB5CI,aACI,KAAA;EAEJC;WAAiB;EACrB9F,mBAAAA;KAA0C,AAA1CA;GACI+F;uBAKJD;uBAEM,KAAA,2BAEV,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAtEAE;oCAE2ChG;;MASvC8F;EAQA9F;EACIA,mBCjzBkBQ,AD/LxBC;+CAi/BEoF;;GAsDgD,sBA7ChD7F,mBAAAA;KAA0C,AAA1CA,MACA8F;qBAEaG,sCAIP,KAAA,+BAEV,A,C;A,M,C,C,E,CAvCAD;;SAuCA,A,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAnCI,WACEF,cACAI;gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAiBA,WACEJ;MACA9F,mBAAAA;KAA0C,AAA1CA,MACAkG;gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CA+DJ9I;EAIayG;;EACE;EAAc;6BAAA;EAAR;EACW,AAAhB,CAAN,AAAA,SAAc,AAAA;EAEJ,AAAL,CADR,CAAA,EAAQ;EAGQ,AAAR,CADR,CAAA,EAAQ,2BAGb;MADK,CAAA,EAAQ,YAEf,A,C;A,C,C,CAEApG;;YAC8B;;+CAEToG;EAAKxE,IAAtB;6BAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C,A,E,c,kB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CF33CF5B;GACa;GAEE,QAAS,iBAEtB;gDACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,C,C,CAEAE;uBACuB;2BAET,MAER,0BAGF;eAEA;gBAEA;EAEQwI;4BACgB,KAAA,OAC1B;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAoBA,iBACQ,KAAA,sGAER,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAqWEtG;;kBAME,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAIAA,iBACQ,KAAA,SACR,A,C,Q,C,I,C,C,C,C,C,E,C,E,C,C,C,C,C;A,E,C,CAEAA;;;;eAec;;GACY,AAAhBuG,WAEF;;GAEsB,AAApBA,WAEF,qBAEF;MAAOC;GAIC,KAAa,UACf,KAAA;GAEE;EAC+B,AAApBD;KAEjB;KAEQ;EAAQA;QAMN,MAImB,AAAR,OAOa,AAAL,AAAR;;EAEDA;;GACpB;YAAoBE;6BAAAA;KAAF,UACIA;;GACS,AAAzBA,WACF,MAAOD,iBAEX,cAIa,MAAOA,YAC1B;qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAxG;;;GASM,kFAIF,MAAOwG;;eAIOE;qCAEZ,QAEF;MAAOF,aAET,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAxG;OACwC9C;;;GAWxByJ,gBACLA;EAEeC,OAAxB;cAnBoBC,eAoBtB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA7G,YAEE,sBADc8G,YAEhB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAwDA9G;EAGY+G,QACV;MAEU,gBAFQ;OAMK;EAAY;oDAInC,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA/G;;;aJ3WsClB;8BI6WpC;KAAA,UJ3WekI;+CI4WQ,KAAA;GACf,SACJpI;QACW,YACXA,OAAa,OAA0B,AAAP,QAAX,kBACrBA;OAAa,OAAK,mBAEZ,KAAA,QAEV,AACA,MAAOqI,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAjH,mBACE;sBJ5XoClB,8BI4XpC,UJ1XekI;+CI2XQ,KAAA;GACf,SAAW,KAAA;GACX,QAAU,MAAOE,SACzB,AACA,MAAOD,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6CAjH;;;;;;;EAWsB;;aAUV,qBACA;;GAGA,UAAc;;qBAAO;mBAC/B,SACF,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAaAA,+CAGOmH,KAEL;cACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA+DAnH,+GAIE;YACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;OAKA,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;;;;;GAO0B,aACR,EAAGoH,QACjBC;;GAIiB,SAAW,CAACC,SAC7BA,uBAUF;MAAOC,mDAOT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAvH;;GAGqB,SAAW,CAACsH,YAGXpK;WAIhB,MAAOsK;EAGa;YACF,CAACC,KACnB,MAAOD;EAKe;EAKpBC;GAA4B,IAAGL,SACjC,MAAOI;EAGc,8BACvB;MAAoBC,OA9gB4BC,SA8gB9B,WACyB,GAGzCC;8CADgBF,YAElB,MAEAH;;OASE,MAAOE,YAGTJ;OAA2BO,SAC3B;;EAOc,EAAGP,QACjBC;;;WAUA,MACIG,YAKN;oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAxH,2BAG8C;YACH;eACG;YACH;aACC;aACA;aACA,WAC1C;0BACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAgBAA;UAOE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,C,C,CAcF4H,iBACQ,KAAA,QACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CASAC,yBACwBV;0CACHS;KACb,KAAA,QACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,C,C,CA6CAE;;;;;8BAoBE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAC,WAGE,MAAOC,0BACT,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAQAC;;;;;;QAEA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAgZAC;;WAgBkB;uBAC6B;wBAG3C,MAAOC;QACE,kBACT;;;EAgByB;IACa,AAAP,4CAO3B,MAAOA,UACH;4CAGJ;MAAOA;;;;;;;;;;;EAiCEC;GAA8B,QACzC,MAAOD,UAAe;OACJE;GAAoC,wBAMtD;MAAOF,UAAe,kBACJG;cACAC;cACAC;cACAC;cACAC;cACAH;cACAI;cACAC;EAA8C;6BAChE;MAAOT,qDAMT;MAAOA,2EM9kDyC,6BNolD9C,iBAMF;MAAOA,2IAQL,iBAOJ;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAwBA5K,2CAEI,MAAOsL;KAEP,MAAOhL,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAUAkD;UAKE;QAAa,WAC4B;EACE,GACzCqE;iBACF,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA0D;GAOwB,SACpB,MAAOC;QACoB,SAC3B,MAAOA;QACoB,SAC3B,MAAOA;QACoB,SAC3B,MAAOA;QACoB,SAC3B,MAAOA;UAED,KAAA,6DAGV,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMA3C;WACuB;;OAEa;wJElqDCjG;aFqrDnC;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA+CEH;;;;;EAmBqByH,AAFG;;;;;eA0CTuB;KAAe;;;;EAUxB;;EAKWC;;;;;;MA6Bf;MAAoBC,aAAF,WACLA;;GAEM,eAEMD;QAEzB,YAIA;SACF,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAjJ;iBAII;OAQA;OAQA;OAQA;OAQA;OAQA;QAQA,iFAQJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAIAA;KACqB,MAAOmJ;;uCAGxB,MAAOC;;cAgNcC,YAArBC;;MA1M6DN;KAAe,SAJ5E;iDAOW,MAAkB;;;cAuMRK,YAArBC;;MA7LSN;KAAe,SALxB;8CASA,MAAOI,WAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApJ;;;sBAOU,KAAA;OAEN;OAQA;OAQA;OAQA;OAQA;OAQA;QAQA,mIAUJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;;;uCAKI,MAAOuJ;oCAGkBC,2BACHA;MACTR;KAAe,SAH5B;sCAIW,KAAiB,wDAIlB;4CAKWQ,2BACHA;MACTR;KAAe,SANxB;yCASA,MAAOO,aAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAMFE;mBAME;MAAOC,qBAOT,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAoRA;KAIQ,KAAA,KAFc7L,QACE8L,SAAsBA,WAE9C,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA0CAC;kCAGgC1M;;KAC5B,QAEF2M;UACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA+LA,iBACQ,KAAA,kDAER,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6KAC,gBAGE,4BAKF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAC;YL19EsB5L,aK69ElB,kBAEF;0BACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAUA4L,WAAoC,YAA6B,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CNlwFjE9L,YAAoC,wBAAqB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6CzD+L,iBAGa,4BACX;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMApD,uBACsB,MACpB;0BACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAKAqD,cAGE,MAAOC,sBAAyBtD,SAClC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOAuD,sBACkBF,SAChB;yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGAG,oBACYxD,OACV;yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAmCA9I,yBAEI;6DAGA,wBAjBQ+I;6BAoBR;0DAGE,MAAOwD;KAEP,MAAOC;KAIT,OAEJ,A,C,uB,C,I,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOAxM;WAEqB;EAIG,QACtB;kBAAmC;KamEjCyM,KAA6CA;;Gb5DhC;EAGAC;8BayDbD;KAA6CA,ObxD/C,AACA,2BACF,A,C,uB,C,I,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAKAzM,8EA3EoDZ,8BA8ElD;SAAoB2J,gCACtB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAaAqD;gCA+YuCO;;+BAAAA,eA/XrC,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAcA7M;WACsB;EACJgJ;EAKE1J;cAGM,QAGxB;MAoDOwN,MAAYR,gBAnDrB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAiEAtM;oBAE8B;UAO5B;QAAkB,WACZ,CAAC+M,gBACH,QAEJ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMAC,gBAEE,MAAOH,UADaR,WAEtB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAmBArM;WACiB;WACA;EAGLgJ;EACN1J;;wBAeJ;MAAOyN,WACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAgCA/M;SAEyB;oBAEK;mBAiOM,2CA5NE;;WAEK;kBAGvC,MAAOiN,gDAKP;;;;;EAOSL;aA2MuB,qBAtMD;cACUA;GAOtC,aAA0C,GAC7C;;mBAGF;MA1JOE,MAAYR,aA2JrB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CASAtM;oBAE8B;WAEb;WAEA;;;SAQD,IAAW,iBAEX,MAAY,QAG1B;QAAkB;;GACZ,EA1BC+M,WAAmBA,WA2BtB,SAEJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA/M;WACiB;WACA;;;GAOf;MAAoBkN,aAAF,WACLA;oCAET;;;GAIE,EAjDCH,WAAmBA,WAiDS,SACnC,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA/M;GAgIoC,eA9Hc;mBA8Hd,2BA1H9B,iBA0H8B;;GArH5B,EAjEC+M,WAAmBA,WAiEqB;;;;;;;;GAsB5B,IAEjB;GAE0C,AAAzB,IACA,IAEjB;aAII,CAACI,aAAwD;GACzD,CAACA,aAEH,cAMF,QAAW;;GACL,EA5GDJ,WAAmBA,WA8GpB,SAEJ,AAKA,YAAY;;GACN,EAtHDA,WAAmBA,WAwHpB,SAEJ,AAIA,QAAY;;GACN,EA/HDA,WAAmBA,WAiIpB,SAEJ,CAOF,MAAOK,uBACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAhB,gBAGE,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CY3jBAlM,sBAOE;uDACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,C,CAEAP,YAAoC,MAAGM,SAAiC,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAKxE,+GAOA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA2EAP;EAEe2N;;GAKF,+HAAS;;GAEJ,QAAS;;cAMjBC;GACE;GAGK,+HAAS;;GAEJ,QAAS;wCAc3B;;;cAQSC;;sHAET;gCAKA;uBAIuBA;6IAAvB;sBAIA,MAAOC;gBAKD,KAAA;8BAMiBD;6IAAvB;gBAEA,MAAOC,WAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAYAA;;EAEejO;sHAEb;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C,C,C,C;A,E,C,CAGAgO,YAGE,MAAOhO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEAkO;2BAII,MAPKlO;KASL,MAAOA,qBAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,E,C,CAiBA,wBACsC,MACpCmO;OACAC;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAEA,4BAEEC;wBACAC;wBAEAC;;;;qCAUE;QAAkB,EAAEC,gBACRA;EACEC;GACF,WAEKP;GACF,gIAIf,CAKF,QAAkB,EAAEM;;EAIsB;EACP;EACJ;EACI;EACK,UAExC,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAsCA;;EAoBUE,UAJAA,UAFAA,UADAA,UADAA,UADAA,UAHAA;;;wBA0BJ,QAAkB;kCAKlB;;mBAQJZ;gBACAC;gBAEAU;iBAEF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAEAC,cAEE,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CE7YArN;;EAIesN;EACOC,QAEpB;eACiBD;eAIf1G;;EACwB;;aAItB,MAIJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEArF;uBAEI,MAA2C,AAApCoH;;+CAEeA;EP+BU6E,IO/BhC;sBAGA,MAAOxM,MAAAA,OADM2H,gBAGjB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAzH;2CAKQ;OAEsB;EACTyH,QACb/B;OACA;QAAkB,WACH+B;ED2K0BoD,MAA7CA;MAAAA;SCzKI,AACA,MDmLqBA,WC7KvB;;+CPlFe0B;aOsFjB;;wDAMJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,G,C,C;A,G,C,I,C;A,G,CCtGErO,YAAiB,MAAU,MAAPO,iBAAW,A,C;A,G,CAE/BP,YAAoB,MAAG,CAFI,KAAPO,iBAEW,A,C;A,E,C,CAE/BL,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAE3CC,gBACQ,KAAA,uCACR,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CACA,gBAAgC,MAAGA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEvDC,cAAgB,MAAGD,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CACvC,YAAa,MAAGA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CACpC,cAA6B,MAAGA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,c,C;A,E,C,CAepDvO,YACE,MAAOmI,AAAAA,uCACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAnI,mCACsB;mBACI,QACxB;MAAwByO,2BAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEAD,qCACsB;GAChB,CAACE,WAAkB,MACvB;MAAwBD,YAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cACEE,KAAAA,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAlO,YACE,2CACF,A,C;A,G,CAEAA,YACE,MAAO,MAAyBkO,kDAClC,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAzBoB,YAAU,MAAS,gBAAGR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,K,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAgB1B,YAAM,MAAGS,iBAAO,eAAS,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAQA,YAAM,MAAG,eAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CA4B1D3N,YAAyB,MAAG4N,MAAAA,AAAAA,YAAmB,A,C,C;A,E,C,C;A,G,C,qB,C;A,G,CTmC/CC;EACMC;;4CAAuB;EAEJC;GACL,WACTC;qBAAAA;EAAAA,kBAETF;SACA;SACF,A,C;A,G,CAGA/O,WAAkB,MAAGkP,aAAe,A,C;A,G,CACpClP,WAAkB,MAAGkP,aAAe,A,C;A,G,CAGpCtO;GAJqBsO,YAKL;EAEVC;EAAkB,AAAlBA,SAAoBC,AAAAA;SACA;IAExB;QAA2B,8BAHvBD,SAIFzO;OAASyO,MACX;iBACA;SACF,A,C;A,G,CAEA9H;GAd6B,AAAN6H,YAgBL,YA8/CX/L,QAA8B;EA7/CViM;EAAAA;EACMD;EAAkB,AAAlBA;SACF,YA2/CxBhM,QAA8B;EA1/CzB,8BACV;QAAkB,8BAJOiM;EAKgBA;EACC;0BALXD,SAI7BvP;kBACIuP,MACN,AACA,SACF,A,C;A,E,C,CAEAE;EACoB/P;EAEPgQ;EAO2C;;;;;2BUlHhBC,KV8HSC;;cAG7BlQ;;GAEH;;4BAUT,uBACFmQ,KU9IkCF,KV8IqBC;KAGvD,gBAsEO;KAnEP,8BAMF,mBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,M,C,C,G,C,U,C,C,C;A,E,C,C;A,G,C,iB,C;A,G,CAoCAxP,WAAwB,SAAQ,A,C;A,E,C,CAIhC6M;GAEM,CAAC6C,mEACoC;cAE3B;;EACRC;EAAkB;IAExB,MAAkCC,oBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAaA/C;EAIMhD;EAAAA;EAA4B,EAAEA;GAC9B,CAAC6F,oEAEuBjG;GAGE,MACZ,sBAGF;EACYA,uBAGd;;EACRkG;EAAkB;EACmB,AAAjBlG;OAEtBI,MACuB,SACnB,KAAA,wCACiCA,kBAC1BJ;QACkB,SACzB,KAAA,wCACiCI;QAER,SACzB,KAAA,wCACiCA,8CAGzC;QAAsC,QACpCJ,uBAA0BI,WAC5B,AACA;MAAkC+F,oBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,G,CAUA5P,WAAwB,SAAO,A,C;A,E,C,CAE/B6M,oBACkBgD,OAChB;MAAOtG,qBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CAwEA5J,oBACkBmQ;GAAF,IAA0B,MACxC;MAAiChG,gBAEnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAiG;EACyCC;sBACrC;uCAGAC;eAEA;wCAGM,KAAA,kCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA/P,WAA0B,MAAsC0P,yBAAW,A,C;A,M,C,C,G,C,a,C,E,CArD3EzO;;WAEoB;;;;;MAclB;qBAR0C,iBAKgB,eAM5D,A,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAge2B;kBAErB+O;cACAzG;;IACa,MACf,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmDuB;GACjBM,QACFA;iBAKJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,qB,C;A,E,C,CAgTJoG;aAE+BC;WACV;;EAEfjB;GAAW;EAGXkB;GAAe;EAGfC;GAAM;EAGNC;GAAQ;EAGRC;GAAU,wBAId;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,M,C,C,G,C,+B,C,E,C,CAsBApO;;;;;;;;6BA4CE;+OAMF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAMAA,YAmDE;;;;;;;KACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAkCAA,YASE;;;;;;KACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAsCAlC,kBACMqQ;WAAiB,wBAAoBE,QACzC;sDACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CAaAvQ;EACMqQ;WAAiB,gCAA4BE;EAC7CD;WACF,uDAAoDC,YAEtD;oEACOA,aACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAZAC;;;;uBAGuE,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAiBvExQ,kBAAqBuQ,OAAH;MAAGA,iCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAepElG;6FAOE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CAuIArK;EACMyQ;GAAO,QAAS;EAGoBC;;cAGjCD;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAwCqC,WAAG,MAAGE,iBAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEd,WAAG,MAAGA,uBAAY,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAElB,WAAG,MAAGA,8BAAkB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,M,C,CAExB,WAAG,MAAGA,yCAAwB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,M,C,CAE9B,WAAG,MAAGA,iDAA8B,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAuYzE3Q,YAAkB,gBAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,C,C,C;A,G,C,mB,C;A,C,C,CA0C9BF;;YAC8B;;0CACA,QAC5B;MACI8Q,WAAOlP,MACPmP,UAASnP,MACT4O,UAAW5O,KACjB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAEM6Q;aAGiBvQ,KAA0B6Q;OACA,oBAG1BN,QAIAvQ,OAErB;MAAwB,QAAEA,KAA0B8Q,UACtD,A,C;A,I,C,I,C;A,M,C,C,G,C,O,C,E,C,CAGA3O,YAAoC,MAAGyO,SAAa,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAKpDzO,YAAwC,MAAGyO,MAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAM5DzO;cAEyBqJ,YAArBC;OAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,E,C,CAIAtJ;cAE6BqJ,gBAAzBuF;OAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,E,C,CAGA5O;;;;GAIE;MAAoB8K,aAAF,WACLA;YAET,SAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C,C;A,E,C,C;A,G,C,M,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CA0YAhN,YAAkB,MAAGyE,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CAJ5BsM,qGAEkD,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAiDlD/Q,YAAkB,2BAAmByE,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAD7CuM,+BAA0B,A,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CA4B1BlR,kBAC2BmR,UACzB;kBAEMlE,OAAsCmE,WAC9C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAwCAD,kBACoB7R,MAClB;4CAGF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA8R;;EAzDmBC;;;sDAgEVA;EAGHC;GAAe,SAAW,AL13EZ/Q,oBK43EbgR;EAGDC;GAAuB,SAAW,AL/3EpBjR,mBKi4EbgR;EAGDE;GAAgB;EAEPC,OACX;MAAoBxJ,aAAF,WACLA;KACDkC,UAEZ,UAKF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAWAlK;EAGMoR;GAAe,QACjB,MAAoBA,wBAAF,gBACGA;;UAIrB;OAEEE;GAAuB,SAAW,ALv6EpBjR,gBK06ET,GAFgB,aAGvB;MAAoBiR,kBAAF,gBACGA;;UAIrB,cAESC;GAAgB,WAGlB,GAFgB;EAGZC,OACX;MAAoBxJ,kBAAF,gBACLA;;OAEDkC,iBAGZ,QAKF,MADO,gBAAUiH,UAEnB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,I,C,E,C,CAhDAjP;;IAGE;MAAoB1B,aAAF,eACYA,AAAAA,UAC9B,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA2EAR,YAAkB,gBAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAE9BkR,WAAQ,OAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAoEfA;EACyCrI;;2CAEvC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA7I,YAAkB,MAAG6I,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,e,C;A,E,C,CAUzBqI;EACMO;GAAI,QAAS;EAC4C5I;;;GACzDvB,gDAGJ;MAA6BiC,0BJllFOvI,8BIklFpC,cAC8B0Q,AJjlFfxI,UIklFf,AACOuI;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAzR,YAAkB,MAAK6I,aAAOU,KAAAA,kBAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAyFrDvJ,YAAkB,gCAA4BuQ,QAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAFvDoB,+BAA6C,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CN96F7C3R;EACM4R;GAAe,QAAS;EACgCC;;aAGrDD;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAGAnS,YAAiB,MAAGoS,MAAAA,SAAkB,A,C;A,C,C,CAEtC/R;;QACE;iDAAyC,KAAV+R,QAAanQ,MAC9C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CYqWiB,YAAI,iBAAsC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEvD,cAAgB,mBAAqD,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAErE,YAAa,iBAAsC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,G,CLvYvDoQ,iBACMC;GAAoB,QAAS;EAoBc7D;EAnBlB8D,2CAAtBD;SAAP;SAIF,A,C;A,G,CAEAD,iBACMG;GAAsB,QAAS;EAYY/D;EANhB8D,iDAAxBC;SAAP;SAIF,A,C;A,E,C,CA+BAzQ;;EAGsB0M;WAEL,MACf;MAAO,cACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEApO,oDACE;MAAgCoO,iBAClC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQA3N,cAEE,wBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAiB;EACkB0Q;;;WAGG,MACnB;MAAO,cACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA1Q;EACkB2Q;;;WAGG;EAGT1J;EAAa;;GAAK,AAAxBA,WAAiC,MACrCA;SACA;MAAO,cACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjH,mBACY,KAAa,EAAEC,aACjB,KAAA,SAA+BA,SAEvC;MAAO2Q,cACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,C,CA1EAlQ;;;;;uBAiBiD;;KAIzC,KAAA,2CAER,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,C,C,CA0EAlC,oBAD2BgC;gCAAAA,SACG;MADHA,MACkB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAV7CqQ,eAGA,A,C;A,K,C,I,C;A,M,C,C,E,CAHAA;;SAGA,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAyBAtR,YAA6B,gBAA2BuR,QAAKC,cAAQ,A,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,CAUrE/Q,WAAkB,MAAG0H,SAAQ,A,C;A,C,C,CAE7BpJ;GACMyS,cAAiB;EAEjBrJ;GAAS,WArCuBlH;;qBAAAA;EACfA,KAAAA;6BAAAA;EAAF;GADiBA,AAuC9BkH;EAIKsJ,AAAAA,WAAoBD,UAA/BrJ;;YAEEqJ,YACA;SAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,W,C;A,C,C,CO9LAvS,iBAIa,CAAA,eACH,OALe;MAOhB6B,SAP2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C,A,E,O,+B,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CGgBpCK,iBACEuQ,AC4NwB;;ED3NjBlN,KAAAA,sCAAPmN;MAEA;SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,C;A,G,C,C,mC,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CEnByBC,YAAoB,MAAGC,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,QCiEnHE,eDjE+JF,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAGjKG,YAA2B,MAAGC,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAA0CH,cAAoCG,QC8DzIF,eD9DuLE,WAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAG1LhT,WAAgB,MAAGiT,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BJ,YAAyBI,QC2DpGH,eD3D0IG,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAGlK,iBAGEC,OAAAA;WACAA;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAQAC,WAGEC,UACF,A,C;A,E,CAVAD,WAGEC,UACF,A,C,C;A,E,C,C;A,G,C,O,C;A,G,CFQA3T,WAAgB,MAAG0E,AAAAA,kCAAuC,A,C;A,G,CAE1D1E,YAAa,MAAG0E,AAAAA,+BAAoC,A,C;A,E,C,CAIpD,cACEA,AAAAA,8BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmBA,iBAzBgBA,OAqBdA;qBArBcA,0BA2BhB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAIA,sBIyRoB;+CJxRlBA,AAAAA;gDACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAgBA;EACckP,AAAAA;GACD,SAA6B,CAAA,KAAhBC,wBAEtBC;SAAAA;mBAAwBD,gBACxBC;sBAA2BD,qBAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA,kBACkB,KAAmBC,QACnCF,AAAAA;mBAA2BG,YAC7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,iB,C;A,G,C,CK7FyBxT,WAAuB,MAAGyT,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2CZ,YAAgCY,QFkErIX,eElEyLW,WAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,E,C,CAExN,iBC+q4BkCC,eA2/GhCC;gBA/EI,KAAc,KA8EcC,qBA9EW;GDjl/BvC,CAACC,UAEHC,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAIAhU,iBACgBiU,KAAAA;EF6CTjB,eElEyLW,UAApDA;;GAsB1H,YAAqB,KAtBYA,cAuB/CM,KAAAA,wBACA;SAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA;EACgBA,KAAAA;EFmCTjB,eElEyLW,UAApDA;;EAkC9HO,AAAAA;;cAAAA;EAEa,IAAMC;GACd,IACfxB,AJsMsB,qDI5OyBgB,SAwCjDS,AAAAA,AAAAA,AAAAA;cAAYF,KAxCqCP,iCA4CnD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,K,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAzC6B;GACrBI,OAEF,MAGFC;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CA8B2C;;EACvCI,IHrC0IlB;KC8DzIF,YD9DuLE;EGsCxLkB,IHnCqGjB;KC2DpGH,YD3D0IG,aGoC7I,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,gC,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,C;A,G,CEvCJnT,YAAkB,MAAGqU,SAAS,A,C;A,G,CAC9BtB,oBACgBsB,OACdA;;GADwB,WAKpBC;KAEAC,UAGN,A,C;A,E,C,CAEAvU,WACEwU,WAAW,CAfQH,QAgBnB;MAhBmBA,SAiBrB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,kB,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,C;A,E,C,CAgBA;EACEI;SAAAA;OACAC;OACAD;OAAYC,MACd,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA;EAGYD;;EAAAA;GACNE,OAYJF,OAAqB,AALSA,YAKJE;KATxBC,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAUA;;EACmBD,KAAAA;GACF,UACb;6BAFeA;GAIjB;KAAkB,WAEZA,KAAAA,KAAAA,kBACFC,QAAUD,KAAAA,YAEd,AAEAA;;EApB8BF;;EAuBP,AAvBOA,WAuB9BA;SAAsC,KACxC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C,A,E,iB,sG,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCjDF,WC0BEI,+6DACAC;ODcAC;OACF,A,C,Q,C,I,C,C,C,C,C,G,C,C,E,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CExE0BC,YAAmB,MAAGC,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAkClC,cAA4BkC,KAASC,eAA2BD,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAItK,cACEnS,AAAAA,KAL4CmS,YAM9C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAE;;ECyFqB;;;gBC5CI;;;;;;SF7CwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CGJjDC;;EF6FqB;;;gBC5CI;;;;;;;SCjDkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCEnBJ,YAAmB,MAAGK,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAkCtC,cAA4BsC,KAASH,eAA2BG,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAGtKC,cACE,MAAOC,AAAAA,MAJqCF,SAKjC,KAAPE,KALwCF,oBCukCrCG,uBDjkCT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,cACED,AAAAA,KAT4CF,YAU9C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CATAI;;EH0FqB;;;gBC5CI;;;;;;SE9CmB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CEH5CC;;EL6FqB;;;gBC5CI;;;;;;;SIjDiB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCClBC,YAAc,MAAGC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA6B7C,cAAuB6C,KAAUV,eAA4BU,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAG3J;;EAHyCA;WAMrC,MAEFlR;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,cACEA,AAAAA,KAZuCkR,YAazC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,CAEA1V,YACE,4BACF,A,C,I,C,I,C,C,C,C,C,G,C,e,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAhBA2V;;EN2FqB;;;gBC5CI;;;;;;SK/CkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,+B,4D,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCGlB3V,YAAqB,MAAG4V,MAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAAqD/C,cAA8B+C,KAAeZ,eAAiCY,QAAsB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,W,C,G,C,C;A,G,C,CAC7L5V,YAAwB,MAAG6V,MAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAAgDhD,cAAiCgD,KAAkBb,eAAoCa,QAAyB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,c,C,G,C,C;A,G,C,CAGnO/V,YAAmB,MAAGgW,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAChCjD,cACEiD,MACAC;WACF,A,C,I,C,I,C,C,C,C,C,G,C,G,C,C,C,C,W,C,C;A,E,C,CAIA,0CAEEA;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,kBAXED,KAYY,AAdQA,SAGpBC;UAYAA;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,e,C,C;A,E,C,CAIA;EACMD;EAzB0LF;WAAhDA,KAAeZ,oDACXa;KAAkBb,eAAoCa,kBAD1DD,KAAeZ,kDACXa;KAAkBb,eAAoCa,eA+B1M,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,iB,C,E,C,CAtBAG;;EP8EqB;;;gBC5CI;;;;;;;;;SMlC4B,A,C,I,C,I,C,C,C,C,C,G,C,uC,C,C,C,C;A,4B,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,mE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCd5BlW,YAAkB,MAAGmW,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyCpD,cAA2BoD,KAAcjB,eAAgCiB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACvKnW,YAAc,MAAGoW,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCrD,cAAuBqD,KAAUlB,eAA4BkB,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC5IjW,YAAqB,MAAGkW,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C,C,C,C;A,G,C,CAA2CtD,cAA8BsD,KAAcnB,eAAgCmB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAEvM,kBAJ8CF,IAA+EA;KAAcjB,iBAK9H,OAJgGkB;KAAUlB,eAA4BkB,SAMnJ,A,C,Q,C,K,C,C,C,C,C,G,C,c,C,C;A,E,C,CAEA,wBAR0CA;UAUtC;GAEW,AAXiCC,YAD6DD,KAAUlB,oBAcnHzM;UAAS,AAfiC0N,UAetBG,oBAfsBH,IAA+EA;KAAcjB,iBAiB5H,SAEf,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,c,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CArBAqB;;ER8FqB;;;gBC5CI;;;;;;;;;SOlDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,2B,uC,A,A,C,C,C,C;A,G,C,E,C;A,E,CCqB/CvW;;WAE0B;EAEHwW;WAInB,mCAGF;MAA+B,MAAxBC,oBACT,A,C;A,E,C,C;A,G,C,S,C;A,M,C,CAxB6B,cACvBC,OAAU,MCoJL;6DD/IT;MAAOC,UACT,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C,A,E,kB,iB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CnCutBEvU,mBACE;sBA/boClB,8BA+bpC,OACE0N,SA9baxF,KA+bf,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAhH,mBACE;sBArcoClB,8BAqcpC,UACM0N,SApcSxF,WAocH,QACZ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoBAhH,qBAGE;sBAheoClB,8BAgepC,SACiB0V,WA/dFxN,KAgef,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoJAhH,2BAEE;iBAAkB,EAAEyU,gBACJA;;yBACZ,2BAEJ,EAEsB;IAEpBA,cACArP;OACAA;YACAA;;8BAGAqP;QAEF,MW3qByBlK,SX4qB3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoEAvK;GACY,UAAa,MAAE1B,eACjB,KAAA,SAA+BA;;GAE/B,UAAe,MAAEA,eACjB,KAAA,SAAiCA,WAE3C,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQA0B,+BAEEvB;;EACiB;GACN,UAAM;GAEH;;;WASAiW,AAAAA;OAGU,KAAT,UAAWC,mDAG1BjW;gBACF,A,C,Q,C,K,C,E,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoCAsB;;GACY,UAAa,MAAE1B,eACjB,KAAA,SAA+BA;;6CAG1BQ;;EAESA;EACtBR;6BADsBQ,OACtBR;UAAY;EACQ;EAAmBA;2BDtgC/B,iBA2MRF;eC4zBA;MAAA,QAAA,aAAA;EACY,SAAVE;cACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA0B;GACY,KAAa,EAAE1B,cACjB,KAAA,SAA+BA,UAEvC;MAAA,QAAA,aACY,GAAVA;WADF,QAEA,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CqC1lCA0B;;GAEe,SACX,MAA8B,KAAR,cAAkC,KAAR,iCACzC,WAAc,WAAK,UACxB4U,WAASC,SACX;KAEA,gCAAuC,MAAW,YAAU,WAAK,UAC/DD,WAASC,SACX,CAEJ,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmBA7U;GAIiB,GAAGpB,SAChB,QAKF;QAA2B;GAChB,KAALA,QACF,SAEJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAOAoB;;GACiB,IACb;EAEgBpB;GAAH,OACS,GAExB;QAA2B;GAChB,KAALA,QACF,SAEJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CpCpBAoB,qBACqB,KAAR,cACT8U;KAEAC,cAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/U,iCACE;MAAkB,8BAAO,WAAW,YACzBpB;GAET;;KAAU,UAAkC,KAAtBoW,SAAQpW,MAAI,sBAChCA;QAAOA,MAAI;EACV,SACH,AACAA,WACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAoB;;EAMiC,KAAL,KAAP;;EACD;EACC;EACS,KAAT;;EACC;EACA;;EAEVpB;EACAA;EACAA;EACAA;EACAA;GAGY,KAAlBoW;;OACkB,KAAlBA;;OACkB,KAAlBA;;OACkB,KAAlBA;;OACkB,KAAlBA;;OACkB,KAAlBA;;OACkB,KAAlBA;;OACkB,KAAlBA;;OACkB,KAAlBA;;IAOJpW,UACAA;UACAA;UAEAA;QAAYA,SACZA;QAAYA;EAEI;EACE;GAE+B,KAAxBoW,mBAiBvB,kBAAqB,WAAW,YACrBpW;EACEoW;;GACF;GACA,aACD,CAAA,UACJpW,QAAOA,SACPA;aAEE,eAWJ,YACSoW,UAAQpW;;GACN,YACF;;GAIS,UAEdA,QAAOA;EACD,SAANA;QAAYA;EACL,QAAPA;;;;WAIAA,QAAOA;EACA,QAAPA;;;QAKJ,CAEJ,UAmBA,kBAAqB,WAAW,YACrBA;GAEO,KADEoW,sBAEV,CAAA,UACJpW,QAAOA,SACPA;aAEE,kBAGY,KADEoW,kBAEhB,YAEW,KADEA,UAAQpW,kBAEZ;GACK;;GAOD,KADFoW,UAAQpW,gBAGbA,QAAOA;EACD,SAANA;QAAYA;EACL,QAAPA;;;SAGAA,QAAOA;EACA,QAAPA;;UAIN,CAGN,cAQFA;QAAUA,MAAO,UACjBA;MAAO;SACPA;SAAWA,MAAQ,UACnBA;MAAQ,WAQRD;SAAsB,YACtBA;OAAiB;KAKf;GAOO,UAAkB,UACzB,KAAgC,KAAzBqW,UAAQpW,kBAA6B,SAAI,AAChD;KAAiC,KAA1BoW,UAAQpW,kBAA+B,SAAI,AAkBlD;kBAAqB,WAAW,YACrBA;GAEO,KADEoW,sBAEV,CAAA,UACJpW,QAAOA,SACPA;aAEE,kBAGY,KADEoW,kBAEhB,YAEW,KADEA,UAAQpW,kBAEZ;GACK;;GAOD,KADFoW,UAAQpW,gBAGbA,QAAOA;EACD,SAANA;QAAYA;EACL,QAAPA;;;SAGAA,QAAOA;EACA,QAAPA;;UAIN,CAGN,AAOAD,oBAOAA,eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,CDrTAE,YAAyB,0BAkRaC,2CAlRe,A,C;A,E,C,CAErD;EACe;6BAAA;GACb;KAAkB,SAChBmW,SAAOC;GACI,IAAG,mBACN,KAAA,YAEV,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAtX,YAAiB,MAAU,MAAPO,iBAAW,A,C;A,G,CAO/BI,eACa,KAAPJ,mDACJ;MAAO+W,WAAiB,KAAP/W,kBACnB,A,C;A,E,C,CAQAP;EACe;6BAAA;GACb;KAAkB,YACC,KAAbsX,gBAAyB;GAClB,IAAG,mBACN,KAAA,YAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAaAtX;EACe;6BAAA;GACb;KAAkB,YACZuX,SAAKD,mBAAe;GACb,IAAG,mBACN,KAAA,YAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAiDApX;EACe;GACT,AG0HcK;GHzHL,SAAM;MACC+W;GACP,CAAA,MAAG,oBACN,KAAA;EAEc;6BAPX;GAQX;KAAkB,SW+GpB3K,KAA6CA;EX7G5B2K;8BW6GjB3K;KAA6CA;GX5G9B,IAAG,mBACN,KAAA,YAEV,AACA,MWmHuBA,aXjHD;6BAjBX;GAkBX;KAAkB,WACH2K;8BWoGjB3K;KAA6CA;GXnG9B,IAAG,mBACN,KAAA,YAEV,AACA,MW0GuBA,OXxG3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEAlM,cAAwC,2CAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE5DA,cAA2B,0CAAkC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAW7D+W;EAEe;6BAAA;;GACb;KAAkB,WACRZ,WAAeU;GACZ,IAAG,mBACN,KAAA,YAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA7W,cAA4B,MAAG,wBAAsC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQrEG;oCAGa;UAAwBL,sBAEZA;6BAAAA;;;iCAEvB;YAAoBA;6BAAAA;KAAF;EACJ+W;8BAAZ9P;WACF,AACA,SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,CA+BA7H;EACe8X,KAAAA;EACTC;YAAqC,UAAU,QACnD;SACF,A,C;A,G,CAEA/X;EACe8X,KAAAA;EACTE;GAAO,UAAU,QACrB;SACF,A,C;A,E,CAEAhY;EACe8X,KAAAA;EACTE;GAAO,UAAW;EAClBD;YAAqC,UACvC,MAAc,UAEhB;MAAoB,WACtB,A,C;A,E,C,CAEA/W,oBAC8B,KAAZiX;GACN,WAAiB,OAAGC,iBACtB,KAAA,SAA+BtX,eAEvC;MAAOkX,MAAAA,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAhX,iBACY,8CACV;MAAO,MAAoBgX,QAAkB,KAAPE,WAAgBD,cACxD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAjX;GACY;EACNiX;EAGWC;WAFb,MAAO,MAAoBF,UAA0B;OAEjC;GACH,UAAU,WAC3B;MAAO,MAAoBA,mBAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAzDAK;EACMH;;GAAO;EAGPD;GAAa,YACE;GAGN,cACH,KAAA,cAGZ,A,C;A,M,C,C,E,CAZAI;;SAYA,A,C,C,C;A,E,C,C;A,G,C,e,C;A,E,CAgEAnX,WAAc,MAAGyI,SAAQ,A,C;A,C,C,CAEzBpJ;EACeyX;;EAAAA;GACD,CAAA,KAARvT,gBACI,KAAA;EAEJ6T;6BAJSN;GAIF,MACTrO,YACA;SAEFA,QAAWqO,SACXM;QAAM,AAANA,SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CAkBA9W,gCAAqDwW,KAAAA,SAAoBO;wCAAhD;SAAmD,A,C;A,E,CAG5ErY,YAAe,MAAG8X,MAAAA,SAAgB,A,C;A,G,CAClCzX,YAAiB,MAAGyX,MAAAA,SAAiB,A,C;A,G,CAIrCQ,YAAW,MAAGD,SAAGP,KAAAA,UAAe,A,C;A,E,C,CAEhCQ,cAAuB,MAAGD,SAAGP,KAAAA,YAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,M,C,C,E,CAnBxDtW;4CAEI,gCAEF;iCACF,A,C,C,C;A,E,C,C;A,G,C,U,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CA8BAnB,iBACMkY;GAAAA,OACF9O,QAAW4O,QAAGE,OACd;SAEF9O,YACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEA6O,WAAc,MAAG7O,SAAQ,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CAezBzJ,YAAe,MAAGwY,MAAAA,SAAc,A,C;A,E,C,CAChCF,cAAuB,MAAGD,SAAGG,KAAAA,YAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,CAYtDlX,2BAAiDwW,KAAAA,SAAoBO;wCAA5C;SAA+C,A,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CASxEhY,WACE,UAAOkY,QAAAA,UACDF,QAAGE,aACL,QAEJ,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEAvX,WAAc,MAAGuX,AAAAA,cAAiB,A,C,C;A,E,C,C;A,G,C,U,C;A,E,CAWlCjX,2BAAqDwW,KAAAA,SAAoBO;wCAAhD;SAAmD,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,e,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CAiB5EC,WAAc,MAAG7O,SAAQ,A,C;A,C,C,CAEzBpJ;EACMoY;WAA2B,QAC/B;MAM2BF,QANpB,CAACE,QACNhP;GACI8O,OAGFE;EACoBJ,KAAAA,QAAGE,QAAvBE;eAEA,SAEJ,AACAhP,QAAWgP,AAAAA,YACX;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAmBAnX,kBAC6BwW;WAAAA,QAAoBY;wCAA/C;SACF,A,C;A,M,C,C,E,CAdAlX,2DACqC;aAIjC,8BAEF;+BACF,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAcAxB;EACuB8X;EAAAA;EACAY;GAAF,UAAc,QACjC;SACF,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CAYArY,iBACY,KAAVsY,UAAAA;;GACe,UACb,MAAOJ,AAAAA,YAETI;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEA3X,cACiB,KAAX2X,WAAgB,MACpB;MAAOJ,AAAAA,cACT,A,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAqDAzX,yDACqB,wCAGnB;MAAO,MAAoBgX,QAAsB,KAAXc,yBACxC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAEAtX,kBAC6BwW;WAAAA,QAAoBc;wCAA/C;SACF,A,C;A,E,CAfAC,sBACMD;2CAAiC,eAC7B,KAAA,SAEV,A,C;A,M,C,C,E,CAXApX;;WAEI;SAEF,MAAO,aACT,A,C,E,CAEAqX;;SAIA,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAmBA7Y;EACe8X;EAAiB,KAAjBA,QAAmBc;GACrB,UAAM,QACjB;SACF,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CAWAvY;EACuCkY;GAArC;YAAoBK;6BAAAA;KAAF,UAAmBL;UAAoB,AACzDK,SACA;MAAOL,OACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEAvX,WAAc,MAAGuX,AAAAA,cAAiB,A,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CAiHlClY,WAAgB,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CACxBW,WAAc,OAAO,A,C,C;A,G,C,C;A,G,C,I,C;A,E,CsC5sBrB,mBACQ,KAAA,wDAER,A,C;A,C,C,CAGA,mBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,mBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAX,mBACQ,KAAA,+CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeA,iBACQ,KAAA,yCAER,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAeA,qBACQ,KAAA,+CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CAmBA,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAGA,mBACQ,KAAA,yDAER,A,C;A,E,C,CAGA,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAGA,mBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAW,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,mBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAX,mBACQ,KAAA,gDAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeA,mBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CASA,iBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAeA,yBACQ,KAAA,2CAER,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,gDAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAuGAL,YAAe,MAAGwY,MAAAA,SAAc,A,C;A,E,C,CAEhCxX;EAA0BwX;SAAH;MAAGA,QAAqC,KAAJ,KAAfA,eAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,C,C,CxB5PvEnY;;QAAwB;iDAA4B,KAANyY,QAAS7W,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAElEjC,kBAEwC8Y,KAAAA;6BAAAA,OAAtC;MAAkB,WAAkB,SACtC,A,C;A,E,C,CAEAC,YAAW,sBAAaD,eAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,G,C,I,C,E,C,CAKhCrW;GACM2G,cAAc;GACdA;ET4B4BqF;;GSzB5B,wFAIJ;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C,A,E,oB,mB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CyBsaFU,uBACoB,MAClB;mBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAA,YAAmC,MAAG6J,UzBvbIpJ,WyBubc,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIxDqJ;4CAEI;KAEA,qBAEJ,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAMAC;EACyBC;;GACP,iBAAc;GACd,cAAW,aAE3B;MAAOC,MAAmBJ,qBAC5B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIAE;;EACuBG;GACF,OAGHA,OAAqC;;cAEZC,MAAfC;;GAEf,QAAS;;EAEDF;GACF,UACqBG,AAAAA,KAChCH;aAEAA,OAAmC,IAAwB,KAAnBA,6EA2lBlCI;SAzlBV;WAGEnZ;;GAGQ,6BAyvDVoZ;;SAtvDE;cAII,KAAA,kCzBhfgC9J;;;;;;0EyB+fnB+J,AAAAA,SAAmBA;EAC3BA;8BASQA;qBAAAA;EACRC,KADQD;GAEH,AAAdE,YAAqBV,sBACdW;wBAo3BiBR;;YA92BGS;KAI3B,MAAoBA,yBAAF,qBAElB;gFAoiBQN,gBA9hBZ;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/R;EACe,8BACb;sBvC/SsCnG,8BuC+StC,UvC7SiBkI;GuC8SX,CAACuQ,SAAwB,CAACA,SAAmB,CAACA,QAChDnS,MAAOmS,WAEX,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAtS;EACe,8BACb;sBvCzTsCnG,8BuCyTtC,UvCvTiBkI;GuCwTXuQ,QACFnS,MAAOmS,WAEX,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAkCAtS;EC5kBW,8BAAA;SD+kBT;sBvCpWsCnG,8BuCoWtC,UvClWiBkI;GuCmWXuQ,WzBzlBkCpK,AyB0lBpBoK;;EAGZnS,MAAOmR,KAFJ5P,SAA8B,KAAZA;;wDAKvB4Q,gBAEJnS;KAAmBmS,qBACrB,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIAC;IAGE;sBvCxXsC1Y,8BuCwXtC,OACEsY,OAAWL,KvCvXI/P,MuCwXjB;kBvC1XsClI,6BuC4XtC2Y;;EvC1XiBzQ,IuC4XjB;KAAOyQ,oBvC5XUzQ,euC6YLuP,QAfZ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA4xDAhZ;;GACE;YAAoB+Z;6BAAAA;KAAF;GACgB,KAA5BA,AAAAA,eAA+Bf,SACjC,aAEJ,0DAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAE;;QAOE;QAAe;;;EAOHpT,QACZ,WAIE;;aAEiBmH;QACRkN;EAKkCA,OAEzC;MAAOJ,QADKK,OAAqCC,iBAKhCpN;;0BAaSqN;;4CAExB,WAqBArN,wBAEa,QACjB,MAAOuM,QAGT;MAAOe,YACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApL,yBACqB,QAEnB;MAAO6J,UzB5+EiCpJ,AyB2+EnB4K,oBzB3+EmB5K,OyB6+E1C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3O;;GAGuB,QAAS;wBACoB;;mBAEhD;MAAOwZ;EAMGtR,mBlCzhFFoJ;UkC0hFO,eAGjB;MAAOpJ,6BAAAA,AAAAA,YADQA,kFAGjB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAlI;;0EAQayZ,KAAYC;EACJA,qCAERD;OAKX,sBvC/xEsCnZ,gCuCiyEjB,YAFrB,UvC7xEiBkI;QuCgyEwB;;EAA1BmR;;EAEA;GACF,QACT/S,UAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA5G;GACMe,cAAgB,qBACpB;MAAOA,WACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA3B,oMAsBI;QAEA,UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAIAA;;GACU,YACA,uCACN;EAEiBwa;QACnB;MAAiB,aAAoB,WACvC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,G,CA1jFEnT;EACMoT;GAAiB,QAAS;EACG,8BACjC;eAAiCC,8BvCmQkBjD,KAAAA,MAAoBO,6BuCnQvE,OACE,MAAA,KvCqSa5O,MuCrSb,UAAA,MACE5B;MAAOmT,WACT,AACF,+BACOF;SAAP;SAEF,A,C;A,M,C,C,G,C,U,C,E,C,CAMArY;EAEe;;WAEY,QACzB;sBvC+MoClB,8BuC/MpC,UvCiNekI;;EuChNCU;EACMA;ETkBQ,KAAmB8Q;ESjBxB9Q;EACEA;EACFA;EACVA;EACCA;EACKA;kBAInB+Q;KADgBrT,4FAGRmR,UAEV,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAP6C,WAAG,uBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAenEzY,YAAkB,MAAG4a,YAAW,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKhCC,iBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,mBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CAeA7a,WAAuB,gBAAY,A,C;A,G,CAUnC8a,iBAkiF0B7C,AAjiFjB8C,eAAP;MAAOA,AAiiFiB9C,2BA/hF1B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CADM,YAA0B,MAAGwC,SAAQO,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,G,CAU3CpM,WAAyB,MAAGqM,MAAqBhB,WAAOiB,YAAW,A,C;A,G,CAEnEpb,WAAmB,MAAGqb,MzBjHkB9L,AyBiHhB6L,mBAA2B,A,C;A,E,C,CAKnDlb,YAAkB,MAAK4a,wBzBtHiBvL,AyBsHG6L,mBAAc,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMzDE,mBACQ,KAAA,iCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,C,C,CAiBAtb;;QACE;iDACe,KAAXob,QAAcxZ,OACR,AAANuY,YAASvY,MACf,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EzCvJoBoS,KAAAA;6BAAAA;EyC0JLoI,OACb;MADK,CAAA,AADA,AADiB,aACX,GAAEiB,KAAAA,SACF,GAAEjB,cAEf,A,C;A,G,CAEAja,WAAuB,2BAAuB,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CAoB9CA,WAAuB,mBAAe,A,C;A,G,CAEtCqb,WAA4B,OAAO,A,C;A,G,CAMnC3a,WAAkC,YAAS,YAAwB,A,C;A,G,CAGnEP,gBACQ,KAAA,iDACR,A,C;A,G,CAEAO,WAA2C,YAA+B,A,C;A,G,CAC1EA,WAAmC,YAAuB,A,C;A,G,CAE1DZ,WAA+B,SAAO,A,C;A,G,CACtC6Y,WAAmC,YAAO,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,6D,C;A,G,CA0C1C3Y,WAAuB,sBAAkB,A,C;A,G,CAEzC4O,WAAyB,MAAGsM,SAAU,A,C;A,G,CAEtCxa,WAAkC,MAAG4a,YAAgB,A,C;A,G,CAErDnU;EACMoU;GAAe,QAAS;EACf,8BACb;MAAA,KAAyBC,SAAzB,UACYvC,KADZ;;+CAGU5D;cAEJ/N,MAAO+N,OACPA;YAGN,+BACOkG;SAAP;SAEF,A,C;A,E,C,CAEA7C;EzBpQwCrJ;GyBsQlCxG;EACS4S;EAAYhD;EAo3EHR,AAAAA;aAAAA,AAAAA,AAn3EOyD;gBAGrB,KAAA,UAA4BC,uBAEpCC;YACA;MAAOC,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAnD,kBA02EwBT,AAAAA,AAz2EJ6D;gBAGV,KAAA,0BAER;MAAOD,MAAQD,YACjB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAlD;EAi2EwBT,AAAAA,AA31EO6D;gBAGrB,KAAA;;6CAGwB,oBA8vDFC,MA7vD5BxM,KzBvSoCF,SyByStC;MAAOwM,MAAQD,WACjB,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAmBAlb;EACMsb;GAAuB,QAAS;;EAEhBC;;EAEcC;GAFlC;YAAoBD;6BAAAA;KAAF;OACFA;;EAESrD;;EAOF7J;QAIHA;EpCtVbnN,kBoCyVD,SANY,KAQhB0F;SACAsU;cACF,AACOI,SAAP;SACF,A,C;A,G,CAEAtb;EACMyb;GAAc,QAAS;iBAE3BC;UACUC,aACHF;SAAP;SACF,A,C;A,G,CAEAhV;EACMmV;GAAiB,QAAS;EACjB,8BACb;MAA8BhB,6BvChHMta,8BuCgHpC,UvC9GekI;GuC+GT,CAAC0S,QAAsBtU,MAAOsU,WACpC,+BACOU;SAAP;SAEF,A,C;A,G,CAEAnV,iBACMoV;GAAe,QAAS;gBACf,4CAENA;SAAP;SAEF,A,C;A,G,CAEApV,iBACMqV;GAAe,QAAS;gBACf,4CAENA;SAAP;SAEF,A,C;A,G,CAEArV;EACMsV;GAAiB,QAAS;EACjB,8BACb;MAAgCC,6BvC1II1b,8BuC0IpC,UvCxIekI,IuCyIb5B;MAAOsU,WACT,+BACOa;SAAP;SAEF,A,C;A,G,CAEAtV;EACMwV;GAAe,QAAU;EACaC;EC9XnC,8BAAA;;aDwnF+B3E,AAAAA,AAtvEtCwD;qBAsvEsCxD,AAAAA,AArvEtC4E;qBAqvEsC5E,AAAAA,AApvEtC6E;qBAovEsC7E,AAAAA,AAnvEtCyD;;+BACOiB;SAAP;SACF,A,C;A,G,CAEAxV;EACM4V;GAAoB,QAAS;EACpB,8BA6uEyB9E,AAAAA,AAzuEtC6D;;+BACOiB;SAAP;SAEF,A,C;A,G,CAEArc,iBACMsc;GAAgB,QAAS;gBAGgBC,KAAAA,wBADtCD;SAAP;SAEF,A,C;A,G,CAGA3B,WAA4B,OAAO,A,C;A,C,C,CAOnC6B,cACI,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CArCnCC,cACE7V,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAWA6V,cACE7V,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA2MsC,WAAG,cAAGmS,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,G,CAmC9CzZ,WAAuB,oBAAgB,A,C;A,G,CAEvC4O;EACMwO;GAAkB,QAAS;EzBxoBO/N,AyByoBjBgO,AAAAA;EAEIC;EADGC,sBACtB9E,qBzB3oBgCpJ,AyB2oBbiO,aACnB7E,yBzB5oBgCpJ,AyB4oBTiO,YAFtBF;SAAP;SAGF,A,C;A,G,CAEAxO,WAAyB,MAAGsM,YAAU,A,C;A,G,CAetC/T,WAAgD,MAAGmW,AAAAA,eAAkB,A,C;A,E,C,CAkBrE5E,qBAKQ,KAAA,uBAER,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA,iBAEQ,KAAA,6BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAA,mBAEQ,KAAA,UAA4BiD,wBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,G,CAEAjb,WAAsC,OAAI4c,SAAM,A,C;A,G,CAYhDxd,WAA+B,SAAO,A,C;A,G,CAEtC4Z,WAAoC,YAAO,A,C;A,G,CAG3ChZ,gBACQ,KAAA,YACR,A,C;A,G,CAEAA,WAAmC,YAAuB,A,C;A,C,C,CAG1Dwc,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,G,CAmBnExD,YAAqB,MA1SdT,MzCjb4B1M,AyC2tBCiR,KAAAA,aAAsB,A,C;A,E,C,CAE1D9E,sBzBhvBwCrJ,OyBwyBtC;MAAO+L,mBAJwC9R,iBAMjD,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAMAwI;;EAEqB0L;aAAqBpe;;cAG9B2Z;mBAGV,SACF,A,C;A,E,C,CAKAL;EAIc+E;;cAMWC;QAKHC,AvCgFb,KuChFaA;;EnCpqBbzd,KmC8qBkDsd;;GAGrDI,iCAEqBF,0BAMvB;MAAO7B,MAAQ+B,KAAoBJ,iBAEnC,MAAO3B,MAAQ+B,KAAoBJ,YAEvC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA9E,wBzBx2BwCrJ,ayB02BtC+L;QACI3C,gBACJ;MAAOoD,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CA0BAnD;WAKgBmF;;;;IAOuBL;WAMjC;OAEa3B;;KAGb;UAGJ,MAAOiC,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEApF;EzBp6BwCrJ;EyBw6BzB+L;EACkBqC;GAC3BG,QACF;EAIUC;yBAEU,SAAfA;;GAAwB,CAAA,UAAM;MAC3BA;;iCAMIE;EAKIH;EACJA,QACRI,aACAC;;SASN;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAF,mBASI;KAEA,yDAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAE,iBACM,GAAU,0DAUd;iDAFsDT,mEAGxD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKAQ,oBAKoB5e,IAJLoe;GAKT,GAAU,+DAGd;mHACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,C,C,CASA/W;;;+CAEmB+W;EAAW9b;;aAD5B;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC,YAGE,MAAmC,M5B7iCMye,K4B6iCjBV,oBAC1B,A,C;A,E,C,CAEAxd,YAAkB,+BAAwBme,KAAmBX,UAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAMzEN,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA7PxC;EzBnxBa7N;;GyBqxB9BxF,QACFA;UAIM,KAAA,oEAGV,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oD,C;A,G,CAiSJ7J,WAAuB,oBAAgB,A,C;A,G,CACvCA,WACE,UAAgCoe,aAAhC,QAAA,UACmB,CAAA,KvC30BJlV,auC40BX,WAAUmV,AAAAA,mBAAsBC,WAEpC,AAGA;MAAOD,AAAAA,eACT,A,C;A,G,CAEA3d,WAA2C,MAAG2d,AAAAA,eAAoB,A,C;A,G,CAElE3d;EACM6d;GAAqB,QAAS;;;EAgB9BD;GAAAA,oBxCr/BGhe,KwCs/BLge;KAKA,MAAoBA,sBAAF,WACAA;;uEAUJ;KAGRE;eAMN,AACAA,sCAEKD;SAAP;SACF,A,C;A,G,CAEA7d,iBACM+d;GAAe,QAAS;EACLJ,AAAAA,gBAAhBI;SAAP;SACF,A,C;A,G,CAQAtX,iBACMuX;GAAoB,QAAS;gBAGzBC,KAAmBC,yBAFpBF;SAAP;SAGF,A,C;A,G,CAcAvX;EACMsV;GAAiB,QAAS;EACjB,8BACb;MAAiC4B,AAAAA,mCvC16BGrd,8BuC06BpC,UvCx6BekI,IuCy6Bb5B;MAAOsU,WACT,+BACOa;SAAP;SAEF,A,C;A,G,CAEAtV,iBACMwV;GAAe,QAAS;gBAExBkC,KAAcD,WAAUlD,yBADrBiB;SAAP;SAEF,A,C;A,G,CAEAxV;EACM4V;GAAoB,QAAS;EAE7B,8BACJzV;OAAcwU,WACdxU;OAAcwX,WACdtF;KAvG4C6E,AAAAA;+BAwGrCtB;SAAP;SAEF,A,C;A,E,C,CAoDArE,cACE,MAAO2F,AAAAA,iBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3F,YAA0C,MAAG2F,AAAAA,eAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAiBvEU,WAA0B,MAAGV,AAAAA,eAAY,A,C;A,G,CAEzC3d,WAAkC,MAAG2d,AAAAA,eAAe,A,C;A,G,CAEpD3E,iBACMsF;GAAY,QAAS;EAMJC,wBADEC,0BAFwBb,AAAAA,mBAGxCW;SAAP;SACF,A,C;A,E,C,CAEAtG,gBAGE,MAAO2F,AAAAA,mBACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAEAve,WAA+B,SAAQ,A,C;A,G,CAEvC4Z,WAAoC,MAAG2E,SAAM,A,C;A,G,CAE7C3d,iBACMye;GAAuB,QAAS;EACJd,AAAAA,gBAAzBc;SAAP;SACF,A,C;A,G,CAEArf,WAAmB,MAzqCGqb,MzBjHkB9L,AyBiHhB6L,AAyqCFmD,sBAAgB,A,C;A,G,CAYtCzP,WAAyB,MAAGyP,AAAAA,eAAoB,A,C;A,G,CAIhDle,WAAuB,gBAAqBif,iBAAa,A,C;A,G,CAEzDxQ,WAAsB,MAAGyP,AAAAA,eAAiB,A,C;A,C,C,CAM1CnB,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAlOjEsB;E5B1iCOze;;G4B4iCW,WACduH,OAAW2R,KAA0BoG;uBAMrC/X;gBAHmB0S,KAAaF,kBAz8B1BrB,KAAEqB,YA88BZ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAVqD,YAAI,SAAI,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAazB,YAAI,MAAG0E,kBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAmFtC,YAAQlX,WAAOgY,UAAV;SAA2BA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2E,C;A,G,CA2OxDtf,WAAuB,oBAAgB,A,C;A,G,CAEvC8R;EACMyN;;4CACF;KAEA,SAEJ,A,C;A,G,CAEApY,iBACMuX;GAAoB,QAAS;gBAGzBC,KAAmBC,yBAFpBF;SAAP;SAGF,A,C;A,E,C,CAWAhe;EACwC8e;EAClBhO;iBAEpB;sBvCtsCoCxQ,8BuCssCpC,UvCpsCekI;GuCqsCTuW;EACgB3Q;;;;EAShB,eAEJxH;SACAsU;OACF,EAEOpK,kBAAsC4N,SAC7C;sBvCxtCoCpe,8BuCwtCpC,UvCttCekI;GuCutCTuW;EAE4BxF,AAAAA;;;EAOdyF;QAEGA;EpCh+ChB9d;EoCw+CD,SAFY,KAIhB0F;SACAsU;OACF,AAEA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAlb,iBACM+d;GAAe,QAAS;EACJkB,aAAjBlB;SAAP;SACF,A,C;A,E,C,CAEA/d;;EAGkCkf,AAAAA;qBAAAA;EAAAA;EAC5BC;GAAgB,cAEd;aAENzD;eAGiDgD;GAC5B,QACnBhD,mBAMF;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA1b,iBACMyb;GAAc,QAAS;EACJ2D,aAAhB3D;SAAP;SACF,A,C;A,G,CAEAhV,iBACM4Y;GAAkB,QAAS;gBAEmBC,KAAcpB,yBADzDmB;SAAP;SAEF,A,C;A,G,CAcA5Y;EACMsV;GAAiB,QAAS;EACjB,8BACb;MAAgCC,6BvC1yCI1b,8BuC0yCpC,UvCxyCekI,IuCyyCb5B;MAAOsU,WACT,+BACOa;SAAP;SAEF,A,C;A,G,CAEAtV,iBACMwV;GAAe,QAAS;gBAExBkC,KAAcD,WAAUlD,yBADrBiB;SAAP;SAEF,A,C;A,G,CAEAxV;EACM4V;GAAoB,QAAS;EACpB;aAolCyB9E,AAAAA,AAhlCtC6D;qBAglCsC7D,AAAAA,AA/kCtC6G;qBACAtF;KAAAA;+BACOuD;SAAP;SAEF,A,C;A,E,C,CAoDArE;EAihCwBT,AAAAA,AAhhCIyD;GACf,SAAWE,SAAmB,AAACA,gBAGxBA;GACZ,eACI,KAAA;MAGR;MAAOC,cAGH,KAAA,UAA4BF,wBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjD;EAigCwBT,AAAAA,AAhgCIyD;GACf,SAAWE,WACJA;GAGZ,eACI,KAAA;oBAIN,MAAOC;KAEP,MAAOA,iBAIL,KAAA,6BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CA+BAkD;EACMkB;cACEV;;4CACFU,QAASC,AA1uCRjH,KzCjb4B1M;;EyC6pDZ4T;gBvC15C8B5I,KAAAA,MAAoBO;wCuC05CnE;KAAA,OACE,MAAA,KvCx3CS5O,MuCw3CT,OAIEuR,AAJF,YAKA,AACF,GAEEwF;6CzBzrDgC5Q,AyB0rDD6L,gCAGrC,SACF,A,C;A,G,CAEAxa,iBACMsc;GAAgB,QAAS;EACzBC;cACUmD,KAAsCZ,qBAAlDvC;0BAG2CA,uBADtCD;SAAP;SAEF,A,C;A,G,CAEAtD;EACMsF;mCAE6CI;GAC3B,WAEJH,wBADSC,WACvBF;iBAEqBY;EAAAA;qBAAAA;EAAAA;;EAERvG;EACTC;GAAc,QACE,WACV,KAAA;EAEML,KAA0BK,KAAxC0F;iBAI8B,eACjB/F,OADb+F;YAKN,MAAmB,mBAAiBA,QACtC,A,C;A,E,C,CAEAtG,sBAu5BwBT,AAAAA,AA94BEoI;YACF,CAACzE,aAEf,KAAA;GAGJ,CAACA,OACHrM,KzBpvDoCF,SyBsvDtC;MAAOwM,MAAQD,WACjB,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAEA9b,WAA+B,SAAO,A,C;A,G,CAEtC4Z,WAAoC,YAAO,A,C;A,E,C,CAE3ChZ;uBAEiD0e;EAE3B,QAOTF,cAAAA,8CAGX;gCACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAxe,iBACMye;GAAuB,QAAS;EACJmB,aAAzBnB;SAAP;SACF,A,C;A,G,CAEAze;EACK6f;GAAqB,QAAS;;EAGqBf;WAC3B,QAC3B;QAAkB,EAAEhG,gBACsBA;kBACxClS;8BA9oDQmR,KAAEqB,WAgpDZ,0BACOyG;SAAP;SACF,A,C;A,G,CAEA7f,WAAmC,YAAuB,A,C;A,G,CAI1DP,cACM,CAH4C,KAArBqZ,KAAAA,oBAInB,KAAA,uDAGR;gBAAyB4F,cAC3B,A,C;A,C,C,CAMAlC,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAnQjEC,cACE7V,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAGsB,YAAQA,WAAOgY,UAAV;SAA2BA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA+MpD5F,YAEE,MAAOuF,+BACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gC,C;A,G,CA8HJjf,WAAuB,uBAAmB,A,C;A,G,CAE1C2Y,YACE,MAAOsG,MAGsBgB,sBAHqCO,UACpE,A,C;A,G,CAEAnF,WAA4B,MAAG4E,SAAM,A,C;A,G,CAErCvf,iBAEMuc;cACWwD;kBAAbxD;UAGF,MAAOA,AAAAA,sBACT,A,C;A,E,C,CASApC,YAA6B,SAAuB6F,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE5D,iBACMC,aACI,KAAA,UAA4BhF,KAAaT;EAE5BwF,WACvB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAtFAzf;EAIkC2f;EAC5BC;SAGF;cAJ8BD;EAOjBC;;EACFC;;EACFC,KAAUD,MAAwB;SAE9B;EAEQ;EAIQA,SAFzB;EAGQA;GACF,OACKE;EACNF,OAAwB;IAIjBlI,cAGA9J;;QAKC2J;EACawB;avC9nDIjZ;8BuC8nDlC;UAAA,UACwB,KAAlByY,AvC7nDOvQ;MuCioDb,sBAvC8B0X,SA0ChC;0B5Bp1DO7gB,K4Bm1Dc8gB,qBACOpI,SAO9B,A,C,E,C,CAmBAvW,eACW,OAAc,MAAO,MAAY;GACjC,QAAe,OAAQ,MAAY;GACnC,OAAc,MAAO,MAAY,KAC1C;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,G,CAmBA+e;;EAgB+DzD;;;;;;;;gBAErD,KAAA;EAEuB0D;qBAAAA;E5B15DxBnhB,K4B05DwBmhB;;8CnCyIQvQ,OmCtI1BjF;;EACAoD,WnC0IwB6B;WmCxIjCpB;EAEe,0EAMbkJ;kBAIN;SACF,A,C;A,E,C,CAQAzY,YAAkB,+BAAwBme,KAAmBX,cAAa,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAW1EN,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,4C,C;A,G,CAqDnEld,WAAuB,qBAAiB,A,C;A,G,CAExCU,iBACMygB;GAAY,QAAS,QACzBC;UACA;MAAOD,SACT,A,C;A,E,C,CAEArhB,WACE,wBAA8Bic,QAChC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAV,WAA4B,MAAG4E,SAAM,A,C;A,G,CAErCtH,WACEyI,UACA;MAAOC,SACT,A,C;A,G,CAEA3gB;EACMuc;cACwBlB;EAAhBqE;EACakB;6BAAAA;;EACD;GACb,WAGY3X;qDAGeA;OAt8DjBsQ;GAAM;;;aAy8DWtQ,0BArBTsW,kBA0BnBtW,KAAwBiQ,AAFD2H,AAxBJtB,oCAAAA,YA8BrBuB,QACFH,QA/BuBpB;KAiCvBoB,QAAc9U;EAGD5C,IACf;MAAoC4C,UAApC,qBnC5vDAkV,OAKkC7X,SmCuvDlC,avCt1DWV;;;;GuC01DH,EAAES,qBACgC+X,sBA8GpCjJ;OA3GiB9O;gBAEH+X,kBAyGdjJ,WAtGK;uBAATkJ;OACF,CAEFR;gBACqCS,uBAArC3E;UAEF,SACF,A,C;A,E,C,CAYA7B,iBAIM,CAACyG,SAAY,CAACL,aACV,KAAA;IAEY,KAAhBF,QAAmBhY,WAA8ByS,mBAE7C,KAAA,KACF9B,WAAOiB,kBAMb;MAAgCa,iBACtB,gBACZ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAlB,eACMiH,QACF,MAAO1G;UAGD,KAAA,6BAEV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA2G,iBACMC,QACF,MAAO5G;UAED,KAAA,UAA4BO,KAAaT,wBAEnD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,G,CASApb,WAAyB,MAAG,CAACgiB,SAAY,CAACE,SAAY,CAACR,QAAa,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAxJpEvgB;EAIsB4H;qBAAAA;EACbc;EACWsY;EACF,IAAepZ;EAI3Bc;;;4BAPgBd;E5B99Db9I,K4B6+D8B4J;qBAfjBd;E5B99Db9I,K4B8+D8B4J;OAGjC8O,OADJ;kBACgD,2CAElD,A,C,C,C;A,E,C,C;A,G,C,4B,C;A,G,CAwKAzY,WAAuB,wBAAoB,A,C;A,G,CAE3C2Y,YACE,MAAOsG,MAAwChF,QAAOuG,SACxD,A,C;A,G,CAGA1gB,WAAkB,SAAQ,A,C;A,G,CAG1BA,YAAiB,SAAQ,A,C;A,G,CAWzBY,WAEE,MAAOwhB,AAAAA,MAAAA,0BACT,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAD0B,YAAQ,MAAGrG,wBAAsB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,CAa3DsG,YAA+B,MAAGhJ,SAAQ,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,G,CAE1CnZ,WAAuB,sBAAkB,A,C;A,G,CAYzC2Y,WAAmC,YAAS,YAAwB,A,C;A,G,CAGpE0C,WAA4B,YAAS,YAAwB,A,C;A,G,CAG7D3a,WAAkC,YAAS,YAAwB,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,G,CASnEP,WAAuB,YAAS,YAAwB,A,C;A,G,CACxDuZ,WAA2B,YAAS,YAAwB,A,C;A,G,CAC5DhZ,WAAsC,YAAS,YAAwB,A,C;A,G,CACvEyG,WACI,YAAS,YAAwB,A,C;A,C,C,CASrC+V,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CACnExE,gBAGI,YAAS,YAAwB,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CACrCA,YAA0C,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAC3EA,cACI,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CACrChY,WAA2C,YAAS,YAAwB,A,C;A,G,CAC5EA,WAAmC,YAAS,YAAwB,A,C;A,G,CACpEiY,WAAmC,YAAS,YAAwB,A,C;A,G,CACpE/J,WAAsB,YAAS,YAAwB,A,C;A,G,CACvDA,WAAyB,YAAS,YAAwB,A,C;A,G,CAC1D9O,WAAmB,YAAS,YAAwB,A,C;A,G,CAGpDY,WAAkC,YAAS,YAAwB,A,C,C;A,E,C,C;A,G,C,oB,C;A,G,CA0BnEZ,WAA+B,SAAO,A,C;A,G,CAItC6Y,iBACMyJ;GAAkB,QAAS;EAfUC;qBAgBrBD;SAAP;YACT,uBAAwBA;SAAP;WAEjBnD,KAAwChF,cADrCmI;SAAP;SAEF,A,C;A,G,CAEA1hB;EACM4hB;GAAkB,QAAS;;EArBmBD;eAyBhD,+BvCtlEkCrhB,kCuCslElC,aAEqD,GADnDsG;qBvCrlEW4B,qBuCy8DLuP,qBA8IR;cAGA,8BvC5lEkCzX,8BuC4lElC,aAEqD,GADnDsG;qBvC3lEW4B,qBuCy8DLuP,qBAoJR,gBAGA,MAAiBjH,gCvClmEiBxQ,8BuCkmElC,UvChmEakI,IuCkmEX5B;gDAzJMmR,UA0JR,0BAEK6J;SAAP;SAEF,A,C;A,E,C,CAEAtiB;EACMuiB;GAAgB,QAAS;EA/CqBF;eAmDhD,+BvChnEkCrhB,gEuCgnElC,gBvC9mEakI;EuCgnET,OADA,IACGwD,cAEP;4BAKA;8BvCznEkC1L,mCuCynElC,gBvCvnEakI;EuCynET,OADA,IACGwD,cAEP,gCAMA;MAAiB8E,gCvCnoEiBxQ,mCuCmoElC,gBvCjoEakI;EuCooET,OADA,AADA,kBAEGwD,uBAEP;;kBAOE,SAAGA,kBAEH;OAEG6V;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAOAtB,WAA4B,YAAS,YAAwB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAgD3DtI;;;EAGMkB,KAAsBD,UAA0BE,QACpD;MAAOF,MAAAA,aACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASA5Z;EACqB+Z;;4CAEjB,WAAUsF;2FAIO,cACf;QACsB,cACtB;KAGA,eAGJ;MAAOA,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA0BS,YAAQ,wBAAgB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAQ/B,YAAQ,wBAAgB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,E,CAqH5B5f,YAAe,M/B5qEGuE,A+B4qEAiU,YAAc,A,C;A,G,CAEhCnY,YAAiB,M/B7qEGkE,A+B6qEAiU,gBAAe,A,C;A,G,CAEnCnY,YAAoB,M/B9qEG,AADHkE,A+B+qEGiU,gBAAkB,A,C;A,C,C,CAEzC3J,cAAqB,MAAG2J,AAAAA,gBAAY,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEpCnY,YAAwB,MAAGmY,AAAAA,eAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEnDnY,YAA4B,MAAGmY,AAAAA,eAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3D,cAAqC,MAAGA,AAAAA,iBAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAE1D1X,kBAAwB0X,OAAH;qCAAe,A,C;A,G,CAEpC1X,kBAA0B0X,OAAH;MAAGA,UAAc,A,C;A,C,C,CAGxC,gBAAkC,MAAGuK,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAI7C,cAA6B,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAExClU,cAAkBkU,OAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE5B,YAAa,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,C,CA/BxBtgB,gBACQ,KAAA,0CACR,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,G,C,M,C,A,E,kB,iB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CEvoFFiF;EAEaqK;OrC4mDJvO,QAA8B,0CqCvmDrC;sBzCiQsCjC,gCyC9PhC,GAHN,UzCmQiBkI;MyCjQf5B;;;GAEMgT,YACFhT,UAAuBgT,kBAG7B,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAnT,uBrC2lDSlE,QAA8B,0CqCxlDrCvD;mBAGA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAgB;;;;;;;mBASE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAjBc,cACV4G,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,c,a,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCpDF4V;EACMuF;KACF,MAAOC;KAEP,MAAOA,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CNiFEzhB,oBACmB,O3BzBjB;wB2BiCA;SACF,A,C;A,E,C,CO/FF,qBAIE;KAAa,UACXuB;EACwBA,OAAhBmgB;OACV,AAEAC,UACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAEA;IAEIC,gBADF,OCJEC;iBDQAH;KAAgBA;SAGpB,A,C,Q,C,I,C,C,C,C,C,G,C,C;A,E,C,CAEA;;8BAIoBC;MAAhBD;MCjBAG;yCDoBgBF;MAAhBA;QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA2BA;GACmB,iBAGfG,UACA;aAEFA;KACIA,YACN,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CEyCE9hB;qDCfU+hB;MAARC;2DAAQD;MAARC;ODkBA,SAGF,A,C;A,E,C,CAodF7N;WACmC;MAElB8N;;;4CACS,QACtB;kBAHF;;kBAKEH;cAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CEhDA,aAAkC,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAGlC,cACEA,aACF,A,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,I,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,WAAA,OAAyB,A,C,Q,C,I,C,C,C,C,C,G,C,C;A,E,C,CCjjBzBI;IAIIC,SAAUC,uBADZ;;kBAGEC;eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIA,kBAIqBC,MAIjBC;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAC,cAAwE,qBAEzB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAI/C,gBACqBF,MAIjBC;QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,CvCAEviB;GACmB,gBAGf,MAAO8hB;MAET;MAAOA,QACOA,YAChB,A,C;A,E,C,CmC3CIW,oBKsLgC,QAAVC,ULnL1B;MAAO,MADU,WAEnB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CMyXEzhB,sBAIEgH;MACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAoSF,oBAEE0a,oBAWF,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3jB;GACoB,aAAS,MAAOyO;EAEvBqU;MAEFrU,UAAP;iBA/SAqU,QAmTJ,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA9iB;GACoB,aAAS,MAAOyO;EAEvBqU;MAEFrU,WAAP;iBA1TAqU,QA8TJ,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA9iB;GAEoB,aAAS,MAAOyO;EAEvBqU;MAEFrU,aAAP;iBAtUAqU,QA0UJ,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAc,kBAEE,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC,kBAEE,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC,kBAEE,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,kBAIEC,KAHc,SACRtB,WAGR,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAgB,oBAKE,MAAOZ,QAHO,SACDJ,WAGf,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAWA,kBC7vBEuB,QD+vBF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,YACElB,aACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEAA,yBAMEmB;;EAQiC,8BASjC;uBACF,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,wC,C;A,G,CJrwBEC,WAA2C,eAAoB,A,C;A,E,C,CAE/DrkB,kBACKskB;mCAD2B;OACf,SAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAG9C,iBACEA;mCAAAA;QAAY,IACd,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAtkB,iBAAuBskB;mCAAJ;MAAiC,CAAjB,SAAqB,A,C;A,E,C,CAExDtkB,iBAEEskB;mCAAAA;QAAY,IACd,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAtkB,iBACKskB;mCADuB;MACmB,CAA9B,SAAkC,A,C;A,E,C,CAInD,WAAA,OAAkB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAIlB,WAAA,OAAmB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,M,C,C,G,C,W,C,C,C;A,E,C,C;A,G,C,W,C;A,G,CAiEnBtkB,WAAkB,SAAQ,A,C;A,G,CAgB1BA,WAAmB,MAA4B,CAAjB,AAAPukB,eAA4B,A,C;A,E,C,CAMnDC,iBACMC;GAAY,QAAS;EACJ,UAAdA;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAiBA;EAGwChB;EACJA,OAClCiB;QACArf;QACqBoe;QAArBA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAkBAnO,eAEgBmO,YAAmC;GAE7CA,QACFA;KAGAkB;IA5D0B,AAAPJ,gBAaQpB,eAmDzByB,WAGN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOAvG,cAlG8C,CAAjB,AAAPkG,eAoGlB,4DAGF;kEACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA,iBACM,AA/EoBA,gBA+ECM,KAAAA,UACzBC;WACF,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,G,C,C,C,C,C;A,G,C,CAEA,iBACM,AApFoBP,gBAoFCM,KAAAA,UACzBE;aACF,A,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzP;EApHsBiP;GAAwB,CAAjB,SAuHzB,MAAOE;GAEL,UAAqBI,KAAAA,UACzBN;QAAO;EACaS,SACpBC;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAYA,cACEH,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,cAEEC,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,iBAE6BG,OAC3BA;YACAX;QAAO,AAAPA,kBACAY;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA;EApIuBZ;GAAwB,CAAjB;EAaCpB;YA6Hf;EAGG,GAOjBoB;QAAO,GAEP;KAAO,aAEDd,WACFA;mCAAAA;MAAyB,IACzBpM;WACAoM;;EACOA;GACHA,QACFkB;EAEFlB;mCAAAA;MAAyB;WAElBA,OAEX,AACAc;QAAO,AAAPA;GAxJ6BpB,eA2J3ByB,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,cApM8C,CAAjB,AAAPL,gBMvCGA,AN6OPE,eAEdA,AAAAA,gBAEFW;KAAYC,SACd,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CASA,kBA/K+BlC;YAgLf;GAjMGA,gBAmMfoB,QAAO,AAAPA,SAEAd,AADsCN;eAEtCoB;QAAO,AAAPA;GArL2BpB,eAuLzByB,SAEF;OAEFU,0BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBAhM+BnC,eAiMf,MACdmC;4BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cACM,AAxMyBnC,eAyM3BmC;KAMAb,AAAAA,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAtBmB,YACfhB,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKiB,YACfA,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAKmB,YACfA,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CAeJ,mBACE;MAAuCN,QAClC,WACOoC;yBAEV9B;QACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAuCN,QAClC,WACOoC,QAEV9B,wBACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,iBA5O+BN;GA6OzB,SACF,KACK,WACOoC,QAEV9B,UACF;KAIAgB,AAAAA,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CV7SY;IAENjd,UAAiBge,4BADnB;;kBAGEhe;gBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CgBnFF,oBACOkc;GAAD,AAoDmBa,cApDS,KAAA,gCAChCb;QACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,E,C,C,C,C,C;A,E,C,CAEA;;EAEOA;GAAD,AA8CmBa,wDA7CvBb;UACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,6B,C;A,G,CA8CA1jB,WAAqB,MAAU,AAAPukB,YAAgB,A,C;A,G,CAExCvkB,WAAmB,MAAGukB,aAAgB,A,C;A,G,CAEtCxR,iBAGIwR;KAGAA,UAEJ,A,C;A,G,CAyCAkB,WAA4B,MAtDLlB,kBAsD4BmB,QAAgB,A,C;A,G,CACnEC,WAAgC,MAvDTpB,kBAuDgCqB,QAAkB,A,C;A,G,CACzExI,WAAsB,MAxDCmH,kBAwDsBsB,QAAgB,A,C;A,G,CAC7DC,WACI,MA1DmBvB,kBA0DIwB,QAA2B,A,C;A,E,C,CA6CtDzQ;;8BArByB2N,aACA+C,0BAuBvBC;UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,gB,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3Q;;EArBuB0Q;mCAEf/C,0BAqBNgD;UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,a,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3Q;;wCAlBU2N;wCAoBRgD;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CASAhO,WAEE,MAAOiO,SACT,A,C;A,G,CAEAC,WAEE,MAAOD,SACT,A,C;A,E,C,CAEA,YAEE3B,SACA2B;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cAEE3B,SACA2B;sBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,eAtJ+B,AAAP3B,WA0JpB6B,AAAAA;KAIAC,MAAyBH,QACzBA;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA1B;EAIoB0B,OAClBA;YAEA;WAAe,mBACEI,OACfA;SAGF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA8BA;;6CAQIC,YACA;SAEkBC,SACpBC;UACAC;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,oBAOsBF,SACpBG;YACAD;aACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;;;sDAyB4B,AApQJnC;;MAyQpBqC,UACA;UA9IE,AA9HmBrC,iBA8HE,gCACzBA;SAiJA6B,AAAAA;6BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,iBAvJM,AA9HmB7B,sDA+HvBA;SA8JA6B,AAAAA;+BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CA7NA5B,cAIEqC,WACF,A,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,G,C,mB,C,E,CAXArC,4EAGiE,A,C,E,CAGjEA;;SAKA,A,C,E,C,CA6GApiB,mBAIE0kB;;;+CAvL6B,AAAPvC,QA2LlBmC;KAEAK;KAGFje,8BAaJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C,E,C,CAyFA1G,mBAGE;KAEcikB,OACZA;WACAK;;GACiB;6BAAQ,CAC7B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C,E,C,CAUAtkB;;KACE;;GACM,CAAC0G,QAAoB;EACTA;iBAEWA,SACzBA,AAAAA;aACIke,QAAkBA,QACtB;kBAEqB;GAEI,AAAvBX,eAGFY,WACA;SAEUZ;MACI,CAACvd,AAAAA,mBAEUA,SACzBA,AAAAA;aACIke,QAAkBA,QACtB;;GAGE,sBF3BN5d;;;;;GE4HM,MACoB,AAAlBid,kBACiBa;SAEIpe;YAIzBF;GAE+B,AAA7Byd,cACFc;GAGU,QF/HdlE;OEgI4B;;;;;;;;6CApcC,AAAPsB,SA4chB8B;;;SAKFE,SACA;eAIYF,MACZA;iBAEYA;KAEZA;KAAmBW,QAAkBA;;IAIzC,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAtU4B,WACtBN,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAoCY,YAERI,aACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKS,cAEPA,eACF,A,C,Q,C,C,C,C,M,C,I,C,M,C,C,C,I,C,C,C,Q,C,Q,C,I,C,I,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmEoB,WACtBF,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAWwB,WACtBQ,yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAqEEpnB;aAE2B4iB,UAAcyD,aACAvd,eACrC;oBAHF;;;sBAME;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,iB,C;A,M,C,CAEA;EAC2BA;;EACDud;;GAEf,cAESzD,aAAoBoE,oBADpC;;;EAImCA;;;;;MAGjC;SAGqBX;WACQ;;EAEzBgB;;;SACqBzE,OACeoE,QACAA;SAEfpE,OACcoE,oBAPzC;;;EAUmCA;;;;;MAGjC;;;QAQN,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,qB,C;A,M,C,CAEA;;;QAGqBpE,WAASyD,0BAD5B;;;cAG4Bvd,KAAAA;;;;;SACDA;;;;sDAOzBud;;WAEAiB;0CAeJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAfwB,YAGlBZ,uBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAAY;;;;8CAKS;KACjBY;UAEFZ,kBACF,A,C,Q,C,C,C,C,M,C,I,C,M,C,C,C,I,C,C,C,Q,C,Q,C,I,C,I,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CC/ORa,cACE,uDACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA+JAjS;;EACyB;;IAER,4CAYFoO,QAKb;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASApO;;EACmB;;IAEF,4CAQFoO,QAKb;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA6CApO;;EACyB;;IAER,4CAYFoO,QAKb;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAIApO;;EACwB;KAEtB;qCAEWoO,QAKX;SACF,A,C;A,G,CAWApO;;EACyB;;IAER,qCAIJoO,QAKX;SACF,A,C;A,E,C,CAGApO;;EAE4B,6BAC1B;0CAIWoO,QAKX;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAkDA6D;iBACE;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA2BAA;iBACE;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAiDAjS;;EACsB;;IAEL,0CAIJoO,QAKX;SACF,A,C;A,G,CAWApO;;EACsB;;MAIL;0CAKJoO,QASX;SACF,A,C;A,E,C,CA2LApO;;;2CAC6B;EACP;;IAEL,4CAQJoO,QAKX;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CA/hBM;;QACEL;sCAOEM,aAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CARI,WAAG,MAAY,qBAAS,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CACxB,sBAEI6D,0BAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAKI,WACN9D,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAgBA,YACEL,mCAGEM,uBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAJI,WAAG,MAAGtM,uBAAc,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACpB,aAAK,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAKD,WACNqM,iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAoDA;;QACEL;sCAOEM,aAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CARI,WAAG,MAAGpM,uBAAY,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAClB,sBAEIiQ,0BAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAKI,WACN9D,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAWF;IAAW,MAAI,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEP,WACNA,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkBA,YACE8D,yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEQ,WACN9D,cACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAUA,YACElc,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEQ,WACNkc,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAyIA,YACE8D,wBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEQ,WACN9D,mCACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAoBA;;MAGA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEQ;QAEJA,cACA;OAEFA,mCACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAmMA;GACY,aACR8D,kBACA;WAEI,YACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEQ,WACN9D,4CACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CR9WJ+D;EACEC;GCjf4C,CAAjB,AAAPnD;;;2EAtFZrB;MAARC;;EAiIyBD,IAAzBO;MACAA;MACA;QACA;MACAA;KAAmC,AAAPc;GAsBdpB,SAEZiC,KAAYuC,KDya8C;SACvB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAMvChoB,YAAiB,MAAwB,CAAA,AlCjlBfM,KkCilBNynB,wBAAiC,A,C;A,C,C,CAErD1nB;;YAC8B;;2CACK,QAEjC;MAAiB4nB,QAAyB,QAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CASAtS,WACE,MAAOoS,AAAAA,qBACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,WACEA,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,WACEA,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,0B,C;A,E,C,CExfA,YAEEG,QAAUzB,AAAAA,cACZ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iCAEE0B;QAAW9B,OAAmCI,SAChD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,+BAEE2B;QAAU3B,AAAAA,cACZ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EAuDyB7B;GAA0B,CAAnB,SAtDb;EAIsB,CAAA,AAAtB,YAAjBA;;GAEI,OAAuB,AAATyD,iBAAkBA;GAyddzD,SA2BLA,WAtcgB,WAIH,UAjDO0D,QAAeC,YACtD,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAEA,kBA4CyB3D;GAA0B,CAAnB,SA3Cb;GA+CU,cAmC3BA;;GA/EM,SA2C8C,CAAtB,WA1CP,AA4fL4D,AA5fMH,iBAElBA,AAAAA;OAGO,CAAA,iBAAPzD;;IAoCwB,UAnCN0D,QAAeG,cAIzC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA9S,iBAIS,CAAA,AAAPiP,uBAAAA;;GAuBiD,CAAnB,SAtBb,MAAO8D,QACxBC;SACA;MAAOD,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CA6BAroB,WAAkB,MANW,AAAPukB,cAMQ,A,C;A,E,C,CAE9B;EACS,CAAA,AAAPA,cAAAA;;GAVoD,CAAtB,aAY5ByD;GA0ZoBzD,SA2BLA,WAlca,UAeZyD,YAClBK;QAAgBhD,UAClB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAyBA,oBA5CyBd;GAA0B,CAAnB,SA8Cb;GAzCS,KA2CxBO;KAEAyD,uCAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,oBAtDyBhE;GAA0B,CAAnB,SAuDb;GAlDS,KAoDxBQ;KAEAwD,4BAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,iBA/DyBhE;GAA0B,CAAnB,SAiEb;EACV,CAAA,QAAPA;;GA7D0B,KA+DxBU;KAEAsD,cAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMA,YAEA,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,YAEA,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEAjT,YAEA,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUA;EAC8B0S;mCACIA;UAChCQ;EAlGuBjE;IAAO,aAoGrB,CAAA,SAAPA;;GACI,MACFyD,AAAAA,kBAGN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIA,kBAlH4BzD,OAuH1BA;QAAO,CAAA,SACP6B,AAAAA;WAAsByB,UACtBtD;QAAO,CAAA,AAAPA,uBACAkE;QA1HwD,CAAvB,UA2HnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EA7H4BlE;;GAUiC,CAA1B,UA0I/BA,QAAO,CAAA,SACP+D;SAIEI;gBAGFA,UAEAD;QA9JsD,CAAvB,WAgKnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,WAcEH,SACA/D;QAAO,CAAA,AAAPA,eAIEoE;wBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CASA,kBAhM4BpE,OAmM1BA;QAAO,CAAA,SACP9b;UACA8b;QAAO,CAAA,AAAPA,uBACAkE;QAtMwD,CAAvB,UAuMnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYA;EA9MyBlE;GAA6B,CAAtB,WAkdZ4D,AAlQCH,oBACV,CAAA,iBAAPzD;;GAtNsD,CAAvB,YAS/B,SAAeyD;WA8cCG;;QA/PP,CAAA,iBAAP5D;WAKJ,gBA3NiD,CAAnB,UA6N1ByD,YACA;SAhOoD,CAAvB;cAoO/BzD;QAAO,CAAA;KAEL2D;KAEAE;EAEK,CAAA,AAAP7D,uBAAAA;UAEF,GAvOoD,CAAtB,WAwOX,MACjByD,AAAAA,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,6B,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CA7GE;;EAjIuBzD;GAA0B,CAAnB,WACI,UAmIK,MACrCA;KAAO,CAAA;EACF6B;GAAD,CAACA,WAEHnD;OACS6E;;EAAAA;;KACT1B;KAEAA,UAEF7B,KAAO,CAAA,AAAPA,qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAsBA;;EApK2BA;IAAO,UAuKV,MACtBA;KAAO,CAAA,SACP6B,AAAAA;QAAiB2B,KACjBxD;KAAO,CAAA,AAAPA,qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA4EFkD,wBAKoCmB,eAClCnF;OACAA;SACAA;OAEA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIAoF;;;;wCACE;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,G,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,W,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CAwGA,YACEC,KAAmBpgB,QACrB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CASA,YACEogB,KAAoBC,QAAOC,SAC7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAMA,YACEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAG,WAAuB,OAAO,A,C;A,G,CAE9B,2DAEA,A,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAsCA,kBATwB1E;SAUL;GATgB,MAa/BA,SACA;OAEF2E,sBAMA3E;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAPoB;;EACDA,IACfA;;SACiC,MACjC4E;aACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,CAsBFnpB,YAAiB,MAAGmoB,eAAwB,A,C;A,C,C,CAE5C,oBACMA;YACkBA,SAApBiB;eAEmBjB,QAAnBA;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EAEwBiB;EACFhkB,OAApBgkB;;WAEEjB,YAEF/iB;QACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,eAhEwBmf,YA2BLA,SAuCG4D;YAApBiB;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,G,C,C;A,G,C,c,C;A,M,C,CCzqB4B,WAAG,MAAG1F,0BAAuC,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQxE,cAA+B,MAAG2F,yBACQ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAOf,WAAG,MAAG3F,mBAAsB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAuBxD+D;;;;;;;gBAMEjgB;OACAA;SACAA;OACA;SACF,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQA,cAEE8hB,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,+B,C;A,E,C,CA+BA,iBDiG+C,CAAjB,AAAP/E,eChGN;oCAEjB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBD4F+C,CAAjB,AAAPA,eC3FN;iCAEjB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIA,iBACMgF;WAAuB,MAC3BA;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,iBACMA;WAAuB,MAC3BA;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEAjU,iBACMiU;GAAc,SAEhBA,YACA9F;OAEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAIA,YACE+F,AAAAA,mBACF,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cAjEEF,aAmEF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,WAjEEA,UAmEF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,CAtDAG;EAEyCC;EACSC,UADhDJ;QAAgBC,AAAAA,AAAAA,gBAE+BI,cACjD,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAgEA;;MAGgBC,sBADd;;kBAGEP;SACA;iBAGAA,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAeA;;MAGkBQ,sBADhB;;kBAGER;SACA;OAEFA,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CA+EA;GACiB,KAAXhR,YACFgR;EACW,KAAXhR,UAAAA;;GACe,UAGbgR,QAGN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CAjBAS,iFAKA,A,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAkDA,iBACiB,KAAXzR,YACFA,QAAU,KAAVA,UACA;OAEFgR,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CAbAU,2DAI6B,2BAC7B,A,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,kD,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,oB,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,M,C;A,G,CEuFA/G,WAAe,MAAGgH,SAAiB,A,C;A,E,C,CAInC9pB;EACqB8pB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,iBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/pB;EACqB8pB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/pB;EACqB8pB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,iBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/pB;EACqB8pB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,mBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAnG;EACqBkG,OACnB;OAAOC,AAAAA,yBACIA,QACX,AACA;MAAO,qBACuBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAlG;EACqBiG,OACnB;OAAOC,AAAAA,yBACIA,QACX,AACA;MAAO,qBACuBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjG;EACqBgG,OACnB;OAAOC,AAAAA,yBACIA,QACX,AACA;MAAO,qBACuBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EACqBD,OACnB;OAAOC,QAAAA,iBACIA,QACX;EAC8CA,QAE9ChB,AAD6BgB;kCAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAtG;EACqBqG,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,iBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAWA;EACqBD,OACnB;OAAOC,QAAAA,kBACIA,QACX,AACA,AAACA;2BAC6BA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjH;EAEqBgH,OACnB;OAAOC,QAAAA,iBACIA,QACX;EAC8CA,QAC9C;MAAO,AAACA,qCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAsBAlqB,YAAqC,MAAGmqB,cAAcC,QAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1EjqB;MAEWkqB,UAAP;oBADF;;kBAGE;MAAOC,eAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAnqB;MAEWoqB,YAAP;oBADF;;kBAGE;MAAOD,eAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAnqB;MAEWqqB,cAAP;oBADF;;kBAGE;MAAOF,eAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAvG,oBAC4B0G;KAExB;KAEA,wBAEJ,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzG,oBACiC0G;KAE7B;KAEA,wBAEJ,A,C,mB,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzG,oBAEkC0G;KAE9B;KAEA,wBAEJ,A,C,mB,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAvBW,WAAG,MAAG,mBAA0B,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEhC,WAAG,MAAG,mBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAOzB,YAAM,MAAG,qBAAoC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAE7C,YAAM,MAAG,qBAA6B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQtC,cAAa,MAAG,uBAA4C,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAE5D,cAAa,MAAG,uBAAqC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,G,CAkBhE1H,WAEE,MAAOiH,AAAAA,eACT,A,C;A,C,C,CAEAvjB;EACekI;EAAAA;YACSA,QAAuB,QAEzB;MAAOqb,AAAAA,gBAG7B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAIA/pB,cACE,MAAO,6BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA8iB,cACE,MAAO,6BACT,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,iC,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA9iB,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA,cACE,MAAO,6BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAA,gBACE,MAAO,+BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA4jB,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,YACE,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAL,cACE,MAAO,6BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAMA,cACE,4BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAKS,WACPM,8BASF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CATyB;QACrB7gB;;;;;OAE6C0lB;GACnC,QACR1lB;aAGJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAqGmB,8EAIjBunB;gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,G,CAQFC,WAAmD,cACvB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CAC5BC,WAAmB,cAAW,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CAC9BC,WAA6B,cAAgB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CAC7CC,WAA+B,cAAiB,A,C;A,E,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C,C,C;A,G,CAChDC,WAA6C,cAAwB,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CACrEC,WAAuD,cACzB,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CAC9BC,WAAyD,cAC1B,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CAC/BC,WAA+C,cAAyB,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CACxEC,WAAmC,cAAmB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CAGtDC,YAAuB,cAAa,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,I,C,C,M,C,C,C,C,C;A,G,CACpCC,WAAqB,cAAY,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,oB,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,G,CAMjCtI,YAAgB,OAAO,A,C;A,G,CACvBuI,WAAqC,YAAiC,A,C;A,G,CACtEvI,WAAoB,YAAO,A,C;A,E,C,CAE3BjjB,YAAqC,MAAGoqB,gBAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEpEzjB,cAAwB,OAAO,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAI/BxG,cAA0D,MACtDsrB,0BAA6D,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEjExI,cAA6D,MACzDyI,0BAAsD,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,iC,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAE1DvrB,YAAiB,MAAGwrB,wBAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEjDxrB,cAA8B,MAAGyrB,0BAAuC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAExEzrB,gBAA6C,MACzC0rB,4BAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEnD9H,YAAmC,SACW,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE9CC,YAAgD,SACG,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEnDC,YAAyD,SACL,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEpD,YACE6H,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAlI,cAA+C,MAC3CmI,0BAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKnD,cCj2BA5H,ODi2BwB;OAAqC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C,A,E,mB,kB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CIt2B/DnkB,cAA0B,MAAK,WAAI,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEnCL,YAAwB,MAAGqB,SAAU,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C9CD7BG;;wBAME;iBAoBN;MAAO,iBACT,A,C;A,E,CAEMA,cAA2B,mDAAwB,A,C;A,E,CAq4BnDA,YAA2B,iDAAqB,A,C;A,E,C,C+CrhBxDjB;GACM8rB,eAAsC,aAC1CA;;;IAGEC,kBAEAD,iBAEM,SAAA;YAAA;SAAR;M5C5I2Brf,M4C6I7B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA;EAiBgBzL;;GAGd;eAAc,MAAwB;GAChC,CAAC2Y,MAAe;MACHA,OACjB1F;;GACsB,AAAZ9O,eAEZ,GASI,CAACwU,UACO,KAA4B;;EACrB1F;;EACGA,eAEN0F;GAEV,CAACA,UACO,MACR1F,cACA;;;EAGkBA;GACY,AAAtB+X,kBAECrS,UAIX;KAAOA,iBAEMA;GAED,OAQR,eAAc,MACD;;EACyB,KAA1B1F,KAAAA;6BAA0B;SAEtC,AACAA,aACA;QAEJ;;GAIqD,AAA3B,AAAtB+X,SAAwBC,eAOtB,EAAe,AAAbhY;mBAQZ;eAAc,MAA+B,AAAbA;;EACM,KAA1BA,KAAAA;6BAA0B;;;SAKtC,GACY,QACVA,SAEFA;SACAA;UACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C/ChEQhT,2CAME;wCAMA;oBAcN,MAAO,iBACT,A,C;A,E,CA20BMA,kBAME,wDAqBR,A,C;A,E,C,CgD5vCAiB;IACE;iBAAkB,EAAEyU,gBACJA;;yBAAwB,cACxC,EAEa;IAEXA,cACArP;;MAEA4kB;qBASA5kB;;8BAGAqP;QAGF,M7CwKyBlK,S6CvK3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,kB,C;A,E,ChD3CAhN,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,G,CAE/BzD,YACE,2CACF,A,C;A,G,CAEAA,YACE,MAAO,oFACT,A,C;A,E,C,CAEAT;wBA8L8B,mBA5LZqsB,OACd;kBAiNW,6DA/MAC,OACX;kBA8MW,kBA5MAC;WACO,QAElB;MAAqC,AAA9BC,WAsOEC,mBApOb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAzsB,kBACS0sB,SAAAA;UAAP;MT0M6BlsB,0BSzM/B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cACEoB,uBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEA4M;wBAqK8B,mBAnKZ6d;;;eACd,2DAEWC;;;eACX,gBAEWC;WACO;IA+MTE;EA7MGD,YACZ;MAAc,YAA8C,MAEhE,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;wBAqJ8B,mBAnJZH;cAC4BM,MAArBN;UACrBO,iEAEWN;cACsBK,MAAfL;UAClBM,sBAEWL;cACsBI,MAAfJ;YACPE;;YAGTI,eACA3oB;QAAO,AAAPA,SACAyK;oBAEY6d;GACF,OAC6B;gBAGrCtoB;QAAO,AAAPA,SACAyK;gBAIR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CASAH;wBA+G8B,gBA7G1B,MAAOse,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IA2JTE;EAzJGD;GACF,IAAK,MAGftoB;QAAO,AAAPA,SACAyK;YAGA;yBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,eACc,AAARzK,WACyByK,YAAR4d;YAARD;YAAXD;YACAnoB;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;EACcwoB,SACZ;MAAyBxkB,aAAe,eAEtCmP;WAAY;OACoB1I,aACxB,KAAA,YAEV,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/N;EACM+N;GAAM,QAAS;QACIzK;;EAITmoB;GACF;UAGV;YAAkB,uBAIlB;EAISC;GACF;UAGP;QAAkB,wBAMlB,GAISC;GACF;UAGP;QAAkB;UAIhB;QAAkB,wBAIlB,CACF,CAGK5d,SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,+BAEIzK,QAAO,AAAPA,SACAyK;aAEFke,YACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAre;GACY,SAkCG,cAjCDue;WAEV7oB;QAAO,AAAPA,SACAyK;YACA;cAEA,OAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAaAhP,YAIE,MAAkC6a,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAwCA7a;WACsB;UAEpB;QAAkB,YACiB,aAAQ,QAC3C,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,C,CArCAyC,wBAIE;oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,E,C,CAEAA;YAYA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C,E,C,CAoBAA,oCAQEyqB;;gCAEA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA5QwC,YAAO,MAAG,eAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmB/B,YAAO,MAAc,MAAX,sBAAcnkB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAIpC,cACZ,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CAuPF/I,YAIE,MGpUyCye,mBHqU3C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAze;WACsB;UAEpB;QAAkB;yBACkC,SACpD,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,4B,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CAUA6O,iBACM,AAACwe,gBAAgB,MACrB;0CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAhtB,eACM,AAACgtB,gBAAgB,QACrB;sCACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAxe,iBACM,AAACwe,gBAAgB,MACrB;2CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEArtB,YAIE,MAAkCstB,sBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAttB;WACsB;UAEpB;QAAkB,YACZutB,qBAA4C,QAClD,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAhtB,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAlC3C6e;yDACiE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAd,gCAAI;SAAQC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAyC/DztB,YAAe,MAAGkP,AAAAA,YAAY,A,C;A,G,CAC9B7O,YAAiB,MAAG6O,AAAAA,gBAAiB,A,C;A,E,CAErC5N,kBACmC4N;aAAMA;wCAAvC;SACF,A,C;A,E,C,CAEA7O,cACE,MAAO6O,AAAAA,eACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EACcA;EAAAA,MACZ;mBAAwD,SACtDD;OACgCC,UACxB,KAAA,SAEV,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CAWAlO,WAAc,MAAGyI,SAAQ,A,C;A,C,C,CAEzBpJ;EACa2O;EACE0e;EACmBxe;OAAAA,UACxB,KAAA;QACU,aAChBzF,YACA;cAEAA,YAIAikB;WACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,wB,C;A,E,CAgEA1tB,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,G,CAE/BzD,YACE,2CACF,A,C;A,G,CAEAA,YACE,MAAO,oFACT,A,C;A,E,C,CAEAT;wBA8L8B,mBA5LZqsB;WACO,QAErB;MAAY,8DAEDC;WACO,QAElB;MAAY,mBAEDC;WACO,QAElB;MAAqC,AAA9BC,WA8MEC,mBA5Mb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAzsB,YACE,MAAOkI,4DACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cACEtG,uBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEA4M;wBAiK8B,mBA/JZ6d;WACO;MAErB;oBAA+BiB,0DAEpBhB;WACO;MAElB;oBAA+BgB,eAEpBf;WACO;IAmLTE;EAjLGD;GACF,IAAK,MAEf;MAAOc,aAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;wBA2I8B,mBAzIZjB;cAC4BM,MAArBN;UACrBO,iEAEWN;cACsBK,MAAfL;UAClBM,sBAEWL;cACsBI,MAAfJ;YACPE;;iBAGgBc;OAGbf;GACF,KAERc;YAEyBC,gBAKjC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA/e;GACME,WAAkB,MAAO;EACnB8e,UACV;aACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAhf;wBAsG8B,gBApG1B,MAAOse,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IA8HTE;EA5HGD;GACF,IAAK;kBAIfiB;UAGA;MAAOH,UAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,eACc,AAARppB,WACkCwpB,YAATC;YAARpB;YAARD;YAAXD;YACAnoB;SAuCF0pB;QAAsC,AAAL,AAAfA,oBApCpB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;EAC2BD;EACLC,OACpB;KAAY,UACVvW,SAAOiW,QAAWA;GACA,IAAGM,aACb,KAAA;EAEDN,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;gBAG+BC;KAE3BD,SAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA9e;WACqB;;WAED,MAClBif;;WAEA;MAAOH,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAUAO;;GAEMF,eACOD,SAATC;iBAEyBD,OACzBJ;MACQQ;QAARJ;UAEFxpB,QAAO,AAAPA,SAbA0pB;QAAsC,AAAL,AAAfA,kBAelB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA;EAC+BN;EACJA;WAGvBK;KAEAjJ;WAIAgJ;KAEAroB,QAEFnB;QAAO,AAAPA,SAlCA0pB;QAAsC,AAAL,AAAfA,mBAoCpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAaAjuB,YAIE,MAAkC6a,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAoBA7a;WACsB;UAEpB;QAAkB,WAEF,KAAV2tB,cAAkB,QACxB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAeAptB,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,C,CAb3ClM;;gCAUE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAzPwC,YAAO,MAAG,eAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAuBzC,YAAO,MAAc,MAAX,sBAAcsG,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAI1B,cACZ,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CAkOF/I,YAIE,MG3vByCye,mBH4vB3C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAze;WACsB;UAEpB;QAAkB,WAEF2tB;yBAAiB,SACjC,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,kC,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CAWA9e,iBACM,AAACwe,gBAAgB,MACrB;0CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAhtB,eACM,AAACgtB,gBAAgB,QACrB;sCACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAxe,iBACM,AAACwe,gBAAgB,MACrB;2CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEArtB,YAIE,MAAkCstB,sBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAttB;WACsB;UAEpB;QAAkB,WAEZutB,QAAQI,mBAAiB,QAC/B,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,M,C,C,E,CAlCAS;gEAEiE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAd,gCAAI;SAAQX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,O,C;A,E,CAkD/DztB,YAAe,MAAGkP,AAAAA,YAAY,A,C;A,G,CAC9B7O,YAAiB,MAAG6O,AAAAA,gBAAiB,A,C;A,E,CAErC5N;EACyC4N;aAAMA;wCA2B7Cmf;KAAQnf,IA3BR;SACF,A,C;A,E,C,CAEA7O,cACE,MAAO6O,AAAAA,eACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EAC2BA;EAAAA;EACLA,IACpB;KAAY,UACVD,SAAE0e;GACgB,IAAGze,UACb,KAAA;EAEDye,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CAaA3sB,WAAc,MAAGyI,SAAQ,A,C;A,C,C,CAEzBpJ,iBACwB6O;GAAH,AAAf+e,UAAkB/e,UACd,KAAA;OACGmf;YACT5kB,YACA;cAEAA,QAAW4kB,OACXA;QAAQA,AAAAA,aACR;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,K,C;A,E,CA+DA/sB,gCACsCgtB;wCAApC;SACF,A,C;A,E,CAEAtuB,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,E,C,CAE/BlE;wBAkLsC,mBAhLpBqsB,OACd;kBAuMW,6DArMAC,OACX;kBAoMW,kBAlMAC;WACO,QAElB;MAAwC,AAAjCC,WA4MEC,mBA1Mb,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA9rB;0BAmKsC;;KAjKlC,MAAO;EAEE4rB;WACO;IAmMPE;EAjMCD;GACF,IAAK,MACf;MAAO0B,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAGAluB;wBAsJsC,mBApJpBqsB;;;gCACOA;;IACrB,MAAOO,gEAEIN;;;gCACOA;;IAClB,MAAOM,qBAEIL;;;gCACOA;;MACPE;;;QAMC,AADED,gBACI;UAGlBtoB,QAAO,AAAPA,SACAiqB;YACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAA,QAAA,OACEC,SADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEApuB;wBAqHsC,gBAnHlC,MAAO8sB,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IAmJTE;EAjJGD;GACF,IAAK,QAGftoB;QAAO,AAAPA,SACAiqB;;aAIA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAoBA,eACc,AAARjqB,WACyBiqB,YAAR5B;YAARD;YAAXD;YACAnoB;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAtD;EACMutB;GAAU,QAAS;QACAjqB;;EAITmoB;GACF;UAGV;YAAkB,uBAIlB;EAISC;GACF;UAGP;QAAkB,wBAMlB,GAISC;GACF;UAGP;QAAkB;UAIhB;QAAkB,uBAGlB,CACF,CAGK4B,SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAnuB,iBA4Ce,WA3CuB;MAEpCkE;QAAO,AAAPA,SACAiqB;YACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAnuB,iBACY,SAmCG,uBAjCXkE;QAAO,AAAPA,SACAiqB;YACA;cAEA,SAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAcAxuB,YAKE,MAAkC0uB,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAwBA1uB;WACsB;UAEpB;QAAkB,WACiB,aAAY,QAC/C,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CAmBAA,YAIE,MGhrCyCye,mBHirC3C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAze;WACsB;UAEpB;QAAkB;yBACsC,SACxD,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,e,C;A,E,CAyEAgB,WAAc,MAAGyI,SAAQ,A,C;A,C,C,CAEzBpJ;EACiBmuB;EACFd;EACuBiB;OAAAA,UAC5B,KAAA;QACU,aAChBllB,YACA;cAEAA,YAIAikB;WACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAuEApsB,qCACyC2sB,0BAyXvCI;KAAQM,AAAAA,OAzXR;SACF,A,C;A,E,CAEA3uB,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,E,C,CAE/BlE;wBA+MsC,mBA7MpBqsB;WACO,QAErB;MAAY,8DAEDC;WACO,QAElB;MAAY,mBAEDC;WACO,QAElB;MAAwC,AAAjCC,WAiOEC,mBA/Nb,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA9rB;0BA4LsC;;KA1LlC,MAAO;OAEI4rB;WACO;IAwNTE;EAtNGD;GACF,IAAK,MACf;MAAO0B,AAAAA,kBAEX,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA;EAC2BP;EACLC,OACpB;KAAY,UACVvW,SAAOiW;GACW,IAAGM,aACb,KAAA;EAEDN,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAOA3sB,kBACM+sB;6CACJ;MAAOA,SACT,A,C;A,C,C,CAGA1tB;wBAwJsC,mBAtJpBqsB;;;gCACOA;;IACrB,MAAOO,gEAEIN;;;gCACOA;;IAClB,MAAOM,qBAEIL;;;gCACOA;;MACPE;;iBAGgBc;QAIf,AADEf,gBACI;OACSe,YAG3B,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAA,QAAA,OACEa,SADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEApuB;wBAuHsC,gBArHlC,MAAO8sB,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IAiJTE;EA/IGD;GACF,IAAK,QAIfiB;yBACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAmCA,eACc,AAARvpB,WACkCwpB,YAATC;YAARpB;YAARD;YAAXD;YACAnoB;SAyBF0pB;QAAsC,AAAL,AAAfA,oBAtBpB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA5tB,iBAEW,WAAS;KACautB,UAC/B;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAvtB;WACqB;;WAED,QAClBytB;;WAEA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUAc;;GAEMZ,eACOD,SAATC;iBAEyBD,OACzBJ;MACQQ;QAARJ;UAEFxpB,QAAO,AAAPA,SAbA0pB;QAAsC,AAAL,AAAfA,kBAelB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA;EAC+BN;EACJA;WAGvBK;KAEAjJ;WAIAgJ;KAEAroB,QAEFnB;QAAO,AAAPA,SAlCA0pB;QAAsC,AAAL,AAAfA,mBAoCpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAcAjuB,YAKE,MAAkC0uB,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAoBA1uB;WACsB;UAEpB;QAAkB,WAEE,KAAd2tB,cAA0B,QAChC,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C,C;A,E,C,C;A,G,C,e,C;A,E,CAyHA3sB,WAAc,MAAGyI,SAAQ,A,C;A,C,C,CAEzBpJ,iBACwBsuB;GAAH,AAAfV,UAAkBU,UACd,KAAA;OACGN;YACT5kB,YACA;cAEAA,QAAW4kB,OACXA;QAAQA,AAAAA,aACR;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,CiD/uDAruB,YAAe,MAAGwY,MAAAA,SAAc,A,C;A,C,C,CAChCxX,cAAwB,MAAGwX,MAAAA,WAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CCmCnDvX;+BAC+B;UAAwB,4BACb;;yBAExC,MAAA,kBAAA,aAAA;EAAgC;8BAAR4G;OAAqB,AAC7C,SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAIAtH,YAAkB,MAAGM,oBAAwD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CHgJ7EC,cAA2B,MAAG,qCAAuC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAErEA,cAAqC,kDAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKrET,mBACE;MAAA,cAAA,UACQ,KADR,UACoB,QACpB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAA,cAAA,OAAwB4O,SAAxB,OAAkC,CACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA4BA1O;EACyB;GACnB,CAACsuB,MAAqB;EACJ;UAEpB,SACkBA,O5COpB7hB;KAA6CA,a4CNlC6hB,MAAoB;KAE7BC,SAAgBD,QAChB;KAAOA,Q5CGT7hB,KAA6CA;M4CDzB6hB,O5CCpB7hB;KAA6CA,O4CA3C,CAEF,M5CSyBA,M4CR3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEA3M,mBACE;MAAA,cAAA,UACM4O,SADN,aACkB,QAClB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAhO,cAAwC,MACpC,+BAA0C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,CAI9CjB;EAGgB6uB,aACd;QAAO3U,UAEP,AACA;SACF,A,C;A,G,CAEA7Z,YAAiB,MAAG,CAACwuB,AAAAA,kBAAmB,A,C;A,G,CAExCxuB,YAAoB,MAAG,AAAC0uB,qBAAO,A,C;A,E,C,CAE/BjuB,cACE,MAAO,gCACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMAA,cACE,MAAO,gCACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAcAE;EACgB6tB;GACV,CAAC3U,wCAIL;KACWA;MACHA,MAAc,AACtB;SACF,A,C;A,E,C,CAUA1Z,uBACE;MAAA,cAAA,UAAA;GACMoX,iBAAe,SACrB,2CAGF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,e,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAgCA5W;2CAC6B,SAAW,KAAA,OAEtC;MAAA,kBAAA,UAAA;;GACgB,SAAM;EACX,SACX,KACM,KAAA,QACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAkBAT,YAAkB,MAAGyuB,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,CInW5C1tB,YAAyB,uB3DoQaC,qC2DpQe,A,C;A,E,C,CAErDP,cAAuB,MAAG,aAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAErC;EACe;6BAAA;GACb;KAAkB,SAChB0W,SAAO;GACI,IAAG,gBACN,KAAA,SAEV,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEArX,YAAiB,MAAU,MAAPO,cAAW,A,C;A,G,CAE/BP,YAAoB,MAAG,CAAC0uB,YAAO,A,C;A,G,CAO/B/tB,eACa,KAAPJ,gDACJ;MAAO,UAAY,KAAPA,eACd,A,C;A,E,C,CAQAP;EACe;;GACb;YAAoB;6BAAA;KAAF;GACJ,KAAR,eAAoB;GACb,CAAA,MAAG,iBACN,KAAA,aAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAaAA;EACe;6BAAA;GACb;KAAkB,YACZuX,SAAK,kBAAU;GACR,IAAG,gBACN,KAAA,SAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAiDArX;GACa,KAAPK,cAAa;EACK,QAAA;SACtB;MhD8GyBoM,MgD7G3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEAlM,cAAwC,4CAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE3EA,cAA2B,uCAAkC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA0B7DA,cAA4B,MAAG,qBAAsC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYrEG;iCAGa;UAAwBL,mBAEZA;6BAAAA;;;8BAEvB;YAAoBA;6BAAAA;KAAF;EACJ;8BAAZiH;WACF,AACA,SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,C,C,CAWA,oBACO,UAAA;UAAW,UAAhB;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,uBACE;MAAA,QAAA,UAAA;EACO,UAAA;UAAW,UAAhB;cACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAxH;GACE;YAAoB;6BAAA;KAAF;GACJ,KAAR,gBACF,YAA6B,KAAZ,gBAAyB,IAC1C;UAAY,KAAZ,cACA;aAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA8BA,YAAe,aAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAahC,c1DnQEe,SAAuB,KAATC,iB0DyQhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAkBA;GACY,UAAa,MAAE,iBACjB,KAAA,SAA+B;;GAE/B,UAAe,MAAE,iBACjB,KAAA,SAAiC,aAE3C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAJ;EACyB,UACvBC;;EACiB;2BACA;;6BADA;GAEjB;KAAkB,WACJ,SAAW;8BAAvB2G;OACF,AACA,SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/G,gBACEI,cACA;MAAO,kBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACEA;;EACiB,GACjB+tB;YAA4B,KAAZ,kBAChB;UAAY,KAAZ,eACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA;;GAtCY,UAAa,MAAE,iBACjB,SAA+B;;GAE/B,UAAe,MAAE,iBACjB,SAAiC;EAoCxB;GACN,UAAM;GAEH;;;WASA1tB,AAAAA;iCAZG;;EAeS6V;6BAAAA;GAAF,AAAT;;GAGA,IAEb,MAAoB,IAAO,SACzB,SAAW,IAAOA,MAAqB,KACzC;KAEA,QAAkB,QAChB,SAAW,IAAOA,MAAqB,KACzC,CAEJ,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA4BApX;EACoB;6BAAA;GAAH,KACb;GAKF;YAA6B;6BAAA;KAAF;GACb,KAAR,eACF,aAEJ,AACA,SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOAA;EAE6B,KAAZ,aASf;kBAA2B,WAAO,YACpB,KAAR,eACF,QAEJ,AACA;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA,sBAC2BY;6BAAAA;EAAF;UACf,KAAA,SAA+BA;OAE1B,YACX6tB,WACA;OAMF,UAAW,KAAX,cACAQ;UAAe,IAAK,eACpB;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA;WAC2BruB;6BAAAA;EAAF;UACf,KAAA,SAA+BA;;8CAG1BW;EAESA,OAItB;UAAY,KAAZ;6BAJsBA,OAKtB0tB;UAAe,IAAmB,eAClCC;eACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;;0EAE4B3tB;6BAAAA,OAAxB0tB;YAAsB,YAEtB,MAAA,QAAA,aACY,GAAV;WADF,QAEA,CAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIA1uB;GACM8rB,eACF;EAGW;IAEXA,aACAxkB;SACAA;YACAA;kBAECwkB,eAGH,MhDpPyBrf,SgDqP3B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CH5ac;GACL,KACDnF;;QAGFA;OACAA;UACAA;QACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,CjD0SJvG,gCAiTa6tB,QACcA,QACTA;wCAnTO;SAAkC,A,C;A,E,C,CAE3D;EAC0BtqB,OACxB;MAAaJ,QAAS,IAAGE,UAAmB,CAAA,AAAL,IAAsB,AAAdD,AAAAA,yBACtCA;0BAAAA,SAAPgT;SAAOhT;GAqMqB,IAAGG,aACzB,YApMR,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAxE,YAAiB,MAAGoE,WAASE,QAAK,A,C;A,E,CAElC3E,YAAe,MAAmB,MAAT,KAAN2E,QAAQF,SAAwB,AAAdC,AAAAA,kBAAkB,A,C;A,G,CAOvD1D;EACMyD;EAASE;;EACND;EAAmB,KAAL,UAAsB,AAAdA,AAAAA;qBAAtBA,SAAP;MAAOA,MACT,A,C;A,E,C,CAQA1D;;GACY,UAAa,MAAEJ,oBACjB,KAAA,SAA+BA;EAEhC8D;EAAQD;;EAAkBC;EAAH,CAAA,AAAT,IAA0B;mBAAxCA,SAAP;MAAOA,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAzD;+BAGW;UAAwBL,4BAEZA;;yBAErBwuB,UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,C,C,CAIA,cACEhsB,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;;0EAGmBrC;EACF;6BADEA;EAEJ;EAAc2D;EAAAA;GAAH,QAgON2qB;6BAAAA;;;wBAElB1qB;QAAQyqB,UACR1qB;SACAD;SRnZA5D;eQmLI8D;QAAM,KAANA,kBAG+BA;6BAAAA;EAAF;GAChB,KRvLjB9D,SQwLmC,QAC7B8D;QAAM,KAANA,kBAEwB,GR3L9B9D;SQ4LmC;EAC7B6D,OR7LN7D;eQ8LM8D;WAGJE,QAAkB,AAAlBA,eAEA,MAAA,QAAA,OAA4BzB,UAA5B,OAAyC,CAE7C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/C,qBACE;MAAaoE,QAAS,IAAGE,UAAmB,CAAA,AAAL,IAAsB,AAAdD,AAAAA,yBACjCA;0BAAAA;GACA,KADAA,SAEV4qB,UACAzqB;QAAkB,AAAlBA,SACA;UAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAuCA;EACMJ;EAASE;GAAH,OACR,MAA+CD,UAAAA,WAAc,IAAvC,QAAsB,CAAA,AAAL,+BAAQA,SAC7CA;UACF,AACQC,SAARF;SACAI;QAAkB,AAAlBA,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGAtE,YAAkB,MAAGM,oBAAwD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAiE7E;EACE6D;EAAOC;gCAAPD,SAAAA;;EACoB,CAAA,AAAL,IAAsB,AAAdA,AAAAA,qBAAvBC;;GACIF,YAAgBG,SACpBC;QAAkB,AAAlBA,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYA7E;EAC2B,AAAd0E,AAAAA;GAGO,AAFmB,CAAA,AAAT,EAAED,eACK,KAAV,KAANE,eAIjB,MAAYF,UAEVC,uBAFO,aACkB,CAAA,AAAL;mBACpBA;EAAYA;mBAAZA,SAAAA;OAEF,cAFEA,SAGFA;SACAD;QAAoB,CAAA,AAAL,UACf;MAAoB,CAAA,AAAL,kBAEK,KAAL,KAANE,aAATA;SAEA;MAEED,uBAFO,aACkB,CAAA,AAAL;mBACpBA;EAAYA;mBAAZA,SAAAA;OAEF,cAFEA,SAGFA;SACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA;QAC+C,AAAdA,AAAAA;;;EACnBA;EAAgBD;EAAF,AAAdC,URtXZ7D;;EQwXiC4D;EAAOC,ORxXxC7D;SQwX+B,QAC/B4D;SACAE;QAAQD,AAAAA,cACRA;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA1E;EAEMyE;EAASE;6BAAAA;GAAH,QACW;EACQD;EAAQD,ORlYrC5D;eQmYE;gBAEoB6D;EAAc,AAAdA,URrYtB7D;;EQuYiD8D;6BAAAA;EAAOD,ORvYxD7D;SQuY+C,QAC7C;MAAa,MAAN8D,YAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAnTA4qB;;;mBAOE7qB;oBACF,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,G,C,I,C,E,CARA6qB;;SAQA,A,C,E,C,CAmNA9sB;;EAEyB,CAAN,AAAA,WACjB;eAC0B,CAAA,EAAU;SACb,SAEvB,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,kB,C;A,E,CA+GAzB,WAAc,MAAGyI,SAAQ,A,C;A,C,C,CAEzBpJ;EACEmvB;GA9G8B,AA8GJ3qB,UA9GOA,UACzB;EA8GJ4qB;OAAaC,SACfjmB,YACA;WAES+lB;;cAAAA,SAAX/lB;QAAW+lB,IACXC;QAA4B,CAAA,AAAL,IAA6B,QACpD;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,e,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CqD/nBAzvB;EACM2vB;WAAe;EAMMC,OAIzB;0BACSC,QAASlJ;;GACP,YACHA;;EACGkJ,QAASlJ;GACP,aAEiBA,IACxBA;KAAemJ,IACfA;;GAEInJ;UAGNoJ;EAEUpJ;;YACI,YACVA;;EACGkJ,QAASlJ;GACP,aAEiBA,IACxBA;KAAgBmJ,IAChBA;;GAEInJ;UAGNqJ;EAEUrJ;;KAId,AAEAqJ,KAAarJ,IACboJ;KAAapJ,IACbA;KAAeiJ,IACfjJ;KAAgBiJ,IAChBD;SAEAC;SACAA;SACAK;QAAW,AAAXA,SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAsBAC,mBAEE;UAAOvJ,KAAc,aAEnBA,KAAgBoJ,IAChBA;OAEF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAG;GACMP,cAAe;GAEV,CAAA,KADEQ,cACI;EACSR,OACxBS;QAAM,AAANA;EAEIT;EACMA;WAARA;OAIQU,UAARV;SAGAA;OAEF9qB,QAAkB,AAAlBA,SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQA,qBACEurB;QAAM,AAANA,SACAvrB;QAAkB,AAAlBA;GACI8qB,eACFA,SACA;SAGO;EACKA;MAAZW,MACAA;KAAaX,IACbA;eAEAW,MACAA;KAAYX,IACZA;UAEFA,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAmGA3vB,cAA6B,MAAGuwB,cAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAIvD1hB;GAEM,AAACwe,gBAAgB;GACX,AAANsC,iBAEO,KADEQ,cAGT,MAAOK,AADqBb,UAIhC;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA9gB;GACM,AAACwe,gBAAgB;EACOiC;GAChB,QAAS,MAAOkB,IAC5B;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;;EAIaL;GACF,WAEPK,AAD4Bb,WAE5B;OAEFc,qDACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAyBA,cACExuB,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA5B,YACE,MAAQsvB,eACV,A,C;A,G,CAEAtvB,YAAoB,MAAG,AAHbsvB,eAGqB,A,C;A,E,C,CAE/B;;qCAsI2Be,QACPA;mBApIlB;KAAOC,UAC0BA;SAC/B1hB;SAAEqhB,SAAUA,SACd,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAEAtwB,YACE,MAAOowB,SACT,A,C;A,E,C,CAEA,YAvKET,YACAS;SACAvrB;QAAkB,AAAlBA,UAuKF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAxE,YACE,MAAOgtB,kBAA8B,KAAZ8C,cAC3B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA9vB,YAcE,MAAOuwB,iBAZiBX,gBAYXN,SACf,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEA7uB,YAAqB,2CAAqC,A,C;A,G,CAE1DA;wCAAuB;SAA0C,A,C;A,E,C,CAEjEP,YACE,MAAOoO,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CArKAkiB;;;+EAEqE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAd,gCAAI;SAAQpD,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CA8GnD,cAAmB,gBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAiCpDptB,uBACE;+BAAY,aACK,KAAXiwB,OAAqB;GACH,IAAGL,UACjB,KAAA;EAEJK;GAAW,SAAWM,oBAAmB;EACtCN,KACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,E,CAsHFhY,iBACMwY;WAAsB,MAC1B;MAAOC,YACT,A,C;A,E,C,CAEA,iBACE;MACEC,QADU,UACVA;EACOV,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAsBAjwB;EAC4B4wB;GAAH,AAAnBpsB,UAAsBosB,UAClB,KAAA;EAOJD;G7D5PcpwB,c6D6PhBkwB,YACA;YAEoB,AAAlBG,OAAqBhB,SAA4B,AAAba,iBACrBA,O7DlanBlwB;;W6D4YEswB,QAAwBD;KAExBA,KAAaE,QACbD;QAAwBD,AAAAA,+BActBD;EAOWA,OAAfF;SACAI;QAAwBJ,QACxB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAvEAM,cAIEF,QAAwBR,MAC1B,A,C,C;A,E,C,C;A,G,C,O,C;A,E,CA2EA1wB,YAAe,MAAGixB,AAAAA,YAAY,A,C;A,G,CAC9B5wB,YAAiB,MAAG4wB,AAAAA,gBAAiB,A,C;A,E,CACrC3vB;EAAyD2vB;6BAhF9BP,KACPA;;oBA+EK;SAAsC,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAO/D1wB,YAAe,MAAGkP,AAAAA,YAAW,A,C;A,G,CAC7B7O,YAAiB,MAAG6O,AAAAA,gBAAgB,A,C;A,E,CACpC5N;EAA8D4N;6BAzFnCwhB,KACPA;;oBAwFK;SAA0C,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CAKnEjD,YAAiC,MAAG6C,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CAK5CzhB,YAAoC,MAAGyhB,SAAU,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,M,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CAQjDJ,YAAiD,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,M,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C,C,A,E,gB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCnkB1DmB,8BA+CE;MAAOC,eAAaC,uBACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CApEMC;;;;+BAIJ;;KAKQ,KAAA,iBAGR,MAAOH,WACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CCmSA5kB,YAAmC,MAAGnB,QAAe,A,C,Q,C,I,C,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CD1RpB,cAAa,SAAGvC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAE/CwoB;+BAGI;kDASA;iBAAkB,EAAExwB,kBAOQuwB,WAAUC,kBACtC,AACA;;EzDmlDG/tB,QAA8B,+ByD7kDnC;iBAAkB,EAAE+E,gBACLA,IACbtI;QAAWqxB,WAAYC,oBACzB;gDAQEtxB,kBAAmBqxB,qBAAoBC,gBAEzC;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,K,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CClEAhxB,eACY,AAANkxB,cACF;KAEA,8DAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CARAC,mCAAkE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAqBlEnxB,YAAkB,uCAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CADrDoxB,oCAA6C,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CA0E7CnxB,cAEuB,MAmKUgxB,QAAkBI,AAnKrBC,eAE9B,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,gB,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAaAtxB,cAE2B,MAgEvBuxB,QAA8BC,AAhEAC,eAElC,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,oB,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,G,CAEAC,WAC4B,YAE5B,A,C;A,G,CAEAC,WACwB,YAExB,A,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA+QA,kBACMC;GAAAA,eACI,KAAA,QAERA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA;GAIM,CAACC;EAVDD;GAAAA,eACI,QAERA;;MAUqBE;GACb,CAACD,cACG;KAAA,QAERD,qBALF;;KAOQ,KAAA,aAGZ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAQA9xB;;2BAEQ,CAACiL,YAAiB,QACtBqe,AAAAA;WApFK9iB,WAqFL;yBAEA8iB,AAAAA,kBACA;yBAEAA,AAAAA,mBACC;0BAEDA,AAAAA,kBACA;wCAEAA,OAAAA;UACA2I;SACA3I;UACA;;wEAEA4I;EAEA5I,OAAAA;;GACa,KAATtoB,YACFmxB,QAAenxB;GACf;YAAoBA;6BAAAA;KAAF,UnDnNtB2L;KAA6CA,QmDqNvCwlB;QAAenxB,cACjB,CAEFsoB,SACAwI,AAAAA;eACA;2DAEAI;EAEA5I,OAAAA;;MAEA8C;wBAWA9C;SACAwI,AAAAA;eACA;cAEA,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,M,C,C,G,C,2C,C,E,C,CAtJA1vB;;EAEwB,QAEtBgwB;aANgB,iBAOhB;MnDrFyBzlB,MmDsF3B,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,C,E,C,CAcAvK;;EACqBuW;;6BAAAA;;GAGnB;KAAkB,WACDA;GACF,MAEX0Z;iBAGEA;;OAGAA;;QAGAA;;QAGAA;;QAGAA;;QAGAA;EACwC,AAAP,SAAjCA;OA7BwB,KAAU,KAAS;EA8BJ,AAAN,QAAjCA;OA9BwB,KAAU,KAAS;EA+BJ,AAAN,QAAjCA;OA/BwB,KAAU,KAAS;EAgCX,IAAhCA;OAhCwB,KAAU,KAAS;mCAqC7CA,UACAA;;UAEAA,UAEJ,AACAC,OAAuB,WACzB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAuEc;;;GACJ,QACFhJ,IAAAA;mBAEAA,IAAAA;WAEF2I,SACA3I;WACA6I;;OAEF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CClcJjyB,YAAgB,cAAU,A,C;A,G,CAqB1BqyB,WAAyC,kBAAoB,A,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAkB7D3xB;;EAGuE,KAAde;6BAAc;;;GAGrD,AAFEgwB,SAA+BhwB,WAE9BA,QAKEgwB,KAJAhwB,MAAgC,KAAdA,cAOvC;MAAOgwB,aAA2BA,MACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CAqDA3xB;EAOIwyB;EAAQC;IA8MA,oBAGF,AADA,OAAkC,AAAA,CAAzB,iBACD;EAjNM,GAAZA;;;cAARD,SAAAA;KAA+B,CAAA,IAAQ;EACnB,GAAZC;;cADRD,SACAA;KAA+B,IAAgB,AAAP;EACpB,GAAZC;;cAFRD,SAEAA;KAA+B,IAAe,AAAN,QAChCC;QAAY;cAHpBD,SAGAA;KAA+B,IAAQ,IACvC;gBAOoB,GAAZC;;;cAXRD,SAWAA;KAA+B,IAAoB;EAC/B,GAAZC;;cAZRD,SAYAA;KAA+B,IAA2B,AAAN,QAC5CC;QAAY;cAbpBD,SAaAA;KAA+B,IAAoB,IACnD;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAWA7yB;GACY,QAgLA,AAhL2B+yB,OAAmB,4BAGnD;;EAyBCF;;;GAtBN;KAAsC,WACrBE;GAEF,UACPD;GAAa,UACTA;QAAY,GAApBD;gBAqKM,qBAnKe,AAAJ,AAAbC;EAG0C;GAC3BE,UADAD,sBAKV,WACHD;EAAa;GAAI,UACbA;;cAKRD,SALAA;KAA+B,IAAQ,KAC/BC;QAAY,GAApBD;KAA+B,IAAQ,YAGnCC;GAAiB,AAAJ;EACG,GAAZA;;cAARD,SAAAA;KAA+B,IAAQ;EACnB,GAAZC;;cADRD,SACAA;KAA+B,IAAe,AAAN,QAChCC;QAAY;cAFpBD,SAEAA;KAA+B,IAAQ,MAG7C,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,M,C,C,G,C,I,C,C,C,A,E,a,Y,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CpD1KApwB,YAE8B,OAM9B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CqD8BAA,cAA+C,MAAGpB,WAAc,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CChBhEoB;sDAEI,MAAO6I;sCtD+KP0B;SsDlKA;MAAoBhL,oBAAF,WACDA;GACF,mBtD0K4BgL,UAA7CA;yBAA6CA,UAA7CA;wBAA6CA,UAA7CA;cAA6CA,UAA7CA;;GsDhKqB,KtDgKrBA;KAAAA;QsDzJsC,KAAkB,KACM;ECWxC;EvDgGf1M;EA6CsC0M,MAA7CA;yBAA6CA,WAA7CA;yBAA6CA,WAA7CA;cuD7IsB;EvDgGf1M;EA6CsC0M,MAA7CA;QsD/IE,QtD+IFA;MsD7IE;SAEF,sB7DsdczD,Y6DrdhB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,CEzGA/H,YAAiC,mBAAwC,A,C;A,E,C,CxDgOrEnB,cACJ,6BACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA7NML,YAAoC,MAAGye,SAAsB,A,C,Q,C,I,C,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,CAyE3Dhc,gBAGJ,MAAOnC,aACT,A,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,I,C,C,C,I,C,sB,C,Q,C,gB,C,I,C,C,C,C,C,G,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,CAmGMkB;EACU;GACH,OAAa,QACtB,MAAoBqG,aAAF,QAChBA,MACF,AAEF;SACF,A,C;A,C,CyDrHArG;cAEE;MAAA,QAAA,OACET,OADF,OAEA;KACc;EACDA;;;aAEb;8BAAkB;EACDA;uBAAfkyB;OACF,AACA,SACF,A,C;A,E,C,CCjGF;;;WlBKEzO;KkBAEC,YAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C1DwMQjjB,YAIJ,MAAOlB,SACT,A,C;A,E,CuDlGAkB,YAEE,MAAO,MADe,gBAExB,A,C;A,E,C,C;A,G,C,U,C;A,M,C,CvDlEyB,cACrBqG,WGIoC+H,YHHtC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAsO0B;GAChB,MACJ+iB,YAEFA;OGvOkC/iB,QHwOlC+iB;YACAA;OAASjU;IACR,MACH,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,E,C,C2DnOJne,YAAkB,6CAAyC2yB,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CChCnE3yB,YACE,2BACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,O,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CCoQAF;;;GACM,wCAAsB,QAC1B;MAAQ8yB,WAA0BlxB,MAC1BmxB,UAASnxB,KACnB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAyDAjC,cACI,MAAGmzB,SAAAA,QAAiClxB,SAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAErEjC,YAAiB,MAAGmzB,SAAsB,A,C;A,E,C,CA2C1C5yB;;EpE+XUqJ;IACmCypB,8BACHA;EoE5W7BC;EACAC,WpEgX2BF,2BACHA;EoEhXxBE,WpEqX4BF,0BACHA;EoErXzBE,WpE0X6BF,2BACHA;EoE1XxBE,WpE+X6BF,6BACHA;EoE/X1BE,WpEoY6BF,6BACHA;IAKQA,kCACHA;EoE1YhCG;KAEV;KAEA,gFAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CASAC,cAEE,MAAO,MACA,AAFEN,QAEAO,QAAgCN,SAC3C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C7DzTMK,WAGJnzB,WACF,A,C;A,E,C6DuIAmzB,iBAImC,oDAInC,A,C;A,K,C,I,C;A,M,C,C,G,C,0E,C,E,C,CAjFAhxB;EAuBgBkxB,SnErMNphB;GmEsME;EnE3EehQ;qBAAAA;EMvDlBjC,KNuDkBiC;qBAAAA;EMvDlBjC,KNuDkBiC;qBAAAA;EMvDlBjC,KNuDkBiC;qBAAAA;EmEyFZqxB,SnEzFYrxB;qBAAAA;EmE0FVqxB,SnE1FUrxB;qBAAAA;EmE2FVqxB,SnE3FUrxB;qBAAAA;EmE6FL,KAA6B,KAA5BsxB,kBnE7FItxB;;;qBAAAA;EmEkGA,AnElGAA;EMNlBjC,qB6D+GL;MAAO,QADsC,mBAIvC,KAAA,SAEV,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,CAcAmzB;;SAQA,A,C,E,C7DnJMA;;SAIN,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,C6DuFIzzB,uBACuB,QACrB;M7DrIGM,mB6DsIL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAuB,uBACuB,QACrB;M7D9HGvB,c6D+HL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyKFC;;EAEkB;GACP,QAAS;GACT,OAAQ;GACR,MAAO,oBAChB;sBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA,eACQ,OAAQ;GACR,MAAO,WACb;aACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA,eACQ,MAAO,UACb;YACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,C,C,CvBtUFuzB,cACE,MAAO,UAAqC,AAAV5P,QAAYjiB,eAChD,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMA6xB,cACE,MAAO,UAAqC,AAAV5P,QAAYjiB,eAChD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CASA6xB,kDACE;MAAO,U/CzCMlyB,QAAAA,Q+CyCgC,AAAVsiB,mBACrC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAQA4P,iBAGe,eAAY,KAAA;oCACzB;MAAO,UAAqC,OAAV5P,kBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMA7jB,cAAgC,MAAkB,AAAf,SAAiB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMnE5B,cAAgC,MAAkB,AAAf,SAAiB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMnE5B,cAAiC,MAAkB,AAAf,UAAkB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMrE5B,cAAiC,MAAkB,AAAf,UAAkB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAiCrEjC,WAAuB,MAAa,SAAVkkB,cAAkD,A,C;A,C,C,CAU5E7jB;;;2CAC0B,QACxB;MAAO6jB,WAAajiB,KACtB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC,YAAiB,MAAGkkB,oBAAkB,A,C;A,E,C,CAUtClkB,cAA8B,MAAGkkB,SAAAA,QAAoBjiB,SAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAErE1B;;EAtB0B2jB;GAoCL,IAGjB,cADI,SAA2B;EAGRqP,SAAUQ,QA5DN;EA6DJR,SAAUS,QAtDN;EAwDzBC,kBAAUC,mBACd;WAvE2B,wDAwE7B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,G,C,qD,C,E,CA/JA,sCAU8D,AADV,AADA,AADJ,AADF,AAAvB,cACC,aACE,WACA,UACK,UACD,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA6H5B3zB,eACQ,UAAW;GACX,SAAU;GACV,QAAS;GACT,OAAQ;GACR,MAAO,mBACb;qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACAA,eACQ,MAAO,aACb;iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,G,CtC7GI4zB,WAA0B,0CAAqC,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CsDgCrE5zB,YAAkB,uBAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAYrCA,kBACMyE;GAAQ,QACV,oCAEF;4BACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,C,CAPAovB,+BAA6B,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAgC7B7zB,YAAkB,yBAAiByE,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAb3CqvB,+BAAwC,A,C,C,CAGxCA,6CAAmD,A,C,E,CAOnDA,qFACqD,A,C,C,C;A,E,C,C;A,G,C,K,C;A,M,C,C,E,CAerDC,6BAAkB,A,C,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CtDqEZ/zB;;IACc;;EAEdiP;GAAW,QACb,UAAWA,SAAF,MAAsB,oBACvB,UApBVxC;KAA6CA;aAkBzCwC;EAKSkP,KAAmBlP;8BAvBhCxC;KAA6CA,OAwB3C,EAEEunB;GAAgB,QAClBA,mBAWA;oDAAgDnlB,6BAC/BsP,KAAmB7N,wCAkBxC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CsDjEA2jB,+CASoD,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAepDj0B,YAAkB,gCAA4ByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,C,CADtDyvB,+BAA8B,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAkB9Bl0B,kBAAsB,OAAJ;MAAiB,4DAEU,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CAH7Cm0B,+BAAyC,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAgBzCn0B,YAAkB,oBAAgByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,C,CAD1C2vB,+BAAwB,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAkBxBp0B,kBACMq0B;WACF,iDAEF;uDACUlW,aACZ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CARAmW,+BAAkD,A,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAsBlDt0B,YAAkB,uBAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAErC4zB,WAA0B,OAAO,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAajC5zB,YAAkB,kCAEeu0B,sCAAwC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAHzEC,+BAA8C,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CE5U9Cx0B,kBACMyE;WAAiB,iBACrB;2BACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAmBAzE,YAAkB,8BAAsByE,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAFhD,+BAA0C,A,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAO1CzE,YAAkB,uCAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CADrD,6BAAsC,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CM5BtCA,YAAkB,iBAAa6I,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,C9DyC9BkP,oBACShY,wBACb;oBAAiCA,OAA+B00B,WAClE,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAEM,sBACS10B;uBAGXA;2BAEFA,OAA+B00B,aACjC,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAz0B;EACeD;kBAEY20B;KAAS;kBAChC30B;2BAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,W,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,C+DvEAC,YAAkB,aAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,C,C,C;A,G,C,G,C;A,C,C,CCuC3BF,cAAwB,gBAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,ChE7B3CL,YAAiB,MAAGM,YAA+B,A,C;A,E,C,CAGnDC,YAAkB,MAAGD,YAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEpDE,mBACE,KAAA,UAEFC,QACAA,QACAA,eACN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEMC,YAAqB,gBbmLbC,iBanLoC,A,C;A,I,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CuD4jBlDX,WAAgB,MAAGk1B,SAAiB,A,C;A,C,C,CAuBpC70B;EACc80B,OAAZ1F;;EACiBztB;;OAAAA,SACfkzB,YACA;WAEalzB,MAAkBytB;EACJ,AAAVA;IAxIkB,oBAyIYztB;6BAAAA;EAAF;QAC1BA;IAvIiB,kBAyIlCmzB,QAA6B,GAC7BD;QAtImC,AAA1B,OAAmB,AAAA,CAAT,kBAAuB,OAuI1C;UAGJC,SACAD;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,CvD7YMl1B,YAAe,MAAGgN,AAAAA,gBAAgB,A,C;A,G,CiE1OxC3M,YAAiB,MjE0OO2M,AAAAA,oBiE1OO,A,C;A,G,CAM/B3M,YAAoB,MAAG,AjEoOC2M,AAAAA,oBiEpOO,A,C;A,E,C,CjEsOzB,8CAEJA;QAA6CA,UAC/C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CiEjOA;EACsBooB;GAChB,CAACvG,MAAqB;GzEkORjuB,ayEhOhB,KACQiuB;8BjE2NV7hB;QAA6CA,gBiE1NlC6hB,MAAoB;KAE7BwG,QAAMxG,OACN;KAAOA,QjEuNT7hB,QAA6CA;EiErNnC6hB;8BjEqNV7hB;QAA6CA,UiEpN3C,EAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CjEyNM,YACJA,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEMzM,YAAkB,MAAGyM,SAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAvB9BsoB,mCAEFtoB;KAEAqoB,WAEJ,A,C;A,M,C,C,E,CANMC;;SAMN,A,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,8B,C;A,G,CmB5NA/0B,cAm1B8B,KAALg1B,mBAl1BJ;MACV,QACTC;UACA;MnByOyBxoB,MmBxO3B,A,C;A,G,CAmBAzM;EACMk1B;GAAM,SAAWA,sBACnB;MAAOA,UAAgC,KAAbA,YAE5B,SACF,A,C;A,G,CAOAz1B;GACY,KAAN01B,cACEC;;GAAO,cAAW;GACX,eAAY,WAEzB,MAAOD,SACT,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA6eAn1B;;SAC4C;EACjC;UAKEq1B,QAEAC,AAAAA;IAmTiB,KAALN,oBAjTM,KAAPI;EAClB9tB,UAAqB,CAACA;KACxB,gBAEF;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA8LAtH;GACW,UAAO,gBAChB;MAAUu1B,UAAwC,KAAtBA,uBAC9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAz1B;GACkB,KAAZ01B,YAAmBA,cAA8B,QAErD;MAAa,AADDA,mBAEd,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAx1B;GACM,CAACy1B,WAAuB;IAG5B;MAAuBD,8B9Bteax0B,mC8BsepC,U9BpeekI;G8BseD,gB/BvdI7I;G+BwdV;EACoC,CAAA,KAAVq1B;;oCAAmBA;;KAKjDA;MAEJ,KACiBA,UACjB;MAAOA,gBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAqOA,kBACqBC;GA4CZ,QACLvD,OACAA;YA7CO8C,OAATU;;GACU,CAAA,KAANT,YACFS,SACAA;KAAST,KAAAA,WAEb,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAn1B;EACoB;EACCo1B;GAkCZ,QACLhD,OACAA;cAnM0B,KAAL4C,oBAgKK,gBAC1B5C,UACA6C;WAEF7C,KAn8BiByD;EAo8BEC;GA4BZ,QACL1D,SACAA;UA7BiB2D;GA2BZ,QACL3D,SACAA;QA5BF,MnB7wByB3lB,MmB8wB3B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA3M;;;2CACqB,QAEnB;MAAc,MAAPs1B,QAAUY,OACJ,KAATL,QAAYK,OACP,KAALhB,eAAQgB,WACH,KAAL5vB,eAAQ4vB,WACH,KAh9BQH,QAAAA,OAi9BP,KAANC,QAASE,OACA,KAATD,QAAYC,MAClB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAv2B,4BAKE;MAAOiX,UAAQ0e,QAAQ1e,SAAQif,QAAUjf,SAAQse,eAAMte,SAAQtQ,eAC3DsQ,SA39Bamf,QA29BCnf,SAAQof,QAAOpf,SAAQqf,iBAC3C,A,C;A,E,CAn4BAE;GAca,eAAkB,WAC3Bd;QACgB,gBAAmB,YACnCA;KAEAA,SAGFU;QAAQK,aACV,A,C;A,K,C,I,C;A,M,C,C,G,C,+H,C,E,CA/EAD;EzBkC2Bj0B;qBAAAA;EAAAA;EyBjCZm0B,KAslB+B;;czBrjBnBn0B;EAAAA;EyBqjBmB;czBrjBnBA;EAAAA;cAAAA;EyB/Bdo0B,OzB+Bcp0B;cAAAA;EyB7Bdq0B,KzB6Bcr0B;;cAAAA;EAAAA;EyBqjBmB;czBrjBnBA;EAAAA;EyBqjBmB;czBrjBnBA;EAAAA;EyBqjBmB;EAthBjCm0B;WACDG,sBACAC,aACGC;;SA5DuC,A,C,E,CAgDtDP,kCASaE;WACDG,sBACAC,UACGC;;SAWf,A,C,E,C,CAkUAt0B;YACsB8yB,aAAc;;GAC9BA,kBACmC,AAAjCA,MAA4B,KAAZA,sBACZ,KAAA,6CAERyB;KAAiBzB,SAA8B,KAAZA,YACnC;YAEF;YAAoBA;6BAAAA;KAAF;GACZA,eACFyB,OACA;yBAEJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEAv0B;;;WAUsB;;EAEPkzB;6BAAAA;;GACb;KAAkB,WACDA;eAm7BJ,OAA6B,UAC7B,OAA6B;;EAn7B1B;;GAIV,AAACsB,qBACCC;MAMR,AAEA,WAA+BvB,QACjC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAoBAlzB;;;SACgD;EACpC;WAGS,MAAOmzB;EAEb;MAEbuB;wBAWA;MnBhVyBnqB,MmBiV3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CAEAvK,uBACwB,QACtB;MAAOmzB,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEAnzB;;;;;;;;EAiDe20B;;;;6BAAAA;GAcb;KAAa,QAIPA;GACS,EAAQ;EAKHA,MAA2B;EAC3BA,MAA2B;EACrBC,SAAyB;GAC3CC,kBACAA,kBACA,AAACC,oBACG;;SAENC;EACID;;WACF1vB;EoCnkBc;EvDgGfvH,OA6CP0M;KAA6CA,YmBwbrCnF,UnBxbRmF;KAA6CA;EmBybhByqB,SAAwB,MAA7C5vB;;EoCtkBc;EvDgGfvH,OA6CP0M;KAA6CA;;EmB0bhByqB,SAAwB,MAA7C5vB;;EoCvkBc;EvDgGfvH,OA6CP0M;KAA6CA,SmB4bjC;;;YAIH;;IAET,GACW,WAAqB,QAAUwqB;;WAGtB,QACpB;MAAO3vB,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAIApF,eACU,SAAe,CAAA,WACrB,MnBhnBKnC;KmBknBL,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEAmC,iBACW,QAAS;GACT,QAAS,QAClB;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CA+fAA;;EAIc8yB;GACK,AAAbmC,aACFtO,uDAGF;MAAOsO,iDAST,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAgBAj1B;;;GAoBkB,KAAZ8yB,WAAiBnM;;;;GAKrB;YAAoBmM;6BAAAA;KAAF;GACZA;GAIuB,AAAnBA,eACFnM;mBAOAA,6CAGF5U;;UAGAA,OAAUmjB;EAEE,QAElB,GACInjB,YAAmB4U;EACA,OAAGmM;EACO,KAAX/gB;MACT,GACX4U;GAEE,OAEA5U,OAAUmjB,WAAoBpC,mBADhC;MAKqBqC,KAAiBrC;EAChB,KAARpH;EAAeA;6BAAAA,OAAzB3Z;OAAuB,CAAA;EACL,KAAR2Z;EAAeA;6BAAAA,OAAzB3Z;OAAuB,CAAA,mBAHzB,OAKE4U;mDAKa,AAAb5U,UACF4U,2EAEoB,AAAb5U,YACT4U;;8BAGF;MyBzjCE,0BzBkkCJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAgCA3mB;;EAYwB;E+C72CHuvB,AAAAA,a/C+2CnB;QAAkB,EAAE0F,gBACPA;;GACF,cACiB;;EAA8B,AAAxB,KAA1BG,KAA+B,UAAS;QoC7wC1B;EvDgGfv3B,OA6CP0M;KAA6CA,kBmBkoCZ,aoC/wCX;EvDgGf1M,OA6CP0M;KAA6CA,cuD7IvB;EvDgGf1M,OA6CP0M;KAA6CA,MmBsoCzC8qB;eAEJ,AACA,MnB9nCyB9qB,MmB+nC3B,A,C,6B,C,I,C,C,C,C,C,I,C,G,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAn3BE3M;GACY,SACoB;;EAA4B,AAAtB,KAA3B03B,QAAgC,UAAO,oBADhD;SAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEA13B;GACY,SAA2B;;EAA4B,AAAtB,KAAtB23B,QAA2B,UAAO,oBAAvD;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgC4B,YAAI,MAAGniB,sBAA4B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkBvC;GAClB,KACFhO;;QAGFA;KA8hBKgO,qBA7hBiB9M;QACpBlB;SACAA;KA2hBGgO,sBAzhBP,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAUAxV;KACgB,OAAkB,SACb,OAAkB;SADrC;SAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA,YACE,MAAqB,QAAkB,OACzC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA;GACY,SACmB;;EAA4B,AAAtB,KAA1B43B,QAA+B,UAAO,oBAD/C;SAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAEAj4B;;EACiBo3B;GACXc,sBACF,MAAgB;QACP,AAACZ;KAGV,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEAt3B,yBAEE;+BAAkB,WACDo3B,MAA2B;GAChC,OAAwB,QACJ,AAAX,AAAL;;GAIM,OACL,SACiC,AAAhB,AAAX,AAAL;gFAMlB,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CASA;;;;;;eAGa,KAAiBA;KAE1BvvB,KAAauvB,aAEjB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAwYAp3B,oBAEyBm4B;6BAAAA,OAAvB;MAAsC,AAAjB,AAAL,mBAClB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA6KA,iBACQ,KAAA,kCACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAOS;EnBnoCF73B;;GmBqoCQ,UAAY,WACnB8oB,2DAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyBJ,iBACQ,KAAA,kCACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CACAppB;GACkB,KAAR,aACNopB;EnBvqCG9oB,KmByqCiBi1B;;GACZ,UAAa,aACrBnM,gEAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA2DY;GACI,UACR,MAAO,MAAmC,CAAhB,EAAE5U;KAE5B,OAAqB,AAAN,aAAoB,YAEvC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAsCJsjB,2BnB/mCAzC;KAAM,KmBinCiB+C,0BAAoB,WnBjnC3C/C;KAAM,KmBknCiB+C,0BAAoB,aAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,iB,Y,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CTqxQF31B,eAEM41B,YACF;QACSA,YACT,sBAEF;sBACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAo1DA51B,cAUE,iCACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CA0wFAA,gBAEE,MAAO61B,AAAAA,qDAET,A,C,mC,C,I,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmEA71B;;gB+B7zc0B;sB/Bu0cxB81B;;EAulBkCC,UA6whBlCtkB;gBA/EI,KAAc,KA8EcC,oBA9EW;EApshBRskB,UAmxhBnCvkB;gBA/EI,KAAc,KA8EcC,KAj0iBbukB,SAmviBwB,uBA9uiBzCH;QAGF;MAAOG,MACT,A,C,wF,C,I,C,C,C,E,C,I,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CA2yBAl3B;EAtiPSm3B;GAwiPE,YAGLC,mBAFF,QAKF,SACF,A,C;A,E,C,CAisXAn2B;;QAII;yDADF,OAGE;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAg9EAA,gBACoB,UAAQ;EACR,UAAQ,GAAuB,AAAA,CAAR,kBACzC;MAAY,GAAQ,MACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAi/JFo2B,uBACmB,MACjB;MAAOC,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC;WAEI;yBAMaD;;4CAGX,QAEF;YAGA,SACJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,YAII,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC;4CAEI,QAEF;MyDlxkCOC,YzDmxkCT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAMAC,cACE,qBASF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C,C,C,C;A,E,C,CAEAC,YACE,MAAOvvB,SACT,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEAwvB,YACE,MAAOxvB,SACT,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CACCyvB,kBACC,MAAOzvB,eACT,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAsBA;EAgByB1J;;;EAOLE;6EAOlBP;KAxwyBIy5B;;;;SAgxyBgB,CAAA,2BACV,KAAA,sFAIJ,gDAEI,KAAA;;;;;;;aA1DNzwB,KAoEwBqwB;;;;;aApExBrwB;;;;;aAAAA;;;;;aAUAA;;EX7nkCuB+E;;;GWsskCR;uBAKrB,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAscAuG,eAEmB,gBAAc;WACT,MACtB;MAAOmP,eACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAiW,eACmB,gBAAc,QAE/B;MAAOjW,eACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,G,C,u0B,C,C;A,E,C,C;A,G,C,K,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,kD,C;A,E,C,CAtolCE/iB,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,yC,C;A,E,C,CA+SxBA,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,uB,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,Y,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,O,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,wC,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,wB,C;A,G,CA8mBxBi5B,YAAuC,0BAC+B,A,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,K,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAuctE;GAMwC;;MAEpCC,eADkBC,oBAElB;oEAGJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,0B,C,C;A,E,C,C;A,G,C,uB,C;A,K,C,I,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,G,CAwiJArnB,kBACMsnB;GAAY,QACd,QAEF;MyDvnMKV,MzD+nM0D,aAPjE,A,C;A,K,C,I,C;A,G,C,a,C,C;A,G,C,C;A,G,C,gB,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA87BAW,8CAAgD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA0DhDC,yCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAsB/CC,yCAA8C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CA+H9ClS,YAA2B,MAAGiS,YAAmC,A,C;A,G,CAKjEjS,YAA+B,MAAGiS,YAAkC,A,C;A,G,CAsEpEjS,YAA0B,MAAGiS,YAAkC,A,C;A,E,C,CAmM/DE,cACE,MAAO,MAA6BC,4BACtC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASAH,cAAwC,MAAGI,oBAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAS3EF,cAA+C,MAnBtC,MAA6BC,4BAoBC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,mC,C,C;A,E,C,C;A,G,C,K,C;A,G,CAuDvC/4B,eACMi5B,qBACFA,mDAEF;MAAOA,gBACT,A,C;A,G,CAEA;EAEc;EACG;SACfC;OACAA;UACF,A,C;A,E,C,CAaAJ,cAA+C,MAC7C,MAA6BC,4BAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA8C5DH,cACE,MAAOI,oBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASAF,cACE,MA1DA,MAA6BC,4BA2D/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,yB,C;A,G,C,W,C,C;A,E,C,C;A,G,C,gB,C;A,G,CAgGAz5B;GAIM83B,gCAAgD;GAGhDA,8BAA8C,mBAClD;SACF,A,C;A,E,C,CAUA93B,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,yB,C;A,G,CA+8CxBmH,YAAmC,mBAAiC,A,C;A,G,CAsBpEzG,YAA2B,kBAxxCNytB,YAwxC6C,A,C;A,G,CAElE;EAEc;EACG,WACfyL;OACAA;UACF,A,C;A,E,C,CAcAJ,cAA+C,MAC7C,MAA6BC,4BAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAS5DH,cAAwC,MAAGI,oBAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAS3EF,cAA+C,MAlB7C,MAA6BC,4BAmBQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAYvCI,YAAwB,mBAAgC,A,C;A,G,CA+ExDC,YAAqB,qBAAiBC,aAAYC,YAAWC,cACzDC,wBAAa,A,C;A,G,CAKjBJ,YAAqB,qBAAiBK,aAAYC,YAAWC,cACzDC,wBAAa,A,C;A,E,C,CAgCjB,aAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAOpB,aAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKjB,mBAAsE,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CA6BtEt6B,YAAqB,MAAGu6B,aAAU,A,C;A,E,C,CAoBlCv6B,YAAkB,MApBMu6B,aAoBM,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAsL9Bz6B,6BAEI;kCAEA;+BAEA;8BAEA;6BAEA;UAEM,KAAA,uCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIAA,qBAEE;MACM06B,UAAyB;EACtBA,sBACI,QAAQ,AACrB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAgBAC,YACE,6DAGF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAgBAA,YAA0B,wCACiD,A,C;A,E,CAqP3EC,YAAqB,qBAA0B,A,C;A,E,C,CAmzB/C16B,uCAAuC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAsBvC85B,6CAAwC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAoRxCa,YAAkC,MAAGC,YAA4B,A,C;A,G,CAKjED,YAAsC,MAAGE,YAA2B,A,C;A,G,CAoKpEF,YAAiC,MAAGG,YAA2B,A,C;A,G,CA+C/DH,YAA0C,MAAGI,YAA+B,A,C;A,E,CAptE5EzB,aAIA,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,G,C,U,C,C;A,E,C,C;A,G,C,kD,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,0B,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,uC,C;A,E,CAwwFAd,YAAuB,MAAGwC,MAAiC,UAAiB,A,C;A,E,C,CAuB5E,sCAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,ie,C,C;A,E,C,C;A,G,C,K,C;A,E,CAuN5BC,YAAc,mBAAmB,A,C;A,E,C,CAMjC,2DAAoF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQpF,8DAAuF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,+B,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,M,C,C;A,E,C,C;A,G,C,a,C;A,G,C,W,C,C;A,E,C,C;A,G,C,4C,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,K,C;A,E,CAipDvFx7B,YAAe,gBAA8B,A,C;A,C,C,CAE7C85B,oBAEoBl5B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAk5B,kBACY;GACF,IACN,SAAoC;mCAGxC,A,C;A,E,C,CAWAA,uDAA0B;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,iE,C,C;A,E,C,C;A,G,C,gC,C;A,G,CAwwBxCt5B,YAAqB,MAAGw4B,MAAkC,YAAmB,A,C;A,E,C,CAiK7E,+CAAuF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,I,C,C,C,C,C,C,C,C,C,I,C,4B,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAgCvF,+BAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,G,C,4B,C,C;A,E,C,C;A,G,C,yC,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,iC,C;A,K,C,I,C;A,G,C,W,C,C;A,E,C,C;A,G,C,gC,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,Q,C,M,C,C,C,C,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,yF,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,M,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,+B,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,e,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,sB,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,+B,C;A,E,C,CAysDxB,8BAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAQpBz4B,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,U,C,C;A,E,C,C;A,G,C,a,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,CA2lBxB,4BAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,C,mC,C,C;A,E,C,C;A,G,C,a,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,a,C;A,G,C,e,C,C;A,E,C,C;A,G,C,gB,C;A,G,C,e,C,C;A,E,C,C;A,G,C,gB,C;A,G,C,sB,C,C;A,E,C,C;A,G,C,qB,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+6BlBC,YAAiB,MyDx6jBVy4B,MzDw6jBuD,WAAe,A,C;A,K,C,I,C;A,G,C,c,C,C;A,G,C,C;A,G,C,yB,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA+W7E,mCAAiD,A,C,Q,C,C,C,C,C,C,M,C,C,C,I,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,yC,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA4RjD,0CAEEwC,6CADsBC,QAEtB;OACF,A,C,S,C,K,C,E,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CASAC,YAAiB,qBAAaC,UAAUC,mBAAS,A,C;A,G,CAgBjDF;eAII;OAxwNsBJ,KAAiC;;GA2wNnD,6CACI,KAAA;EA5wNcA,KAAiC;EAgxN9B,cA5BCK,UAAUC,uBA4BT1U,KAAAA,SAC3B;qBAAiB2U,KAAAA,KAAiBA,KAAAA,eAEtC,A,C;A,K,C,I,C;A,G,C,8F,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAkEA;;aAiBEC;uBACAA;wBACAA;2BACAA;qBACAA;+BACAA;mCAKAC;eACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,2G,C,I,C,K,C,C,C,E,C,I,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,yC,C,C;A,E,C,C;A,G,C,oC,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,W,C,C;A,E,C,C;A,G,C,yB,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,sG,C;A,G,CA8nBA/6B,YACE,mBACF,A,C;A,E,C,CAgBA,kBAGM;GAAgB,QAElBg7B,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMAnC;MAEwB,YACpBvP;qBAFF,QAMA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASAuP;;+CAGkB1iB;+BAKd;MA9Ec8kB,AAAAA,wBA8E4B,QACxC,eAAkB9kB,eACpB,MAEA,MAAA,QAAA,OACE,eADF,SAEA,CAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKA7W,kBAAqB47B,WAAH;gDAAmD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA0QrErC,sCAAiC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA6BjCz5B,mCAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA0BhCy5B,2CAAsD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUtDA,2CAAuD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,sB,C,C;A,E,C,C;A,G,C,M,C;A,E,CAmHvD95B,YAAe,gBAA8B,A,C;A,C,C,CAE7C85B,oBAEoBl5B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAk5B,kBACY;GACF,IACN,SAAoC;mCAGxC,A,C;A,E,C,CAWAA,uDAA0B;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,4D,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,c,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,0C,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,wC,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,yB,C;A,G,C,e,C,C;A,E,C,C;A,G,C,c,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,2C,C,C;A,E,C,C;A,G,C,Y,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,qB,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,oE,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,CAitFxC74B,kBAtxaE,KAA6B+4B;EAuxaf,kBAEd;qBkC73sBE,kClC83sBJ,A,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,mC,C;A,E,C,CAuQAH,yCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,qB,C;A,G,C,mB,C,C;A,G,C,C;A,G,C,gB,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,0B,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,gB,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,0B,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,sB,C,C;A,G,C,C;A,G,C,8C,C;A,G,C,c,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,G,CAu+C/C54B,YAA+B,qBACOm7B,gBAAM,A,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,G,CA8L5Cn7B,YAA+B,qBACKm7B,gBAAM,A,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,gB,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,iD,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,W,C,C;A,E,C,C;A,G,C,+B,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,uC,C,C;A,E,C,C;A,G,C,K,C;A,G,C,0D,C,C;A,E,C,C;A,G,C,wB,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,wB,C;A,G,CAixE1CC;GAIMC,aAAyB;SACjBC,oBACVA,+BAEF;MAAOA,qBACT,A,C;A,E,C,CAyEAv8B,wDAAyE,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKzEw8B,mEAGI;;;;;;;;;;;;;;;;QAqBJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CA4iBA3D,YAAsB,MAAG4D,MAA4B,UAAiB,A,C;A,E,C,CAyRtE,6BAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA0GnB,kBAOEC,cyDxy3BKC,UzDyy3BL;OACF,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmHAp8B,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAoIxBqnB,YAA2B,MAAGiS,YAAmC,A,C;A,G,CAKjEjS,YAA+B,MAAGiS,YAAkC,A,C;A,G,CA+EpEjS,YAA0B,MAAGiS,YAAkC,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,M,C,C;A,E,C,C;A,G,C,8D,C;A,E,C,CAmgC9Dt5B,YACC,wBAAoByvB,iBAAO4M,gBAAMC,mBAASC,UAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEAz8B;;;2CAC2B;EAClB2vB;EAAQ/tB;4BAAc26B;EAAO36B;4BAAa46B;EAAS56B;4BACtD66B;EAAU76B;qDADd;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAA0CgwB,KAAAA;EAAe4M,KAAAA;EACrDC,KAAAA;EAAgBC,KAAAA;EA2IT7lB,KAAQA,KAAQA,KAAQA;EARf,UAAQ,GAAuB,AAAA,CAAR;GACrB,MArIL;MAsIG,WAAQ,GAAuB,AAAA,CAAR,kBArIP,A,C;A,G,CAsEpC0kB,YAAkB,qBAAa,OAAW,eAAS,A,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,I,C,C,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,M,C;A,E,CAgrBnD37B,YAAe,gBAA8B,A,C;A,C,C,CAE7C85B,oBAEoBl5B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAk5B,kBACY;GACF,IACN,SAAoC;mCAGxC,A,C;A,E,C,CAWAA,uDAA0B;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,8B,C,C;A,E,C,C;A,G,C,M,C;A,E,CAyJxC95B,YAAe,gBAA8B,A,C;A,C,C,CAE7C+8B,oBAEoBn8B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAm8B,kBACY;GACF,IACN,SAAiD;mCAGrD,A,C;A,E,C,CAWAA,uDAAuC;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,M,C;A,E,CAsBrD/8B,YAAe,gBAA8B,A,C;A,C,C,CAE7Cg9B,oBAEoBp8B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAo8B,kBACY;GACF,IACN,SAAuD;mCAG3D,A,C;A,E,C,CAWAA,uDAA6C;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,6B,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CA7g4B3D,YAAuB,yDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAe9C,cAAuB,yDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAe9C,YAAsB,wDACuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAW7C,cAA2B,2DACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAWlD,YAAwB,wDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAW/C,cAAuB,yDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,M,C,C,G,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CA6xL9C38B,cAA8B,MAAG48B,MAAAA,WAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAGjE58B,YACE,MAAO68B,AAAAA,iCACT,A,C;A,E,CAEAl9B,YACE,MAAOi9B,AAAAA,gBACT,A,C;A,C,C,CAEApD,oBACSoD;gCAAAA,SAAP;MAAOA,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACgCA;gCAAAA,SAA9BC,AAAAA;uBAA8BD,MAChC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA,mBAEQ,KAAA,oCACR,A,C;A,C,C,CAEApD,cACEqD,AAAAA,sBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAEA57B,kBAAkC67B,aAAH;uBrBtzPO57B,8BqBszPa,A,C;A,E,C,CAEnD;QAKE;MAAA,8CAHa,oBAIX27B,QADF,OACEA,cADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACQ,KAAA,kCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAwBA,yBAEQ,KAAA,YACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUA78B,cAQE,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA;GACyB,EApFhB48B,AAAAA,oBAqFC,KAAA,SArFDA,AAAAA;EAAAA;EAAAA;EAwFLC;SAAAA;mBAxFKD,SA0FLC;iBAtFKD,OAwFT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,YAEEC,KAAAA,YACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAyBArD,kBACmBqD,AAAAA;6CAEjB;SACF,A,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAueAl9B,YAAe,MAAGo9B,AAAAA,gBAAgB,A,C;A,C,C,CAElCvD,oBAAkCuD;gCAAAA,SAAH;MAAGA,MAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAElD,qBACQ,KAAA,2BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA,mBACQ,KAAA,2BACR,A,C;A,E,C,CAEA,mBACQ,KAAA,yBACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,G,CAQAvD,YAAiB,MAAGuD,UAAAA,SAAc,A,C;A,G,CAIlChD,YAAwB,MAAG,MAA6BiD,SAAa,A,C;A,G,CAgDrEnC,YAAkC,MAAGrB,eAAyC,A,C;A,G,CAK9EqB,YAAsC,MAAGrB,eAAwC,A,C;A,G,CAoKjFqB,YAAiC,MAAGrB,eAAwC,A,C;A,E,CAvP5EyD,oBACiBF,QAAAA,mBAAfC;QkCt6QE,yBlCu6QJ,A,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAFAC;;SAEA,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CADiC,wBAAI;gDAAQzD,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,O,C;A,C,C,CA85G7CjS,cACE,qBAAwB2V,yBAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,c,C;A,C,C,CAyBA3V;;;GbjxWS1Y,AAAAA,AakxWHsuB,eAA2B1wB,YACzBurB,YACF,qBACIkF,QAAMC,MAAa1wB,oBAG3B;qBAAmCywB,sBACrC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,M,C,C,G,C,I,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA4oEmC,YAAM,MAAGhF,SAAIkF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA6FrB,cACrBlF,6BACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAOgB;;EAEXA;;EAAW,QAAqB;;Q+Bn1clCxU;GAAD,AAoDmBa,mDAnDvBb;a/Bs1cI2U,QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA64IAqD,iBACY,oBACZ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CAgfFjC,kBAC+CoC;6CAE7C;SACF,A,C;A,C,C,CAQA,cACEA,AAAAA,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;;+CAGmB9kB;EAAiB8kB;GAA5B,MAEF,MAgHYA,AAAAA,wBAhH8B,QACxCA,cAAa9kB,aACf,AAEF;OAEF,MAAA,UACE8kB,QADF,OACEA,cADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;GACyB,EAoGPA,AAAAA,AAAAA,+BAnGR,KAAA,SAmGQA,AAAAA,AAAAA;EAAAA;EAAAA;EAAAA;SAhGdA;mBAgGcA,SA9FdA;iBAqG0BA,OAnG9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EAiG8BA;EAAAA;0BAAAA,SA/F5BA;SA+F4BA,MA9F9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,mCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBA77B,cACuB,SAKvB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAwBA,YACE67B,KAAAA,YACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA;EACEA;EAqC4BA;gCAAAA,SArC5BA;iBAqC4BA,MApC9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA56B,YAA4B,MAAG46B,SAAAA,AAAAA,oBAAyB,A,C;A,E,C,CAMxD,mBACQ,KAAA,8BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAOA,yBAEQ,KAAA,qCACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CASAl8B,YAAe,MAAGk8B,AAAAA,AAAAA,2BAAuB,A,C;A,E,CAEzC,mBACQ,KAAA,6CAER,A,C;A,C,C,CAEApC,oBAA8BoC,AAAAA;gCAAAA,SAAH;MAAGA,MAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgxG/C,wBAAI;gDAAQwB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAs4PlB,cACEz7B,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA5B,iBACE;MAAc,iCrBxu8BsBkB,8BqBwu8BpC,QAIA,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CASA,iBACE;MAAgBgH,iCrBxv8BoBhH,8BqBwv8BpC,OACEo8B,UrBvv8Bal0B,KqBwv8Bf,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,qBACE;MAAgBlB,iCrB9v8BoBhH,8BqB8v8BpC,UrB5v8BekI,IqB8v8BbwF;WADY,aAEd,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAnO;EAEmBo8B,AAAAA;gBAEjB;MAAsBU,aAAqB,8BAF1BV;GAGXW,QAASD,4BAHEV,SAIb30B;OAASq1B,KAAAA,QAEb,AACA,SACF,A,C;A,G,CAEA98B;EAEmBo8B,AAAAA;gBAEjB;MAAsBU,aAAqB,8BAF1BV;GAGXW,QAASD,4BAHEV,SAIb10B;OAAWo1B,KAAAA,QAEf,AACA,SACF,A,C;A,G,CAKAv9B,YACE,MAAOO,mBACT,A,C;A,G,CAKAP,YAAoB,MAAG,AANdO,mBAMsB,A,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAlEf,cAAS,gBAAa,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAiFtCP,YACE,MAAO68B,AAAAA,yBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA38B,cACE,MAAO28B,AAAAA,yBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,gBACEA,AAAAA,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA38B;EACiB28B;EAAAA,iBACfA;oBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAKAl9B,YACE,MAAOuI,AAAAA,uBACT,A,C;A,E,C,CAEAlI,YAAyB,MAAGiwB,sBAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAwbtDwN,iBACU,wBACRC,AAAAA;yBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;EACgB,QAAA,mBACd;MAAkBC,0BrB9w9BkBz8B,8BqB8w9BpC,OACEq3B,KrB7w9BanvB,OqB8w9Bf,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAWAw0B,YACEF,AAAAA,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMA19B,cAA4C,MACxC69B,wBAAyD,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAS7D79B,cAA0B,MAAG69B,sBAA8C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3E79B,YAA+B,MAAG09B,AAAAA,8BACyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAhD3DI,YACEJ,sBAA8B,IAAcC,0CAE9C,A,C;A,M,C,C,E,CAHAG;;SAGA,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CADM,YAAI,mBAA4B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKA,YAAI,MAAGnlB,aAAS4f,QAAe,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAqB/B,YAAI,MAAGA,cAAU,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQ5B,YAAI,MAAGA,qBAAyB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASP,YAAI,MAAGA,gBAAc,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAG9D,cAAqB,MAAG3pB,+BAAcmvB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CASjDN;EACU,wBAGR;MAAoBO,AAFJnB,KAAAA,sCrB5z9BoB37B,8BqB8z9BpC,UACmB6H,KrB7z9BJK;GqB8z9BT,AlBx29BY7I,akBy29BdoY,SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YACc,cACZkkB;KAAAA,QAAqBlkB,aACvB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,E,C,CAiYA4O,cAA6D,uBACvC0W,mBAAuB,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAuB7CpD,cACE,uBAAsCoD,mBACxC,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAgBApD,cACE,yBAA0CoD,iBAC5C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CA0DAxW,mCAMM,QAAc,QA8Ec3T,QA9EW;wCA+E3CD;MAhFA;SAEF,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CAYA0T,wEAAmC;2DAI7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHF,YAAQ,MAAGniB,MAAAA,gBAA0C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAO,YAC1DmzB,cACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CAoBJhR,wEAAmC;2DAI7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGNE;qBAwKqB;UAnKnB;MAAmByW,UAAnB,UACoCD,UAAYE,QADhD,mBrBt2+Be/0B;yBqBu2+Bbg1B;SACF,EAkLsB1W,IAAAA;UAjLtB;MAAO0W,2CAET,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAhBI,YAAQ,MAAGh5B,MAAAA,gBAA0C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAO,YAC1DmzB,cACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CAyCJjjB,cAUsBvE,cATL,MAEfstB;SAEAttB;YACA8W;YACA;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAqBA,iBAnBsB9W,cAoBL,MACf;QAAA,AAAA,SACAstB;UAKF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,G,CAEAr+B,WAAkB,MAAe,AAAZs+B,WAAe,A,C;A,E,C,CAEpC,eA/BsBvtB,eAgCH,AAHEutB,WAGS,MAC5B;QAAA,AAAA,SACAzqB;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,iBACMgU;GAAQ,SAAW,AATJyW,WAUjBvtB,KAAAA,QAAyBktB,UAAqBE,SAElD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,iBACMtW;GAAQ,QACV9W,KAAAA,QAA4BktB,UAAqBE,SAErD,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,S,C;A,C,C,CAmGA;EACMI;GAAAA,QAAoC;EACD7W,OAAvC6W;QAAyBC,KAAc9W,0BAC1BA,AAAAA,gBAEf,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA,oBACqB6W,AAAAA;GACF,QAAS9a,OAC5B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA,mBACE;MAAyB8a,UAAAA,8BrBlh/B0B9mB,KAAAA,MAAoBO,6BqBkh/BvE,OACEyL,ArBh/+Bara,SqBi/+Bf,AACAm1B;OACA7W,AAAAA;cACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,CArCA+W,YACE/W,QAAc,KACAgX,0BAChB,A,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkBc,WAAG,MAAGpB,qBAAa,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA6BjC/V,cACE,uBAA2BoX,sBAC7B,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,CA0dA19B,YAIE,uBAo7DckI,sCAn7DhB,A,C;A,C,C,CAGA,mBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,mBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA,mBACQ,KAAA,oCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAMA,qBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,yCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUAnJ,mBACQ,KAAA,2CACR,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAUA,yBACQ,KAAA,2CACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,8CACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAkxDAiB,YAAyB,qBAAwB29B,KAAAA,kBAAe,A,C;A,E,CAEhEj/B,YAAe,MAAGi/B,AAAAA,gBAAY,A,C;A,C,C,CAI9B,cAAsBA,KAAAA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1C5+B,cAA4B,MAAG4+B,MAAAA,WAAqB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEpD,YAAeA,KAAAA,SAAe,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAI9Bj+B,oBAA4Bi+B;gCAAAA,SAAH;MAAGA,MAAY,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAExC,sBAAwCA;gCAAAA,SAAAA;OAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAE9D,cAAiCA,KAAAA,WAA0B,A,C;A,E,C,CAE3D,cAAqCA,KAAAA,WAAqB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAE1Dj/B,gBAA6C,MAAGi/B,MAAAA,aAA6B,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAE7Ej/B,gBAA6C,MAAGi/B,MAAAA,aAAiC,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEjF,gBAAkC,MAAGA,MAAAA,aAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIjE,oBACEA,KAAAA,iBACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,gBAAuCA,KAAAA,aAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,C,C,CAqBtE5+B,WACE,MAAOkY,AAAAA,aACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEAvX,WAAc,MA0DGyI,AA1DA8O,YAAiB,A,C,C;A,E,C,C;A,G,C,e,C;A,C,C,CA8ClClY;EAC+B,AAAVovB;EACAlrB;GAAF,KACfkF,QAAWy1B,KAAAA,UACXzP;SACA;SAEFhmB,YACAgmB;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEAnX,WAAc,MAAG7O,SAAQ,A,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmFlB,kBXtlkCoBmE;;qCW6lkCzB;iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,G,CA2IAirB,YAAsB,MAAGsG,MAAyCC,gBAAS,A,C;A,E,C,CAK3E,YAAa,MAA2BA,iBAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEhD,kBAEqCA,yBAIrC,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CAeA5D,YAAc,YAAS,YAAwB,A,C;A,E,C,CAE/C,kBACI,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIrC,kBACuB,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,C,CAlBxD/4B,0BAEI;KAGA,mBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,G,CAmTAlC,YAAgB,MAAQg9B,cAAa,A,C;A,G,CACrC,cACOA,eACP,A,C;A,G,CAGAh9B,YAAgB,MAAQg9B,cAAa,A,C;A,G,CAYrCh9B,YAAgB,MAAQg9B,cAAa,A,C;A,E,C,CAuCrC,YAAc,MAA4BA,kBAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAI/Ch9B,YAAkB,MAAgCg9B,oBAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C,A,E,uB,kB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,a,C,C,A,E,gB,W,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,uB,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,+H,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,kD,C;A,K,C,I,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,+B,C,C;A,E,C,C;A,G,C,2C,C;A,K,C,I,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,4B,C,C;A,G,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,6B,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,6B,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,0B,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,2C,C;A,K,C,I,C;A,G,C,wB,C,C;A,G,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,U,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,8B,C,C;A,E,C,C;A,G,C,U,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,iB,C,C;A,G,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,sB,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,K,C;A,G,C0Dpi7BvDnD,eACMiF,qBACFA,0BAEF;MAAOA,gBACT,A,C;A,G,CAEAp+B,YAA2B,4CAAyC,A,C;A,G,CAEpE,wD1Dw+bEi7B;KAAAA,A2DzvmBAoD,WDoxKAnF;UACF,A,C;A,G,CA4YAe,YAAkC,MAAGC,YAA4B,A,C;A,G,CAKjED,YAAsC,MAAGE,YAA2B,A,C;A,G,CA2EpEF,YAAiC,MAAGG,YAA2B,A,C;A,G,CAuD/DH,YAA0C,MAAGI,YAA+B,A,C;A,K,C,I,C;A,K,C,I,C;A,G,C,0d,C,C;A,E,C,C;A,G,C,8B,C;A,E,C,CAwP5EzB,yCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,G,C,e,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,G,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,wB,C,C;A,G,C,C;A,G,C,yB,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,W,C;A,G,C,0D,C,C;A,G,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,e,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,sE,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAx0B/CiE;E1DuzyBSZ,A0DtzyBSA;EAEA;WAEd,QAEF;MAAoBmB,+B/E1gKgB98B,8B+E0gKpC,UACmB6H,K/EzgKJK;G+E0gKT,A5EpjKY7I,a4EqjKdoY,SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,Y1D2yyBEkkB,A0D1yyBAA,6BAA+BlkB,aACjC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C,A,E,oB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,yB,C;A,G,C,U,C,C,A,E,gB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,M,C,C,E,CE7wKMxX,WAAqB,gB7Eq7Fb,gCAAS,4C6Er7FoB,A,C,C,C,A,E,W,U,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C9D0C7C+9B,cACE,qJAOF,A,C,oB,C,I,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC;gBAEgB;;IAGd,MAAOC,MRlEEn/B,OQiEM,IAAcwJ,wBRhEQ41B,aQkEvC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CA0VAr/B;sEAIM;kBAFF,QAQF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAoM,2DAEI,WAEF;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAIAjM;WAEI;;;;;KAIA;;4CAEA,MAAOF;iDAEP,MAAOq/B;iDAEP,MAAOC;KAOP,MAAOA,wCAGX,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEAnzB,sBACgBozB;cAEFC,WACVC;YAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIAtzB;wEAKI;;;KAKA;0BAGA,MAAO;mCAEP;KAEA,MAAOuzB,UAEX,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEAC,oCAEI,MAAOC;2BAGP,MAAOA;KAGP,MAAOA,2BAGX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAzzB,sBACkBozB;YAQS,0BACXC,WACZC;YAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,C,C,CAnVEv/B,gHAIE;MAAO2/B,MAA8BrxB,YACvC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAQA9H,kHAImB8H;WAAqB2wB,QACxC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAEAz/B,YAAiB,SAAI,A,C;A,C,C,CAErBK;;QAAuB;iDACGyO,UAAW7M,KAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQrD5B,YAIE,YAAsCyO,QACxC,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA0BAvO;aAEqCuO,QAAjC;kBADF,OAGE;yCAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAQAtO;EAImDsO;eAEvB,IAAcsxB,uBAFxC;MAAOD,uBAGT,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,CA9KA3+B;EACei+B;WAEX,MAAOO;QASiBl2B;UAAf;;;SAQX;MAAOk2B,eACT,A,C,E,CA8BAx+B,YAIE,MAAOw+B,MAAYK,SACrB,A,C,E,C,CAEA59B,YAwBE,MAAO69B,UAvBiB,2BAwB1B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAtBEA;;GACMC,QACF,MAAOA;;iDAIPA;UACA;MAAA,KAAgBZ,UAAhB,UAAA;KAC6CW,YAASX,UACtD,AACA,wFAGAY;UACAC;UAAqBb,aACrB;cAEA,MAAOF,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CA0JFgB;GACY,UAAa,sDACf,KAAA;;GAEA,UAAe,sDACf,KAAA,qDAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAIAz/B;4BAG+B0/B,2DAzBF;;EAAa;;UAChC,qDA2BR,0CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;4BAG+BA,2DAlCF;;EAAa;;UAChC,0FAqCV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA1gC,YAAe,iDAAkB,A,C;A,E,CAEjC,0DAAwD,A,C;A,C,C,CAKxD,cACE2gC,oBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cAIEA,oCADM,gBAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,sBApDoD;6BAAA;EAAV;UAChC,oDAqDRA;0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAYA,gBACEF,YACAE;oBAAiC,MACnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;;GAlEY,UAAa,sDACf;;GAEA,UAAe,sDACf;EAgES;GACN,UAAM;GACH;OACH;UAAwBp/B,AAAAA,kBACnCo/B;oBACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cACEA,oBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA+CoD,kBAC/BpB,UAEjBQ;gBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAGI,YAAI,yBAAgC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAuCpC,YAAI,mBAA2B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAG/B,YAAI,gCAAwB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAG5B,YAAI,mBAAyB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,a,Y,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C+D9gBnCt9B,gBACoB,UAAQ;EACR,UAAQ,GAAuB,AAAA,CAAR,kBACzC;MAAY,GAAQ,MACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA,cACoB,UAAQ,GAAuB,AAAA,CAAR;GACrB,MACpB;MAAkB,WAAQ,GAAuB,AAAA,CAAR,kBAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CC+BFd;;GAOQ,IAAK;GACL,IAAK;wDASL,MAAmB,AAAJ,CAAL;UAIAF,aAAgBA,YAAS,QACvC;SAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAUAE;;GAOQ,IAAK;GACL,IAAK;wDASL,MAAS;GAITF,YAAS,QACb;mBAGYJ,YAAc,QAC5B;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CCxEErB,eACU,MAAY,kBACZ,KAAA,yDAER;2BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CAmHA;EAE2B4gC;EAAF;EACH,CAAA;EAED;EACC,CAAA;EAGU,AAAV,IAAYC;EACpB,CAAA,iBAAZD;SAEAC;QAAkD,CAAA,AAAb,QAAX,AAAV,AALI,KAHA,MAOA,iCAItB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA7gC;GACU,MAAY,kBACZ,KAAA;EAEQ;IAAP,UAEP8gC,SACA;MAAW,CAAA,AAAJF,eAKT,GACEE;EACQF;YAEsB,AAAP,AAAT,kBAA4B,AAC5C;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAjHAG;EAEW,cAGT;;EACiB;EACK,KAAP;;EACG;EACK,KAAR;EASa,CAAX,CAAA,AAAL,qBAFO,AAAA;EAGJ,CAAA;EAC8C,AAAnC,AAAV,CAAN,AAAA,SAHmB,CAAA,AAAP,MAAc,aAGQ,QAAP;EAOtB,CAHT,CAAA,GADiB,AAAP,OAAe;EAKhB,CAAA;EACuC,AAAjC,AAAN,CAJR,CAAA,EAHU,iBAOqB,QAAP;EAOhB,CAHT,CAAA,GADiB,AAAP,OAAe;EAKhB,CAAA;EACsC,AAAjC,AAAL,CAJR,CAAA,EAHU,gBAOoB,QAAP;EAIxB,CAAA,GADiB,AAAP,OAAe;EAExB,CAAA,EAHU;EAOR,CAFM,AAAA;EAGA,CAAA;EAC2B,QAAP;EAIpB,AAAJH;EACI,CAAA,iBAAbA;;EACmD,CAAA,AAAjC,AAAP,AAAJC,aAA4B,QAAP,+BAA5BA;SACAD;QAAI,CAAA,QACJC;QAAI,CAAA,EARoD,AAAjC,AAAV,GAHU,CAAA,AAAP,MAAc,oCAYlB,CAAA,UAAc;GAExBA,aAAYD,YACdA,aAEFE;SACAA;SACAA;SACAA;UACF,A,C;A,M,C,C,G,C,U,C,E,CAnEAC;;SAmEA,A,C,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CCtJAxgC,YAAkB,mBAAWsG,iBAAIm6B,YAAG,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CASpC3gC;;;2CACuB;EACdwG;EAAK5E,GAAZ;+BAAyB,KAAF++B,OAAK/+B,KAC9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAA0C6G,KAAAA;EAAYm6B,KAAAA,OAArC;MHQSC,MAAOhqB,KAAQA,cGRwB,A,C;A,C,C,CAOjE0kB;EACsB90B;;EAAI5E;;6BAAAA;WAAF,IAAa,KAAF++B,OAAI/+B;wCAArC;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAOA05B;EACsB90B;;EAAI5E;;6BAAAA;WAAF,IAAa,KAAF++B,OAAI/+B;wCAArC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAWA05B,oBACsB90B;;;WAAE,IAAY,KAAFm6B;wCAAhC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,G,CC/BA1oB;EAAe0X;EAAO6M;;6BAAAA,OAAV;MAAQ,KAAO,A,C;A,G,CAE3BvkB;EAAgBskB;EAAME;;6BAAAA,OAAT;MAAO,KAAQ,A,C;A,E,C,CAE5Bv8B,YACE,wBAAoByvB,yBAAO4M,kBAAMC,kBAASC,SAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEAz8B;;;2CAC2B;EAClB2vB;EAAQ/tB;4BAAc26B;EAAO36B;4BAVvB+tB;EAAO6M;;6BAAAA;GAAF,MAUwC56B,YARtC66B;;6BAAAA;EAAF,MASJ76B,sCADd;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAA0CgwB,KAAAA;EAAe4M;EAAAA;EAd1C5M;EAAO6M;;6BAAAA;EAAF;EAEEC;;6BAAAA;EAAF,cAYH;MJHbmE,MAAOhqB,KAAQA,KAAQA,KAAQA,oBIIC,A,C;A,G,CAsEpC0kB,2BAAqC,eAAW;wCAA3B;SAAoC,A,C,C;A,E,C,C;A,G,C,oB,C;A,K,C,I,C;A,K,C,I,C,C,A,E,gB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CC7FrD1hB;;4CACoB;EAGRwG;;iGAIhB;MAAO,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEMvH,eACI,cACCgoB,eAAP;cAEF,MhDgeO1nB,MzCjb4B1M,SyF9CrC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C,C,A,E,gC,mC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCqLErK,gBACQ,KAAA,0CACR,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,S,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,C,C,CAMA,gBAAkC,MAAGsgB,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAY7C,cAA6B,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMxClU,cAAkBkU,OAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAM5B,YAAa,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CCiDxBlU,cAA0B,MAAGsyB,AAAAA,gBAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEvC,gBACEA,AAAAA,iBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA,cACEA,AAAAA,gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,YACEA,AAAAA,cACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA9gC,YAA6B,MAAG8gC,AAAAA,eAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEtD9gC,YAAiC,MAAG8gC,AAAAA,eAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE9D,cACEA,AAAAA,gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA9gC,YAAiB,MjFyMGkE,AiFzMA48B,gBAAa,A,C;A,G,CAEjC9gC,YAAoB,MjFwMG,AADHkE,AiFvMG48B,gBAAgB,A,C;A,G,CAEvCrgC,kBAAwBqgC,OAAH;qCAAa,A,C;A,E,CAElCnhC,YAAe,MjFkMGuE,AiFlMA48B,YAAY,A,C;A,E,C,CAI9BtyB,cAAqB,MAAGsyB,AAAAA,iBAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEzCrgC,kBAA0BqgC,OAAH;MAAGA,UAAY,A,C;A,K,C,I,C,C,A,E,kC,0B,A,A,C,C,C,C;A,G,C,E,C;A,E,CCkJxCC;SAAAA,A,C;A,E,CA6BAA;SAAAA,A,C;A,E,CAgBAA;SAAAA,A,C;A,E,C,C;A,G,C,K,C;A,G,CAleE1gC,YAAqB,YAAa,A,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA+BlC;GACY,UAAa,cACf,KAAA;uDAIV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,6BAC0D,UACtD2gC,eAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEArhC,kBAKEshC,YAA0B,IACT;SAInB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,G,C,wC,C,C;A,E,C,C;A,G,C,K,C;A,G,CAoEA5gC,YAAqB,YAAW,A,C;A,K,C,I,C;A,G,C,U,C,C;A,E,C,C;A,G,C,K,C;A,G,CAyYhCA,YAAqB,YAAc,A,C;A,C,C,CAEnCiB,oBACqBf;aA/dqC,UACtDygC,cA+dF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aApeqC,UACtDygC;OAqeJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,qCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAF,YAAqB,YAAc,A,C;A,C,C,CAEnCiB,oBACqBf;aA9gBqC,UACtDygC,cA8gBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aAnhBqC,UACtDygC;OAohBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,qCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAF,YAAqB,YAAY,A,C;A,C,C,CAEjCV,oBACqBY;aA7jBqC,UACtDygC,cA6jBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aAlkBqC,UACtDygC;OAmkBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,mCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAF,YAAqB,YAAY,A,C;A,C,C,CAEjCV,oBACqBY;aA5mBqC,UACtDygC,cA4mBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aAjnBqC,UACtDygC;OAknBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,mCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAF,YAAqB,YAAW,A,C;A,C,C,CAEhCV,oBACqBY;aA3pBqC,UACtDygC,cA2pBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aAhqBqC,UACtDygC;OAiqBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,kCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,W,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAF,YAAqB,YAAa,A,C;A,C,C,CAElCV,oBACqBY;aA1sBqC,UACtDygC,cA0sBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aA/sBqC,UACtDygC;OAgtBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,oCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAF,YAAqB,YAAa,A,C;A,C,C,CAElCV,oBACqBY;aAzvBqC,UACtDygC,cAyvBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aA9vBqC,UACtDygC;OA+vBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,oCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAF,YAAqB,YAAmB,A,C;A,E,CAExCV,YAAe,gBAAmC,A,C;A,C,C,CAElDA,oBACqBY;aA1yBqC,UACtDygC,cA0yBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aA/yBqC,UACtDygC;OAgzBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAIE,0CAHMsgC,cAAmC3gC,YAI3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,oC,C,C;A,E,C,C;A,G,C,K,C;A,G,CAoCAF,YAAqB,YAAY,A,C;A,E,CAEjCV,YAAe,gBAAmC,A,C;A,C,C,CAElDA,oBACqBY;aAj2BqC,UACtDygC,cAi2BF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aAt2BqC,UACtDygC;OAu2BJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,mCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,a,C,C;A,G,C,C;A,G,C,K,C;A,E,CA/dAZ,YAAe,gBAAmC,A,C;A,E,C,CAElDK;EAGkC,AADb,UACnBihC;cACAA;;GACU,eAAa,KAAA;EACP;GAEF;EAEKn4B;6BAJH;GAKa,AAAZ;UAIkB,qBAGA;WAGrC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CASA;6CAGIq4B,kBACA;8CAGJ,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CASA;6CAGIA,kBACA;8CAGJ,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C,C,A,E,0B,sB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCngBF,yDAII;kFAOA;kCAKA;qCAMA;qDAOJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCpC0BluB,YAAwB,MAAGmuB,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAuCruB,cAAiCquB,KAAWlsB,eAA6BksB,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAE7LC;;ElEyFqB;;;gBC5CI;;;;;;SiE7CmB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6E,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCEnBnhC,YAAgB,MAAGohC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BvuB,cAAyBuuB,KAAUpsB,eAA4BosB,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzIphC,YAAoB,MAAGqhC,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAA8CxuB,cAA6BwuB,KAAcrsB,eAAgCqsB,QAAqB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAEjLC,YAAsB,MAAGnrB,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C,C;A,G,C,CAAqCtD,cAA+BsD,KAAcnB,eAAgCmB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAC1KorB,YAA2B,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAA6D3uB,cAAoC2uB,KAAaxsB,eAA+BwsB,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAElO,wBACa,KAACnJ;EANsIrjB,eAAgCqsB,OAA9CA;;GAOvH,oBACJI,KATiCL,cAA+DA;KAAUpsB,eAA4BosB,SAWjJ,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,gB,C,C;A,E,C,CAEA,2BAEE/I;;EAf0C+I,IAA+DA;KAAUpsB;GAsBtG,AAnBkCmB,czFqoD1ClT,QAA8B;E0F/nD5By+B,ODeLhiC;gBACAiiC;KArBmDH,SAsBnDj5B,AAAAA;8BAIJ,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,E,C,CAEA,oBAGSq5B,KADiBvJ,eAlCiF+I;KAAUpsB,eAA4BosB,QAoCjJ,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Y,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEAS;EC7BSH;;EpE8EY;;;gBC5CI;;;;;;;;SkELiB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAZlB,YAChBhiC,uBACJ,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,8B,C,C,G,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CElCJoiC;;ErE6FqB;;;gBC5CI;;;;;;;SoEjDkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCCnBhtB,YAAqB,MAAGitB,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAoClvB,cAA8BkvB,KAAW/sB,eAA6B+sB,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAGpL,cACEjhB,AAAAA,KAJ8CihB,YAKhD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAC;;EtE2FqB;;;gBC5CI;;;;;;SqE/CmB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,wF,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCDpBliC,YAAmB,MAAGmiC,MAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAAyCpvB,cAA4BovB,KAAejtB,eAAiCitB,QAAsB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,W,C,G,C,C;A,E,C,CAErM;gCAEEjtB;mBACAA;;ECL+CktB;EDO3B;KAA4B,AAAjBC,sBAOgGC;KAAeptB,eAAiCotB;;EALnJ,AAAhBD,sBACwB,AAAxBA,KAAAA,8BACwB,CAAA,KAAxBA,KAAAA,sCAI+GE;KAAcrtB,eAAgCqtB,QAH3K,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,G,C,CAEyBviC,YAAmB,MAAGsiC,MAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAA0CvvB,cAA4BuvB,KAAeptB,eAAiCotB,QAAsB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,W,C,G,C,C;A,G,C,CAC9KtiC,YAAkB,MAAGuiC,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyCxvB,cAA2BwvB,KAAcrtB,eAAgCqtB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CAEhMC;;EvE2EqB;;;gBC5CI;;;;;;;;;;SsE/BqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,yB,sD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CEhBtBxtB,YAAwB,MAAGytB,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAuC1vB,cAAiC0vB,KAAcvtB,eAAgCutB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAGzM,cACE94B,AAAAA,KAJiD84B,YAKnD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAC;;EzE0FqB;;;gBC5CI;;;;;;SwE9CsB,A,C,I,C,I,C,C,C,C,C,G,C,iC,C,C,C,C;A,sB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,S,C;A,E,C,CCyB/CC,WAAsB,gBAClBC,QAAkB,KAAXC,YAAkC,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,G,CAG7CljC,YAAc,MAAc,MAAXkjC,WAAkC,A,C;A,M,C,C,G,C,K,C,E,CAtBnDF;kBAEoD,KAAX,KAAb,KAARlH,QAAU3xB,SAAa2xB,aAA+B,A,C,C,C;A,G,C,C;A,G,C,C,uG,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAoCjDv7B,YAAkB,MAAG4iC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiC/vB,cAA2B+vB,KAAY5tB,eAA8B4tB,QAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACxJ9tB,YAA6B,MAAG+tB,MAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAA4ChwB,cAAsCgwB,KAAmB7tB,eAAqC6tB,QAA0B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAK5O;;EAEyBC,kEAAvBC;MACAA,AAAAA;WAAwCC,aAC1C,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAGAvjC,uBAEE;MAAA,YAAA,UAAA;6BAAA;EACwB,AAAN,QAClB,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEA,kBACEwjC,KAAAA,SACAC;KAAAA,SACAC;KAAAA,KAAgBC,gBAClB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,W,C,C;A,E,C,CAEA,+BACE;MAAA,KAAmBC,mBAAnB,UAAA;;GACqB,CAAA,KAAfC,yBACF7wB,ApFgKoB;WLpJjB1S,KyFTmBujC,SAAAA,KAAAA;ehB5Ca;GgBuD/BC,UAAkBA,UAAkBA;EATvBD,kBAbrBL;KAAAA,SACAC;KAAAA,SACAC;KAAAA,KAAgBC,gBAYhB,AACAI,0BACAA;uBACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,kB,C,C;A,E,C,CAEAjjC,iChBpDyC,OgBuDvC;OAAQgjC,UAAkBA,UAAkBA,eAC9C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,gB,C,C;A,E,C,CAEAvjC;EACc,KAAmByjC;EAvETd;EAApBD,KAAAA,KAAAA,QAA2C,UAwE7C;MAAOO,MAAAA,KAAeE,KAAAA,KAAgBC,eACxC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,c,C,C;A,E,C,CAGA3jC;EAC+B,KAAZikC,KAAcD,KAAAA;EAtEL,KAAXd,AAuEH,KAAmBc;;EACT;EACC;EACXE,KAzD0Cd;6BAuDhC;GAGhB,QAA4Be;6BAAAA;EAAF;QzFjBzB7jC,KyFkBY6jC,KAAAA;EACCD,KA5DkCd;6BA4DlCc,OADlB;MAAmD,QACnC,UAEhB,SAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEA;;SAC6BE,KAAAA,UAAW3+B;EACTA;EArBjB,KAAmBu+B;EAvETd;EAApBD,KAAAA,KAAAA,QAA2C;EAwEtCO,KAAAA,KAAeE,KAAAA,KAAgBC;EAqBlB,2BAtE6FR;KAAY5tB,eAA8B4tB,QAuE7J,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,kB,C,C;A,E,C,CAEA;EAxEwDC;YAyEzBE,WAC3B,MAEFe;UACIH,qBAA6BA,KA7EqBd;EA8E1Cc,KA9E0Cd;EA+E1CE,KAAAA,KAAAA;EAAAA;EAGyB,KADA,KAAjCY,KAjFkDd,wBAkFlDc,KAlFkDd;6BAkFjB;EAFC,GAAtCa;;EAG2BE;6BAAAA;E/E05CpBG,KAA8BC,A+Ex5CjCjB,KAAAA,wBAFqB,KACzBU;MAEAV;KAAAA,KAA6BU,QAC7BV;KAAAA,KAA8BU,KAAAA,MAC9BQ;aACF,A,C,Q,C,K,C,C,C,C,C,G,C,0B,C,C;A,E,C,CAIA;EACcN,KA9F0Cd;;8BA+FrBe,iBAhGgFhB;KAAY5tB,eAA8B4tB;;GAiG7I,MAAGgB,SACf;EAEqB,MAAEF;EACb,KAAmBD;EACjBG,KAAAA;;GACd;YAAoB/O;6BAAAA;KAAF;EACJA;EACEA,MAAU;EACZqO,KAAAA,OACZ;iBAAY,SAAG,gBAvIjBR;EACIC;SADJD;KAAAA,UAC2B;aAQP,UAiIlB,KACF,EACkB,OAAEgB,KACpB;YAjIef;;EAfKD;;EAAF,KAeQ,SAfNA;EAAmB,KAeb,SAfgBA;;IAgJrB;QA7IrBA;KAAAA,WAC2B;aAQP,UAuIpB,EACAK,KAAAA;EACIU,IADJV;iBACyCU,UAEzC;yBAGF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,c,C,C;A,E,C,CAEA,oBA5HwDZ;WA8HpD,MAEFc,AAAAA,AAAAA,AAAAA,AAAAA;2DAMF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,cAEE,uBAGF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,sB,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,uB,C,E,C,CA3IAO;EhG2lDOjhC,QAA8B;EAA9BA,QAA8B;EAA9BA,QAA8B;;EsBjjDhB;;;gBC5CI;;;;;;;;;SyEGzB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,M,C,CAoHa,WACTghC,YAAuB,gBACzB,A,C,Q,C,I,C,C,C,C,C,G,C,M,C,C;A,K,C,I,C,C;A,sC,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAO0C;;SAhI8GpB;QAAmB7tB,YAAqC6tB,aAmIhN,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,iC,C,C,G,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAc,cACZpwB,ApFyDsB,+BoFxDxB,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,iC,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAKW,WACT0xB,aACF,A,C,Q,C,I,C,C,C,C,C,G,C,M,C,C;A,K,C,I,C,C;A,8C,C,C,G,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qH,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CC9JsBrvB,YAAuB,MAAGsvB,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCvxB,cAAgCuxB,KAAapvB,eAA+BovB,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CA6BlM;;EAGMtB;gBtFQc,+BAKlBzvB;KAAS,KAAagxB,uBsFdtBC;MAEAA,AAAAA;wBACAA;KAAAA,KAAAA,qBACAA;KAAAA,KAAAA;EAEIxB;gBtFGc,+BAKlBzvB;KAAS,KAAagxB,0BsFTtBE;MAEAA,AAAAA;;EAEIzB;gBtFAc,+BAKlBzvB;KAAS,KAAagxB,0BsFNtBG;MAEAA,AAAAA;;EAEI1B;gBtFHc,+BAKlBzvB;KAAS,KAAagxB,uBsFHtBI;MAEAA,AAAAA;wBACAA;KAAAA,KAAAA,qBACAA;KAAAA,KAAAA,yBACAC;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAIA;EApDkDN;cAqDtBO;;oEACK,KAA1BA,KAAAA,KAtD2CP;KAuD9C,MAIFQ,AAAAA;SACAC,AAAAA;SACA;MAAA,KAAuBF,KA7DyBP,iBA6DhD,UAAA;GACMU;;EAIUzvB,KAAAA;EACJA,AAAAA,oBACVuvB;KAAAA,oDAEOG,uBACHA,eACAA,eACAA,eACAA,eACAA,eACAA,eACAA,eACAA,gBACJF;KAAAA,oDAEQG,uBACHA,eACAA,eACAA,eACAA,eACAA,eACAA,iBACP,AACAC,AAAAA;EACWN,KAAAA,KA1FqCP;SA2FhDa;KAAAA,aAAiCC,eACjCD;KAAAA,aAAkD,KAAjBC,kBAAmBA,gBACpDD;KAAAA,iBAAqCC,mBACrCC,AAAAA;;EACOR,KAAAA,KA/FyCP;SAgGhDe;KAAAA,aAAiCD,eACjCC;KAAAA,aAAkD,KAAjBD,kBAAmBA,gBACpDC;KAAAA,iBAAqCD,mBACrCR;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,kB,C,C;A,E,C,CAEA,eACOJ,YAAwBG,WAC3B,MAEFA,AAAAA;SACAA,AAAAA;QAAoBI,KACpBP,AAAAA;SACAA,AAAAA;QAAgBM,KAChBL,AAAAA;QAAkBU,KAClBT,AAAAA;QAAkBW,MACpB,A,C,Q,C,K,C,C,C,C,C,G,C,O,C,C;A,E,C,CAEArlC;;EACiBslC;EACAA,YACf;MAAA,QAAA,UACiB,CAAA,KADjB,UAEI,QAEJ,AACA;MAAA,QAAA,UACiB,CAAA,KADjB,UAEI,QAEJ,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,wB,C,C;A,E,C,CAEAnlC;iBAKM,MAAOmlC,MAAAA;gBAEP;MAAoC,MAA7BA,KAAAA,gBAA+BA,KAAAA;OAEtC,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;gBAEP;MAAoC,MAA7BA,KAAAA,gBAA+BA,KAAAA;OAEtC,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;cAEL,KAAA,QACR,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,uB,C,C;A,E,C,CAEAnlC;iBAKM,MAAOmlC,MAAAA;gBAEP;MAAkC,MAA3BA,KAAAA,gBACAA,KAAAA;gBAEP;MAA6B,MAAtBA,KAAAA,gBACAA,KAAAA;gBAEP;MAEoC,MADK,KADL,KAA7BA,KAAAA,gBACAA,KAAAA,iBACAA,KAAAA,iBACAA,KAAAA;gBAEP;MAAyC,MAAlCA,KAAAA,gBACAA,KAAAA;gBAEP;MAA0C,MAAnCA,KAAAA,gBACAA,KAAAA;gBAEP;MAAoC,MAA7BA,KAAAA,gBAA+BA,KAAAA;cAEpC,KAAA,QACR,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,2B,C,C;A,E,C,CAEA,oBAzLkDhB;WA2L9C,MAEFO,AAAAA,AAAAA,AAAAA,AAAAA;sEAMF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,wBArMkDP;WAuM9C,MAEFO,AAAAA,AAAAA,AAAAA;sEAMF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,kB,C,C;A,E,C,CAEA,cACEU,UACArwB;kBAA4CswB,YAC5CtwB;kBACqBuwB,YACrBvwB;kBAAgDwwB,aAClD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,gB,C,C;A,E,C,CAEYxlC;EAzNsCokC;WA2N9C;;EAGSO,KAAAA;SAEX;MADQ,SAAyB,KAAV,KAAbO,oBAAyBA,+BAErC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,kB,C,G,C,C;A,E,C,CAEYllC;EAnOsCokC;WAqO9C;oBAIF;WAAUc,KADCP,KAAAA,mCAEb,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,sB,C,G,C,C;A,E,C,CAEY3kC;EA5OsCokC;WA8O9C;oBAIF;MC7LO99B,MD6LiB4+B,KADbP,KAAAA,sCAEb,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,8B,C,G,C,C;A,E,C,CAjPAc,2BtFPe,KAAapB,6BsFQ1BO;MACAA;sBACAA,AAAAA;iCACAA,AAAAA;4CACAA,AAAAA;yCACAA,AAAAA;mCACAA,AAAAA;iCACAA,AAAAA;4CACAA,AAAAA;yCACAA,AAAAA;;WtFjBa,KAAaP,6BsFkB1BY;MACAA;qBACAA,AAAAA;;WtFpBa,KAAaZ,6BsFqB1Bc;MACAA;qBACAA,AAAAA;;WtFvBa,KAAad,6BsFwB1BQ;MACAA;sBACAA,AAAAA;+BACAA,AAAAA;yCACAA,AAAAA;2BACAA,AAAAA;sCACAA,AAAAA;mCACAA,AAAAA;uCACF,A,C,I,C,I,C,C,C,C,C,G,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,2D,C,E,C,CAzBAY;;E3E4DqB;;;gBC5CI;;;;;;;;S0ESzB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAkKiD;;SA7LiFrB;QAAapvB,YAA+BovB,aAgM5K,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,qC,C,C,G,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAc,cACZ3xB,ArFcsB,+BqFbxB,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,qC,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAOqD;;SAzM2E2xB;QAAapvB,YAA+BovB,aA4M5K,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,8C,C,C,G,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAc,cACZ3xB,ArFEsB,+BqFDxB,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,8C,C,C,G,C,C,A,E,e,mB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CvBhJJ2pB;;EA8FapL,0DACX0U;mBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAoBAhN,sBAwEE;MADW1H,8DAEb,A,C,iB,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkDA2U;;+CAeeC;;sBASX,SAMF,yCAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIAzM;4CAEI,aACI0M,cAAgBA,aAAkBA,IAExC;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CyBzWE3jC;cAEe4jC,KAPgB/xB,AAAAA,qCAO3BgyB;OAEF,SACF,A,C;A,E,CAyBA7jC;cAEgB,AAAC8jC,aAAWF,KArCG/xB,AAAAA,sCAqC3BkyB;OAEF,SACF,A,C;A,E,C,C;A,G,C,Y,C;A,M,C,CzBgDAxmC;;EACewI,QACb;QAAkB,WACFA,SAAmB,QACnC,AACAA;SACAi+B;iBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CACAC;8BAAgB;MAAGD,MAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAC5BE;8BAAsBF;OAAe,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACrCR,YAAgB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAGhB1U;;WACiB;wBACA;uBACD;uBACG;;4CAEf,gBA5DyBqV;iDAgEnB,KAAA;4CAUO;4CACA;4CAIK;4CACO;4CAED;+CAGbC;EACAH;;GACF,QAAS;;KAElBC;mBACA/N;wBAGA;qFAQaA;EACFiO;EACAH;GACF,kCAGLC;oBAEF,uBAQFA;;6BAhBa/N;GAkBb;KAAU,WACErH,YAAKqH;8BAAfnxB;OACF,AACA,cAGI,KAAA,wCACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CApCc,0BAC4B8pB,kBACpC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkENvxB;;EACewI,QACb;QAAkB,WACFA;yBAAmB,SACnC,AACAA,SACAi+B;iBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CACAC;8BAAgB;MAAGD,MAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAC5BE;8BAAsBF;OAAe,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,M,C,CAErClV;WACiB;wBACA;uBACD;uBACG;qBAGf,MArLG;4BA0LG,KAAA;kDAMKsV;EACAH;GACF,QAAS;E1Eq5CfljC,QAA8B,+B0El5CjCmjC;mBACA;uC9E2CkCplC,8B8E3ClC,U9E6CakI,I8E5CXhC;QAAY8pB,mBACd,AACA,kCAIWsV;EACAH;GACF,QAAS;;EAEL9N;uBAIb+N;;6BAJa/N;;GAMb;KAAkB,QAChBnxB,QAAU8pB,YAAKqH,UACjB,AACA;SAKF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,C0B1RAr4B,YACE,MAAOumC,AAAAA,qBACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CASAzmC;EACkBymC;GAEmB,CAAC9tB,gBAElCA;UAGAA;KAEF+tB,UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,CASAzlC,kBAAiCwlC;kBhG80CQ7Y,uBAyXvCI;KAAQM,AAAAA,OgGvsDoB;SAAyB,A,C;A,E,C,CAIvD,cACEmY,AAAAA,kBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAvmC,cAAqC,MAAGumC,AAAAA,mBAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAErEhmC,oBAAmCgmC,SAAH;MjD4JF,+BiD5JyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEvDhmC,oBAAkDgmC,SAAH;4CAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMxEzmC,cAAiC,MAAGymC,AAAAA,mBAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAExDzmC,YAAiB,MhG8zCGkE,AgG9zCAuiC,kBAAqB,A,C;A,G,CAEzCzmC,YAAoB,MhG6zCG,AADHkE,AgG5zCGuiC,kBAAwB,A,C;A,E,CAE/C9mC,YAAe,MhGyzCGuE,AgGzzCAuiC,cAAoB,A,C;A,E,C,CAmBtCzmC,cAA4B,MAAGymC,AAAAA,mBAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAG5DvmC,YAA4B,MAHGumC,AAAAA,0BAG8B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAQ7DzmC,cAGE,MAAO49B,sBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CASA59B;EAEkBymC;EACF9tB,SACd+tB;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQA,cAEE9I,qBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAmDA19B,kBhGgwCMwtB,AgGhwCa+Y;wCAAH;MhGiwCP/Y,SgGjwC4B,A,C;A,E,C,CAErC9sB,cAA6C,MACzC6lC,AAAAA,mBAAwC,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAK5ChmC,oBAAgCgmC,SAAH;MjDwHpB,0BiDxH4C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASrDvmC,cAA4B,MAAGumC,AAAAA,mBAA8B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE7D,YACE7I,oBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAYAA;EACkB6I;EACN73B,WACV83B;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CApHgB,YAAI,MAAG/tB,eAAW,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA0BzB,YAAI,MAAGA,gBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAwExB,YAAI,MAAGA,SAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,G,CxBrKxB/X,iBACyBq+B,OADG;MAC1B,KAAuBA,4BAAuC,A,C;A,E,C,CAEhE,cjFsISz+B,KiFrIPmmC,cACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEA,sBA+FkCA;gCAAAA,SA9FhC;KA8FgCA,QA7FlC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA;EA0FkBA,AAAAA;;GAxFF,SACZ;QACmB,mDAIrBC;eACF,A,C;A,C,C,CAEA,c3D6smBE/K,AAAAA,A2D5smBAoD,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,qBACE;MAAA,U3DwsmBApD,A2D5smBAoD,WAIA,O3DwsmBApD,c2DxsmBA,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA77B,cAC0B,SAG1B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIA,mBACQ,KAAA,kCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAEA,yBAEQ,KAAA,yCACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUA,gBjFgFSQ,KiF/EPmmC,QAAAA,4BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,Y3D4vmBE9K,KAAAA,A2DzvmBAoD,eACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUA,gBACEA,AAAAA,kBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA;E3DmxmB8BpD,A2DlxmB5BoD;E3DkxmB4BpD;0BAAAA,SA/F5BA;SA+F4BA,M2DjxmB9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQA77B,cAC2B,SAS3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAEAL,YAAe,MAAGgnC,AAAAA,mBAAgB,A,C;A,C,C,CAClCnN,oBAAkCmN;gCAAAA,SAAH;MAAGA,MAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAClD1lC,kBAAkC0lC,UAAH;uBhF8KOzlC,8BgF9Kc,A,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAtGT,wBAAI;gDAAQs4B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyDf,YAAK,MAAGqN,SAAU,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CyB1E1D3mC,kBPFiDkiC;GOGvC,WACc,KAAhB0E,mBACS,KAAPA,KPLuC1E,+BOMzC;QACgB,KAAP0E,KPPgC1E,2BOQzC;QACgB,KAAP0E,KPTgC1E,yBOUzC;QACgB,KAAP0E,KPXgC1E,iCOYzC;QACgB,KAAP0E,KPbgC1E,mCOczC,mDAIN;uCACF,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,E,C,CAGAjiC,YACE,MAAO4mC,aACT,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,E,C,CAEA;EP1BiD3E;UO6B7C0E,AAAAA,AAAAA;cAUAzE;oBACAA;sBACA2E;YAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,a,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CA3CAC;;E/E4FqB;;;gBC5CI;;;;;;;S8EhDqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CA6BxB;;GACM,AAAlBz/B,wBACFA,QAAcA,iBACdA;MAAgBA;SPhCmG46B;QAASltB,YAA2BktB,YOmCzJltB;iBACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,yC,C,C,G,C,C,A,E,yB,sD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCnCoBF,YAAwB,MAAGkyB,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAuCn0B,cAAiCm0B,KAAchyB,eAAgCgyB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAIzM5xB,cACE,MAAO6xB,AAAAA,MAL0CD,SAMjC,KAAZC,KAN6CD,oB5EukC1C1xB,uB4EhkCT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,cACE2xB,AAAAA,KAViDD,YAWnD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CATAE;;EhFyFqB;;;gBC5CI;;;;;;S+E7CsB,A,C,I,C,I,C,C,C,C,C,G,C,iC,C,C,C,C;A,sB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,wD,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,C;A,G,C,CCElCzxB,YAAc,MAAGsa,MAAAA,QAAS,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,C;A,E,C,CA2BvC;EACkB4U;EAAAA;EACZ/K;;GAAgB,KAAhBA,WAEF,MAEF;MAAsB7J,SAAtB,KAAsBA,WAI8Bvb,QAJpD,UAAA;EAVyB,KAAhB2yB,QAAkBpX;6BAKX4U;GAMV,EAXiC,KACe,AAAd,KAA9BwC,AAAAA,cAAgC3yB,oBAcxColB;MADU,kBAEZ,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,WAAA,OACA,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CApCAwN;EAKqB5yB;EAAAA;EAGjB6yB;EAA0BtX;WAA1BsX,OAAYC,KAAcvX,QAAYvb;KAEtC6yB,OAAYC,KAAcvX,QAAY/F,AAAAA,WAExCqd;OAAYC,KAAcvX,AAAAA,kBAC5B,A,C;A,M,C,C,E,C,CAlBA7tB,cAEE,MAAUqlC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,CAEAH;;ErFVmB,QAAsB,KAAZpd;;;SqFuB7B,A,C,C,C;A,E,C,C;A,G,C,C,iD,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,C;A,E,C,CA8DA;EACkB2a;;EAAAA;EACGA;EACf/K;;GAAgB,KAAhBA,WAEF,MAEF;MAAuBp1B,UAAvB,KAAuBA,SAAvB,UAAA;;EAbsD,KAAlCA,KAAkB2iC,UAClB3iC;6BAMJmgC;GAOV,EAZgB,KACkC,AAAhB,KAA9BwC,AAAAA,6BAeRvN;MADU,OAAkC4N,gBAE9C,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,WAAA,OACA,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CA5CAC;EAIqB9C;;EAAAA;EAI4BngC;EAE7C6iC;cAHW1C,AAAAA,aAGX0C;OAAYC,KAFe9yB,QACJA,gBAGIwV,IAE3Bqd;OAAYC,KAFetd,QACJA,SAGzBqd,OAAYC,KAAc9iC,YAC5B,A,C;A,M,C,C,E,C,CAtBAtC,cAEE,MAAUqlC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,CAEAE;;ErF1DmB,QAAsB,KAAZzd;;;SqF2E7B,A,C,C,C;A,G,C,C;A,G,C,C,mI,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAkCwBlV,YAAuB,MAAGsvB,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCvxB,cAAgCuxB,KAAapvB,eAA+BovB,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CACzKtkC,YAA0B,MAAG4nC,MAAmB,A,C,I,C,I,C,C,C,C,C,G,C,kB,C,G,C,G,C,C;A,G,C,CAAyC70B,cAAmC60B,KAAsB1yB,eAAwC0yB,QAA6B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,kB,C,G,C,C;A,G,C,CACvN5nC,YAAyB,MAAG6nC,MAAkB,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,G,C,G,C,C;A,G,C,CAAwC90B,cAAkC80B,KAAqB3yB,eAAuC2yB,QAA4B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,iB,C,G,C,C;A,G,C,CAChN3nC,YAAuB,MAAG4nC,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2C/0B,cAAgC+0B,KAAiB5yB,eAAmC4yB,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CAC/L5nC,YAAuB,MAAG6nC,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2Ch1B,cAAgCg1B,KAAiB7yB,eAAmC6yB,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,I,C,CAC/L7nC,YAAsB,MAAG8nC,MAAa,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,G,C,C;A,I,C,CAA0Cj1B,cAA+Bi1B,KAAgB9yB,eAAkC8yB,QAAuB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Y,C,G,C,C;A,G,C,CACxL9nC,YAAuB,MAAG+nC,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2Cl1B,cAAgCk1B,KAAiB/yB,eAAmC+yB,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CAC/L/nC,YAAyB,MAAGgoC,MAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAA6Cn1B,cAAkCm1B,KAAmBhzB,eAAqCgzB,QAA0B,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAQtO;EAfkD5D;WAiB9C;EAEiBO;EnC6CW;EmC3ChBsD,OAlB4HL;KAAiB5yB,eAAmC4yB;EAmBhLM,OAlB4HL;KAAiB7yB,eAAmC6yB;EAmBhLlD,KAAAA,KAvBkCP,cAM0F2D;KAAiB/yB,eAAmC+yB;EAkBjLpD,KAxBmCP;6BAwBnCO;EACA,QAAyB,YApBgGmD;KAAgB9yB,eAAkC8yB;EAqBrK,KAAkB,KAAjBK,cAnB8HH;KAAmBhzB,eAAqCgzB,OAoB1MrD,AAAAA;KA3BgDP,SAAAA,KA4BhDO;KA5BgDP,iBA4BzB+D,KACvBC;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,gB,C,C;A,E,C,CAEA,cACEA,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,yB,C,C;A,E,C,CAGA,kBbtIS1G,QauIPvR;0BACAiY;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,cACEC,gBACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,wB,C,C;A,E,C,CAEA;EA5CqDV;EA8C9B,gBACX,gCAEVhD,AAAAA,AAAAA,AAAAA;KAnDgDP,kCAwDlD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA;GA1DkDA,WA4D9C;EA3DkDsD;GA8F7B,gBACrBY;KAEAC,WAnCJ,A,C,Q,C,K,C,C,C,C,C,G,C,S,C,C;A,E,C,CAEA;EAEa5D,AAAAA,KAnEqCP;WAqE9C3xB,A3FyDsB;I2FtDtB0d,AAAAA,QAAgB,KAxE8BiU,yBAuEhD;;kBAGE3xB,A3FoDsB;qC2FjDxBuC,oBAAkCmb,MACpC,A,C,Q,C,K,C,C,C,C,C,G,C,mB,C,C;A,E,C,CAEA;EACawU,AAAAA,KAjFqCP;WAmF9C3xB,A3F2CsB;I2FxCtB0d,AAAAA,QACI,KAvF0CiU,2BAqFhD;;kBAIE3xB,A3FqCsB;mC2FnCxBuC,oBAAkCmb,MACpC,A,C,Q,C,K,C,C,C,C,C,G,C,iB,C,C;A,E,C,CAEA,kBA7FsDuX;GA8F7B,gBACrBY;KAEAC,WAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,Y,C,C;A,E,C,CAEYvoC,cACV,2BAAkC,KAAVyU,mBAC1B,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,G,C,C;A,E,C,CAEYzU,oBAEY,KAAVyU;qCACZ;MAAO+zB,SACT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,U,C,G,C,C;A,E,C,CAEY;EACA5hB;;+CAGRuJ;EAAY1b;mCAAZ0b;KAAyB,MAE7B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,gB,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,Q,C,E,C,CAvHAsY;;EjFlBqB;;;gBC5CI;;;;;;;;;;;;;SgF8DwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAoDb;;SAnD8FrE;QAAapvB,YAA+BovB,aAuD5K,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,wC,C,C,G,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,CCvKFsE;;ElF6FqB;;;gBC5CI;;;;;;;SiFjDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C,A,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCErB/1B,YAAoB,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,KAAaoC,eAA+BpC,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CADzL+1B;;EnF4FqB;;;gBC5CI;;;;;;SkFhDwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCCzBh2B,YAAoB,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,KAAaoC,eAA+BpC,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAGzLwC,oBAH+CxC,IAI7C;MAAOxQ,MACgB,KAAnBA,KAAAA,uBhFkkCGkT,uBgFjkCT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,cACElT,AAAAA,KAT6CwQ,YAU/C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,kBACExQ,AAAAA,AAb6CwQ,kCAmB/C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,Q,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAlBAg2B;;EpF0FqB;;;gBC5CI;;;;;;SmF9CqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAYjB,YAIvBxmC,KAjByCwQ,cAkB3C,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,oC,C,C,G,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,2D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCpBoB3S,YAAiB,MAAG4oC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAuCh2B,cAA0Bg2B,KAAU7zB,eAA4B6zB,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAK3K,0CAEEhZ;OACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,cACE7a,wBACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,a,C,C;A,G,C,CAEAhV,YACE,MAAO8oC,MAfmCD,MAgB5C,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,C;A,G,C,CAEA7oC;EAlB4C6oC;;4CAoBxC;4EAEA,YAEF;kBACF,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAEAppC,kBACSowB,IAAAA;KAAM,SAAb;SACF,A,C,I,C,I,C,C,C,C,C,G,C,S,C,C;A,G,C,CAEAnvB;EA/B4CmoC;;uEAiCxC,QAEF;SACF,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,G,C,CAEAnoC;EAtC4CmoC;;4CAwCxC,MAAOC,MAAAA,SAET;SACF,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,E,C,CAEA7oC,cACE,MAAO6oC,MA9CmCD,QA+C5C,A,C,Q,C,I,C,C,C,C,C,E,C,E,C,C,C,C,O,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CA5CAE;;ErF0FqB;;;gBC5CI;;;;;;;;SoF9CkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CCH3CC;;EtF6FqB;;;gBC5CI;;;;;;;SqFjDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCGrBl0B,YAAuB,MAAGm0B,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCp2B,cAAgCo2B,KAAaj0B,eAA+Bi0B,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAIlM7zB,cACE,MAAOqF,AAAAA,MALyCwuB,SAMjC,KAAXxuB,KAN4CwuB,oBnFskCzC3zB,uBmF/jCT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,cACEmF,AAAAA,KAVgDwuB,YAWlD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CATAC;;EvFwFqB;;;gBC5CI;;;;;;SsF5CqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,W,+B,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,yB,C;A,G,CjG6D9ClpC;EACKgqB;WAA8B,KAAZA;EAAqBnhB,OADxB;WACkCmhB,cAAuB,A,C;A,G,CAoD7Emf,0BAEQC;GAAO,QAAS;EAChBpf;GAAO,QAAS,MAAOA,SAE7B,YACF,A,C;A,G,CAGA,qBAC2C,AAAPA,cAChCof;QAEW,AAAPpf,mBACI,KAAA,+GAIRqf;QAEJ,A,C;A,G,CAOAhiB,WAA+B,MAAGiiB,WAAY,A,C;A,E,C,CAc9CxpC,YAA6B,MAqJU,AAAN0I,MAAS9G,AArJA6nC,aAAM,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAUhD;GA2IuC,AAAN/gC,KAAS9G,AArJA6nC,gBAaQC;EwDGlB;MxDwKTC;KAAqB;;QAtKtC,WAAc,mBACZ7iB;;EACSA,SACX,KAEApS,KAuDoB,aApD1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAOA,gBAAkE,MAC9Dk1B,qBAA4C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGhD,gBAAiE,MAC7DA,qBAA2C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAO/C,gBAAiE,MAC7DA,qBAA2C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAG/C,gBAAoE,MAChEA,qBAA8C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGlD,gBAAmE,MAC/DA,qBAA6C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAMjDriB,oBACoC2C,qBAC5BxC;cACY,uBAAdA;UAEKA,UAAP;0CAEA,MAAOhT,AAWe,eAT1B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,oBACMgT;GAAY,Y8BjBZ,AA/EoBnD,aA+ECM,OACzBC;S9BmBF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CA9HAnS,sBAGMuX;GAAO,QAASA,AAAAA,YAAiBnhB,cACvC,A,C;A,K,C,I,C;A,M,C,C,G,C,I,C,E,CA1BA5H,YACE,MAAO0oC,0BACT,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CADoC;;GAI9B9gC;EAIMA;YAIC,OAAgB;OAGhB,KAAWA;EACTA,UAAmB,OAEc;;WAlBT;SAAyB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,C,C,CAyNhE/I;;QAA+B;iDAAqB0I,SAAS9G,IAAW,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACxE5B,oBAAwC4B;6BAAAA,OAAX;MAAS,AAAN8G,UAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACnD1I,oBAA0C4B;6BAAAA,OAAZ;MAAS,AAAN8G,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACrD1I,oBAAwC4B;6BAAAA,OAAX;MAAS,AAAN8G,UAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACnD1I,oBAA0C4B;6BAAAA,OAAZ;MAAS,AAAN8G,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CACrD/I,oBAAsCiC;6BAAAA,OAAX;MAAS,AAAN8G,UAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CACjD/I,YAAiB,MAAG+I,QAAK,A,C;A,E,C,CACzBxI,YAAkB,MAAG6I,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,G,C,uC,C,C,C;A,E,C,C;A,G,C,6B,C;A,E,C,CAkCzB7I,YAAkB,UAAOupC,AAAAA,gBAAcK,aAAanlC,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,G,C,I,C,C,C,A,E,I,sF,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CkG7V9DolC,WACEp3B,AlGgP0B,kBkG/O1BA,AAAAA,AlG+O0B;6BkG5O1BA,AlG4O0B;;oBoC3OA,mBrCKxBA,ACsOwB;wCDrOxBlN,AAAAA;qDAC2B,KXooDtBtC,2Dep1CQ+7B,KJ9S6B8K,eXkoDP,kC8G3oDrCzF,AnGWSyF,AAAAA;+BmGNX,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAT8B,YAC1B3mC,KAAS4mC,AAAAA,oBAAmBA,kBAAaA,UAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAE4B,YAE1Bt3B,AlGyOwB,mCkGxOxBu3B;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,Y,0E,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,S,C;A,M,C,C,G,C,kB,C,C,C;A,G,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,I,C,C;A,G,C,C;A,G,C,I,C,C,A,E,mB,gD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,sC,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CCJAC;;EzF0FqB;;;gBC5CI;;;;;;SwF9CgB,A,C,I,C,I,C,C,C,C,C,G,C,2B,C,C,C,C;A,gB,C,C,G,C,C;A,E,C,C;A,G,C,C,qE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKjBjqC,YAAgB,MAAGkqC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCr3B,cAAyBq3B,KAAUl1B,eAA4Bk1B,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC/IlqC,YAAkB,MAAGmqC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAyCt3B,cAA2Bs3B,KAAYn1B,eAA8Bm1B,QAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CAC/JrqC,YAAc,MAAGsqC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCv3B,cAAuBu3B,KAAUp1B,eAA4Bo1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKC;;EzFiFqB;;;gBC5CI;;;;;;;;;SwFrCiB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKlBrqC,YAAgB,MAAGkqC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCr3B,cAAyBq3B,KAAUl1B,eAA4Bk1B,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC/IlqC,YAAkB,MAAGmqC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAyCt3B,cAA2Bs3B,KAAYn1B,eAA8Bm1B,QAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEvLG;;EzFyEqB;;;gBC5CI;;;;;;;;SwF7BqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,oE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKtBrqC,YAAqB,MAAGkW,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C,C;A,G,C,CAAoCtD,cAA8BsD,KAAcnB,eAAgCmB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACxKrW,YAAgB,MAAGyqC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAuC13B,cAAyB03B,KAAYv1B,eAA8Bu1B,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACzJvqC,YAAiB,MAAGwqC,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAA4C33B,cAA0B23B,KAAWx1B,eAA6Bw1B,QAAkB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAIpL,wBAL2CD;UAOvC,MAPgHA;KAAYv1B;GAUjH,AAXiCmB,WAY5C5N,UAASkiC,aAEb,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,a,C,C;A,E,C,CAEA,YAfoHF,KAAYv1B,eAA8Bu1B,SAiB9J,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAdAG;;EzFgEqB;;;gBC5CI;;;;;;;;SwFpBoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAmBrB5qC,YAAc,MAAGsqC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCv3B,cAAuBu3B,KAAUp1B,eAA4Bo1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKO;;EzF2CqB;;;gBC5CI;;;;;;;SwFCoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKrB7qC,YAAc,MAAGsqC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCv3B,cAAuBu3B,KAAUp1B,eAA4Bo1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC3Iz3B,YAAoB,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,KAAaoC,eAA+BpC,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CAEzLg4B;;EzFmCqB;;;gBC5CI;;;;;;;SwFSwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKzB91B,YAAuB,MAAGm0B,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCp2B,cAAgCo2B,KAAaj0B,eAA+Bi0B,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC1KnpC,YAAc,MAAGsqC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCv3B,cAAuBu3B,KAAUp1B,eAA4Bo1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKS;;EzF2BqB;;;gBC5CI;;;;;;;SwFiBwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKzB/1B,YAAmB,MAAGK,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAkCtC,cAA4BsC,KAASH,eAA2BG,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CAC9IrV,YAAc,MAAGsqC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCv3B,cAAuBu3B,KAAUp1B,eAA4Bo1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKU;;EzFmBqB;;;gBC5CI;;;;;;;SwFyBsB,A,C,I,C,I,C,C,C,C,C,G,C,iC,C,C,C,C;A,sB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,mC,gE,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCtEvBhrC,YAAkB,MAAGirC,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyCl4B,cAA2Bk4B,KAAc/1B,eAAgC+1B,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACtK53B,YAA+B,MAAG63B,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAA8Cn4B,cAAwCm4B,KAASh2B,eAA2Bg2B,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAE3MC;GAH6CF,sBCoCZ,uDC2IE,8BACC;;;;MF/KmHC;KAASh2B,eAA2Bg2B,mDE8KxJ,8BACC;;;;MF/KmHA;KAASh2B,eAA2Bg2B,SAQ3L,A,C,I,C,I,C,C,C,C,C,G,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CANAC;;E1FsFqB;;;gBC5CI;;;;;;;;SyFpCzB,A,C,I,C,I,C,C,C,C,C,G,C,2C,C,C,C,C;A,gC,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,4D,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,sC,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,CdVA,2CAEA,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,2CAEA,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,E,C,CAEA,uDAEA,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,kB,C,C;A,G,C,CAEAnrC,YAA2B,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,mB,C,C;A,E,C,CAclCE;WAEI;EAMW,KAAM;EAEA;EACH;EAEK;EACL;EAEK;EACL,cAEhB;MAAWkrC,eACCA,cACAA,cACAA,UAEd,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,mB,C,C;A,E,C,CAEAlrC;WAEI;EAMW,KAAM;EAEA;EACH;EAEK;EAGA,QAFL,qBAIG;;GACT,MACR;GAEU,MACV,qBAEF;eACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEAA,cACE,MAAOsG,WACT,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,e,C,C;A,E,C,CAGAtG;GAMY,YACR;QACe,eACf,SpG5BWqB,QAAAA,QoG4BM;QACF,kBACf,SpG9BWA,QAAAA,QoG8BM;QACF,qBACf,SpGhCWA,QAAAA,QoGgCM;KAEjB,SpGlCWA,QAAAA,QoGkCM,4BAErB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEArB;;EACamrC,KAAAA;SAEX;MADgBC,QAAqC,KAAtBA,wBACRD,eACzB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,a,C,C;A,E,C,CAEArrC,cACE,MAAY,gBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,C;A,E,C,CAEAA,cACE,MAAY,iBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,S,C,C;A,E,C,CAEAA,0BACE;MAAa,eACA,eACA,gBACf,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,O,C,C;A,E,C,CAEAA,cACE,MAAY,gBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,C;A,E,C,CAEAA,cACE,MAAY,kBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,U,C,C;A,E,C,CAEAA,cACE,MAAY,oBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Y,C,C;A,E,C,CAEAA,cACE,MAAY,mBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,W,C,C;A,E,C,CAEAA,cACE,MAAY,kBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,U,C,C;A,E,C,CAEAA,0BACE;MAAa,+BACA,eACf,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,C;A,E,C,CAEAA,cACE,MAAQ,CAAC,+HAYX,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,c,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CApKAurC;;E5E4FqB;;;gBC5CI;;;;;;S2EhDqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,E,C,CAgB9CnpC,yBAEE;6BAAW,aACe;;GACd;EAGP,SACL,AACA,gBACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,U,C,C,C,C;A,qB,C,C,G,C,C,A,E,+B,2C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,G,CpFfAmlB,kBACMikB;cAEYC;EADH,KACuBC,sBADlCF;OAGKA,UAAP;qCACF,A,C;A,E,C,CAOA,aAAiB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAMjB,YAEEA,UACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEAxrC;EACgB2rC,IACdA;;GACIC,aAAwB,WAC1BJ;;G4B+KE,AA/EoBjnB,aA+ECM,OACzBC;O5B/KE;SAEF,SACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,G,CAMA9kB;EAAyBwrC;GAAS,W4B+FHroB;EA1BP,+B5BrEF;SAA2C,A,C;A,E,C,CAiBjEjO,kBACI,MAAGlC,eAA2D,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAElE,iBACM,CAAC44B,YAAc;GAEfD,YACFA,OACAziB;KAAkB2iB,aAEpBF,AAAAA,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CqG5DAzrC,YAAkB,oCACW6I,uBAAY+iC,qBAAcC,aAAU,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C,A,E,sC,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,4B,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CCuBjEpsC,YAAe,MAAGqsC,AAAAA,gBAAiB,A,C;A,E,C,CAEtBh6B,YAAU,MAAGi6B,SAAM,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAUhC;GACMC,QAAU,MACdA;;EAEwBC,UACxB;MAAqBH,0BxH6Oe9qC,gCwH5OlCkrC,QADF,UzE6YkCxjB,AyE5YtByjB,KxH8OGjjC;E+CnKLgd,IAAVyB;KAAUzB,OAKV0B;KAAW9B,cAKX+B;KAAU3B,YyErFRgmB;UACF,AACAE,UACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAKA,eACMC,QAAY,MAChBA;UACArjB;KAAkBojB,YACpB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEA,kBACEC;;EACIP;GzH6OczrC,ayH7OM;EACTyrC;GACG,AAAdQ,gBAAkCA,UACtCP;QtGXKj5B,esGWiCi5B,WACxC,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAQA;EACMD;GzHgOczrC,ayHhOM;GAEpB2rC,QACF,MAA+BE,0BxH4MGlrC,8BwH5MlC,OACEurC,AxH6MWrjC,SwH5Mb,AzH0DF7I;YAAAA;QyHvDA6rC,UACAH;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAR,YAAW,MAAGiB,YAAO,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CACrBhB,YAAa,MAAGhN,YAAO,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAzBS,YAAI,MAAGY,SAAE52B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,2B,uC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CC/C3C;QACmB;cACY,MAE7BikC;;;MAKA;;;;;yBAOEC;MAGA;MAKoB,iBALF,EAAEC,gBACDA;;GACbR,aACEA,cAEqBS;KAEzBF,cAEJ,OACc,UAAuC;iBAGrDG;iEAEA;sBzHwOoC7rC,8ByHxOpC,UzH0OekI;SyHzOb2jC;0DACOljC,2BAAoBA,eAC7B,CAGFmjC,KAAuBJ,WACvBD;QACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAeAnhB;;aAgCE;2FAGF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAhCEyhB;OAEe;MAGb/iB;oBAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAJiC,sBC7DLgjB;ODgE1B,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAGFC,6BAEiB,QACf;8BAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAJS,WACLF,4BACA;MAAOr+B,iBACT,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAGFw+B,6BAEiB,QACf;+BAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,M,C,CAJS,YACLH,+BACA;MAAOr+B,mBACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,yB,qC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CEhDJhO;EAGmC,KAAX;EACsB,KAAf;6BADI;UAKjC;mBAAkB,sCAJ0B;;;uBAK1CysC;;mCACAA;OACF,6BAP4C;GAU5C;KAAkB,gCAChBA;KAAAA,UACF,AAEA,sCAAkB,QAChB,MAI4B,MAHL,AAAJ,UADD,WACU,KAAtBC,SAAyBhnB,MAAyB,KAAJ;EAItB;EADd+mB;;EAFZA;uBAAAA;SAAkBA;EAEc,KAApBA;;EACmB,KAApBA,KAAAA,UACXA;KAAAA,OAAkBE,WAEtB,AACF,AAEA,SACF,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUA3sC;EACUysC;EAAiB;;EACG,KAApBA,KAAAA;;EACMA,KAAAA;IAEd;eAAS,KAAS;eAEdG;EACC;;GAGG,UACJA;YAI0B;;EAAZH,KAAAA,KAAmB;EACxBA,KAAAA;;EACCA,KAAAA,KAAe;EAEjBE,IAASA;aAGH,UACZC;KAEAA;MAID;mBAEDA;;SAIAA;EACC;MAGL,AAEA,MAAOA,gCACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA7tC,yBACE;4BAAkB,WACJ,CAAA,KAAR8tC,SAAWC,UACb,QAEJ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/tC;;EACe8tC;;EACAC;GAEb;aAAa,OAAuB;EAALD;EAAuB;EAAR,OAAGC;gBAEjD,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAYA9sC;;;EAMkB2sC,IAAoB,SAAuB;;EAC1C,gBACDI;EAGD,MAAGrnB,UAAyB,MAAGgnB,SAC9BM,SAAsC;EAGzC;;EAEF;EACJ;;GAEuB,KAAf,aAAyC,KAAX,aAC3C;GAGe;;;;6BANV;SAQL;KAAgB,WACkB,GAAhCC;KAAAA,KAAoBP,UACtB,AAEA,2BAG2B;;;yBAD3B;8BAGQQ,KACNC;;yBAOJ;iCAAkB,EAAEC,oBACXA,gBAEQ,SACTC;SAIG;;;;;sBAMLJ,KAAkB,KAAlBA;EACK,SAELA;KAAAA,KAAoBP;;;;;sBAMpBO,KAAkB,KAAlBA;EACK;;;;;sBAKLA,KAAAA,KAAoBP;;SAI1B,GAEW,QAASW,SACpB;SACF,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKA;;EACoCC;EAAeA;EACpCA,KAAAA;EAAsCA;;;;qBASnD;mBAAoBD,SAAF;EACAA,IAChB3nB;MAAe,KAAfA;;EAhRevO;EAqRgB,OlEzRfI,KAAAA,AkEOEg2B;;EAmRd7nB;EArBiB,AAArBinB,MAqBiC,KAAdjnB,SAAgBA,UArBZinB;GAuBJ,S5H7MI,GAAGhtC;;E4HmNc,KAAnB+lB,QlElSLnO,KAAAA,AkEkS0BmO;6BAAF;IAEtCunB;KAAmB,KAAnBA,KAAyC,KAAnBvnB;EAEmB,KADD,KlErS1BnO,KAAAA,AkEOEg2B,SlEPFh2B,KAAAA,AkEsSImO;GAEI,KAvRJ8nB,SAuRwB;OAI1B9nB;GAEG,KA1SNvO,KA0SQuO,aAvSL6nB;EA0SRN,SAAyC,KAAdvnB,SA7StBvO,MA4STs2B;;wD5H5OE,iBA6BR7tC;e4HmN6C,KAAxB,KAhTNuX,KlEJCI,KAAAA,AkEOEg2B,UA8SI,KAAd7nB,SAAgBA,aA9SN6nB,IAgTZE;OAAeR,OACwB,KAArB,KAAdvnB,SAAgBA,SApTXvO,MlEJCI,KAAAA,AkEOEg2B,WAqTdN,MACAA;KAA8BvnB;GACZ,KAAdA,SA1TOvO,MA2TT81B,KAAgBvnB;cAGE,KA9TTvO,KA8TWuO,WAKxB2nB;EAG+B,KAzTbG,KlEjBJj2B,KAAAA,AkEOEg2B,SAoUhB7nB;MAAe,KAAfA;6BAD+B;;eAInC,GAEI,GAAW2nB,UACjB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEArtC;iBAIE;sB3HpDsCM,8B2HoDtC,OACEotC,O3HnDellC,K2HoDjB,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBAxI;GAEM2tC,aAAqB;IAGzB;MAAmBC,4B3H/EmBttC,gC4HlNG09B,KDiSzC,U3H7EiBx1B;G2H8EO,KAAlBykC,YAAgD,KlEnXpC11B,KAAAA,AkEmXc01B,kBlElXL11B,KAAAA,AkEmXnB01B;EAA0BA;gCCnSOjP;GDmSf,CAAA,OCnSeA,MDmSQqP;kBAI/CA;UAAeQ,OAAkBZ,SAChB,KAAbA,SAAeA,SAAmBA,UlEzXtB11B,KAAAA,AkE0XZ01B,cACN,AAEA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,sB,C;A,G,CA1XEluC,YAAc,MAAGoY,SAAM,A,C;A,G,CAGvBnX,WAAiB,MAAGutC,SAAoB,A,C;A,G,CAUxCxuC,WAAmB,MAAGyuC,SAAW,A,C;A,E,C,CAoBjCpuC,kBAjCiB+X;6BAAAA;EAmCQ;KAAS;GAGjB,CAAA,KAzBKq2B,QlEjBJj2B,KAAAA,AkEOEg2B,aAmCgB;EAGf,KAzCJp2B,QAaKq2B;6BA4BD,OAAnB;MAAW,KACb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAluC,YAAkB,uCA5CD6X,2BAGGo2B,8BAUEC,aAgC2B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CArBjDjtC;;;;yBAKE;2BACF,A,C,C,C,A,E,wB,oC,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,I,C,C;A,G,C,C;A,G,C,I,C,C,A,E,0B,sC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CDkJF6R;GAGM07B,UAA6B,CAAA,UAC/BA,sCAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAzDoB;;EACCC,AAAAA,AAAAA;GACF,CAAA;;;;YAEXJ;sCACAK,AAAAA;eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,8B,0C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,a,C;A,E,C,CGpIW32B,YAAY,MAAGg0B,SAAM,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,G,C,C,C,C,C,I,C,S,C,I,C,C,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAErB,cACXA,Q3GuDKj5B,e2GvDiCi5B,WACxC,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,K,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,G,C,C,C,C,O,C,G,C,C;A,E,C,CAEA/rC,YAAkB,wB/HkMJI,iC+HxMc2rC,aAMwB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,A,E,+B,2C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,mB,C;A,G,CDsCpD1kB,iBACMsnB;cAEa,iCAAfA;UAGKA,UAAP;qCACF,A,C;A,E,C,CAKalvC,YAAe,MAAGi/B,AAAAA,gBAAY,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,C;A,E,C,CAE9B7rB;EACD6rB;EAAAA;SACQ,MA2KlB1pB;;;QACAA;oBAAuD,SACvDA;kBAA2C,GAAe,CAAA;EAnLxD25B;GAAa,W9EiFc1rB;EA1BP;Q8E5CV,a5H66BF,UAAa,MAAEziB,eACjB,SAA+BA;;GAE/B,KAAe,EAAEA,cACjB,SAAiCA;;;GA7xB9B;GAIQ;GAGN,SACH;E4H1JOk+B;;yBADbkQ;uCAGgE;;;yBAAhEA;gCAIJlQ,aACF,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,C,C,CAEaj+B,oBAA4Bi+B;gCAAAA,SAAH;MAAGA,MAAY,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,G,C,C,C,I,C,C,C,C,E,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,I,C,G,C,C;A,C,C,CAExC;EACIA;gCAAAA;EAAAA;EAzBbiQ;GAAa,W9EiFc1rB;EA1BP;;;yB8E5BpB2rB;qDAFalQ,SAKfA;OACF,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CAGa5+B,YAAiB,0CAAgB,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CACjCA,YAAoB,0CAAmB,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,C;A,E,C,CASpD;;mHAEekB;EAEHA;EAhDR2tC;GAAa,W9EiFc1rB;EA1BP;M8ENO,aAEdyb,O5H84Bf/9B;W4H/4BEiuC;QAAc,cACDlQ,A5Hg5BR,yBDx5BPp+B,K6HUAo+B,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,C,C,CAEA;EACYA;EAAAA,QACVmQ;UAA6B;EA1D3BF;GAAa,W9EiFc1rB;EA1BP;K8EKpB2rB,QAAc,oBAGhBlQ;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;EACYA;EAAAA,QACVA;YAEAmQ;UAAyBnQ;EAEA,AAAbA;EAxEViQ;GAAa,W9EiFc1rB;EA1BP;M8EkBS,IAC7B2rB,QAAc,qBAElB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA9uC,qBACE;MA7E6B4+B,YA6EX,EA7EWA,gBA8Ef,KA1DyBA,SA2DnCgI,YAAiB,IACjB;SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;;OAsEyB,EA5JMhI,AAAAA,oBA6JrB,SA7JqBA,AAAAA;IA+JrB;OAAe,EA/JMA,AAAAA,oBAgKrB,SAhKqBA,AAAAA;EAwFP;EACZA;EAAAA;EAEmB,GAoF7B1pB;;;OACAA;sBACAA;kBAA2C,GAAe;EAnLxD25B;GAAa,W9EiFc1rB;EA1BP;M8EuCe,Y5H01Bd,EAAEziB,cACjB,SAA+BA;OAEhB,EAAEA,cACjB,SAAiCA;;;GA7xB9B;GAIQ;GAGN,SACH;E4HvEKk+B;;yBADbkQ;gCAIFlQ,eACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;GACY,KAAa,EArGMA,AAAAA,oBAsGrB,KAAA,SAtGqBA,AAAAA;;mHA0GhB19B;EAESA;EAIZ09B;EAAAA;6BAJY19B,OAKtB09B;UAAa;EAjHgBA,Q7H4M7Bp+B;O6HzFqB,a7H1ErBA;W6H6EAuuC;UAAyBnQ;EAxHvBiQ;GAAa,W9EiFc1rB;EA1BP;M8EmEmB,IACvC2rB,QAAc,qBAGlB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;GACyB,EA/HMlQ,AAAAA,oBAgIrB,KAAA,SAhIqBA,AAAAA;EAAAA;EAAAA;UAmI3BxQ,WACA;OAMFwQ,UAAY;EA1IiBA,Q7H4M7Bp+B;O6HjEqB;EAEDo+B,QAApBmQ;QAAiC;EA/I/BF;GAAa,W9EiFc1rB;EA1BP;K8E0FpB2rB,QAAc;qBA/IalQ,SAiJ7BA;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBA;EAtKIiQ;GAAa,W9EiFc1rB;EA1BP;G8EgHlB,GAAoB;GAEpB6rB,eACFA,UACA9lB;KAAkB+lB,YAEpBD,AAAAA,gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,qBACE95B;;;QACAA;oBAAuD,SACvDA;kBAA2C,GAAe,CAAA,UAC5D,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAlV;EACMgvC;WAAsB;EACZE,YACdF;;EAzLEH;GAAa,W9EiFc1rB;EA1BP;;GAgGlB,AA/EoBoB,aA+ECM,OACzBC;O8EqCE;SAEF,SACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,K,C,I,C;A,M,C,C,E,CA1OA2c;iDAC0D,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAmCxC,WAAKoN,eAAqB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C,A,E,8B,0C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,sB,C;A,E,C,CjGxB5C3uC;GACaivC;OAAsBC,sBACjC;qCAAiC50B,uBAAWsxB,qBAAcC,aAC5D,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,C,CA8CatrC,kBAAwBoO,OAAH;MAAGA,UAAS,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,M,C,G,C,C;A,G,C,CAEjCpO,kBAA0BoO,OAAH;MAAGA,UAAW,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,Q,C,G,C,C;A,E,C,CAErClP,kBAAiBkP,OAAF;MAAEA,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,C;A,G,C,CAE5B7O,kBAFiB6O,OAEA;MAFAA,aAEc,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CAE/B7O,kBAJiB6O,OAIG;MAAG,AAJNA,aAIc,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,C;A,E,C,CAE/B7O,YAAiC,MAAG6O,AAAAA,eAAyB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAE7D7O,YAA6B,MAAG6O,AAAAA,eAAqB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,a,C,G,C,C;A,C,C,CAErDL,cAA0B,MAAGK,AAAAA,gBAAS,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,G,C,C,C,I,C,C,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,I,C,G,C,C;A,C,C,CAEtC;EACDA;EAAAA;EACGA,QACbA;;ETpDuB28B;GAAS,W4B+FHroB;EA1BP;QnBfTtU;GAAH,OTpCLmE,mBSsCDq8B;iEACkB,CAAA,UAClBA,uDAGN,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAEA,cACEztC,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYA4M;EACYK;EAAAA;EACEA;ET/EW28B;GAAS,W4B+FHroB;EA1BP;MnBWE,IAAGtU,SACzBwgC,wDT/DGr8B;iBSgEgCnE,SAErC,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;EACYA;EAAAA;ETxFa28B;GAAS,W4B+FHroB;EA1BP;MnBoBE,KACtBtU,sBTxEGmE;oBS6ELnE,QACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,cAAqC,MAAGA,AAAAA,iBAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEvD3O,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CApF3CnN,sBACS,WAAA;SAAP;SACF,A,C,E,CAGAA;;4DAhBgC;8DAHA,yDAHP,0CA+BvB;SACF,A,C,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAiCgB,cAAmB,gBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA0BrC,0BACXkuC;mDACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CmGgENrvC;4CAEI,MAA6C,MAAtC;;8ChH5J+BuP,QgHgKtC;MAAuC,MAAhC,QAET,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA+/B;WACsB;;;;wEAGa,WAAiB,OAAErkC,SAChD,MAAOA;;+CvCvNqCuL;EhDifzC2C,KzCjb4B1M,AyC2tBCiR,KAAAA;OuF9jB5B6xB,aACKzzB,AAAAA,aAAP;YAKE0zB,gBACKvkC,OhHvL2BsE,QgHuLlC;qBARJ;;gDAaM,CAACigC;GAILzC,WACFA,uCAEF;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA/sC;WACsB;;;;wEAGa,WAAiB,OAAEiL,UAChDA,WACA;;;+CvCzP4CuL;EhDifzC2C,KzCjb4B1M,AyC2tBCiR,KAAAA;OuF5hB5B+xB,WACF3zB,SACA;YAGE0zB,cACFvkC,OhHxNkCsE,UgHyNlC;qBARJ;;gDAWM,CAACigC;GAILzC,WACFA,uCAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA/sC,mBACE;KAAY,CAAA,mBvFs5EemY,AuFr5ET1L;GvFq5ES0L,QuFp5EM;GvFo5ENA,WuFn5Ee;EACjCu3B,QACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOA1vC;WhHjQqB2vC,SAYqBpgC,egHuPxC;KAAY,CAAA,mBvFo4EY4I,AuFn4EN1L;EvFm4EM0L;;4CuFl4Ee;GvFo4EZA,QuFn4EY;GvFm4EZA,WuFl4Ee;EACjCu3B,QACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMA1vC,qBACE;KAAY,CAAA,mBvFq3EYmY,AAAAA,AuFp3EP1L;;6CACe+2B,QAAwB;EAC/CkM,QACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA91B;MAEWnN,OAAP;kBADF,OAQE;eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAgBAzM,cACM2Y;UAES;qBAFTA;GAGAA,WAAa,QACjB;MAAOi3B,cACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,4B,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,G,CApRE59B,kBAAc48B;qBAAAA,SAAH;MAAGA,MAAU,A,C;A,E,C,CAGX58B;GACP,CAAC69B,QAAU;E5GjCQrE;GAAS,W4B+FHroB;EA1BP;GgFnClB,GAAe2sB,SACnB;MAAOlB,UAAAA,SACT,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAGa;EACDmB;EAAAA;SAII;E5G5CSvE;GAAS,W4B+FHroB;EA1BP;GgFxBlB,GAAe2sB,QAAuB;EAEnBlB;EAAY;0BAAZA;EAAAA;qBAPbmB;GAONC,OAAqCD,WAIvCnB;qBAAAA,SAAAA;QAEJ,A,C,I,C,I,C,C,C,C,C,G,C,G,C,C,C,C,O,C,G,C,C;A,E,C,CAaA,6CAEEkB;SACAG;UACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,mBACE;UAAoB7D,QAAF,EAAEA,gBACdA;GAAS,SACXA;EACAA;qBAAAA,SAAAA;WAEJ,kCAEF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAGA;aACyB2D,AAAAA;EACZA;EAAiB,AAAjBA;;EAGsB,AAAdvD;GAFnB;KAAkB,QACkBoC;qBAAAA;EAAAA;qBAFzBmB;EAEMT,OAA+BS;cAEjCvD;EAEboC;qBAAAA,SAAAA;OACF,CACF,A,C,Q,C,C,C,M,C,I,C,E,C,I,C,C,C,I,C,Y,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAEA,iCAEE;MAA2BmB,UAAiB,AAAjBA,aAGM,AAAdvD,gCAHgC,YACtCoC;EAAU;;cAAVA;EAAAA;cAAAA;EACmBA;qBAFLmB;EAEdT,OAA+BS;cAE7BvD;0BAGXyD,YACA;SAEFrB;qBAAAA,SAAAA;OACF,AAEAqB;GJ4BEvB,gBAA6B,CAAA;yBAC/BA;iBI3BF,A,C,c,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEA;aACyBqB,AAAAA;;GAEvB;KAAsB,WAChB3D;qBAAAA;EAAAA;GAAS,QAASA,MACtB8D;WACF,CACF,A,C,Q,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EACiBtB;qBAAAA;EAAAA;EACCmB;qBAAAA;EAAAA;;+CAGZ3D;E/EsR8BxjB,A+EtRnB3d;E/E3CLmb,IAAVyB;KAAUzB,wBAKV0B;KAAW9B,cAKX+B;KAAU3B;qB+EiCNgmB,SAAAA;;+CAgBFA;E/EsQgCxjB,A+EtQrB3d;E/E3DHmb,IAAVyB;KAAUzB,wBAKV0B;KAAW9B,cAKX+B;KAAU3B;qB+EiDRgmB,SAAAA;SASJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA3JA+D;GAMMN,QACF,MAAoBna,AAAAA,qC9HiPcx0B,gC8H9OhC6uC,QAHF,U9HmPa3mC;G8HlPC;EnHkCTnJ,qBmHhCH8vC;OAAoB,mBhHlBPJ,UgHmBf,EAMyBI,OAA3BnB;mBAA4C,AAAjBmB;G/HwPTxvC,c+HnPoB,UAC3B6vC;EAGXxB;qBAAAA,SAAAA;MACAxC;mBAAqC2D,kBACvC,A,C;A,K,C,I,C;A,M,C,C,E,CA5BAI,iCAGiBE;;SAyBjB,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAnByD,YAAI,OAAG,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAyHrB,mBACnC;MAAA,iBAAA,UACMnC,AADN,cAEIoC,iBACA;OAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAS+B,mBAC/B;MAAA,iBAAA,UACMC,KADN,WAEID,iBACA;OAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAwIc,WAOlB,gBzHlUUp+B,mJyHmUZ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,ChCjUA0vB;;4CAC2B;+CAEV,iBACbl5B;mBAGA;iFAG+BA;E8BJ7B,eAAA;S9BIF;SAEF,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CATkB,cACZlB,WAAOo6B,QAAwBA,SACjC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,W,+B,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CiCjCJ4O;E1G6nPWlY,oC0G1nPTmY;;EASW95B,8BACX+5B;iBAAyBA,aAEzBC;MAGAC,ArGqD6BC;yBqGlD/B,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAQAF,oBACE;sDAAA,U/H+QiBvnC,I+H9Qf;M1GikPO,KAA6BuwB,qC0GjkPpC,QAAA,OACE1J,AAAAA,K/H6Qa7mB,2B+H5Qf,CACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CCsbA;EACgB0nC;GACF,QACV,MAAA,QAAA,OACEC,KADF,OAEA,CAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAWA1pC;GACU,eAAgB;EAChB2pC,KAAwBz7B,UAChC;MzF8sE0B4C,AyF9sEP5C,azF8sEO4C,8BvC/2E2BV,KAAAA,MAAoBO,6BgIiKzE,UhI9HiB5O;GgI+HXo6B,SAAmBA;;+CAES,CAACA,sDACAA;;KAE/B,MAAA,KAAiBA,SAAjB,UACMyN,AhIxMO7nC;;yFgI2MsB8nC,wB5HypChC/tC,QAA8B,+B4HvpC3BqQ;MAAMgwB,kBAIZ,CAEJ,AAEA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjoB,qBACE;KzF4qEwBpD,AAAAA,AyF3qET5C;;6CACiBuG,SAAmBo1B,oDAE/C;EAEI37B,cAWK,CAAA,eAAe,AAC5B;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAvV;ElHhfqB2vC,SAYqBpgC,AkHqeY4hC;EzFspE5Bh5B,AAAAA,AyFrpEX5C;QACb;iDAAiCuG,QACnC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAcA;;oBAE8C;GACxC,CAACtF,0BAA6C;EAEnCA;WACO;EACN46B;WACO,MACvBC;4BACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CASAnxC;WACqB;;EAGRoxC;GACF,a3Ggi8BAzU,AAAAA,A2Ghi8BcyU;;GAER,SAAW96B;EAET+6B,K7GhaR5R,KAAYP;G6GiaN,QAAS,QACtBoS;8DACA;mCAQQ;qBAAA;;EAAD,cAAP;oBADF;;;kBAMEA;gGAEA;uBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CtG3iBEpvC;iBAIEqvC;;EsG4ZYC;GACF,QAASC,QtG1ZrB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA8aAvvC,YACEwvC,mBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAxvC;WACoB,MAElBqG;WACA;MAAiBwnB,aAAuB,UAAiB4hB,cACvDD,SACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmPAxvC,qBAIM,CsGnM6B0vC,ctGmML,MAAOC,gBAGnC;qBA6BF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIA3vC,iBACE;eAAuB,AAAhB6tB,kBACEA,QACT,AACA;MAAO+hB,eACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOA5vC;E6D/wBgDoU;E7DoxBjCy7B,KanSR94B,KzCjb4B1M,AyC2tBCiR,KAAAA;GbNvB,WAKK/D;EAAAA,kBAAdomB;UAAcpmB,SAEhB,MAAOu4B,AAAAA,cACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA9vC,qBACE;Kaw4DsB+V,AAAAA,Abv4DP1L;;4CACe;EACrBA,cACK,QAAQ,CACxB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAiIArK;WACqB;EL4sNZk2B,oCKrsNK;OAA2BmY;EL6q7BhC5T;GK1q7BE,QL8q7BTA,2BK1q7BAsV;iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA/vC,uBLg8zBE+5B;UACOiW;UAAuBt+B,kBKl7zBhC,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAsDF+E;;2CAHU,SACA;GAIe,KAAnBpM,eACmB,KAAnBA,iBAEQ,WACC4lC;GACH,QAAS,MAAOn4B,QACtB;Ma3hBGf,MzCjb4B1M,AyC2tBCiR,KAAAA,AgD3xBYlH,gB7D+gChD,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAnW;WACqB;0CACD;uBAEA;wBACC;uBACE;;4CACE,WACvB;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CF3gCA4iB,0BiG2GyBA,QAAiCqvB,OjGzG/CC;YAAP;SAGFC,MACA;YACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CASA,yBH2jcIC;0CGxjcFC;MAGAlC;MAEAmC;sBACF,A,C,Q,C,I,C,C,C,C,C,G,C,C;A,E,C,CA0BA,4BACE;+BxB6NsCzxC,8BwB7NtC,UxB+NiBkI;IwB7NbwpC,mBADF;;;;;;;;G4BrDI,AA8CmBruB,mDA7CvBb;W5B2DF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CASA9iB;aAE2B;;;;W2B9FzBujB;KkBAEC,W7CkGA;YAEE0N,UAAoB,QACxBA;QAGA;MHo/OS,KAA6B6H,0DGp/OtC,aAAA,UxBiMiBvwB;;4CwB/LbypC,KAAiB5iB,SAAaA;kDACIA,+BAC9B,MACQA,QACV6iB;;;;W2B9GN3uB;KkBAEC,a7CqHF,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA8BA;QACY2uB;;;EM1CsB,KAAmBn4B;EAgtB7Co4B;GAAiB,CAAA,cAEFA;EACJA;EACAA;EACAC,KApvBEld;EAqvBDid,aA0CY,CAAA,KAAL9d,gBAvCF8d;EACJA;EACAA;EACAC,KA3vBAld;EA4vBCid,aAEK,KA9vBNjd,YAAAA;EAgwBPid;EAAgB,CAAA,aAGJ,YAGZA,KAtwBOjd;EAAAA;IAuwBIkd,QAEAA,KAAmBC,KAzwBvBnd;EA2wBGid,OAEC;EACJ;EACA,WAEA,OAEV,KAMkBA;ESw0DH76B;EAAAA;ETjmFL4d;GNuDD,KAAXG,KAAc6c,SAEjB7c,UAAiB6c;GACjBI,kBACCA,2BAAkCA;;;QM3DpBpd;;ESimFK5d,MTlkFQ,KAAmByC,gBNoD/Bsb,OACoB,KAAlCA;GAEa,wBAMjBkd,sCACA;Se8gFwBj7B,Af1gFZk7B;Ee0gFYl7B;;;;EvChzEuBV;;8BwB1NjD;KAAA,OACE67B,OxB2Oep7B,OwB1OjB;EewgF0BC,AftgFZk7B;EesgFYl7B;;;;EvChzEuBV;;8BwBtNjD;KAAA,UxBwOiBS,MwBtOf;MAAA,KAAc8xB,SAAd,UACa5d,AxBoHEhjB;;+CwBlHM6nC;EAAcjH,OErInCyH;;EsG4ZYC;GACF,QAASC,SxGtRnB,CAQF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,uBAEE;MAAA,KAAiBh4B,cAAjB,UACgBs3B,AxBkGC7nC;MwB9FjB,GACI,GAAkB;GAClB,CAACuQ,6EAEKA;;W2B/MVwK;KkBAEC,W7CgNA;SAEGzK;EAAAA;G+BoEgB6U,AAAAA,yF/BlED7U;;W2BpNpBwK;KkBAEC,W7CqNA;OAEFsqB,KAAW/0B,cACb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CuG1MuB,YACnBi3B,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,6C,C;A,G,CCGAvwC,YAAc,MAAGqgB,MAAK,A,C;A,G,CAUtB6yB,YAAwC,MAAGC,MAAM,A,C;A,G,CAGjDtzC,YAAgB,MAAGuY,MAAK,A,C;A,G,CAyBxB8gB;EACmB;GACD;EAAUka,gDCmBcC;eDnBxC;SACF,A,C;A,E,C,CAiBA;GAEMC,UA/Cal7B,MAgDf;E3Gih9BKokB;G2G7g9BH+W,aAEF;EAtDen7B;QAuIjBiI;KAiSoC+wB;EAAAA,QA9RpCoC;;GACe,QAASL,KAuTuBM;EArTrC55B,KAAawG,KAGvBqzB;YAAuBP;EAyQnBQ;GAAS,QAASC,KAAaC,YArQnCC;YAlCAL;eA+CAM;UAwGAC;UAAsBC,KA0BtBC;UACAC;UACAC;UA2DA7D;KAqBO8D,UADOC,8B3G8gbQvwC,c2GntbtBwwC;KAAsBC;EAEZ36B,KA9LKwG;EzF2pFOvI,AAAAA,AyF19EL5C;GACF;4CAEXu/B,SACAA;KACFv/B,cAlEFw/B;YA/CAC;KAxEiBv8B,MAiEnB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUAzY,iBAC+B,AA4VOyxC,oBA5VE,QAGtCC;;G3G8+8BO7U,gC2Gl+8BL+T,YAEF;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA5wC,iBAEe,SAAiC,AAAtBi1C,kBAElB,CA6VyBnB,cA5V3BhD,KAAAA,0BACA;SAGJ,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAmFA,yBAGE;eAAY;E3Gi48BLjU,AAAAA,A2Gh48BKqY;EACHA,SACT;EAhNex0B,I3G8kcf+xB;qB2G53bF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;GAEgB,SAA8B,AAAnB0C,iBAICA;ExFjLnB,8BAAA;SwFiLLnB;OAGFA,KAAWhD,OAA6BgD;E3Gi38BjCnX;G2G728BG,WAGSuY,QAAYA;kBhIgDKl0C,6BgIhDlC;KAAA,UAES4wC,KhIgDI1oC;GgI7CF,UAAS4qC;EAAS,SAAWA;;WlHrNzBrE;EkH0NA0F;;;0DAjOA58B,kBAmOXxE;;;WAIE+/B;c5Hs4CH7wC,QAA8B,+B4Ht4CT6wC;OACtBA,WACF,EAMJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EAEwB,4BAAtBsB;;EACI9B;GAAO,QAAS8B,OAA2B9B,QAG/CjW;8BAKF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAgBA,cACEA,8BAUF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAkBA,kBACYgY,6BAAVC;MACA;sBhIpCoCt0C,8BgIoCpC,OAAsByX,KhIlCPvP,KgIkCiB,CAClC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,kBACYmsC,iCAAVE;MACA;sBhIzCoCv0C,8BgIyCpC,OAAsByX,KhIvCPvP,KgIuCiB,CAClC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUA;EAvS4BosC,IAwSb;;;EAECX;GACF,WACI,QACd;oBhIuC6Cp9B,KAAAA,MAAoBO,qBAkBpDE,KgIzDb,UACiBw9B,KhIwDJx9B;;EW/J8BvL,MAA7CA;MAAAA;YqHwGE,GACmB,ArH7GCA,AAAAA,iBUk4Of2rB,oC2GnxOC;;SADJqd;SAEIA,YAGV,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA/0C;E3GggSE,KAA6B+4B;E2G//RjB;EACEkb;GACF,QACFvkB,UAAcqlB,UAGxB;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAeAz1C;EACgB;mCAKd;MArV0Bs1C,KAqVRI,wDhID6Bn+B,KAAAA,MAAoBO,qBAkBpDE,KgIjBf,UACiBw9B,KhIgBFx9B;;EW/J8BvL,MAA7CA;MAAAA;cqHgJA,AAEA,MAtV0B8oC,KAsVRI,wDhIL6Bp+B,KAAAA,MAAoBO,qBAkBpDE,KgIbf,UACiBu4B,AhIYFv4B;EW/J8BvL,MAA7CA;MAAAA;cqHoJA,AACA,MrH1IyBA,MqH2I3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOAmpC;UACqB;E3GguOZxd,oC2G9tOA;S3G0s8BPuE;yB2Grk9BiBpkB,WA2XjB;SAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA;GACU,eAAgB,MACxB07B;UAAe5+B,QACf;MzF8wEwB4C,AyF9wEL5C,azF8wEK4C,8BvC/2E2BV,KAAAA,MAAoBO,6BgIiGvE,UhI9De5O;;4CgI+DkBuQ,SACxB,CAACA;ElHzX4BpK,AkH2XDoK;;GAC/B5Q,mBAAuC,CAAA,8BACrCgtC,WAAkBA,KAAW;EAC1BhtC,SAA8B,KAAZA,WACzBgtC,AAAAA;kBlH3YapG,SkH2YgBh2B,UAEjC,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOAtS,oBACc,6BACZ2uC;mBAGA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA5XAzC,YAEE96B,K3Gyh9BOokB,sB2Gvh9BPoZ;WACF,A,C;A,K,C,I,C;A,M,C,C,G,C,K,C,E,CALA1C,iB5HukDOpwC,QAA8B;;;S4HlkDrC,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA0DuC,WAAG,SAAI,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAkJzB,iBAaZ,AAAC+yC,iBAA+B,CAACntC,cAXpCusC,AAAAA,mBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAkBmB;;GAqPcxD,iBAnPjBppC;EACFA;GACA,MAAY,KACpBytC,WAkPgCptC,UAjP5BL,QAAAA,UAAsB,UAGhC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAuCI,YAAI,MAAG,A3Ggw8BJm0B,AAAAA,A2Ghw8BKlkB,+CAAoC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA0ChDy9B,YAAW,MAAGz9B,gBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAuDd,cACjB/Y,WAAIy2C,KlH5YgC9mC,YkH6YtC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CAwL8B,iBACpB,4BACZ+mC;uBAGA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,U,C;A,M,C,CAJ6B,cACzB12C,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,c,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,CtG1iBAI,YAA2B,SAAQ,A,C;A,E,C,CAyCnC,eLo3NyBo8B,KAA4B,AKn3N/C,gCACmB,OACrBma,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAQA;ELy98BS1Z,AAAAA,AK798BMU;kBAC6BiZ,aAK1CC;KsGwV+C3C,atGtV/C4C;UAEAC;UAEAC;UAEAC;UAGAC;KAAkB,MAElBC;UAAkBN,KAElBK;KAAkB,OAGpB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKA,eAjF6BL,WAmFzBF,UAEFS;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YACuBC,WACvB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA,iBACkB,SACdF,UAAkBG,QAClBC;cAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA;;EAwBIC;GApBW,WLk68BNva,AAAAA,AKj68BD4Z,KAAAA,wCACFY;cAEOC;;;2CAKc;EL658BlBza,AAAAA,AK358BIua;WACO,MAClBG,AAAAA;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAWA9d;WACwB;;6CuGvIkBia;EvG2UtCD,OAA4C+D,KA7L9CC;YAiDAC;YA7CA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeA/c;WACwB,MAEN;;EAELgd,UAIX3F;eAGAt9B;oBAAyBkjC,WACzBljC;;;6CuG/KwCg/B,OvGsLxCh/B;cAqJE++B,OAA4C+D,MA5I9CE;YALA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAWA,yBAEE;MAAc,iBAAd,UACEG,eADF,U1BmBezuC,I0BlBbyuC;MAAEx8B,WACJ,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;GACW,CAAA,gBAAmB,CAAA,eAC1By8B,eAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBA,YACErB,AAAAA,KAAAA,wBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,eACMA,KAAAA,YAAiC,MACrClZ,AAAAA;iBAAmBua,aACrB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMA;EAGiBC;WACO;YAKDrvC,oBAAqC;E6DnUZ8N;E7DuUzBsN,AAAAA,KAAc/X;EA6BjCtE,SAzBEuwC;GAGA,sBAEFl0B,KAAc/X,WAElB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAIAwP,oBACoBk7B,KAAAA;WACK,MAEvB;MAAOwB,UACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAWA/3C,yBACqB;wBAGjB;yFAEA,aAEF;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;EAKoB4jB,AAAAA,A6DtX4BtN;E7DuXtB0hC;GAEJ,QLsu8BpBrb,AAAAA,AKru8BEU,4BZ7UoChuB;6BYoVpCguB,AAAAA,iBZpVoChuB,SYsVxC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAkBA4oC;GA3U6B1B,WA8UJF;EAERwB;WAGb,MAAOrE,MAAAA;KAoBiBA,KAAAA;EAfI3nC;;GAoN1BqsC,WACFA,uDACQC;EAWC;GACP3iB,cACFA,OAAa3Z,AAAAA,A6DroB+BvF;EAAAA;EzE6CRjH;EoHdtB;;;axGyYd+oC;UAA2BvsC,QACpBwsC;KAI8B7E,KAAAA,aAJrC;UAEJ,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CAEArsC,YAAsC,MAAGqsC,MAAAA,SAA+B,A,C;A,E,C,CAIxE,cAAyB,MAAGA,MAAAA,WAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE/D;GACM8E,UAAkB,MACtBC;cAAmBjC;EACKkC;EAAeC;GyGxbjC,QACNC;0BAeA;MACAC;KAAS,UAAgBC,SzGuazBJ;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;GACMF,UAAkB;EAuIlBO;GAAkB,SACpBA,MACAA;UAEFC,UAxIAtF;KAAAA;EAEW1Q,WACX;KAAY,UACViW;EACOvkC,kBACT,AACA8jC,QACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA;GACMA,WACFC,cACOjC,yDACP;OAEFiC,cAAmBjC;EACfkC;GAAc,SAChBA,OACAA;oBAK0B,MAC5B9G;KAAa5O,wBAKf,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,uB,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAgBA;EAIkByT,KAAAA;EACAA,KAAAA;;GAEJ,GACV,IAAiByC,6ClByVoBrqC,uBAAMA,6BA2B7Cmf,KAAQnf,AAAAA,QkBpXN,UlBuXazF,IkBtXX+vC;YAAwBp9B,A6DpfkBvF,oB7Dqf5C,OAE6B,QAG7BuiC,KAAoBK,AAAAA,eAAeC,aAEvC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKA;EACkB5C,KAAAA;EACAA,KAAAA;EAGG,8BACnB;MAAA,QAAA,UAAA;;mDAGE6C;KAAAA,KAAuBtP,kBACPA,MAClB,AAEAsP,0BAgBF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEA;EACkB7C,KAAAA;WACK;EAGFyC;WACO;;;GAIpBK,WACFA,SAAoB/C,+DAItBgD;cZlgBoCjqC;;GYsgBhCgqC,WACFA,SAAoB/C;EqBnHU5tB,ArBsHtBlgB;EqBvbF0d,IAAVyB;KAAUzB,qBAKV0B;KAAW9B,cAKX+B;KAAU3B;MjC7F4B7W;EY6hBlCy8B;cACW,6BAAbA;OAEFA,YAjBF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoBAhsC,oBACYgsC,AAAAA;WACO,QACjBS;MACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,kBACMT;WAAoB,MACxB;MAAgBA,8B1BtRmCv0B,KAAAA,MAAoBO,6B0BsRvE,OAAmCy0B,A1BnPpBrjC,S0BmPgC,AAC/C4iC,AAAAA;UACAA;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA+CA;EACeyK,KAAAA;GACTzzC,SAAgB;;GAEhBy2C,WACFA,SAAmBjD,0CAErBkD;YAAuB12C,SAAa22C,aACtC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,mCAGE;MlBoLuC9qC,uBAAMA,6BA2B7Cmf,KAAQnf,AAAAA,kBkB/MR,UlBkNezF;EkB5Mf6mB,AAAAA;EL079BkB;EAAyB;aAAvC,OA8E4Bnc;;EAoD5B+T;GAAQ,SAAW,AATJyW,QAUjBvtB,KAAAA,YKjk+BF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAMA;;GAGM,AAAC3L,cAAe;;EAETq0C;KAETA,aAAuBjD,wCAAgCpxC;EAkBvDqxC,KAAAA;EAAgDrxC;EsG5DrCw0C;EtG4DXnD,MsG3DU;GtG6CN,cACKgD,SAAmBjD,gDAI5BqD;0DAFI,uBAMJJ,aAAuBjD,wCAAgCpxC,eAE3D,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CASA;;EACaq0C;KACFA,aAAuBjD;;4CflqBzBv2C,SAC4Bo/B;4BesqBjCya,gBZtqBenK;KYwqBf8J;KAGOA,aAAuBjD,mCAClC,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAja2C,oBACvCjZ;GLqu8BE,AAAC7uB,aACH,QAAY8e,qBAEP;SKvu8BP,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAD+B,WAAG,cAAG9kB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyKZ;4CAErB,QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAImB,wBAAO;MAAGqxC,iDuGtZWrG,SvGsZc,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA4CrB,WAAG,gBAAsB1J,gBAAU,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAIjD;;GACL,SAAWgQ,QACrB1B;;WAEmB;EAERY;GACF;SAETC;SAAwBc,SAAeA,SAqPzCH;UAjPwBG,SAAeA,mBAEzC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CA0BqC,YAqNnCH,6BAnNA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAyKK;;GACDL,WACFA;EsGtMkC1wC;EtG0MnButC;GACM;EAIvBrmB,AAAAA,cL079BFpc;gBA/EI,KAAc,KA8EcC,2BA9EW,uBK319BzC;6CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAjB4B;;EACZomC;;2CACW;;;GAGnBxkB;EAEO,OAAwBA;EAAxB;SAIXykB;uDADI,kBAEN,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAiCsC,YAAI,MAAG,CAACC,QAAEC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAsKrB;ELspNtB,KAA6B1gB,kDKppNlC;MAAA,QAAA,UACG1J,K1BhqBU7mB,K0BgqBX;uBAAA;yBACF,GAEIknB,YLk52BuCkJ,eKj52BzCvlB,AAAAA;0BAMJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CANsC,iBAChC;eAAA,QAAA,OACEgc,AAAAA,K1BtqBO7mB,4B0BuqBT,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kC,C;A,E,C,CA0BN,ewGh9BmBkxC,cxGi9BL,MACZC,AAAAA;;kCAEF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YACEC,SACAzpC,AAAAA;WAAiB0pC,WACnB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,C,CAEA,yBACE;MAAA,UACuDA,QADvD,UAAA;;6CACoD,KAAZvM,WACnBn9B,AAAAA,AAAAA;EACFypC;GAAX,sBwGz9BRE,KAAAA,UxG49BI;QAEJ,CACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,CA7BAC,kBAKEJ,QAAOtqB,AAAAA,WAAoB2qB,YAC7B,A,C,C;A,E,C,C;A,G,C,C,sC,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,CAyEAC,YACEC,WACF,A,C;A,M,C,C,E,CAFAD;;EAt9BqB;;;gBC5CI;;;;;;SDogCzB,A,C,C,C;A,G,C,C;A,G,C,C,kB,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,S,C;A,E,C,Q,C,C,C,M,C,I,C,E,C,M,C,C,C,C;A,E,C,CyG5hCA,kBACMhC;GAAO,SACTA,MACAA;cAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,eACa,AAAPA,eACFkC,UACAC;WAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,C,C;A,E,C,C;A,G,C,M,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,C3GUyB,kB4B9BlBt3B;GAAD,AAoDmBa,mDAnDvBb;U5B6B2B;OAA2B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgIZ,wBAAI;gDAAQvC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAIZ,wBAAI;gDAAQvH,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgC3B,YAAI,MAAG,CAACwgC,QAAEC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C,A,E,uB,mC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C4G5LzCjuC;EACgB6uC,YAAcxuC;GAChB,QAAS,MAAOyuC;MAMnBC,QAAYzyC,iBAAnB;kBAJF,OAUE;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAzCsB,iBAEZ,8BACR0jB;sBACAA;sBACAA;sBASAA;sBACAA;sBAEAA;uBAEA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAjByB,cAAO,SAAG5lB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACZ,cAAO,SAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACN;MAId4sB,OAAP;kBADF,OAGE;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACqB,cAAO,MAAK,CAAA,gBAAG,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEhC,cAAS,MzH4EJnzB,0ByH5EuC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAV,YAAI,cAAGm7C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CAEzC,cAAS,MzHsFJn7C,qByHtFiC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAV,YAAI,cAAGm7C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,uB,uD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCiBzChvC;8CACiBk5B,AAAAA,KAAAA;yEACKA,aAFa;SAG9B,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAELl5B;8CACiBk5B,AAAAA,KAAAA;yEACKA,aAFa;SAG9B,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAPyB,YAAI,MAAQ,MAALA,kBAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKjB,YAAI,uBAAUA,eAAK,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAmB7C+V;WACoB;2BCqFK;;;EClIbC,MAAVC;MACArjC;qBvIyRoChX,6BuIxRpCs6C;;EACOC;GFkDHC;GAAkC,eAAkB;;KAEtD,MAGF;0BAYF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC,YAAuC,sBACiC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAf/D;8CAEwCC;kBG+E9B,apIq/CZz4C,QAA8B;;MiIlkDL,qBAC1B,MAAO;MAEmB,qBAC1B,MAAO,sBAET;MAAO,qBACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAGwC;;OACsBy4C;kBGkE7C,apIq/CZz4C,QAA8B,mDiIxjDa,SACqB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAuBvEsjB;EACiBwlB;;+CAIJ3G,AAAAA,KAAAA,+BAAT2G;iBAOU4P,gBAA0BA,UAApC5P;UnHtDGj5B,oBmHyDP,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEahB,YAAU,MAAGi6B,SAAM,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAEnBl5B;IAET+oC,KAAOxrC,UAAUyrC,oBADnB;;gDAGEhP;8CAA+Cz8B,eAAUioB,uBAE7D,A,C,I,C,I,C,C,C,C,C,G,C,G,C,C,C,C,O,C,G,C,C;A,E,CAvCAyjB;EAGE1rC,OAAAA,AAAAA,AAAAA;WAAsBmW;IIrGD9N,gBJyGLojC,SGvCXE;OHwCHx1B;QAAUnW,oBAFZ;;gDAIEy8B;uDAAyDxU,uBAE7D,A,C;A,M,C,C,E,CAZAyjB,iCIlGuBrjC,kBDoSD;;SHtLtB,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAT2C,YACvCo0B,8CAA+Cz8B,qBAAUioB,UAC3D,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAc0B,kBACX,8BACX2jB;MAAK5W,YAEL;gBADqCyW,eGmCxB,wBHjCf,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,gB,C;A,E,CKvHJI,cACE3d,AAAAA,6BACF,A,C;A,K,C,Q,C,C,C,C,M,C,I,C,C,C;A,M,C,C,E,CAFA2d;;SAEA,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CADgB,wBbWdlQ;K3GuDKj5B,Y2GvDiCi5B,QaXL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C,A,E,4B,wC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CFuCrC7/B,oBC3CyBuM,kBDoSD,iBCpSCA;mBD8CvB;MAAO0zB,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA8BA;;;;iBAUE;mEAEkB,CAAA,KAAZ+P,mBAGJC;OAAYD;IACLA,SACT;;+CAKaE;;yDAEPL;;2CAA2BM;EAClBN;EAEFO,KADCP;yDAICA;EACFA,8DAEEA;GACG,AAAZA,oBACiB,AAAfA,gBAAwBM;EACjBN,eAEXM;aAGFA;;YAIF,sBxIgLsCr7C,8BwIhLtC,UxIkLiBkI;EyI5SMuP,kBDoSD,iBCpSCA;mBD8ChB0zB;;KA+EG,KAAA,oDAGV,EAEQoQ;gBACa,KAAA;KAEnBnd;KAEAvjB,AjD9H8CvF,oBzEiC7Bm5B,Y0H+FrB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAwFAvjC;4CACmB,MAAO,aACxB;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAvNQ,cAAO,MAAK,WAAEhL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,MAAK,CAAA,UAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,sBAAQA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,sBAAQA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACf;EAEAwN;KAAa,MAAOA;KAClB,KAAA,kDACR,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAIK,YAAI,SAAG5N,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACP,YAAI,MAAG,SAACA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACR,YAAI,MAAG,QAACA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA4Cbu7C,WAAgB,YACN,sDAAwD,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,G,CA6ElE3jC,iBACM8jC;GAAc,QAAS;EjDrJmBlmC,KiDsJtBmmC,QAAxBD;SACA;SACF,A,C;A,C,C,CAEAtwC;GACW,eACP,MAAOuwC;O7GpEkC9tC,A6GqEhC+tC;G7GrEgC/tC,Q6GsEzC,MAAOoxB,M7GpE+BpxB;Q6GqEvB,AAAN8tC,0B1H9HMhN;E0HiIIkN,KjG+UhB1jC,KzCjb4B1M,AyC2tBCiR,KAAAA,AiG1nBdo/B;;uFAKmBC;;KACnC,MAAO9c,MAAS6c,AAAAA,AAAAA;iDAEhB,gBAAkBA,iBAGlB5yB;GAAO,QACT,MAAO+V,MAAS/V;UAEV,KAAA,yCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA9d;GACW,eAIP;OACSwwC;G7GjGgC/tC,AAAAA,W6GkGzC;O1HzJe8gC;G0H6J0B,AAArCkN,KjGmTD1jC,KzCjb4B1M,AyC2tBCiR,KAAAA,AiG9lBdo/B,sCAEhB,MAAOH,YAGPzyB;GAAO,QACT,MAAOA,SAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAlqB;G7G/G6C6O,AAAAA,A6GgHvC+tC,iBACF;O1HxKejN;G0H4K0B,AAArCkN,KjGoSD1jC,KzCjb4B1M,AyC2tBCiR,KAAAA,AiG/kBdo/B,sCAEhB,WAGA5yB;GAAO,QACT,MAAOA,UAET;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,G,CAgBA3C,iBAAuBG,OAAH;qCAAqB,A,C;A,G,CAIzCtb,WAAwB,MAAG6/B,SAAM,A,C;A,E,C,CAIjC+Q,aAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1BC,iBACElH;;EACImH;GAAQ,QACVA,QAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAnH;EAEMxsB;GAAc,SAChBA,MACAA;eAGc0iB,OAGhB+Q;;EAEe/Q;GAAX,yBACFvkB;G1FnDE,AA/EoBnD,aA+ECM,OACzBC;S0FoDF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA5kB,YAAkB,MAAGoQ,AAAAA,eAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAQrC6sC,YACE5kB,OAAW4Z,SACb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAiL,YC5RuBzkC,KD6RfqxB,cAJNzR;OAAW4Z,SAMb,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,W,C;A,E,C,CASAkL,YAAwC,iCA3DT,yBA2DgC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE/DC,YAAwD,MC1SjC3kC,AD0S0C4f,iBAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEzEglB;EC5SuB5kC,KD6SA6kC;8BAhEQ,wBAkE7Bj0C;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAk0C;ECnTuB9kC,KDoTA+kC;ECpTA/kC,KDqTL+kC;gCAxEa,wBA0E7Bn0C;QACAo0C;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC;EC5TuBjlC,KD6TA+kC;EACTA;;OAEUntB,UAAhBmtB;;EAAAA,yEAnFuB,wBAqF7Bn0C;;GACS,SAASw2B,UzIrKXv/B;oByIsKP,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAq9C,YAAwB,iCA1FO,yBA0FkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEjDC;EACgBtB,cAAAA,SAAcjsB;8BA7FC,wBzI/EtB/vB;mByI+KP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAu9C;EChVuBplC,KDiVL4f;ECjVK5f,KDkVH4f;gCArGW,wBAuG7B/d;QACA9R;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAs1C,YAA8B,iCA5GC,yBA4G2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1DC;EC3VuBtlC,KD4VJ2mB;EC5VI3mB,KD6VH2mB;gCAhHW,wBAkH7B3P;QACAD;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAwuB;ECpWuBvlC,KDqWJ2mB;8BAxHY,wBA0H7B2c;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAmB;EC3WuBzkC,KD8WJ+kC;EC9WI/kC,KD+WH+kC;gCAlIW,wBAoI7BhuB;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAhDiC,wBAAO1uB;QAAH;SAAem9C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASlC,wBAAO5lB;QAAH;SAAe34B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CA+CrCo9C,YACE/Q,QAASkG,KAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAiM,cAAkB,MAAG9Y,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,CAOjDnlC,kBAAqBmQ,OAAH;MAAGA,SAAW,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAEhC0sC,kBACW1sC,OAAT27B;QAAS37B,QACX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA8tC,cAAkB,MAAG9Y,YAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,I,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,E,C,CAUzC0X,YACE/Q,QzItNOzrC,KyIsNE69C,QAAa,2CAExB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAD,cAAkB,MAAG9Y,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAHtC,cAAUlZ,OAAImM,AAAAA,cAAgBA,AAAAA,cAAvB;SAAoC0T,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,E,C,CAejDmS,cAAkB,MAAG9Y,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,CAQjDplC,kBAAoBoQ,OAAH;MAAGA,SAAW,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAE/B0sC;EAFoB1sC,OAGlB27B;QAASkG,MAHS7hC;EAKN6hC,KALM7hC;;+C1HtYDq/B,K0HsYCr/B,QAQhBiZ;QAAgB,AAAA,2CAOpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA60B,cAAkB,MAAG9Y,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CATa,eAC/C8T,8BAEF6D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHM,wBAAI;iDAAuC,KAAPjT,aAAUz6B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,G,CA8BxDrP,kBAAuBoQ,OAAH;MAAGA,UAAc,A,C;A,E,C,CAErC0sC;EAC2B1sC;EAAjBguC,WAAiBhuC;GACZ,KAJQA,iBAKAuhC,AAAAA,aAAnB5F;QAASr9B,8BAECijC,OAAV5F;QAAU4F,mBAA+BjjC,SAAEijC,UAE/C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAuM,cAAkB,MAAG9Y,YAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,G,CAY/CplC,kBAAuBoQ,OAAH;MAAGA,UAAc,A,C;A,E,C,CAErC0sC;EAFuB1sC;EAGbiuC,WAHajuC;GAIR,KAJQA,gBAIY,KAJZA,kBAKAqf,AAAAA;;EAAsBD,AAAAA,aAAzCuc;QAASr9B,iCACS,KANC0B,gBAMmB,KANnBA,eAOnB27B,QAASr9B,SAAE+gB,AAAAA,cAAaD,AAAAA;OACfC;GAAAA,eAAuBD,AAAAA,oBAChCuc;QAEa,KAXM37B,iBAWIqf;;;;KACrBpG,QAAgB,AAAA,KAACoG,2CAGnBsc;QAASr9B,SAAE+gB,QAAaD,AAAAA,iBAE5B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA0uB,cAAkB,MAAG9Y,YAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAN9B,YAAI,MAAG2X,mBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,G,CAe1C/8C,kBAAmBoQ,OAAH;MAAGA,UAAU,A,C;A,E,C,CAE7B0sC;EACsBzzC,AAAAA;YAElB0iC,YACA;SAGsB37B;W1H1ePq/B,K0H0eOr/B,UACxB27B;QAASnwB,AAAAA,AjD5gBqCtF;;4CiD+gB5C+S,QAAgB,AAAA,gCAMpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA60B,cAAkB,MAAG9Y,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CARyB,eACvD8T,8BACF6D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHkB,wBAAI;iDAAuC,KAAPjT,aAAUz6B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,E,C,CAgBpEytC;EACsBzzC,AAAAA;YAElB0iC,YACA;SAEQr6B,AAAAA;SACVq6B;QAASuS;4CAGPj1B,QAAgB,AAAA,gCAMpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA60B,cAAkB,MAAG9Y,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAR0B,eACvD8T,8BACF6D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHkB,wBAAI;iDAAiC,KAANjT,aAASxvB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,G,CAmB9Dta,kBAAqBoQ,OAAH;MAAGA,UAAY,A,C;A,E,C,CAEjC0sC;EACavzC,OAAAA;;EAAAA;EACSF,AAAAA;YAElB0iC,YACA;SAEE37B;GAAAA,wBAMF27B;QA4DGhM,8CAJItmB,AAAAA,AAAAA,QAAqBA,gB7HrmBvB1Z,SAC4Bo/B,6BGAlBsQ,K0H+iBSr/B,UACxB27B;QAASnwB,AAAAA,AjDjlBmCtF;;4CiDolB1C+S,QAAgB,AAAA,iCAStB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA60B,cAAkB,MAAG9Y,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA9Bb,YAAI,MAAGtkC,SAAEirC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAoB1B,eACMmN,8BAEF6D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHM,wBAAI;iDAAuC,KAAPjT,aAAUz6B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,E,C,CAkB9DytC;EAC0BrtB;EACTD,AAAAA;;qEAEuB,aAC9B,KAAA;4CAINnG,QAAgBroB,AAAAA;EAISu9C;EAgCF,cAhCzBxS;sBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAmS,cAAkB,MAAG9Y,YAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAPE,YAAI,MAAG2X,mBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAkDxEyB,YAAW,MAAG5iC,AAAAA,AAAAA,YAAcvM,qBAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAM3DrP,YAAkB,wBAAoByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CAD9Cg6C,+BAA2B,A,C,C,C,A,E,kC,8C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CGzb7B3+C;;GACQ,SAAM;oBACgB;GACf,CAAA,KAATgB,QAAYI,UAAU;GAC1B;YAAoBJ;6BAAAA;KAAF;EACZA;;GAAK,CAAA,OAAGI,MAAM,aACpB,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzB,YACa68C,UAEX;MAAOoC,M5IpEEp+C,sB4IqEX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKE4B,oBAC4B;6BAAA;EAAR;EACA,UAAQ,GAAuB,AAAA,CAAR,kBACzC;MAAY,GAAQ,MACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;EACoB,UAAQ,GAAuB,AAAA,CAAR;EAC7B,CAAA,EAAQ,WACpB;MAAkB,WAAQ,GAAuB,AAAA,CAAR,kBAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CA7OAy8C,gBAAwC,qBAAkB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAE1DC,gBAA0D,uBACnC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAavBV,cAAkB,MAAG9Y,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CAQjD8Y,cAAkB,MAAG9Y,YAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEzCplC,kBAAsBwI,MAAJ;mDAA4C,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE9D1I;;EAAuBs/B,sCAAH;UAA8B,KAARA,QAAW52B,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE1D/I,YAAiB,MAAG+I,MAAAA,QAAc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAQlC01C,cAAkB,MAAG9Y,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE5CplC,YAAkB,cAAMm+C,aAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEjCr+C;;SAAoB;iDAAsB++C,KAAYzf,SAAW+e,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEzE1+C,YAAiB,MAAGq/C,MAAUX,SAAQ,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CAStCD,cAAkB,MAAG9Y,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEjDplC,YAAkB,WAAKsa,kBAAMykC,SAAW,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAExCj/C;;SAAoB;iDAAiC,KAANs/B,SAAS9kB,UACpC,KAAb8kB,QAAgB2f,SAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEjCt/C;EA9BoB+I,KAAAA,AA8BsB8R;EAAcykC,KAAAA,QAAvC;MAmLiBre,MAAOhqB,KAAQA,cAnL2B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAQ5EwnC,cAAkB,MAAG9Y,YAAoC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEzDplC,YAAkB,cAAM2xC,aAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE/B7xC;;QAAoB;iDAA2C,KAARs/B,KAAWuS,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEvElyC,YAAiB,MAAGkyC,MAAAA,SAAc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CAQlCuM,cAAkB,MAAG9Y,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE5CplC,YAAkB,MAAGwI,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE1B1I;;SAAoB;iDAA8B,KAARs/B,QAAW52B,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE1D/I,YAAiB,MAAG+I,MAAAA,QAAc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CASlC01C,cAAkB,MAAG9Y,YAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE/CplC,YAAkB,WAAKyG,iBAAUkrC,SAAM,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEvC7xC;;SAAoB;iDAAoC,KAAXs/B,SAAc34B,UAC5C,KAAR24B,QAAWuS,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEvBlyC;EAA0CgH,KAAAA;EAAmBkrC,KAAAA,QAA5C;MAuIiBjR,MAAOhqB,KAAQA,cAvI2B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CAU5EwnC,cAAkB,MAAG9Y,YAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEhDplC,YAAkB,cAAMyvB,iBAAMhpB,iBAAU+oB,aAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE/C1vB;;SAAoB;iDAAqC,KAAXs/B,SAAc34B,UAC9C,KAAP24B,SAAU3P,UAAgB,KAAR2P,SAAW5P,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEzC/vB;EAA0CgH,KAAAA;EAAmBgpB,KAAAA;EACzDD,KAAAA,QADa;MAyHbkR,MAAOhqB,KAAQA,KAAQA,iBAxHR,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CASnBwnC,cAAkB,MAAG9Y,YAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE9CplC,YAAkB,cAAMyvB,oBAASD,aAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAExC1vB;;SAAoB;iDAA+B,KAAPs/B,SAAU3P,UACvC,KAAR2P,SAAW5P,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEvB/vB;EAA0CgwB;EAAAA;EAAeD,KAAAA,QAAxC;MAqGiBkR,MAAOhqB,KAAQA,cArGuB,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CASxEwnC,cAAkB,MAAG9Y,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEvCplC,YAAkB,WAAKqJ,iBAAUqI,aAAU,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE3C5R;;QAAoB;iDAEF,KAAXs/B,QAAc/1B,UACH,KAAX+1B,QAAc1tB,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE7BjS;EAC0B4J,KAAAA;EAAmBqI,KAAAA,QAD5B;MAmFiBgvB,MAAOhqB,KAAQA,cAlFc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CAS/DwnC,cAAkB,MAAG9Y,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAExCplC,YAAkB,WAAKqJ,iBAAUR,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEtC/I;;SAAoB;iDAEF,KAAXs/B,QAAc/1B,UACP,KAAP+1B,SAAUv2B,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAErBpJ;EAA0C4J,KAAAA;EAAmBR,KAAAA,QAA5C;MAgEiB63B,MAAOhqB,KAAQA,cAhE0B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CAmB3EwnC,cAAkB,MAAG9Y,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAExCplC,YAAkB,WAAKqJ,iBAAUoQ,iBAAQlQ,aAAW,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEpDzJ;;SAAoB;iDAEF,KAAXs/B,QAAc/1B,UACL,KAAT+1B,SAAY3lB,UACZolC,KAAYzf,QAAa71B,SAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE1C9J;EAA0C4J,KAAAA;EAAmBoQ,KAAAA;EACzDqlC,KAAUv1C,QADG;MAsCbm3B,MAAOhqB,KAAQA,KAAQA,iBArCF,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAerB,cAAU,MAAGgoC,QAA2BM,SAAa,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,8B,0C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,e,C;A,E,C,CJ/OzD1D;KACY,SAAuB,CAAA,KAAZ2D,KvIqRN/1C,AuInSG8O,kBAeJ,SAAwB,CAAA,KAAbinC,KvIoRV/1C,AuInSG8O;;UAgBV,KAAA,4BvImRO9O,AuInSG8O,aAkBlBA,AAAAA;YACF,A,C,Q,C,C,C,M,C,I,C,E,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAknC,cvI8QiBh2C,AuInSG8O,kBAsBSmnC,AAAAA,gBAAP;kBACTC,SACX;oBAA+BC,aACjC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKAH,2BAEE;MAyIOC,UvI0HQj2C,AuInSG8O,WAgCJ,YACI,KAAZinC,cACe,KAAbA,KvIiQO/1C,AuInSG8O,oBAmCDsnC,SAEJH;;6BACe,KAAbF,KvI6PA/1C,AuInSG8O,oBAuCIunC,SACTJ;;;QAIY,KAAZF,KvIuPE/1C,AuInSG8O,gBA6CdsjC;EAEOkE,UADKJ,mBAES,KAAZH,KvImPE/1C,AuInSG8O,iBAgDwC,KAAbinC,KvImP9B/1C,AuInSG8O;gDAoKV,uDAGRsjC;;EACYC,SACL4D;;wBAvHkB,KAAZF,KvIiPE/1C,AuInSG8O,gBAmDS,KAAlBinC,AvIgPM/1C,AuInSG8O,sBAoDPynC;UAIX,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAP;+CAEoC1vB,OAAzB2vB,AAAAA;gBAAP;yEAC4B3vB;;;;QAEI/V,KADZ+V;EAC0BA,OAAvC2vB,AAAAA;gBAAP;iCAEM,KAAA,uCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAD;EvI2NiBh2C,AuInSG8O,UA0ElBsjC;;EACY8D,SACZ;YvIuNel2C,AuInSG8O;GA4EJ,WACM,KAAZinC,YACW,KAAZA,KvIqNQ/1C,AuInSG8O,gBA+EC,KAAZinC,KvIoNQ/1C,AuInSG8O,iBAgFO,KAAlBinC,AvImNQ/1C,AuInSG8O,iBAgFSkkC;;;EACjBmD,UAAwBJ,AvIkNnB/1C,AuInSG8O,kBAkFlB,EACgCkkC,OAAzBiD,AAAAA;gBAAP;uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAD;GACkB,KAAZD,KvI4MW/1C,AuInSG8O,kBAwFJinC,KvI2MC/1C,AuInSG8O;;GAyFN,YAAgB,YACxBsjC;GACgB,KAAZ2D,KvIwMO/1C,AuInSG8O,kB5HmFXjY,gB4HiK6Ck/C,KvI+CrC/1C,AuInSG8O,uBAoPNmnC,AAAAA;;;yBACZ7D;SAzJM;gBA8JM6D;GA7Je,KAAZF,KvIsMA/1C,AuInSG8O,kB5H+FXjY,gB4H2JgDk/C,KvIyCxC/1C,AuInSG8O,kBA0PNmnC;;;yBACZ7D;SA7JM;gBAEW+D,QAAiBK,aACrBP;UAAP;+BAEa,YACf7D;EACW+D,QAAiBK,aACrBP,AAAAA;gBAAP;sBAGJ,MAAOO,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAR;OACaD,KvIsLI/1C,AuInSG8O,uBAgHAinC,KvImLH/1C,AuInSG8O;;GAiHF,eACVsjC,SAEO6D,AAAAA;gBAAP;gCACiB,YACjB;;OAIF,MAAOQ;OAEP,MAAOC;OAEP,MAAOC;OAEP,MAAOC;UAEU,KAAbb,KvIiKO/1C,AuInSG8O,kBAuOlBsjC;EACWC,SACXD;cACO6D,AAAAA;gBAvGD;2BACsB,KAAbF,KvI+JA/1C,AuInSG8O,iBAqIZ,MAAO+nC,UAET;;QAEA,QAEN,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAC;;EAiBSb,OAfP;GACE7D;GACgB,KAAZ2D,KvIkJS/1C,AuInSG8O,gBAiJiC,KAAbinC,KvIkJvB/1C,AuInSG8O;EA8OcinC,KvIqDjB/1C,AuInSG8O,WA8ONmnC;;;yBACZ7D;SAnFAA;cARE6C;kBASU5C;EvIsIGryC,AuInSG8O,iBAqJH,SAAwB,KAAbinC,aAAoB,AAC9C3D;cACA;mBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAoBA4D;GACmB,KAAbD,KvIsHW/1C,AuInSG8O,qBA8KhBsjC,SACO6D,AAAAA;gBAAP;oCAEe,KAAbF,KvIkHW/1C,AuInSG8O,sBAkLhBsjC,SACO6D,AAAAA;gBAAP;oCAEe,KAAbF,KvI8GW/1C,AuInSG8O,qBAsLhBsjC,SACO6D,AAAAA;gBAAP;sCAYc,CAAA,KAAZF,KvIgGW/1C,AuInSG8O,oBAoMV,iCvI+FO9O,AuInSG8O;EAsMNinC,KvI6FG/1C,AuInSG8O,WAuMlBsjC;SACO6D,AAAAA;;;EAdIG;WAET;KAEA,0BAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAWA5+C;EvIwFiBwI,AuInSG8O;GA4MP,SAAuB,KAAZinC,YAA6C,KAAbA,KvIuFvC/1C,AuInSG8O,sBA8MhB;GACEsjC;GACgB,KAAZ2D,KvImFO/1C,AuInSG8O,gBAgNmC,KAAbinC,KvImFzB/1C,AuInSG8O,sBAoNd6nB;OADW0b;EvIgFAryC,AuInSG8O,iBAqND,SAAwB,KAAbinC,aAAoB,AAC9C3D;cACA;SAEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA4D;EvIuEiBh2C,AuInSG8O;GA6NP,SAAuB,KAAZinC,YAA6C,KAAbA,KvIsEvC/1C,AuInSG8O,kBA8NhBsjC;EACWC,SACXD;cACA;SAEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CASA2E;EACkChB,KvIqDjB/1C,AuInSG8O,WA8ONmnC,AAAAA;;0BACZ7D;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA2E;E5HhKSlgD,gB4HiK6Ck/C,KvI+CrC/1C,AuInSG8O,uBAoPNmnC,AAAAA;;0BACZ7D;SACA;SACF,A,C,Q,C,C,C,M,C,I,C,E,C,E,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEA2E;E5H1JSlgD,gB4H2JgDk/C,KvIyCxC/1C,AuInSG8O,kBA0PNmnC,AAAAA;;0BACZ7D;SACA;SACF,A,C,Q,C,C,C,M,C,I,C,E,C,E,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C,C,A,E,mC,+C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CK5PF/6C,YAAoD,gCACjB,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,C;A,G,C,kB,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,C,C,CAMjCkG;;QAAc;iDAAgC,KAAR24B,KAAWe,UAAiB,KAARf,IAAW52B,QAAK,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,I,C,C;A,G,C,CAC1E/I,YAAiB,MAAG+I,MAAAA,QAAc,A,C,I,C,I,C,C,C,C,C,G,C,U,C,C;A,E,C,CAClCxI,YAAkB,cAAMmgC,kBAAQ33B,YAAO,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,K,C,I,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,I,C,C,C,C,C;A,M,C,C,E,C,CAEvC03C,+CAAoC,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,E,C,C,C,C,kB,C,C,C,C;A,e,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,E,CAapCn/C,2BAC6BwW,KAAAA;wCADU;SACS,A,C;A,E,CAGhD9X,YAAe,MAAG8X,MAAAA,SAAgB,A,C;A,G,CAClCzX,YAAiB,MAAGyX,MAAAA,SAAiB,A,C;A,G,CAIrC2oC;EALkB3oC;;WAKqC,KALrCA,WAK0CA;wCAAnC;SAAkD,A,C;A,E,C,CAE3E2oC,+BAC+B3oC,KAAAA;wCADM;SACqB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,CAW1D2oC,WAA4B,MAAGh3C,SAAQ,A,C;A,C,C,CAEvCpJ;EACMkY;GAAAA,SAC0BH,OAAAA;QAAM,GAAlC3O;wBAAsC8O,eACtC;SAEF9O,YACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C,C,A,E,mC,+C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCxDFi3C;GtGyqF6BloC,AAAAA,AsGxqFvBmoC,iBACF,MtGqqFsBnoC,AAAAA,AsGrqFfmoC;EAqBQA;GACE,SACW,CAAA,KAAzB/iC,iBApBUs/B,KAAgByD;GAClB,QACT,SAGJ,MAAA,KAAyBA,SAAzB,UACezD,K7IuREzzC;G6ItRJ,QACT,SAEJ,AACA,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,A,E,iC,6C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CPgGAzJ,+BAEa;SACA;SACA;SACA;SACA;QACA,UAEb,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,c,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CASEO,YAAkB,UAAMqgD,cAAQ73C,YAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,C,CAgBxC9H;EAHUsX,OAARiL;QAAQjL,MpEmcS2c,SoE9bjB;MA0HA0mB,UA1HMp4B,QAAM,mCALZA,QAAQjL,MpEmcS2c;uBoE1bb2rB;kCAJEr9B;KAnDuC,OAAgB,UACzD,OAAgB,uBAA4C;;KAwD5Ds9B;QAhDsB,OAAgB,MAkDtCC;kBAbIxoC,MpEmcS2c,SoEncjB1R;;;GArC0B,OAAgB,MAqHxCw9B;KAEApF,2CAlFFp4B,QAAQjL,MpEmcS2c,SoE3WjB0mB;0CAxFAp4B,QAAQjL,MpEmcS2c,SoEtWjB0mB;kCAhIyBqF,mBA8ITz9B;EA3GRjL,MpEmcS2c,SoEncjB1R;;GAnCyBy9B,mBAmJwBz9B;E3HzD1CljB;G2H0DD4gD,iBAjHN19B,QAAQjL,MpEmcS2c;WA5eK;EvDgGf50B,gBuDhGe;EvDgGfA,Q2HmEPs7C,oBAA0CuF,sBA3JlBC,aAuDD59B,YpE/DD,OoEuKcA;E3HvE7BljB,O2HwEPs7C;oBAA4CuF,aA/H5C39B;QAAQjL,MpEmcS2c,eoEncjB1R,QAAQjL,MpEmcS2c,UoExajB,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA2rB;EACkBr9B;EAhCRjL;EAAAA,MpEmcS2c,SoEncjB1R;SAkCA;MAOI69B,QAPS,wCACc,KAAA;aAnCnB9oC,MpEmcS2c,SoEncjB1R;;gBAsC6B,KAAA;EpE/EP,OoEgFA8O;E3HgBfhyB,OA6CP0M;KAA6CA,cuD7IvB;EvDgGf1M,OA6CP0M;KAA6CA,S2HpGrCuL,MpEmcS2c,SoEncjB1R;UA4CA,AACAo4B,AAAAA,wB3HkEyB5uC,QAHzBA;O2H5GAwW;QAAQjL,MpEmcS2c,UoEnZnB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA4rB;EAlDUvoC;EAoDN8oC,OADF;YAAO79B;GAAM,sCAANA;KA9FwB,OAAgB,aAC3C,OAAgB,SAAc,OAAgB,uBAChB;;;;EpEAZ;EvDgGfljB,OA6CP0M;KAA6CA,M2HpG7CwW;QAAQjL,MpEmcS2c,UoE7YjB,E3HyDyBloB;E2HtDvB4uC;GADE0F,gBACF1F;KAEAA,uB3HiDF5uC;Q2H9CF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA+zC;EAhEUxoC;EAkEN8oC,OADF;YAAO79B;GAAM,sCAANA;EAtGmB,OAAgB;;EpEJpB;EvDgGfljB,OA6CP0M;KAA6CA,M2HpG7CwW;QAAQjL,MpEmcS2c,UoE/XjB,aApEQ3c,MpEmcS2c,SoEncjB1R;;;GArC0B,OAAgB,MAqHxCw9B;KAEApF,AAAAA,sCAVAA,AAAAA,wB3HuCuB5uC,QAHzBA;S2HjCF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAqBAg0C;EACEK,O3HOAhsB;KAAM;E2HxGE9c,OAkGR;YAAOiL;GAAM,sCAANA;EAvImB,OAAgB;;EpEJpB;EvDgGfljB,OA6CP0M;KAA6CA,M2HpG7CwW;QAAQjL,MpEmcS2c,UoE9VjB,AACA0mB,AAAAA,wB3HSyB5uC,QAHzBA;Q2HJF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CA+BAzM,YAAkB,yBAAqByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAD/Cu8C,+BAA4B,A,C,C,C,A,E,+B,2C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,E,C,CGhS5B3wB,YAAoB,MAAG5X,cAAc,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C,C;A,G,C,C;A,G,C,K,C;A,E,C,CAkBrC0kC,YAAwC,MAAGF,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE7DG,YApBuB3kC,AAqBf4f,eACN4kB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAI,YAzBuB5kC,KA0Bf+kC,aACNP;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAM,YA9BuB9kC,KA+Bf+kC,aA/Be/kC;KAgCf+kC,aACNP;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAS,iBApCuBjlC;KAqCf+kC;EACFA;GAAY,QACd,sBzImQkCx8C,8ByInQlC,OAvCmByX,KzI4SNvP,UyInQb,AAEF+zC;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAU,YAAwB,MAAGV,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE7CW,iBACE;MAActB,2BzIyPsBt7C,8ByIzPpC,OAjDqByX,KzI4SNvP,UyIzPf,AACA+zC;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAY,YAvDuBplC,KAwDf4f,cAxDe5f;KAyDf4f,aACN4kB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAa,YAA8B,MAAGb,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEnDc,YA/DuBtlC,KAgEf2mB,cAhEe3mB;KAiEf2mB,cACN6d;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAe,YArEuBvlC,KAsEf2mB,aACN6d;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,YA1EuBzkC,KA2EfqxB,cA3EerxB;KA4EfqxB,cACNmT;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C,A,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CK3EwB9pC,YAA+B,MAAG63B,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAA8Cn4B,cAAwCm4B,KAASh2B,eAA2Bg2B,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAC1MiW;;EpH2FqB;;;gBC5CI;;;;;;SmH/CwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,C,wE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCFzBxhD,YAAa,MAAGyhD,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAiCruC,cAAsBquC,KAAUlsC,eAA4BksC,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAE7JlhD;G7CDiDkiC,W6CG7C;EAEO,KAN6Bgf;E7CCShf;K6CM7C,MAAO0E;KAEP,WAAUA,iBAT0Bsa,MAWxC,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAEAlhD;G7CZiDkiC,W6Cc7C;EAEO,KAjB6Bgf;E7CCShf;K6CiB7C,MAAO0E;KAEP,WAAUA,iBApB0Bsa,MAsBxC,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEAC;;ErHqEqB;;;gBC5CI;;;;;;;;SoHzBmB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCtBpBC,YAAkB,MAAGC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCxuC,cAA2BwuC,KAAYrsC,eAA8BqsC,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACvJvhD,YAAsB,MAAGwhD,MAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAA6CzuC,cAA+ByuC,KAAkBtsC,eAAoCssC,QAAyB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,c,C,G,C,C;A,E,C,CAI3N;;EAL6CD;WAQzC,MAEFE;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,YACEvsC,oBACF,A,C,Q,C,K,C,C,C,C,C,G,C,oB,C,C;A,E,C,CAEAwsC,cAHExsC,oBAKF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,qB,C,C;A,E,C,CAMYhV;EAzBiCqhD;YA0BnB,AAzBuBC,UA0B7C;EAEQC,KAAAA,QAAYE;WAEpB;GAEM,UACN,2CAGF;8CACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,W,C,G,C,C;A,E,C,CAEA,cACEF,AAAAA,KAzC2CF,YA0C7C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,cACEE,AAAAA,KAAAA,KA7C2CF,yBAiD7C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,iB,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,sB,C,E,C,CA9CAK;;EtHwFqB;;;gBC5CI;;;;;;;SqH5CoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,M,C,CA0CL,YA/BtC1sC,qBAiCE8xB;gBACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,4C,C,C,G,C,C,A,E,W,mC,A,A,C,C,C,C;A,G,C,E,C;A,E,C1BRF7lC;GAu4BU;EAAqB,AAARirB,mBAA+B,AAAVA;GAr4BtC,GACFzZ,AtGiMsB;EsG9LH/S;;OAo4BI6M,YACqBA;;;;;;;;;;;W3Fp4BvB;;;;;;gB2FwQU;EAiHlB;ExB3ZRm1B;;;;;;;;;;WnEkCgB;;;;mBAAA;;iD2FkBvB8M,OACA;SACF,A,C;A,E,C,CA22BF1uC;GACY;EAAqB,AAARosB,mBAA+B,AAAVA,6BAA5C;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQA;4CAEI;4CAGAy1B;iDAEAC,UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cACEliD,sBASF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,2BACE;MMh5B+Bg/B,SNg5Bb,EMh5BaA,gBAoBUA;;;MN21BV,AAARxS,mBAA+B,AAAVA,oBAoCxC1rB,QAAUyZ;iDAEV2nC;UAEAD,UAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,G,C,CA59BeE,WAA6B,MAAG5hC,SAAM,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,G,C,CAItC6hC,kBAAa7hC,OAAH;MAAGA,UAAS,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CAGtBtN,kBAAuBsN,OAAH;MAAGA,UAAc,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CAGrCjgB,YAAc,MAAGkG,SAAG,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CAIpBlG,WAAuB,MAAG+hD,SAAY,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,C;A,G,C,CAItC/hD;EAAmBoC;EAAqB8D,OAAxB;WARCA,iBAQ2B,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,C;A,G,C,CAG5ClG,WAAoB,eAAQqlB,gBAAM,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,C;A,G,CAS/CvlB,WAAkB,SAAQ,A,C;A,G,CAG1BA,WAAmB,SAAQ,A,C;A,G,C,CAEFE,YAAgB,MAAGgiD,YAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BnvC,cAAyBmvC,SAAUhtC,kBAA4BgtC,eAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzIhiD,WAAkB,MAAGiiD,YAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCpvC,YAA2BovC,SAAYjtC,kBAA8BitC,eAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,E,C,CAqChL7sC,eAhDmB8sC,QAkDf,MlFkFK,gBkF/EP;MAAOC,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAIA/sC,eACS,KA1EqBlP,YA6E1B,MlFsEK;GkFpIUg8C,SAgEHE,WACZ,MlFmEK,gBkFjEP;MAAOC,AAAAA,AAAAA,mBAAYh9B,mCAWrB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA;;EA00B2B9Y,KAr0BF7M;EACCA;;GAo0BC6M,cACqBA;EAl0B1CrG;GAAI,SAAe,CAAA,OAAGxG,cAI1BwG,QAAMxG,WAENqiD;SACA3Z;eACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA/BgC;EACF1oC;;GAu1BH6M,cACqBA;;GAv1B9B,CAAA,OAAGw1C,MAIb,MAAO,MAlG8B9hC,OAoGvCqiC;OACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,M,C;A,G,C,CAuCSR,YAAU,YAAO,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CACjBnvC,YAAoB,OAAO,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CAE3BpS,iBAAkCgiD,OAAH;MAAGA,UAAoB,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,C;A,G,C,CAEtDviD,YAAgB,WAxICkG,SAwIO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,C;A,G,C,CAEZlG,YAAmB,MAAGwiD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAA8C3vC,cAA4B2vC,QpGhF5H1vC,eoGgFwK0vC,WAAoB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC1KxiD,WAAwB,MAAGyiD,SAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAAmD5vC,YAAiC4vC,QpGjFhJ3vC,eoGiFsM2vC,WAAyB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,c,C,G,C,C;A,G,C,CAC7MnhD,WAAkB,MAAGohD,SAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAuC7vC,YAA2B6vC,QpGlFlH5vC,eoGkF4J4vC,WAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,E,C,CAatL1iD;EACY2iD;WAER;EjHzBwC3gD;;;qBAAAA;EAErBA,KAAAA;6BAAAA,OiHyBrB;MAAOkqB,WjHzBY,KiH0BrB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAlsB;EACY4iD;WAER;EjHhCkC5gD;;qBAAAA;EACfA,KAAAA;6BAAAA,OiHiCrB;MAAO+C,UjHjCY,KiHkCrB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKAgO,iBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAqC;UAEI,MlF/BK;EkFiCWmtC,AAAAA;GACN,QACV,MlFnCK,akFuCP;MAAOJ,AAAAA,iCAOT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/sC;GAEMrQ,uBACiB89C;EACDC,UAClB;MAAOC,AAAAA,mCAeCC,AAAAA;GACF,QACN,MAAOxU,QAGT;MAAOyU,AAAAA,iCAOT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA7tC,YACE,MAAO8tC,AAAAA,AAAAA,4CAoBT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA;KAEI,MAEFhB;;;EACUxiD,gBA3HuH8iD;QpGhF5H1vC,eoGgFwK0vC;EA4H9J9iD,qBA3HsI+iD;QpGjFhJ3vC,eoGiFsM2vC;EA4HlM/iD,eA3H8GgjD;QpGlFlH5vC,eoGkF4J4vC,UA4HjKS;QAAgBzjD,mBAClB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EACwB6iD;EACA,6BACtB;MAAA,QAAA,UAAA;EACkBa;EACFC;GACF,QACVC;OAEU,YACVA;UACA7wC,AtGlDoB;gCsGpOIvM,YAwR5B,AAEAo9C,kBAIAf;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAjJAT,WArH2GE,QAAUhtC,kBAA4BgtC,aAC9BC;QAAYjtC,kBAA8BitC,aAuH3Je,AAAAA;;MlHm/CK//C,8BAA8B,+BkHl/CnCq/C;QxB7IO5gB,SwB8IT,A,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAuCuB;2CAEf,MAGF;MAAO6gB,AAAAA,uBACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQmC;WAK7B;;WAGA,MAAOngD;KAEP,MAAOA,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQqB;;EACX;GACNosC,QACFwU,AAAAA,2BAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAH2B,WAAG,cAAGxU,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAQT;MAEZyM;ExBpOPvZ,OwBqOH;oBAFF;;ElH45CGz+B,oEAA8B;E0F/nD5By+B,OwBuOH;UAOJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAc,kBlHi5CTz+B,mEAA8B,+BkHh5CjC;MxB/OKy+B,SwBqPP,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgCwB,cACtBt/B,QACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,iH,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CAQW0/C,YAAU,MA9SsB7hC,SA8Sd,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CAClBtN,YAAoB,YAAO,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,CAExC3S,YAAgB,MAAGkG,SAAG,A,C;A,G,CACtBlG,WAAoB,eAAOkG,SAAI,A,C;A,G,C,CAENpG,WAAuB,MAAGyjD,SAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAA8C1wC,YAAgC0wC,QpGhP1IzwC,eoGgPkMywC,WAA0B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,e,C,G,C,C;A,G,C,CAC1MzjD,WAAsB,MAAG0jD,SAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAA6C3wC,YAA+B2wC,QpGjPtI1wC,eoGiP4L0wC,WAAyB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,c,C,G,C,C;A,G,C,CACnM1jD,WAAiB,MAAG2jD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAwC5wC,YAA0B4wC,QpGlPlH3wC,eoGkP8J2wC,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAChK3jD,WAAc,MAAG4jD,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqC7wC,YAAuB6wC,QpGnPtG5wC,eoGmP4I4wC,WAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAOvJ1jD,YAA+B,WApTdkG,oBAoTiC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,c,C,G,C,C;A,E,C,CAElDlG,YAAmC,gBAtTlBkG,qBAsT4C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,kB,C,G,C,C;A,E,C,CAK1EuP,WAEE,MAAOutC,AAAAA,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;;SAIE;MAAA,KADkBre,gBAClB,OAGEgf,OAFYC,KADd,eAIA,AACAC;SACAC;;EACoBnf;GACF,QAChBof,QAAkBC,aAEtB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBACEhB,OAAAA,AAAAA;0BAMF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;;EACoBre;EACAA,gBAClB;MAAA,QAAA,UAAA,MAEEngC,AADYo/C;yBAEd,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAxuC,YACE,MAAOtD,AAAAA,wBAAqBmyC,YAC9B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YAIEC,KAFmBC,mCAKrB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CASApxC;WAEI;EAEUrT;EACFsjD;EAAAA;GACF,QACN;EAGI;GACFxU,QACFwU,UAEF;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA5tC,kBACY4tC,AAAAA;GACF,QACN,MAAOxU,QAGT;MAAO6T,AAAAA,AAxZoCpiC,gBAUf/Z,0CAqZ9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,C,CAEyB4O,WAAuB,MAAGsvC,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCvxC,YAAgCuxC,QpG7V5HtxC,eoG6VwKsxC,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC1KC,WAA2B,MAAGC,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAA0CzxC,YAAoCyxC,QpG9VzIxxC,eoG8VuLwxC,WAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAE1LtkD,YAAgB,MAAGgiD,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BnvC,cAAyBmvC,QpGhWpGlvC,eoGgW0IkvC,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzIhiD,WAAkB,MAAGiiD,SAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCpvC,YAA2BovC,QpGjW5GnvC,eoGiWsJmvC,WAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACvJjiD,WAAoB,MAAGukD,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAmC1xC,YAA6B0xC,QpGlWpHzxC,eoGkWkKyxC,WAAqB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACrKp9C,WAAc,MAAGq9C,SAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAA6B3xC,YAAuB2xC,QpGnW/F1xC,eoGmWuI0xC,WAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,G,C,CAKvI/kD,WAAoB,MAAGglD,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAAuC5xC,YAA6B4xC,QpGxW3H3xC,eoGwW+K2xC,WAAwB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CACrLhlD,WAAoB,MAAGilD,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAAuC7xC,YAA6B6xC,QpGzW3H5xC,eoGyW+K4xC,WAAwB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CACrLjlD,WAAwB,MAAGklD,SAAkB,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,G,C,G,C,C;A,G,C,CAA2C9xC,YAAiC8xC,QpG1W3I7xC,eoG0WuM6xC,WAA4B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,iB,C,G,C,C;A,G,C,CACjNllD,WAAwB,MAAGmlD,SAAkB,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,G,C,G,C,C;A,G,C,CAA2C/xC,YAAiC+xC,QpG3W3I9xC,eoG2WuM8xC,WAA4B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,iB,C,G,C,C;A,G,C,CAEjN5kD,YAAuB,MAAG6kD,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,I,C,C,M,C,C,C,C,C;A,G,C,CAAsChyC,cAAgCgyC,QpG7WhI/xC,eoG6WoL+xC,WAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,E,C,CAEnN;;EACanlD,iBAd8G6kD;QpGlWpHzxC,eoGkWkKyxC;EAehK7kD,aAjBkGsiD;QpGhWpGlvC,eoGgW0IkvC;EAkBtItiD,aAjBwGuiD;QpGjW5GnvC,eoGiWsJmvC;KAmBzJ,MAEFC;UACA4C;;GACIplD,wBACAA,uBACAA,qBACF+S,AtGjNsB,oDsGkNtB;SAEQ/S,gBAjCuH0kD;QpG7V5HtxC,eoG6VwKsxC;GAkC5J,AAAb1kD,wBACMA,cA7B0F8kD;QpGnW/F1xC,eoGmWuI0xC,cA+BxH,AAAhB9kD,2BACSA,iBArCiI4kD;QpG9VzIxxC,eoG8VuLwxC,gBAA9CA,QpG9VzIxxC,eoG8VuLwxC;ElH4uCvLrhD,QAA8B,+BkHjsCnCvD;KAAAA;EAGAqlD;SAAAA;cAAkBC,4BAClBD;gBAAoBC,0BACpBD;aACAA;aAE0D,KADL,KADH,KAAhCC,6BACAA,iCACAA,sCACAA,yBAClBD;aAAiBC;EAEHtlD,KAAAA,wBA7CkH+kD;QpGxW3H3xC,eoGwW+K2xC;EA8CtK/kD,KAAAA,wBA7CkHglD;QpGzW3H5xC,eoGyW+K4xC;EA8ClKhlD,KAAAA,4BA7C8HilD;QpG1W3I7xC,eoG0WuM6xC;EA8C1LjlD,KAAAA,4BA7C8HklD;QpG3W3I9xC,eoG2WuM8xC;EAgD5LllD,sBA3K+H6jD;QpGhP1IzwC,eoGgPkMywC;EA4KxL7jD,qBA3K4H8jD;QpGjPtI1wC,eoGiP4L0wC;EA4KvL9jD;EpG7ZLoT,eoGkP8J2wC,QA2KzI,QA3K6FA;;EA4KhH,AA9K0CF,cA8KxB,AA7KuBC,cA6KN,MA3KiEE;QpGnPtG5wC,eoGmP4I4wC,WA4KnJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAWAuB,cAEEC,SACAC;;WAEE;GAEmB,KAAjBA,WAEF,MAGF;MAAOC,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAH;EAEcE;EAAUD;mCAAAA;QAAe;EAAzBC;;EAEDxB;EAECwB;EAAUD;mCAAAA;QAAe;EAAzBC;;;;EAIGA;EAAUD;mCAAAA;QAAe;EAAzBC;6BAAAA;GAEf;KAAkB,WACJC,UACZr1B;;EACAA;EAAyB4hB;6BAAAA,OAAzB5hB;KAAsB,IACxB,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,I,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CApLwB;6CAyakJs1B,KpGjsBnKvyC,YoGisB2OuyC,OAwBhPC;MACAC;MAhB0LC;KpG1sBrL1yC,YoG0sBiQ0yC,QAC5EC;KpG3sBrL3yC,YoG2sBiQ2yC,QAkBtQC;KAAAA,KACAC;KAAAA,KACAC;KAAAA,OAlcE,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAoBmB,yBASrBrE,AADgBsE;mBACIA,eAPpB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAiC0C;;EAC5B;GACNrX,QACFwU,AAAAA,2BAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAH2B,WAAG,cAAGxU,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAkDb,yBAClBwW;WAASc,cAAiBA,eAC5B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,+B,C;A,G,CAwEJhmD,WACE,MAAqB,MAAbiiD,kBACa,KAAbA,qBACa,KAAbA,mBACV,A,C;A,G,CACAjiD,WAAmB,MAAGimD,YAAQ,A,C;A,E,C,CAI9B/lD,YAAkB,M3F1YGoO,M2F0YAO,SAAe,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAOpC,yBACEuzC;QAAU;EAKVvzC,OAAAA;OACAA;;E3F7cwCA;EAAAA,kB2F9DiEqzC;QAAUhtC,eAA4BgtC;E3F8DvGrzC,a2F7DyEszC;QAAYjtC,kBAA8BitC,UAggB3J6C;OApiB2C7kC,SAmjB7C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,cAAuB,MAAGtR,AAAAA,iBAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAC5C,YAAa,MAAGA,AAAAA,eAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAC5B7O,YAAsB,M3F3d2B6O,AAAAA,A2F2dxBA,kBAAqB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAC9C7O,YAAoB,M3F1dyB6O,AAAAA,A2F0dtBA,kBAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAC1C,cAAyB,M3FtaeA,AAAAA,A2FsaZA,oBAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE3C,cAAiB,MAAGA,AAAAA,iBAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACpClI,cAAe,M3F5d2BkI,AAAAA,A2F4dxBA,mBAAO,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACzBlI,gBAAsBkI,AAAAA,gBAAH;SAAc,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CACjC7O,kB3Fxe8B6O,A2FweVA,UAAH;M3FxeaA,a2FweE,A,C;A,G,CAChC7O,kB3Fze8B6O,A2FyePA,UAAH;M3FregB,AAJNA,a2FyeQ,A,C;A,G,CACtCpO,kB3F9eqCoO,A2F8ehBA,UAAH;M3F9emBA,U2F8eP,A,C;A,G,CAC9BpO,kB3F7euCoO,A2F6ehBA,UAAH;M3F7emBA,U2F6eL,A,C;A,E,CAClClP,kB3F5e8BkP,A2F4eZA,UAAH;M3F5eeA,S2F4eD,A,C;A,E,C,CAG7B7O,kBAAyB6O,OAAH;MAAGA,SAAqB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAC9C,oBAA0CA,OAAH;MAAGA,WAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CACnEqG,kBAAqE,MpGpgB9DlC,MoGqgBHnE,eAAoD,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CACxD,YAAgB,OAAkB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAClC,YpG1iBE28B,AoG0iBmB38B,eAAH;OAAoB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,G,CACtC0Y,kBAA0C1Y,OAAH;MAAGA,UAAY,A,C;A,G,CACtD7O;EpG3hByBwrC,AoG2hBA38B;GpG3hBS,W4B+FHsU;EA1BP,+BwEsdF;SAAoB,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,I,C,I,C,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,I,C,I,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,yC,C;A,G,C,CAMjBjjB,YAAgB,MAAGgmD,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BnzC,cAAyBmzC,QpG/gBpGlzC,eoG+gB0IkzC,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzIhmD,YAAmB,MAAGimD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAkCpzC,cAA4BozC,QpGhhBhHnzC,eoGghB4JmzC,WAAoB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAEvL,uBACE/D;;;EACOxiD,aALkGsmD;QpG/gBpGlzC,eoG+gB0IkzC;EAMrItmD,gBAL2GumD;QpGhhBhHnzC,eoGghB4JmzC;sBADvHD;EAhjByEhxC,kBAA4BgtC,UAAtCA;SACQC;QAAYjtC,kBAA8BitC,WAwjB7J,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,mB,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CAcyBlvC,YAA0B,MAAGk2B,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAyCp2B,cAAmCo2B,QpGtiBrIn2B,eoGsiBiLm2B,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CACnLjpC,YAAgB,MAAGgmD,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BnzC,cAAyBmzC,QpGviBpGlzC,eoGuiB0IkzC,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,CAElKlmD,WAAkB,SAAO,A,C;A,G,CACzBA,WAAmB,SAAO,A,C;A,E,C,CAO1B;;EACSJ,aAXkGsmD;QpGviBpGlzC,eoGuiB0IkzC;EAYxItmD,aAAPwmD;;;EACYA,OAAqC,KAAtBA,eAA3BC;SArlByGnE;QAAUhtC,kBAA4BgtC;EAulBtIkE,OAtlBwGjE;QAAYjtC,kBAA8BitC,UAulB3JmE;QAAe1mD,iBACjB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;GACM,CAACwiD,QAEHmE;;EAOAC;;GAJF;YAAoBC;6BAAAA;KAAF,UAIhBD;MAHWC,SACDA,MAAa;KAGzB,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,yBAEErE;;WAEE;EAEgBt5C;GACd49C,aACF,MAGFtE;;EACAuE;SAAAA;OACAh0C,AtG3awB;sBsG2aG+zC,kCAAuCN,SAClE;QAAkB,EAAEM,gBACS,GAA3BC;iBAAgCD,OAClC,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,kC,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,C;A,E,C,CAyBaxmD;EACP0mD;;GAAQ,SACV,QAEF;WAAYA,WACd,A,C,Q,C,K,C,C,C,C,C,G,C,kB,C,G,C,C;A,E,C,CAEa1mD;WAET;EAESwE,KAAAA,QAAkBkiD;WAE3B;GAGsB,KAApBC,QAAuBA,SACzB,QAGF;MADYrf,MAAcqf,QAAqBniD,kBAC7BmiD,aACpB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,oB,C,G,C,C;A,E,C,CAEa3mD;WAET;EAESwE,KAAAA,QAAkBkiD;WAE3B,QAGF;MADYpf,MAAcqf,QAAqBniD,kBAC7BmiD,aACpB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,oB,C,G,C,C;A,K,C,I,C;A,M,C,C,E,C,CAxCAzkD,cAEE,MAAUqlC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,G,C,C;A,G,C,M,C;A,E,C,CA2CAvnC,YAAkB,MAAK+rC,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,mB,C,E,C,CAE9B7pC;GACQ,gBACJ;QACW,cACX;QACW,mBACX;QACW,gBACX;QACW,aACX,WAEFuQ,AtG7fwB;;KsG8flB,KAAA,QACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,4H,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CAuByBm0C,YAAkB,MAAGZ,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAiCnzC,cAA2BmzC,QpGhsB1GlzC,eoGgsBgJkzC,WAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC/IvmD,WAA8B,MAAG4lD,SAAwB,A,C,I,C,I,C,C,C,C,C,G,C,uB,C,G,C,G,C,C;A,G,C,CAAiDxyC,YAAuCwyC,QpGjsBnKvyC,eoGisB2OuyC,WAAkC,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,uB,C,G,C,C;A,G,C,CAS3PrlD,WAAmC,MAAGwlD,SAA0B,A,C,I,C,I,C,C,C,C,C,G,C,yB,C,G,C,G,C,C;A,G,C,CAAuD3yC,YAA4C2yC,QpG1sBrL1yC,eoG0sBiQ0yC,WAAoC,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,yB,C,G,C,C;A,G,C,CACnRxlD,WAAmC,MAAGylD,SAA0B,A,C,I,C,I,C,C,C,C,C,G,C,yB,C,G,C,G,C,C;A,G,C,CAAuD5yC,YAA4C4yC,QpG3sBrL3yC,eoG2sBiQ2yC,WAAoC,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,yB,C,G,C,C;A,I,C,CACnR3wC,WAA0B,MAAG+xC,SAAa,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,G,C,C;A,I,C,CAAyCh0C,YAAmCg0C,QpG5sBxI/zC,eoG4sB0L+zC,WAAuB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Y,C,G,C,C;A,G,C,CAC/L/xC,YAAwB,MAAGytB,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAuC1vB,cAAiC0vB,QpG7sBhIzvB,eoG6sB8KyvB,WAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,CAI1MziC,WAAkB,SAAO,A,C;A,G,CACzBA,WAAmB,SAAO,A,C;A,E,C,CAkB1BsV,eAEW,KAtCmC4wC,cAwC1C,wCAEF;MlFjpBO,iBkFkpBT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;;;GAIE;YAAoBp8C;6BAAAA;KAAF;E3G3tBX7J,K2G4tBiB6J;E3G5tBjB7J,K2G6tBiB6J,MAAO;yCAG7Bk9C;eAA4BC;KAC9B,AAEAD,mBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQA,uBAjE0KzB;QpGjsBnKvyC,eoGisB2OuyC;SAyEhPE;Q3GpvBOxlD,K2GovBoBinD,mCAC3B1B;Q3GrvBOvlD,K2GqvBoBinD,mCAC3BC;QAAcvB,QAASsB,mBACvBC;QAActB,QAASqB;EACXA;GACF,QACRE;EAGK5f,KAAcie,QAlFmCF,kBAmFjDE,YA1EmLC;QpG1sBrL1yC,eoG0sBiQ0yC;EA4E/Ple,KAAcge,QArFmCD,kBAsFjDC,YA5EmLG;QpG3sBrL3yC,eoG2sBiQ2yC,WA6ExQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;SACE58C;QAAOqjB,kBACPi7B;QAASj7B;EACF06B,KAAoB16B,cA7FoF85B;QpGhsB1GlzC,eoGgsBgJkzC,UA8FrJoB;Q3GxwBOrnD,K2GwwBkBmsB,uBACzBm7B;Q3GzwBOtnD,K2GywBgBmsB;EA51BWjM;EAAAA;EA61BvB7d,KAAmB8pB,kBAnFuGqW;QpG7sBhIzvB,eoG6sB8KyvB;EAoFtKngC,KAAmB8pB,qBArF6G26B;QpG5sBxI/zC,eoG4sB0L+zC;EAsF7K36B;GACF,QACdo7B;EAGSC;SAAXrF;SAA+B,KAApBqF,YAAmC,CAAA,KAvGFvB;EAwGN,CAAA,KAApBuB,YAAmC,KAxGTvB,aA2GuGwB;QpG3yB9I10C,eoG2yBwM00C,WAF/M,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,CAEyB1nD,WAAwB,MAAG0nD,SAAiB,A,C,I,C,I,C,C,C,C,C,G,C,gB,C,G,C,G,C,C;A,G,C,CAA+C30C,YAAiC20C,QpG3yB9I10C,eoG2yBwM00C,WAA2B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,gB,C,G,C,C;A,E,C,CAE1O;EAEED;SAAAA;;;GAEA;YAAoBE;6BAAAA;KAAF;EAEFA,MAAc;EAChBA,MAAc;EACP,CAAA,KAAfA,a3G/xBC1nD,K2GiyBiB0nD,qBAGtBF;;KACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;;EAQI3B;;GALF;YAAoB8B;6BAAAA;KAAF;E3G3yBX3nD,K2G4yBmB2nD,iBAIxB9B;mB3GhzBK7lD,K2G6yBqB2nD,MAAe,gB3G7yBpC3nD,K2G8yBqB2nD,MAAe;KAG3C,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA5nD,cACkB,OAAGsnD,QAAnB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA3nD,WAAsB,MAAGkoD,SAAcjC,SAAQ,A,C,Q,C,M,C,C,C,C,C,I,C,C;A,E,C,CAE/CjmD,YAA4B,MAAGmoD,SAAWlC,WAAc,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMxDjmD,qBAEE;MAAA,YAAA,UACSooD,AADT;6BACSA;KACT,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEApoD,qBACE;MAAA,QAAA,UAAA;GACkB,KAAZooD,WACF,MAAOA,SAEX,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,C,CA1GA3lD,cAEE,MAAUqlC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAPa,cAAO,MAAW,MAARrmC,QAAUJ,SAAEgnD,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAyIvB;;;MACkBC,QAC1BroD,aAASua;iDAET2nC;UAEAD,eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,gB,wC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,qD,C;A,E,C,CDx7BAvsC,cACE3C,ArGuNwB,wCqGvNauiB,QACrC;MAAOgzB,AAAAA,MAA2B,KAALhzB,qCAY/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA1BAizB,WAIIjzB,sBAAiBjhB,KAAAA,uBAMrB,A,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAIqD,YAEjDtB,ArGoNsB,4CqGnNtB;MAAOwoC,SjHmnDJh4C,2LAA8B,iCiH3mDnC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uD,C;A,E,C,CAaF;;EACWL,KAAAA;EACEA,KAAAA;EACAA,KAAAA;GACF,CAAA,0BACP;EAEcslD;EAAAA,QAEhBA;SACA/vB;UACF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEA/iB;KACmB+yC;EjHglDZllD,QAA8B,+BiH9kDnCwB;aACAA;kCACAA;yBACA0jD;QAAc,AAAdA;gBjEhEwB,mBiEkExBD,AAAAA;gBACAn0C;KhG252BuBmoB,KAA4B,egG352BzB+e,eAC1B;MAAO9iB,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA7BAiwB,iBhG2q4BsCC,eAw9GpC10C;gBA/EI,KAAc,KA8EcC,KgGjo/BR00C,YhGmj/BmB,uBgGlj/B3C71C,ArGiMwB;sCqGhM1B,A,C,C,A,E,+B,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C4B1CwBM,YAAyB,MAAGw1C,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAwC11C,cAAkC01C,KAAYvzC,eAA8BuzC,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,E,C,CAIpMld;OACatgC,AALuCw9C,sC5H+pShDxvB,yB4HtpSE5K;OAT8Co6B,KAU9C;;uB5HqpSFxvB,4B4HlpSE5K;OAb8Co6B,KAc9C;;c5HipSFxvB,uB4H9oSE5K;OAjB8Co6B,KAkB9C;;a5H6oSFxvB,sB4H1oSE5K;OArB8Co6B,KAsB9C;;c5HyoSFxvB,uB4HtoSE5K;OAzB8Co6B,KA0B9C;;c5HqoSFxvB,uB4HloSE5K;OA7B8Co6B,KA8B9C;;iB5HioSFxvB,0B4H9nSE5K;OAjC8Co6B,KAkC9C;;gB5H6nSFxvB,qB4H1nSE5K;OArC8Co6B,KAsC9C;;oH5HynSFxvB,0B4H/mSE5K;OAhD8Co6B,KAiD9C;;gB5H8mSFxvB,yB4H3mSE5K;OApD8Co6B,KAqD9C;;gB5H0mSFxvB,yB4HvmSE5K;OAxD8Co6B,KAyD9C;;gB5HsmSFxvB,4B4HnmSE5K;OA5D8Co6B,KA6D9C;;e5HkmSFxvB,wB4H/lSE5K;OAhE8Co6B,KAiE9C;;mB5H8lSFxvB,wB4H3lSE5K;OApE8Co6B,KAqE9C;;W5H0lSFxvB,oB4HvlSE5K;OAxE8Co6B,KAyE9C;;QAEA,QAEN,A,C,Q,C,K,C,C,C,C,C,G,C,4B,C,C;A,E,C,CAEAC,uB5H0lQE7rB;;E4HzqQkD4rB;YAmFhD91C,AjIuJsB,mCiItJtB;SAES1H;EACG09C;YAEZh2C,AjIiJsB,6DiIhJtB;O5H4/PFkqB,gB4Hz/PAlqB,AjI6IwB;8CiI5I1B,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,e,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CA5FAi2C;;EvHuFqB;;;gBC5CI;;;;;;SsH3C2B,A,C,I,C,I,C,C,C,C,C,G,C,sC,C,C,C,C;A,2B,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,4D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C/CL5B31C,YAAsB,MAAGmvB,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAqCrvB,cAA+BqvB,KAASltB,eAA2BktB,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CACvJpiC,YAAkB,MAAG6oD,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyC91C,cAA2B81C,KAAc3zC,eAAgC2zC,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAG/L,cACE3zC,kBAA+B4zC,YAC/B5zC;kBAAgCnM,YAChCmM;kBAAqC6zC,aACvC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,G,C,CAEA7oD,kBAViDkiC;WAY7C,gBAEF;MAAO0E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,K,C,C;A,G,C,CAEA5mC,kBAjBiDkiC;WAmB7C,gBAEF;MAAO0E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAEA5mC,kBAxBiDkiC;WA0B7C,gBAEF;MAAO0E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAEA5mC,kBA/BiDkiC;WAiC7C,gBAEF;MAAO0E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAlCAkiB;;ExE0FqB;;;gBC5CI;;;;;;;SuE9CoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,4B,yD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CgDFrBhpD,YAAiB,MAAGipD,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAgCl2C,cAA0Bk2C,KAAa/zC,eAA+B+zC,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CACxJ/oD,YAAuB,MAAGgpD,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAAsCn2C,cAAgCm2C,KAAiBh0C,eAAmCg0C,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CAC1LhpD,YAAyB,MAAGipD,MAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAAwCp2C,cAAkCo2C,KAAmBj0C,eAAqCi0C,QAA0B,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAEhO,wBAEYC,KADmBpmB,kEALiFimB;KAAa/zC,eAA+B+zC,QAO5J,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,Q,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CARAI;;ExH6FqB;;;gBC5CI;;;;;;SuHjDyB,A,C,I,C,I,C,C,C,C,C,G,C,oC,C,C,C,C;A,yB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCA1B9E,YAAwB,MAAG+E,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAuCv2C,cAAiCu2C,KAAWp0C,eAA6Bo0C,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAC7LC;;EzH4FqB;;;gBC5CI;;;;;;SwHhDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCArBv0C,YAAqB,MAAGw0C,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAoCz2C,cAA8By2C,KAAWt0C,eAA6Bs0C,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAIpL,cACEC,AAAAA,KAL8CD,YAMhD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAE;;E1H0FqB;;;gBC5CI;;;;;;SyH9CoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CC4B7CtnD;4CACgC,MhI8wWI44B;OgI7wW1B3M,yBAEJ,MAAOs7B;mDAIP,MAAOt7B;QAEP,MAAOA,WAEb,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CCnCFu7B;EAGiBC;;+CrB8HZxuC,wB5Gq98BMwhB,AAAAA,A4Gl+8B6BxhB,2CACpCyuC,QAAoCzuC;;;UqB3GtC;MAAa4U,oBAAmB,UAAa+Z,qBAC5B+f;;aAGkB,8BACjCjwB;WACF,6BAEiE,MAEjE;yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;WAEmB;GAEG,AAAhBl6B,iBACmCA,OCwKnCoqD,AtBrIFtW;;GqBlCa,QACXsW,ArBiCFtW;GqB7Be,AAAb9zC,eACFqqD,KAAiBrqD;GAGfA,eAAsB;EAQF,AAAhBA,QjIwzmBUi8B,AAAAA,mBiIvzmBlB;MAAa5L,aAAmB,UAAa+Z,sBACrC,YACNkgB;OAAmBtqD,KAAAA,mBACrB,CACF,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CC+WAuqD,iBACE;eAAuB,AAAhBl6B,kBACEA,QACT;gIAKE,QAEF;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CC7aArvB;;4CAEI,MAAOwpD;+CAIMC,KAAgBp6B;GAClB,QAAS,iBAGtB,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAcArvB;;;;MAMEytB;gCAFqBqtB;QA8BN;;;IAEbnD,cAAAA;OACU8R,yBAGZ,WACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,yDAGE;gBA2CY,gEA3CM,EAAE9R,gBACPA;EACEA,MAAW;EAEN+R;qBAAAA;EAAAA;GACdA,WACeA;qBAAAA;EAAAA;GACF,WACSC;GACF;;GAMlB,CAACD,WACY,SACGA;;qBAIkCA,wBACtD;QAAkB,EAAEA,AAAAA,uBAEJA;qBAAAA;EAAAA;EACGA;EAAgB;qBAAhBA;EAAAA;EACgB,QAC7BC;GAEgB;;GhC7DpBre,0DAIJF;OAAe,gBgC+Db,AAEAK;;YAKY0N,SvB1C0BrG;KuB2CrB8W,UACrB,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAOAC;ErJ6HsBlqD;SqJ3HL,MAKf;mCAAiB,QACFoY;EACS,OAAWA,eAA2B;GAE/C,gBACS,MAEpB2xC;OAAW3xC;qBAKb2xC;OAAW3xC;EACMA,QAAAA,UAAuB,OACxC2xC;;;KAEII;E9Hq6BF9Z,uC8Hp6BF0Z;EAEqB,IACvB,SAEyBA;;OAEzB;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAyCA;EACMr0B;WACF;aAIuBA,cAGzB;KAAY,UACVyd,AAAAA;EACOzjB,cACT,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CvBzHA06B;QACkBC;;EtHtCD3qD;eACoBA,OAA+B00B;GsHsCpD,QAAS;;;;;qDAuCpBtZ,wB5Gq98BMwhB,AAAAA,A4Gl+8B6BxhB,2CACpCyuC,QAAoCzuC;;sLANtCuvC;UACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeA5qD;+CACKqb,wB5Gq98BMwhB,AAAAA,A4Gl+8B6BxhB,2CACpCyuC,QAAoCzuC;;SAWR;SAC0B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CwB1IxD88B,+BACErnC;KAAAA;EAGIwpC;;4CAA+B;EAGhCA;qBAAD;UAAA;;EACkCA;EvB+BpB;;mBmBvChBuQ;KAAYC,AAAAA,WAAoCC;EIuB7BhiD;MAEjBknB,AAAAA;EACOlnB,SAA8B,KAAZA;EvBaX;;cuB3BTwvC,AAAAA,uBAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAkBA/e,WAAiB,oCAAa,A,C;A,E,C,CAE9B;GACMwxB,WD3BuB,SAAkB;EC6BzBj/C;KpImk9BpB8wB,AAAAA,AoInk9BI5M;KAEAA,AAAAA,kDAKFA;mBpI4j9BF4M,AAAAA;kBoI5j9BkB9wB,YAEpB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAMAsxB,WAAuB,oCAAa,A,C;A,E,C,CAEpC;EAGepN;;+CAEQ8pB,KAAAA,KxBsBmBrG;;+CwBnBzBuX;;;;GAMG,SAAW,AvBtCZ3Q,euBuCA,CAAA,KAAb2Q,WACFC,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CJhEA,enBsBmB5Q,cmBrBL,MACZuQ,AAAAA;;kCAEF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEuD;EAItCM,AhI0mPR7yB,+CgI1mPmB;SAC1B8yB;;;EAEAA,QhI2p/BAv3C;gBA/EI,KAAc,KA8EcC,mBA9EW;EgIzk/B3Cs3C,QhIwp/BAv3C;gBA/EI,KAAc,KA8EcC,mBA9EW;;EA/ja/B6C,kCACZvR;oDgIxglBAgmD;kBAGA;MAAOC,mBAA0CA,YACnD,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,U,C;A,M,C,CAV0B,YACtBA,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,U,C;A,M,C,CACyB,YACvBA,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAyBFr5C,WAAS,oCAAa,A,C;A,E,C,CAEtB,kBAEEie,SAAAA;0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,kBACUA,KAAAA,UnBvBRyqB;KAAAA,URA0BxN;O2ByB5B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAMAoe,WAAsB,oCAAa,A,C;A,E,C,CAEnC,8CACEr7B;OG9D2B,SAAkB,QH+D/C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EACUA,kCnBtCRyqB;KAAAA;;;6CmB2CsC,KAAVzqB,4CAC1B,MAAA,KAAcs7B,oCAAd,UAAA;;EACuBxR,KAAAA,gDpBAerG;GoBCjB,QAEjB8X,WAEJ,A3BlDwBte,O2BsD5B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,M,C,C,E,C,CAWA9qC;;GACmB,AAAbisB,kBACKA,QAAAA;;aAAP;MAAOA,4BAOS87B;WACO;EAEVsB,2CACoBp9B,gBACjC;MAAOq9B,sBAEX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAdoC;;;GACpB,CAAA,wDAEN7kB,oBACAA;EAAWxY;;;SAHf;SAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAOoB,wBAAK;MAAM,CAAA,eAAcwY,eAAW,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,4B,C;A,E,CAW5D8kB,WAAuB,oCAAa,A,C;A,E,C,CAEpC,iBACEC;;GAEIC,gBAA2B;2FhIgqlB3BrjD,KAAuB0wB,wBgIpplBb;6CAAd4yB;UAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA9rD;EACM+L;;GAAS,0BACIggD,OACf97B;;EACOA,kCAAP;qCACkB,8CAClBA;yBACA;MAAkB,MAAXA,uCAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBACM67B;GAAY,SACdA,cACAA;cAEJ,A,C,Q,C,M,C,C,C,C,C,I,C,C;A,E,C,CAEA,mBACEF;;EAEI7/C;;GAAS,0BACHkkB,kCnBtIVyqB;KAAAA,mBmBuIoB,kBACVzqB,kCnBxIVyqB;KAAAA,YmB0IF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,C,CAMAt4C,mCACuB,M1IzFdnC,wB0I0FP;kDACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAxCqC;GAC7B4rD,KnB/GKnR,KAAAA,YmB+GmBkR,OAC9B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAoCsD,YAAI,SAAG,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,CKpL/DN,WAAuB,eAAc,A,C;A,E,C,CAErCnT;;GACW,CAAA,gBAAmB,CAAA,iBAC1B;ECqC2BmC;QDlC7BxpC;uDACAwpC,AAAAA;;EACO/B;GAAsB;ExB8Bb;;mBmBvChBsS;KAAYC,AAAAA,WAAoCC;;EnBuChC;;qBmBvChBF;KAAYC,AAAAA,WAAoCC;IKSzCxS,UAAP;SAGF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,c,C;A,E,C,CCJAJ;;;0EACElkC;;gDAEF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA;GACM+3C,cAAmB;EACTzT,AAAAA;GACF,QAAS0T,QACvB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGA;GACMD,cAAmB,MACvB;MAAoBzT,iBAAAA,WpGmPlB,2CvD+BkCr3C,8B2JlRpC,U3JoRekI;G2JnRD,QAAS6iD,QACvB,AACAD,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAIA3kD,kBACM2kD;cAA+B,6BAAZA;UACvB,SACF,A,C;A,G,CAOArB;EAA+BrQ;QAAH;uDAA4C,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,a,C;A,G,CCzCxEqR,WAAwB,eAAc,A,C;A,E,C,CAEtCxT;GACW;;GACA,CAAA,wBAA2B,CAAA,eAClC;EDoC2BmC;QCjC7BxpC;uDACAwpC,AAAAA;;EACO/B;;E1B6BS;;amBvChBsS;KAAYC,AAAAA,WAAoCC,QOUzCxS;UAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,8C,C;A,G,CLIA/e,WAAkB,eAAc,A,C;A,G,CAEhC0yB;;QAAgC;6DACd,A,C;A,E,C,CAElB/T;EACc;EAERjgC;wGAGFA;+BAOEA,OAAAA;MAAAA;MAGAi0C;;sBACO5T,AAAAA;uBAAP;;aAEArgC,OAAAA;MAAAA;MAGAi0C;;sBACO5T,AAAAA;uBAAP;;SAEArgC,OAAAA;MAAAA;MAGAi0C;;sBACO5T,AAAAA;uBAAP;;QAEA,gDAEN,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;uBAGUrgC;WAAmB,MACvBA;OAAAA;SAAAA;SAGAi0C;SACA5T,AAAAA;sBACA;;eAEIrgC;WAAmB,MACvBA;OAAAA;SAAAA;SAGAi0C;SACA5T,AAAAA;sBACA;;WAEIrgC;WAAmB,MACvBA;OAAAA;SAAAA;SAGAi0C;SACA5T,AAAAA;sBACA;;2CAGA;QAEN,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,iBACOrgC;GAAD,CAACA,MACHA,OACAgR;KAAkBhR,UAEtB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMAqhB;EAEyB;;6CtBpBiBma;EsBqB1B5M;EAGJA;cAIFijB,SACNjjB;WAoKEslB;cACU9R;;EACF+R;cAEFlyC,AAAAA,uCACNkyC;WAEFD;MAvKaE,SAEfpC;eAIAqC;SACA;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CAwBAC,WAAoC,MAAGC,SAAgB,A,C;A,G,CAoBvDjzB,yBACEkzB;;ElI678BO7vB,AAAAA,AkI178BKyd;GACF,WACQ6P;EACF,QACHsB;cAKFkB;WACW;EAGRlZ,gDtBtG0BC,QsBuGxC;MAAe,aACjB,A,C;A,G,CAKAna,iBACEmzB;;EACOE,OAAP;MAAgB,WAAqB,8BACvC,A,C;A,E,C,CAeA5sD;GAEM6sD,aAA8B,QAElCC;MAGAD;;;;;EAGmB;;;ElIs48BZhwB,AAAAA,A4Gl+8B6BxhB,2CACpCyuC,QAAoCzuC;SsB+FlB;EAMZ0xC;;6CtBnJkCrZ,OsBoJtCsZ;;EACWA;;;;QAIT,GAEFA,MAA8BC,KADpBC,KAAkCF;GAI9B,QAGdA;UAEAG;KAEAC,KAAUJ,QAGZ;SACF,A,C,Q,C,C,C,M,C,I,C,E,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,a,C,E,C,CAtHA5qD;EACcirD;;+CtBMXhyC,wB5Gq98BMwhB,AAAAA,A4Gl+8B6BxhB,2CACpCyuC,QAAoCzuC;;;KsBOL,QAE/B;MAAa4U,QAAmB,UAAa+Z,cAC3CsjB,cAAahB,UACf,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CAoHAlqD;EACYmrD;GlIivNanxB,KAA4B,qBkIhvN3B;EAEhBoxB;cAIFP,AAAAA,uCACJ;OAAOQ,YAAY,YlIkpmBjB;GAAgB,QAElB7xB,iBkIlpmBA,AACA4xB,gBAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CA4BAprD;;ElIi1OSk2B,AkIh1OQuO,uCACfA,AAAAA;0BAEA;MAAiBA,WAAAA,QAAAA,4BvJLmB3lC,8BuJKpC,UvJHekI;2BqBg08BAyzB,AkI1z8BTgK,WlI0z8BShK;iBACfA;;;kCkItz8BM0wB;ElIqz8BS1wB,AkIrz8BmBgK;ElIqz8BnBhK,iBACfA;oBALAA;;;UkI9y8BA,AAEA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEAz6B;EAGgBmrD;MAEZ5X,SACA;OAIF,0BAAgB9O,SAAe,SAC7B8O,SACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CAUAvzC;;EAWM;GACAs5C,QACFgS,WAGFC;UACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAUAvrD,wBAC2B,MACzBwrD;;MlIywOOt1B,oCkIvwOK;oCAEZ3hB,AlI8ibsBvS;6BkI7ibxB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAjCE;GACM,CA1IJ4lD,AtBrIFtW,0BsBgRI0Z;KAAU3Z,gDtBxQ0BC,WsB0QxC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgBmC,YAAI,2BAAM,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CA0B/Cja,iBAAiBo0B,OAAAA;UAAH;YAAa,A,C;A,E,CAM3B77C,YAAU,MAAG0oC,MAAAA,YAAe,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,CAE5B3nC,cACE2nC,KAAAA,cACF,A,C;A,G,CAGA1oC;EACO87C;;yFACI,KAALp4B,iBACF,MAAOo4B,QAET;MAAO,MAAiBA,QAAQp4B,cAClC,A,C;A,E,C,CAQA,kBAvBmBm4B;WAwBL,MAIZA;OAAY9hD,QAEZ+hD;YACAD;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CChY2B,yBAMzB;eAAe,KAAR9kD,iBACEA,SACT;aAGW;2BAGO,eAAkB;qBAMvBshD;GACF;;;;YAET9R;SAAAA;WAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,G,CAsGAv4C,WAAoB,MAAGsqD,AAAAA,oBAAkB,A,C;A,G,CACzCtqD;EADuBsqD;EAAAA;wBAAAA;GAC0B,KAAVA,+BADhBA;EAC6C,KAAVA,4BAApC;SAAmD,A,C;A,G,CASzEltC,WAAwB,MAAG2wC,SAAW,A,C;A,E,C,CAWtC7tD;;EAEYoqD;qBAAAA;MAAAA;qBAAAA,SAAV;aAA4BA,MAC9B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEApqD;EACkCoqD;qBAAAA;EAAjB,KAAiBA,KAChC;kBAAkB,EAAEA,iBACNniD,MAAe,QAAL;GACZ,uC7IwDZwE;KAA6CA,S6IvDnB;qBAJM29C;EAIfA;8B7IuDjB39C;KAA6CA,O6ItD7C,AAEA,M7I+DyBA,M6I9D3B,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,CAvBA89C,YAIEsD,QAhBqBzD,AAAAA,mBAgBM0D,WAAoBC,WACjD,A,C,C;A,E,C,C;A,G,C,4D,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA8DAC,0BACEC;;EAEIC;GAAU,SACZA,MACAA;eAGGC;GAAD,IAAc,CAACC,SACjBC,aACA;WAGwBC,QAAcC;IACfC,QAAaC;GAGlC,CAACC,UACa;;iDhCpNlB5iB;OAAe;EgCqOC6iB;EAASC,OhCrOzB9iB;OAAe,egCmOG;QAMlBoiB,QAAYW,AAAAA,2BAEZR;QAAcQ,SAChB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA;EACiBC,OACfC;;;wEAGED;iFAKgB,OAAhBA;eAEAA;UAGgB,kDAChBE,QAAWnjB,AAAAA,WAA4BojB;EAI5B;EACTH;EAAc;E5BpChBvgB,SAAyB1C,YAA8BD;G7HyCpC,AAFHvrC,ayJDM4uD,WAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA11B;;GACY,UAAO,MAzEa21B;EA0EbC;EAAkB;gCAAlBA;EAAAA;GACZ3T,WA3EyB0T;;KA6E5B;EAGYpF,AvB5PdtW;WuB6PqB,QAErB;MAAO4b,MAAwD,AAAL,QAA3BA,AAAAA,kBACjC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAIA;;EAG2BC,QAAsB;EAElC;OACEt5B;OACU,SAAWu5B,QACrBA;;EAIa,QzJjP5BhvD;KyJiPA6uD;EACaI,KArGiBL;EAsGPM;KAGrBxlC;QACuB,QACvB,MAAA,QAAA,OACEA,eADF,SAEA,CAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAylC;;;;EAE2BJ,QAAsB;EAC9BA;EACLF;EAAsB,KAAJ;gCAAlBA;EAAAA,IACZA;UAA8B,SAAe,KAAJ,YAE5BI;KAxHiBL,WAyH9B;cAAkB,CAAA,cACLM;;EnI4imBT;GAAgB,QAElB9zB,gBmI3imBA4zB;UACF,AACA,qBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;GACMI,QAAQ;EAnIkBR;;;;EAsIbA;;GAEb7B,gBnIqnNmBnxB,KAA4B,AmIrnNhBmxB,6BACjC7uB,UACA;UAKE,CAACmxB,SACHA;GACa,SACXC,QAAmBpF,OACnBqF;gBAKgB,+BAEpB;gBAAA,YAAA,UAAA,MACE;MAAkBliB,UAAlB,kBAAA,OACEmiB,MxJrGW5mD,KwJqGY6mD,QAA+B,KAAbpiB,aAC3C;EAEeA;6BAAAA;KACjB,AAEA,MAAA,QAAA,UAAA,MACE;gBAAoBA,mBACP,MAAe,KAAbA,SAAeA,YAClB,YAEEmhB,KAAAA;EAEGgB;GAGF,SAAW7oB,KAAAA;EACdA;EACQA;;GAGK,AAAjB2oB,gBACMA;EAEA,QACGV;OAIfc,iBACF,CACF,AAEA,MAAqBF,8BxJtG8Bv4C,KAAAA,MAAoBO,6BwJsGvE,OACEm4C,QAAsBhpB,KxJpET/9B,MwJqEf,CAGF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CA+CA,iBACE;MAAA,QAAA,OAA2B6iD,KAA3B,OAA0C,CAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBACMiD;WAAkB,MACtBA;MACAA;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;GACMU,QAAQ,MAEZX;SACA;MAAoBI,YAAF,EAAEA,cAClBc,QAAsBd,KACxB,AzJ5VA9uD;;EyJ+VI6tD;GAAU,SACZA,MACAA;aAEFgB,AAAAA,eACAQ;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CArPyC,YAAI,UAAK,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAO9CQ;;EACmBjoD;EACHA;GACV,EA5QmB,SAAkB,QA4Qf,MAC1B;oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASE,YAAI,MAAGomD,WAAc8B,KAAAA,UAAe,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CK9R1ClY;GAEW,CAAA,eACP,8CAEFmY;;EACO/X;EAAkC+B;E3BiCzB;;kB2BjCT/B;UAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,CAMA,kB3BUiB+B,O2BTfrqB;0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,G,CCfAsgC,WAA0B,eAAc,A,C;A,E,C,CAExCpY;GACW,CAAA,gBAAY;EHsCQmC;QGpC7BxpC;uDACAwpC,AAAAA;;EACO/B;;E5BgCS;;mBmBvChBsS;KAAYC,AAAAA,WAAoCC,QSOzCxS;UAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C,A,E,yC,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C,C,A,E,qC,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,O,C;A,E,C5BeA9e,WAAc,MAAG6gB,SAAK,A,C;A,E,CAStBtoC,YAAU,MAAG0oC,MAAAA,SAAe,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,CAE5B3nC,cACE2nC,KAAAA,WACF,A,C;A,E,C,CAoCA;GA3CmBJ,cA4CL;EAERkW;GAAS,QAASA,MACtBA;YACA9V;YACAJ;YACAwT;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CA1CA3V;EAZa2V;;wFAiBF;EAjBEA;MAmBTpT;WAGY,OAAwB,aAApCA;UAGF8V,QAAW9V,AAAAA,0BACX+V;QApBW/V,KAAAA,UAqBb,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAFsC,wBAAI;MAAG+V,MAnBhC/V,KAAAA,OAmBkD,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,kB,+C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,C6BlD/DgW;;ErI6FqB;;;gBC5CI;;;;;;;SoIjDe,A,C,I,C,I,C,C,C,C,C,G,C,0B,C,C,C,C;A,e,C,C,G,C,C,A,E,mB,gD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCEhB1O,YAAU,MAAG2O,MAAK,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,G,C,C;A,G,C,CAAyB59C,cAAmB49C,KAAQz7C,eAA0By7C,QAAe,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,I,C,G,C,C;A,G,C,CAC/GC,YAAuB,MAAGxvB,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAsCruB,cAAgCquB,KAAWlsB,eAA6BksB,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAI1L,cACEmhB,AAAAA,KANmCoO,YAOrC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAE;;EtIwFqB;;;gBC5CI;;;;;;SqI5CgB,A,C,I,C,I,C,C,C,C,C,G,C,2B,C,C,C,C;A,gB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E;A;A;A;A;A,U,C,C,C,C,C;A;A;A,U,C,C,C,C,C;A;A;A;A,W,C,C,C,C,C;A;A,W,C,C,C,C,C;A;A,W,C,C,C,C,C;A;A;A;A,W,C,C,C,C,C;A;A,W,C,C,C,C,C;A;A;A;A;A;A;A;A;A,W,C,C,C,E,C;A;A;A;A,W,C,C,C,E,C;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,W,C,I,C,I,C;A;A,W,C,I,C,I,C;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,W,C,I,C;A;A;A;A;A;A;A;A;A;A,gB,C,I,C,I,C,I,C,C,I,C,I,C,C;A,gB,C,I,C,I,C,G,C,C,C,C,C,I,C,C,C,C,C,C,C;A,gB,C,I,C,I,C,I,C,C,I,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,C,C,U,C,C,C,C,C,C,M,C,C,C,E,C,S;A,M,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,C,E,I,C,M,C,C;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,W,E,K,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,C,C,U,C,C,C,C,C,C,M,C,C,C,E,C,S;A,M,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,C,C,U,C,C,C,C,C,C,M,C,C,C,E,C,S;A,M,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,C,E,I,C,M,C,C;A,E,C,C,C,W,E,K,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,C,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,C,E,C,I,C,K,C,C,C,E,C,C,M,C,C,C,E,C,S;A,M,C,C,C,E,C,S,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C,C,E,C,S;A,E,C,M,C,C,E,S,C,M,C,C,C,E,C,S;A,E,C,C,C,W,E,K,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,C,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,E,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,E,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C,C,G,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,C,C,W,E,K,E,M,C,C,E,Q,E,I,C,C,C,C,C,yB,C,C,C,E,C,C,G,C,G,C,E,C,C,C,C,M,C,M,C,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,C,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,C,E,I,C,M,C,C,E,I;A,E,C,M,C,C,E,Q,C,M,C,C,E,I,E,C,G,C;A,M,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,E,C,C,C,C,W,E,K,E,I,C,C,C,C,C,yB,C,C,C,E,C,C,C,c,E,C,G,C,G,C,E,C,C,C,C,M,C,M,C,C,C,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C,C,G,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,C,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,G,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,G,C,C;A,C,C,E,C,I,G,C,C;A,C,C,G,C,I,K,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,K,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,K,C,W,C;A,C,C,E,C,I,K,C,M,C;A,C,C,E,C,I,K,C,Q,C;A,C,C,E,C,I,K,C,Q,C;A,C,C,E,C,I,K,C,K,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,qB,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,G,C,I,I,C,c,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,S,C;A,C,C,G,C,I,I,C,c,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,qB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,yB,C;A,C,C,E,C,I,I,C,U,C;A,C,C,G,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,a,C;A,C,C,G,C,I,I,C,c,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,S,C;A,C,C,G,C,I,I,C,a,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,C,C,E,C,I,I,C,Q,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,O,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,O,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,Y,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,O,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,M,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,S,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,W,C,C,M,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,G,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,G,C,S;A,C,C,E,C,G,C,S;A,C,C,E,C;;;C;A,C,C,E,C;A;A,C,C,E,C;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;;;C;A,C,C,E,C,I,I,C,I,C,I,C;A,C,C,E,C,I,I,C,I,C;A,C,C,E,C,I,I,C,I,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,O,C,G,C;A,C,C,E,C,I,I,C,M,C,G,C;A,C,C,E,C,I,I,C,M,C,G,C;A,C,C,E,C,I,I,C,Q,C,I,C;A,C,C,E,C,I,I,C,S,C,G,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C;;;;;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,C,C,C,C,K,C,I,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,K,C,I,C,K,C,I,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,K,C,K,C,K,C,K,C,C;A,C,C,E,C,C,C,gB,C,C,Q,C,S,C,S,C,Q,C,M,C,C;A,C,C,E,C,C,C,gB,C,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,G,C,C;A,C,C,E,C,C,C,gB,C,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,gB,C,C,C,C;A,C,C,E,C,C,C,gB,C,C,I,C,M,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,K,C,K,C,K,C,K,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,K,C,K,C,K,C,K,C,K,C,C;A,C,C,E,C,C,C,gB,C,C,E,C,E,C,E,C,E,C,G,C,G,C,C;A,C,C,E,C,C,C,gB,C,C,S,C,K,C,U,C,Q,C,U,C,O,C,I,C,O,C,I,C,O,C,I,C,C;A,C,C,E,C,I,K,C,E,C,C,O,C,I,C,G,C,I,C,Q,C,I,C,M,C,I,C,Q,C,I,C,K,C,I,C,E,C,I,C,K,C,I,C,E,C,I,C,K,C,I,C,E,C,I,C,C,C,C,E,C;A,C,C,E,C,C,C,gB,C,C,sB,C,oB,C,qB,C,a,C,Y,C,c,C,oB,C,gB,C,a,C,kB,C,iB,C,U,C,U,C,Y,C,S,C,c,C,C;A,C,C,E,C,I,K,C,E,C,C,oB,C,sB,C,kB,C,oB,C,mB,C,qB,C,W,C,a,C,U,C,Y,C,Y,C,oB,C,kB,C,0B,C,c,C,sB,C,W,C,U,C,gB,C,wB,C,e,C,uB,C,Q,C,gB,C,Q,C,gB,C,U,C,kB,C,O,C,e,C,Y,C,oB,C,C,C,C,E,C;A,C,C,E,C,C,C,gB,C,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,I,C,I,C,G,C,G,C,G,C,I,C,I,C,I,C,G,C,I,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,C;A,C,C,E,C,I,K,C,E,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,I,C,C,C,I,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,I,C,C,C,I,C,C,C,I,C,C,C,G,C,C,C,I,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,C,C,C,E,C;A,C,C,G,C,C,C,gB,C,C,M,C,S,C,a,C,U,C,Y,C,C;A,C,C,E,C,I,K,C,C,C,C,I,C,C,C,O,C,C,C,W,C,C,C,Q,C,C,C,U,C,C,C,C,C,C,G,C;A,C,C,G,C,C,C,gB,C,C,W,C,C;A,C,C,E,C,I,K,C,C,C,C,S,C,M,C,C,C,C,G,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,oB,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,I,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,sB,C;A,C,C,E,C,I,I,C,yB,C;A,C,C,E,C,I,I,C,yB,C;A,C,C,E,C,I,I,C,8B,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,uB,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,I,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,C,S;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,G,C,G,C,C,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,G,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,Q,C;A,C,C,E,C,C,C,E,C,K,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,Q,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,K,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,M,C;A,C,C,E,C,C,C,E,C,M,C;A,C,C,E,C,C,C,E,C,S,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,C,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,C,C,E,C,I,I,C,M,C,C,M,C;A,uB;A,C,C,E,C,iB;A,C,C,E,C,mB;A,C,C,E,C,C;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,C,C;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,C,C,E;A,C,C,E,C,C;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,C,C;A,C,C,E,C,C,C,E;A,C,C,E,C,C;A,C,C,E,C,C;A,C,C,E,C,I;A,C,C,E,C,C,C;A,C,C,E,C,C;A,C,C,E,C,C,C;A,C,C,E,C,I;A,C,C,E,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,M,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,G,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,M,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,G,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C;A,C,C,E,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,E,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,K,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,E,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,E,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,G,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,C1J4bvCC,sCAA0C,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CAC1CC,sBAA4C,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CAC5CC,sBAA4C,A,C;A,C,C,K,C,C,C,0B,C,I,C,I,C,Q,C,CAC3CC,oCAC8C,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAQnCC,OAAaC,QAAkB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAGnBluD,oCAA6B,A,C;A,C,C,K,C,C,C,qB,C,I,C,I,C,Q,C,CFmrBzBmuD,OAC1BC,MAAeC,yDAA2C,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CAIhCC,OAC1BF,MAAeC,yEAAyD,A,C;A,C,C,K,C,C,C,iB,C,I,C,I,C,Q,C,CAI9CE,OAC1BH,MAAeC,YAAkC,A,C;A,C,C,K,C,C,C,wB,C,I,C,I,C,Q,C,CAIvBG,OAC1BJ;;;;;;;KAAuC,A,C;A,C,C,K,C,C,C,sB,C,I,C,I,C,Q,C,CAIbK,OAC1BL,MAAeC,cAAoC,A,C;A,C,C,K,C,C,C,6B,C,I,C,I,C,Q,C,CAIzBK,OAC1BN;;;;;;;KAA4C,A,C;A,C,C,K,C,C,C,qB,C,I,C,I,C,Q,C,CAIlBO,OAC1BP,MAAeQ,YAAsC,A,C;A,C,C,K,C,C,C,4B,C,I,C,I,C,Q,C,CAI3BC,OAC1BT;;;;;;KAA2C,A,C;A,C,C,K,C,C,C,0B,C,I,C,I,C,Q,C,CAIjBU,OAC1BV,MAAeQ,cAAwC,A,C;A,C,C,K,C,C,C,iC,C,I,C,I,C,Q,C,CAI7BG,OAC1BX;;;;;;KAAgD,A,C;A,C,C,K,C,C,C,qB,C,I,C,I,C,Q,C,C+BzqC/C1e,OAAsB,qBAO3B,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CnC8sBY97B,UAAyB,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CcvtBjBo7C,iBTgBV//C,iKSMU,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CyBiCMggD,uBACkB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAClBC,uBAAiD,A,C;A,C,C,K,C,C,C,iB,C,I,C,I,C,Q,C,CAE7Bz3C,OAC1C03C,QAAuB,A,C;A,C,C,K,C,C,C,uB,C,I,C,I,C,Q,C,CA2aRn3C,+BjCndgB1Y,sBiCmd2B,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CEjetCyM,OACtBqjD,4BAA6D,A,C;A,C,C,K,C,C,C,iB,C,I,C,I,C,Q,C,CAIvCz0C,OACtB00C,cAAmC,A,C;A,C,C,K,C,C,C,oB,C,I,C,I,C,Q,C,CAIbx5C,OACtBu5C,kCAAkE,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CkB3BlErmC,OAAoB,YAAqB,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CHwD/BnV,UAAyB,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,C1BmqBjB+D,iBzBjsBV1I,gLyBytBF,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CT+9COqgD,mBAAiC,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CAu4TnCp1B,OjBv8UNh6B,4iBAA8B,gCiBs9UrC,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,CF5gYasC,OAAUk6B,qCAA0C,A,C;A,C,C,K,C,C,C,4B,C,I,C,I,C,Q,C,CAmWtD6yB,gDACiC,A,C;A,C,C,K,C,C,C,6B,C,I,C,I,C,Q,C,CACjCC,iDACkC,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CiFlZhCC,yBAAgC,A,C;A,C,C,K,C,C,C,sB,C,I,C,I,C,Q,C,CAChCC,mBAAoC,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CpFoMhB9oB,aZ65C1B1mC,QAA8B,4CY75CwB,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,CyGjKlD4pC,OAAU,+BAAkC,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CCmHnD6lB,OAAa14C,YAAmB,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CI8IhC01B,OAAc,qBAQlB,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CAEIijB,iBzHrUM3gD,gCyHqU0B,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,CAUzB66B,OAAU,8BAAiC,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CEkG9C0E,OAAe,+BAAsB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAKrCC,OAAY,+BAAoC,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAQhDZ,OAAa,qCAA0C,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CAYvDgD,OAAgB,+BAAoC,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CAKxDgf,OAAc54C,YAAmB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAuH1Bs3B,OAAY,4BAA+B,A,C;A,C,C,K,C,C,C,2B,C,I,C,I,C,Q,C,CA6BlDoI,OAA4B,sBAMhC,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CtG7lBamZ,iBrBZH7gD,6CqBY6C,A,C;A,C,C,K,C,C,C,gB,C,I,C,I,C,Q,C,CAuB1B8gD,OcIpB,4BAAA;;mBdHoC,A,C;A,C,C,K,C,C,C,Q,C,I,C,I,C,Q,C,CAItBniB,sB0B3DG,oB1B2DoB,A,C;A,C,C,K,C,C,C,gB,C,I,C,I,C,Q,C,CAq4BzBoiB,gBAAwB,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CAiGlC1Z,OAAc,yBAA4B,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAC1CE,OAAa,wBAA2B,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CACxChB,OAAa,wBAA2B,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CACxCL,OAAW,sBAAyB,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CAEnCpG,oCAAmC,A,C;A,C,C,K,C,C,C,kB,C,I,C,I,C,Q,C,CFn+BpCn9B,OACTg+B,eAA2B5+B,KAAAA,6BAAoB,A,C;A,C,C,K,C,C,C,O,C,I,C,I,C,Q,C,CAoD7Ci/C,OAAQryB,cAAsBhmB,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CAI9Bk4B,OAAWlS,AAAAA,AAAAA,uBAA0C3K,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAE9Ckd,OAAa,wBAA2B,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,C4GnI/C6H,OAAgB,qBAoBpB,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,CCYWlO,OAAU,6BAAgC,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CGpBjDwR,OpIooDGp7C,0NAA8B,gCoIlnDvC,A,C;A,C,C,K,C,C,C,kB,C,I,C,I,C,Q,C,CAEMm7C,OpIgnDGn7C,qDAA8B,gCoI5mDvC,A,C;A,C,C,K,C,C,C,wB,C,I,C,I,C,Q,C,ClB6HsB2/C,iBjHzIV5wC,0CiHyI6D,A,C;A,C,C,K,C,C,C,uB,C,I,C,I,C,Q,C,CACnD2wC,iBjH1IV3wC,+CiH0IiE,A,C;A,C,C,K,C,C,C,oB,C,I,C,I,C,Q,C,C+BpJzCy3C,OAAqB,qBAiBrD,A,C;A,C,C,K,C,C,C,gB,C,I,C,I,C,Q,C,CE6NW6D,oCAA6B,A,C;A,C,C,K,C,C,C,uB,C,I,C,I,C,Q,C,CAC7BnB,oCAAoC,A,C;A,C,C,K,C,C,C,wB,C,I,C,I,C,Q,C,CA4G7B8G,OACH,aACbrJ,AAAAA,KAAAA,sCAAiE,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CtBpMzDc,kDAAyC,A,C;A;A,I,C,e,C,C,C;e,G,C,I,C,I,C,I,C,I,C,I,C,Q,C,a,C,O,C,W,C,c,C,M,C,M,C,U,C,S,C,U,C,O,C,Q,C,G,C,K,C,S,C,G,C,Q,C,O,C,Y,C,sB,C,Q,C,Q,C,O,C,a,C,O,C,Y,C,W,C,O,C,O,C,K,C,O,C,S,C,S,C,c,C,O,C,U,C,K,C,qB,C,gB,C,W,C,U,C,O,C,I,C,Y,C,e,C,Q,C,S,C,mB,C,M,C,M,C,M,C,M,C,O,C,W,C,gB,C,U,C,a,C,c,C,e,C,W,C,U,C,Y,C,M,C,Y,C,gB,C,wB,C,K,C,e,C,Q,C,U,C,kB,C,C,gB,C,O,C,Y,C,c,C,W,C,S,C,Q,C,S,C,G,C,G,C,W,C,S,C,a,C,G,C,c,C,K,C,K,C,kB,C,a,C,O,C,S,C,W,C,e,C,Q,C,Q,C,U,C,O,C,M,C,I,C,uB,C,G,C,qB,C,W,C,U,C,G,C,c,C,S,C,e,C,gB,C,O,C,K,C,W,C,K,C,U,C,K,C,U,C,O,C,G,C,S,C,U,C,M,C,O,C,S,C,Q,C,+B,C,W,C,a,C,S,C,W,C,Y,C,M,C,e,C,O,C,Y,C,Q,C,oB,C,gB,C,U,C,K,C,c,C,M,C,W,C,U,C,qB,C,iC,C,4C,C,O,C,Y,C,U,C,W,C,S,C,c,C,Q,C,U,C,qD,C,M,C,Q,C,6C,C,8D,C,K,C,wE,C,6D,C,qF,C,+F,C,uD,C,qE,C,+C,C,M,C,gC,C,gE,C,e,C,Y,C,O,C,qC,C,G,C,gC,C,O,C,G,C,Q,C,M,C,S,C,+B,C,a,C,I,C,qC,C,iB,C,mC,C,+B,C,0F,C,M,C,Q,C,O,C,iB,C,U,C,W,C,K,C,M,C,M,C,I,C,E,C,gB,C,M,C,U,C,a,C,+B,C,e,C,K,C,Y,C,iB,C,Q,C,U,C,gB,C,c,C,U,C,O,C,M,C,K,C,a,C,sC,C,U,C,U,C,U,C,gB,C,G,C,a,C,M,C,a,C,U,C,iB,C,W,C,O,C,oC,C,K,C,S,C,c,C,Y,C,K,C,U,C,Q,C,W,C,M,C,M,C,c,C,S,C,S,C,O,C,K,C,O,C,Q,C,U,C,U,C,O,C,M,C,M,C,wB,C,Y,C,M,C,O,C,O,C,K,C,S,C,M,C,S,C,W,C,c,C,G,C,M,C,G,C,uC,C,a,C,G,C,Y,C,U,C,O,C,O,C,iB,C,I,C,S,C,S,C,U,C,G,C,W,C,I,C,I,C,Q,C,Q,C,Y,C,a,C,W,C,M,C,W,C,mB,C,U,C,Y,C,O,C,U,C,M,C,W,C,W,C,Y,C,M,C,Q,C,S,C,S,C,S,C,S,C,S,C,Q,C,U,C,S,C,Q,C,e,C,iB,C,mB,C,Y,C,e,C,uB,C,W,C,S,C,W,C,U,C,U,C,U,C,U,C,c,C,c,C,Q,C,Y,C,E,C,W,C,C,C,E,C,U,C,gB,C,K,C,kB,C,Q,C,Q,C,M,C,W,C,M,C,4B,C,W,C,e,C,2B,C,2B,C,G,C,I,C,I,C,oB,C,I,C,K,C,uB,C,oB,C,uB,C,mB,C,O,C,K,C,O,C,I,C,U,C,S,C,M,C,U,C,I,C,e,C,oB,C,I,C,uB,C,M,C,I,C,I,C,I,C,I,C,sC,C,K,C,I,C,oB,C,uB,C,K,C,G,C,oB,C,uB,C,G,C,2C,C,K,C,2C,C,I,C,Q,C,M,C,I,C,S,C,uB,C,4B,C,gB,C,I,C,S,C,4B,C,c,C,I,C,a,C,Y,C,G,C,gC,C,uB,C,gC,C,+B,C,0B,C,S,C,2C,C,gC,C,kC,C,S,C,S,C,S,C,e,C,Y,C,Y,C,c,C,gB,C,Q,C,Q,C,U,C,4B,C,M,C,sC,C,Y,C,W,C,Y,C,Q,C,M,C,U,C,M,C,S,C,Q,C,G,C,U,C,Q,C,M,C,M,C,M,C,gC,C,0B,C,kB,C,c,C,S,C,+B,C,+B,C,Q,C,U,C,c,C,M,C,W,C,I,C,I,C,gC,C,O,C,gC,C,M,C,qC,C,Y,C,qC,C,M,C,Q,C,gC,C,O,C,K,C,Q,C,W,C,W,C,U,C,Q,C,K,C,K,C,sC,C,I,C,sD,C,yD,C,oB,C,uB,C,iC,C,K,C,I,C,K,C,I,C,K,C,oB,C,uC,C,O,C,iD,C,S,C,sC,C,W,C,a,C,uC,C,sC,C,O,C,uC,C,iC,C,W,C,K,C,U,C,I,C,gC,C,4B,C,+B,C,U,C,K,C,4B,C,sC,C,Q,C,I,C,I,C,I,C,I,C,+B,C,2C,C,I,C,I,C,I,C,K,C,oB,C,mB,C,K,C,K,C,U,C,K,C,uB,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,oB,C,uB,C,K,C,0C,C,+B,C,M,C,O,C,+B,C,O,C,+B,C,I,C,4B,C,yD,C,+B,C,6B,C,6B,C,W,C,W,C,S,C,iB,C,S,C,Y,C,Q,C,W,C,a,C,gB,C,oC,C,gB,C,wC,C,S,C,Q,C,iC,C,kB,C,M,C,G,C,uC,C,G,C,K,C,gC,C,M,C,qC,C,G,C,M,C,M,C,Y,C,Q,C,C,C,uB,C,K,C,I,C,I,C,oB,C,uB,C,+B,C,K,C,oB,C,oB,C,uB,C,4B,C,oB,C,uB,C,W,C,U,C,a,C,e,C,8B,C,S,C,W,C,iC,C,U,C,oB,C,oB,C,uB,C,gB,C,O,C,Y,C,+B,C,qB,C,wB,C,O,C,O,C,a,C,a,C,a,C,c,C,S,C,oB,C,K,C,I,C,S,C,I,C,I,C,K,C,K,C,G,C,a,C,8B,C,oC,C,Q,C,e,C,uC,C,sB,C,I,C,wB,C,oB,C,uB,C,K,C,E;A;A;A;;;;A;;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,C,Q,C,C,C,Q,C,M,C,C,C,C,I,C,C,C,C;A,C,C,C,C,C,C;A,M,C,M,C,I,C,mB,C,C,C,C,C,C,C,C,I,C,a,C,Q,C,C,C,C,M,C,M,C,U,C,C,C,I,C,U,C,C;A,I,C,C,uB;A,I,C,C,M,C,C,C,E,C,M,C,C,C,C,M,C,M,C,I,C,C;A,I,C,C,Q;A,G,C,I,C,C,C,C,C,C,E,C,C,Q,C,M,C,C,C,G,C,C,C,G,C;A,E,C,C,C,Q,C,E,C,C,C,C,C,C,C,Q,C,C,C;A,I,C,U,C,Q;A,K,C,C,C,C,C;A,I,C,oB,C,I,C,a,C,iB,C;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gB;A"
+  "sources": ["file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/interceptors.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_rti.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_array.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/iterable.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/sort.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_number.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_string.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/regexp_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/isolate_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/queue.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/collection_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/timer.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/native_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/core_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/string_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/constant_map.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/symbol.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/chart.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/logging/logging.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/application.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/change_notifier.dart","file:///Users/turnidge/dart/dart-sdk/lib/js/dart2js/js_dart2js.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/location_manager.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/dart2js/html_dart2js.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/view_model.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/index.html_bootstrap.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/loader.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/breakpoint_list.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/instance.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable_map.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/class_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/class_view.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/uri.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/code_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/code_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/collapsible_content.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/curly_block.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/custom_element/polyfill.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/future.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/lists.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/list.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_mirrors.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/linked_hash_map.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_names.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/async_error.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/schedule_microtask.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/async_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream_controller.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/broadcast_stream_controller.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream_impl.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream_pipe.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/zone.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/internal_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/future_impl.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/hash_map.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/iterable.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/maps.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/collections.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/hash_set.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/list.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/splay_tree.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/convert_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/convert/json.dart","file:///Users/turnidge/dart/dart-sdk/lib/convert/utf.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/comparable.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/errors.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/string.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/exceptions.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/list.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/print.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/annotations.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/bool.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/date_time.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/duration.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/expando.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/null.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/object.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/string_buffer.dart","file:///Users/turnidge/dart/dart-sdk/lib/convert/codec.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/conversions.dart","file:///Users/turnidge/dart/dart-sdk/lib/svg/dart2js/svg_dart2js.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/filtered_element_list.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/isolate_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/jenkins_smi_hash.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/math.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/math_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/point.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/rectangle.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/mirrors_patch.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/collection/src/unmodifiable_wrappers.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/collection/wrappers.dart","file:///Users/turnidge/dart/dart-sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_primitives.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/error_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/eval_box.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/to_observable.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/eval_link.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/field_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/field_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/function_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/service_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/function_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/heap_map.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/heap_profile.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/observatory_element.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/device.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/css_class_set.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/instance_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/instance_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_profile.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_summary.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/json_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/library_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/library_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/nav_bar.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/observatory_application.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/service_html.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/service/object.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/change_record.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/compound_path_observer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/dirty_check.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/list_diff.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable_list.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable_box.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/path_observer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/boot.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/declaration.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/template_binding.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/node_binding.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/job.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/deserialize.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/polymer_expressions.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/tokenizer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/parser.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/eval.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/visitor.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/async.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/expression.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/src/globals.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/src/mirrors.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/response_viewer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/script_inset.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/script_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/script_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/service_error_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/service_exception_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/service_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/sliding_checkbox.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/stack_frame.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/stack_trace.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/input_bindings.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/instance_binding_map.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/template.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/template_iterator.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/input_element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/node.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/select_element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/text.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/text_area_element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/vm_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/vm_view.dart"],
+  "names": ["getInterceptor","makeDispatchRecord","getNativeInterceptor","initNativeDispatch","lookupAndCacheInterceptor","int","map","findInterceptorConstructorForType","findIndexForNativeSubclassType","findConstructorForNativeSubclassType","bool","Primitives","String","dynamic","invocation","Type","getRuntimeTypeString","E","length","IterableMixinWorkaround","Iterable","list","List","_rangeCheck","Lists","_doSort","a","Iterator","iterable","factory","b","isNegative","num","roundToDouble","double","allMatchesInStringUnchecked","Match","string","other","substring","stringReplaceAllUnchecked","pattern","_isWhitespace","regExp","_match","stringContainsUnchecked","static","_callInIsolate","isolate","_globalState","weakPorts","_addRegistration","entry","rootContext","computeThisScriptD8","_deserializeMessage","msg","_add","events","workerIds","_serializeMessage","fillLiteralMap","_log","print","supportsWorkers","_visited","_Manager","isWorker","fromCommandLine","topEventLoop","isolates","managers","mainManager","pauseCapability","pauseTokens","isPaused","_length","delayedEvents","_head","_table","_tail","_grow","_modificationCount","isolateStatics","code","message","addPause","removePause","RawReceivePortImpl","ports","_updateGlobalState","id","_IsolateEvent","dequeue","event","next","runIteration","_runHelper","fn","context","mirrorFunctionCacheName","mirrorInvokeCacheName","replyTo","topLevel","_isolateId","_receivePort","_workerId","_receivePortId","_isClosed","_handler","_id","visitSendPort","port","visitCapability","x","SendPort","Capability","operator","tagged","traverse","isPrimitive","visitPrimitive","_dispatch","visitList","visitMap","visitObject","copy","Map","_nextFreeRefId","_serializeList","result","deserialize","_deserialized","_deserializeHelper","_deserializeList","_deserializeMap","deserializeSendPort","deserializeCapability","deserializeObject","dartList","keys","values","_inEventLoop","_handle","_once","TimerImpl","convertDartClosureToJS","callback","value","match","handleError","digitsPart","source","name","getRuntimeTypeInfo","joinArguments","objectTypeName","array","_current","_fromCharCodeApply","stringFromCodePoints","receiver","positionalArguments","arguments","namedArguments","function","functionNoSuchMethod","info","data","defaultArguments","iae","ioore","wrapException","toStringWrapper","JS","throwExpression","unwrapException","saveStackTrace","nsme","notClosure","nullCall","nullLiteralCall","undefCall","undefLiteralCall","nullProperty","undefProperty","undefLiteralProperty","object","invokeClosure","JS_CALL_IN_ISOLATE","functionCounter","forwardCallTo","functions","forwardInterceptedCallTo","cspForwardCall","computeFieldNamed","selfFieldNameCache","cspForwardInterceptedCall","BoundClosure","closureFromTearOff","Closure","property","interceptedTypeCast","propertyTypeCastError","RuntimeFunctionType","RuntimeType","Object","getRuntimeTypeArguments","substitute","getRuntimeTypeArgument","getTypeArgumentByIndex","type","onTypeVariable","_contents","runtimeTypeToString","invokeOn","areSubtypes","isSubtype","computeSignature","isFunctionSubtype","names","areAssignable","areAssignableMaps","getTagFunction","alternateTagFunction","makeLeafDispatchRecord","patchInteriorProto","makeDefaultDispatchRecord","initNativeDispatchFlag","initNativeDispatchContinue","dispatchRecordsForInstanceTags","interceptorsForUncacheableTags","initHooks","tags","prototypeForTagFunction","applyHooksTransformer","haystack","needle","_nativeRegExp","regexp","Maps","_throwUnmodifiable","V","_jsObject","containsKey","_keys","f","_map","Symbol","_memberName","mangledNames","unmangledName","_kind","_arguments","_namedArgumentNames","_getCachedInvocation","_internalName","symbol","memberName","throwInvalidReflectionError","isIntercepted","cachedInterceptor","jsFunction","interceptor","requiredParameterCount","computeFunctionRti","functionType","setRuntimeTypeInfo","namedArgumentList","matchTypeError","_pattern","_argumentsExpr","_expr","_method","_receiver","_message","JsNoSuchMethodError","_trace","_exception","closure","_self","_target","receiverFieldNameCache","CastErrorImplementation","RuntimeError","_extractFunctionTypeObjectFrom","toRti","returnType","parameterTypes","listToRti","optionalParameterTypes","namedParameters","extractKeys","rti","argument","UnimplementedNoSuchMethodError","_unmangledName","_typeName","get","_nativeGlobalRegExp","makeNative","_nativeAnchoredRegExp","_nativeGlobalVersion","_nativeAnchoredVersion","_execAnchored","_MatchImplementation","_re","_string","_regExp","Logger","_api","Isolate","__$isolate","set","notifyPropertyChangeHelper","ServiceObject","__$response","__$args","locationManager","vm","_onError","_onException","ObservatoryApplication","_initOnce","_chart","props","options","table","__$currentHash","hashChangeEvent","_tryResume","_wrapZone","window","requestCurrentHash","currentHash","parts","_app","_expanded","onShow","onHide","expanded","rows","root","row","_collapse","_librariesToLoad","_useDirtyChecking","i41","ServiceMap","__$msg","notifyPropertyChange","BreakpointListElement","ClassRefElement","__$cls","Future","cls","_uriEncode","ClassViewElement","CodeRefElement","Code","__$code","CodeViewElement","__$iconClass","__$displayValue","_collapsed","_refresh","CollapsibleContentElement","__$expanded","__$busy","__$callback","doneCallback","CurlyBlockElement","js","customElements","_isReady","document","combine","_toStringList","from","otherList","dst","src","_insertionSort","_dualPivotQuicksort","compare","action","elementAt","test","fold","_iterable","_endOrLength","_start","_startIndex","_endIndex","SubListIterable","_index","_f","T","_iterator","_source","_currentExpansion","_takeCount","_remaining","_skipCount","SkipIterable","_name","toString","s","InstanceMirror","TypeMirror","mangledGlobalNames","reflectClassByName","mangledName","JsCache","classMirrors","reflectClassByMangledName","originalDeclaration","referent","fields","superclassName","mixins","reflectMixinApplication","typeVariables","method","ClassMirror","it","ownerClass","findTypeVariableIndex","typeVariable","getTypeArgument","reflectClass","owner","JSArray","splitFields","fieldSpecification","fieldsMetadata","key","_cachedLibraries","librariesByName","library","_splitRe","libraries","_prettyName","_getField","LibraryMirror","currentJsMirrorSystem","_isRoot","computeQualifiedName","simpleName","n","_invoke","DeclarationMirror","_functionMirrors","_cachedClasses","_classes","__functions","__variables","setterSymbol","mirror","reflect","__members","_jsFunction","_cachedFunctionMirrors","_functions","_globalObject","_cachedFields","parseCompactFieldSpecification","_compactFieldSpecification","_cachedFunctions","_cachedGetters","_cachedSetters","_cachedVariables","_fields","_cachedMembers","__classes","__getters","__setters","_cachedDeclarations","_cachedMetadata","_metadata","Function","addToResult","_cachedSimpleName","superclass","mixin","superName","reflectee","_classInvocationCache","reflectiveNames","reflectiveName","cacheEntry","_getterCache","_getFieldSlow","_newProbeFn","_newInterceptedGetterFn","_newGetterFn","objectHashCode","Error","typeArguments","_class","_typeArguments","_cachedTypeArguments","addTypeArgument","_cachedMethods","_cachedConstructors","filterConstructors","_methods","filterMembers","__constructors","JsLibraryMirror","_superclass","typeMirrorFromRuntimeTypeRepresentation","typeInformation","_cachedSuperinterfaces","_mangledName","typeArgument","tv","_jsConstructorOrInterceptor","_jsConstructor","isReflectiveDataInPrototype","reflectionName","_getMethodsWithOwner","_fieldsDescriptor","_fieldsMetadata","_getFieldsWithOwner","_cachedMethodsMap","filterMethods","_owner","reflectType","JsMirrorSystem","extractMetadata","__methods","_getSuperinterfacesWithOwner","_cachedTypeVariables","_type","_metadataFunction","_jsName","isFinal","descriptor","fieldInformation","field","fieldCode","accessorName","MethodMirror","callName","_parameters","metadata","_returnType","_parameterCount","ownerType","isConstructor","optionalParameterCount","parameter","formals","raw","isStatic","isGetter","_setField","isSetter","isOperatorName","metadataList","JsFunctionTypeMirror","_cachedReturnType","_typeData","_cachedParameters","_cachedToString","_throw","errorHandler","zone","_nextCallback","_lastCallback","_asyncRunCallbackLoop","_createTimer","Zone","_previous","_next","notificationHandler","_runUserCode","onSuccess","userCode","onError","subscription","future","_cancelAndErrorClosure","Timer","duration","self","ZoneCallback","ZoneUnaryCallback","ZoneBinaryCallback","_scheduleAsyncCallback","printString","printToZone","_BroadcastStreamController","_eventState","_state","_Future","_doneFuture","previous","_removeListener","_callOnCancel","_addEventError","_sendData","_sendError","_ensureDoneFuture","_sendDone","_addStreamState","addState","_runGuarded","_onCancel","_forEachListener","link","computation","_FutureOnValue","_onValueCallback","_FutureErrorTest","_errorTestCallback","_onErrorCallback","_FutureAction","_whenCompleteActionCallback","_registerErrorHandler","_addListener","_resultOrListeners","_AsyncError","_zone","listener","current","_chainFutures","_removeListeners","_setValue","_propagateToListeners","_setError","_complete","_asyncCompleteError","_asyncComplete","target","internalFuture","asyncError","_propagateMultipleListeners","handleValueCallback","handleWhenCompleteCallback","_completeError","errorCallback","completeResult","Stream","_cancelAndValue","StreamSubscription","_controller","_onListen","otherStream","_onData","_onDone","_pending","_guardCallback","_onPause","lastPendingEvent","_onResume","_cancelFuture","_cancel","_addPending","pending","_checkState","sendError","sendDone","_createSubscription","_BufferingStreamSubscription","dispatch","error","stackTrace","_DelayedEvent","scheduleMicrotask","handleNext","firstPendingEvent","_cancelAndError","sink","_subscription","_stream","_ForwardingStreamSubscription","_handleData","_handleError","_handleDone","_test","_transform","_TakeStream","_SkipStream","_degelationTarget","parent","_errorZone","otherZone","run","handleUncaughtError","runUnary","runBinary","registerCallback","registerUnaryCallback","registerBinaryCallback","copiedMap","HandleUncaughtErrorHandler","RunHandler","RunUnaryHandler","RunBinaryHandler","RegisterCallbackHandler","RegisterUnaryCallbackHandler","RegisterBinaryCallbackHandler","ScheduleMicrotaskHandler","CreateTimerHandler","PrintHandler","ForkHandler","ZoneSpecification","_rootHandleUncaughtError","_rootFork","_rootRun","_rootRunUnary","_rootRunBinary","_rootScheduleMicrotask","_rootCreateTimer","_toStringVisiting","_iterablePartsToStrings","ultimateString","penultimateString","m","_strings","_nums","_rest","_findBucketIndex","_computeHashCode","_computeKeys","_newHashTable","_addHashTableEntry","_setTableEntry","_removeHashTableEntry","_getTableEntry","_validKey","_hashCode","_equals","_CustomHashMap","K","_offset","cell","_newLinkedCell","ifAbsent","_unlinkCell","_last","_first","_modifications","LinkedHashMapCell","last","_LinkedCustomHashMap","_cell","_computeElements","bucket","_elements","add","element","_set","LinkedHashSetCell","iterator","buffer","isEmpty","_iterableToString","setRange","setAll","queue","_writeToList","_nextPowerOf2","_remove","ListQueue","_queue","_position","_end","_root","_dummy","_compare","tmp","right","left","_splayCount","_SplayTreeNode","_splay","_count","_splayMax","node","_comparator","mapRoot","_addNewRoot","tree","nodes","visit","SplayTreeMap","_currentNode","_getValue","_workList","_tree","_findLeftMostDescendent","currentNode","_SplayTreeIterator","_convertJsonToDart","revive","walk","_parseJson","cause","JsonUnsupportedObjectError","JsonCyclicError","_reviver","decoder","_JsonStringifier","_toEncodableFunction","encoder","JsonEncoder","JsonDecoder","seen","stringifyJsonValue","toEncodable","escape","checkCycle","stringifyValue","stringifier","charCodes","sb","Converter","_buffer","_bufferIndex","str","_writeSurrogate","fixedList","expires","millisecondsSinceEpoch","isUtc","lazyAsJsDate","fourDigits","twoDigits","threeDigits","DateTime","re","parseIntOrZero","parseDoubleOrZero","Duration","_duration","inMinutes","inSeconds","sixDigits","inMicroseconds","StackTrace","ArgumentError","RangeError","FallThroughError","_namedArguments","NoSuchMethodError","UnsupportedError","UnimplementedError","StateError","modifiedObject","ConcurrentModificationError","variableName","CyclicInitializationError","_getKey","_keyCount","_currentCodePoint","_nextPosition","objects","write","StringBuffer","host","_writeAuthority","_host","_port","scheme","_normalize","pathSegments","base","path","_hasDotSegments","output","userInfo","ss","_path","query","fragment","uri","Uri","_makePath","_makeScheme","_eitherOf","_parseIntOrZero","_makeHost","_makeQuery","_makeFragment","parseIPv6Address","isSchemeLowerCharacter","isSchemeCharacter","queryParameters","component","decodeHexDigitPair","isNormalizedHexDigit","isUnreserved","fillResult","normalizeHexDigit","bytes","parseHex","parseIPv4Address","canonicalTable","byteToHex","_schemeLowerTable","_schemeTable","_unreservedTable","isLowerCaseHexDigit","part","hex","Device","request","xhr","loadEvent","errorEvent","completer","_createElement","e","WindowBase","_DOMWindowCrossFrame","EventTarget","_convertNativeToDart_XHR_Response","convertNativeToDart_AcceptStructuredClone","_callConstructor","_callEnteredView","_callLeftView","_callAttributeChanged","_ElementFactoryProvider","_wrapBinaryZone","CanvasRenderingContext2D","_putImageData_2","convertDartToNative_ImageData","_dartDetail","DocumentFragment","Element","Node","ElementList","_querySelectorAll","querySelector","_docChildren","children","CssClassSet","Rectangle","clientLeft","clientTop","clientWidth","clientHeight","offsetLeft","offsetTop","offsetWidth","offsetHeight","_localName","elem","ShadowRoot","ElementEvents","ElementStream","changeEvent","clickEvent","inputEvent","mouseMoveEvent","_convertNativeToDart_EventTarget","Events","_initMouseEvent_1","_convertDartToNative_EventTarget","Point","_clientX","_clientY","point","override","_call","parentNode","_this","nodeValue","_rows","Location","_isDartLocation","_location_wrapper","_ensureRequestAnimationFrame","_convertNativeToDart_Window","_postMessage_2","_convertDartToNative_PrepareForStructuredClone","top","width","height","SpeechInputResult","SpeechRecognitionResult","_childElements","_element","toList","_nodeList","_elementList","_FrozenElementList","_ptr","webkitEvents","responseText","OptionElement","remove","attributes","_matches","Set","_elementCssClassSetIterable","_elementIterable","modify","_modifyWithReturnValue","_MultiElementCssClassSet","prevValue","classname","_eventType","_targetList","_useCapture","pool","_unlisten","_pauseCount","_subscriptions","stream","_StreamPool","close","_eventTypeGetter","_list","_array","_createSafe","_window","_cssClassSet","_childNodes","_convertDartFunction","_callDartFunction","_convertToJS","_toMangledNames","o","_getJsProxy","_getOwnProperty","createProxy","_defineProperty","_wrapToDart","JsObject","_getDartProxy","_convertToDart","args","_convertDataTree","_convert","_convertedObjects","convertedList","_checkRange","index","callMethod","_lo","_hi","_nextState","_Random","y","finish","currentMirrorSystem","_base","abstract","_invalidIndex","_checkIndex","_checkSublistArguments","_setRangeFast","__$error","ErrorViewElement","__$text","__$lineMode","evalType","ObservableList","__$results","text","_toObservableDeep","results","targetElement","EvalBoxElement","__$expr","__$result","EvalLinkElement","FieldRefElement","__$field","FieldViewElement","__$qualified","__$ref","refMap","__$hasParent","__$hasClass","FunctionRefElement","__$function","__$qualifiedName","__$kind","_getQualifiedName","FunctionViewElement","PixelReference","_data","_dataIndex","__$status","__$fragmentation","shadowRoot","_fragmentationCanvas","_handleMouseMove","_classIdToName","_classIdToColor","_colorToClassId","_packColor","classList","member","rng","_addClass","_fragmentationData","_pageHeight","fragmentation","pages","_addressAt","_updateClassList","convertNativeToDart_ImageData","_createImageData_1","_renderPages","HeapMapElement","_updateFragmentationData","__$profile","GoogleChart","_fullChart","_newPieChart","_oldPieChart","_combinedChart","_draw","profile","_fullDataTable","_combinedDataTable","_classHasNoAllocations","_fullTableColumnValue","_combinedTableColumnValue","_newPieDataTable","heap","_oldPieDataTable","v","_updateChartData","formattedAverage","formattedTotalCollectionTime","formattedCollections","HeapProfileElement","cleanupSlots","ImageData","nativeImageData","imageData","userAgent","_isOpera","isOpera","_isWebKit","copies","readSlot","writeSlot","date","findSlot","readClasses","writeClasses","_filtered","removeRange","el","ref","expandEvent","done","InstanceRefElement","__$instance","instance","InstanceViewElement","childNode","ProfileCodeTrieNodeTreeRow","columns","formatPercent","percent","codeCaller","ProfileCallerTreeRow","__$callGraphChecked","__$hideTagsChecked","__$sampleCount","__$refreshTime","__$sampleRate","__$sampleDepth","__$displayCutoff","totalSamples","now","displayThreshold","_update","refresh","_buildCallersTree","_buildStackTree","colors","IsolateProfileElement","IsolateRefElement","IsolateSummaryElement","tagProfile","percentage","_updateTimer","_updateTagProfile","tagProfileChart","IsolateViewElement","__$json","json","JsonViewElement","LibraryRefElement","__$library","LibraryViewElement","Level","_level","_rootLevel","_getStream","level","fullName","LogRecord","log","_loggers","loggerName","main","c","rec","initPolymer","NavBarElement","__$link","__$anchor","__$last","NavMenuElement","NavMenuItemElement","__$active","__$label","refreshDone","NavRefreshElement","TopNavMenuElement","IsolateNavMenuElement","LibraryNavMenuElement","ClassNavMenuElement","__$devtools","__$app","ObservatoryApplicationElement","_zeroPad","frame","file","ObservatoryElement","_changes","observed","unobserved","_records","hasObservers","deliverChanges","oldValue","newValue","_observers","_value","_started","_scheduleResolve","_subs","observer","_resolve","_scheduled","_computeValue","sub","start","_delivering","_allObservables","toCheck","debugLoop","_logger","_allObservablesCount","enqueueDirtyCheck","dirtyCheckObservables","wrapCallback","wrapUnaryCallback","distances","old","math","edits","arr1","arr2","_sharedPrefix","_sharedSuffix","splice","_spliceOperationsFromEditDistances","_calcEditDistances","ops","splices","record","_unmodifiableRemoved","_addedCount","removed","_mergeSplice","records","_createInitialSplices","calcSplices","obj","_mirror","_values","_listChanges","_recordChange","_notifyChangeLength","_listRecords","deliverListChanges","projectListSplices","isInsert","isRemove","notifyChange","_getObjectProperty","_maybeHasGetter","_hasMethod","_maybeHasSetter","_safeSuperclass","validate","_pathRegExp","_isValid","_updateValues","_segments","_setObjectProperty","_observePath","_observeIndex","PathObserver","computeValue","_isPathValid","_updateObservedValues","_changeRecordMatches","_preventFlashOfUnstyledContent","style","head","_veilElements","Polymer","_ready","_waitSuper","w","_getPublishedProperties","meta","_hasSetter","getter","platform","shadowCss","sheet","jsSheet","_sheetLog","_typesByName","_waitType","waiting","_forNodeTree","child","attr","originalPrepareBinding","_shadowHost","_findMethod","receiverMirror","scope","_requestAnimationFrame","_getCoreType","dirtyCheckZoneSpec","dirtyCheckZone","_initPolymerOptimized","_registerCustomElement","_loadLibraries","customElementsReady","_loadLibrary","_discoverScripts","scripts","_rootUri","reference","_removeDotSegments","_merge","uriPath","_loaderLog","lib","_maybeInvoke","PolymerDeclaration","_super","templateBind","nodeBindFallback","waitingForType","waitingForExtendee","_supertype","_declarations","publishAttributes","_publish","_publishLC","_lowerCaseMap","inferObservers","accumulateInstanceAttributes","addAttributeDelegates","_eventDelegates","cacheSheets","cacheStyles","installLocalSheets","cssTextToScopeStyle","cssTextForScope","_shimShadowDomStyling","templateContent","registered","registerType","_notifySuper","extendee","decl","superDecl","attrs","_getProperty","_instanceAttributes","findNodes","_sheets","_styles","_cssTextFromSheet","content","sheets","styles","StyleElement","_observe","properties","registerWhenReady","blackList","delegates","matcher","MirrorSystem","_eventTranslations","prepareElement","localName","_declaration","observeProperties","copyInstanceAttributes","takeAttributes","addHostListeners","_preparingElements","parseDeclarations","cancelUnbindAll","asyncUnbindAll","declaration","parseDeclaration","elementElement","lightFromTemplate","shadowFromTemplate","_shadowRoots","syntax","append","marshalNodeReferences","createShadowRoot","applyAuthorStyles","$","attributeToProperty","propertyForAttribute","_inferPropertyType","publishLC","serializeValue","NodeBinding","_bindLog","inA","reflectPropertyToAttribute","bindings","_unbound","_unbindLog","_unbindAllJob","unbindAll","job","_timer","complete","_propertyObserver","unregisterObservers","_unbindNodeTree","observe","observeArrayValue","changes","notifyPropertyChanges","valuePairs","_observeLog","unregisterObserver","_eventsLog","addNodeListeners","hostEventListener","_reverseEventTranslations","dispatchMethod","_invokeMethod","nodeBind","publish","pair","_findController","ctrlr","p","isOptional","_node","_sub","_lastValue","_property","_observer","_PolymerBinding","_propertyValueChanged","PolymerElement","polymerCreated","stop","_callback","_typeHandlers","handler","JSON","def","prepareBinding","_tokenizer","_tokens","_advance","_parseExpression","isSemanticTemplate","prepareInstanceModel","globals","_converter","assign","_scope","_Binding","expr","vars","StreamBinding","op","filters","ident","notAssignable","l","eval","__modelMirror","model","_variables","getMemberMirror","_modelMirror","memberMirror","update","_updateSelf","_invalidate","_parent","visitExpression","visitInExpression","visitEmptyExpression","visitParenthesizedExpression","visitGetter","g","visitIndex","i","arg","visitInvoke","visitLiteral","visitMapLiteral","visitMapLiteralEntry","visitIdentifier","visitBinaryOperator","visitUnaryOperator","invoke","accept","entries","_UNARY_OPERATORS","_BINARY_OPERATORS","receiverValue","identifier","call","EvalException","_JenkinsSmiHash","Index","Invoke","_listEquals","_hashList","entryValue","item","_token","Expression","_astFactory","_parseUnary","_parsePrecedence","_parseArguments","_parseIndex","_makeInvokeOrGetter","_parseBinary","_parsePrimary","_parseInvokeOrIdentifier","_parseString","_parseInteger","_parseDecimal","_parseMapLiteral","MapLiteral","Literal","IndexedValue","Mirror","classMirror","kind","tokenizeString","tokenizeIdentifierOrKeyword","tokenizeNumber","tokenizeFraction","_OPERATORS","_TWO_CHAR_OPS","_PRECEDENCE","_GROUPERS","_sb","_KEYWORDS","ParseException","ResponseViewerElement","Script","__$script","__$pos","__$lines","_updateProperties","script","lines","ScriptInsetElement","ScriptRefElement","__$showCoverage","showCoverageChanged","line","ScriptViewElement","_upgradeObservableMap","_upgradeObservableList","ServiceObjectOwner","VM","_serviceType","_loaded","__$name","__$vmName","reload","immutable","_inProgressReload","_isolateCache","__$version","__$architecture","__$uptime","_currentObjectMatcher","_currentIsolateMatcher","_parseIsolateId","_parseObjectId","_getIsolate","_cache","getAsMap","getString","_updateIsolates","isolateMap","oldIsolateCache","newIsolateCache","_isServiceMap","errors","ServiceError","exceptions","ServiceException","_sum","counters","old_counters","_seconds","_countersLength","_historySize","snapshots","snapshot","_maxSnapshot","__$pausedOnStart","__$pausedOnExit","__$running","__$idle","codeTable","codeRegion","_resetProfileData","_updateProfileData","profileTrieRoot","_processProfileTrie","_processCoverage","coverageList","coverage","__$rootLib","ObservableMap","__$topFrame","__$mainPort","__$entry","__$newHeapUsed","__$oldHeapUsed","__$newHeapCapacity","__$oldHeapCapacity","__$fileAndLine","DartError","_upgradeCollection","timers","timerMap","CodeTrieNode","_trieDataCursor","_trieData","_readTrieNode","__$totalSamplesInProfile","exclusiveTicks","inclusiveTicks","__$formattedInclusiveTicks","__$formattedExclusiveTicks","callers","callees","addressTicks","scriptCoverage","timer","canCache","__$message","__$exception","__$stacktrace","_tokenToLine","_url","_shortUrl","_processSource","_parseTokenPosTable","_tokenToCol","load","hits","scriptHits","sourceLines","address","tick","CodeKind","__$objectPool","calls","codes","profileData","_resolveCalls","_processTicks","vmName","startAddress","endAddress","_processDisassembly","instructions","__$hasDisassembly","disassembly","profileTicks","_sumCallCount","_callCount","caller","count","ServiceErrorViewElement","ServiceExceptionViewElement","HttpRequest","HttpVM","_outstandingRequests","_requestSerial","DartiumVM","messageEvent","_messageHandler","__$object","objectChanged","_constructElementForObject","ServiceObjectViewElement","__$internal","url","hoverText","ServiceRefElement","__$checked","__$checkedText","__$uncheckedText","input","SlidingCheckboxElement","__$frame","StackFrameElement","__$trace","trace","StackTraceElement","_checkboxEventType","_InstanceBindingMap","_getBindings","_SEMANTIC_TEMPLATE_TAGS","_createInstanceBindingMap","templateBindFallback","_processBindings","_addMapBindings","_getTreeScope","_parseAttributeBindings","_parseMustaches","tokens","delegateFn","bound","_MustacheTokens","delegate","NodeBindExtension","_expando","_eventSub","_getStreamForInputType","nodeValueChanged","conditional","select","selectBinding","div","checkbox","fired","InputElement","_getAssociatedRadioButtons","checkedBinding","treeScope","radios","SelectElement","_cancelMutationObserver","_tryUpdateValue","_onMutation","_toInt","_bindings","binding","TemplateBindExtension","_scheduleIterator","_stagingDocument","_ownerStagingDocument","_deepCloneIgnoreTemplateContent","_addTemplateInstanceRecord","_model","BindingDelegate","_bindingDelegate","_decorate","_templateInstanceRef","_content","_templateIsDecorated","_injectStylesheet","_extractTemplateFromAttributeTemplate","templateElementExt","doc","_getOrCreateTemplateContentsOwner","_liftNonNativeChildrenIntoContent","bootstrap","stagingDocument","clone","template","_contentsOwner","d","_bootstrap","descendents","_initStyles","_ext","_combinator","_singleCombinator","_listCombinator","resolve","depsChanging","_valueSub","hasRepeat","hasBind","_valueChanged","repeatModel","bindModel","repeatPath","bindPath","hasIf","ifModel","ifPath","valueObserver","iteratedValue","unobserve","_listSub","_handleSplices","_templateExt","terminators","subIter","getTerminatorAt","instanceNodes","_templateElement","previousTerminator","_BoundNodes","closed","_initPrepareFunctions","_instanceModelFn","_instancePositionChangedFn","instanceCache","extractInstanceAt","insertInstanceAt","closeInstanceBindings","valueFn","r","unbind","TextAreaElement","_pathSub","valueChanged","VMRefElement","__$vm","VMViewElement","globalThis","globalWindow","globalWorker","globalPostMessageDefined","thisScript","computeThisScript","noSuchMethodPattern","extractPattern","provokeCallErrorOn","notClosurePattern","nullCallPattern","nullLiteralCallPattern","undefinedCallPattern","undefinedLiteralCallPattern","nullPropertyPattern","provokePropertyErrorOn","nullLiteralPropertyPattern","undefinedPropertyPattern","undefinedLiteralPropertyPattern","validationPattern","_dynamicType","_voidType","computeLibrariesByName","computeMangledNames","computeReflectiveNames","_safeConsole","_DART_OBJECT_PROPERTY_NAME","_DART_CLOSURE_PROPERTY_NAME","_freeColor","_pageSeparationColor","objectType","_spacesRegExp","_objectType","bindPattern","_polymerSyntax","veiledElements","_libs","_allTemplatesSelectors"],
+  "mappings": "A;A,a,kB;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,C,I,C,Y,C,C,G,C,a,C,G,C,oB,C,G,C,Y,C,G,C,Q,C,G,C,iB,C,G,C,Q,C,G,C,U,C,G,C,c,C,G,C,a,C,G,C,gB,C,G,C,S,C,G,C,kB,C,G,C,a,C,G,C,iB,C,E,C,M,C,G,C,iB,C,G,C,iB,C,G,C,M,C,G,C,U,C,G,C,S,C,G,C,O,C,G,C,gB,C,G,C,kB,C,G,C,c,C,G,C,S,C,G,C,G,C,G,C,S,C,G,C,qB,C,G,C,O,C,G,C,Q,C,G,C,gB,C,G,C,a,C,G,C,gB,C,G,C,Y,C,G,C,Y,C,G,C,gB,C,G,C,kB,C,G,C,Q,C,G,C,kB,C,G,C,Y,C,G,C,c,C,E,C,O,C,G,C,W,C,G,C,a,C,G,C,Y,C,G,C,U,C,G,C,W,C,G,C,kB,C,G,C,M,C,G,C,S,C,G,C,W,C,G,C,M,C,G,C,O,C,G,C,S,C,G,C,gB,C,G,C,U,C,G,C,Y,C,G,C,W,C,G,C,W,C,G,C,S,C,G,C,U,C,G,C,M,C,G,C,Q,C,G,C,kB,C,G,C,c,C,G,C,a,C,G,C,e,C,G,C,S,C,G,C,iB,C,E,C,G,C,G,C,S,C,G,C,M,C,E,C,G,C,G,C,oB,C,G,C,a,C,G,C,S,C,G,C,a,C,G,C,iB,C,G,C,gB,C,G,C,S,C,G,C,S,C,G,C,gB,C,G,C,sB,C,G,C,kB,C,G,C,Y,C,G,C,U,C,G,C,Q,C,G,C,S,C,G,C,a,C,G,C,Y,C,G,C,Q,C,G,C,Q,C,G,C,gB,C,G,C,Q,C,G,C,U,C,G,C,c,C,G,C,W,C,G,C,a,C,G,C,S,C,G,C,Y,C,G,C,W,C,G,C,Y,C,G,C,Y,C,G,C,K,C,G,C,c,C,G,C,iB,C,G,C,a,C,G,C,Q,C,G,C,M,C,G,C,Q,C,G,C,c,C,G,C,M,C,G,C,O,C,G,C,c,C,G,C,c,C,G,C,U,C,G,C,U,C,G,C,Y,C,G,C,O,C,G,C,I,C,G,C,a,C,G,C,c,C,G,C,oB,C,C,I,C,kB,C,C,E,C,yB,C,E,C,qB,C,E,C,iB,C,E,C,kB,C,G,C,yB,C,E,C,c,C,G,C,oB,C,E,C,gB,C,G,C,0B,C,E,C,kB,C,E,C,yB,C,E,C,sB,C,E,C,Y,C,E,C,qB,C,E,C,a,C,E,C,oB,C,E,C,e,C,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A,E,mB,uB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,O,C,C,A,E,iB,qB,A,A,C,C,C,C;A,G,C,E,C;A,C,C,CAuDAA,YAOE,cACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAUAC,kBAiCE,+BAEF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAWAC;;0BAKMC;kCAKO;UAEW;UACD;;SAGjB;gBASM,KAAA,+CAIQC;WAEhB,WAGF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CA2BAC;;WACqD;GAEnD;MAAwBC,sBAAF,AAAJ;GACP,MAAGA,MACV,SAEJ,AACA,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC;EACcC;WACO;;;EAEF;8BAAjB;MAAOF,MACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQAG;EACcD;WACO;;;EAEY;8BAE/B;MAFqBF,SAGvB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CA2DEI,cAAwB,aAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEjDL,YAAiB,MAAGM,SAA+B,A,C;A,E,C,CAEnDC,YAAkB,MAAGD,SAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEpDE,mBACQ,KAAA,OAEFC,QACAA,QACAA,eACN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAC,YAAqB,gBChEPC,cDgE8B,A,C;A,K,C,I,C;A,G,C,4I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAU5CJ,YAAkB,iBAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAIrDP,YAAiB,uBAA2C,A,C;A,G,CAE5DU,YAAqB,YAAO,A,C;A,O,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CAa5BL,cAAwB,eAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGjDE,YAAkB,aAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAE3BP,YAAiB,SAAI,A,C;A,G,CAErBU,YAAqB,YAAO,A,C,C;A,G,C,C;A,G,C,K,C;A,G,CAwC5BV,YAAiB,SAAI,A,C;A,G,CAErBU,YAAqB,YAAW,A,C,C;A,E,C,C;A,G,C,M,C,C;A,E,C,C;A,G,C,M,C,C;A,C,C,C;A,G,C,U,C;A,C,C,CEnRhC,uCAJU;UAOV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAE,iBAEY,KAAa,GAAGC;yBAXlB,gBAeR;wBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,mBAEY,KAAa,EAAEA;yBApBjB;gBAyBV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA,yCA3BU,iBA6BRC;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAaAT;yBA3CU,cA6CR;QAAkB,EAAE,gBACN,KAAR,sBAEF;SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYAU,cACE,kCACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMA,mBACE;MAAA,QAAA,OACE,SADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,YACEF,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,cACE,MAAOC,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC,cACE,uCACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAR;EACsB;;mBACpB;QAAkB,EAAE,oBACL;uBAAbS;OACF,AACA,iBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAUAD,cACE,MC6xBO,qBD5xBT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA0BAH,uDACE;MAAO,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAK;GAGY,KAAa,EAAEJ,cACjB,KAAA,SAA+BA;aAG/BA;;GAGE,KAAe,EAAEA,cACjB,KAAA,SAAiCA,oBAGzB,2BAClB;sCAEF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAE,gBC0xBEG,WDzxBA;MC2xBO,kBD1xBT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CAEAN,eACa,AAAPC,WAAY,MAAO;mCAEzB,A,C;A,G,CAEAD,kBACMC;GAAO,IAAK,MAAO,GAAY;mCAErC,A,C;A,E,C,CAQA;yBAlLU;EAoLa;;GACX,UAAa,cACf,KAAA;;GAEA,UAAe,cACf,KAAA;oCAERM;aAI0B;oCAC1B;UAA6B,GAAO,MACtC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,+CAzMU,iBA2MRL;gBACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAYAT,cAA4B,MAAGS,WAAoC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMnE,yCA9NU,YE9CRM;SAAuB,AAATC,cF+QhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAMArB,gBACE,MCosBOmB,YAAoCH,UDnsB7C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAhB,gBACE,MCqsBOmB,UADgC,AAAZH,YDnsB7B,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAX,mBACE;QAAkB,EAAEQ,gBACN,KAAR,QAAkB,QACxB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAR,YAAiB,MAAGQ,cAAW,A,C;A,G,CAE/BR,YAAoB,MAAG,AAFHQ,cAEW,A,C;A,E,C,CAE/BN,YAAkB,MAAGO,iBAAwD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAE7EG;KAEI;;mBAEA;UAEJ,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,CAIAK,YAAyB,uBCjCaC,8BDiCe,A,C;A,G,CAErDvB,YAAiB,MAAGM,SAA+B,A,C;A,E,CAEnDN,YAAe,gBAAoC,A,C;A,E,CAEnD;GAEgB;yBAxQN;WA2QV,A,C;A,C,C,CAEAY;GAEY,GAAGC,UAAgB,SAAW,KAAA,OACxC;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,2CAzRU;;GA4RE,GAAGA,UAAgB;OAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,O,C,I,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAvVAW;2CAGkC,SACxB,KAAA;;mBAER;SACF,A,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C,C;A,C,C,C;A,G,C,S,C;A,E,C,CGVAxB;;GAEW,IACP;QACc,IACd;2BAGqByB;GACfC,gBAA2B;GAC3BA,YAAY,QAChB;SAEF,8BAEID,YACF,QAEF;cAEA,SAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEApB,YAAoB,aAA4B,AAAR,MAAmB,IAAG,A,C;A,G,CAE9DA,YAAe,gBAAgC,A,C;A,G,CAO/CA,YAAkB,mBAAmC,A,C;A,E,C,CAErDsB,cAGE,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASA3B;GACW,gBAAsB,cAC7B;kBA0B8B,8BAvB9B;gBAGI,KAAA,WACR,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKAA,YAAY,MAAG4B,SAAAA,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMtCC,eACW,IACP;KAEA,qBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAmBAtB;GAG2C,UACjC,KAAA;;UAGSmB,YAAY,WAC7B;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA8BAnB,iBAEY,KAAa,UAAY,KAAA,QACnC;qBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAA,4BAEI;KAEA,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAP,YAAiB,oBAAoC,A,C;A,C,C,CAErD2B,YAAiB,SAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE1CA,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA;;;SAImB;GACN,IAAK;GACU,IACxB,MAAc;KAEd,MAAc,KAElB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAIAA,uCAE6C,OAAe,OACxD;6CAEA;MAYK,eAVT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA,cACE,sBAEM,aACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAYAA,iBAE4B,0BAC1B;uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA,cAGE,uBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA;GAG4B;GAKE;OAMwB;WAVpD,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA;GAC8B;OAMwB;WANpD,SAOF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAmBAA,2DAEE;gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAOAA,0CAC2B,KAAA,OACzB;gBACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAtB,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,M,C,I,C;A,M,C,C,G,C,S,C,C,C;A,E,C,C;A,G,C,Q,C;A,G,CA4EAK,YAAqB,YAAM,A,C;A,S,C,I,C;A,M,C,I,C;A,M,C,I,C,C;A,E,C,C;A,G,C,W,C;A,G,CAO3BA,YAAqB,YAAS,A,C;A,S,C,I,C;A,M,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,K,C,C;A,C,C,C;A,G,C,Y,C;A,C,C,CC1X9BV,6DAC2B,KAAA;GACf,SAAW,KAAA;GACX,GAAGa,cAAc,KAAA,OAC3B;uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAE,cAEE,MAAOe,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC;GACY,KAAa,EAAEC,cACjB,KAAA,SAA+BA;EAE3B;EAAcA;GAAF,AAAd,MAA+B,MAEzC;QAAkB,WACY;GAjBpB,SAAW;GACX,UAAiB;;GAAjB,UAAiB;GAgBQ,oBAC/B,OAEJ,AACA,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,C,C,CAEAzB,0CAC8B,KAAA,OAC5B;WACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAF;EAEoB4B;EACApB;GAAF,IAAU,QAC1B;WAAgBqB,UAAiB,KACnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA3B,gBAEE,MAAO4B,aACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAiBAlB,cAGI,kBAOJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAZ;GAEyB,EAAE,cACjB,KAAA,SAA+B;0BAKhB,EADH4B;GAEL,EAAEpB,SAAQ,QACvB;4BAEF,MAA0C,AAAnCuB,mBACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA7B;+CC27BQ;aDz7B2BM;+CCy7B3B;;GDv7BS,cAAY,KAAA;GACZ,cAAkB,KAAA;GACpB,OAAEA,eAAc,KAAA,OAC7B;wBACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAN,YACE,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAmEAA,yBAKE;MAAoB,aAAF,SAtKR;;mBA0KJ8B;WAKN,SAC+B,QAK/B;kBAC0C;GAvLhC;GACA;;mBAyLJA,oBAKN,gBACgD,QAChD;wBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMArC;;GAGY,KAAa,EAAE,cACjB,KAAA,SAA+B;uBAGrC;;+CEjBGsC,SFsBH;kBE5EkCC,WF8EpC,MAAyB,aAAH,YACe,AAA/BH,kBAAwC,QAC9C,AACA;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEApC;EAGYa;0BAQIoB;;EAAe;GAAF,AAAf,QACY,GAEtB;;GAEF;;KAAsB;GACe,AAA/BG,kBAAwC,aAC9C,AACA,SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/B;GAEmC,EAAE,cAC3B,KAAA,SAAoC,UAE5C;MAAOmC,aACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,E,C,C,C,C,C;A,G,CAEAnC,YAAiB,MAAGQ,cAAW,A,C;A,G,CAE/BR,YAAoB,MAAG,AAFHQ,cAEW,A,C;A,E,C,CAE/Bb;;;eAEE;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAO,YAAkB,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAQzBP,qBAIE;MAAoBa,iBAAF,WACE,UAAQ;EACR,UAAQ,GAAuB,AAAA,CAAR;QAE3C,EACkB,UAAQ,GAAuB,AAAA,CAAR;QAEzC;MAAkB,WAAQ,GAAuB,AAAA,CAAR,kBAC3C,A,C;A,G,CAEAH,YAAqB,YAAS,A,C;A,E,CAE9BV,YAAe,gBAA+B,A,C;A,C,C,CAE9CO;GAEY,GAAGM,UAAgB,SAAW,KAAA,OACxC;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,S,C,I,C;A,M,C,C,E,C,CA/KA4B,eAGe,iFAUP;QAEA,mNAuBF;QAEA,UAEN,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C,A,E,mB,uB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CGnJFC,oBACeC,SACbC,AAAAA;wBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAcA;;;;GAIMA,yBAAuB;;EA8KZA,IAAAA;KAA0B;EAGE;EAGhB;;2BAQQ,aAML,0BAiF5BC;QACAC;SAlRFF;qBAMAA;;;EAEIG;KACFC;OACSD;KACTC;KAEAA,UAEFJ,AAAAA,yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6ZEH;GAEoB,QAChB;mEAEmB,MAAOQ;yDACF,qBAC1B;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAMAR;;;gBAa6B,KAAA;GAaf,QAAS;;GAOT,QAAS;KAEf,KAAA,0CACR,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAaAA;EACYS;;OACFC,8BAEJP,oBAAgCO;EACVA;UAEhBP;EAEKO;EACGD,KAAoBC;EACjBA;EACHD,KAAoBC;;EA5UzBP,IAAAA;KAA0B;EAGE;EAGhB;;2BAQQ,aAML,0BAiF5BC;QACAC;SC0NwBM,AD/LxBC,AA6MIT;2EASAA;qBACAA,AAAAA;;;qBAGaO;EAAqBA;EACrBA;EAAaA;EACbA;EAAmBA;;;;;EAqLrBP,IAAAA;KAA0B,GAEzCU;eACAV,AAAAA;;cACuCW,KFm6BlCC,yCE55BUD,uBAEJA,yCF05BwB;;iBEvlCtB,AAFOJ,oBAGdA,KAAAA,cAAiBA,aAEnBP,AAAAA;;;YAGAA,AAAAA,yBAA6BU;aAE7BV,AAAAA;;;UAGAa,KAAKN;;eAGDP,4BACFA;EACIW,KFukCLC,iCAA8B,gCExkC7BZ;;yBAGAc,KAAMP;;iBAIFA,KAAAA;UAEZ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGAV;GACMG,4BACFA;EACIW,KFyjCDC,+BAA8B,gCE1jCjCZ;;4DAGA;;KAGQ,KAAA,UAGZ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA0VFW;GA9yByBI,kDAk0BKC;mBAlB1B;MAAO,oCA8CeA;mBA5CtB;MAAO,UAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAV,eAvzByBS,yBAyzBrB,MAAO;KAGP,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAkMElB,YACE,+EACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6FAA,YACE,+EACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAxrCmB,WAAKM,kBAAW,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEhB,WAAKA,uBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,4C,C;A,E,CA8GzCc;;;gBAeEC;;QAFoC,SAIgB;SADpDH;SAEAI;WAAsC,EAhBtCC;iBA4KkC,kBA3KlCC;QAAW,8BACXC;QAAW;GACPJ,0BACFK;;;;yCAGJ,A,C,C;A,E,C,C;A,G,C,mC,C;A,E,C,CAoEA,iBACsB,CAAA,AAAhBC,eAAqC;GACrCC,AAAAA,gBAA2B,CAACC,QAC9BA,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;GACM,CAACA,QAAU;EACfD,OAAAA;;GEunCkBE,UFrnChB,MAAMC,UP+DU3D,SAEG,sBOjEb2D;EACkBA;EA+F1BnB,AA9FIT;EC4RK6B;EAAcC;EAAAA;EAAH,CAAA,AAAL,IAAsB,QAArCD;;mBAAuBC,SACvBA;;OACaC,KAAOC,MACpBC;KAAkB,AAAlBA,OD9RE,AACAP,YAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA9D;EACYoC,mBACVA;;EAauBkC;;MATZC,mBAETnC;GACQ,UAMakC,QAJvB,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMA;OACUE,sBAEJC,QAASD,SAAYA;;aAGrBE,QAAYF;;QAGZtB,iCAEN,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAyB,YAAsC,MAAGC,AAAAA,gBAAa,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEtD,oBACMA;GAAAA,aACI,KAAA,sDAERA;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBAC,iBAE0BC;GADY,AAAnB,AE8LDf,AF9LZa,WE+iCYb,AF/iCG1B,aACjBD,AAAAA;KAEAA,AAAAA,4BAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CAyBA2C;EACMlC;EC8CcoB;OAASE,KD9CP,MCkMpBE;KAAkB,AAAlBA;EACWH;;cAAAA;EAAAA,IACXA;SACAD;KAAoB,CAAA,AAAL,IAAsB,QDpMrC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAmBApE;EACgBmF;eAjBe,AAAzB5C,2BACGA,AAAAA,uBAAkCA,AAAAA,yBAClCA,0BEyJW2B,AFxJX3B,AAAAA,mCAQC;;GApKJkB,WEoTcS,AFnTXN,aACAD,AAAAA,eACLG;EAAwBZ,KFi8CrBC,yBAA8B,gCEj8CjCW;;oBA2KA,SAEFsB,MACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMA,cACmB,aAMfC;KAGA,KAAOC,YAAiB,CAE5B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKA;GACM,AAAC/C,yBACHgD;SAGEA,qBADF;;;EAGEhD;EAAqCW,KFovCpCC,kDAA8B,gCEpvC/BZ;;qBAIN,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAzBI,cACM,CAAC+C,YAAgB,MGnUzB;gBHqUE,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,C,CAiCJ,cACMhD,AAAAA,eACFA,AAAAA,AAAAA,wBACA;OAEFA,KAAAA,QAAakD,SACf,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,M,C,CAoHiD;;;;EAzgBdjD;EA6qBJkD,IF/Q7BC;KAAwB,YACxBC;KAAsB,YEgRtBC;gCACcH,KAmMqBlD,AAAAA,wBAlMrBkD;GACV,YACFI;;EACSA;KACTA;OACSA;KACTA;KAEAA,aA9KE,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,E,C,CAmPN;;EAEwCC;EAAtBvD,AAAAA;WACK;EACjBwD;GAAAA,QAAwB;EASwB,AAA5BxD,2BACc,AAA/BA,AAAAA;;SAGCW;GAEJZ,aACFA,SACA;SAEFC;mBC1RwBQ,AD/LxBC;4CAieF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEAhD;;QAA4B;iDACV,KAAb+F,QAAgBnE,MAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAExCjC,YAAiB,MAAGoG,MAAAA,SAAgB,A,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAbS;EACpCA;GAAD,CAACA;IAEKlD,UAERkD,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,C,CAkBF;EACwB7C,KFq0BjBC,+CAA8B;GEh0B/BZ,0BAGFA,AAAAA;2BAG2BA,AAAAA,wBAAsByD;GACrC,0BAIhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEAhG;;QACE;iDACe,KAAVgG,QAAapE,OACF,KAAXkE,QAAclE,OACC,KAAfqE,QAAkBrE,MACzB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAEoB,KAAVqG;EAA+B,KAAXF;EAAmBG;6BAAAA,OAA/C;MAA6C,CAAA,AAApB,WAC3B,A,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA2BA;GACMC,QAAW,MACfA;UACAC;;EACA5D;EAAuC6D,OA5jBvCrB,AAAAA;YACAvC,AAAAA;YACAwC;OA2jBF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,iBACMkB,QAAW,MACfC;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAmEAE,yBAC8B,kBAaR9D,oBAChB+D,KAAiBA,KAAAA;aAbK,kBAiBNA,KAAgBA,KAAiBA;6CAfvD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,yBAEI,oBAAsBC;kDAG1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAiBAH,yBAC8B,gBAaCC,KAAmBA;aAZtB,gBAiBtBA,KAAiCA,KAAjBA;6CAftB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,yBAEI,gBAAoCC;kDAGxC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAcAC;;EACkB9F;EACAA;EACIA;GAGN,OAAG4B,wBACDA,AAAAA;WACO;EACHD;WACO,MACzB;0BAEA,uBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAoE,YACE,gBAAoC/F,WACtC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,C,C,CAOAgG,cACE,6CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAGA,gBACEC,AAAAA;wCAEF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,YAEEA,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA,oBACE;MAAyBA,AAAAA,mBAAiB,WACrBA;qBAAAA,SAAAA;8CACrB,AACAA,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CAoCAD,cAAuB,OAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAC9B,iBAAyC,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEzC,aAAe,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CACf,WAAA,OAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAWjBE;GACMC,QAAgB,MAAOC,WAC3BxD,AAAAA;;;MAGWyD,mBAETzD,AAAAA,aAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAyD;2EAGsB,MAAOD;;uEACZ,MAAOE;4CACR,MAAOC;4CACF,MAAOb;4CACL,MAAOE,WAG5B;MAAOY,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQAA,gFAGA,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAWAJ,YAAkB,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEtBnG;EACc2C,AAAAA;GACH,QAAS;;EAER5C;6BAAAA;;mBAIV4C,AAAAA;gBACA;mBAAkB,WACNyD,QAAUrG;uBAApByG;OACF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC;;EACa9D,AAAAA;;GACF,QAAS;EAGX;KACPA,AAAAA;gBACA3D;wBAGA;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAyG,YAA0B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3DE,YAA8B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CARjD,0BACVa;cAAKJ,QAAkBA,SACzB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAaFD,YAAkB,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEtBE;EACe1D,AAAAA;GACF,QAAS;EAEX+D,OAAAA;QAAc,GACvB/D,AAAAA;gBAGA;gBAFcgE,YAGhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAL;EACe3D,AAAAA;GACF,QAAS;EAEX+D,OAAAA;QAAc,GACvB/D,AAAAA;gBAIA;eAHWgE,QAAe3H,KAAAA,WACb2H,QAAe3H,KAAAA,YAG9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA2H;;EACY5G;IAGG;;6BAHHA;GAIV;KAAkB,WACJqG,QAAUrG;8BAAtB6G;OACF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAnB,YAA0B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3DE,YAA8B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAa/DkB,eACMX,QAAgB,QAEpBY;QAAgB,8BAChB;MAAOC,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAA;2EACsB;;OAEZnB,sBAWCA,QAVK;MAWDkB,AAAAA;WAVE,MAAOE;UACR,MAAOC;eACF,MAAOC;iBACL,MAAOC;QACjB,MAAOC,aAEpB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CASApH;;EACW4F;EAEOA,QAChBkB,AAAAA;;;EACUO;6BAAAA;GACV;KAAkB,QAChBA,QAAcN,QAAmBM,UACnC,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAZ;EACe;;EACJb,QACTkB,AAAAA;;EACYlB;EACEA;;EACJ0B;6BAAAA;;GAEV;KAAkB,QAGhBV,MAFUG,QAAmBO,UACjBP,QAAmBQ,UAEjC,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAMAH,sDAGA,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CA8DA;;GAqBoD,uBAnB5CI,aACI,KAAA;EAEJC;WAAiB;EACrB9F,mBAAAA;KAA0C,AAA1CA;GACI+F;uBAKJD;uBAEM,KAAA,2BAEV,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAtEAE;oCAE2ChG;;MASvC8F;EAQA9F;EACIA,mBCjzBkBQ,AD/LxBC;+CAi/BEoF;;GAsDgD,sBA7ChD7F,mBAAAA;KAA0C,AAA1CA,MACA8F;qBAEaG,sCAIP,KAAA,+BAEV,A,C;A,M,C,C,E,CAvCAD;;SAuCA,A,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAnCI,WACEF,cACAI;gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAiBA,WACEJ;MACA9F,mBAAAA;KAA0C,AAA1CA,MACAkG;gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CA+DJ9I;EAIayG;;EACE;EAAc;6BAAA;EAAR;EACW,AAAhB,CAAN,AAAA,SAAc,AAAA;EAEJ,AAAL,CADR,CAAA,EAAQ;EAGQ,AAAR,CADR,CAAA,EAAQ,2BAGb;MADK,CAAA,EAAQ,YAEf,A,C;A,C,C,CAEApG;;YAC8B;;+CAEToG;EAAKxE,IAAtB;6BAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C,A,E,c,kB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CF33CF5B;GACa;GAEE,QAAS,iBAEtB;gDACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,C,C,CAEAE;uBACuB;2BAET,MAER,0BAGF;eAEA;gBAEA;EAEQwI;4BACgB,KAAA,OAC1B;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAoBA,iBACQ,KAAA,sGAER,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAqWEtG;;kBAME,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAIAA,iBACQ,KAAA,SACR,A,C,Q,C,I,C,C,C,C,C,E,C,E,C,C,C,C,C;A,E,C,CAEAA;;;;eAec;;GACY,AAAhBuG,WAEF;;GAEsB,AAApBA,WAEF,qBAEF;MAAOC;GAIC,KAAa,UACf,KAAA;GAEE;EAC+B,AAApBD;KAEjB;KAEQ;EAAQA;QAMN,MAImB,AAAR,OAOa,AAAL,AAAR;;EAEDA;;GACpB;YAAoBE;6BAAAA;KAAF,UACIA;;GACS,AAAzBA,WACF,MAAOD,iBAEX,cAIa,MAAOA,YAC1B;qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAxG;;;GASM,kFAIF,MAAOwG;;eAIOE;qCAEZ,QAEF;MAAOF,aAET,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAxG;OACwC9C;;;GAWxByJ,gBACLA;EAEeC,OAAxB;cAnBoBC,eAoBtB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA7G,YAEE,sBADc8G,YAEhB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAwDA9G;EAGY+G,QACV;MAEU,gBAFQ;OAMK;EAAY;oDAInC,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA/G;;;aJ3WsClB;8BI6WpC;KAAA,UJ3WekI;+CI4WQ,KAAA;GACf,SACJpI;QACW,YACXA,OAAa,OAA0B,AAAP,QAAX,kBACrBA;OAAa,OAAK,mBAEZ,KAAA,QAEV,AACA,MAAOqI,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAjH,mBACE;sBJ5XoClB,8BI4XpC,UJ1XekI;+CI2XQ,KAAA;GACf,SAAW,KAAA;GACX,QAAU,MAAOE,SACzB,AACA,MAAOD,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6CAjH;;;;;;;EAWsB;;aAUV,qBACA;;GAGA,UAAc;;qBAAO;mBAC/B,SACF,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAaAA,+CAGOmH,KAEL;cACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA+DAnH,+GAIE;YACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;OAKA,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;;;;;GAO0B,aACR,EAAGoH,QACjBC;;GAIiB,SAAW,CAACC,SAC7BA,uBAUF;MAAOC,mDAOT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAvH;;GAGqB,SAAW,CAACsH,YAGXpK;WAIhB,MAAOsK;EAGa;YACF,CAACC,KACnB,MAAOD;EAKe;EAKpBC;GAA4B,IAAGL,SACjC,MAAOI;EAGc,8BACvB;MAAoBC,OA9gB4BC,SA8gB9B,WACyB,GAGzCC;8CADgBF,YAElB,MAEAH;;OASE,MAAOE,YAGTJ;OAA2BO,SAC3B;;EAOc,EAAGP,QACjBC;;;WAUA,MACIG,YAKN;oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAxH,2BAG8C;YACH;eACG;YACH;aACC;aACA;aACA,WAC1C;0BACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAgBAA;UAOE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,C,C,CAcF4H,iBACQ,KAAA,QACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CASAC,yBACwBV;0CACHS;KACb,KAAA,QACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,C,C,CA6CAE;;;;;8BAoBE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAC,WAGE,MAAOC,0BACT,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAQAC;;;;;;QAEA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAgZAC;;WAgBkB;uBAC6B;wBAG3C,MAAOC;QACE,kBACT;;;EAgByB;IACa,AAAP,4CAO3B,MAAOA,UACH;4CAGJ;MAAOA;;;;;;;;;;;EAiCEC;GAA8B,QACzC,MAAOD,UAAe;OACJE;GAAoC,wBAMtD;MAAOF,UAAe,kBACJG;cACAC;cACAC;cACAC;cACAC;cACAH;cACAI;cACAC;EAA8C;6BAChE;MAAOT,qDAMT;MAAOA,2EM9kDyC,6BNolD9C,iBAMF;MAAOA,2IAQL,iBAOJ;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAwBA5K,2CAEI,MAAOsL;KAEP,MAAOhL,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAUAkD;UAKE;QAAa,WAC4B;EACE,GACzCqE;iBACF,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA0D;GAOwB,SACpB,MAAOC;QACoB,SAC3B,MAAOA;QACoB,SAC3B,MAAOA;QACoB,SAC3B,MAAOA;QACoB,SAC3B,MAAOA;UAED,KAAA,6DAGV,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMA3C;WACuB;;OAEa;wJElqDCjG;aFqrDnC;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA+CEH;;;;;EAmBqByH,AAFG;;;;;eA0CTuB;KAAe;;;;EAUxB;;EAKWC;;;;;;MA6Bf;MAAoBC,aAAF,WACLA;;GAEM,eAEMD;QAEzB,YAIA;SACF,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAjJ;iBAII;OAQA;OAQA;OAQA;OAQA;OAQA;QAQA,iFAQJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAIAA;KACqB,MAAOmJ;;uCAGxB,MAAOC;;cAgNcC,YAArBC;;MA1M6DN;KAAe,SAJ5E;iDAOW,MAAkB;;;cAuMRK,YAArBC;;MA7LSN;KAAe,SALxB;8CASA,MAAOI,WAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApJ;;;sBAOU,KAAA;OAEN;OAQA;OAQA;OAQA;OAQA;OAQA;QAQA,mIAUJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;;;uCAKI,MAAOuJ;oCAGkBC,2BACHA;MACTR;KAAe,SAH5B;sCAIW,KAAiB,wDAIlB;4CAKWQ,2BACHA;MACTR;KAAe,SANxB;yCASA,MAAOO,aAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAMFE;mBAME;MAAOC,qBAOT,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAoRA;KAIQ,KAAA,KAFc7L,QACE8L,SAAsBA,WAE9C,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA0CAC;kCAGgC1M;;KAC5B,QAEF2M;UACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA+LA,iBACQ,KAAA,kDAER,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6KAC,gBAGE,4BAKF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAC;YL19EsB3L,aK69ElB,kBAEF;0BACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAUA2L,WAAoC,YAA6B,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CNlwFjE9L,YAAoC,wBAAqB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6CzD+L,iBAGa,4BACX;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMApD,uBACsB,MACpB;0BACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAKAqD,cAGE,MAAOC,sBAAyBtD,SAClC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOAuD,sBACkBF,SAChB;yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGAG,oBACYxD,OACV;yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAmCA9I,yBAEI;6DAGA,wBAjBQ+I;6BAoBR;0DAGE,MAAOwD;KAEP,MAAOC;KAIT,OAEJ,A,C,uB,C,I,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOAxM;WAEqB;EAIG,QACtB;kBAAmC;KamEjCyM,KAA6CA;;Gb5DhC;EAGAC;8BayDbD;KAA6CA,ObxD/C,AACA,2BACF,A,C,uB,C,I,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAKAzM,8EA3EoDZ,8BA8ElD;SAAoB2J,gCACtB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAaAqD;gCA+YuCO;;+BAAAA,eA/XrC,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAcA7M;WACsB;EACJgJ;EAKE1J;cAGM,QAGxB;MAoDOwN,MAAYR,gBAnDrB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAiEAtM;oBAE8B;UAO5B;QAAkB,WACZ,CAAC+M,gBACH,QAEJ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMAC,gBAEE,MAAOH,UADaR,WAEtB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAmBArM;WACiB;WACA;EAGLgJ;EACN1J;;wBAeJ;MAAOyN,WACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAgCA/M;SAEyB;oBAEK;mBAiOM,2CA5NE;;WAEK;kBAGvC,MAAOiN,gDAKP;;;;;EAOSL;aA2MuB,qBAtMD;cACUA;GAOtC,aAA0C,GAC7C;;mBAGF;MA1JOE,MAAYR,aA2JrB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CASAtM;oBAE8B;WAEb;WAEA;;;SAQD,IAAW,iBAEX,MAAY,QAG1B;QAAkB;;GACZ,EA1BC+M,WAAmBA,WA2BtB,SAEJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA/M;WACiB;WACA;;;GAOf;MAAoBkN,aAAF,WACLA;oCAET;;;GAIE,EAjDCH,WAAmBA,WAiDS,SACnC,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA/M;GAgIoC,eA9Hc;mBA8Hd,2BA1H9B,iBA0H8B;;GArH5B,EAjEC+M,WAAmBA,WAiEqB;;;;;;;;GAsB5B,IAEjB;GAE0C,AAAzB,IACA,IAEjB;aAII,CAACI,aAAwD;GACzD,CAACA,aAEH,cAMF,QAAW;;GACL,EA5GDJ,WAAmBA,WA8GpB,SAEJ,AAKA,YAAY;;GACN,EAtHDA,WAAmBA,WAwHpB,SAEJ,AAIA,QAAY;;GACN,EA/HDA,WAAmBA,WAiIpB,SAEJ,CAOF,MAAOK,uBACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAhB,gBAGE,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CY3jBAlM,sBAOE;uDACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,C,CAEAP,YAAoC,MAAGM,SAAiC,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAKxE,+GAOA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA2EAP;EAEe2N;;GAKF,+HAAS;;GAEJ,QAAS;;cAMjBC;GACE;GAGK,+HAAS;;GAEJ,QAAS;wCAc3B;;;cAQSC;;sHAET;gCAKA;uBAIuBA;6IAAvB;sBAIA,MAAOC;gBAKD,KAAA;8BAMiBD;6IAAvB;gBAEA,MAAOC,WAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAYAA;;EAEejO;sHAEb;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C,C,C,C;A,E,C,CAGAgO,YAGE,MAAOhO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEAkO;2BAII,MAPKlO;KASL,MAAOA,qBAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,E,C,CAiBA,wBACsC,MACpCmO;OACAC;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAEA,4BAEEC;wBACAC;wBAEAC;;;;qCAUE;QAAkB,EAAEC,gBACRA;EACEC;GACF,WAEKP;GACF,gIAIf,CAKF,QAAkB,EAAEM;;EAIsB;EACP;EACJ;EACI;EACK,UAExC,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAsCA;;EAoBUE,UAJAA,UAFAA,UADAA,UADAA,UADAA,UAHAA;;;wBA0BJ,QAAkB;kCAKlB;;mBAQJZ;gBACAC;gBAEAU;iBAEF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAEAC,cAEE,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CE7YArN;;EAIesN;EACOC,QAEpB;eACiBD;eAIf1G;;EACwB;;aAItB,MAIJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEArF;uBAEI,MAA2C,AAApCoH;;+CAEeA;EP+BU6E,IO/BhC;sBAGA,MAAOxM,MAAAA,OADM2H,gBAGjB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAzH;2CAKQ;OAEsB;EACTyH,QACb/B;OACA;QAAkB,WACH+B;ED2K0BoD,MAA7CA;MAAAA;SCzKI,AACA,MDmLqBA,WC7KvB;;+CPlFe0B;aOsFjB;;wDAMJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,G,C,C;A,G,C,I,C;A,G,CCtGErO,YAAiB,MAAU,MAAPQ,iBAAW,A,C;A,G,CAE/BR,YAAoB,MAAG,CAFI,KAAPQ,iBAEW,A,C;A,E,C,CAE/BN,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAE3CC,gBACQ,KAAA,uCACR,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CACA,gBAAgC,MAAGA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEvDC,cAAgB,MAAGD,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CACvC,YAAa,MAAGA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CACpC,cAA6B,MAAGA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,c,C;A,E,C,CAepDvO,YACE,MAAOmI,AAAAA,uCACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAnI,mCACsB;mBACI,QACxB;MAAwByO,2BAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEAD,qCACsB;GAChB,CAACE,WAAkB,MACvB;MAAwBD,YAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cACEE,KAAAA,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjO,YACE,2CACF,A,C;A,G,CAEAA,YACE,MAAO,MAAyBiO,kDAClC,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAzBoB,YAAU,MAAS,gBAAGR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,K,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAgB1B,YAAM,MAAGS,iBAAO,eAAS,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAQA,YAAM,MAAG,eAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CA4B1D3N,YAAyB,MAAG4N,MAAAA,AAAAA,YAAmB,A,C,C;A,E,C,C;A,G,C,qB,C;A,G,CTmC/CC;EACMC;;4CAAuB;EAEJC;GACL,WACTC;qBAAAA;EAAAA,kBAETF;SACA;SACF,A,C;A,G,CAGA/O,WAAkB,MAAGkP,aAAe,A,C;A,G,CACpClP,WAAkB,MAAGkP,aAAe,A,C;A,G,CAGpCtO;GAJqBsO,YAKL;EAEVC;EAAkB,AAAlBA,SAAoBC,AAAAA;SACA;IAExB;QAA2B,8BAHvBD,SAIFxO;OAASwO,MACX;iBACA;SACF,A,C;A,G,CAEA9H;GAd6B,AAAN6H,YAgBL,YA8/CX/L,QAA8B;EA7/CViM;EAAAA;EACMD;EAAkB,AAAlBA;SACF,YA2/CxBhM,QAA8B;EA1/CzB,8BACV;QAAkB,8BAJOiM;EAKgBA;EACC;0BALXD,SAI7BvP;kBACIuP,MACN,AACA,SACF,A,C;A,E,C,CAEAE;EACoB/P;EAEPgQ;EAO2C;;;;;2BUlHhBC,KV8HSC;;cAG7BlQ;;GAEH;;4BAUT,uBACFmQ,KU9IkCF,KV8IqBC;KAGvD,gBAsEO;KAnEP,8BAMF,mBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,M,C,C,G,C,U,C,C,C;A,E,C,C;A,G,C,iB,C;A,G,CAoCAxP,WAAwB,SAAQ,A,C;A,E,C,CAIhC6M;GAEM,CAAC6C,mEACoC;cAE3B;;EACRC;EAAkB;IAExB,MAAkCC,oBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAaA/C;EAIMhD;EAAAA;EAA4B,EAAEA;GAC9B,CAAC6F,oEAEuBjG;GAGE,MACZ,sBAGF;EACYA,uBAGd;;EACRkG;EAAkB;EACmB,AAAjBlG;OAEtBI,MACuB,SACnB,KAAA,wCACiCA,kBAC1BJ;QACkB,SACzB,KAAA,wCACiCI;QAER,SACzB,KAAA,wCACiCA,8CAGzC;QAAsC,QACpCJ,uBAA0BI,WAC5B,AACA;MAAkC+F,oBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,G,CAUA5P,WAAwB,SAAO,A,C;A,E,C,CAE/B6M,oBACkBgD,OAChB;MAAOtG,qBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CAwEA5J,oBACkBmQ;GAAF,IAA0B,MACxC;MAAiChG,gBAEnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAiG;EACyCC;sBACrC;uCAGAC;eAEA;wCAGM,KAAA,kCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA/P,WAA0B,MAAsC0P,yBAAW,A,C;A,M,C,C,G,C,a,C,E,CArD3EzO;;WAEoB;;;;;MAclB;qBAR0C,iBAKgB,eAM5D,A,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAge2B;kBAErB+O;cACAzG;;IACa,MACf,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmDuB;GACjBM,QACFA;iBAKJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,qB,C;A,E,C,CAgTJoG;aAE+BC;WACV;;EAEfjB;GAAW;EAGXkB;GAAe;EAGfC;GAAM;EAGNC;GAAQ;EAGRC;GAAU,wBAId;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,M,C,C,G,C,+B,C,E,C,CAsBApO;;;;;;;;6BA4CE;+OAMF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAMAA,YAmDE;;;;;;;KACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAkCAA,YASE;;;;;;KACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAsCAlC,kBACMqQ;WAAiB,wBAAoBE,QACzC;sDACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CAaAvQ;EACMqQ;WAAiB,gCAA4BE;EAC7CD;WACF,uDAAoDC,YAEtD;oEACOA,aACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAZAC;;;;uBAGuE,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAiBvExQ,kBAAqBuQ,OAAH;MAAGA,iCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAepElG;6FAOE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CAuIArK;EACMyQ;GAAO,QAAS;EAGoBC;;cAGjCD;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAwCqC,WAAG,MAAGE,iBAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEd,WAAG,MAAGA,uBAAY,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAElB,WAAG,MAAGA,8BAAkB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,M,C,CAExB,WAAG,MAAGA,yCAAwB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,M,C,CAE9B,WAAG,MAAGA,iDAA8B,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAuYzE3Q,YAAkB,gBAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,C,C,C;A,G,C,mB,C;A,C,C,CA0C9BF;;YAC8B;;0CACA,QAC5B;MACI8Q,WAAOlP,MACPmP,UAASnP,MACT4O,UAAW5O,KACjB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAEM6Q;aAGiBvQ,KAA0B6Q;OACA,oBAG1BN,QAIAvQ,OAErB;MAAwB,QAAEA,KAA0B8Q,UACtD,A,C;A,I,C,I,C;A,M,C,C,G,C,O,C,E,C,CAGA3O,YAAoC,MAAGyO,SAAa,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAKpDzO,YAAwC,MAAGyO,MAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAM5DzO;cAEyBqJ,YAArBC;OAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,E,C,CAIAtJ;cAE6BqJ,gBAAzBuF;OAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,E,C,CAGA5O;;;;GAIE;MAAoB8K,aAAF,WACLA;YAET,SAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C,C;A,E,C,C;A,G,C,M,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CA0YAhN,YAAkB,MAAGyE,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CAJ5BsM,qGAEkD,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAiDlD/Q,YAAkB,2BAAmByE,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAD7CuM,+BAA0B,A,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CA4B1BlR,kBAC2BmR,UACzB;kBAEMlE,OAAsCmE,WAC9C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAwCAD,kBACoB7R,MAClB;4CAGF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA8R;;EAzDmBC;;;sDAgEVA;EAGHC;GAAe,SAAW,AL13EZ9Q,oBK43Eb+Q;EAGDC;GAAuB,SAAW,AL/3EpBhR,mBKi4Eb+Q;EAGDE;GAAgB;EAEPC,OACX;MAAoBxJ,aAAF,WACLA;KACDkC,UAEZ,UAKF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAWAlK;EAGMoR;GAAe,QACjB,MAAoBA,wBAAF,gBACGA;;UAIrB;OAEEE;GAAuB,SAAW,ALv6EpBhR,gBK06ET,GAFgB,aAGvB;MAAoBgR,kBAAF,gBACGA;;UAIrB,cAESC;GAAgB,WAGlB,GAFgB;EAGZC,OACX;MAAoBxJ,kBAAF,gBACLA;;OAEDkC,iBAGZ,QAKF,MADO,gBAAUiH,UAEnB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,I,C,E,C,CAhDAjP;;IAGE;MAAoBzB,aAAF,eACYA,AAAAA,UAC9B,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA2EAT,YAAkB,gBAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAE9BkR,WAAQ,OAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAoEfA;EACyCrI;;2CAEvC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA7I,YAAkB,MAAG6I,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,e,C;A,E,C,CAUzBqI;EACMO;GAAI,QAAS;EAC4C5I;;;GACzDvB,gDAGJ;MAA6BiC,0BJllFOvI,8BIklFpC,cAC8B0Q,AJjlFfxI,UIklFf,AACOuI;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAzR,YAAkB,MAAK6I,aAAOU,KAAAA,kBAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAyFrDvJ,YAAkB,gCAA4BuQ,QAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAFvDoB,+BAA6C,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CN96F7C3R;EACM4R;GAAe,QAAS;EACgCC;;aAGrDD;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAGAnS,YAAiB,MAAGoS,MAAAA,SAAkB,A,C;A,C,C,CAEtC/R;;QACE;iDAAyC,KAAV+R,QAAanQ,MAC9C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CYqWiB,YAAI,iBAAsC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEvD,cAAgB,mBAAqD,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAErE,YAAa,iBAAsC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,G,CLvYvDoQ,iBACMC;GAAoB,QAAS;EAoBc7D;EAnBlB8D,2CAAtBD;SAAP;SAIF,A,C;A,G,CAEAD,iBACMG;GAAsB,QAAS;EAYY/D;EANhB8D,iDAAxBC;SAAP;SAIF,A,C;A,E,C,CA+BAzQ;;EAGsB0M;WAEL,MACf;MAAO,cACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEApO,oDACE;MAAgCoO,iBAClC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQA1N,cAEE,wBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAgB;EACkB0Q;;;WAGG,MACnB;MAAO,cACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA1Q;EACkB2Q;;;WAGG;EAGT1J;EAAa;;GAAK,AAAxBA,WAAiC,MACrCA;SACA;MAAO,cACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjH,mBACY,KAAa,EAAEC,aACjB,KAAA,SAA+BA,SAEvC;MAAO2Q,cACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,C,CA1EAlQ;;;;;uBAiBiD;;KAIzC,KAAA,2CAER,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,C,C,CA0EAlC,oBAD2BgC;gCAAAA,SACG;MADHA,MACkB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAV7CqQ,eAGA,A,C;A,K,C,I,C;A,M,C,C,E,CAHAA;;SAGA,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAyBAtR,YAA6B,gBAA2BuR,QAAKC,cAAQ,A,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,CAUrE/Q,WAAkB,MAAG0H,SAAQ,A,C;A,C,C,CAE7BpJ;GACMyS,cAAiB;EAEjBrJ;GAAS,WArCuBlH;;qBAAAA;EACfA,KAAAA;6BAAAA;EAAF;GADiBA,AAuC9BkH;EAIKsJ,AAAAA,WAAoBD,UAA/BrJ;;YAEEqJ,YACA;SAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,W,C;A,C,C,CO9LAvS,iBAIa,CAAA,eACH,OALe;MAOhB6B,SAP2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C,A,E,O,+B,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CGgBpCK,iBACEuQ,AC4NwB;;ED3NjBlN,KAAAA,sCAAPmN;MAEA;SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,C;A,G,C,C,mC,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CEnByBC,YAAoB,MAAGC,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,QCiEnHE,eDjE+JF,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAGjKG,YAA2B,MAAGC,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAA0CH,cAAoCG,QC8DzIF,eD9DuLE,WAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAG1LhT,WAAgB,MAAGiT,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BJ,YAAyBI,QC2DpGH,eD3D0IG,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAGlK;EAGEC,OAAAA;WACAA;;EACAC;EAAAA,OAAAA;iCAAwBC;EACxBD,OAAAA;iCAA4BE,YAC9B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YAfgJL,QC8DzIF,eD9DuLE,UAkB5LE,AAAAA;aACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEA,YArBgJF,QC8DzIF,eD9DuLE,UAwB5LE,AAAAA;aACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,CAQAI,WAGEC,UACF,A,C;A,E,CAVAD,WAGEC,UACF,A,C,C;A,E,C,C;A,G,C,O,C;A,G,CFNA9T,WAAgB,MAAG0E,AAAAA,kCAAuC,A,C;A,G,CAE1D1E,YAAa,MAAG0E,AAAAA,+BAAoC,A,C;A,E,C,CAIpD,cACEA,AAAAA,8BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmBA,iBAzBgBA,OAqBdA;qBArBcA,0BA2BhB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAIA,sBIyRoB;+CJxRlBA,AAAAA;gDACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAgBA;EACcqP,AAAAA;GACD,SAA6B,CAAA,KAAhBC,wBAEtBC;SAAAA;mBAAwBD,gBACxBC;sBAA2BD,qBAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA,kBACkB,KAAmBC,QACnCF,AAAAA;mBAA2BG,YAC7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,iB,C;A,G,C,CK7FyB3T,WAAuB,MAAG4T,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2Cf,YAAgCe,QFkErId,eElEyLc,WAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,E,C,CAExN,iBC+q4BkCC,eA2/GhCC;gBA/EI,KAAc,KA8EcC,qBA9EW;GDrl/BlB,KAArBC,KAAAA,sBAEFA,KAAAA;KAGAC,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA,WACED,KAAAA,qBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA;EACgBA,KAAAA;EF0CTlB,eElEyLc,UAApDA;;GAyBtI,CAACM,aACH;EAEUA,AAAAA,KA5BqCN;;cA4BrCM;EAEa,IAAMC;GACd,IACf1B,AJ4MsB,qDI5OyBmB,SAkCjDQ,AAAAA,AAAAA,AAAAA;cAAYF,KAlCqCN,iCAsCnD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,K,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAnC6B,YAEzBK,YACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CA4B2C;;EACvCG,IH/B0IpB;KC8DzIF,YD9DuLE;EGgCxLoB,IH7BqGnB;KC2DpGH,YD3D0IG,aG8B7I,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,gC,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,C;A,G,CEjCJnT,YAAkB,MAAGuU,SAAS,A,C;A,G,CAC9BxB,oBACgBwB,OACdA;;GADwB,WAKpBC;KAEAC,UAGN,A,C;A,E,C,CAEAzU,WACE0U,WAAW,CAfQH,QAgBnB;MAhBmBA,SAiBrB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,kB,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,C;A,E,C,CAgBA;EACEI;SAAAA;OACAC;OACAD;OAAYC,MACd,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA;EAGYD;;EAAAA;GACNE,OAYJF,OAAqB,AALSA,YAKJE;KATxBC,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAUA;;EACmBD,KAAAA;GACF,UACb;6BAFeA;GAIjB;KAAkB,WAEZA,KAAAA,KAAAA,kBACFC,QAAUD,KAAAA,YAEd,AAEAA;;EApB8BF;;EAuBP,AAvBOA,WAuB9BA;SAAsC,KACxC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C,A,E,iB,sG,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CC7CF,WCsBEI,gpEACAC;ODsBAC;OACF,A,C,Q,C,I,C,C,C,C,C,G,C,C,E,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CEhF0BC,YAAmB,MAAGC,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAkCpC,cAA4BoC,KAASC,eAA2BD,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAItK,cACErS,AAAAA,KAL4CqS,YAM9C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAE;;ECyFqB;;;gBC5CI;;;;;;SF7CwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CGJjDC;;EF6FqB;;;gBC5CI;;;;;;;SCjDkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCEnBJ,YAAmB,MAAGK,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAkCxC,cAA4BwC,KAASH,eAA2BG,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAGtKC,cACE,MAAOC,AAAAA,MAJqCF,SAKjC,KAAPE,KALwCF,oBCukCrCG,uBDjkCT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,cACED,AAAAA,KAT4CF,YAU9C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CATAI;;EH0FqB;;;gBC5CI;;;;;;SE9CmB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CEH5CC;;EL6FqB;;;gBC5CI;;;;;;;SIjDiB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCClBC,YAAc,MAAGC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA6B/C,cAAuB+C,KAAUV,eAA4BU,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAG3J;;EAHyCA;WAMrC,MAEFpR;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,cACEA,AAAAA,KAZuCoR,YAazC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,CAEA5V,YACE,4BACF,A,C,I,C,I,C,C,C,C,C,G,C,e,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAhBA6V;;EN2FqB;;;gBC5CI;;;;;;SK/CkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,+B,4D,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCGlB7V,YAAqB,MAAG8V,MAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAAqDjD,cAA8BiD,KAAeZ,eAAiCY,QAAsB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,W,C,G,C,C;A,G,C,CAC7L9V,YAAwB,MAAG+V,MAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAAgDlD,cAAiCkD,KAAkBb,eAAoCa,QAAyB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,c,C,G,C,C;A,G,C,CAGnOjW,YAAmB,MAAGkW,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAChCnD,cACEmD,MACAC;WACF,A,C,I,C,I,C,C,C,C,C,G,C,G,C,C,C,C,W,C,C;A,E,C,CAIA,0CAEEA;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,kBAXED,KAYY,AAdQA,SAGpBC;UAYAA;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,e,C,C;A,E,C,CAIA;EACMD;EAzB0LF;WAAhDA,KAAeZ,oDACXa;KAAkBb,eAAoCa,kBAD1DD,KAAeZ,kDACXa;KAAkBb,eAAoCa,eA+B1M,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,iB,C,E,C,CAtBAG;;EP8EqB;;;gBC5CI;;;;;;;;;SMlC4B,A,C,I,C,I,C,C,C,C,C,G,C,uC,C,C,C,C;A,4B,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,mE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCd5BpW,YAAkB,MAAGqW,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyCtD,cAA2BsD,KAAcjB,eAAgCiB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACvKrW,YAAc,MAAGsW,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCvD,cAAuBuD,KAAUlB,eAA4BkB,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC5InW,YAAqB,MAAGoW,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C,C,C,C;A,G,C,CAA2CxD,cAA8BwD,KAAcnB,eAAgCmB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAEvM,kBAJ8CF,IAA+EA;KAAcjB,iBAK9H,OAJgGkB;KAAUlB,eAA4BkB,SAMnJ,A,C,Q,C,K,C,C,C,C,C,G,C,c,C,C;A,E,C,CAEA,wBAR0CA;UAUtC;GAEW,AAXiCC,YAD6DD,KAAUlB,oBAcnH3M;UAAS,AAfiC4N,UAetBG,oBAfsBH,IAA+EA;KAAcjB,iBAiB5H,SAEf,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,c,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CArBAqB;;ER8FqB;;;gBC5CI;;;;;;;;;SOlDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,2B,uC,A,A,C,C,C,C;A,G,C,E,C;A,E,CCqB/CzW;;WAE0B;EAEH0W;WAInB,mCAGF;MAA+B,MAAxBC,oBACT,A,C;A,E,C,C;A,G,C,S,C;A,M,C,CAxB6B,cACvBC,OAAU,MCoJL;6DD/IT;MAAOC,UACT,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C,A,E,kB,iB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CnCutBEzU,mBACE;sBA/boClB,8BA+bpC,OACE0N,SA9baxF,KA+bf,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAhH,mBACE;sBArcoClB,8BAqcpC,UACM0N,SApcSxF,WAocH,QACZ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoBAhH,qBAGE;sBAheoClB,8BAgepC,SACiB4V,WA/dF1N,KAgef,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoJAhH,2BAEE;iBAAkB,EAAE2U,gBACJA;;yBACZ,2BAEJ,EAEsB;IAEpBA,cACAvP;OACAA;YACAA;;8BAGAuP;QAEF,MW3qByBpK,SX4qB3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoEAvK;GACY,UAAa,MAAEzB,eACjB,KAAA,SAA+BA;;GAE/B,UAAe,MAAEA,eACjB,KAAA,SAAiCA,WAE3C,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQAyB,+BAEEvB;;EACiB;GACN,UAAM;GAEH;;;WASAmW,AAAAA;OAGU,KAAT,UAAWC,mDAG1BnW;gBACF,A,C,Q,C,K,C,E,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoCAsB;;GACY,UAAa,MAAEzB,eACjB,KAAA,SAA+BA;;6CAG1BO;;EAESA;EACtBP;6BADsBO,OACtBP;UAAY;EACQ;EAAmBA;2BDtgC/B,iBA2MRF;eC4zBA;MAAA,QAAA,aAAA;EACY,SAAVE;cACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAyB;GACY,KAAa,EAAEzB,cACjB,KAAA,SAA+BA,UAEvC;MAAA,QAAA,aACY,GAAVA;WADF,QAEA,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CqC1lCAyB;;GAEe,SACX,MAA8B,KAAR,cAAkC,KAAR,iCACzC,WAAc,WAAK,UACxB8U,WAASC,SACX;KAEA,gCAAuC,MAAW,YAAU,WAAK,UAC/DD,WAASC,SACX,CAEJ,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmBA/U;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7K;KAA6CA;GX5G9B,IAAG,mBACN,KAAA,YAEV,AACA,MWmHuBA,aXjHD;6BAjBX;GAkBX;KAAkB,WACH6K;8BWoGjB7K;KAA6CA;GXnG9B,IAAG,mBACN,KAAA,YAEV,AACA,MW0GuBA,OXxG3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEAjM,cAAwC,2CAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE5DA,cAA2B,0CAAkC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAW7DgX;EAEe;6BAAA;;GACb;KAAkB,WACRZ,WAAeU;GACZ,IAAG,mBACN,KAAA,YAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA9W,cAA4B,MAAG,wBAAsC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQrEE;oCAGa;UAAwBJ,sBAEZA;6BAAAA;;;iCAEvB;YAAoBA;6BAAAA;KAAF;EACJgX;8BAAZhQ;WACF,AACA,SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,CA+BA7H;EACegY,KAAAA;EACTC;YAAqC,UAAU,QACnD;SACF,A,C;A,G,CAEAjY;EACegY,KAAAA;EACTE;GAAO,UAAU,QACrB;SACF,A,C;A,E,CAEAlY;EACegY,KAAAA;EACTE;GAAO,UAAW;EAClBD;YAAqC,UACvC,MAAc,UAEhB;MAAoB,WACtB,A,C;A,E,C,CAEArX,oBAC8B,KAAZuX;GACN,WAAiB,OAAGC,iBACtB,KAAA,SAA+BvX,eAEvC;MAAOmX,MAAAA,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAjX,iBACY,8CACV;MAAO,MAAoBiX,QAAkB,KAAPE,WAAgBD,cACxD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAlX;GACY;EACNkX;EAGWC;WAFb,MAAO,MAAoBF,UAA0B;OAEjC;GACH,UAAU,WAC3B;MAAO,MAAoBA,mBAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAzDAK;EACMH;;GAAO;EAGPD;GAAa,YACE;GAGN,cACH,KAAA,cAGZ,A,C;A,M,C,C,E,CAZAI;;SAYA,A,C,C,C;A,E,C,C;A,G,C,e,C;A,E,CAgEAzX,WAAc,MAAG6I,SAAQ,A,C;A,C,C,CAEzBpJ;EACe2X;;EAAAA;GACD,CAAA,KAARzT,gBACI,KAAA;EAEJ+T;6BAJSN;GAIF,MACTvO,YACA;SAEFA,QAAWuO,SACXM;QAAM,AAANA,SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CAkBAhX,gCAAqD0W,KAAAA,SAAoBO;wCAAhD;SAAmD,A,C;A,E,CAG5EvY,YAAe,MAAGgY,MAAAA,SAAgB,A,C;A,G,CAClC3X,YAAiB,MAAG2X,MAAAA,SAAiB,A,C;A,G,CAIrCQ,YAAW,MAAGD,SAAGP,KAAAA,UAAe,A,C;A,E,C,CAEhCQ,cAAuB,MAAGD,SAAGP,KAAAA,YAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,M,C,C,E,CAnBxDxW;4CAEI,gCAEF;iCACF,A,C,C,C;A,E,C,C;A,G,C,U,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CA8BAnB,iBACMoY;GAAAA,OACFhP,QAAW8O,QAAGE,OACd;SAEFhP,YACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEA+O,WAAc,MAAG/O,SAAQ,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CAezBzJ,YAAe,MAAG0Y,MAAAA,SAAc,A,C;A,E,C,CAChCF,cAAuB,MAAGD,SAAGG,KAAAA,YAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,CAYtDpX,2BAAiD0W,KAAAA,SAAoBO;wCAA5C;SAA+C,A,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CASxElY,WACE,UAAOoY,QAAAA,UACDF,QAAGE,aACL,QAEJ,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEA7X,WAAc,MAAG6X,AAAAA,cAAiB,A,C,C;A,E,C,C;A,G,C,U,C;A,E,CAWlCnX,2BAAqD0W,KAAAA,SAAoBO;wCAAhD;SAAmD,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,e,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CAiB5EC,WAAc,MAAG/O,SAAQ,A,C;A,C,C,CAEzBpJ;EACMsY;WAA2B,QAC/B;MAM2BF,QANpB,CAACE,QACNlP;GACIgP,OAGFE;EACoBJ,KAAAA,QAAGE,QAAvBE;eAEA,SAEJ,AACAlP,QAAWkP,AAAAA,YACX;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAmBArX,kBAC6B0W;WAAAA,QAAoBY;wCAA/C;SACF,A,C;A,M,C,C,E,CAdApX,2DACqC;aAIjC,8BAEF;+BACF,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAcAxB;EACuBgY;EAAAA;EACAY;GAAF,UAAc,QACjC;SACF,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CAYAvY,iBACY,KAAVwY,UAAAA;;GACe,UACb,MAAOJ,AAAAA,YAETI;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEAjY,cACiB,KAAXiY,WAAgB,MACpB;MAAOJ,AAAAA,cACT,A,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAqDA1X,yDACqB,wCAGnB;MAAO,MAAoBiX,QAAsB,KAAXc,yBACxC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAEAxX,kBAC6B0W;WAAAA,QAAoBc;wCAA/C;SACF,A,C;A,E,CAfAC,sBACMD;2CAAiC,eAC7B,KAAA,SAEV,A,C;A,M,C,C,E,CAXAtX;;WAEI;SAEF,MAAO,aACT,A,C,E,CAEAuX;;SAIA,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAmBA/Y;EACegY;EAAiB,KAAjBA,QAAmBc;GACrB,UAAM,QACjB;SACF,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CAWAzY;EACuCoY;GAArC;YAAoBK;6BAAAA;KAAF,UAAmBL;UAAoB,AACzDK,SACA;MAAOL,OACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEA7X,WAAc,MAAG6X,AAAAA,cAAiB,A,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CAiHlCpY,WAAgB,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CACxBO,WAAc,OAAO,A,C,C;A,G,C,C;A,G,C,I,C;A,E,CsC5sBrB,mBACQ,KAAA,wDAER,A,C;A,C,C,CAGA,mBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,mBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAP,mBACQ,KAAA,+CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeA,iBACQ,KAAA,yCAER,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAeA,qBACQ,KAAA,+CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CAmBA,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAGA,mBACQ,KAAA,yDAER,A,C;A,E,C,CAGA,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAGA,mBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAO,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,mBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAP,mBACQ,KAAA,gDAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeA,mBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CASA,iBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAeA,yBACQ,KAAA,2CAER,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,gDAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAuGAL,YAAe,MAAG0Y,MAAAA,SAAc,A,C;A,E,C,CAEhC9X;EAA0B8X;SAAH;MAAGA,QAAqC,KAAJ,KAAfA,eAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,C,C,CxB5PvErY;;QAAwB;iDAA4B,KAAN2Y,QAAS/W,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAElEjC,kBAEwCgZ,KAAAA;6BAAAA,OAAtC;MAAkB,WAAkB,SACtC,A,C;A,E,C,CAEAC,YAAW,sBAAaD,eAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,G,C,I,C,E,C,CAKhCvW;GACM2G,cAAc;GACdA;ET4B4BqF;;GSzB5B,wFAIJ;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C,A,E,oB,mB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CyBsaFU,uBACoB,MAClB;mBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAA,YAAmC,MAAG+J,UzBvbItJ,WyBubc,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIxDuJ;4CAEI;KAEA,qBAEJ,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAMAC;EACyBC;;GACP,iBAAc;GACd,cAAW,aAE3B;MAAOC,MAAmBJ,qBAC5B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIAE;;EACuBG;GACF,OAGHA,OAAqC;;cAEZC,MAAfC;;GAEf,QAAS;;EAEDF;GACF,UACqBG,AAAAA,KAChCH;aAEAA,OAAmC,IAAwB,KAAnBA,6EA2lBlCI;SAzlBV;WAGErZ;;GAGQ,6BAyvDVsZ;;SAtvDE;cAII,KAAA,kCzBhfgChK;;;;;;0EyB+fnBiK,AAAAA,SAAmBA;EAC3BA;8BASQA;qBAAAA;EACRC,KADQD;GAEH,AAAdE,YAAqBV,sBACdW;wBAo3BiBR;;YA92BGS;KAI3B,MAAoBA,yBAAF,qBAElB;gFAoiBQN,gBA9hBZ;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjS;EACe,8BACb;sBvC/SsCnG,8BuC+StC,UvC7SiBkI;GuC8SX,CAACyQ,SAAwB,CAACA,SAAmB,CAACA,QAChDrS,MAAOqS,WAEX,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAxS;EACe,8BACb;sBvCzTsCnG,8BuCyTtC,UvCvTiBkI;GuCwTXyQ,QACFrS,MAAOqS,WAEX,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAkCAxS;EC5kBW,8BAAA;SD+kBT;sBvCpWsCnG,8BuCoWtC,UvClWiBkI;GuCmWXyQ,WzBzlBkCtK,AyB0lBpBsK;;EAGZrS,MAAOqR,KAFJ9P,SAA8B,KAAZA;;wDAKvB8Q,gBAEJrS;KAAmBqS,qBACrB,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIAC;IAGE;sBvCxXsC5Y,8BuCwXtC,OACEwY,OAAWL,KvCvXIjQ,MuCwXjB;kBvC1XsClI,6BuC4XtC6Y;;EvC1XiB3Q,IuC4XjB;KAAO2Q,oBvC5XU3Q,euC6YLyP,QAfZ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA4xDAlZ;;GACE;YAAoBia;6BAAAA;KAAF;GACgB,KAA5BA,AAAAA,eAA+Bf,SACjC,aAEJ,0DAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAE;;QAOE;QAAe;;;EAOHtT,QACZ,WAIE;;aAEiBmH;QACRoN;EAKkCA,OAEzC;MAAOJ,QADKK,OAAqCC,iBAKhCtN;;0BAaSuN;;4CAExB,WAqBAvN,wBAEa,QACjB,MAAOyM,QAGT;MAAOe,YACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtL,yBACqB,QAEnB;MAAO+J,UzB5+EiCtJ,KyB2+EnB8K,kBzB3+EmB9K,OyB6+E1C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3O;;GAGuB,QAAS;wBACoB;;mBAEhD;MAAO0Z;EAMGxR,mBlCzhFFoJ;UkC0hFO,eAGjB;MAAOpJ,6BAAAA,AAAAA,YADQA,kFAGjB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAlI;;0EAQa2Z,KAAYC;EACJA,qCAERD;OAKX,sBvC/xEsCrZ,gCuCiyEjB,YAFrB,UvC7xEiBkI;QuCgyEwB;;EAA1BqR;;EAEA;GACF,QACTjT,UAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA5G;GACMe,cAAgB,qBACpB;MAAOA,WACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA3B,oMAsBI;QAEA,UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAIAA;;GACU,YACA,uCACN;EAEiB0a;QACnB;MAAiB,aAAoB,WACvC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,G,CA1jFErT;EACMsT;GAAiB,QAAS;EACG,8BACjC;eAAiCC,8BvCmQkBjD,KAAAA,MAAoBO,6BuCnQvE,OACE,MAAA,KvCqSa9O,MuCrSb,UAAA,MACE5B;MAAOqT,WACT,AACF,+BACOF;SAAP;SAEF,A,C;A,M,C,C,G,C,U,C,E,C,CAMAvY;EAEe;;WAEY,QACzB;sBvC+MoClB,8BuC/MpC,UvCiNekI;;EuChNCU;EACMA;ETkBQ,KAAmBgR;ESjBxBhR;EACEA;EACFA;EACVA;EACCA;EACKA;kBAInBiR;KADgBvT,4FAGRqR,UAEV,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAP6C,WAAG,uBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAenE3Y,YAAkB,MAAG8a,YAAW,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKhCC,iBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,mBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CAeA/a,WAAuB,gBAAY,A,C;A,G,CAUnCgb,iBAkiF0B7C,AAjiFjB8C,eAAP;MAAOA,AAiiFiB9C,2BA/hF1B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CADM,YAA0B,MAAGwC,SAAQO,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,G,CAU3CtM,YAAyB,MAAGuM,MAAqBhB,WAAOiB,YAAW,A,C;A,G,CAEnEtb,WAAmB,MAAGub,MzBjHkBhM,AyBiHhB+L,mBAA2B,A,C;A,E,C,CAKnDpb,YAAkB,MAAK8a,wBzBtHiBzL,AyBsHG+L,mBAAc,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMzDE,mBACQ,KAAA,iCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,C,C,CAiBAxb;;QACE;iDACe,KAAXsb,QAAc1Z,OACR,AAANyY,YAASzY,MACf,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EzCvJoBoS,KAAAA;6BAAAA;EyC0JLsI,OACb;MADK,CAAA,AADA,AADiB,aACX,GAAEiB,KAAAA,SACF,GAAEjB,cAEf,A,C;A,G,CAEAna,WAAuB,2BAAuB,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CAoB9CA,WAAuB,mBAAe,A,C;A,G,CAEtCub,WAA4B,OAAO,A,C;A,G,CAMnC7a,WAAkC,YAAS,YAAwB,A,C;A,G,CAGnEP,gBACQ,KAAA,iDACR,A,C;A,G,CAEAO,WAA2C,YAA+B,A,C;A,G,CAC1EA,WAAmC,YAAuB,A,C;A,G,CAE1DZ,WAA+B,SAAO,A,C;A,G,CACtC+Y,WAAmC,YAAO,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,6D,C;A,G,CA0C1C7Y,WAAuB,sBAAkB,A,C;A,G,CAEzC4O,YAAyB,MAAGwM,SAAU,A,C;A,G,CAEtC1a,WAAkC,MAAG8a,YAAgB,A,C;A,G,CAErDrU;EACMsU;GAAe,QAAS;EACf,8BACb;MAAA,KAAyBC,SAAzB,UACYvC,KADZ;;+CAGU5D;cAEJjO,MAAOiO,OACPA;YAGN,+BACOkG;SAAP;SAEF,A,C;A,E,C,CAEA7C;EzBpQwCvJ;GyBsQlCxG;EACS8S;EAAYhD;EAo3EHR,AAAAA;aAAAA,AAAAA,AAn3EOyD;gBAGrB,KAAA,UAA4BC,uBAEpCC;YACA;MAAOC,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAnD,kBA02EwBT,AAAAA,AAz2EJ6D;gBAGV,KAAA,0BAER;MAAOD,MAAQD,YACjB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAlD;EAi2EwBT,AAAAA,AA31EO6D;gBAGrB,KAAA;;6CAGwB,oBA8vDFC,MA7vD5B1M,KzBvSoCF,SyByStC;MAAO0M,MAAQD,WACjB,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAmBApb;EACMwb;GAAuB,QAAS;;EAEhBC;;EAEcC;GAFlC;YAAoBD;6BAAAA;KAAF;OACFA;;EAESrD;;EAOF/J;QAIHA;EpCtVbnN,kBoCyVD,SANY,KAQhB0F;SACAwU;cACF,AACOI,SAAP;SACF,A,C;A,G,CAEAxb;EACM2b;GAAc,QAAS;iBAE3BC;UACUC,aACHF;SAAP;SACF,A,C;A,G,CAEAlV;EACMqV;GAAiB,QAAS;EACjB,8BACb;MAA8BhB,6BvChHMxa,8BuCgHpC,UvC9GekI;GuC+GT,CAAC4S,QAAsBxU,MAAOwU,WACpC,+BACOU;SAAP;SAEF,A,C;A,G,CAEArV,iBACMsV;GAAe,QAAS;gBACf,4CAENA;SAAP;SAEF,A,C;A,G,CAEAtV,iBACMuV;GAAe,QAAS;gBACf,4CAENA;SAAP;SAEF,A,C;A,G,CAEAvV;EACMwV;GAAiB,QAAS;EACjB,8BACb;MAAgCC,6BvC1II5b,8BuC0IpC,UvCxIekI,IuCyIb5B;MAAOwU,WACT,+BACOa;SAAP;SAEF,A,C;A,G,CAEAxV;EACM0V;GAAe,QAAU;EACaC;EC9XnC,8BAAA;;aDwnF+B3E,AAAAA,AAtvEtCwD;qBAsvEsCxD,AAAAA,AArvEtC4E;qBAqvEsC5E,AAAAA,AApvEtC6E;qBAovEsC7E,AAAAA,AAnvEtCyD;;+BACOiB;SAAP;SACF,A,C;A,G,CAEA1V;EACM8V;GAAoB,QAAS;EACpB,8BA6uEyB9E,AAAAA,AAzuEtC6D;;+BACOiB;SAAP;SAEF,A,C;A,G,CAEAvc,iBACMwc;GAAgB,QAAS;gBAGgBC,KAAAA,wBADtCD;SAAP;SAEF,A,C;A,G,CAGA3B,WAA4B,OAAO,A,C;A,C,C,CAOnC6B,cACI,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CArCnCC,cACE/V,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAWA+V,cACE/V,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA2MsC,WAAG,cAAGqS,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,G,CAmC9C3Z,WAAuB,oBAAgB,A,C;A,G,CAEvC4O;EACM0O;GAAkB,QAAS;EzBxoBOjO,KyByoBjBkO,KAAAA;EAEIC;EADGC,sBACtB9E,qBzB3oBgCtJ,KyB2oBbmO,WACnB7E,yBzB5oBgCtJ,KyB4oBTmO,UAFtBF;SAAP;SAGF,A,C;A,G,CAEA1O,YAAyB,MAAGwM,YAAU,A,C;A,G,CAetCjU,WAAgD,MAAGqW,AAAAA,eAAkB,A,C;A,E,C,CAkBrE5E,qBAKQ,KAAA,uBAER,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA,iBAEQ,KAAA,6BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAA,mBAEQ,KAAA,UAA4BiD,wBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,G,CAEAnb,WAAsC,OAAI8c,SAAM,A,C;A,G,CAYhD1d,WAA+B,SAAO,A,C;A,G,CAEtC8Z,WAAoC,YAAO,A,C;A,G,CAG3ClZ,gBACQ,KAAA,YACR,A,C;A,G,CAEAA,WAAmC,YAAuB,A,C;A,C,C,CAG1D0c,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,G,CAmBnExD,YAAqB,MA1SdT,MzCjb4B5M,AyC2tBCmR,KAAAA,aAAsB,A,C;A,E,C,CAE1D9E,sBzBhvBwCvJ,OyBwyBtC;MAAOiM,mBAJwChS,iBAMjD,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAMAwI;;EAEqB4L;aAAqBte;;cAG9B6Z;mBAGV,SACF,A,C;A,E,C,CAKAL;EAIc+E;;cAMWC;QAKHC,AvCgFb,KuChFaA;;EnCpqBb3d,KmC8qBkDwd;;GAGrDI,iCAEqBF,0BAMvB;MAAO7B,MAAQ+B,KAAoBJ,iBAEnC,MAAO3B,MAAQ+B,KAAoBJ,YAEvC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA9E,wBzBx2BwCvJ,ayB02BtCiM;QACI3C,gBACJ;MAAOoD,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CA0BAnD;WAKgBmF;;;;IAOuBL;WAMjC;OAEa3B;;KAGb;UAGJ,MAAOiC,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEApF;EzBp6BwCvJ;EyBw6BzBiM;EACkBqC;GAC3BG,QACF;EAIUC;yBAEU,SAAfA;;GAAwB,CAAA,UAAM;MAC3BA;;iCAMIE;EAKIH;EACJA,QACRI,aACAC;;SASN;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAF,mBASI;KAEA,yDAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAE,iBACM,GAAU,0DAUd;iDAFsDT,mEAGxD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKAQ,oBAKoB9e,IAJLse;GAKT,GAAU,+DAGd;mHACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,C,C,CASAjX;;;+CAEmBiX;EAAWhc;;aAD5B;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC,YAGE,MAAmC,M5B7iCM2e,K4B6iCjBV,oBAC1B,A,C;A,E,C,CAEA1d,YAAkB,+BAAwBqe,KAAmBX,UAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAMzEN,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA7PxC;EzBnxBa/N;;GyBqxB9BxF,QACFA;UAIM,KAAA,oEAGV,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oD,C;A,G,CAiSJ7J,WAAuB,oBAAgB,A,C;A,G,CACvCA,WACE,UAAgCse,aAAhC,QAAA,UACmB,CAAA,KvC30BJpV,auC40BX,WAAUqV,AAAAA,mBAAsBC,WAEpC,AAGA;MAAOD,AAAAA,eACT,A,C;A,G,CAEA7d,WAA2C,MAAG6d,AAAAA,eAAoB,A,C;A,G,CAElE7d;EACM+d;GAAqB,QAAS;;;EAgB9BD;GAAAA,oBxCr/BGje,KwCs/BLie;KAKA,MAAoBA,sBAAF,WACAA;;uEAUJ;KAGRE;eAMN,AACAA,sCAEKD;SAAP;SACF,A,C;A,G,CAEA/d,iBACMie;GAAe,QAAS;EACLJ,AAAAA,gBAAhBI;SAAP;SACF,A,C;A,G,CAQAxX,iBACMyX;GAAoB,QAAS;gBAGzBC,KAAmBC,yBAFpBF;SAAP;SAGF,A,C;A,G,CAcAzX;EACMwV;GAAiB,QAAS;EACjB,8BACb;MAAiC4B,AAAAA,mCvC16BGvd,8BuC06BpC,UvCx6BekI,IuCy6Bb5B;MAAOwU,WACT,+BACOa;SAAP;SAEF,A,C;A,G,CAEAxV,iBACM0V;GAAe,QAAS;gBAExBkC,KAAcD,WAAUlD,yBADrBiB;SAAP;SAEF,A,C;A,G,CAEA1V;EACM8V;GAAoB,QAAS;EAE7B,8BACJ3V;OAAc0U,WACd1U;OAAc0X,WACdtF;KAvG4C6E,AAAAA;+BAwGrCtB;SAAP;SAEF,A,C;A,E,C,CAoDArE,cACE,MAAO2F,AAAAA,iBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3F,YAA0C,MAAG2F,AAAAA,eAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAiBvEU,WAA0B,MAAGV,AAAAA,eAAY,A,C;A,G,CAEzC7d,WAAkC,MAAG6d,AAAAA,eAAe,A,C;A,G,CAEpD3E,iBACMsF;GAAY,QAAS;EAMJC,wBADEC,0BAFwBb,AAAAA,mBAGxCW;SAAP;SACF,A,C;A,E,C,CAEAtG,gBAGE,MAAO2F,AAAAA,mBACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAEAze,WAA+B,SAAQ,A,C;A,G,CAEvC8Z,WAAoC,MAAG2E,SAAM,A,C;A,G,CAE7C7d,iBACM2e;GAAuB,QAAS;EACJd,AAAAA,gBAAzBc;SAAP;SACF,A,C;A,G,CAEAvf,WAAmB,MAzqCGub,MzBjHkBhM,AyBiHhB+L,AAyqCFmD,sBAAgB,A,C;A,G,CAYtC3P,kBAA4B2P,OAAH;MAAGA,UAAoB,A,C;A,G,CAIhDpe,WAAuB,gBAAqBmf,iBAAa,A,C;A,G,CAEzD1Q,WAAsB,MAAG2P,AAAAA,eAAiB,A,C;A,C,C,CAM1CnB,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAlOjEsB;E5B1iCO3e;;G4B4iCW,WACduH,OAAW6R,KAA0BoG;uBAMrCjY;gBAHmB4S,KAAaF,kBAz8B1BrB,KAAEqB,YA88BZ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAVqD,YAAI,SAAI,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAazB,YAAI,MAAG0E,kBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAmFtC,YAAQpX,WAAOkY,UAAV;SAA2BA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2E,C;A,G,CA2OxDxf,WAAuB,oBAAgB,A,C;A,G,CAEvC8R;EACM2N;;4CACF;KAEA,SAEJ,A,C;A,G,CAEAtY,iBACMyX;GAAoB,QAAS;gBAGzBC,KAAmBC,yBAFpBF;SAAP;SAGF,A,C;A,E,C,CAWAle;EACwCgf;EAClBlO;iBAEpB;sBvCtsCoCxQ,8BuCssCpC,UvCpsCekI;GuCqsCTyW;EACgB7Q;;;;EAShB,eAEJxH;SACAwU;OACF,EAEOtK,kBAAsC8N,SAC7C;sBvCxtCoCte,8BuCwtCpC,UvCttCekI;GuCutCTyW;EAE4BxF,AAAAA;;;EAOdyF;QAEGA;EpCh+ChBhe;EoCw+CD,SAFY,KAIhB0F;SACAwU;OACF,AAEA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEApb,iBACMie;GAAe,QAAS;EACJkB,aAAjBlB;SAAP;SACF,A,C;A,E,C,CAEAje;;EAGkCof,AAAAA;qBAAAA;EAAAA;EAC5BC;GAAgB,cAEd;aAENzD;eAGiDgD;GAC5B,QACnBhD,mBAMF;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA5b,iBACM2b;GAAc,QAAS;EACJ2D,aAAhB3D;SAAP;SACF,A,C;A,G,CAEAlV,iBACM8Y;GAAkB,QAAS;gBAEmBC,KAAcpB,yBADzDmB;SAAP;SAEF,A,C;A,G,CAcA9Y;EACMwV;GAAiB,QAAS;EACjB,8BACb;MAAgCC,6BvC1yCI5b,8BuC0yCpC,UvCxyCekI,IuCyyCb5B;MAAOwU,WACT,+BACOa;SAAP;SAEF,A,C;A,G,CAEAxV,iBACM0V;GAAe,QAAS;gBAExBkC,KAAcD,WAAUlD,yBADrBiB;SAAP;SAEF,A,C;A,G,CAEA1V;EACM8V;GAAoB,QAAS;EACpB;aAolCyB9E,AAAAA,AAhlCtC6D;qBAglCsC7D,AAAAA,AA/kCtC6G;qBACAtF;KAAAA;+BACOuD;SAAP;SAEF,A,C;A,E,C,CAoDArE;EAihCwBT,AAAAA,AAhhCIyD;GACf,SAAWE,SAAmB,AAACA,gBAGxBA;GACZ,eACI,KAAA;MAGR;MAAOC,cAGH,KAAA,UAA4BF,wBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjD;EAigCwBT,AAAAA,AAhgCIyD;GACf,SAAWE,WACJA;GAGZ,eACI,KAAA;oBAIN,MAAOC;KAEP,MAAOA,iBAIL,KAAA,6BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CA+BAkD;EACMkB;cACEV;;4CACFU,QAASC,AA1uCRjH,KzCjb4B5M;;EyC6pDZ8T;gBvC15C8B5I,KAAAA,MAAoBO;wCuC05CnE;KAAA,OACE,MAAA,KvCx3CS9O,MuCw3CT,OAIEyR,AAJF,YAKA,AACF,GAEEwF;6CzBzrDgC9Q,AyB0rDD+L,gCAGrC,SACF,A,C;A,G,CAEA1a,iBACMwc;GAAgB,QAAS;EACzBC;cACUmD,KAAsCZ,qBAAlDvC;0BAG2CA,uBADtCD;SAAP;SAEF,A,C;A,G,CAEAtD;EACMsF;mCAE6CI;GAC3B,WAEJH,wBADSC,WACvBF;iBAEqBY;EAAAA;qBAAAA;EAAAA;;EAERvG;EACTC;GAAc,QACE,WACV,KAAA;EAEML,KAA0BK,KAAxC0F;iBAI8B,eACjB/F,OADb+F;YAKN,MAAmB,mBAAiBA,QACtC,A,C;A,E,C,CAEAtG,sBAu5BwBT,AAAAA,AA94BEoI;YACF,CAACzE,aAEf,KAAA;GAGJ,CAACA,OACHvM,KzBpvDoCF,SyBsvDtC;MAAO0M,MAAQD,WACjB,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAEAhc,WAA+B,SAAO,A,C;A,G,CAEtC8Z,WAAoC,YAAO,A,C;A,E,C,CAE3ClZ;uBAEiD4e;EAE3B,QAOTF,cAAAA,8CAGX;gCACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA1e,iBACM2e;GAAuB,QAAS;EACJmB,aAAzBnB;SAAP;SACF,A,C;A,G,CAEA3e;EACK+f;GAAqB,QAAS;;EAGqBf;WAC3B,QAC3B;QAAkB,EAAEhG,gBACsBA;kBACxCpS;8BA9oDQqR,KAAEqB,WAgpDZ,0BACOyG;SAAP;SACF,A,C;A,G,CAEA/f,WAAmC,YAAuB,A,C;A,G,CAI1DP,cACM,CAH4C,KAArBuZ,KAAAA,oBAInB,KAAA,uDAGR;gBAAyB4F,cAC3B,A,C;A,C,C,CAMAlC,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAnQjEC,cACE/V,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAGsB,YAAQA,WAAOkY,UAAV;SAA2BA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA+MpD5F,YAEE,MAAOuF,+BACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gC,C;A,G,CA8HJnf,WAAuB,uBAAmB,A,C;A,G,CAE1C6Y,YACE,MAAOsG,MAGsBgB,sBAHqCO,UACpE,A,C;A,G,CAEAnF,WAA4B,MAAG4E,SAAM,A,C;A,G,CAErCzf,iBAEMyc;cACWwD;kBAAbxD;UAGF,MAAOA,AAAAA,sBACT,A,C;A,E,C,CASApC,YAA6B,SAAuB6F,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE5D,iBACMC,aACI,KAAA,UAA4BhF,KAAaT;EAE5BwF,WACvB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAtFA3f;EAIkC6f;EAC5BC;SAGF;cAJ8BD;EAOjBC;;EACFC;;EACFC,KAAUD,MAAwB;SAE9B;EAEQ;EAIQA,SAFzB;EAGQA;GACF,OACKE;EACNF,OAAwB;IAIjBlI,cAGAhK;;QAKC6J;EACawB;avC9nDInZ;8BuC8nDlC;UAAA,UACwB,KAAlB2Y,AvC7nDOzQ;MuCioDb,sBAvC8B4X,SA0ChC;0B5Bp1DO/gB,K4Bm1DcghB,qBACOpI,SAO9B,A,C,E,C,CAmBAzW,eACW,OAAc,MAAO,MAAY;GACjC,QAAe,OAAQ,MAAY;GACnC,OAAc,MAAO,MAAY,KAC1C;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,G,CAmBAif;;EAgB+DzD;;;;;;;;gBAErD,KAAA;EAEuB0D;qBAAAA;E5B15DxBrhB,K4B05DwBqhB;;8CnCyIQzQ,OmCtI1BjF;;EACAoD,WnC0IwB6B;WmCxIjCpB;EAEe,0EAMboJ;kBAIN;SACF,A,C;A,E,C,CAQA3Y,YAAkB,+BAAwBqe,KAAmBX,cAAa,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAW1EN,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,4C,C;A,G,CAqDnEpd,WAAuB,qBAAiB,A,C;A,G,CAExCU,iBACM2gB;GAAY,QAAS,QACzBC;UACA;MAAOD,SACT,A,C;A,E,C,CAEAvhB,WACE,wBAA8Bmc,QAChC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAV,WAA4B,MAAG4E,SAAM,A,C;A,G,CAErCtH,WACEyI,UACA;MAAOC,SACT,A,C;A,G,CAEA7gB;EACMyc;cACwBlB;EAAhBqE;EACakB;6BAAAA;;EACD;GACb,WAGY7X;qDAGeA;OAt8DjBwQ;GAAM;;;aAy8DWxQ,0BArBTwW,kBA0BnBxW,KAAwBmQ,AAFD2H,AAxBJtB,oCAAAA,YA8BrBuB,QACFH,QA/BuBpB;KAiCvBoB,QAAchV;EAGD5C,IACf;MAAoC4C,UAApC,qBnC5vDAoV,OAKkC/X,SmCuvDlC,avCt1DWV;;;;GuC01DH,EAAES,qBACgCiY,sBA8GpCjJ;OA3GiBhP;gBAEHiY,kBAyGdjJ,WAtGK;uBAATkJ;OACF,CAEFR;gBACqCS,uBAArC3E;UAEF,SACF,A,C;A,E,C,CAYA7B,iBAIM,CAACyG,SAAY,CAACL,aACV,KAAA;IAEY,KAAhBF,QAAmBlY,WAA8B2S,mBAE7C,KAAA,KACF9B,WAAOiB,kBAMb;MAAgCa,iBACtB,gBACZ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAlB,eACMiH,QACF,MAAO1G;UAGD,KAAA,6BAEV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA2G,iBACMC,QACF,MAAO5G;UAED,KAAA,UAA4BO,KAAaT,wBAEnD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,G,CASAtb,WAAyB,MAAG,CAACkiB,SAAY,CAACE,SAAY,CAACR,QAAa,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAxJpEzgB;EAIsB4H;qBAAAA;EACbc;EACWwY;EACF,IAAetZ;EAI3Bc;;;4BAPgBd;E5B99Db9I,K4B6+D8B4J;qBAfjBd;E5B99Db9I,K4B8+D8B4J;OAGjCgP,OADJ;kBACgD,2CAElD,A,C,C,C;A,E,C,C;A,G,C,4B,C;A,G,CAwKA3Y,WAAuB,wBAAoB,A,C;A,G,CAE3C6Y,YACE,MAAOsG,MAAwChF,QAAOuG,SACxD,A,C;A,G,CAGA5gB,WAAkB,SAAQ,A,C;A,G,CAG1BA,YAAiB,SAAQ,A,C;A,G,CAWzBY,WAEE,MAAO0hB,AAAAA,MAAAA,0BACT,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAD0B,YAAQ,MAAGrG,wBAAsB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,CAa3DsG,YAA+B,MAAGhJ,SAAQ,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,G,CAE1CrZ,WAAuB,sBAAkB,A,C;A,G,CAYzC6Y,WAAmC,YAAS,YAAwB,A,C;A,G,CAGpE0C,WAA4B,YAAS,YAAwB,A,C;A,G,CAG7D7a,WAAkC,YAAS,YAAwB,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,G,CASnEP,WAAuB,YAAS,YAAwB,A,C;A,G,CACxDyZ,WAA2B,YAAS,YAAwB,A,C;A,G,CAC5DlZ,WAAsC,YAAS,YAAwB,A,C;A,G,CACvEyG,WACI,YAAS,YAAwB,A,C;A,C,C,CASrCiW,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CACnExE,gBAGI,YAAS,YAAwB,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CACrCA,YAA0C,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAC3EA,cACI,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CACrClY,WAA2C,YAAS,YAAwB,A,C;A,G,CAC5EA,WAAmC,YAAS,YAAwB,A,C;A,G,CACpEmY,WAAmC,YAAS,YAAwB,A,C;A,G,CACpEjK,WAAsB,YAAS,YAAwB,A,C;A,G,CACvDA,YAAyB,YAAS,YAAwB,A,C;A,G,CAC1D9O,WAAmB,YAAS,YAAwB,A,C;A,G,CAGpDY,WAAkC,YAAS,YAAwB,A,C,C;A,E,C,C;A,G,C,oB,C;A,G,CA0BnEZ,WAA+B,SAAO,A,C;A,G,CAItC+Y,iBACMyJ;GAAkB,QAAS;EAfUC;qBAgBrBD;SAAP;YACT,uBAAwBA;SAAP;WAEjBnD,KAAwChF,cADrCmI;SAAP;SAEF,A,C;A,G,CAEA5hB;EACM8hB;GAAkB,QAAS;;EArBmBD;eAyBhD,+BvCtlEkCvhB,kCuCslElC,aAEqD,GADnDsG;qBvCrlEW4B,qBuCy8DLyP,qBA8IR;cAGA,8BvC5lEkC3X,8BuC4lElC,aAEqD,GADnDsG;qBvC3lEW4B,qBuCy8DLyP,qBAoJR,gBAGA,MAAiBnH,gCvClmEiBxQ,8BuCkmElC,UvChmEakI,IuCkmEX5B;gDAzJMqR,UA0JR,0BAEK6J;SAAP;SAEF,A,C;A,E,C,CAEAxiB;EACMyiB;GAAgB,QAAS;EA/CqBF;eAmDhD,+BvChnEkCvhB,gEuCgnElC,gBvC9mEakI;EuCgnET,OADA,IACGwD,cAEP;4BAKA;8BvCznEkC1L,mCuCynElC,gBvCvnEakI;EuCynET,OADA,IACGwD,cAEP,gCAMA;MAAiB8E,gCvCnoEiBxQ,mCuCmoElC,gBvCjoEakI;EuCooET,OADA,AADA,kBAEGwD,uBAEP;;kBAOE,SAAGA,kBAEH;OAEG+V;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAOAtB,WAA4B,YAAS,YAAwB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAgD3DtI;;;EAGMkB,KAAsBD,UAA0BE,QACpD;MAAOF,MAAAA,aACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASA9Z;EACqBia;;4CAEjB,WAAUsF;2FAIO,cACf;QACsB,cACtB;KAGA,eAGJ;MAAOA,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA0BS,YAAQ,wBAAgB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAQ/B,YAAQ,wBAAgB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,E,CAqH5B9f,YAAe,M/B5qEGuE,A+B4qEAmU,YAAc,A,C;A,G,CAEhCrY,YAAiB,M/B7qEGkE,A+B6qEAmU,gBAAe,A,C;A,G,CAEnCrY,YAAoB,M/B9qEG,AADHkE,A+B+qEGmU,gBAAkB,A,C;A,C,C,CAEzC7J,cAAqB,MAAG6J,AAAAA,gBAAY,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEpCrY,YAAwB,MAAGqY,AAAAA,eAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEnDrY,YAA4B,MAAGqY,AAAAA,eAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3D,cAAqC,MAAGA,AAAAA,iBAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAE1D3X,kBAAwB2X,OAAH;qCAAe,A,C;A,G,CAEpC3X,kBAA0B2X,OAAH;MAAGA,UAAc,A,C;A,C,C,CAGxC,gBAAkC,MAAGuK,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAI7C,cAA6B,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAExCpU,cAAkBoU,OAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE5B,YAAa,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,C,CA/BxBxgB,gBACQ,KAAA,0CACR,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,G,C,M,C,A,E,kB,iB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CEvoFFiF;EAEaqK;OrC4mDJvO,QAA8B,0CqCvmDrC;sBzCiQsCjC,gCyC9PhC,GAHN,UzCmQiBkI;MyCjQf5B;;;GAEMkT,YACFlT,UAAuBkT,kBAG7B,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEArT,uBrC2lDSlE,QAA8B,0CqCxlDrCvD;mBAGA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAgB;;;;;;;mBASE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAjBc,cACV4G,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,c,a,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCpDF8V;EACMuF;KACF,MAAOC;KAEP,MAAOA,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CNiFE3hB,oBACmB,O3BzBjB;wB2BiCA;SACF,A,C;A,E,C,CO/FF,qBAIE;KAAa,UACXuB;EACwBA,OAAhBqgB;OACV,AAEAC,UACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAEA;IAEIC,gBADF,OCJEC;iBDQAH;KAAgBA;SAGpB,A,C,Q,C,I,C,C,C,C,C,G,C,C;A,E,C,CAEA;;8BAIoBC;MAAhBD;MCjBAG;yCDoBgBF;MAAhBA;QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA2BA;GACmB,iBAGfG,UACA;aAEFA;KACIA,YACN,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CEyCEhiB;qDCfUiiB;MAARC;2DAAQD;MAARC;ODkBA,SAGF,A,C;A,E,C,CAodF7N;WACmC;MAElB8N;;;4CACS,QACtB;kBAHF;;kBAKEH;cAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CEhDA,aAAkC,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAGlC,cACEA,aACF,A,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,I,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,WAAA,OAAyB,A,C,Q,C,I,C,C,C,C,C,G,C,C;A,E,C,CCjjBzBI;IAIIC,SAAUC,uBADZ;;kBAGEC;eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIA,kBAIqBC,MAIjBC;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAC,cAAwE,qBAEzB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAI/C,gBACqBF,MAIjBC;QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,CvCAEziB;GACmB,gBAGf,MAAOgiB;MAET;MAAOA,QACOA,YAChB,A,C;A,E,C,CmC3CIW,oBACeC,OAEnB;MAAO,MADU,WAEnB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CKyXE3hB,sBAIEgH;MACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAoSF,oBAEE4a,oBAWF,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA7jB;GACoB,aAAS,MAAOyO;EAEvBuU;MAEFvU,UAAP;iBA/SAuU,QAmTJ,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAhjB;GACoB,aAAS,MAAOyO;EAEvBuU;MAEFvU,WAAP;iBA1TAuU,QA8TJ,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAhjB;GAEoB,aAAS,MAAOyO;EAEvBuU;MAEFvU,aAAP;iBAtUAuU,QA0UJ,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAc,kBAEE,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC,kBAEE,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC,kBAEE,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,kBAIEC,KAHc,SACRtB,WAGR,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAgB,oBAKE,MAAOZ,QAHO,SACDJ,WAGf,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAWA,kBC7vBEuB,QD+vBF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,YACElB,aACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEAA,yBAMEmB;;EAQiC,8BASjC;uBACF,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,wC,C;A,G,CHrwBEC,WAA2C,eAAoB,A,C;A,E,C,CAE/DvkB,kBACKwkB;mCAD2B;OACf,SAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAG9C,iBACEA;mCAAAA;QAAY,IACd,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAxkB,iBAAuBwkB;mCAAJ;MAAiC,CAAjB,SAAqB,A,C;A,E,C,CAExDxkB,iBAEEwkB;mCAAAA;QAAY,IACd,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAxkB,iBACKwkB;mCADuB;MACmB,CAA9B,SAAkC,A,C;A,E,C,CAInD,WAAA,OAAkB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAIlB,WAAA,OAAmB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,M,C,C,G,C,W,C,C,C;A,E,C,C;A,G,C,W,C;A,G,CAiEnBxkB,WAAkB,SAAQ,A,C;A,G,CAgB1BA,WAAmB,MAA4B,CAAjB,AAAPykB,eAA4B,A,C;A,E,C,CAMnDC,iBACMC;GAAY,QAAS;EACJ,UAAdA;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAiBA;EAGwChB;EACJA,OAClCiB;QACAvf;QACqBse;QAArBA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAkBAnO,eAEgBmO,YAAmC;GAE7CA,QACFA;KAGAkB;IA5D0B,AAAPJ,gBAaQpB,eAmDzByB,WAGN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOAvG,cAlG8C,CAAjB,AAAPkG,eAoGlB,4DAGF;kEACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA,iBACM,AA/EoBA,gBA+ECM,KAAAA,UACzBC;WACF,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,iBACM,AApFoBP,gBAoFCM,KAAAA,UACzBE;aACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzP;EApHsBiP;GAAwB,CAAjB,SAuHzB,MAAOE;GAEL,UAAqBI,KAAAA,UACzBN;QAAO;EACaS,SACpBC;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAYA,cACEH,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,cAEEC,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,iBAE6BG,OAC3BA;YACAX;QAAO,AAAPA,kBACAY;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA;EApIuBZ;GAAwB,CAAjB;EAaCpB;YA6Hf;EAGG,GAOjBoB;QAAO,GAEP;KAAO,aAEDd,WACFA;mCAAAA;MAAyB,IACzBpM;WACAoM;;EACOA;GACHA,QACFkB;EAEFlB;mCAAAA;MAAyB;WAElBA,OAEX,AACAc;QAAO,AAAPA;GAxJ6BpB,eA2J3ByB,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,cApM8C,CAAjB,AAAPL,gBKvCGA,AL6OPE,eAEdA,AAAAA,gBAEFW;KAAYC,SACd,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CASA,kBA/K+BlC;YAgLf;GAjMGA,gBAmMfoB,QAAO,AAAPA,SAEAd,AADsCN;eAEtCoB;QAAO,AAAPA;GArL2BpB,eAuLzByB,SAEF;OAEFU,0BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBAhM+BnC,eAiMf,MACdmC;4BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cACM,AAxMyBnC,eAyM3BmC;KAMAb,AAAAA,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAtBmB,YACfhB,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKiB,YACfA,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAKmB,YACfA,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CAeJ,mBACE;MAAuCN,QAClC,WACOoC;yBAEV9B;QACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAuCN,QAClC,WACOoC,QAEV9B,wBACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,iBA5O+BN;GA6OzB,SACF,KACK,WACOoC,QAEV9B,UACF;KAIAgB,AAAAA,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CV7SY;IAENnd,UAAiBke,4BADnB;;kBAGEle;gBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CenFF,oBACOoc;GAAD,AAoDmBa,cApDS,KAAA,gCAChCb;QACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,E,C,C,C,C,C;A,E,C,CAEA;;EAEOA;GAAD,AA8CmBa,wDA7CvBb;UACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,6B,C;A,G,CA8CA5jB,WAAqB,MAAU,AAAPykB,YAAgB,A,C;A,G,CAExCzkB,WAAmB,MAAGykB,aAAgB,A,C;A,G,CAEtC1R,iBAGI0R;KAGAA,UAEJ,A,C;A,G,CAyCAkB,WAA4B,MAtDLlB,kBAsD4BmB,QAAgB,A,C;A,G,CACnEC,WAAgC,MAvDTpB,kBAuDgCqB,QAAkB,A,C;A,G,CACzExI,WAAsB,MAxDCmH,kBAwDsBsB,QAAgB,A,C;A,G,CAC7DC,WACI,MA1DmBvB,kBA0DIwB,QAA2B,A,C;A,E,C,CA6CtDzQ;;8BArByB2N,aACA+C,0BAuBvBC;UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,gB,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3Q;;EArBuB0Q;mCAEf/C,0BAqBNgD;UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,a,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3Q;;wCAlBU2N;wCAoBRgD;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CASAhO,WAEE,MAAOiO,SACT,A,C;A,G,CAEAC,WAEE,MAAOD,SACT,A,C;A,E,C,CAEA,YAEE3B,SACA2B;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cAEE3B,SACA2B;sBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,eAtJ+B,AAAP3B,WA0JpB6B,AAAAA;KAIAC,MAAyBH,QACzBA;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA1B;EAIoB0B,OAClBA;YAEA;WAAe,mBACEI,OACfA;SAGF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA8BA;;6CAQIC,YACA;SAEkBC,SACpBC;UACAC;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,oBAOsBF,SACpBG;YACAD;aACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;;;sDAyB4B,AApQJnC;;MAyQpBqC,UACA;UA9IE,AA9HmBrC,iBA8HE,gCACzBA;SAiJA6B,AAAAA;6BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,iBAvJM,AA9HmB7B,sDA+HvBA;SA8JA6B,AAAAA;+BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CAtNA5B,gBAIEqC,aACF,A,C;A,E,CAZArC,cAIEsC,WACF,A,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,G,C,mB,C,E,CAXAtC,4EAGiE,A,C,E,CAGjEA;;SAKA,A,C,E,CAEAA;;SAKA,A,C,E,C,CAsGAtiB,mBAIE6kB;;;+CAvL6B,AAAPxC,QA2LlBmC;KAEAM;KAGFpe,8BAaJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C,E,C,CAyFA1G,mBAGE;KAEcmkB,OACZA;WACAK;;GACiB;6BAAQ,CAC7B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C,E,C,CAUAxkB;;KACE;;GACM,CAAC0G,QAAoB;EACTA;iBAEWA,SACzBA,AAAAA;aACIqe,QAAkBA,QACtB;kBAEqB;GAEI,AAAvBZ,eAGFa,WACA;SAEUb;MACI,CAACzd,AAAAA,mBAEUA,SACzBA,AAAAA;aACIqe,QAAkBA,QACtB;;GAGE,sBF3BN/d;;;;;GE4HM,MACoB,AAAlBmd,kBACiBc;SAEIve;YAIzBF;GAE+B,AAA7B2d,cACFe;GAGU,QF/HdnE;OEgI4B;;;;;;;;6CApcC,AAAPsB,SA4chB8B;;;SAKFE,SACA;eAIYF,MACZA;iBAEYA;KAEZA;KAAmBY,QAAkBA;;IAIzC,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAtU4B,WACtBP,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAoCY,YAERK,aACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKS,cAEPA,eACF,A,C,Q,C,C,C,C,M,C,I,C,M,C,C,C,I,C,C,C,Q,C,Q,C,I,C,I,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmEoB,WACtBH,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAWwB,WACtBS,yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAqEEvnB;aAE2B8iB,UAAcyD,aACAzd,eACrC;oBAHF;;;sBAME;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,iB,C;A,M,C,CAEA;EAC2BA;;EACDyd;;GAEf,cAESzD,aAAoBqE,oBADpC;;;EAImCA;;;;;MAGjC;SAGqBZ;WACQ;;EAEzBiB;;;SACqB1E,OACeqE,QACAA;SAEfrE,OACcqE,oBAPzC;;;EAUmCA;;;;;MAGjC;;;QAQN,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,qB,C;A,M,C,CAEA;;;QAGqBrE,WAASyD,0BAD5B;;;cAG4Bzd,KAAAA;;;;;SACDA;;;;sDAOzByd;;WAEAkB;0CAeJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAfwB,YAGlBb,uBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAAY;;;;8CAKS;KACjBa;UAEFb,kBACF,A,C,Q,C,C,C,C,M,C,I,C,M,C,C,C,I,C,C,C,Q,C,Q,C,I,C,I,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CC/ORc,cACE,uDACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA+JAlS;;EACyB;;IAER,4CAYFoO,QAKb;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASApO;;EACmB;;IAEF,4CAQFoO,QAKb;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA6CApO;;EACyB;;IAER,4CAYFoO,QAKb;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAIApO;;EACwB;KAEtB;qCAEWoO,QAKX;SACF,A,C;A,G,CAWApO;;EACyB;;IAER,qCAIJoO,QAKX;SACF,A,C;A,E,C,CAGApO;;EAE4B,6BAC1B;0CAIWoO,QAKX;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAkDA8D;iBACE;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA2BAA;iBACE;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAiDAlS;;EACsB;;IAEL,0CAIJoO,QAKX;SACF,A,C;A,G,CAWApO;;EACsB;;MAIL;0CAKJoO,QASX;SACF,A,C;A,E,C,CA2LApO;;;2CAC6B;EACP;;IAEL,4CAQJoO,QAKX;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CA/hBM;;QACEL;sCAOEM,aAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CARI,WAAG,MAAY,qBAAS,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CACxB,sBAEI8D,0BAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAKI,WACN/D,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAgBA,YACEL,mCAGEM,uBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAJI,WAAG,MAAGtM,uBAAc,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACpB,aAAK,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAKD,WACNqM,iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAoDA;;QACEL;sCAOEM,aAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CARI,WAAG,MAAGpM,uBAAY,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAClB,sBAEIkQ,0BAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAKI,WACN/D,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAWF;IAAW,MAAI,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEP,WACNA,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkBA,YACE+D,yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEQ,WACN/D,cACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAUA,YACEpc,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEQ,WACNoc,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAyIA,YACE+D,wBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEQ,WACN/D,mCACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAoBA;;MAGA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEQ;QAEJA,cACA;OAEFA,mCACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAmMA;GACY,aACR+D,kBACA;WAEI,YACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEQ,WACN/D,4CACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CP9WJgE;EACEC;GCjf4C,CAAjB,AAAPpD;;;2EAtFZrB;MAARC;;EAiIyBD,IAAzBO;MACAA;MACA;QACA;MACAA;KAAmC,AAAPc;GAsBdpB,SAEZiC,KAAYwC,KDya8C;SACvB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAMvCnoB,YAAiB,MAAwB,CAAA,AlCjlBfM,KkCilBN4nB,wBAAiC,A,C;A,C,C,CAErD7nB;;YAC8B;;2CACK,QAEjC;MAAiB+nB,QAAyB,QAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CASAvS,WACE,MAAOqS,AAAAA,qBACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,WACEA,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,WACEA,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,0B,C;A,E,C,CExfA,YAEEG,QAAU1B,AAAAA,cACZ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iCAEEhT;QAAW4S,OAAmCI,SAChD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,+BAEE2B;QAAU3B,AAAAA,cACZ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EAuDyB7B;GAA0B,CAAnB,SAtDb;EAIsB,CAAA,AAAtB,YAAjBA;;GAEI,OAAuB,AAATyD,iBAAkBA;GAyddzD,SA2BLA,WAtcgB,WAIH,UAjDO0D,QAAeC,YACtD,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAEA,kBA4CyB3D;GAA0B,CAAnB,SA3Cb;GA+CU,cAmC3BA;;GA/EM,SA2C8C,CAAtB,WA1CP,AA4fL4D,AA5fMH,iBAElBA,AAAAA;OAGO,CAAA,iBAAPzD;;IAoCwB,UAnCN0D,QAAeG,cAIzC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA9S,iBAIS,CAAA,AAAPiP,uBAAAA;;GAuBiD,CAAnB,SAtBb,MAAO8D,QACxBC;SACA;MAAOD,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CA6BAvoB,WAAkB,MANW,AAAPykB,cAMQ,A,C;A,E,C,CAE9B;EACS,CAAA,AAAPA,cAAAA;;GAVoD,CAAtB,aAY5ByD;GA0ZoBzD,SA2BLA,WAlca,UAeZyD,YAClBK;QAAgBhD,UAClB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAyBA,oBA5CyBd;GAA0B,CAAnB,SA8Cb;GAzCS,KA2CxBO;KAEAyD,uCAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,oBAtDyBhE;GAA0B,CAAnB,SAuDb;GAlDS,KAoDxBQ;KAEAwD,4BAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,iBA/DyBhE;GAA0B,CAAnB,SAiEb;EACV,CAAA,QAAPA;;GA7D0B,KA+DxBU;KAEAsD,cAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMA,YAEA,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,YAEA,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEAjT,YAEA,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUA;EAC8B0S;mCACIA;UAChCQ;EAlGuBjE;IAAO,aAoGrB,CAAA,SAAPA;;GACI,MACFyD,AAAAA,kBAGN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIA,kBAlH4BzD,OAuH1BA;QAAO,CAAA,SACP6B,AAAAA;WAAsB0B,UACtBvD;QAAO,CAAA,AAAPA,uBACAkE;QA1HwD,CAAvB,UA2HnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EA7H4BlE;;GAUiC,CAA1B,UA0I/BA,QAAO,CAAA,SACP+D;SAIEI;gBAGFA,UAEAD;QA9JsD,CAAvB,WAgKnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,WAcEH,SACA/D;QAAO,CAAA,AAAPA,eAIEoE;wBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CASA,kBAhM4BpE,OAmM1BA;QAAO,CAAA,SACPhc;UACAgc;QAAO,CAAA,AAAPA,uBACAkE;QAtMwD,CAAvB,UAuMnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYA;EA9MyBlE;GAA6B,CAAtB,WAkdZ4D,AAlQCH,oBACV,CAAA,iBAAPzD;;GAtNsD,CAAvB,YAS/B,SAAeyD;WA8cCG;;QA/PP,CAAA,iBAAP5D;WAKJ,gBA3NiD,CAAnB,UA6N1ByD,YACA;SAhOoD,CAAvB;cAoO/BzD;QAAO,CAAA;KAEL2D;KAEAE;EAEK,CAAA,AAAP7D,uBAAAA;UAEF,GAvOoD,CAAtB,WAwOX,MACjByD,AAAAA,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,6B,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CA7GE;;EAjIuBzD;GAA0B,CAAnB,WACI,UAmIK,MACrCA;KAAO,CAAA;EACF6B;GAAD,CAACA,WAEHnD;OACS7P;;EAAAA;;KACTgT;KAEAA,UAEF7B,KAAO,CAAA,AAAPA,qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAsBA;;EApK2BA;IAAO,UAuKV,MACtBA;KAAO,CAAA,SACP6B,AAAAA;QAAiB2B,KACjBxD;KAAO,CAAA,AAAPA,qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA4EFmD,wBAKoCkB,eAClCnF;OACAA;SACAA;OAEA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIAoF;;;;wCACE;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,G,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,W,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CAwGA,YACEC,KAAmBtgB,QACrB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CASA,YACEsgB,KAAoBC,QAAOC,SAC7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAMA,YACEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAG,WAAuB,OAAO,A,C;A,G,CAE9B,2DAEA,A,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAsCA,kBATwB1E;SAUL;GATgB,MAa/BA,SACA;OAEF2E,sBAMA3E;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAPoB;;EACDA,IACfA;;SACiC,MACjC4E;aACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,CAsBFrpB,YAAiB,MAAGqoB,eAAwB,A,C;A,C,C,CAE5C,oBACMA;YACkBA,SAApBiB;eAEmBjB,QAAnBA;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EAEwBiB;EACFlkB,OAApBkkB;;WAEEjB,YAEFjjB;QACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,eAhEwBqf,YA2BLA,SAuCG4D;YAApBiB;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,G,C,C;A,G,C,c,C;A,M,C,CCzqB4B,WAAG,MAAG1F,0BAAuC,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQxE,cAA+B,MAAG2F,yBACQ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAOf,WAAG,MAAG3F,mBAAsB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAuBxDgE;;;;;;;gBAMEpgB;OACAA;SACAA;OACA;SACF,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQA,cAEEgiB,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,+B,C;A,E,C,CA+BA,iBDiG+C,CAAjB,AAAP/E,eChGN;oCAEjB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBD4F+C,CAAjB,AAAPA,eC3FN;iCAEjB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIA,iBACMgF;WAAuB,MAC3BA;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,iBACMA;WAAuB,MAC3BA;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEAjU,iBACMiU;GAAc,SAEhBA,YACA9F;OAEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAIA,YACE+F,AAAAA,mBACF,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cAjEEF,aAmEF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,WAjEEA,UAmEF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,CAtDAG;EAEyCC;EACSC,UADhDJ;QAAgBC,AAAAA,AAAAA,gBAE+BI,cACjD,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAgEA;;MAGgBC,sBADd;;kBAGEP;SACA;iBAGAA,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAeA;;MAGkBQ,sBADhB;;kBAGER;SACA;OAEFA,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CA+EA;GACiB,KAAXhR,YACFgR;EACW,KAAXhR,UAAAA;;GACe,UAGbgR,QAGN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CAjBAS,iFAKA,A,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAkDA,iBACiB,KAAXzR,YACFA,QAAU,KAAVA,UACA;OAEFgR,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CAbAU,2DAI6B,2BAC7B,A,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,kD,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,oB,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,M,C;A,G,CCuFA/G,WAAe,MAAGgH,SAAiB,A,C;A,E,C,CAInChqB;EACqBgqB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,iBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjqB;EACqBgqB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjqB;EACqBgqB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,iBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjqB;EACqBgqB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,mBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAnG;EACqBkG,OACnB;OAAOC,AAAAA,yBACIA,QACX,AACA;MAAO,qBACuBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAlG;EACqBiG,OACnB;OAAOC,AAAAA,yBACIA,QACX,AACA;MAAO,qBACuBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjG;EACqBgG,OACnB;OAAOC,AAAAA,yBACIA,QACX,AACA;MAAO,qBACuBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EACqBD,OACnB;OAAOC,QAAAA,iBACIA,QACX;EAC8CA,QAE9ChB,AAD6BgB;kCAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAtG;EACqBqG,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,iBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAWA;EACqBD,OACnB;OAAOC,QAAAA,kBACIA,QACX,AACA,AAACA;2BAC6BA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjH;EAEqBgH,OACnB;OAAOC,QAAAA,iBACIA,QACX;EAC8CA,QAC9C;MAAO,AAACA,qCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAsBApqB,YAAqC,MAAGqqB,cAAcC,QAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1EnqB;MAEWoqB,UAAP;oBADF;;kBAGE;MAAOC,eAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEArqB;MAEWsqB,YAAP;oBADF;;kBAGE;MAAOD,eAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEArqB;MAEWuqB,cAAP;oBADF;;kBAGE;MAAOF,eAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAvG,oBAC4B0G;KAExB;KAEA,wBAEJ,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzG,oBACiC0G;KAE7B;KAEA,wBAEJ,A,C,mB,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzG,oBAEkC0G;KAE9B;KAEA,wBAEJ,A,C,mB,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAvBW,WAAG,MAAG,mBAA0B,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEhC,WAAG,MAAG,mBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAOzB,YAAM,MAAG,qBAAoC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAE7C,YAAM,MAAG,qBAA6B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQtC,cAAa,MAAG,uBAA4C,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAE5D,cAAa,MAAG,uBAAqC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,G,CAkBhE1H,WAEE,MAAOiH,AAAAA,eACT,A,C;A,C,C,CAEAzjB;EACekI;EAAAA;YACSA,QAAuB,QAEzB;MAAOub,AAAAA,gBAG7B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAIAjqB,cACE,MAAO,6BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAgjB,cACE,MAAO,6BACT,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,iC,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAhjB,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA,cACE,MAAO,6BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAA,gBACE,MAAO,+BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA8jB,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,YACE,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAL,cACE,MAAO,6BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAMA,cACE,4BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAKS,WACPM,8BASF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CATyB;QACrB/gB;;;;;OAE6C4lB;GACnC,QACR5lB;aAGJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAqGmB,8EAIjBynB;gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,G,CAQFC,WAAmD,cACvB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CAC5BC,WAAmB,cAAW,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CAC9BC,WAA6B,cAAgB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CAC7CC,WAA+B,cAAiB,A,C;A,E,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C,C,C;A,G,CAChDC,WAA6C,cAAwB,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CACrEC,WAAuD,cACzB,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CAC9BC,WAAyD,cAC1B,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CAC/BC,WAA+C,cAAyB,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CACxEC,WAAmC,cAAmB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CAGtDC,YAAuB,cAAa,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,I,C,C,M,C,C,C,C,C;A,G,CACpCC,WAAqB,cAAY,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,oB,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,G,CAMjCtI,YAAgB,OAAO,A,C;A,G,CACvBuI,WAAqC,YAAiC,A,C;A,G,CACtEvI,WAAoB,YAAO,A,C;A,E,C,CAE3BnjB,YAAqC,MAAGsqB,gBAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEpE3jB,cAAwB,OAAO,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAI/BxG,cAA0D,MACtDwrB,0BAA6D,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEjExI,cAA6D,MACzDyI,0BAAsD,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,iC,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAE1DzrB,YAAiB,MAAG0rB,wBAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEjD1rB,cAA8B,MAAG2rB,0BAAuC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAExE3rB,gBAA6C,MACzC4rB,4BAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEnD9H,YAAmC,SACW,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE9CC,YAAgD,SACG,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEnDC,YAAyD,SACL,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEpD,YACE6H,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAlI,cAA+C,MAC3CmI,0BAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKnD,cCj2BA5H,ODi2BwB;OAAqC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C,A,E,mB,kB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CIt2B/DrkB,cAA0B,MAAK,WAAI,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEnCL,YAAwB,MAAGqB,SAAU,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C7CD7BG;;wBAME;iBAoBN;MAAO,iBACT,A,C;A,E,CAEMA,cAA2B,mDAAwB,A,C;A,E,CAq4BnDA,YAA2B,iDAAqB,A,C;A,E,C,C8CrhBxDjB;GACMgsB,eAAsC,aAC1CA;;;IAGEC,kBAEAD,iBAEM,SAAA;YAAA;SAAR;M3C5I2Bvf,M2C6I7B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA;EAiBgBzL;;GAGd;eAAc,MAAwB;GAChC,CAAC6Y,MAAe;MACHA,OACjB1F;;GACsB,AAAZhP,eAEZ,GASI,CAAC0U,UACO,KAA4B;;EACrB1F;;EACGA,eAEN0F;GAEV,CAACA,UACO,MACR1F,cACA;;;EAGkBA;GACY,AAAtB+X,kBAECrS,UAIX;KAAOA,iBAEMA;GAED,OAQR,eAAc,MACD;;EACyB,KAA1B1F,KAAAA;6BAA0B;SAEtC,AACAA,aACA;QAEJ;;GAIqD,AAA3B,AAAtB+X,SAAwBC,eAOtB,EAAe,AAAbhY;mBAQZ;eAAc,MAA+B,AAAbA;;EACM,KAA1BA,KAAAA;6BAA0B;;;SAKtC,GACY,QACVA,SAEFA;SACAA;UACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C9ChEQlT,2CAME;wCAMA;oBAcN,MAAO,iBACT,A,C;A,E,CA20BMA,kBAME,wDAqBR,A,C;A,E,C,C+C5vCAiB;IACE;iBAAkB,EAAE2U,gBACJA;;yBAAwB,cACxC,EAEa;IAEXA,cACAvP;;MAEA8kB;qBASA9kB;;8BAGAuP;QAGF,M5CwKyBpK,S4CvK3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,kB,C;A,E,C/C3CAhN,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,G,CAE/BxD,YACE,2CACF,A,C;A,G,CAEAA,YACE,MAAO,oFACT,A,C;A,E,C,CAEAV;wBA8L8B,mBA5LZusB,OACd;kBAiNW,6DA/MAC,OACX;kBA8MW,kBA5MAC;WACO,QAElB;MAAqC,AAA9BC,WAsOEC,mBApOb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA3sB,kBACS4sB,SAAAA;UAAP;MT0M6BnsB,0BSzM/B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cACEmB,uBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEA4M;wBAqK8B,mBAnKZ+d;;;eACd,2DAEWC;;;eACX,gBAEWC;WACO;IA+MTE;EA7MGD,YACZ;MAAc,YAA8C,MAEhE,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;wBAqJ8B,mBAnJZH;cAC4BM,MAArBN;UACrBO,iEAEWN;cACsBK,MAAfL;UAClBM,sBAEWL;cACsBI,MAAfJ;YACPE;;YAGTI,eACA7oB;QAAO,AAAPA,SACAyK;oBAEY+d;GACF,OAC6B;gBAGrCxoB;QAAO,AAAPA,SACAyK;gBAIR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CASAH;wBA+G8B,gBA7G1B,MAAOwe,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IA2JTE;EAzJGD;GACF,IAAK,MAGfxoB;QAAO,AAAPA,SACAyK;YAGA;yBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,eACc,AAARzK,WACyByK,YAAR8d;YAARD;YAAXD;YACAroB;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;EACc0oB,SACZ;MAAyB1kB,aAAe,eAEtCqP;WAAY;OACoB5I,aACxB,KAAA,YAEV,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/N;EACM+N;GAAM,QAAS;QACIzK;;EAITqoB;GACF;UAGV;YAAkB,uBAIlB;EAISC;GACF;UAGP;QAAkB,wBAMlB,GAISC;GACF;UAGP;QAAkB;UAIhB;QAAkB,wBAIlB,CACF,CAGK9d,SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,+BAEIzK,QAAO,AAAPA,SACAyK;aAEFoe,YACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAve;GACY,SAkCG,cAjCDye;WAEV/oB;QAAO,AAAPA,SACAyK;YACA;cAEA,OAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAaAhP,YAIE,MAAkC+a,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAwCA/a;WACsB;UAEpB;QAAkB,YACiB,aAAQ,QAC3C,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,C,CArCAyC,wBAIE;oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,E,C,CAEAA;YAYA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C,E,C,CAoBAA,oCAQE2qB;;gCAEA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA5QwC,YAAO,MAAG,eAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmB/B,YAAO,MAAc,MAAX,sBAAcrkB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAIpC,cACZ,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CAuPF/I,YAIE,MGpUyC2e,mBHqU3C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA3e;WACsB;UAEpB;QAAkB;yBACkC,SACpD,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,4B,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CAUA6O,iBACM,AAAC0e,gBAAgB,MACrB;0CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAltB,eACM,AAACktB,gBAAgB,QACrB;sCACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA1e,iBACM,AAAC0e,gBAAgB,MACrB;2CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAvtB,YAIE,MAAkCwtB,sBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAxtB;WACsB;UAEpB;QAAkB,YACZytB,qBAA4C,QAClD,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAltB,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAlC3C+e;yDACiE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAd,gCAAI;SAAQC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAyC/D3tB,YAAe,MAAGkP,AAAAA,YAAY,A,C;A,G,CAC9B7O,YAAiB,MAAG6O,AAAAA,gBAAiB,A,C;A,E,CAErC5N,kBACmC4N;aAAMA;wCAAvC;SACF,A,C;A,E,C,CAEA7O,cACE,MAAO6O,AAAAA,eACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EACcA;EAAAA,MACZ;mBAAwD,SACtDD;OACgCC,UACxB,KAAA,SAEV,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CAWAtO,WAAc,MAAG6I,SAAQ,A,C;A,C,C,CAEzBpJ;EACa2O;EACE4e;EACmB1e;OAAAA,UACxB,KAAA;QACU,aAChBzF,YACA;cAEAA,YAIAmkB;WACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,wB,C;A,E,CAgEA5tB,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,G,CAE/BxD,YACE,2CACF,A,C;A,G,CAEAA,YACE,MAAO,oFACT,A,C;A,E,C,CAEAV;wBA8L8B,mBA5LZusB;WACO,QAErB;MAAY,8DAEDC;WACO,QAElB;MAAY,mBAEDC;WACO,QAElB;MAAqC,AAA9BC,WA8MEC,mBA5Mb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA3sB,YACE,MAAOkI,4DACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cACEtG,uBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEA4M;wBAiK8B,mBA/JZ+d;WACO;MAErB;oBAA+BiB,0DAEpBhB;WACO;MAElB;oBAA+BgB,eAEpBf;WACO;IAmLTE;EAjLGD;GACF,IAAK,MAEf;MAAOc,aAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;wBA2I8B,mBAzIZjB;cAC4BM,MAArBN;UACrBO,iEAEWN;cACsBK,MAAfL;UAClBM,sBAEWL;cACsBI,MAAfJ;YACPE;;iBAGgBc;OAGbf;GACF,KAERc;YAEyBC,gBAKjC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAjf;GACME,WAAkB,MAAO;EACnBgf,UACV;aACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAlf;wBAsG8B,gBApG1B,MAAOwe,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IA8HTE;EA5HGD;GACF,IAAK;kBAIfiB;UAGA;MAAOH,UAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,eACc,AAARtpB,WACkC0pB,YAATC;YAARpB;YAARD;YAAXD;YACAroB;SAuCF4pB;QAAsC,AAAL,AAAfA,oBApCpB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;EAC2BD;EACLC,OACpB;KAAY,UACVvW,SAAOiW,QAAWA;GACA,IAAGM,aACb,KAAA;EAEDN,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;gBAG+BC;KAE3BD,SAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAhf;WACqB;;WAED,MAClBmf;;WAEA;MAAOH,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAUAO;;GAEMF,eACOD,SAATC;iBAEyBD,OACzBJ;MACQQ;QAARJ;UAEF1pB,QAAO,AAAPA,SAbA4pB;QAAsC,AAAL,AAAfA,kBAelB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA;EAC+BN;EACJA;WAGvBK;KAEAjJ;WAIAgJ;KAEAvoB,QAEFnB;QAAO,AAAPA,SAlCA4pB;QAAsC,AAAL,AAAfA,mBAoCpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAaAnuB,YAIE,MAAkC+a,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAoBA/a;WACsB;UAEpB;QAAkB,WAEF,KAAV6tB,cAAkB,QACxB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAeAttB,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,C,CAb3ClM;;gCAUE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAzPwC,YAAO,MAAG,eAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAuBzC,YAAO,MAAc,MAAX,sBAAcsG,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAI1B,cACZ,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CAkOF/I,YAIE,MG3vByC2e,mBH4vB3C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA3e;WACsB;UAEpB;QAAkB,WAEF6tB;yBAAiB,SACjC,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,kC,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CAWAhf,iBACM,AAAC0e,gBAAgB,MACrB;0CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAltB,eACM,AAACktB,gBAAgB,QACrB;sCACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA1e,iBACM,AAAC0e,gBAAgB,MACrB;2CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAvtB,YAIE,MAAkCwtB,sBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAxtB;WACsB;UAEpB;QAAkB,WAEZytB,QAAQI,mBAAiB,QAC/B,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,M,C,C,E,CAlCAS;gEAEiE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAd,gCAAI;SAAQX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,O,C;A,E,CAkD/D3tB,YAAe,MAAGkP,AAAAA,YAAY,A,C;A,G,CAC9B7O,YAAiB,MAAG6O,AAAAA,gBAAiB,A,C;A,E,CAErC5N;EACyC4N;aAAMA;wCA2B7Cqf;KAAQrf,IA3BR;SACF,A,C;A,E,C,CAEA7O,cACE,MAAO6O,AAAAA,eACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EAC2BA;EAAAA;EACLA,IACpB;KAAY,UACVD,SAAE4e;GACgB,IAAG3e,UACb,KAAA;EAED2e,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CAaAjtB,WAAc,MAAG6I,SAAQ,A,C;A,C,C,CAEzBpJ,iBACwB6O;GAAH,AAAfif,UAAkBjf,UACd,KAAA;OACGqf;YACT9kB,YACA;cAEAA,QAAW8kB,OACXA;QAAQA,AAAAA,aACR;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,K,C;A,E,CA+DAjtB,gCACsCktB;wCAApC;SACF,A,C;A,E,CAEAxuB,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,E,C,CAE/BlE;wBAkLsC,mBAhLpBusB,OACd;kBAuMW,6DArMAC,OACX;kBAoMW,kBAlMAC;WACO,QAElB;MAAwC,AAAjCC,WA4MEC,mBA1Mb,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEApsB;0BAmKsC;;KAjKlC,MAAO;EAEEksB;WACO;IAmMPE;EAjMCD;GACF,IAAK,MACf;MAAO0B,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAGApuB;wBAsJsC,mBApJpBusB;;;gCACOA;;IACrB,MAAOO,gEAEIN;;;gCACOA;;IAClB,MAAOM,qBAEIL;;;gCACOA;;MACPE;;;QAMC,AADED,gBACI;UAGlBxoB,QAAO,AAAPA,SACAmqB;YACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAA,QAAA,OACEC,SADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAtuB;wBAqHsC,gBAnHlC,MAAOgtB,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IAmJTE;EAjJGD;GACF,IAAK,QAGfxoB;QAAO,AAAPA,SACAmqB;;aAIA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAoBA,eACc,AAARnqB,WACyBmqB,YAAR5B;YAARD;YAAXD;YACAroB;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAtD;EACMytB;GAAU,QAAS;QACAnqB;;EAITqoB;GACF;UAGV;YAAkB,uBAIlB;EAISC;GACF;UAGP;QAAkB,wBAMlB,GAISC;GACF;UAGP;QAAkB;UAIhB;QAAkB,uBAGlB,CACF,CAGK4B,SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAruB,iBA4Ce,WA3CuB;MAEpCkE;QAAO,AAAPA,SACAmqB;YACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAruB,iBACY,SAmCG,uBAjCXkE;QAAO,AAAPA,SACAmqB;YACA;cAEA,SAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAcA1uB,YAKE,MAAkC4uB,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAwBA5uB;WACsB;UAEpB;QAAkB,WACiB,aAAY,QAC/C,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CAmBAA,YAIE,MGhrCyC2e,mBHirC3C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA3e;WACsB;UAEpB;QAAkB;yBACsC,SACxD,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,e,C;A,E,CAyEAY,WAAc,MAAG6I,SAAQ,A,C;A,C,C,CAEzBpJ;EACiBquB;EACFd;EACuBiB;OAAAA,UAC5B,KAAA;QACU,aAChBplB,YACA;cAEAA,YAIAmkB;WACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAuEAtsB,qCACyC6sB,0BAyXvCI;KAAQM,AAAAA,OAzXR;SACF,A,C;A,E,CAEA7uB,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,E,C,CAE/BlE;wBA+MsC,mBA7MpBusB;WACO,QAErB;MAAY,8DAEDC;WACO,QAElB;MAAY,mBAEDC;WACO,QAElB;MAAwC,AAAjCC,WAiOEC,mBA/Nb,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEApsB;0BA4LsC;;KA1LlC,MAAO;OAEIksB;WACO;IAwNTE;EAtNGD;GACF,IAAK,MACf;MAAO0B,AAAAA,kBAEX,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA;EAC2BP;EACLC,OACpB;KAAY,UACVvW,SAAOiW;GACW,IAAGM,aACb,KAAA;EAEDN,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAOAjtB,kBACMqtB;6CACJ;MAAOA,SACT,A,C;A,C,C,CAGA5tB;wBAwJsC,mBAtJpBusB;;;gCACOA;;IACrB,MAAOO,gEAEIN;;;gCACOA;;IAClB,MAAOM,qBAEIL;;;gCACOA;;MACPE;;iBAGgBc;QAIf,AADEf,gBACI;OACSe,YAG3B,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAA,QAAA,OACEa,SADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAtuB;wBAuHsC,gBArHlC,MAAOgtB,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IAiJTE;EA/IGD;GACF,IAAK,QAIfiB;yBACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAmCA,eACc,AAARzpB,WACkC0pB,YAATC;YAARpB;YAARD;YAAXD;YACAroB;SAyBF4pB;QAAsC,AAAL,AAAfA,oBAtBpB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA9tB,iBAEW,WAAS;KACaytB,UAC/B;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAztB;WACqB;;WAED,QAClB2tB;;WAEA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUAc;;GAEMZ,eACOD,SAATC;iBAEyBD,OACzBJ;MACQQ;QAARJ;UAEF1pB,QAAO,AAAPA,SAbA4pB;QAAsC,AAAL,AAAfA,kBAelB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA;EAC+BN;EACJA;WAGvBK;KAEAjJ;WAIAgJ;KAEAvoB,QAEFnB;QAAO,AAAPA,SAlCA4pB;QAAsC,AAAL,AAAfA,mBAoCpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAcAnuB,YAKE,MAAkC4uB,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAoBA5uB;WACsB;UAEpB;QAAkB,WAEE,KAAd6tB,cAA0B,QAChC,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C,C;A,E,C,C;A,G,C,e,C;A,E,CAyHAjtB,WAAc,MAAG6I,SAAQ,A,C;A,C,C,CAEzBpJ,iBACwBwuB;GAAH,AAAfV,UAAkBU,UACd,KAAA;OACGN;YACT9kB,YACA;cAEAA,QAAW8kB,OACXA;QAAQA,AAAAA,aACR;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,CgD/uDAvuB,YAAe,MAAG0Y,MAAAA,SAAc,A,C;A,C,C,CAChC9X,cAAwB,MAAG8X,MAAAA,WAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CCmCnDzX;+BAC+B;UAAwB,4BACb;;yBAExC,MAAA,kBAAA,aAAA;EAAgC;8BAAR4G;OAAqB,AAC7C,SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAIAtH,YAAkB,MAAGO,oBAAwD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CHgJ7EC,cAA2B,MAAG,qCAAuC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAErEA,cAAqC,kDAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKrEV,mBACE;MAAA,cAAA,UACQ,KADR,UACoB,QACpB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAA,cAAA,OAAwB4O,SAAxB,OAAkC,CACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA4BA1O;EACyB;GACnB,CAACwuB,MAAqB;EACJ;UAEpB,SACkBA,O3COpB/hB;KAA6CA,a2CNlC+hB,MAAoB;KAE7BC,SAAgBD,QAChB;KAAOA,Q3CGT/hB,KAA6CA;M2CDzB+hB,O3CCpB/hB;KAA6CA,O2CA3C,CAEF,M3CSyBA,M2CR3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEA3M,mBACE;MAAA,cAAA,UACM4O,SADN,aACkB,QAClB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAhO,cAAwC,MACpC,+BAA0C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,CAI9CjB;EAGgB+uB,aACd;QAAO3U,UAEP,AACA;SACF,A,C;A,G,CAEA/Z,YAAiB,MAAG,CAAC0uB,AAAAA,kBAAmB,A,C;A,G,CAExC1uB,YAAoB,MAAG,AAAC4uB,qBAAO,A,C;A,E,C,CAE/BluB,cACE,MAAO,gCACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMAA,cACE,MAAO,gCACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAcAH;EACgBmuB;GACV,CAAC3U,wCAIL;KACWA;MACHA,MAAc,AACtB;SACF,A,C;A,E,C,CAUA5Z,uBACE;MAAA,cAAA,UAAA;GACMsX,iBAAe,SACrB,2CAGF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,e,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAgCAlX;2CAC6B,SAAW,KAAA,OAEtC;MAAA,kBAAA,UAAA;;GACgB,SAAM;EACX,SACX,KACM,KAAA,QACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAkBAL,YAAkB,MAAG2uB,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,CInW5C5tB,YAAyB,uB1DoQaC,qC0DpQe,A,C;A,E,C,CAErDX,cAAuB,MAAG,aAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAErC;EACe;6BAAA;GACb;KAAkB,SAChBgX,SAAO;GACI,IAAG,gBACN,KAAA,SAEV,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAvX,YAAiB,MAAU,MAAPQ,cAAW,A,C;A,G,CAE/BR,YAAoB,MAAG,CAAC4uB,YAAO,A,C;A,G,CAO/BruB,eACa,KAAPC,gDACJ;MAAO,UAAY,KAAPA,eACd,A,C;A,E,C,CAQAR;EACe;;GACb;YAAoB;6BAAA;KAAF;GACJ,KAAR,eAAoB;GACb,CAAA,MAAG,iBACN,KAAA,aAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAaAA;EACe;6BAAA;GACb;KAAkB,YACZyX,SAAK,kBAAU;GACR,IAAG,gBACN,KAAA,SAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAiDAvX;GACa,KAAPM,cAAa;EACK,QAAA;SACtB;M/C8GyBmM,M+C7G3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEAjM,cAAwC,4CAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE3EA,cAA2B,uCAAkC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA0B7DA,cAA4B,MAAG,qBAAsC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYrEE;iCAGa;UAAwBJ,mBAEZA;6BAAAA;;;8BAEvB;YAAoBA;6BAAAA;KAAF;EACJ;8BAAZgH;WACF,AACA,SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,C,C,CAWA,oBACO,UAAA;UAAW,UAAhB;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,uBACE;MAAA,QAAA,UAAA;EACO,UAAA;UAAW,UAAhB;cACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAxH;GACE;YAAoB;6BAAA;KAAF;GACJ,KAAR,gBACF,YAA6B,KAAZ,gBAAyB,IAC1C;UAAY,KAAZ,cACA;aAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA8BA,YAAe,aAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAahC,czDnQEe,SAAuB,KAATC,iByDyQhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAkBA;GACY,UAAa,MAAE,iBACjB,KAAA,SAA+B;;GAE/B,UAAe,MAAE,iBACjB,KAAA,SAAiC,aAE3C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAJ;EACyB,UACvBC;;EACiB;2BACA;;6BADA;GAEjB;KAAkB,WACJ,SAAW;8BAAvB2G;OACF,AACA,SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA9G,gBACEG,cACA;MAAO,kBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACEA;;EACiB,GACjBiuB;YAA4B,KAAZ,kBAChB;UAAY,KAAZ,eACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA;;GAtCY,UAAa,MAAE,iBACjB,SAA+B;;GAE/B,UAAe,MAAE,iBACjB,SAAiC;EAoCxB;GACN,UAAM;GAEH;;;WASA5tB,AAAAA;iCAZG;;EAeS+V;6BAAAA;GAAF,AAAT;;GAGA,IAEb,MAAoB,IAAO,SACzB,SAAW,IAAOA,MAAqB,KACzC;KAEA,QAAkB,QAChB,SAAW,IAAOA,MAAqB,KACzC,CAEJ,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA4BAtX;EACoB;6BAAA;GAAH,KACb;GAKF;YAA6B;6BAAA;KAAF;GACb,KAAR,eACF,aAEJ,AACA,SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOAA;EAE6B,KAAZ,aASf;kBAA2B,WAAO,YACpB,KAAR,eACF,QAEJ,AACA;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA,sBAC2Ba;6BAAAA;EAAF;UACf,KAAA,SAA+BA;OAE1B,YACX8tB,WACA;OAMF,UAAW,KAAX,cACAQ;UAAe,IAAK,eACpB;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA;WAC2BtuB;6BAAAA;EAAF;UACf,KAAA,SAA+BA;;8CAG1BU;EAESA,OAItB;UAAY,KAAZ;6BAJsBA,OAKtB4tB;UAAe,IAAmB,eAClCC;eACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;;0EAE4B7tB;6BAAAA,OAAxB4tB;YAAsB,YAEtB,MAAA,QAAA,aACY,GAAV;WADF,QAEA,CAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIA5uB;GACMgsB,eACF;EAGW;IAEXA,aACA1kB;SACAA;YACAA;kBAEC0kB,eAGH,M/CpPyBvf,S+CqP3B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CH5ac;GACL,KACDnF;;QAGFA;OACAA;UACAA;QACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,ChD0SJvG,gCAiTa+tB,QACcA,QACTA;wCAnTO;SAAkC,A,C;A,E,C,CAE3D;EAC0BxqB,OACxB;MAAaJ,QAAS,IAAGE,UAAmB,CAAA,AAAL,IAAsB,AAAdD,AAAAA,yBACtCA;0BAAAA,SAAPkT;SAAOlT;GAqMqB,IAAGG,aACzB,YApMR,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAxE,YAAiB,MAAGoE,WAASE,QAAK,A,C;A,E,CAElC3E,YAAe,MAAmB,MAAT,KAAN2E,QAAQF,SAAwB,AAAdC,AAAAA,kBAAkB,A,C;A,G,CAOvD9D;EACM6D;EAASE;;EACND;EAAmB,KAAL,UAAsB,AAAdA,AAAAA;qBAAtBA,SAAP;MAAOA,MACT,A,C;A,E,C,CAQA9D;;GACY,UAAa,MAAEC,oBACjB,KAAA,SAA+BA;EAEhC6D;EAAQD;;EAAkBC;EAAH,CAAA,AAAT,IAA0B;mBAAxCA,SAAP;MAAOA,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAzD;+BAGW;UAAwBJ,4BAEZA;;yBAErByuB,UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,C,C,CAIA,cACElsB,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;;0EAGmBpC;EACF;6BADEA;EAEJ;EAAc0D;EAAAA;GAAH,QAgON6qB;6BAAAA;;;wBAElB5qB;QAAQ2qB,UACR5qB;SACAD;SRnZA3D;eQmLI6D;QAAM,KAANA,kBAG+BA;6BAAAA;EAAF;GAChB,KRvLjB7D,SQwLmC,QAC7B6D;QAAM,KAANA,kBAEwB,GR3L9B7D;SQ4LmC;EAC7B4D,OR7LN5D;eQ8LM6D;WAGJE,QAAkB,AAAlBA,eAEA,MAAA,QAAA,OAA4BzB,UAA5B,OAAyC,CAE7C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/C,qBACE;MAAaoE,QAAS,IAAGE,UAAmB,CAAA,AAAL,IAAsB,AAAdD,AAAAA,yBACjCA;0BAAAA;GACA,KADAA,SAEV8qB,UACA3qB;QAAkB,AAAlBA,SACA;UAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAuCA;EACMJ;EAASE;GAAH,OACR,MAA+CD,UAAAA,WAAc,IAAvC,QAAsB,CAAA,AAAL,+BAAQA,SAC7CA;UACF,AACQC,SAARF;SACAI;QAAkB,AAAlBA,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGAtE,YAAkB,MAAGO,oBAAwD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAiE7E;EACE4D;EAAOC;gCAAPD,SAAAA;;EACoB,CAAA,AAAL,IAAsB,AAAdA,AAAAA,qBAAvBC;;GACIF,YAAgBG,SACpBC;QAAkB,AAAlBA,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYA7E;EAC2B,AAAd0E,AAAAA;GAGO,AAFmB,CAAA,AAAT,EAAED,eACK,KAAV,KAANE,eAIjB,MAAYF,UAEVC,uBAFO,aACkB,CAAA,AAAL;mBACpBA;EAAYA;mBAAZA,SAAAA;OAEF,cAFEA,SAGFA;SACAD;QAAoB,CAAA,AAAL,UACf;MAAoB,CAAA,AAAL,kBAEK,KAAL,KAANE,aAATA;SAEA;MAEED,uBAFO,aACkB,CAAA,AAAL;mBACpBA;EAAYA;mBAAZA,SAAAA;OAEF,cAFEA,SAGFA;SACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA;QAC+C,AAAdA,AAAAA;;;EACnBA;EAAgBD;EAAF,AAAdC,URtXZ5D;;EQwXiC2D;EAAOC,ORxXxC5D;SQwX+B,QAC/B2D;SACAE;QAAQD,AAAAA,cACRA;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA1E;EAEMyE;EAASE;6BAAAA;GAAH,QACW;EACQD;EAAQD,ORlYrC3D;eQmYE;gBAEoB4D;EAAc,AAAdA,URrYtB5D;;EQuYiD6D;6BAAAA;EAAOD,ORvYxD5D;SQuY+C,QAC7C;MAAa,MAAN6D,YAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAnTA8qB;;;mBAOE/qB;oBACF,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,G,C,I,C,E,CARA+qB;;SAQA,A,C,E,C,CAmNAhtB;;EAEyB,CAAN,AAAA,WACjB;eAC0B,CAAA,EAAU;SACb,SAEvB,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,kB,C;A,E,CA+GA7B,WAAc,MAAG6I,SAAQ,A,C;A,C,C,CAEzBpJ;EACEqvB;GA9G8B,AA8GJ7qB,UA9GOA,UACzB;EA8GJ8qB;OAAaC,SACfnmB,YACA;WAESimB;;cAAAA,SAAXjmB;QAAWimB,IACXC;QAA4B,CAAA,AAAL,IAA6B,QACpD;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,e,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CoD/nBA3vB;EACM6vB;WAAe;EAMMC,OAIzB;0BACSC,QAASlJ;;GACP,YACHA;;EACGkJ,QAASlJ;GACP,aAEiBA,IACxBA;KAAemJ,IACfA;;GAEInJ;UAGNoJ;EAEUpJ;;YACI,YACVA;;EACGkJ,QAASlJ;GACP,aAEiBA,IACxBA;KAAgBmJ,IAChBA;;GAEInJ;UAGNqJ;EAEUrJ;;KAId,AAEAqJ,KAAarJ,IACboJ;KAAapJ,IACbA;KAAeiJ,IACfjJ;KAAgBiJ,IAChBD;SAEAC;SACAA;SACAK;QAAW,AAAXA,SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAsBAC,mBAEE;UAAOvJ,KAAc,aAEnBA,KAAgBoJ,IAChBA;OAEF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAG;GACMP,cAAe;GAEV,CAAA,KADEQ,cACI;EACSR,OACxBS;QAAM,AAANA;EAEIT;EACMA;WAARA;OAIQU,UAARV;SAGAA;OAEFhrB,QAAkB,AAAlBA,SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQA,qBACEyrB;QAAM,AAANA,SACAzrB;QAAkB,AAAlBA;GACIgrB,eACFA,SACA;SAGO;EACKA;MAAZW,MACAA;KAAaX,IACbA;eAEAW,MACAA;KAAYX,IACZA;UAEFA,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAmGA7vB,cAA6B,MAAGywB,cAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAIvD5hB;GAEM,AAAC0e,gBAAgB;GACX,AAANsC,iBAEO,KADEQ,cAGT,MAAOK,AADqBb,UAIhC;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAhhB;GACM,AAAC0e,gBAAgB;EACOiC;GAChB,QAAS,MAAOkB,IAC5B;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;;EAIaL;GACF,WAEPK,AAD4Bb,WAE5B;OAEFc,qDACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAyBA,cACE1uB,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA5B,YACE,MAAQwvB,eACV,A,C;A,G,CAEAxvB,YAAoB,MAAG,AAHbwvB,eAGqB,A,C;A,E,C,CAE/B;;qCAsI2Be,QACPA;mBApIlB;KAAOC,UAC0BA;SAC/B5hB;SAAEuhB,SAAUA,SACd,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAEAxwB,YACE,MAAOswB,SACT,A,C;A,E,C,CAEA,YAvKET,YACAS;SACAzrB;QAAkB,AAAlBA,UAuKF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAxE,YACE,MAAOktB,kBAA8B,KAAZ8C,cAC3B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAhwB,YAcE,MAAOywB,iBAZiBX,gBAYXN,SACf,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEA9uB,YAAqB,2CAAqC,A,C;A,G,CAE1DA;wCAAuB;SAA0C,A,C;A,E,C,CAEjER,YACE,MAAOoO,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CArKAoiB;;;+EAEqE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAd,gCAAI;SAAQpD,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CA8GnD,cAAmB,gBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAiCpDttB,uBACE;+BAAY,aACK,KAAXmwB,OAAqB;GACH,IAAGL,UACjB,KAAA;EAEJK;GAAW,SAAWM,oBAAmB;EACtCN,KACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,E,CAsHFhY,iBACMwY;WAAsB,MAC1B;MAAOC,YACT,A,C;A,E,C,CAEA,iBACE;MACEC,QADU,UACVA;EACOV,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAsBAnwB;EAC4B8wB;GAAH,AAAnBtsB,UAAsBssB,UAClB,KAAA;EAOJD;G5D5PcrwB,c4D6PhBmwB,YACA;YAEoB,AAAlBG,OAAqBhB,SAA4B,AAAba,iBACrBA,O5DlanBnwB;;W4D4YEuwB,QAAwBD;KAExBA,KAAaE,QACbD;QAAwBD,AAAAA,+BActBD;EAOWA,OAAfF;SACAI;QAAwBJ,QACxB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAvEAM,cAIEF,QAAwBR,MAC1B,A,C,C;A,E,C,C;A,G,C,O,C;A,E,CA2EA5wB,YAAe,MAAGmxB,AAAAA,YAAY,A,C;A,G,CAC9B9wB,YAAiB,MAAG8wB,AAAAA,gBAAiB,A,C;A,E,CACrC7vB;EAAyD6vB;6BAhF9BP,KACPA;;oBA+EK;SAAsC,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAO/D5wB,YAAe,MAAGkP,AAAAA,YAAW,A,C;A,G,CAC7B7O,YAAiB,MAAG6O,AAAAA,gBAAgB,A,C;A,E,CACpC5N;EAA8D4N;6BAzFnC0hB,KACPA;;oBAwFK;SAA0C,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CAKnEjD,YAAiC,MAAG6C,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CAK5C3hB,YAAoC,MAAG2hB,SAAU,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,M,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CAQjDJ,YAAiD,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,M,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C,C,A,E,gB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCnkB1DmB,8BA+CE;MAAOC,eAAaC,uBACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CApEMC;;;;+BAIJ;;KAKQ,KAAA,iBAGR,MAAOH,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CCmSA9kB,YAAmC,MAAGnB,QAAe,A,C,Q,C,I,C,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CD1RpB,cAAa,SAAGvC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAE/C0oB;+BAGI;kDASA;iBAAkB,EAAEzwB,kBAOQwwB,WAAUC,kBACtC,AACA;;ExDmlDGjuB,QAA8B,+BwD7kDnC;iBAAkB,EAAE+E,gBACLA,IACbtI;QAAWuxB,WAAYC,oBACzB;gDAQExxB,kBAAmBuxB,qBAAoBC,gBAEzC;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,K,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CClEAlxB,eACY,AAANoxB,cACF;KAEA,8DAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CARAC,mCAAkE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAqBlErxB,YAAkB,uCAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CADrDsxB,oCAA6C,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CA0E7CrxB,cAEuB,MAmKUkxB,QAAkBI,AAnKrBC,eAE9B,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,gB,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAaAxxB,cAE2B,MAgEvByxB,QAA8BC,AAhEAC,eAElC,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,oB,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,G,CAEAC,WAC4B,YAE5B,A,C;A,G,CAEAC,WACwB,YAExB,A,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,G,C,C;A,G,C,O,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA+QA,kBACMC;GAAAA,eACI,KAAA,QAERA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA;GAIM,CAACC;EAVDD;GAAAA,eACI,QAERA;;MAUqBE;GACb,CAACD,cACG;KAAA,QAERD,qBALF;;KAOQ,KAAA,aAGZ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAQAhyB;;2BAEQ,CAACiL,YAAiB,QACtBue,AAAAA;WApFKhjB,WAqFL;yBAEAgjB,AAAAA,kBACA;yBAEAA,AAAAA,mBACC;0BAEDA,AAAAA,kBACA;wCAEAA,OAAAA;UACA2I;SACA3I;UACA;;wEAEA4I;EAEA5I,OAAAA;;GACa,KAATxoB,YACFqxB,QAAerxB;GACf;YAAoBA;6BAAAA;KAAF,UlDnNtB2L;KAA6CA,QkDqNvC0lB;QAAerxB,cACjB,CAEFwoB,SACAwI,AAAAA;eACA;2DAEAI;EAEA5I,OAAAA;;MAEA8C;wBAWA9C;SACAwI,AAAAA;eACA;cAEA,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,M,C,C,G,C,2C,C,E,C,CAtJA5vB;;EAEwB,QAEtBkwB;aANgB,iBAOhB;MlDrFyB3lB,MkDsF3B,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,C,E,C,CAcAvK;;EACqByW;;6BAAAA;;GAGnB;KAAkB,WACDA;GACF,MAEX0Z;iBAGEA;;OAGAA;;QAGAA;;QAGAA;;QAGAA;;QAGAA;EACwC,AAAP,SAAjCA;OA7BwB,KAAU,KAAS;EA8BJ,AAAN,QAAjCA;OA9BwB,KAAU,KAAS;EA+BJ,AAAN,QAAjCA;OA/BwB,KAAU,KAAS;EAgCX,IAAhCA;OAhCwB,KAAU,KAAS;mCAqC7CA,UACAA;;UAEAA,UAEJ,AACAC,OAAuB,WACzB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAuEc;;;GACJ,QACFhJ,IAAAA;mBAEAA,IAAAA;WAEF2I,SACA3I;WACA6I;;OAEF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CClcJnyB,YAAgB,cAAU,A,C;A,G,CAqB1BuyB,WAAyC,kBAAoB,A,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAkB7D7xB;;EAGuE,KAAde;6BAAc;;;GAGrD,AAFEkwB,SAA+BlwB,WAE9BA,QAKEkwB,KAJAlwB,MAAgC,KAAdA,cAOvC;MAAOkwB,aAA2BA,MACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CAqDA7xB;EAOI0yB;EAAQC;IA8MA,oBAGF,AADA,OAAkC,AAAA,CAAzB,iBACD;EAjNM,GAAZA;;;cAARD,SAAAA;KAA+B,CAAA,IAAQ;EACnB,GAAZC;;cADRD,SACAA;KAA+B,IAAgB,AAAP;EACpB,GAAZC;;cAFRD,SAEAA;KAA+B,IAAe,AAAN,QAChCC;QAAY;cAHpBD,SAGAA;KAA+B,IAAQ,IACvC;gBAOoB,GAAZC;;;cAXRD,SAWAA;KAA+B,IAAoB;EAC/B,GAAZC;;cAZRD,SAYAA;KAA+B,IAA2B,AAAN,QAC5CC;QAAY;cAbpBD,SAaAA;KAA+B,IAAoB,IACnD;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAWA/yB;GACY,QAgLA,AAhL2BizB,OAAmB,4BAGnD;;EAyBCF;;;GAtBN;KAAsC,WACrBE;GAEF,UACPD;GAAa,UACTA;QAAY,GAApBD;gBAqKM,qBAnKe,AAAJ,AAAbC;EAG0C;GAC3BE,UADAD,sBAKV,WACHD;EAAa;GAAI,UACbA;;cAKRD,SALAA;KAA+B,IAAQ,KAC/BC;QAAY,GAApBD;KAA+B,IAAQ,YAGnCC;GAAiB,AAAJ;EACG,GAAZA;;cAARD,SAAAA;KAA+B,IAAQ;EACnB,GAAZC;;cADRD,SACAA;KAA+B,IAAe,AAAN,QAChCC;QAAY;cAFpBD,SAEAA;KAA+B,IAAQ,MAG7C,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,M,C,C,G,C,I,C,C,C,A,E,a,Y,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CnD1KAtwB,YAE8B,OAM9B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CoD8BAA,cAA+C,MAAGpB,WAAc,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CChBhEoB;sDAEI,MAAO6I;sCrD+KP0B;SqDlKA;MAAoBhL,oBAAF,WACDA;GACF,mBrD0K4BgL,UAA7CA;yBAA6CA,UAA7CA;wBAA6CA,UAA7CA;cAA6CA,UAA7CA;;GqDhKqB,KrDgKrBA;KAAAA;QqDzJsC,KAAkB,KACM;ECWxC;EtDgGf1M;EA6CsC0M,MAA7CA;yBAA6CA,WAA7CA;yBAA6CA,WAA7CA;csD7IsB;EtDgGf1M;EA6CsC0M,MAA7CA;QqD/IE,QrD+IFA;MqD7IE;SAEF,sB5DsdczD,Y4DrdhB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,CEzGA/H,YAAiC,mBAAwC,A,C;A,E,C,CvDgOrEnB,cACJ,6BACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA7NML,YAAoC,MAAG2e,SAAsB,A,C,Q,C,I,C,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,CAyE3Dlc,gBAGJ,MAAOnC,aACT,A,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,I,C,C,C,I,C,sB,C,Q,C,gB,C,I,C,C,C,C,C,G,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,CAmGMkB;EACU;GACH,OAAa,QACtB,MAAoBqG,aAAF,QAChBA,MACF,AAEF;SACF,A,C;A,C,CwDrHArG;cAEE;MAAA,QAAA,OACER,OADF,OAEA;KACc;EACDA;;;aAEb;8BAAkB;EACDA;uBAAfmyB;OACF,AACA,SACF,A,C;A,E,C,CCjGF;;;WlBKEzO;KkBAEC,YAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,CzDwMQnjB,YAIJ,MAAOlB,SACT,A,C;A,E,CsDlGAkB,YAEE,MAAO,MADe,gBAExB,A,C;A,E,C,C;A,G,C,U,C;A,M,C,CtDlEyB,cACrBqG,WGIoC+H,YHHtC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAsO0B;GAChB,MACJijB,YAEFA;OGvOkCjjB,QHwOlCijB;YACAA;OAASjU;IACR,MACH,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,E,C,C0DnOJre,YAAkB,6CAAyC6yB,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CChCnE7yB,YACE,2BACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,O,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CCoQAF;;;GACM,wCAAsB,QAC1B;MAAQgzB,WAA0BpxB,MAC1BqxB,UAASrxB,KACnB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAyDAjC,cACI,MAAGqzB,SAAAA,QAAiCpxB,SAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAErEjC,YAAiB,MAAGqzB,SAAsB,A,C;A,E,C,CA2C1C9yB;;EnE+XUqJ;IACmC2pB,8BACHA;EmE5W7BC;EACAC,WnEgX2BF,2BACHA;EmEhXxBE,WnEqX4BF,0BACHA;EmErXzBE,WnE0X6BF,2BACHA;EmE1XxBE,WnE+X6BF,6BACHA;EmE/X1BE,WnEoY6BF,6BACHA;IAKQA,kCACHA;EmE1YhCG;KAEV;KAEA,gFAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CASAC,cAEE,MAAO,MACA,AAFEN,QAEAjP,QAAgCkP,SAC3C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C5DzTMK,WAGJrzB,WACF,A,C;A,E,C4DuIAqzB,iBAImC,oDAInC,A,C;A,K,C,I,C;A,M,C,C,G,C,yE,C,E,C,CAjFAlxB;EAuBgBmxB,SlErMNrhB;GkEsME;ElE3EehQ;qBAAAA;EMvDlBjC,KNuDkBiC;qBAAAA;EMvDlBjC,KNuDkBiC;qBAAAA;EMvDlBjC,KNuDkBiC;qBAAAA;EkEyFZsxB,SlEzFYtxB;qBAAAA;EkE0FVsxB,SlE1FUtxB;qBAAAA;EkE2FVsxB,SlE3FUtxB;qBAAAA;EkE6FL,KAA6B,KAA5BuxB,kBlE7FIvxB;;;qBAAAA;EkEkGA,AlElGAA;EMNlBjC,qB4D+GL;MAAO,QADsC,mBAIvC,KAAA,SAEV,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,CAcAqzB;;SAQA,A,C,E,C5DnJMA;;SAIN,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,C4DuFI3zB,uBACuB,QACrB;M5DrIGM,mB4DsIL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAuB,uBACuB,QACrB;M5D9HGvB,c4D+HL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyKFC;;EAEkB;GACP,QAAS;GACT,OAAQ;GACR,MAAO,oBAChB;sBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA,eACQ,OAAQ;GACR,MAAO,WACb;aACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA,eACQ,MAAO,UACb;YACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,C,C,CCtUFwzB,cACE,MAAO,UAAqC,AAAVC,QAAY/xB,eAChD,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMA8xB,cACE,MAAO,UAAqC,AAAVC,QAAY/xB,eAChD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CASA8xB,kDACE;MAAO,UtEzCMnyB,QAAAA,QsEyCgC,AAAVoyB,mBACrC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAQAD,iBAGe,eAAY,KAAA;oCACzB;MAAO,UAAqC,OAAVC,kBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMA3zB,cAAgC,MAAkB,AAAf,SAAiB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMnE5B,cAAgC,MAAkB,AAAf,SAAiB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMnE5B,cAAiC,MAAkB,AAAf,UAAkB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMrE5B,cAAiC,MAAkB,AAAf,UAAkB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAiCrEjC,WAAuB,MAAa,SAAVg0B,cAAkD,A,C;A,C,C,CAU5E3zB;;;2CAC0B,QACxB;MAAO2zB,WAAa/xB,KACtB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC,YAAiB,MAAGg0B,oBAAkB,A,C;A,E,C,CAUtCh0B,cAA8B,MAAGg0B,SAAAA,QAAoB/xB,SAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAErE1B;;EAtB0ByzB;GAoCL,IAGjB,cADI,SAA2B;EAGRP,SAAUQ,QA5DN;EA6DJR,SAAUS,QAtDN;EAwDzBC,kBAAUC,mBACd;WAvE2B,wDAwE7B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,G,C,sD,C,E,CA/JA,sCAU8D,AADV,AADA,AADJ,AADF,AAAvB,cACC,aACE,WACA,UACK,UACD,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA6H5B7zB,eACQ,UAAW;GACX,SAAU;GACV,QAAS;GACT,OAAQ;GACR,MAAO,mBACb;qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACAA,eACQ,MAAO,aACb;iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,G,C7D7GI8zB,WAA0B,0CAAqC,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CqDgCrE9zB,YAAkB,uBAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAYrCA,kBACMyE;GAAQ,QACV,oCAEF;4BACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,C,CAPAsvB,+BAA6B,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAgC7B/zB,YAAkB,yBAAiByE,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAb3CuvB,+BAAwC,A,C,C,CAGxCA,6CAAmD,A,C,E,CAOnDA,qFACqD,A,C,C,C;A,E,C,C;A,G,C,K,C;A,M,C,C,E,CAerDC,6BAAkB,A,C,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CrDqEZj0B;;IACc;;EAEdiP;GAAW,QACb,UAAWA,SAAF,MAAsB,oBACvB,UApBVxC;KAA6CA;aAkBzCwC;EAKSoP,KAAmBpP;8BAvBhCxC;KAA6CA,OAwB3C,EAEEynB;GAAgB,QAClBA,mBAWA;oDAAgDrlB,6BAC/BwP,KAAmB/N,wCAkBxC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CqDjEA6jB,+CASoD,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAepDn0B,YAAkB,gCAA4ByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,C,CADtD2vB,+BAA8B,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAkB9Bp0B,kBAAsB,OAAJ;MAAiB,4DAEU,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CAH7Cq0B,+BAAyC,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAgBzCr0B,YAAkB,oBAAgByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,C,CAD1C6vB,+BAAwB,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAkBxBt0B,kBACMu0B;WACF,iDAEF;uDACUlW,aACZ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CARAmW,+BAAkD,A,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAsBlDx0B,YAAkB,uBAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAErC8zB,WAA0B,OAAO,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAajC9zB,YAAkB,kCAEey0B,sCAAwC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAHzEC,+BAA8C,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CE5U9C10B,kBACMyE;WAAiB,iBACrB;2BACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAmBAzE,YAAkB,8BAAsByE,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAFhD,+BAA0C,A,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAO1CzE,YAAkB,uCAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CADrD,6BAAsC,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CO5BtCA,YAAkB,iBAAa6I,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,C9DyC9BoP,oBACSlY,wBACb;oBAAiCA,OAA+B40B,WAClE,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAEM,sBACS50B;uBAGXA;2BAEFA,OAA+B40B,aACjC,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA30B;EACeD;kBAEY60B;KAAS;kBAChC70B;2BAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,W,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,C+DvEAC,YAAkB,aAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,C,C,C;A,G,C,G,C;A,C,C,CCuC3BF,cAAwB,gBAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,ChE7B3CL,YAAiB,MAAGM,YAA+B,A,C;A,E,C,CAGnDC,YAAkB,MAAGD,YAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEpDE,mBACE,KAAA,UAEFC,QACAA,QACAA,eACN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEMC,YAAqB,gBbmLbC,iBanLoC,A,C;A,I,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CsD4jBlDX,WAAgB,MAAGo1B,SAAiB,A,C;A,C,C,CAuBpC/0B;EACcg1B,OAAZ1F;;EACiB3tB;;OAAAA,SACfozB,YACA;WAEapzB,MAAkB2tB;EACJ,AAAVA;IAxIkB,oBAyIY3tB;6BAAAA;EAAF;QAC1BA;IAvIiB,kBAyIlCqzB,QAA6B,GAC7BD;QAtImC,AAA1B,OAAmB,AAAA,CAAT,kBAAuB,OAuI1C;UAGJC,SACAD;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,CtD7YMp1B,YAAe,MAAGgN,AAAAA,gBAAgB,A,C;A,G,CiE1OxC3M,YAAiB,MjE0OO2M,AAAAA,oBiE1OO,A,C;A,G,CAM/B3M,YAAoB,MAAG,AjEoOC2M,AAAAA,oBiEpOO,A,C;A,E,C,CjEsOzB,8CAEJA;QAA6CA,UAC/C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CiEjOA;EACsBsoB;GAChB,CAACvG,MAAqB;GzEkORluB,ayEhOhB,KACQkuB;8BjE2NV/hB;QAA6CA,gBiE1NlC+hB,MAAoB;KAE7BwG,QAAMxG,OACN;KAAOA,QjEuNT/hB,QAA6CA;EiErNnC+hB;8BjEqNV/hB;QAA6CA,UiEpN3C,EAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CjEyNM,YACJA,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEMzM,YAAkB,MAAGyM,SAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAvB9BwoB,mCAEFxoB;KAEAuoB,WAEJ,A,C;A,M,C,C,E,CANMC;;SAMN,A,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,8B,C;A,G,CmB5NAj1B,cAm1B8B,KAALk1B,mBAl1BJ;MACV,QACTC;UACA;MnByOyB1oB,MmBxO3B,A,C;A,G,CAmBAzM;EACMo1B;GAAM,SAAWA,sBACnB;MAAOA,UAAgC,KAAbA,YAE5B,SACF,A,C;A,G,CAOA31B;GACY,KAAN41B,cACEC;;GAAO,cAAW;GACX,eAAY,WAEzB,MAAOD,SACT,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA6eAr1B;;SAC4C;EACjC;UAKEu1B,QAEAC,AAAAA;IAmTiB,KAALN,oBAjTM,KAAPI;EAClBhuB,UAAqB,CAACA;KACxB,gBAEF;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA8LAtH;GACW,UAAO,gBAChB;MAAUy1B,UAAwC,KAAtBA,uBAC9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA31B;GACkB,KAAZ41B,YAAmBA,cAA8B,QAErD;MAAa,AADDA,mBAEd,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA11B;GACM,CAAC21B,WAAuB;IAG5B;MAAuBD,8B9Btea10B,mC8BsepC,U9BpeekI;G8BseD,gB/BvdI5I;G+BwdV;EACoC,CAAA,KAAVs1B;;oCAAmBA;;KAKjDA;MAEJ,KACiBA,UACjB;MAAOA,gBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAqOA,kBACqBC;GA4CZ,QACLvD,OACAA;YA7CO8C,OAATU;;GACU,CAAA,KAANT,YACFS,SACAA;KAAST,KAAAA,WAEb,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAr1B;EACoB;EACCs1B;GAkCZ,QACLhD,OACAA;cAnM0B,KAAL4C,oBAgKK,gBAC1B5C,UACA6C;WAEF7C,KAn8BiByD;EAo8BEC;GA4BZ,QACL1D,SACAA;UA7BiB2D;GA2BZ,QACL3D,SACAA;QA5BF,MnB7wByB7lB,MmB8wB3B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA3M;;;2CACqB,QAEnB;MAAc,MAAPw1B,QAAUY,OACJ,KAATL,QAAYK,OACP,KAALhB,eAAQgB,WACH,KAAL9vB,eAAQ8vB,WACH,KAh9BQH,QAAAA,OAi9BP,KAANC,QAASE,OACA,KAATD,QAAYC,MAClB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAz2B,4BAKE;MAAOmX,UAAQ0e,QAAQ1e,SAAQif,QAAUjf,SAAQse,eAAMte,SAAQxQ,eAC3DwQ,SA39Bamf,QA29BCnf,SAAQof,QAAOpf,SAAQqf,iBAC3C,A,C;A,E,CAn4BAE;GAca,eAAkB,WAC3Bd;QACgB,gBAAmB,YACnCA;KAEAA,SAGFU;QAAQK,aACV,A,C;A,K,C,I,C;A,M,C,C,G,C,gI,C,E,CA/EAD;EzBkC2Bn0B;qBAAAA;EAAAA;EyBjCZq0B,KAslB+B;;czBrjBnBr0B;EAAAA;EyBqjBmB;czBrjBnBA;EAAAA;cAAAA;EyB/Bds0B,OzB+Bct0B;cAAAA;EyB7Bdu0B,KzB6Bcv0B;;cAAAA;EAAAA;EyBqjBmB;czBrjBnBA;EAAAA;EyBqjBmB;czBrjBnBA;EAAAA;EyBqjBmB;EAthBjCq0B;WACDG,sBACAC,aACGC;;SA5DuC,A,C,E,CAgDtDP,kCASaE;WACDG,sBACAC,UACGC;;SAWf,A,C,E,C,CAkUAx0B;YACsBgzB,aAAc;;GAC9BA,kBACmC,AAAjCA,MAA4B,KAAZA,sBACZ,KAAA,6CAERyB;KAAiBzB,SAA8B,KAAZA,YACnC;YAEF;YAAoBA;6BAAAA;KAAF;GACZA,eACFyB,OACA;yBAEJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEAz0B;;;WAUsB;;EAEPozB;6BAAAA;;GACb;KAAkB,WACDA;eAm7BJ,OAA6B,UAC7B,OAA6B;;EAn7B1B;;GAIV,AAACsB,qBACCC;MAMR,AAEA,WAA+BvB,QACjC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAoBApzB;;;SACgD;EACpC;WAGS,MAAOqzB;EAEb;MAEbuB;wBAWA;MnBhVyBrqB,MmBiV3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CAEAvK,uBACwB,QACtB;MAAOqzB,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEArzB;;;;;;;;EAiDe60B;;;;6BAAAA;GAcb;KAAa,QAIPA;GACS,EAAQ;EAKHA,MAA2B;EAC3BA,MAA2B;EACrBC,SAAyB;GAC3CC,kBACAA,kBACA,AAACC,oBACG;;SAENC;EACID;;WACF5vB;EmCnkBc;EtDgGfvH,OA6CP0M;KAA6CA,YmBwbrCnF,UnBxbRmF;KAA6CA;EmBybhB2qB,SAAwB,MAA7C9vB;;EmCtkBc;EtDgGfvH,OA6CP0M;KAA6CA;;EmB0bhB2qB,SAAwB,MAA7C9vB;;EmCvkBc;EtDgGfvH,OA6CP0M;KAA6CA,SmB4bjC;;;YAIH;;IAET,GACW,WAAqB,QAAU0qB;;WAGtB,QACpB;MAAO7vB,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAIApF,eACU,SAAe,CAAA,WACrB,MnBhnBKnC;KmBknBL,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEAmC,iBACW,QAAS;GACT,QAAS,QAClB;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CA+fAA;;EAIcgzB;GACK,AAAbmC,aACFtO,uDAGF;MAAOsO,iDAST,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAgBAn1B;;;GAoBkB,KAAZgzB,WAAiBnM;;;;GAKrB;YAAoBmM;6BAAAA;KAAF;GACZA;GAIuB,AAAnBA,eACFnM;mBAOAA,6CAGF5U;;UAGAA,OAAUmjB;EAEE,QAElB,GACInjB,YAAmB4U;EACA,OAAGmM;EACO,KAAX/gB;MACT,GACX4U;GAEE,OAEA5U,OAAUmjB,WAAoBpC,mBADhC;MAKqBqC,KAAiBrC;EAChB,KAARpH;EAAeA;6BAAAA,OAAzB3Z;OAAuB,CAAA;EACL,KAAR2Z;EAAeA;6BAAAA,OAAzB3Z;OAAuB,CAAA,mBAHzB,OAKE4U;mDAKa,AAAb5U,UACF4U,2EAEoB,AAAb5U,YACT4U;;8BAGF;MwBzjCE,0BxBkkCJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAgCA7mB;;EAYwB;E+C72CHyvB,AAAAA,a/C+2CnB;QAAkB,EAAE0F,gBACPA;;GACF,cACiB;;EAA8B,AAAxB,KAA1BG,KAA+B,UAAS;QmC7wC1B;EtDgGfz3B,OA6CP0M;KAA6CA,kBmBkoCZ,amC/wCX;EtDgGf1M,OA6CP0M;KAA6CA,csD7IvB;EtDgGf1M,OA6CP0M;KAA6CA,MmBsoCzCgrB;eAEJ,AACA,MnB9nCyBhrB,MmB+nC3B,A,C,6B,C,I,C,C,C,C,C,I,C,G,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAn3BE3M;GACY,SACoB;;EAA4B,AAAtB,KAA3B43B,QAAgC,UAAO,oBADhD;SAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEA53B;GACY,SAA2B;;EAA4B,AAAtB,KAAtB63B,QAA2B,UAAO,oBAAvD;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgC4B,YAAI,MAAGniB,sBAA4B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkBvC;GAClB,KACFlO;;QAGFA;KA8hBKkO,qBA7hBiBhN;QACpBlB;SACAA;KA2hBGkO,sBAzhBP,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAUA1V;KACgB,OAAkB,SACb,OAAkB;SADrC;SAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA,YACE,MAAqB,QAAkB,OACzC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA;GACY,SACmB;;EAA4B,AAAtB,KAA1B83B,QAA+B,UAAO,oBAD/C;SAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAEAn4B;;EACiBs3B;GACXc,sBACF,MAAgB;QACP,AAACZ;KAGV,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEAx3B,yBAEE;+BAAkB,WACDs3B,MAA2B;GAChC,OAAwB,QACJ,AAAX,AAAL;;GAIM,OACL,SACiC,AAAhB,AAAX,AAAL;gFAMlB,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CASA;;;;;;eAGa,KAAiBA;KAE1BzvB,KAAayvB,aAEjB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAwYAt3B,oBAEyBq4B;6BAAAA,OAAvB;MAAsC,AAAjB,AAAL,mBAClB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA6KA,iBACQ,KAAA,kCACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAOS;EnBnoCF/3B;;GmBqoCQ,UAAY,WACnBgpB,2DAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyBJ,iBACQ,KAAA,kCACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CACAtpB;GACkB,KAAR,aACNspB;EnBvqCGhpB,KmByqCiBm1B;;GACZ,UAAa,aACrBnM,gEAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA2DY;GACI,UACR,MAAO,MAAmC,CAAhB,EAAE5U;KAE5B,OAAqB,AAAN,aAAoB,YAEvC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAsCJsjB,2BnB/mCAzC;KAAM,KmBinCiB+C,0BAAoB,WnBjnC3C/C;KAAM,KmBknCiB+C,0BAAoB,aAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,iB,Y,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CTqxQF71B,eAEM81B,YACF;QACSA,YACT,sBAEF;sBACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAo1DA91B,cAUE,iCACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CA0wFAA,gBAEE,MAAO+1B,AAAAA,qDAET,A,C,mC,C,I,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmEA/1B;;gB8B7zc0B;sB9Bu0cxBg2B;;EAulBkCC,UA6whBlCrkB;gBA/EI,KAAc,KA8EcC,oBA9EW;EApshBRqkB,UAmxhBnCtkB;gBA/EI,KAAc,KA8EcC,KAj0iBbskB,SAmviBwB,uBA9uiBzCH;QAGF;MAAOG,MACT,A,C,wF,C,I,C,C,C,E,C,I,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CA2yBAp3B;EAtiPSq3B;GAwiPE,YAGLC,mBAFF,QAKF,SACF,A,C;A,E,C,CAisXAr2B;;QAII;yDADF,OAGE;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAg9EAA,gBACoB,UAAQ;EACR,UAAQ,GAAuB,AAAA,CAAR,kBACzC;MAAY,GAAQ,MACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAi/JFs2B,uBACmB,MACjB;MAAOC,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC;WAEI;yBAMaD;;4CAGX,QAEF;YAGA,SACJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,YAII,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC;4CAEI,QAEF;MyDlxkCOC,YzDmxkCT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAMAC,cACE,qBASF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C,C,C,C;A,E,C,CAEAC,YACE,MAAOzvB,SACT,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEA0vB,YACE,MAAO1vB,SACT,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CACC2vB,kBACC,MAAO3vB,eACT,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAsBA;EAgByB1J;;;EAOLE;6EAOlBP;KAxwyBI25B;;;;SAgxyBgB,CAAA,2BACV,KAAA,sFAIJ,gDAEI,KAAA;;;;;;;aA1DN3wB,KAoEwBuwB;;;;;aApExBvwB;;;;;aAAAA;;;;;aAUAA;;EX7nkCuB+E;;;GWsskCR;uBAKrB,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAscA0G,eAEmB,gBAAc;WACT,MACtB;MAAOkP,eACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAiW,eACmB,gBAAc,QAE/B;MAAOjW,eACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,G,C,m2B,C,C;A,E,C,C;A,G,C,K,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,kD,C;A,E,C,CAtolCEjjB,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,yC,C;A,E,C,CA+SxBA,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,uB,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,Y,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,O,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,wC,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,wB,C;A,G,CA8mBxBm5B,YAAuC,0BAC+B,A,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,K,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAuctE;GAMwC;;MAEpCC,eADkBC,oBAElB;oEAGJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,0B,C,C;A,E,C,C;A,G,C,uB,C;A,K,C,I,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,G,CAwiJAvnB,kBACMwnB;GAAY,QACd,QAEF;MyDvnMKV,MzD+nM0D,aAPjE,A,C;A,K,C,I,C;A,G,C,a,C,C;A,G,C,C;A,G,C,gB,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA87BAW,8CAAgD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA0DhDC,yCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAsB/CC,yCAA8C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CA+H9CjS,YAA2B,MAAGgS,YAAmC,A,C;A,G,CAKjEhS,YAA+B,MAAGgS,YAAkC,A,C;A,G,CAsEpEhS,YAA0B,MAAGgS,YAAkC,A,C;A,E,C,CAmM/DE,cACE,MAAO,MAA6BC,4BACtC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASAH,cAAwC,MAAGI,oBAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAS3EF,cAA+C,MAnBtC,MAA6BC,4BAoBC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,mC,C,C;A,E,C,C;A,G,C,K,C;A,G,CAuDvCj5B,eACMm5B,qBACFA,mDAEF;MAAOA,gBACT,A,C;A,G,CAEA;EAEc;EACG;SACfC;OACAA;UACF,A,C;A,E,C,CAaAJ,cAA+C,MAC7C,MAA6BC,4BAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA8C5DH,cACE,MAAOI,oBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASAF,cACE,MA1DA,MAA6BC,4BA2D/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,yB,C;A,G,C,W,C,C;A,E,C,C;A,G,C,gB,C;A,G,CAgGA35B;GAIMg4B,gCAAgD;GAGhDA,8BAA8C,mBAClD;SACF,A,C;A,E,C,CAUAh4B,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,yB,C;A,G,CA+8CxBmH,YAAmC,mBAAiC,A,C;A,G,CAsBpEzG,YAA2B,kBAxxCN2tB,YAwxC6C,A,C;A,G,CAElE;EAEc;EACG,WACfyL;OACAA;UACF,A,C;A,E,C,CAcAJ,cAA+C,MAC7C,MAA6BC,4BAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAS5DH,cAAwC,MAAGI,oBAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAS3EF,cAA+C,MAlB7C,MAA6BC,4BAmBQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAYvCI,YAAwB,mBAAgC,A,C;A,G,CA+ExDC,YAAqB,qBAAiBC,aAAYC,YAAWC,cACzDC,wBAAa,A,C;A,G,CAKjBJ,YAAqB,qBAAiBK,aAAYC,YAAWC,cACzDC,wBAAa,A,C;A,E,C,CAgCjB,aAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAOpB,aAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKjB,mBAAsE,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CA6BtEx6B,YAAqB,MAAGy6B,aAAU,A,C;A,E,C,CAoBlCz6B,YAAkB,MApBMy6B,aAoBM,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAsL9B36B,6BAEI;kCAEA;+BAEA;8BAEA;6BAEA;UAEM,KAAA,uCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIAA,qBAEE;MACM46B,UAAyB;EACtBA,sBACI,QAAQ,AACrB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAgBAC,YACE,6DAGF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAgBAA,YAA0B,wCACiD,A,C;A,E,CAqP3EC,YAAqB,qBAA0B,A,C;A,E,C,CAmzB/C56B,uCAAuC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAsBvCg6B,6CAAwC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAoRxCa,YAAkC,MAAGC,YAA4B,A,C;A,G,CAKjED,YAAsC,MAAGE,YAA2B,A,C;A,G,CAoKpEF,YAAiC,MAAGG,YAA2B,A,C;A,G,CA+C/DH,YAA0C,MAAGI,YAA+B,A,C;A,E,CAptE5EzB,aAIA,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,G,C,U,C,C;A,E,C,C;A,G,C,kD,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,0B,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,uC,C;A,E,CAwwFAd,YAAuB,MAAGwC,MAAiC,UAAiB,A,C;A,E,C,CAuB5E,sCAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,ie,C,C;A,E,C,C;A,G,C,K,C;A,E,CAuN5BC,YAAc,mBAAmB,A,C;A,E,C,CAMjC,2DAAoF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQpF,8DAAuF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,+B,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,M,C,C;A,E,C,C;A,G,C,a,C;A,G,C,W,C,C;A,E,C,C;A,G,C,4C,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,K,C;A,E,CAipDvF17B,YAAe,gBAA8B,A,C;A,C,C,CAE7Cg6B,oBAEoBn5B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAm5B,kBACY;GACF,IACN,SAAoC;mCAGxC,A,C;A,E,C,CAWAA,uDAA0B;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,iE,C,C;A,E,C,C;A,G,C,gC,C;A,G,CAwwBxCx5B,YAAqB,MAAG04B,MAAkC,YAAmB,A,C;A,E,C,CAiK7E,+CAAuF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,I,C,C,C,C,C,C,C,C,C,I,C,4B,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAgCvF,+BAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,G,C,4B,C,C;A,E,C,C;A,G,C,yC,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,iC,C;A,K,C,I,C;A,G,C,W,C,C;A,E,C,C;A,G,C,gC,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,Q,C,M,C,C,C,C,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,yF,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,M,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,+B,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,e,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,sB,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,+B,C;A,E,C,CAysDxB,8BAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAQpB34B,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,U,C,C;A,E,C,C;A,G,C,a,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,CA2lBxB,4BAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,C,mC,C,C;A,E,C,C;A,G,C,a,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,a,C;A,G,C,e,C,C;A,E,C,C;A,G,C,gB,C;A,G,C,e,C,C;A,E,C,C;A,G,C,gB,C;A,G,C,sB,C,C;A,E,C,C;A,G,C,qB,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+6BlBC,YAAiB,MyDx6jBV24B,MzDw6jBuD,WAAe,A,C;A,K,C,I,C;A,G,C,c,C,C;A,G,C,C;A,G,C,yB,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA+W7E,mCAAiD,A,C,Q,C,C,C,C,C,C,M,C,C,C,I,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,yC,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA4RjD,0CAEEwC,6CADsBC,QAEtB;OACF,A,C,S,C,K,C,E,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CASAC,YAAiB,qBAAaC,UAAUC,mBAAS,A,C;A,G,CAgBjDF;eAII;OAxwNsBJ,KAAiC;;GA2wNnD,6CACI,KAAA;EA5wNcA,KAAiC;EAgxN9B,cA5BCK,UAAUC,uBA4BTzU,KAAAA,SAC3B;qBAAiB0U,KAAAA,KAAiBA,KAAAA,eAEtC,A,C;A,K,C,I,C;A,G,C,8F,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAkEA;;aAiBEC;uBACAA;wBACAA;2BACAA;qBACAA;+BACAA;mCAKAC;eACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,2G,C,I,C,K,C,C,C,E,C,I,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,yC,C,C;A,E,C,C;A,G,C,oC,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,W,C,C;A,E,C,C;A,G,C,yB,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,sG,C;A,G,CA8nBAj7B,YACE,mBACF,A,C;A,E,C,CAgBA,kBAGM;GAAgB,QAElBk7B,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMAnC;MAEwB,YACpBvP;qBAFF,QAMA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASAuP;;+CAGkB1iB;+BAKd;MA9Ec8kB,AAAAA,wBA8E4B,QACxC,eAAkB9kB,eACpB,MAEA,MAAA,QAAA,OACE,eADF,SAEA,CAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKA/W,kBAAqB87B,WAAH;gDAAmD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA0QrErC,sCAAiC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA6BjC35B,mCAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA0BhC25B,2CAAsD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUtDA,2CAAuD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,sB,C,C;A,E,C,C;A,G,C,M,C;A,E,CAmHvDh6B,YAAe,gBAA8B,A,C;A,C,C,CAE7Cg6B,oBAEoBn5B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAm5B,kBACY;GACF,IACN,SAAoC;mCAGxC,A,C;A,E,C,CAWAA,uDAA0B;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,4D,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,c,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,0C,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,wC,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,yB,C;A,G,C,e,C,C;A,E,C,C;A,G,C,c,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,e,C;A,K,C,I,C;A,G,C,2C,C,C;A,E,C,C;A,G,C,Y,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,qB,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,oE,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,CAitFxC/4B,kBAtxaE,KAA6Bi5B;EAuxaf,kBAEd;qBiC73sBE,kCjC83sBJ,A,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,mC,C;A,E,C,CAuQAH,yCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,qB,C;A,G,C,mB,C,C;A,G,C,C;A,G,C,gB,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,0B,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,gB,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,0B,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,sB,C,C;A,G,C,C;A,G,C,8C,C;A,G,C,c,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,G,CAu+C/C94B,YAA+B,qBACOq7B,gBAAM,A,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,G,CA8L5Cr7B,YAA+B,qBACKq7B,gBAAM,A,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,gB,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,iD,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,W,C,C;A,E,C,C;A,G,C,+B,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,uC,C,C;A,E,C,C;A,G,C,K,C;A,G,C,0D,C,C;A,E,C,C;A,G,C,wB,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,wB,C;A,G,CAixE1CC;GAIMC,aAAyB;SACjBC,oBACVA,+BAEF;MAAOA,qBACT,A,C;A,E,C,CAyEAz8B,wDAAyE,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKzE08B,mEAGI;;;;;;;;;;;;;;;;QAqBJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CA4iBA3D,YAAsB,MAAG4D,MAA4B,UAAiB,A,C;A,E,C,CAyRtE,6BAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA0GnB,kBAOEC,cyDxy3BKC,UzDyy3BL;OACF,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmHAt8B,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAoIxBwnB,YAA2B,MAAGgS,YAAmC,A,C;A,G,CAKjEhS,YAA+B,MAAGgS,YAAkC,A,C;A,G,CA+EpEhS,YAA0B,MAAGgS,YAAkC,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,M,C,C;A,E,C,C;A,G,C,8D,C;A,E,C,CAmgC9Dx5B,YACC,wBAAoB2vB,iBAAO4M,gBAAMC,mBAASC,UAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA38B;;;2CAC2B;EAClB6vB;EAAQjuB;4BAAc66B;EAAO76B;4BAAa86B;EAAS96B;4BACtD+6B;EAAU/6B;qDADd;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAA0CkwB,KAAAA;EAAe4M,KAAAA;EACrDC,KAAAA;EAAgBC,KAAAA;EA2IT7lB,KAAQA,KAAQA,KAAQA;EARf,UAAQ,GAAuB,AAAA,CAAR;GACrB,MArIL;MAsIG,WAAQ,GAAuB,AAAA,CAAR,kBArIP,A,C;A,G,CAsEpC0kB,YAAkB,qBAAa,OAAW,eAAS,A,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,I,C,C,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,M,C;A,E,CAgrBnD77B,YAAe,gBAA8B,A,C;A,C,C,CAE7Cg6B,oBAEoBn5B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAm5B,kBACY;GACF,IACN,SAAoC;mCAGxC,A,C;A,E,C,CAWAA,uDAA0B;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,8B,C,C;A,E,C,C;A,G,C,M,C;A,E,CAyJxCh6B,YAAe,gBAA8B,A,C;A,C,C,CAE7Ci9B,oBAEoBp8B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAo8B,kBACY;GACF,IACN,SAAiD;mCAGrD,A,C;A,E,C,CAWAA,uDAAuC;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,M,C;A,E,CAsBrDj9B,YAAe,gBAA8B,A,C;A,C,C,CAE7Ck9B,oBAEoBr8B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAq8B,kBACY;GACF,IACN,SAAuD;mCAG3D,A,C;A,E,C,CAWAA,uDAA6C;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,6B,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CA7g4B3D,YAAuB,yDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAe9C,cAAuB,yDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAe9C,YAAsB,wDACuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAW7C,cAA2B,2DACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAWlD,YAAwB,wDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAW/C,cAAuB,yDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,M,C,C,G,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CA6xL9C78B,cAA8B,MAAG88B,MAAAA,WAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAGjE98B,YACE,MAAO+8B,AAAAA,iCACT,A,C;A,E,CAEAp9B,YACE,MAAOm9B,AAAAA,gBACT,A,C;A,C,C,CAEApD,oBACSoD;gCAAAA,SAAP;MAAOA,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACgCA;gCAAAA,SAA9BC,AAAAA;uBAA8BD,MAChC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA,mBAEQ,KAAA,oCACR,A,C;A,C,C,CAEApD,cACEqD,AAAAA,sBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAEA97B,kBAAkC+7B,aAAH;uBrBtzPO97B,8BqBszPa,A,C;A,E,C,CAEnD;QAKE;MAAA,8CAHa,oBAIX67B,QADF,OACEA,cADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACQ,KAAA,kCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAwBA,yBAEQ,KAAA,YACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUA/8B,cAQE,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA;GACyB,EApFhB88B,AAAAA,oBAqFC,KAAA,SArFDA,AAAAA;EAAAA;EAAAA;EAwFLC;SAAAA;mBAxFKD,SA0FLC;iBAtFKD,OAwFT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,YAEEC,KAAAA,YACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAyBArD,kBACmBqD,AAAAA;6CAEjB;SACF,A,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAueAp9B,YAAe,MAAGs9B,AAAAA,gBAAgB,A,C;A,C,C,CAElCvD,oBAAkCuD;gCAAAA,SAAH;MAAGA,MAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAElD,qBACQ,KAAA,2BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA,mBACQ,KAAA,2BACR,A,C;A,E,C,CAEA,mBACQ,KAAA,yBACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,G,CAQAvD,YAAiB,MAAGuD,UAAAA,SAAc,A,C;A,G,CAIlChD,YAAwB,MAAG,MAA6BiD,SAAa,A,C;A,G,CAgDrEnC,YAAkC,MAAGrB,eAAyC,A,C;A,G,CAK9EqB,YAAsC,MAAGrB,eAAwC,A,C;A,G,CAoKjFqB,YAAiC,MAAGrB,eAAwC,A,C;A,E,CAvP5EyD,oBACiBF,QAAAA,mBAAfC;QiCt6QE,yBjCu6QJ,A,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAFAC;;SAEA,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CADiC,wBAAI;gDAAQzD,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,O,C;A,C,C,CA85G7ChS,cACE,qBAAwB0V,yBAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,c,C;A,C,C,CAyBA1V;;;GbjxWS7Y,AAAAA,AakxWHwuB,eAA2B5wB,YACzByrB,YACF,qBACIkF,QAAMC,MAAa5wB,oBAG3B;qBAAmC2wB,sBACrC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,M,C,C,G,C,I,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA4oEmC,YAAM,MAAGhF,SAAIkF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA6FrB,cACrBlF,6BACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAOgB;;EAEXA;;EAAW,QAAqB;;Q8Bn1clCxU;GAAD,AAoDmBa,mDAnDvBb;a9Bs1cI2U,QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA64IAqD,iBACY,oBACZ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CAgfFjC,kBAC+CoC;6CAE7C;SACF,A,C;A,C,C,CAQA,cACEA,AAAAA,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;;+CAGmB9kB;EAAiB8kB;GAA5B,MAEF,MAgHYA,AAAAA,wBAhH8B,QACxCA,cAAa9kB,aACf,AAEF;OAEF,MAAA,UACE8kB,QADF,OACEA,cADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;GACyB,EAoGPA,AAAAA,AAAAA,+BAnGR,KAAA,SAmGQA,AAAAA,AAAAA;EAAAA;EAAAA;EAAAA;SAhGdA;mBAgGcA,SA9FdA;iBAqG0BA,OAnG9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EAiG8BA;EAAAA;0BAAAA,SA/F5BA;SA+F4BA,MA9F9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,mCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBA/7B,cACuB,SAKvB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAwBA,YACE+7B,KAAAA,YACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA;EACEA;EAqC4BA;gCAAAA,SArC5BA;iBAqC4BA,MApC9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA96B,YAA4B,MAAG86B,SAAAA,AAAAA,oBAAyB,A,C;A,E,C,CAMxD,mBACQ,KAAA,8BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAOA,yBAEQ,KAAA,qCACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CASAp8B,YAAe,MAAGo8B,AAAAA,AAAAA,2BAAuB,A,C;A,E,CAEzC,mBACQ,KAAA,6CAER,A,C;A,C,C,CAEApC,oBAA8BoC,AAAAA;gCAAAA,SAAH;MAAGA,MAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgxG/C,wBAAI;gDAAQwB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAs4PlB,cACE37B,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA5B,iBACE;MAAc,iCrBxu8BsBkB,8BqBwu8BpC,QAIA,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CASA,iBACE;MAAgBgH,iCrBxv8BoBhH,8BqBwv8BpC,OACEs8B,UrBvv8Bap0B,KqBwv8Bf,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,qBACE;MAAgBlB,iCrB9v8BoBhH,8BqB8v8BpC,UrB5v8BekI,IqB8v8BbwF;WADY,aAEd,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAlO;EAEmBq8B,AAAAA;gBAEjB;MAAsBU,aAAqB,8BAF1BV;GAGXW,QAASD,4BAHEV,SAIb70B;OAASu1B,KAAAA,QAEb,AACA,SACF,A,C;A,G,CAEA/8B;EAEmBq8B,AAAAA;gBAEjB;MAAsBU,aAAqB,8BAF1BV;GAGXW,QAASD,4BAHEV,SAIb50B;OAAWs1B,KAAAA,QAEf,AACA,SACF,A,C;A,G,CAKAz9B,YACE,MAAOQ,mBACT,A,C;A,G,CAKAR,YAAoB,MAAG,AANdQ,mBAMsB,A,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAlEf,cAAS,gBAAa,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAiFtCR,YACE,MAAO+8B,AAAAA,yBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA78B,cACE,MAAO68B,AAAAA,yBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,gBACEA,AAAAA,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA78B;EACiB68B;EAAAA,iBACfA;oBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAKAp9B,YACE,MAAOuI,AAAAA,uBACT,A,C;A,E,C,CAEAlI,YAAyB,MAAGmwB,sBAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAwbtDwN,iBACU,wBACRC,AAAAA;yBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;EACgB,QAAA,mBACd;MAAkBC,0BrB9w9BkB38B,8BqB8w9BpC,OACEu3B,KrB7w9BarvB,OqB8w9Bf,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAWA00B,YACEF,AAAAA,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMA59B,cAA4C,MACxC+9B,wBAAyD,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAS7D/9B,cAA0B,MAAG+9B,sBAA8C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3E/9B,YAA+B,MAAG49B,AAAAA,8BACyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAhD3DI,YACEJ,sBAA8B,IAAcC,0CAE9C,A,C;A,M,C,C,E,CAHAG;;SAGA,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CADM,YAAI,mBAA4B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKA,YAAI,MAAGnlB,aAAS4f,QAAe,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAqB/B,YAAI,MAAGA,cAAU,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQ5B,YAAI,MAAGA,qBAAyB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASP,YAAI,MAAGA,gBAAc,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAG9D,cAAqB,MAAG7pB,+BAAcqvB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CASjDN;EACU,wBAGR;MAAoBO,AAFJnB,KAAAA,sCrB5z9BoB77B,8BqB8z9BpC,UACmB6H,KrB7z9BJK;GqB8z9BT,AlBx29BY5I,akBy29BdqY,SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YACc,cACZkkB;KAAAA,QAAqBlkB,aACvB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,E,C,CAiYA6O,cAA6D,uBACvCyW,mBAAuB,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAuB7CpD,cACE,uBAAsCoD,mBACxC,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAgBApD,cACE,yBAA0CoD,iBAC5C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CA0DAvW,mCAMM,QAAc,QA8Ec3T,QA9EW;wCA+E3CD;MAhFA;SAEF,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CAYA0T,wEAAmC;2DAI7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHF,YAAQ,MAAGtiB,MAAAA,gBAA0C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAO,YAC1DqzB,cACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CAoBJ/Q,wEAAmC;2DAI7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGNE;qBAwKqB;UAnKnB;MAAmBwW,UAAnB,UACoCD,UAAYE,QADhD,mBrBt2+Bej1B;yBqBu2+Bbk1B;SACF,EAkLsBzW,IAAAA;UAjLtB;MAAOyW,2CAET,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAhBI,YAAQ,MAAGl5B,MAAAA,gBAA0C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAO,YAC1DqzB,cACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CAyCJjjB,cAUsBzE,cATL,MAEfwtB;SAEAxtB;YACAiX;YACA;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAqBA,iBAnBsBjX,cAoBL,MACf;QAAA,AAAA,SACAwtB;UAKF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,G,CAEAv+B,WAAkB,MAAe,AAAZw+B,WAAe,A,C;A,E,C,CAEpC,eA/BsBztB,eAgCH,AAHEytB,WAGS,MAC5B;QAAA,AAAA,SACAxqB;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,iBACMgU;GAAQ,SAAW,AATJwW,WAUjBztB,KAAAA,QAAyBotB,UAAqBE,SAElD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,iBACMrW;GAAQ,QACVjX,KAAAA,QAA4BotB,UAAqBE,SAErD,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,S,C;A,C,C,CAmGA;EACMI;GAAAA,QAAoC;EACD5W,OAAvC4W;QAAyBC,KAAc7W,0BAC1BA,AAAAA,gBAEf,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA,oBACqB4W,AAAAA;GACF,QAAS9a,OAC5B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA,mBACE;MAAyB8a,UAAAA,8BrBlh/B0B9mB,KAAAA,MAAoBO,6BqBkh/BvE,OACEyL,ArBh/+Bava,SqBi/+Bf,AACAq1B;OACA5W,AAAAA;cACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,CArCA8W,YACE9W,QAAc,KACA+W,0BAChB,A,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkBc,WAAG,MAAGpB,qBAAa,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA6BjC9V,cACE,uBAA2BmX,sBAC7B,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,CA0dA59B,YAIE,uBAo7DckI,sCAn7DhB,A,C;A,C,C,CAGA,mBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,mBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA,mBACQ,KAAA,oCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAMA,qBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,yCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUAnJ,mBACQ,KAAA,2CACR,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAUA,yBACQ,KAAA,2CACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,8CACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAkxDAiB,YAAyB,qBAAwB69B,KAAAA,kBAAe,A,C;A,E,CAEhEn/B,YAAe,MAAGm/B,AAAAA,gBAAY,A,C;A,C,C,CAI9B,cAAsBA,KAAAA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1C9+B,cAA4B,MAAG8+B,MAAAA,WAAqB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEpD,YAAeA,KAAAA,SAAe,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAI9Bv+B,oBAA4Bu+B;gCAAAA,SAAH;MAAGA,MAAY,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAExC,sBAAwCA;gCAAAA,SAAAA;OAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAE9D,cAAiCA,KAAAA,WAA0B,A,C;A,E,C,CAE3D,cAAqCA,KAAAA,WAAqB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAE1Dn/B,gBAA6C,MAAGm/B,MAAAA,aAA6B,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAE7En/B,gBAA6C,MAAGm/B,MAAAA,aAAiC,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEjF,gBAAkC,MAAGA,MAAAA,aAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIjE,oBACEA,KAAAA,iBACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,gBAAuCA,KAAAA,aAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,C,C,CAqBtE9+B,WACE,MAAOoY,AAAAA,aACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEA7X,WAAc,MA0DG6I,AA1DAgP,YAAiB,A,C,C;A,E,C,C;A,G,C,e,C;A,C,C,CA8ClCpY;EAC+B,AAAVsvB;EACAprB;GAAF,KACfkF,QAAW21B,KAAAA,UACXzP;SACA;SAEFlmB,YACAkmB;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEAnX,WAAc,MAAG/O,SAAQ,A,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmFlB,kBXtlkCoBmE;;qCW6lkCzB;iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,G,CA2IAmrB,YAAsB,MAAGsG,MAAyCC,gBAAS,A,C;A,E,C,CAK3E,YAAa,MAA2BA,iBAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEhD,kBAEqCA,yBAIrC,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CAeA5D,YAAc,YAAS,YAAwB,A,C;A,E,C,CAE/C,kBACI,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIrC,kBACuB,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,C,CAlBxDj5B,0BAEI;KAGA,mBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,G,CAmTAlC,YAAgB,MAAQk9B,cAAa,A,C;A,G,CACrC,cACOA,eACP,A,C;A,G,CAGAl9B,YAAgB,MAAQk9B,cAAa,A,C;A,G,CAYrCl9B,YAAgB,MAAQk9B,cAAa,A,C;A,E,C,CAuCrC,YAAc,MAA4BA,kBAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAI/Cl9B,YAAkB,MAAgCk9B,oBAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C,A,E,uB,kB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,a,C,C,A,E,gB,W,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,uB,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,+H,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,6D,C;A,K,C,I,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,+B,C,C;A,E,C,C;A,G,C,sD,C;A,K,C,I,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,4B,C,C;A,G,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,6B,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,6B,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,0B,C,C;A,E,C,C;A,G,C,kD,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,sD,C;A,K,C,I,C;A,G,C,wB,C,C;A,G,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,U,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,8B,C,C;A,E,C,C;A,G,C,U,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,kD,C;A,K,C,I,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,iB,C,C;A,G,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,sB,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,K,C;A,G,C0Dpi7BvDnD,eACMiF,qBACFA,0BAEF;MAAOA,gBACT,A,C;A,G,CAEAt+B,YAA2B,4CAAyC,A,C;A,G,CAEpE,wD1Dw+bEm7B;KAAAA,A2DzvmBAoD,WDoxKAnF;UACF,A,C;A,G,CA4YAe,YAAkC,MAAGC,YAA4B,A,C;A,G,CAKjED,YAAsC,MAAGE,YAA2B,A,C;A,G,CA2EpEF,YAAiC,MAAGG,YAA2B,A,C;A,G,CAuD/DH,YAA0C,MAAGI,YAA+B,A,C;A,K,C,I,C;A,K,C,I,C;A,G,C,0d,C,C;A,E,C,C;A,G,C,8B,C;A,E,C,CAwP5EzB,yCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,G,C,e,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,G,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,wB,C,C;A,G,C,C;A,G,C,yB,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,W,C;A,G,C,0D,C,C;A,G,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,e,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,sE,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAx0B/CiE;E1DuzyBSZ,A0DtzyBSA;EAEA;WAEd,QAEF;MAAoBmB,+B/E1gKgBh9B,8B+E0gKpC,UACmB6H,K/EzgKJK;G+E0gKT,A5EpjKY5I,a4EqjKdqY,SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,Y1D2yyBEkkB,A0D1yyBAA,6BAA+BlkB,aACjC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C,A,E,oB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,yB,C;A,G,C,U,C,C,A,E,gB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,M,C,C,E,CE7wKM1X,WAAqB,gB7Eq7Fb,gCAAS,4C6Er7FoB,A,C,C,C,A,E,W,U,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C9D0C7Ci+B,cACE,qJAOF,A,C,oB,C,I,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC;gBAEgB;;IAGd,MAAOC,MRlEEr/B,OQiEM,IAAcwJ,wBRhEQ81B,aQkEvC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CA0VAv/B;sEAIM;kBAFF,QAQF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAoM,2DAEI,WAEF;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAIAjM;WAEI;;;;;KAIA;;4CAEA,MAAOF;iDAEP,MAAOu/B;iDAEP,MAAOC;KAOP,MAAOA,wCAGX,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEArzB,sBACgBszB;cAEFC,WACVC;YAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIAxzB;wEAKI;;;KAKA;0BAGA,MAAO;mCAEP;KAEA,MAAOyzB,UAEX,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEAC,oCAEI,MAAOC;2BAGP,MAAOA;KAGP,MAAOA,2BAGX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA3zB,sBACkBszB;YAQS,0BACXC,WACZC;YAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,C,C,CAnVEz/B,gHAIE;MAAO6/B,MAA8BvxB,YACvC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAQA9H,kHAImB8H;WAAqB6wB,QACxC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAEA3/B,YAAiB,SAAI,A,C;A,C,C,CAErBK;;QAAuB;iDACGyO,UAAW7M,KAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQrD5B,YAIE,YAAsCyO,QACxC,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA0BAvO;aAEqCuO,QAAjC;kBADF,OAGE;yCAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAQAtO;EAImDsO;eAEvB,IAAcwxB,uBAFxC;MAAOD,uBAGT,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,CA9KA7+B;EACem+B;WAEX,MAAOO;QASiBp2B;UAAf;;;SAQX;MAAOo2B,eACT,A,C,E,CA8BA1+B,YAIE,MAAO0+B,MAAYK,SACrB,A,C,E,C,CAEA99B,YAwBE,MAAO+9B,UAvBiB,2BAwB1B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAtBEA;;GACMC,QACF,MAAOA;;iDAIPA;UACA;MAAA,KAAgBZ,UAAhB,UAAA;KAC6CW,YAASX,UACtD,AACA,wFAGAY;UACAC;UAAqBb,aACrB;cAEA,MAAOF,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CA0JFgB;GACY,UAAa,sDACf,KAAA;;GAEA,UAAe,sDACf,KAAA,qDAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAIA//B;4BAG+BggC,2DAzBF;;EAAa;;UAChC,qDA2BR,0CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;4BAG+BA,2DAlCF;;EAAa;;UAChC,0FAqCV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA5gC,YAAe,iDAAkB,A,C;A,E,CAEjC,0DAAwD,A,C;A,C,C,CAKxD,cACE6gC,oBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cAIEA,oCADM,gBAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,sBApDoD;6BAAA;EAAV;UAChC,oDAqDRA;0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAYA,gBACEF,YACAE;oBAAiC,MACnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;;GAlEY,UAAa,sDACf;;GAEA,UAAe,sDACf;EAgES;GACN,UAAM;GACH;OACH;UAAwBt/B,AAAAA,kBACnCs/B;oBACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cACEA,oBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA+CoD,kBAC/BpB,UAEjBQ;gBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAGI,YAAI,yBAAgC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAuCpC,YAAI,mBAA2B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAG/B,YAAI,gCAAwB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAG5B,YAAI,mBAAyB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,a,Y,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C+D9gBnCx9B,gBACoB,UAAQ;EACR,UAAQ,GAAuB,AAAA,CAAR,kBACzC;MAAY,GAAQ,MACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA,cACoB,UAAQ,GAAuB,AAAA,CAAR;GACrB,MACpB;MAAkB,WAAQ,GAAuB,AAAA,CAAR,kBAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CC+BFd;;GAOQ,IAAK;GACL,IAAK;wDASL,MAAmB,AAAJ,CAAL;UAIAF,aAAgBA,YAAS,QACvC;SAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAUAE;;GAOQ,IAAK;GACL,IAAK;wDASL,MAAS;GAITF,YAAS,QACb;mBAGYJ,YAAc,QAC5B;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CCxEErB,eACU,MAAY,kBACZ,KAAA,yDAER;2BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CAmHA;EAE2B8gC;EAAF;EACH,CAAA;EAED;EACC,CAAA;EAGU,AAAV,IAAYC;EACpB,CAAA,iBAAZD;SAEAC;QAAkD,CAAA,AAAb,QAAX,AAAV,AALI,KAHA,MAOA,iCAItB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA/gC;GACU,MAAY,kBACZ,KAAA;EAEQ;IAAP,UAEPghC,SACA;MAAW,CAAA,AAAJF,eAKT,GACEE;EACQF;YAEsB,AAAP,AAAT,kBAA4B,AAC5C;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAjHAG;EAEW,cAGT;;EACiB;EACK,KAAP;;EACG;EACK,KAAR;EASa,CAAX,CAAA,AAAL,qBAFO,AAAA;EAGJ,CAAA;EAC8C,AAAnC,AAAV,CAAN,AAAA,SAHmB,CAAA,AAAP,MAAc,aAGQ,QAAP;EAOtB,CAHT,CAAA,GADiB,AAAP,OAAe;EAKhB,CAAA;EACuC,AAAjC,AAAN,CAJR,CAAA,EAHU,iBAOqB,QAAP;EAOhB,CAHT,CAAA,GADiB,AAAP,OAAe;EAKhB,CAAA;EACsC,AAAjC,AAAL,CAJR,CAAA,EAHU,gBAOoB,QAAP;EAIxB,CAAA,GADiB,AAAP,OAAe;EAExB,CAAA,EAHU;EAOR,CAFM,AAAA;EAGA,CAAA;EAC2B,QAAP;EAIpB,AAAJH;EACI,CAAA,iBAAbA;;EACmD,CAAA,AAAjC,AAAP,AAAJC,aAA4B,QAAP,+BAA5BA;SACAD;QAAI,CAAA,QACJC;QAAI,CAAA,EARoD,AAAjC,AAAV,GAHU,CAAA,AAAP,MAAc,oCAYlB,CAAA,UAAc;GAExBA,aAAYD,YACdA,aAEFE;SACAA;SACAA;SACAA;UACF,A,C;A,M,C,C,G,C,U,C,E,CAnEAC;;SAmEA,A,C,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CCtJA1gC,YAAkB,mBAAWsG,iBAAIq6B,YAAG,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CASpC7gC;;;2CACuB;EACdwG;EAAK5E,GAAZ;+BAAyB,KAAFi/B,OAAKj/B,KAC9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAA0C6G,KAAAA;EAAYq6B,KAAAA,OAArC;MHQSC,MAAOhqB,KAAQA,cGRwB,A,C;A,C,C,CAOjE0kB;EACsBh1B;;EAAI5E;;6BAAAA;WAAF,IAAa,KAAFi/B,OAAIj/B;wCAArC;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAOA45B;EACsBh1B;;EAAI5E;;6BAAAA;WAAF,IAAa,KAAFi/B,OAAIj/B;wCAArC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAWA45B,oBACsBh1B;;;WAAE,IAAY,KAAFq6B;wCAAhC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,G,CC/BA1oB;EAAe0X;EAAO6M;;6BAAAA,OAAV;MAAQ,KAAO,A,C;A,G,CAE3BvkB;EAAgBskB;EAAME;;6BAAAA,OAAT;MAAO,KAAQ,A,C;A,E,C,CAE5Bz8B,YACE,wBAAoB2vB,yBAAO4M,kBAAMC,kBAASC,SAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA38B;;;2CAC2B;EAClB6vB;EAAQjuB;4BAAc66B;EAAO76B;4BAVvBiuB;EAAO6M;;6BAAAA;GAAF,MAUwC96B,YARtC+6B;;6BAAAA;EAAF,MASJ/6B,sCADd;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAA0CkwB,KAAAA;EAAe4M;EAAAA;EAd1C5M;EAAO6M;;6BAAAA;EAAF;EAEEC;;6BAAAA;EAAF,cAYH;MJHbmE,MAAOhqB,KAAQA,KAAQA,KAAQA,oBIIC,A,C;A,G,CAsEpC0kB,2BAAqC,eAAW;wCAA3B;SAAoC,A,C,C;A,E,C,C;A,G,C,oB,C;A,K,C,I,C;A,K,C,I,C,C,A,E,gB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CC7FrD1hB;;4CACoB;EAGRwG;;iGAIhB;MAAO,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEMvH,eACI,cACCgoB,eAAP;cAEF,MhDgeO1nB,MzCjb4B5M,SyF9CrC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C,C,A,E,gC,mC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCqLErK,gBACQ,KAAA,0CACR,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,S,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,C,C,CAMA,gBAAkC,MAAGwgB,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAY7C,cAA6B,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMxCpU,cAAkBoU,OAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAM5B,YAAa,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CCiDxBpU,cAA0B,MAAGwyB,AAAAA,gBAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEvC,gBACEA,AAAAA,iBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA,cACEA,AAAAA,gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,YACEA,AAAAA,cACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAhhC,YAA6B,MAAGghC,AAAAA,eAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEtDhhC,YAAiC,MAAGghC,AAAAA,eAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE9D,cACEA,AAAAA,gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAhhC,YAAiB,MjFyMGkE,AiFzMA88B,gBAAa,A,C;A,G,CAEjChhC,YAAoB,MjFwMG,AADHkE,AiFvMG88B,gBAAgB,A,C;A,G,CAEvCtgC,kBAAwBsgC,OAAH;qCAAa,A,C;A,E,CAElCrhC,YAAe,MjFkMGuE,AiFlMA88B,YAAY,A,C;A,E,C,CAI9BxyB,cAAqB,MAAGwyB,AAAAA,iBAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEzCtgC,kBAA0BsgC,OAAH;MAAGA,UAAY,A,C;A,K,C,I,C,C,A,E,kC,0B,A,A,C,C,C,C;A,G,C,E,C;A,E,CCkJxCC;SAAAA,A,C;A,E,CA6BAA;SAAAA,A,C;A,E,CAgBAA;SAAAA,A,C;A,E,C,C;A,G,C,K,C;A,G,CAleE5gC,YAAqB,YAAa,A,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA+BlC;GACY,UAAa,cACf,KAAA;uDAIV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,6BAC0D,UACtD6gC,eAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAvhC,kBAKEwhC,YAA0B,IACT;SAInB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,G,C,wC,C,C;A,E,C,C;A,G,C,K,C;A,G,CAoEA9gC,YAAqB,YAAW,A,C;A,K,C,I,C;A,G,C,U,C,C;A,E,C,C;A,G,C,K,C;A,G,CAyYhCA,YAAqB,YAAc,A,C;A,C,C,CAEnCiB,oBACqBd;aA/dqC,UACtD0gC,cA+dF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aApeqC,UACtD0gC;OAqeJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,qCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAH,YAAqB,YAAc,A,C;A,C,C,CAEnCiB,oBACqBd;aA9gBqC,UACtD0gC,cA8gBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aAnhBqC,UACtD0gC;OAohBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,qCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAH,YAAqB,YAAY,A,C;A,C,C,CAEjCV,oBACqBa;aA7jBqC,UACtD0gC,cA6jBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aAlkBqC,UACtD0gC;OAmkBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,mCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAH,YAAqB,YAAY,A,C;A,C,C,CAEjCV,oBACqBa;aA5mBqC,UACtD0gC,cA4mBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aAjnBqC,UACtD0gC;OAknBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,mCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAH,YAAqB,YAAW,A,C;A,C,C,CAEhCV,oBACqBa;aA3pBqC,UACtD0gC,cA2pBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aAhqBqC,UACtD0gC;OAiqBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,kCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,W,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAH,YAAqB,YAAa,A,C;A,C,C,CAElCV,oBACqBa;aA1sBqC,UACtD0gC,cA0sBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aA/sBqC,UACtD0gC;OAgtBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,oCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAH,YAAqB,YAAa,A,C;A,C,C,CAElCV,oBACqBa;aAzvBqC,UACtD0gC,cAyvBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aA9vBqC,UACtD0gC;OA+vBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,oCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAH,YAAqB,YAAmB,A,C;A,E,CAExCV,YAAe,gBAAmC,A,C;A,C,C,CAElDA,oBACqBa;aA1yBqC,UACtD0gC,cA0yBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aA/yBqC,UACtD0gC;OAgzBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAIE,0CAHMwgC,cAAmC5gC,YAI3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,oC,C,C;A,E,C,C;A,G,C,K,C;A,G,CAoCAH,YAAqB,YAAY,A,C;A,E,CAEjCV,YAAe,gBAAmC,A,C;A,C,C,CAElDA,oBACqBa;aAj2BqC,UACtD0gC,cAi2BF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aAt2BqC,UACtD0gC;OAu2BJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,mCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,a,C,C;A,G,C,C;A,G,C,K,C;A,E,CA/dAb,YAAe,gBAAmC,A,C;A,E,C,CAElDK;EAGkC,AADb,UACnBmhC;cACAA;;GACU,eAAa,KAAA;EACP;GAEF;EAEKr4B;6BAJH;GAKa,AAAZ;UAIkB,qBAGA;WAGrC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CASA;6CAGIu4B,kBACA;8CAGJ,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CASA;6CAGIA,kBACA;8CAGJ,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C,C,A,E,0B,sB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCngBF,yDAII;kFAOA;kCAKA;qCAMA;qDAOJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCpC0BpuB,YAAwB,MAAGquB,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAuCvuB,cAAiCuuB,KAAWlsB,eAA6BksB,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAE7LC;;ElEyFqB;;;gBC5CI;;;;;;SiE7CmB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6E,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCEnBrhC,YAAgB,MAAGshC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BzuB,cAAyByuB,KAAUpsB,eAA4BosB,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzIthC,YAAoB,MAAGuhC,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAA8C1uB,cAA6B0uB,KAAcrsB,eAAgCqsB,QAAqB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAEjLC,YAAsB,MAAGnrB,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C,C;A,G,C,CAAqCxD,cAA+BwD,KAAcnB,eAAgCmB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAC1KorB,YAA2B,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAA6D7uB,cAAoC6uB,KAAaxsB,eAA+BwsB,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAElO,wBACa,KAACnJ;EANsIrjB,eAAgCqsB,OAA9CA;;GAOvH,oBACJI,KATiCL,cAA+DA;KAAUpsB,eAA4BosB,SAWjJ,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,gB,C,C;A,E,C,CAEA,2BAEE/I;;EAf0C+I,IAA+DA;KAAUpsB;GAsBtG,AAnBkCmB,czFqoD1CpT,QAA8B;E0F/nD5B2+B,ODeLliC;gBACAmiC;KArBmDH,SAsBnDn5B,AAAAA;8BAIJ,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,E,C,CAEA,oBAGSu5B,KADiBvJ,eAlCiF+I;KAAUpsB,eAA4BosB,QAoCjJ,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Y,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEAS;EC7BSH;;EpE8EY;;;gBC5CI;;;;;;;;SkELiB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAZlB,YAChBliC,uBACJ,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,8B,C,C,G,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,2E,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CEhCqBI,YAAc,MAAGsW,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCvD,cAAuBuD,KAAUlB,eAA4BkB,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC5InW,YAAqB,MAAGoW,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C,C;A,G,C,CAA2CxD,cAA8BwD,KAAcnB,eAAgCmB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAC/KrW,YAAgB,MAAGgiC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAoCnvB,cAAyBmvB,KAAU9sB,eAA4B8sB,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC9IjvB,YAAyB,MAAGkvB,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAA+CpvB,cAAkCovB,KAAY/sB,eAA8B+sB,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,E,C,CAE3M,wBAL0C7rB;UAOtC;GAEW,AARiCC,YAD6DD,KAAUlB,oBAGuB+sB;KAAY/sB,eAA8B+sB,UASpL15B,AAAAA,AAAAA;UAVuCy5B,uCAgB3C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CApBAE;;ErE6FqB;;;gBC5CI;;;;;;;;;;SoEjDkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAcnB;;SATsHD;QAAY/sB,YAA8B+sB,aAWlL,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,kC,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAAgB;;SAduF7rB;QAAUlB,YAA4BkB,cAgB7I,A,C,Q,C,I,C,C,C,C,C,G,C,M,C,C;A,K,C,I,C,C;A,kC,C,C,G,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CClBN+rB;;EtE6FqB;;;gBC5CI;;;;;;;SqEjDkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCCnBntB,YAAqB,MAAGotB,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAoCvvB,cAA8BuvB,KAAWltB,eAA6BktB,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAGpL,cACEphB,AAAAA,KAJ8CohB,YAKhD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAC;;EvE2FqB;;;gBC5CI;;;;;;SsE/CmB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,wF,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCDpBviC,YAAmB,MAAGwiC,MAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAAyCzvB,cAA4ByvB,KAAeptB,eAAiCotB,QAAsB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,W,C,G,C,C;A,E,C,CAErM;gCAEEptB;mBACAA;;ECL+CqtB;EDO3B;KAA4B,AAAjBC,sBAMgGC;KAAevtB,eAAiCutB;;EAJnJ,AAAhBD,sBAC4B,KAA5BA,AAAAA,uCAI+GE;KAAcxtB,eAAgCwtB,QAH3K,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,G,C,CAEyB5iC,YAAmB,MAAG2iC,MAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAA0C5vB,cAA4B4vB,KAAevtB,eAAiCutB,QAAsB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,W,C,G,C,C;A,G,C,CAC9K3iC,YAAkB,MAAG4iC,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyC7vB,cAA2B6vB,KAAcxtB,eAAgCwtB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CAEhMC;;ExE4EqB;;;gBC5CI;;;;;;;;;;SuEhCqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,yB,sD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CEftB3tB,YAAwB,MAAG4tB,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAuC/vB,cAAiC+vB,KAAc1tB,eAAgC0tB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAKjL5iC,YAAyB,MAAG6iC,MAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAAwChwB,cAAkCgwB,KAAmB3tB,eAAqC2tB,QAA0B,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,e,C,G,C,C;A,G,C,CACxM7iC,YAAgB,MAAG8iC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BjwB,cAAyBiwB,KAAU5tB,eAA4B4tB,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAEjK9iC;EACyB;KAA8B,AAAnByJ,uBAClBA;GACL,QACT,MAAUs5B,sBAA6Bt5B;;EAGZ,AAAlBA,sBAC8B,KAA9BA,AAAAA;IACEA;GACL,QACN,WAAU8L,6BAAoB9L,oBAEhC;WAAUA,qBACZ,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,mB,C,C;A,E,C,CAEA,qBACEyL;mBACAA;;EACgB6tB,UA3BiCH,KAK2FC;KAAmB3tB,eAAqC2tB;EAuB7Lp5B,KA5B0Cm5B;EAM6FE;iCAAtCA,KAAU5tB;;uBAAV4tB,KAAU5tB;;yBAAV4tB,KAAU5tB;;sBAAV4tB,KAAU5tB;;sBAAV4tB,KAAU5tB;;mBAAV4tB,KAAU5tB;;8BAAV4tB,KAAU5tB;;8BAAV4tB,KAAU5tB;;yBAAV4tB,KAAU5tB;;uBAAV4tB,KAAU5tB;;8BAAV4tB,KAAU5tB;;6BAAV4tB,KAAU5tB;;QAAV4tB,KAAU5tB;OA+DpH,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,iB,C,C;A,E,C,CAEA,cACEzL,AAAAA,KAxEiDm5B,YAyEnD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAxEAI;;E1E0FqB;;;gBC5CI;;;;;;SyE9CsB,A,C,I,C,I,C,C,C,C,C,G,C,iC,C,C,C,C;A,sB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,S,C;A,E,C,CCwB/CC,WAAsB,gBAClBC,QAAkB,KAAXC,YAAkC,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,G,CAG7C1jC,YAAc,MAAc,MAAX0jC,WAAkC,A,C;A,M,C,C,G,C,K,C,E,CAtBnDF;kBAEoD,KAAX,KAAb,KAARxH,QAAU7xB,SAAa6xB,aAA+B,A,C,C,C;A,G,C,C;A,G,C,C,uG,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAoCjDz7B,YAAkB,MAAGojC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCvwB,cAA2BuwB,KAAYluB,eAA8BkuB,QAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACxJpuB,YAA6B,MAAGquB,MAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAA4CxwB,cAAsCwwB,KAAmBnuB,eAAqCmuB,QAA0B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAK5O;;EAEyBC,kEAAvBC;MACAA,AAAAA;WAAwCC,aAC1C,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAGA/jC,uBAEE;MAAA,YAAA,UAAA;6BAAA;EACwB,AAAN,QAClB,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEA,kBACEgkC,KAAAA,SACAC;KAAAA,SACAC;KAAAA,KAAgBC,gBAClB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,W,C,C;A,E,C,CAEA,+BACE;MAAA,KAAmBC,mBAAnB,UAAA;;GACqB,CAAA,KAAfC,yBACFrxB,ArFiKoB;WLpJjB1S,K0FVmB+jC,SAAAA,KAAAA;ejB3Ca;GiBsD/BC,UAAkBA,UAAkBA;EATvBD,kBAbrBL;KAAAA,SACAC;KAAAA,SACAC;KAAAA,KAAgBC,gBAYhB,AACAI,0BACAA;uBACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,kB,C,C;A,E,C,CAEAxjC,iCjBnDyC,OiBsDvC;OAAQujC,UAAkBA,UAAkBA,eAC9C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,gB,C,C;A,E,C,CAEA/jC;EACc,KAAmBikC;EAvETd;EAApBD,KAAAA,KAAAA,QAA2C,UAwE7C;MAAOO,MAAAA,KAAeE,KAAAA,KAAgBC,eACxC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,c,C,C;A,E,C,CAGAnkC;EAC+B,KAAZykC,KAAcD,KAAAA;EAtEL,KAAXd,AAuEH,KAAmBc;;EACT;EACC;EACXE,KAzD0Cd;6BAuDhC;GAGhB,QAA4Be;6BAAAA;EAAF;Q1FhBzBrkC,K0FiBYqkC,KAAAA;EACCD,KA5DkCd;6BA4DlCc,OADlB;MAAmD,QACnC,UAEhB,SAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEA;;SAC6BE,KAAAA,UAAWn/B;EACTA;EArBjB,KAAmB++B;EAvETd;EAApBD,KAAAA,KAAAA,QAA2C;EAwEtCO,KAAAA,KAAeE,KAAAA,KAAgBC;EAqBlB,2BAtE6FR;KAAYluB,eAA8BkuB,QAuE7J,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,kB,C,C;A,E,C,CAEA;EAxEwDC;YAyEzBE,WAC3B,MAEFe;UACIH,qBAA6BA,KA7EqBd;EA8E1Cc,KA9E0Cd;EA+E1CE,KAAAA,KAAAA;EAAAA;EAGyB,KADA,KAAjCY,KAjFkDd,wBAkFlDc,KAlFkDd;6BAkFjB;EAFC,GAAtCa;;EAG2BE;6BAAAA;EhF25CpBG,KAA8BC,AgFz5CjCjB,KAAAA,wBAFqB,KACzBU;MAEAV;KAAAA,KAA6BU,QAC7BV;KAAAA,KAA8BU,KAAAA,MAC9BQ;aACF,A,C,Q,C,K,C,C,C,C,C,G,C,0B,C,C;A,E,C,CAIA;EACcN,KA9F0Cd;;8BA+FrBe,iBAhGgFhB;KAAYluB,eAA8BkuB;;GAiG7I,MAAGgB,SACf;EAEqB,MAAEF;EACb,KAAmBD;EACjBG,KAAAA;;GACd;YAAoBrP;6BAAAA;KAAF;EACJA;EACEA,MAAU;EACZ2O,KAAAA,OACZ;iBAAY,SAAG,gBAvIjBR;EACIC;SADJD;KAAAA,UAC2B;aAQP,UAiIlB,KACF,EACkB,OAAEgB,KACpB;YAjIef;;EAfKD;;EAAF,KAeQ,SAfNA;EAAmB,KAeb,SAfgBA;;IAgJrB;QA7IrBA;KAAAA,WAC2B;aAQP,UAuIpB,EACAK,KAAAA;EACIU,IADJV;iBACyCU,UAEzC;yBAGF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,c,C,C;A,E,C,CAEA,oBA5HwDZ;WA8HpD,MAEFc,AAAAA,AAAAA,AAAAA,AAAAA;2DAMF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,cAEE,uBAGF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,sB,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,uB,C,E,C,CA3IAO;EjG4lDOzhC,QAA8B;EAA9BA,QAA8B;EAA9BA,QAA8B;;EsBjjDhB;;;gBC5CI;;;;;;;;;S0EEzB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,M,C,CAoHa,WACTwhC,YAAuB,gBACzB,A,C,Q,C,I,C,C,C,C,C,G,C,M,C,C;A,K,C,I,C,C;A,sC,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAO0C;;SAhI8GpB;QAAmBnuB,YAAqCmuB,aAmIhN,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,iC,C,C,G,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAc,cACZ5wB,ArF0DsB,+BqFzDxB,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,iC,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAKW,WACTkyB,aACF,A,C,Q,C,I,C,C,C,C,C,G,C,M,C,C;A,K,C,I,C,C;A,8C,C,C,G,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qH,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CC7JsB3vB,YAAuB,MAAG4vB,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsC/xB,cAAgC+xB,KAAa1vB,eAA+B0vB,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CA6BlM;;EAGMtB;gBvFQc,+BAKlB9vB;KAAS,KAAaqxB,uBuFdtBC;MAEAA,AAAAA;wBACAA;KAAAA,KAAAA,qBACAA;KAAAA,KAAAA;EAEIxB;gBvFGc,+BAKlB9vB;KAAS,KAAaqxB,0BuFTtBE;MAEAA,AAAAA;;EAEIzB;gBvFAc,+BAKlB9vB;KAAS,KAAaqxB,0BuFNtBG;MAEAA,AAAAA;;EAEI1B;gBvFHc,+BAKlB9vB;KAAS,KAAaqxB,uBuFHtBI;MAEAA,AAAAA;wBACAA;KAAAA,KAAAA,qBACAA;KAAAA,KAAAA,yBACAC;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAIA;EApDkDN;cAqDtBO;;oEACK,KAA1BA,KAAAA,KAtD2CP;KAuD9C,MAIFQ,AAAAA;SACAC,AAAAA;SACA;MAAA,KAAuBF,KA7DyBP,iBA6DhD,UAAA;GACMU;;EAIU/vB,KAAAA;EACJA,AAAAA,oBACV6vB;KAAAA,oDAEOG,uBACHA,eACAA,eACAA,eACAA,eACAA,eACAA,eACAA,eACAA,gBACJF;KAAAA,oDAEQG,uBACHA,eACAA,eACAA,eACAA,eACAA,eACAA,iBACP,AACAC,AAAAA;EACWN,KAAAA,KA1FqCP;SA2FhDa;KAAAA,aAAiCC,eACjCD;KAAAA,aAAkD,KAAjBC,kBAAmBA,gBACpDD;KAAAA,iBAAqCC,mBACrCC,AAAAA;;EACOR,KAAAA,KA/FyCP;SAgGhDe;KAAAA,aAAiCD,eACjCC;KAAAA,aAAkD,KAAjBD,kBAAmBA,gBACpDC;KAAAA,iBAAqCD,mBACrCR;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,kB,C,C;A,E,C,CAEA,eACOJ,YAAwBG,WAC3B,MAEFA,AAAAA;SACAA,AAAAA;QAAoBI,KACpBP,AAAAA;SACAA,AAAAA;QAAgBM,KAChBL,AAAAA;QAAkBU,KAClBT,AAAAA;QAAkBW,MACpB,A,C,Q,C,K,C,C,C,C,C,G,C,O,C,C;A,E,C,CAEA7lC;;EACiB8lC;EACAA,YACf;MAAA,QAAA,UACiB,CAAA,KADjB,UAEI,QAEJ,AACA;MAAA,QAAA,UACiB,CAAA,KADjB,UAEI,QAEJ,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,wB,C,C;A,E,C,CAEA3lC;iBAKM,MAAO2lC,MAAAA;gBAEP;MAAoC,MAA7BA,KAAAA,gBAA+BA,KAAAA;OAEtC,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;gBAEP;MAAoC,MAA7BA,KAAAA,gBAA+BA,KAAAA;OAEtC,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;cAEL,KAAA,QACR,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,uB,C,C;A,E,C,CAEA3lC;iBAKM,MAAO2lC,MAAAA;gBAEP;MAAkC,MAA3BA,KAAAA,gBACAA,KAAAA;gBAEP;MAA6B,MAAtBA,KAAAA,gBACAA,KAAAA;gBAEP;MAEoC,MADK,KADL,KAA7BA,KAAAA,gBACAA,KAAAA,iBACAA,KAAAA,iBACAA,KAAAA;gBAEP;MAAyC,MAAlCA,KAAAA,gBACAA,KAAAA;gBAEP;MAA0C,MAAnCA,KAAAA,gBACAA,KAAAA;gBAEP;MAAoC,MAA7BA,KAAAA,gBAA+BA,KAAAA;cAEpC,KAAA,QACR,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,2B,C,C;A,E,C,CAEA,oBAzLkDhB;WA2L9C,MAEFO,AAAAA,AAAAA,AAAAA,AAAAA;sEAMF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,wBArMkDP;WAuM9C,MAEFO,AAAAA,AAAAA,AAAAA;sEAMF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,kB,C,C;A,E,C,CAEA,cACEU,UACA3wB;kBAA4C4wB,YAC5C5wB;kBACqB6wB,YACrB7wB;kBAAgD8wB,aAClD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,gB,C,C;A,E,C,CAEYhmC;EAzNsC4kC;WA2N9C;;EAGSO,KAAAA;SAEX;MADQ,SAAyB,KAAV,KAAbO,oBAAyBA,+BAErC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,kB,C,G,C,C;A,E,C,CAEY1lC;EAnOsC4kC;WAqO9C;oBAIF;WAAUc,KADCP,KAAAA,mCAEb,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,sB,C,G,C,C;A,E,C,CAEYnlC;EA5OsC4kC;WA8O9C;oBAIF;MC7LOt+B,MD6LiBo/B,KADbP,KAAAA,sCAEb,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,8B,C,G,C,C;A,E,C,CAjPAc,2BvFPe,KAAapB,6BuFQ1BO;MACAA;sBACAA,AAAAA;iCACAA,AAAAA;4CACAA,AAAAA;yCACAA,AAAAA;mCACAA,AAAAA;iCACAA,AAAAA;4CACAA,AAAAA;yCACAA,AAAAA;;WvFjBa,KAAaP,6BuFkB1BY;MACAA;qBACAA,AAAAA;;WvFpBa,KAAaZ,6BuFqB1Bc;MACAA;qBACAA,AAAAA;;WvFvBa,KAAad,6BuFwB1BQ;MACAA;sBACAA,AAAAA;+BACAA,AAAAA;yCACAA,AAAAA;2BACAA,AAAAA;sCACAA,AAAAA;mCACAA,AAAAA;uCACF,A,C,I,C,I,C,C,C,C,C,G,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,2D,C,E,C,CAzBAY;;E5E4DqB;;;gBC5CI;;;;;;;;S2ESzB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAkKiD;;SA7LiFrB;QAAa1vB,YAA+B0vB,aAgM5K,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,qC,C,C,G,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAc,cACZnyB,AtFcsB,+BsFbxB,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,qC,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAOqD;;SAzM2EmyB;QAAa1vB,YAA+B0vB,aA4M5K,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,8C,C,C,G,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAc,cACZnyB,AtFEsB,+BsFDxB,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,8C,C,C,G,C,C,A,E,e,mB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CxBhJJ6pB;;EA8FapL,0DACXgV;mBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAoBAtN,sBAwEE;MADW1H,8DAEb,A,C,iB,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkDAiV;;+CAeeC;;sBASX,SAMF,yCAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIA/M;4CAEI,aACIgN,cAAgBA,aAAkBA,IAExC;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C0BzWEnkC;cAEeokC,KAPgBtyB,AAAAA,qCAO3BuyB;OAEF,SACF,A,C;A,E,CAyBArkC;cAEgB,AAACskC,aAAWF,KArCGtyB,AAAAA,sCAqC3ByyB;OAEF,SACF,A,C;A,E,C,C;A,G,C,Y,C;A,M,C,C1BgDAhnC;;EACewI,QACb;QAAkB,WACFA,SAAmB,QACnC,AACAA;SACAy+B;iBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CACAC;8BAAgB;MAAGD,MAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAC5BE;8BAAsBF;OAAe,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACrCR,YAAgB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAGhBhV;;WACiB;wBACA;uBACD;uBACG;;4CAEf,gBA5DyB2V;iDAgEnB,KAAA;4CAUO;4CACA;4CAIK;4CACO;4CAED;+CAGbC;EACAH;;GACF,QAAS;;KAElBC;mBACArO;wBAGA;qFAQaA;EACFuO;EACAH;GACF,kCAGLC;oBAEF,uBAQFA;;6BAhBarO;GAkBb;KAAU,WACErH,YAAKqH;8BAAfrxB;OACF,AACA,cAGI,KAAA,wCACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CApCc,0BAC4BgqB,kBACpC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkENzxB;;EACewI,QACb;QAAkB,WACFA;yBAAmB,SACnC,AACAA,SACAy+B;iBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CACAC;8BAAgB;MAAGD,MAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAC5BE;8BAAsBF;OAAe,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,M,C,CAErCxV;WACiB;wBACA;uBACD;uBACG;qBAGf,MArLG;4BA0LG,KAAA;kDAMK4V;EACAH;GACF,QAAS;E1Eq5Cf1jC,QAA8B,+B0El5CjC2jC;mBACA;uC9E2CkC5lC,8B8E3ClC,U9E6CakI,I8E5CXhC;QAAYgqB,mBACd,AACA,kCAIW4V;EACAH;GACF,QAAS;;EAELpO;uBAIbqO;;6BAJarO;;GAMb;KAAkB,QAChBrxB,QAAUgqB,YAAKqH,UACjB,AACA;SAKF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,C2B1RAv4B,YACE,MAAO+mC,AAAAA,qBACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CASAjnC;EACkBinC;GAEmB,CAACpuB,gBAElCA;UAGAA;KAEFquB,UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,CASAjmC,kBAAiCgmC;kBjG80CQnZ,uBAyXvCI;KAAQM,AAAAA,OiGvsDoB;SAAyB,A,C;A,E,C,CAIvD,cACEyY,AAAAA,kBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/mC,cAAqC,MAAG+mC,AAAAA,mBAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAErEvmC,oBAAmCumC,SAAH;MnD4JF,+BmD5JyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEvDvmC,oBAAkDumC,SAAH;4CAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMxEjnC,cAAiC,MAAGinC,AAAAA,mBAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAExDjnC,YAAiB,MjG8zCGkE,AiG9zCA+iC,kBAAqB,A,C;A,G,CAEzCjnC,YAAoB,MjG6zCG,AADHkE,AiG5zCG+iC,kBAAwB,A,C;A,E,CAE/CtnC,YAAe,MjGyzCGuE,AiGzzCA+iC,cAAoB,A,C;A,E,C,CAmBtCjnC,cAA4B,MAAGinC,AAAAA,mBAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAG5D/mC,YAA4B,MAHG+mC,AAAAA,0BAG8B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAQ7DjnC,cAGE,MAAO89B,sBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CASA99B;EAEkBinC;EACFpuB,SACdquB;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQA,cAEEpJ,qBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAmDA59B,kBjGgwCM0tB,AiGhwCaqZ;wCAAH;MjGiwCPrZ,SiGjwC4B,A,C;A,E,C,CAErChtB,cAA6C,MACzCqmC,AAAAA,mBAAwC,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAK5CvmC,oBAAgCumC,SAAH;MnDwHpB,0BmDxH4C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASrD/mC,cAA4B,MAAG+mC,AAAAA,mBAA8B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE7D,YACEnJ,oBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAYAA;EACkBmJ;EACNr4B,WACVs4B;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CApHgB,YAAI,MAAGruB,eAAW,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA0BzB,YAAI,MAAGA,gBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAwExB,YAAI,MAAGA,SAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,G,CzBrKxBjY,iBACyBu+B,OADG;MAC1B,KAAuBA,4BAAuC,A,C;A,E,C,CAEhE,cjFsIS1+B,KiFrIP0mC,cACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEA,sBA+FkCA;gCAAAA,SA9FhC;KA8FgCA,QA7FlC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA;EA0FkBA,AAAAA;;GAxFF,SACZ;QACmB,mDAIrBC;eACF,A,C;A,C,C,CAEA,c3D6smBErL,AAAAA,A2D5smBAoD,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,qBACE;MAAA,U3DwsmBApD,A2D5smBAoD,WAIA,O3DwsmBApD,c2DxsmBA,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/7B,cAC0B,SAG1B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIA,mBACQ,KAAA,kCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAEA,yBAEQ,KAAA,yCACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUA,gBjFgFSS,KiF/EP0mC,QAAAA,4BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,Y3D4vmBEpL,KAAAA,A2DzvmBAoD,eACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUA,gBACEA,AAAAA,kBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA;E3DmxmB8BpD,A2DlxmB5BoD;E3DkxmB4BpD;0BAAAA,SA/F5BA;SA+F4BA,M2DjxmB9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQA/7B,cAC2B,SAS3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAEAL,YAAe,MAAGwnC,AAAAA,mBAAgB,A,C;A,C,C,CAClCzN,oBAAkCyN;gCAAAA,SAAH;MAAGA,MAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAClDlmC,kBAAkCkmC,UAAH;uBhF8KOjmC,8BgF9Kc,A,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAtGT,wBAAI;gDAAQw4B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyDf,YAAK,MAAG2N,SAAU,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C0B1E1DnnC,kBPFiDuiC;GOGvC,WACc,KAAhB6E,mBACS,KAAPA,KPLuC7E,+BOMzC;QACgB,KAAP6E,KPPgC7E,2BOQzC;QACgB,KAAP6E,KPTgC7E,yBOUzC;QACgB,KAAP6E,KPXgC7E,iCOYzC;QACgB,KAAP6E,KPbgC7E,mCOczC,mDAIN;uCACF,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,E,C,CAGAtiC,YACE,MAAOonC,aACT,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,E,C,CAEA;EP1BiD9E;UO6B7C6E,AAAAA,AAAAA;cAUA5E;oBACAA;sBACA8E;YAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,a,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CA3CAC;;EhF4FqB;;;gBC5CI;;;;;;;S+EhDqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CA6BxB;;GACY,AAAxBjgC,8BACFA,QAAcA,uBACdA;MAAgBA;SPhCmGi7B;QAASrtB,YAA2BqtB,YOmCzJrtB;iBACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,yC,C,C,G,C,C,A,E,yB,sD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCnCoBF,YAAwB,MAAGwyB,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAuC30B,cAAiC20B,KAActyB,eAAgCsyB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAIzMlyB,cACE,MAAOmyB,AAAAA,MAL0CD,SAMjC,KAAZC,KAN6CD,oB7EukC1ChyB,uB6EhkCT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,cACEiyB,AAAAA,KAViDD,YAWnD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CATAE;;EjFyFqB;;;gBC5CI;;;;;;SgF7CsB,A,C,I,C,I,C,C,C,C,C,G,C,iC,C,C,C,C;A,sB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,wD,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,C;A,G,C,CCElC/xB,YAAc,MAAGsa,MAAAA,QAAS,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,C;A,E,C,CA2BvC;EACkBkV;EAAAA;EACZrL;;GAAgB,KAAhBA,WAEF,MAEF;MAAsB7J,SAAtB,KAAsBA,WAI8Bvb,QAJpD,UAAA;EAVyB,KAAhBizB,QAAkB1X;6BAKXkV;GAMV,EAXiC,KACe,AAAd,KAA9BwC,AAAAA,cAAgCjzB,oBAcxColB;MADU,kBAEZ,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,WAAA,OACA,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CApCA8N;EAKqBlzB;EAAAA;EAGjBmzB;EAA0B5X;WAA1B4X,OAAYC,KAAc7X,QAAYvb;KAEtCmzB,OAAYC,KAAc7X,QAAY/F,AAAAA,WAExC2d;OAAYC,KAAc7X,AAAAA,kBAC5B,A,C;A,M,C,C,E,C,CAlBA/tB,cAEE,MAAU6lC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,CAEAH;;EtFVmB,QAAsB,KAAZ1d;;;SsFuB7B,A,C,C,C;A,E,C,C;A,G,C,C,iD,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,C;A,E,C,CA8DA;EACkBib;;EAAAA;EACGA;EACfrL;;GAAgB,KAAhBA,WAEF,MAEF;MAAuBt1B,UAAvB,KAAuBA,SAAvB,UAAA;;EAbsD,KAAlCA,KAAkBmjC,UAClBnjC;6BAMJ2gC;GAOV,EAZgB,KACkC,AAAhB,KAA9BwC,AAAAA,6BAeR7N;MADU,OAAkCkO,gBAE9C,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,WAAA,OACA,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CA5CAC;EAIqB9C;;EAAAA;EAI4B3gC;EAE7CqjC;cAHW1C,AAAAA,aAGX0C;OAAYC,KAFepzB,QACJA,gBAGIwV,IAE3B2d;OAAYC,KAFe5d,QACJA,SAGzB2d,OAAYC,KAActjC,YAC5B,A,C;A,M,C,C,E,C,CAtBAtC,cAEE,MAAU6lC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,CAEAE;;EtF1DmB,QAAsB,KAAZ/d;;;SsF2E7B,A,C,C,C;A,G,C,C;A,G,C,C,mI,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAkCwBlV,YAAuB,MAAG4vB,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsC/xB,cAAgC+xB,KAAa1vB,eAA+B0vB,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CACzK9kC,YAA0B,MAAGooC,MAAmB,A,C,I,C,I,C,C,C,C,C,G,C,kB,C,G,C,G,C,C;A,G,C,CAAyCr1B,cAAmCq1B,KAAsBhzB,eAAwCgzB,QAA6B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,kB,C,G,C,C;A,G,C,CACvNpoC,YAAyB,MAAGqoC,MAAkB,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,G,C,G,C,C;A,G,C,CAAwCt1B,cAAkCs1B,KAAqBjzB,eAAuCizB,QAA4B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,iB,C,G,C,C;A,G,C,CAChNnoC,YAAuB,MAAGooC,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2Cv1B,cAAgCu1B,KAAiBlzB,eAAmCkzB,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CAC/LpoC,YAAuB,MAAGqoC,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2Cx1B,cAAgCw1B,KAAiBnzB,eAAmCmzB,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,I,C,CAC/LroC,YAAsB,MAAGsoC,MAAa,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,G,C,C;A,I,C,CAA0Cz1B,cAA+By1B,KAAgBpzB,eAAkCozB,QAAuB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Y,C,G,C,C;A,G,C,CACxLtoC,YAAuB,MAAGuoC,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2C11B,cAAgC01B,KAAiBrzB,eAAmCqzB,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CAC/LvoC,YAAyB,MAAGwoC,MAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAA6C31B,cAAkC21B,KAAmBtzB,eAAqCszB,QAA0B,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAQtO;EAfkD5D;WAiB9C;EAEiBO;ErC6CW;EqC3ChBsD,OAlB4HL;KAAiBlzB,eAAmCkzB;EAmBhLM,OAlB4HL;KAAiBnzB,eAAmCmzB;EAmBhLlD,KAAAA,KAvBkCP,cAM0F2D;KAAiBrzB,eAAmCqzB;EAkBjLpD,KAxBmCP;6BAwBnCO;EACA,QAAyB,YApBgGmD;KAAgBpzB,eAAkCozB;EAqBrK,KAAkB,KAAjBK,cAnB8HH;KAAmBtzB,eAAqCszB,OAoB1MrD,AAAAA;KA3BgDP,SAAAA,KA4BhDO;KA5BgDP,iBA4BzB+D,KACvBC;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,gB,C,C;A,E,C,CAEA,cACEA,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,yB,C,C;A,E,C,CAGA,kBdtIShH,QcuIPvR;0BACAuY;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,cACEC,gBACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,wB,C,C;A,E,C,CAEA;EA5CqDV;EA8C9B,gBACX,gCAEVhD,AAAAA,AAAAA,AAAAA;KAnDgDP,kCAwDlD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA;GA1DkDA,WA4D9C;EA3DkDsD;GA8F7B,gBACrBY;KAEAC,WAnCJ,A,C,Q,C,K,C,C,C,C,C,G,C,S,C,C;A,E,C,CAEA;EAEa5D,AAAAA,KAnEqCP;WAqE9CnyB,A5FyDsB;I4FtDtB4d,AAAAA,QAAgB,KAxE8BuU,yBAuEhD;;kBAGEnyB,A5FoDsB;qC4FjDxByC,oBAAkCmb,MACpC,A,C,Q,C,K,C,C,C,C,C,G,C,mB,C,C;A,E,C,CAEA;EACa8U,AAAAA,KAjFqCP;WAmF9CnyB,A5F2CsB;I4FxCtB4d,AAAAA,QACI,KAvF0CuU,2BAqFhD;;kBAIEnyB,A5FqCsB;mC4FnCxByC,oBAAkCmb,MACpC,A,C,Q,C,K,C,C,C,C,C,G,C,iB,C,C;A,E,C,CAEA,kBA7FsD6X;GA8F7B,gBACrBY;KAEAC,WAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,Y,C,C;A,E,C,CAEY/oC,cACV,2BAAkC,KAAV2U,mBAC1B,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,G,C,C;A,E,C,CAEY3U,oBAEY,KAAV2U;qCACZ;MAAOq0B,SACT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,U,C,G,C,C;A,E,C,CAEY;EACAjiB;;+CAGRsJ;EAAY1b;mCAAZ0b;KAAyB,MAE7B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,gB,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,Q,C,E,C,CAvHA4Y;;ElFlBqB;;;gBC5CI;;;;;;;;;;;;;SiF8DwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAoDb;;SAnD8FrE;QAAa1vB,YAA+B0vB,aAuD5K,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,wC,C,C,G,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,CCvKFsE;;EnF6FqB;;;gBC5CI;;;;;;;SkFjDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C,A,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCErBv2B,YAAoB,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,KAAasC,eAA+BtC,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CADzLu2B;;EpF4FqB;;;gBC5CI;;;;;;SmFhDwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,S,C;A,E,C,CCIjD;EhG0BmBhlC,AgGzBbA;GAAe,KhGyBFA,+BAOjBA,mCgG7BE;MAAoBilC,0B/G+RcpoC,8B+G/RlC,U/GiSakI;G+GhSC,uBhG4BhB/E;+BgGvBE,ChGuCFA,qBArBcA;EgGfEilC;E/G69BTxoC,gBAAoCH;E+G39BnC2oC,OACR;QAAkB,EAAEA,AAAAA,sBACCA;qBAAAA;EAAAA,AAAAA;;GAEF,kCAJXA,OAKJz0B;YAAa,QAAc,aAE3BA;EAEQy0B;qBAAAA;EAAAA,AAAAA;aAER;YAAoBA;qBAAAA;KAAF,EAAEA,AAAAA,AAAAA;uBAKlBz0B;cACF,SAED;YAAoBy0B;qBAAAA;KAAF,EAAEA,AAAAA,AAAAA;;EAKDA;qBAAAA;EAAAA,AAAAA;qBAAAA,SACjBz0B;OAAQ00B,QADmD,AAAN,KAApCD,kBAEnB;;8B5F2Se;;;yBJxRlBjlC;mBgGhBA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;GACMqP,iBhGkBc;kBAKlBA;KAAS,KAAaqxB,kCgGrBpBrxB;SACAA;qBACAA,AAAAA,AAAAA;iCACAA,AAAAA,AAAAA;uB3GolDGvQ,mCAA8B,iC2G/kDnCuQ,AAAAA,WAAYrP,SACd,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,G,C,C;A,G,C,C,qE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKwBwO,YAAoB,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,KAAasC,eAA+BtC,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAKzL0C,oBAL+C1C,IAM7C;MAAOxQ,MACgB,KAAnBA,KAAAA,uBjF6/BGoT,uBiF5/BT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,YACEpT,AAAAA,AAX6CwQ,0BAiB/C,A,C,Q,C,K,C,C,C,C,C,G,C,mB,C,C;A,E,C,CAEA,0CAGE02B;KAAe,KAAU,kBAA0BC,aACrD,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA;;EAEMD;GAAa,QACfA,OAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,E,C,CAEA,kBACgBhG;GACF,QACVkG,AAAAA,WAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,sB,C,C;A,E,C,CAEA,cACEpnC,AAAAA,KAxC6CwQ,YAyC/C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,kBACExQ,AAAAA,AA5C6CwQ,kCAkD/C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,Q,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CA/CA62B;EhG9Ce,KAAa5E;;EWmEP;;;gBC5CI;;;;;;;SoFuBqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAQZ;;SAC9B2E,AAAAA;;EAqBYlG;GACF,QACVkG,AAAAA,cApBAF;QAAe,KAAU,kBAA0BC,WACrD,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,+C,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CA4B2B,YAIzBnnC,KAhD2CwQ,cAiD7C,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,oC,C,C,G,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,2D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCtHsB3S,YAAiB,MAAGypC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAuC72B,cAA0B62B,KAAUx0B,eAA4Bw0B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAK3K,0CAEE3Z;OACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,cACE7a,wBACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,a,C,C;A,G,C,CAEAlV,YACE,MAAO2pC,MAfmCD,MAgB5C,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,C;A,G,C,CAEA1pC;EAlB4C0pC;;4CAoBxC;4EAEA,YAEF;kBACF,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAEAjqC,kBACSswB,IAAAA;KAAM,SAAb;SACF,A,C,I,C,I,C,C,C,C,C,G,C,S,C,C;A,G,C,CAEArvB;EA/B4CgpC;;uEAiCxC,QAEF;SACF,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,G,C,CAEAhpC;EAtC4CgpC;;4CAwCxC,MAAOC,MAAAA,SAET;SACF,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,E,C,CAEA1pC,cACE,MAAO0pC,MA9CmCD,QA+C5C,A,C,Q,C,I,C,C,C,C,C,E,C,E,C,C,C,C,O,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CA5CAE;;EtF0FqB;;;gBC5CI;;;;;;;;SqF9CkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CCH3CC;;EvF6FqB;;;gBC5CI;;;;;;;SsFjDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCGrB70B,YAAuB,MAAG80B,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCj3B,cAAgCi3B,KAAa50B,eAA+B40B,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAIlMx0B,cACE,MAAOqF,AAAAA,MALyCmvB,SAMjC,KAAXnvB,KAN4CmvB,oBpFskCzCt0B,uBoF/jCT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,cACEmF,AAAAA,KAVgDmvB,YAWlD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CATAC;;ExFwFqB;;;gBC5CI;;;;;;SuF5CqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,W,+B,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,yB,C;A,G,ClG6D9C/pC;EACKkqB;WAA8B,KAAZA;EAAqBrhB,OADxB;WACkCqhB,cAAuB,A,C;A,G,CAoD7E8f,0BAEQC;GAAO,QAAS;EAChB/f;GAAO,QAAS,MAAOA,SAE7B,YACF,A,C;A,G,CAGA,qBAC2C,AAAPA,cAChC+f;QAEW,AAAP/f,mBACI,KAAA,+GAIRggB;QAEJ,A,C;A,G,CAOA1iB,WAA+B,MAAG2iB,WAAY,A,C;A,E,C,CAc9CrqC,YAA6B,MAqJU,AAAN0I,MAAS9G,AArJA0oC,aAAM,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAUhD;GA2IuC,AAAN5hC,KAAS9G,AArJA0oC,gBAaQC;EuDGlB;MvDwKTC;KAAqB;;QAtKtC,WAAc,mBACZvjB;;EACSA,SACX,KAEArS,KAuDoB,aApD1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAOA,gBAAkE,MAC9D61B,qBAA4C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGhD,gBAAiE,MAC7DA,qBAA2C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAO/C,gBAAiE,MAC7DA,qBAA2C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAG/C,gBAAoE,MAChEA,qBAA8C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGlD,gBAAmE,MAC/DA,qBAA6C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAMjD/iB,oBACoC0C,qBAC5BvC;cACY,uBAAdA;UAEKA,UAAP;0CAEA,MAAOjT,AAWe,eAT1B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,oBACMiT;GAAY,Y8BjBZ,AA/EoBpD,aA+ECM,OACzBC;S9BmBF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CA9HArS,sBAGMyX;GAAO,QAASA,AAAAA,YAAiBrhB,cACvC,A,C;A,K,C,I,C;A,M,C,C,G,C,I,C,E,CA1BA5H,YACE,MAAOupC,0BACT,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CADoC;;GAI9B3hC;EAIMA;YAIC,OAAgB;OAGhB,KAAWA;EACTA,UAAmB,OAEc;;WAlBT;SAAyB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,C,C,CAyNhE/I;;QAA+B;iDAAqB0I,SAAS9G,IAAW,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACxE5B,oBAAwC4B;6BAAAA,OAAX;MAAS,AAAN8G,UAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACnD1I,oBAA0C4B;6BAAAA,OAAZ;MAAS,AAAN8G,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACrD1I,oBAAwC4B;6BAAAA,OAAX;MAAS,AAAN8G,UAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACnD1I,oBAA0C4B;6BAAAA,OAAZ;MAAS,AAAN8G,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CACrD/I,oBAAsCiC;6BAAAA,OAAX;MAAS,AAAN8G,UAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CACjD/I,YAAiB,MAAG+I,QAAK,A,C;A,E,C,CACzBxI,YAAkB,MAAG6I,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,G,C,uC,C,C,C;A,E,C,C;A,G,C,6B,C;A,E,C,CAkCzB7I,YAAkB,UAAOoqC,AAAAA,gBAAcK,aAAahmC,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,G,C,I,C,C,C,A,E,I,sF,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CmG7V9DimC,WACEj4B,AnGgP0B,kBmG/O1BA,AAAAA,AnG+O0B;6BmG5O1BA,AnG4O0B;;oBmC3OA,mBpCKxBA,ACsOwB;wCDrOxBlN,AAAAA;qDAC2B,KXooDtBtC,2Dep1CQi8B,KJ9S6ByL,eXkoDP,kC+G3oDrC9F,ApGWS8F,AAAAA;+BoGNX,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAT8B,YAC1BxnC,KAASynC,AAAAA,oBAAmBA,kBAAaA,UAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAE4B,YAE1Bn4B,AnGyOwB,mCmGxOxBo4B;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,Y,0E,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,S,C;A,M,C,C,G,C,kB,C,C,C;A,G,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,I,C,C;A,G,C,C;A,G,C,I,C,C,A,E,mB,gD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,sC,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CCJAC;;E1F0FqB;;;gBC5CI;;;;;;SyF9CgB,A,C,I,C,I,C,C,C,C,C,G,C,2B,C,C,C,C;A,gB,C,C,G,C,C;A,E,C,C;A,G,C,C,qE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKjB9qC,YAAgB,MAAG+qC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCl4B,cAAyBk4B,KAAU71B,eAA4B61B,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC/I/qC,YAAkB,MAAGgrC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAyCn4B,cAA2Bm4B,KAAY91B,eAA8B81B,QAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CAC/JlrC,YAAc,MAAGmrC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCp4B,cAAuBo4B,KAAU/1B,eAA4B+1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKC;;E1FiFqB;;;gBC5CI;;;;;;;;;SyFrCiB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKlBlrC,YAAgB,MAAG+qC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCl4B,cAAyBk4B,KAAU71B,eAA4B61B,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC/I/qC,YAAkB,MAAGgrC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAyCn4B,cAA2Bm4B,KAAY91B,eAA8B81B,QAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEvLG;;E1FyEqB;;;gBC5CI;;;;;;;;SyF7BqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,oE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKtBlrC,YAAqB,MAAGoW,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C,C;A,G,C,CAAoCxD,cAA8BwD,KAAcnB,eAAgCmB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACxKvW,YAAgB,MAAGsrC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAuCv4B,cAAyBu4B,KAAYl2B,eAA8Bk2B,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACzJprC,YAAiB,MAAGqrC,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAA4Cx4B,cAA0Bw4B,KAAWn2B,eAA6Bm2B,QAAkB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAIpL,wBAL2CD;UAOvC,MAPgHA;KAAYl2B;GAUjH,AAXiCmB,WAY5C9N,UAAS+iC,aAEb,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,a,C,C;A,E,C,CAEA,YAfoHF,KAAYl2B,eAA8Bk2B,SAiB9J,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAdAG;;E1FgEqB;;;gBC5CI;;;;;;;;SyFpBoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAmBrBzrC,YAAc,MAAGmrC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCp4B,cAAuBo4B,KAAU/1B,eAA4B+1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKO;;E1F2CqB;;;gBC5CI;;;;;;;SyFCoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKrB1rC,YAAc,MAAGmrC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCp4B,cAAuBo4B,KAAU/1B,eAA4B+1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC3It4B,YAAoB,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,KAAasC,eAA+BtC,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CAEzL64B;;E1FmCqB;;;gBC5CI;;;;;;;SyFSwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKzBz2B,YAAuB,MAAG80B,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCj3B,cAAgCi3B,KAAa50B,eAA+B40B,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC1KhqC,YAAc,MAAGmrC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCp4B,cAAuBo4B,KAAU/1B,eAA4B+1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKS;;E1F2BqB;;;gBC5CI;;;;;;;SyFiBwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKzB12B,YAAmB,MAAGK,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAkCxC,cAA4BwC,KAASH,eAA2BG,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CAC9IvV,YAAc,MAAGmrC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCp4B,cAAuBo4B,KAAU/1B,eAA4B+1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKU;;E1FmBqB;;;gBC5CI;;;;;;;SyFyBsB,A,C,I,C,I,C,C,C,C,C,G,C,iC,C,C,C,C;A,sB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,mC,gE,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCtEvB7rC,YAAkB,MAAG8rC,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyC/4B,cAA2B+4B,KAAc12B,eAAgC02B,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACtKt4B,YAA+B,MAAGu4B,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAA8Ch5B,cAAwCg5B,KAAS32B,eAA2B22B,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAE3MC;GAH6CF,sBCsCZ,uDCuI7B,wBAEA,wBAsB+B,8BACC;;;;MFrMmHC;KAAS32B,eAA2B22B,mDE4KvL,wBAEA,wBAsB+B,8BACC;;;;MFrMmHA;KAAS32B,eAA2B22B,SAQ3L,A,C,I,C,I,C,C,C,C,C,G,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CANAC;;E3FsFqB;;;gBC5CI;;;;;;;;S0FpCzB,A,C,I,C,I,C,C,C,C,C,G,C,2C,C,C,C,C;A,gC,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,4D,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,sC,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,CdVA,2CAEA,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,2CAEA,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,E,C,CAEA,uDAEA,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,kB,C,C;A,G,C,CAEAhsC,YAA2B,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,mB,C,C;A,E,C,CAclCE;WAEI;EAMW,KAAM;EAEA;EACH;EAEK;EACL;EAEK;EACL,cAEhB;MAAW+rC,eACCA,cACAA,cACAA,UAEd,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,mB,C,C;A,E,C,CAEA/rC;WAEI;EAMW,KAAM;EAEA;EACH;EAEK;EAGA,QAFL,qBAIG;;GACT,MACR;GAEU,MACV,qBAEF;eACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEAA,cACE,MAAOsG,WACT,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,e,C,C;A,E,C,CAGAtG;GAMY,YACR;QACe,eACf,SrG5BWqB,QAAAA,QqG4BM;QACF,kBACf,SrG9BWA,QAAAA,QqG8BM;QACF,qBACf,SrGhCWA,QAAAA,QqGgCM;KAEjB,SrGlCWA,QAAAA,QqGkCM,4BAErB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEArB;;EACagsC,KAAAA;SAEX;MADgBC,QAAqC,KAAtBA,wBACRD,eACzB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,a,C,C;A,E,C,CAEAlsC,cACE,MAAY,gBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,C;A,E,C,CAEAA,cACE,MAAY,iBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,S,C,C;A,E,C,CAEAA,0BACE;MAAa,eACA,eACA,gBACf,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,O,C,C;A,E,C,CAEAA,cACE,MAAY,gBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,C;A,E,C,CAEAA,cACE,MAAY,kBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,U,C,C;A,E,C,CAEAA,cACE,MAAY,oBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Y,C,C;A,E,C,CAEAA,cACE,MAAY,kBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,U,C,C;A,E,C,CAEAA,0BACE;MAAa,+BACA,eACf,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,C;A,E,C,CAEAA,cACE,MAAa,gBACf,A,C,Q,C,M,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,C;A,E,C,CAEAA,cACE,MAAQ,CAAC,4HAYX,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,c,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CApKAosC;;E7E4FqB;;;gBC5CI;;;;;;S4EhDqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,E,C,CAgB9ChqC,yBAEE;6BAAW,aACe;;GACd;EAGP,SACL,AACA,gBACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,U,C,C,C,C;A,qB,C,C,G,C,C,A,E,+B,2C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,G,CrFfAslB,kBACM2kB;cAEYC;EADH,KACuBC,sBADlCF;OAGKA,UAAP;qCACF,A,C;A,E,C,CAOA,aAAiB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAMjB,YAEEA,UACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEArsC;EACgBwsC,IACdA;;GACIC,aAAwB,WAC1BJ;;G4B+KE,AA/EoB5nB,aA+ECM,OACzBC;O5B/KE;SAEF,SACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,G,CAMAhlB;EAAyBqsC;GAAS,W4B+FHhpB;EA1BP,+B5BrEF;SAA2C,A,C;A,E,C,CAiBjEjO,kBACI,MAAGpC,eAA2D,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAElE,iBACM,CAACy5B,YAAc;GAEfD,YACFA,OACApjB;KAAkBsjB,aAEpBF,AAAAA,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CsG5DAtsC,YAAkB,oCACW6I,uBAAY4jC,qBAAcC,aAAU,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C,A,E,sC,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,4B,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CCuBjEjtC,YAAe,MAAGktC,AAAAA,gBAAiB,A,C;A,E,C,CAEtB76B,YAAU,MAAG86B,SAAM,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAUhC;GACMC,QAAU,MACdA;;EAEwBC,UACxB;MAAqBH,0BzH6Oe3rC,gCyH5OlC+rC,QADF,U1E6YkCnkB,A0E5YtBokB,KzH8OG9jC;E+CnKLkd,IAAV0B;KAAU1B,OAKVhT;KAAW4S,cAKX+B;KAAU3B,Y0ErFR2mB;UACF,AACAE,UACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAKA,eACMC,QAAY,MAChBA;UACAhkB;KAAkB+jB,YACpB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEA,kBACEC;;EACIP;G1H6OcrsC,a0H7OM;EACTqsC;GACG,AAAdQ,gBAAkCA,UACtCP;QvGXK95B,euGWiC85B,WACxC,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAQA;EACMD;G1HgOcrsC,a0HhOM;GAEpBusC,QACF,MAA+BE,0BzH4MG/rC,8ByH5MlC,OACEosC,AzH6MWlkC,SyH5Mb,A1H0DF5I;YAAAA;Q0HvDAysC,UACAH;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAR,YAAW,MAAGiB,YAAO,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CACrBhB,YAAa,MAAG3N,YAAO,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAzBS,YAAI,MAAGY,SAAE92B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,2B,uC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CC/C3C;QACmB;cACY,MAE7B8kC;;;MAKA;;;;;yBAOEC;MAGA;MAKoB,iBALF,EAAEC,gBACDA;;GACbR,aACEA,cAEqBS;KAEzBF,cAEJ,OACc,UAAuC;iBAGrDG;iEAEA;sB1HwOoC1sC,8B0HxOpC,U1H0OekI;S0HzObwkC;0DACO/jC,2BAAoBA,eAC7B,CAGFgkC,KAAuBJ,WACvBD;QACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAeA9hB;;aAgCE;2FAGF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAhCEoiB;OAEe;MAGb1jB;oBAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAJiC,sBC7DL2jB;ODgE1B,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAGFC,6BAEiB,QACf;8BAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAJS,WACLF,4BACA;MAAOl/B,iBACT,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAGFq/B,6BAEiB,QACf;+BAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,M,C,CAJS,YACLH,+BACA;MAAOl/B,mBACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,yB,qC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CEhDJhO;EAGmC,KAAX;EACsB,KAAf;6BADI;UAKjC;mBAAkB,sCAJ0B;;;uBAK1CstC;;mCACAA;OACF,6BAP4C;GAU5C;KAAkB,gCAChBA;KAAAA,UACF,AAEA,sCAAkB,QAChB,MAI4B,MAHL,AAAJ,UADD,WACU,KAAtBC,SAAyB3nB,MAAyB,KAAJ;EAItB;EADd0nB;;EAFZA;uBAAAA;SAAkBA;EAEc,KAApBA;;EACmB,KAApBA,KAAAA,UACXA;KAAAA,OAAkBE,WAEtB,AACF,AAEA,SACF,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUAxtC;EACUstC;EAAiB;;EACG,KAApBA,KAAAA;;EACMA,KAAAA;IAEd;eAAS,KAAS;eAEdG;EACC;;GAGG,UACJA;YAI0B;;EAAZH,KAAAA,KAAmB;EACxBA,KAAAA;;EACCA,KAAAA,KAAe;EAEjBE,IAASA;aAGH,UACZC;KAEAA;MAID;mBAEDA;;SAIAA;EACC;MAGL,AAEA,MAAOA,gCACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA1uC,yBACE;4BAAkB,WACJ,CAAA,KAAR2uC,SAAWC,UACb,QAEJ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA5uC;;EACe2uC;;EACAC;GAEb;aAAa,OAAuB;EAALD;EAAuB;EAAR,OAAGC;gBAEjD,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAYA3tC;;;EAMkBwtC,IAAoB,SAAuB;;EAC1C,gBACDI;EAGD,MAAGhoB,UAAyB,MAAG2nB,SAC9BM,SAAsC;EAGzC;;EAEF;EACJ;;GAEuB,KAAf,aAAyC,KAAX,aAC3C;GAGe;;;;6BANV;SAQL;KAAgB,WACkB,GAAhCC;KAAAA,KAAoBP,UACtB,AAEA,2BAG2B;;;yBAD3B;8BAGQQ,KACNC;;yBAOJ;iCAAkB,EAAEC,oBACXA,gBAEQ,SACTC;SAIG;;;;;sBAMLJ,KAAkB,KAAlBA;EACK,SAELA;KAAAA,KAAoBP;;;;;sBAMpBO,KAAkB,KAAlBA;EACK;;;;;sBAKLA,KAAAA,KAAoBP;;SAI1B,GAEW,QAASW,SACpB;SACF,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKA;;EACoCC;EAAeA;EACpCA,KAAAA;EAAsCA;;;;qBASnD;mBAAoBD,SAAF;EACAA,IAChBtoB;MAAe,KAAfA;;EAhRevO;EAqRgB,OpEzRfI,KAAAA,AoEOE22B;;EAmRdxoB;EArBiB,AAArB4nB,MAqBiC,KAAd5nB,SAAgBA,UArBZ4nB;GAuBJ,MAGjBU;EAGsC,KAAnBtoB,QpElSLnO,KAAAA,AoEkS0BmO;6BAAF;IAEtCkoB;KAAmB,KAAnBA,KAAyC,KAAnBloB;EAEmB,KADD,KpErS1BnO,KAAAA,AoEOE22B,SpEPF32B,KAAAA,AoEsSImO;GAEI,KAvRJyoB,SAuRwB;OAI1BzoB;GAEG,KA1SNvO,KA0SQuO,aAvSLwoB;EA0SRN,SAAyC,KAAdloB,SA7StBvO,MA4STi3B;;wD7H5OE,iBA6BRzuC;e6HmN6C,KAAxB,KAhTNwX,KpEJCI,KAAAA,AoEOE22B,UA8SI,KAAdxoB,SAAgBA,aA9SNwoB,IAgTZE;OAAeR,OACwB,KAArB,KAAdloB,SAAgBA,SApTXvO,MpEJCI,KAAAA,AoEOE22B,WAqTdN,MACAA;KAA8BloB;GACZ,KAAdA,SA1TOvO,MA2TTy2B,KAAgBloB;cAGE,KA9TTvO,KA8TWuO,WAKxBsoB;EAG+B,KAzTbG,KpEjBJ52B,KAAAA,AoEOE22B,SAoUhBxoB;MAAe,KAAfA;6BAD+B;;eAInC,GAEI,GAAWsoB,UACjB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAluC;iBAIE;sB5HpDsCM,8B4HoDtC,OACEiuC,O5HnDe/lC,K4HoDjB,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBAxI;GAEMwuC,aAAqB;IAGzB;MAAmBC,4B5H/EmBnuC,gC6HlNG49B,KDiSzC,U5H7EiB11B;G4H8EO,KAAlBslC,YAAgD,KpEnXpCr2B,KAAAA,AoEmXcq2B,kBpElXLr2B,KAAAA,AoEmXnBq2B;EAA0BA;gCCnSO5P;GDmSf,CAAA,OCnSeA,MDmSQgQ;kBAI/CA;UAAeQ,OAAkBZ,SAChB,KAAbA,SAAeA,SAAmBA,UpEzXtBr2B,KAAAA,AoE0XZq2B,cACN,AAEA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,sB,C;A,G,CA1XE/uC,YAAc,MAAGsY,SAAM,A,C;A,G,CAGvBrX,WAAiB,MAAGouC,SAAoB,A,C;A,G,CAUxCrvC,WAAmB,MAAGsvC,SAAW,A,C;A,E,C,CAoBjCjvC,kBAjCiBiY;6BAAAA;EAmCQ;KAAS;GAGjB,CAAA,KAzBKg3B,QpEjBJ52B,KAAAA,AoEOE22B,aAmCgB;EAGf,KAzCJ/2B,QAaKg3B;6BA4BD,OAAnB;MAAW,KACb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA/uC,YAAkB,uCA5CD+X,2BAGG+2B,8BAUEC,aAgC2B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CArBjD9tC;;;;yBAKE;2BACF,A,C,C,C,A,E,wB,oC,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,I,C,C;A,G,C,C;A,G,C,I,C,C,A,E,0B,sC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CDkJF6R;GAGMu8B,UAA6B,CAAA,UAC/BA,sCAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAzDoB;;EACCC,AAAAA,AAAAA;GACF,CAAA;;;;YAEXJ;sCACAK,AAAAA;eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,8B,0C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,a,C;A,E,C,CGpIWt3B,YAAY,MAAG20B,SAAM,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,G,C,C,C,C,C,I,C,S,C,I,C,C,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAErB,cACXA,Q5GuDK95B,e4GvDiC85B,WACxC,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,K,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,G,C,C,C,C,O,C,G,C,C;A,E,C,CAEA5sC,YAAkB,wBhIkMJI,iCgIxMcwsC,aAMwB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,A,E,+B,2C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,mB,C;A,G,CDsCpDplB,iBACMgoB;cAEa,iCAAfA;UAGKA,UAAP;qCACF,A,C;A,E,C,CAKa/vC,YAAe,MAAGm/B,AAAAA,gBAAY,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,C;A,E,C,CAE9B/rB;EACD+rB;EAAAA;SACQ,MA2KlB1pB;;;QACAA;oBAAuD,SACvDA;kBAA2C,GAAe,CAAA;EAnLxDs6B;GAAa,W/EiFcrsB;EA1BP;Q+E5CV,a7H66BF,UAAa,MAAE1iB,eACjB,SAA+BA;;GAE/B,KAAe,EAAEA,cACjB,SAAiCA;;;GA7xB9B;GAIQ;GAGN,SACH;E6H1JOm+B;;yBADb6Q;uCAGgE;;;yBAAhEA;gCAIJ7Q,aACF,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,C,C,CAEav+B,oBAA4Bu+B;gCAAAA,SAAH;MAAGA,MAAY,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,G,C,C,C,I,C,C,C,C,E,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,I,C,G,C,C;A,C,C,CAExC;EACIA;gCAAAA;EAAAA;EAzBb4Q;GAAa,W/EiFcrsB;EA1BP;;;yB+E5BpBssB;qDAFa7Q,SAKfA;OACF,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CAGa9+B,YAAiB,0CAAgB,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CACjCA,YAAoB,0CAAmB,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,C;A,E,C,CASpD;;mHAEekB;EAEHA;EAhDRwuC;GAAa,W/EiFcrsB;EA1BP;M+ENO,aAEdyb,O7H84Bfj+B;W6H/4BE8uC;QAAc,cACD7Q,A7Hg5BR,yBDx5BPr+B,K8HUAq+B,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,C,C,CAEA;EACYA;EAAAA,QACV8Q;UAA6B;EA1D3BF;GAAa,W/EiFcrsB;EA1BP;K+EKpBssB,QAAc,oBAGhB7Q;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;EACYA;EAAAA,QACVA;YAEA8Q;UAAyB9Q;EAEA,AAAbA;EAxEV4Q;GAAa,W/EiFcrsB;EA1BP;M+EkBS,IAC7BssB,QAAc,qBAElB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA3vC,qBACE;MA7E6B8+B,YA6EX,EA7EWA,gBA8Ef,KA1DyBA,SA2DnCsI,YAAiB,IACjB;SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;;OAsEyB,EA5JMtI,AAAAA,oBA6JrB,SA7JqBA,AAAAA;IA+JrB;OAAe,EA/JMA,AAAAA,oBAgKrB,SAhKqBA,AAAAA;EAwFP;EACZA;EAAAA;EAEmB,GAoF7B1pB;;;OACAA;sBACAA;kBAA2C,GAAe;EAnLxDs6B;GAAa,W/EiFcrsB;EA1BP;M+EuCe,Y7H01Bd,EAAE1iB,cACjB,SAA+BA;OAEhB,EAAEA,cACjB,SAAiCA;;;GA7xB9B;GAIQ;GAGN,SACH;E6HvEKm+B;;yBADb6Q;gCAIF7Q,eACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;GACY,KAAa,EArGMA,AAAAA,oBAsGrB,KAAA,SAtGqBA,AAAAA;;mHA0GhB59B;EAESA;EAIZ49B;EAAAA;6BAJY59B,OAKtB49B;UAAa;EAjHgBA,Q9H4M7Br+B;O8HzFqB,a9H1ErBA;W8H6EAmvC;UAAyB9Q;EAxHvB4Q;GAAa,W/EiFcrsB;EA1BP;M+EmEmB,IACvCssB,QAAc,qBAGlB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;GACyB,EA/HM7Q,AAAAA,oBAgIrB,KAAA,SAhIqBA,AAAAA;EAAAA;EAAAA;UAmI3BxQ,WACA;OAMFwQ,UAAY;EA1IiBA,Q9H4M7Br+B;O8HjEqB;EAEDq+B,QAApB8Q;QAAiC;EA/I/BF;GAAa,W/EiFcrsB;EA1BP;K+E0FpBssB,QAAc;qBA/Ia7Q,SAiJ7BA;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBA;EAtKI4Q;GAAa,W/EiFcrsB;EA1BP;G+EgHlB,GAAoB;GAEpBwsB,eACFA,UACAzmB;KAAkB0mB,YAEpBD,AAAAA,gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,qBACEz6B;;;QACAA;oBAAuD,SACvDA;kBAA2C,GAAe,CAAA,UAC5D,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEApV;EACM6vC;WAAsB;EACZE,YACdF;;EAzLEH;GAAa,W/EiFcrsB;EA1BP;;GAgGlB,AA/EoBoB,aA+ECM,OACzBC;O+EqCE;SAEF,SACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,K,C,I,C;A,M,C,C,E,CA1OA2c;iDAC0D,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAmCxC,WAAK+N,eAAqB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C,A,E,8B,0C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,sB,C;A,E,C,ClGxB5CxvC;GACa8vC;OAAsBC,sBACjC;qCAAiCv1B,uBAAWiyB,qBAAcC,aAC5D,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,C,CA8CalsC,kBAAwBmO,OAAH;MAAGA,UAAS,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,M,C,G,C,C;A,G,C,CAEjCnO,kBAA0BmO,OAAH;MAAGA,UAAW,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,Q,C,G,C,C;A,E,C,CAErClP,kBAAiBkP,OAAF;MAAEA,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,C;A,G,C,CAE5B7O,kBAFiB6O,OAEA;MAFAA,aAEc,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CAE/B7O,kBAJiB6O,OAIG;MAAG,AAJNA,aAIc,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,C;A,E,C,CAE/B7O,YAAiC,MAAG6O,AAAAA,eAAyB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAE7D7O,YAA6B,MAAG6O,AAAAA,eAAqB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,a,C,G,C,C;A,C,C,CAErDL,cAA0B,MAAGK,AAAAA,gBAAS,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,G,C,C,C,I,C,C,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,I,C,G,C,C;A,C,C,CAEtC;EACDA;EAAAA;EACGA,QACbA;;ETpDuBw9B;GAAS,W4B+FHhpB;EA1BP;QnBfTxU;GAAH,OTpCLmE,mBSsCDk9B;iEACkB,CAAA,UAClBA,uDAGN,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAEA,cACEtuC,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYA4M;EACYK;EAAAA;EACEA;ET/EWw9B;GAAS,W4B+FHhpB;EA1BP;MnBWE,IAAGxU,SACzBqhC,wDT/DGl9B;iBSgEgCnE,SAErC,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;EACYA;EAAAA;ETxFaw9B;GAAS,W4B+FHhpB;EA1BP;MnBoBE,KACtBxU,sBTxEGmE;oBS6ELnE,QACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,cAAqC,MAAGA,AAAAA,iBAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEvD3O,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CApF3CnN,sBACS,WAAA;SAAP;SACF,A,C,E,CAGAA;;4DAhBgC;8DAHA,yDAHP,0CA+BvB;SACF,A,C,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAiCgB,cAAmB,gBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA0BrC,0BACX+uC;mDACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CoGgENlwC;4CAEI,MAA6C,MAAtC;;8CjH5J+BuP,QiHgKtC;MAAuC,MAAhC,QAET,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA4gC;WACsB;;;;wEAGa,WAAiB,OAAEllC,SAChD,MAAOA;;+CxCvNqCyL;EhDifzC2C,KzCjb4B5M,AyC2tBCmR,KAAAA;OwF9jB5BwyB,aACKp0B,AAAAA,aAAP;YAKEq0B,gBACKplC,OjHvL2BsE,QiHuLlC;qBARJ;;gDAaM,CAAC8gC;GAILzC,WACFA,uCAEF;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA5tC;WACsB;;;;wEAGa,WAAiB,OAAEiL,UAChDA,WACA;;;+CxCzP4CyL;EhDifzC2C,KzCjb4B5M,AyC2tBCmR,KAAAA;OwF5hB5B0yB,WACFt0B,SACA;YAGEq0B,cACFplC,OjHxNkCsE,UiHyNlC;qBARJ;;gDAWM,CAAC8gC;GAILzC,WACFA,uCAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA5tC,mBACE;KAAY,CAAA,mBxFs5EeqY,AwFr5ET5L;GxFq5ES4L,QwFp5EM;GxFo5ENA,WwFn5Ee;EACjCk4B,QACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOAvwC;WjHjQqBwwC,SAYqBjhC,eiHuPxC;KAAY,CAAA,mBxFo4EY8I,AwFn4EN5L;ExFm4EM4L;;4CwFl4Ee;GxFo4EZA,QwFn4EY;GxFm4EZA,WwFl4Ee;EACjCk4B,QACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMAvwC,qBACE;KAAY,CAAA,mBxFq3EYqY,AAAAA,AwFp3EP5L;;6CACeu3B,QAAwB;EAC/CuM,QACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAz2B;MAEWrN,OAAP;kBADF,OAQE;eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAgBAzM,cACM6Y;UAES;qBAFTA;GAGAA,WAAa,QACjB;MAAO43B,cACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,4B,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,G,CApREz+B,kBAAcy9B;qBAAAA,SAAH;MAAGA,MAAU,A,C;A,E,C,CAGXz9B;GACP,CAAC0+B,QAAU;E7GjCQrE;GAAS,W4B+FHhpB;EA1BP;GiFnClB,GAAestB,SACnB;MAAOlB,UAAAA,SACT,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAGa;EACDmB;EAAAA;SAII;E7G5CSvE;GAAS,W4B+FHhpB;EA1BP;GiFxBlB,GAAestB,QAAuB;EAEnBlB;EAAY;0BAAZA;EAAAA;qBAPbmB;GAONC,OAAqCD,WAIvCnB;qBAAAA,SAAAA;QAEJ,A,C,I,C,I,C,C,C,C,C,G,C,G,C,C,C,C,O,C,G,C,C;A,E,C,CAaA,6CAEEkB;SACAG;UACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,mBACE;UAAoB7D,QAAF,EAAEA,gBACdA;GAAS,SACXA;EACAA;qBAAAA,SAAAA;WAEJ,kCAEF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAGA;aACyB2D,AAAAA;EACZA;EAAiB,AAAjBA;;EAGsB,AAAdvD;GAFnB;KAAkB,QACkBoC;qBAAAA;EAAAA;qBAFzBmB;EAEMT,OAA+BS;cAEjCvD;EAEboC;qBAAAA,SAAAA;OACF,CACF,A,C,Q,C,C,C,M,C,I,C,E,C,I,C,C,C,I,C,Y,C,I,C,M,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAEA,iCAEE;MAA2BmB,UAAiB,AAAjBA,aAGM,AAAdvD,gCAHgC,YACtCoC;EAAU;;cAAVA;EAAAA;cAAAA;EACmBA;qBAFLmB;EAEdT,OAA+BS;cAE7BvD;0BAGXyD,YACA;SAEFrB;qBAAAA,SAAAA;OACF,AAEAqB;GJ4BEvB,gBAA6B,CAAA;yBAC/BA;iBI3BF,A,C,c,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEA;aACyBqB,AAAAA;;GAEvB;KAAsB,WAChB3D;qBAAAA;EAAAA;GAAS,QAASA,MACtB8D;WACF,CACF,A,C,Q,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EACiBtB;qBAAAA;EAAAA;EACCmB;qBAAAA;EAAAA;;+CAGZ3D;EhFsR8BnkB,AgFtRnB7d;EhF3CLqb,IAAV0B;KAAU1B,wBAKVhT;KAAW4S,cAKX+B;KAAU3B;qBgFiCN2mB,SAAAA;;+CAgBFA;EhFsQgCnkB,AgFtQrB7d;EhF3DHqb,IAAV0B;KAAU1B,wBAKVhT;KAAW4S,cAKX+B;KAAU3B;qBgFiDR2mB,SAAAA;SASJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA3JA+D;GAMMN,QACF,MAAoB9a,AAAAA,qC/HiPc10B,gC+H9OhC0vC,QAHF,U/HmPaxnC;G+HlPC;EpHkCTnJ,qBoHhCH2wC;OAAoB,mBjHlBPJ,UiHmBf,EAMyBI,OAA3BnB;mBAA4C,AAAjBmB;GhIwPTpwC,cgInPoB,UAC3BywC;EAGXxB;qBAAAA,SAAAA;MACAxC;mBAAqC2D,kBACvC,A,C;A,K,C,I,C;A,M,C,C,E,CA5BAI,iCAGiBE;;SAyBjB,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAnByD,YAAI,OAAG,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAyHrB,mBACnC;MAAA,iBAAA,UACMnC,AADN,cAEIoC,iBACA;OAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAS+B,mBAC/B;MAAA,iBAAA,UACMC,KADN,WAEID,iBACA;OAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAwIc,WAOlB,gB1HlUUj/B,mJ0HmUZ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CjCjUA4vB;;4CAC2B;+CAEV,iBACbp5B;mBAGA;iFAG+BA;E+BJ7B,eAAA;S/BIF;SAEF,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CATkB,cACZlB,WAAOs6B,QAAwBA,SACjC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,W,+B,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CkCjCJuP;E3G6nPW7Y,oC2G1nPT8Y;;EASWz6B,8BACX06B;iBAAyBA,aAEzBC;MAGAC,AtGqD6BC;yBsGlD/B,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAQAF,oBACE;sDAAA,UhI+QiBpoC,IgI9Qf;M3GikPO,KAA6BywB,qC2GjkPpC,QAAA,OACE1J,AAAAA,KhI6Qa/mB,2BgI5Qf,CACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CCsbA;EACgBuoC;GACF,QACV,MAAA,QAAA,OACEC,KADF,OAEA,CAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAWAvqC;GACU,eAAgB;EAChBwqC,KAAwBp8B,UAChC;M1F8sE0B4C,A0F9sEP5C,a1F8sEO4C,8BvC/2E2BV,KAAAA,MAAoBO,6BiIiKzE,UjI9HiB9O;GiI+HX46B,SAAmBA;;+CAES,CAACA,sDACAA;;KAE/B,MAAA,KAAiBA,SAAjB,UACM8N,AjIxMO1oC;;yFiI2MsB2oC,wB7HypChC5uC,QAA8B,+B6HvpC3BwQ;MAAMqwB,kBAIZ,CAEJ,AAEA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAvoB,qBACE;K1F4qEwBpD,AAAAA,A0F3qET5C;;6CACiBuG,SAAmB+1B,oDAE/C;EAEIt8B,cAWK,CAAA,eAAe,AAC5B;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAzV;EnHhfqBwwC,SAYqBjhC,AmHqeYyiC;E1FspE5B35B,AAAAA,A0FrpEX5C;QACb;iDAAiCuG,QACnC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAcA;;oBAE8C;GACxC,CAACtF,0BAA6C;EAEnCA;WACO;EACNu7B;WACO,MACvBC;4BACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CASAhyC;WACqB;;EAGRiyC;GACF,a5Ggi8BApV,AAAAA,A4Ghi8BcoV;;GAER,SAAWz7B;EAET07B,K9GhaRvS,KAAYP;G8GiaN,QAAS,QACtB+S;8DACA;mCAQQ;qBAAA;;EAAD,cAAP;oBADF;;;kBAMEA;gGAEA;uBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CvG3iBEjwC;iBAIEkwC;;EuG4ZYC;GACF,QAASC,QvG1ZrB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA8aApwC,YACEqwC,mBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEArwC;WACoB,MAElBqG;WACA;MAAiB0nB,aAAuB,UAAiBuiB,cACvDD,SACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmPArwC,qBAIM,CuGnM6BuwC,cvGmML,MAAOC,gBAGnC;qBA6BF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIAxwC,iBACE;eAAuB,AAAhB+tB,kBACEA,QACT,AACA;MAAO0iB,eACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOAzwC;E6D/wBgDsU;E7DoxBjCo8B,KanSRz5B,KzCjb4B5M,AyC2tBCmR,KAAAA;GbNvB,WAKK/D;EAAAA,kBAAdomB;UAAcpmB,SAEhB,MAAOk5B,AAAAA,cACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3wC,qBACE;Kaw4DsBiW,AAAAA,Abv4DP5L;;4CACe;EACrBA,cACK,QAAQ,CACxB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAiIArK;WACqB;EL4sNZo2B,oCKrsNK;OAA2B8Y;EL6q7BhCvU;GK1q7BE,QL8q7BTA,2BK1q7BAiW;iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA5wC,uBLg8zBEi6B;UACO4W;UAAuBh/B,kBKl7zBhC,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAsDF8E;;2CAHU,SACA;;GAIe,KAAnBtM,gBACmB,KAAnBA,kBAEQ,WACCymC;GACH,QAAS,MAAO94B,QACtB;Ma3hBGf,MzCjb4B5M,AyC2tBCmR,KAAAA,AgD3xBYlH,gB7D+gChD,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEArW;WACqB;0CACD;uBAEA;wBACC;uBACE;;4CACE,WACvB;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CF3gCA8iB,0BkG2GyBA,QAAiCgwB,OlGzG/CC;YAAP;SAGFC,MACA;YACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CASA,yBH2jcIC;0CGxjcFC;MAGAlC;MAEAmC;sBACF,A,C,Q,C,I,C,C,C,C,C,G,C,C;A,E,C,CA0BA,4BACE;+BxB6NsCtyC,8BwB7NtC,UxB+NiBkI;IwB7NbqqC,mBADF;;;;;;;;G2BrDI,AA8CmBhvB,mDA7CvBb;W3B2DF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CASAhjB;aAE2B;;;;W0B9FzByjB;KkBAEC,W5CkGA;YAEE0N,UAAoB,QACxBA;QAGA;MHo/OS,KAA6B6H,0DGp/OtC,aAAA,UxBiMiBzwB;;4CwB/LbsqC,KAAiBvjB,SAAaA;kDACIA,+BAC9B,MACQA,QACVwjB;;;;W0B9GNtvB;KkBAEC,a5CqHF,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA8BA;QACYsvB;;;EM1CsB,KAAmB94B;EAgtB7C+4B;GAAiB,CAAA,cAEFA;EACJA;EACAA;EACAC,KApvBE7d;EAqvBD4d,aA0CY,CAAA,KAALze,gBAvCFye;EACJA;EACAA;EACAC,KA3vBA7d;EA4vBC4d,aAEK,KA9vBN5d,YAAAA;EAgwBP4d;EAAgB,CAAA,aAGJ,YAGZA,KAtwBO5d;EAAAA;IAuwBI6d,QAEAA,KAAmBC,KAzwBvB9d;EA2wBG4d,OAEC;EACJ;EACA,WAEA,OAEV,KAMkBA;ESw0DHx7B;EAAAA;ETjmFL4d;GNuDD,KAAXG,KAAcwd,SAEjBxd,UAAiBwd;GACjBI,kBACCA,2BAAkCA;;;QM3DpB/d;;ESimFK5d,MTlkFQ,KAAmByC,gBNoD/Bsb,OACoB,KAAlCA;GAEa,wBAMjB6d,sCACA;Se8gFwB57B,Af1gFZ67B;Ee0gFY77B;;;;EvChzEuBV;;8BwB1NjD;KAAA,OACEw8B,OxB2Oe/7B,OwB1OjB;EewgF0BC,AftgFZ67B;EesgFY77B;;;;EvChzEuBV;;8BwBtNjD;KAAA,UxBwOiBS,MwBtOf;MAAA,KAAcyyB,SAAd,UACave,AxBoHEljB;;+CwBlHM0oC;EAAcjH,OErInCyH;;EuG4ZYC;GACF,QAASC,SzGtRnB,CAQF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,uBAEE;MAAA,KAAiB34B,cAAjB,UACgBi4B,AxBkGC1oC;MwB9FjB,GACI,GAAkB;GAClB,CAACyQ,6EAEKA;;W0B/MVwK;KkBAEC,W5CgNA;SAEGzK;EAAAA;G8BoEgB6U,AAAAA,yF9BlED7U;;W0BpNpBwK;KkBAEC,W5CqNA;OAEFirB,KAAW11B,cACb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CwG1MuB,YACnB43B,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,6C,C;A,G,CCGApxC,YAAc,MAAGugB,MAAK,A,C;A,G,CAUtBwzB,YAAwC,MAAGC,MAAM,A,C;A,G,CAGjDn0C,YAAgB,MAAGyY,MAAK,A,C;A,G,CAyBxB8gB;EACmB;GACD;EAAU6a,gDCmBcC;eDnBxC;SACF,A,C;A,E,C,CAiBA;GAEMC,UA/Ca77B,MAgDf;E5Gih9BKokB;G4G7g9BH0X,aAEF;EAtDe97B;QAuIjBiI;KAiSoC0xB;EAAAA,QA9RpCoC;;GACe,QAASL,KAuTuBM;EArTrCv6B,KAAawG,KAGvBg0B;YAAuBP;EAyQnBQ;GAAS,QAASC,KAAaC,YArQnCC;YAlCAL;eA+CAM;UAwGAC;UAAsBC,KA0BtBC;UACAC;UACAC;UA2DA7D;KAqBO8D,UADOC,8B5G8gbQpxC,c4GntbtBqxC;KAAsBC;EAEZt7B,KA9LKwG;E1F2pFOvI,AAAAA,A0F19EL5C;GACF;4CAEXkgC,SACAA;KACFlgC,cAlEFmgC;YA/CAC;KAxEiBl9B,MAiEnB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUA3Y,iBAC+B,AA4VOsyC,oBA5VE,QAGtCC;;G5G8+8BOxV,gC4Gl+8BL0U,YAEF;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAzxC,iBAEe,SAAiC,AAAtB81C,kBAElB,CA6VyBnB,cA5V3BhD,KAAAA,0BACA;SAGJ,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAmFA,yBAGE;eAAY;E5Gi48BL5U,AAAAA,A4Gh48BKgZ;EACHA,SACT;EAhNen1B,I5G8kcf0yB;qB4G53bF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;GAEgB,SAA8B,AAAnB0C,iBAICA;EzFjLnB,8BAAA;SyFiLLnB;OAGFA,KAAWhD,OAA6BgD;E5Gi38BjC9X;G4G728BG,WAGSkZ,QAAYA;kBjIgDK/0C,6BiIhDlC;KAAA,UAESyxC,KjIgDIvpC;GiI7CF,UAASyrC;EAAS,SAAWA;;WnHrNzBrE;EmH0NA0F;;;0DAjOAv9B,kBAmOXzE;;;WAIE2gC;c7Hs4CH1xC,QAA8B,+B6Ht4CT0xC;OACtBA,WACF,EAMJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EAEwB,4BAAtBsB;;EACI9B;GAAO,QAAS8B,OAA2B9B,QAG/C5W;8BAKF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAgBA,cACEA,8BAUF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAkBA,kBACY2Y,6BAAVC;MACA;sBjIpCoCn1C,8BiIoCpC,OAAsB2X,KjIlCPzP,KiIkCiB,CAClC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,kBACYgtC,iCAAVE;MACA;sBjIzCoCp1C,8BiIyCpC,OAAsB2X,KjIvCPzP,KiIuCiB,CAClC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUA;EAvS4BitC,IAwSb;;;EAECX;GACF,WACI,QACd;oBjIuC6C/9B,KAAAA,MAAoBO,qBAkBpDE,KiIzDb,UACiBm+B,KjIwDJn+B;;EW/J8BzL,MAA7CA;MAAAA;YsHwGE,GACmB,AtH7GCA,AAAAA,iBUk4Of6rB,oC4GnxOC;;SADJge;SAEIA,YAGV,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA51C;E5GggSE,KAA6Bi5B;E4G//RjB;EACE6b;GACF,QACFllB,UAAcgmB,UAGxB;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAeAt2C;EACgB;mCAKd;MArV0Bm2C,KAqVRI,wDjID6B9+B,KAAAA,MAAoBO,qBAkBpDE,KiIjBf,UACiBm+B,KjIgBFn+B;;EW/J8BzL,MAA7CA;MAAAA;csHgJA,AAEA,MAtV0B2pC,KAsVRI,wDjIL6B/+B,KAAAA,MAAoBO,qBAkBpDE,KiIbf,UACiBk5B,AjIYFl5B;EW/J8BzL,MAA7CA;MAAAA;csHoJA,AACA,MtH1IyBA,MsH2I3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOAgqC;UACqB;E5GguOZne,oC4G9tOA;S5G0s8BPuE;yB4Grk9BiBpkB,WA2XjB;SAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA;GACU,eAAgB,MACxBq8B;UAAev/B,QACf;M1F8wEwB4C,A0F9wEL5C,a1F8wEK4C,8BvC/2E2BV,KAAAA,MAAoBO,6BiIiGvE,UjI9De9O;;4CiI+DkByQ,SACxB,CAACA;EnHzX4BtK,AmH2XDsK;;GAC/B9Q,mBAAuC,CAAA,8BACrC6tC,WAAkBA,KAAW;EAC1B7tC,SAA8B,KAAZA,WACzB6tC,AAAAA;kBnH3YapG,SmH2YgB32B,UAEjC,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOAxS,oBACc,6BACZwvC;mBAGA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA5XAzC,YAEEz7B,K5Gyh9BOokB,sB4Gvh9BP+Z;WACF,A,C;A,K,C,I,C;A,M,C,C,G,C,K,C,E,CALA1C,iB7HukDOjxC,QAA8B;;;S6HlkDrC,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA0DuC,WAAG,SAAI,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAkJzB,iBAaZ,AAAC4zC,iBAA+B,CAAChuC,cAXpCotC,AAAAA,mBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAkBmB;;GAqPcxD,iBAnPjBjqC;EACFA;GACA,MAAY,KACpBsuC,WAkPgCjuC,UAjP5BL,QAAAA,UAAsB,UAGhC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAuCI,YAAI,MAAG,A5Ggw8BJq0B,AAAAA,A4Ghw8BKlkB,+CAAoC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA0ChDo+B,YAAW,MAAGp+B,gBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAuDd,cACjBjZ,WAAIs3C,KnH5YgC3nC,YmH6YtC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CAwL8B,iBACpB,4BACZ4nC;uBAGA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,U,C;A,M,C,CAJ6B,cACzBv3C,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,c,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,CvG1iBAI,YAA2B,SAAQ,A,C;A,E,C,CAyCnC,eLo3NyBs8B,KAA4B,AKn3N/C,gCACmB,OACrB8a,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAQA;ELy98BSra,AAAAA,AK798BMU;kBAC6B4Z,aAK1CC;KuGwV+C3C,avGtV/C4C;UAEAC;UAEAC;UAEAC;UAGAC;KAAkB,MAElBC;UAAkBN,KAElBK;KAAkB,OAGpB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKA,eAjF6BL,WAmFzBF,UAEFS;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YACuBC,WACvB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA,iBACkB,SACdF,UAAkBG,QAClBC;cAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA;;EAwBIC;GApBW,WLk68BNlb,AAAAA,AKj68BDua,KAAAA,wCACFY;cAEOC;;;2CAKc;EL658BlBpb,AAAAA,AK358BIkb;WACO,MAClBG,AAAAA;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAWAze;WACwB;;6CwGvIkB4a;ExG2UtCD,OAA4C+D,KA7L9CC;YAiDAC;YA7CA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeA1d;WACwB,MAEN;;EAEL2d,UAIX3F;eAGAj+B;oBAAyB6jC,WACzB7jC;;;6CwG/KwC2/B,OxGsLxC3/B;cAqJE0/B,OAA4C+D,MA5I9CE;YALA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAWA,yBAEE;MAAc,iBAAd,UACEG,eADF,U1BmBetvC,I0BlBbsvC;MAAEn9B,WACJ,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;GACW,CAAA,gBAAmB,CAAA,eAC1Bo9B,eAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBA,YACErB,AAAAA,KAAAA,wBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,eACMA,KAAAA,YAAiC,MACrC7Z,AAAAA;iBAAmBkb,aACrB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMA;EAGiBC;WACO;YAKDlwC,oBAAqC;E6DnUZgO;E7DuUzBsN,AAAAA,KAAcjY;EA6BjCtE,SAzBEoxC;GAGA,sBAEF70B,KAAcjY,WAElB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAIA0P,oBACoB67B,KAAAA;WACK,MAEvB;MAAOwB,UACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAWA54C,yBACqB;wBAGjB;yFAEA,aAEF;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;EAKoB8jB,AAAAA,A6DtX4BtN;E7DuXtBqiC;GAEJ,QLsu8BpBhc,AAAAA,AKru8BEU,4BZ7UoCluB;6BYoVpCkuB,AAAAA,iBZpVoCluB,SYsVxC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAkBAypC;GA3U6B1B,WA8UJF;EAERwB;WAGb,MAAOrE,MAAAA;KAoBiBA,KAAAA;EAfIxoC;;GAoN1BktC,WACFA,uDACQC;EAWC;GACPtjB,cACFA,OAAa3Z,AAAAA,A6DroB+BvF;EAAAA;EzE6CRnH;EqHdtB;;;azGyYd4pC;UAA2BptC,QACpBqtC;KAI8B7E,KAAAA,aAJrC;UAEJ,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CAEAltC,YAAsC,MAAGktC,MAAAA,SAA+B,A,C;A,E,C,CAIxE,cAAyB,MAAGA,MAAAA,WAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE/D;GACM8E,UAAkB,MACtBC;cAAmBjC;EACKkC;EAAeC;G0GxbjC,QACNC;0BAeA;MACAC;KAAS,UAAgBC,S1GuazBJ;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;GACMF,UAAkB;EAuIlBO;GAAkB,SACpBA,MACAA;UAEFC,UAxIAtF;KAAAA;EAEW/Q,WACX;KAAY,UACVsW;EACOllC,kBACT,AACAykC,QACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA;GACMA,WACFC,cACOjC,yDACP;OAEFiC,cAAmBjC;EACfkC;GAAc,SAChBA,OACAA;oBAK0B,MAC5B9G;KAAajP,wBAKf,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,uB,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAgBA;EAIkB8T,KAAAA;EACAA,KAAAA;;GAEJ,GACV,IAAiByC,6ClByVoBlrC,uBAAMA,6BA2B7Cqf,KAAQrf,AAAAA,QkBpXN,UlBuXazF,IkBtXX4wC;YAAwB/9B,A6DpfkBvF,oB7Dqf5C,OAE6B,QAG7BkjC,KAAoBK,AAAAA,eAAeC,aAEvC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKA;EACkB5C,KAAAA;EACAA,KAAAA;EAGG,8BACnB;MAAA,QAAA,UAAA;;mDAGE6C;KAAAA,KAAuBtP,kBACPA,MAClB,AAEAsP,0BAgBF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEA;EACkB7C,KAAAA;WACK;EAGFyC;WACO;;;GAIpBK,WACFA,SAAoB/C,+DAItBgD;cZlgBoC9qC;;GYsgBhC6qC,WACFA,SAAoB/C;EqBnHUvuB,ArBsHtBpgB;EqBvbF4d,IAAV0B;KAAU1B,qBAKVhT;KAAW4S,cAKX+B;KAAU3B;MjC7F4B/W;EY6hBlCs9B;cACW,6BAAbA;OAEFA,YAjBF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoBA7sC,oBACY6sC,AAAAA;WACO,QACjBS;MACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,kBACMT;WAAoB,MACxB;MAAgBA,8B1BtRmCl1B,KAAAA,MAAoBO,6B0BsRvE,OAAmCo1B,A1BnPpBlkC,S0BmPgC,AAC/CyjC,AAAAA;UACAA;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA+CA;EACeyK,KAAAA;GACTt0C,SAAgB;;GAEhBs3C,WACFA,SAAmBjD,0CAErBkD;YAAuBv3C,SAAaw3C,aACtC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,mCAGE;MlBoLuC3rC,uBAAMA,6BA2B7Cqf,KAAQrf,AAAAA,kBkB/MR,UlBkNezF;EkB5Mf+mB,AAAAA;EL079BkB;EAAyB;aAAvC,OA8E4Blc;;EAoD5B+T;GAAQ,SAAW,AATJwW,QAUjBztB,KAAAA,YKjk+BF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAMA;;GAGM,AAAC3L,cAAe;;EAETk1C;KAETA,aAAuBjD,wCAAgCjyC;EAkBvDkyC,KAAAA;EAAgDlyC;EuG5DrCq1C;EvG4DXnD,MuG3DU;GvG6CN,cACKgD,SAAmBjD,gDAI5BqD;0DAFI,uBAMJJ,aAAuBjD,wCAAgCjyC,eAE3D,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CASA;;EACak1C;KACFA,aAAuBjD;;4CflqBzBp3C,SAC4Bs/B;4BesqBjCob,gBZtqBenK;KYwqBf8J;KAGOA,aAAuBjD,mCAClC,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAja2C,oBACvC5Z;GLqu8BE,AAAC/uB,aACH,QAAYgf,qBAEP;SKvu8BP,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAD+B,WAAG,cAAGhlB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyKZ;4CAErB,QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAImB,wBAAO;MAAGkyC,iDwGtZWrG,SxGsZc,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA4CrB,WAAG,gBAAsB1J,gBAAU,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAIjD;;GACL,SAAWgQ,QACrB1B;;WAEmB;EAERY;GACF;SAETC;SAAwBc,SAAeA,SAqPzCH;UAjPwBG,SAAeA,mBAEzC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CA0BqC,YAqNnCH,6BAnNA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAyKK;;GACDL,WACFA;EuGtMkCvxC;EvG0MnBouC;GACM;EAIvBhnB,AAAAA,cL079BFnc;gBA/EI,KAAc,KA8EcC,2BA9EW,uBK319BzC;6CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAjB4B;;EACZ8mC;;2CACW;;;GAGnBnlB;EAEO,OAAwBA;EAAxB;SAIXolB;uDADI,kBAEN,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAiCsC,YAAI,MAAG,CAACC,QAAEC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAsKrB;ELspNtB,KAA6BrhB,kDKppNlC;MAAA,QAAA,UACG1J,K1BhqBU/mB,K0BgqBX;uBAAA;yBACF,GAEIonB,YLk52BuCkJ,eKj52BzCxlB,AAAAA;0BAMJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CANsC,iBAChC;eAAA,QAAA,OACEic,AAAAA,K1BtqBO/mB,4B0BuqBT,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kC,C;A,E,C,CA0BN,eyGh9BmB+xC,czGi9BL,MACZC,AAAAA;;kCAEF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YACEC,SACAtqC,AAAAA;WAAiBuqC,WACnB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,C,CAEA,yBACE;MAAA,UACuDA,QADvD,UAAA;;6CACoD,KAAZvM,WACnBh+B,AAAAA,AAAAA;EACFsqC;GAAX,sByGz9BRE,KAAAA,UzG49BI;QAEJ,CACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,CA7BAC,kBAKEJ,QAAOjrB,AAAAA,WAAoBsrB,YAC7B,A,C,C;A,E,C,C;A,G,C,C,sC,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,CAyEAC,YACEC,WACF,A,C;A,M,C,C,E,CAFAD;;EAt9BqB;;;gBC5CI;;;;;;SDogCzB,A,C,C,C;A,G,C,C;A,G,C,C,kB,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,S,C;A,E,C,Q,C,C,C,M,C,I,C,E,C,M,C,C,C,C;A,E,C,C0G5hCA,kBACMhC;GAAO,SACTA,MACAA;cAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,eACa,AAAPA,eACFkC,UACAC;WAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,C,C;A,E,C,C;A,G,C,M,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,C5GUyB,kB2B9BlBj4B;GAAD,AAoDmBa,mDAnDvBb;U3B6B2B;OAA2B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgIZ,wBAAI;gDAAQvC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAIZ,wBAAI;gDAAQvH,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgC3B,YAAI,MAAG,CAACmhC,QAAEC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C,A,E,uB,mC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C6G5LzC9uC;EACgB0vC,YAAcrvC;GAChB,QAAS,MAAOsvC;MAMnBC,QAAYtzC,iBAAnB;kBAJF,OAUE;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAzCsB,iBAEZ,8BACR4jB;sBACAA;sBACAA;sBASAA;sBACAA;sBAEAA;uBAEA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAjByB,cAAO,SAAG9lB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACZ,cAAO,SAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACN;MAId8sB,OAAP;kBADF,OAGE;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACqB,cAAO,MAAK,CAAA,gBAAG,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEhC,cAAS,M1H4EJrzB,0B0H5EuC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAV,YAAI,cAAGg8C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CAEzC,cAAS,M1HsFJh8C,qB0HtFiC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAV,YAAI,cAAGg8C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,uB,uD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCiBzC7vC;8CACiB05B,AAAAA,KAAAA;yEACKA,aAFa;SAG9B,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEL15B;8CACiB05B,AAAAA,KAAAA;yEACKA,aAFa;SAG9B,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAPyB,YAAI,MAAQ,MAALA,kBAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKjB,YAAI,uBAAUA,eAAK,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,E,C,CAmB7CoW;WACoB;2BCqFK;;;EClIbC,MAAVC;MACAhkC;qBxIyRoClX,6BwIxRpCm7C;;EACOC;GFkDHC;GAAkC,eAAkB;;KAEtD,MAGF;0BAYF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC,YAAuC,sBACiC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAf/D;8CAEwCC;kBG+E9B,arIq/CZt5C,QAA8B;;MkIlkDL,qBAC1B,MAAO;MAEmB,qBAC1B,MAAO,sBAET;MAAO,qBACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAGwC;;OACsBs5C;kBGkE7C,arIq/CZt5C,QAA8B,mDkIxjDa,SACqB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAuBvEwjB;EACiBmmB;;+CAIJhH,AAAAA,KAAAA,+BAATgH;iBAOU4P,gBAA0BA,UAApC5P;UpHtDG95B,oBoHyDP,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEahB,YAAU,MAAG86B,SAAM,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAEnB/5B;IAET4pC,KAAOrsC,UAAUssC,oBADnB;;gDAGEhP;8CAA+Ct9B,eAAUmoB,uBAE7D,A,C,I,C,I,C,C,C,C,C,G,C,G,C,C,C,C,O,C,G,C,C;A,E,CAvCAokB;EAGEvsC,OAAAA,AAAAA,AAAAA;WAAsBqW;IIrGD9N,gBJyGL+jC,SGvCXE;OHwCHn2B;QAAUrW,oBAFZ;;gDAIEs9B;uDAAyDnV,uBAE7D,A,C;A,M,C,C,E,CAZAokB,iCIlGuBhkC,kBDoSD;;SHtLtB,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAT2C,YACvC+0B,8CAA+Ct9B,qBAAUmoB,UAC3D,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAc0B,kBACX,8BACXskB;MAAKjX,YAEL;gBADqC8W,eGmCxB,wBHjCf,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,gB,C;A,E,CKvHJI,cACEte,AAAAA,6BACF,A,C;A,K,C,Q,C,C,C,C,M,C,I,C,C,C;A,M,C,C,E,CAFAse;;SAEA,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CADgB,wBbWdlQ;K5GuDK95B,Y4GvDiC85B,QaXL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C,A,E,4B,wC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CFuCrC1gC,oBC3CyByM,kBDoSD,iBCpSCA;mBD8CvB;MAAOq0B,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA8BA;;;;iBAUE;mEAEkB,CAAA,KAAZ+P,mBAGJC;OAAYD;IACLA,SACT;;+CAKaE;;yDAEPL;;2CAA2BM;EAClBN;EAEFO,KADCP;yDAICA;EACFA,8DAEEA;GACG,AAAZA,oBACiB,AAAfA,gBAAwBM;EACjBN,eAEXM;aAGFA;;YAIF,sBzIgLsCl8C,8ByIhLtC,UzIkLiBkI;E0I5SMyP,kBDoSD,iBCpSCA;mBD8ChBq0B;;KA+EG,KAAA,oDAGV,EAEQoQ;gBACa,KAAA;KAEnB9d;KAEAvjB,AlD9H8CvF,oBzEiC7B85B,Y2H+FrB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAwFApkC;4CACmB,MAAO,aACxB;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAvNQ,cAAO,MAAK,WAAEhL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,MAAK,CAAA,UAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,sBAAQA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,sBAAQA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACf;EAEAwN;KAAa,MAAOA;KAClB,KAAA,kDACR,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAIK,YAAI,SAAG5N,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACP,YAAI,MAAG,SAACA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACR,YAAI,MAAG,QAACA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA4Cbo8C,WAAgB,YACN,sDAAwD,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,iB,C;A,G,CA6ElEtkC,iBACMykC;GAAc,QAAS;ElDrJmB7mC,KkDsJtB8mC,QAAxBD;SACA;SACF,A,C;A,C,C,CAEAnxC;GACW,eACP,MAAOoxC;O9GpEkC3uC,A8GqEhC4uC;G9GrEgC5uC,Q8GsEzC,MAAOsxB,M9GpE+BtxB;Q8GqEvB,AAAN2uC,0B3H9HMhN;E2HiIIkN,KlG+UhBrkC,KzCjb4B5M,AyC2tBCmR,KAAAA,AkG1nBd+/B;;uFAKmBC;;KACnC,MAAOzd,MAASwd,AAAAA,AAAAA;iDAEhB,gBAAkBA,iBAGlBvzB;GAAO,QACT,MAAO+V,MAAS/V;UAEV,KAAA,yCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAhe;GACW,eAIP;OACSqxC;G9GjGgC5uC,AAAAA,W8GkGzC;O3HzJe2hC;G2H6J0B,AAArCkN,KlGmTDrkC,KzCjb4B5M,AyC2tBCmR,KAAAA,AkG9lBd+/B,sCAEhB,MAAOH,YAGPpzB;GAAO,QACT,MAAOA,SAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEApqB;G9G/G6C6O,AAAAA,A8GgHvC4uC,iBACF;O3HxKejN;G2H4K0B,AAArCkN,KlGoSDrkC,KzCjb4B5M,AyC2tBCmR,KAAAA,AkG/kBd+/B,sCAEhB,WAGAvzB;GAAO,QACT,MAAOA,UAET;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,G,CAgBA1C,iBAAuBG,OAAH;qCAAqB,A,C;A,G,CAIzCzb,WAAwB,MAAG0gC,SAAM,A,C;A,E,C,CAEjC+Q,YAAoB,MAAGC,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEzCA,aAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1BC,iBACEnH;;EACIoH;GAAQ,QACVA,QAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEApH;EAEMntB;GAAc,SAChBA,MACAA;eAGcqjB,OAGhBgR;;EAEehR;GAAX,yBACFjlB;G3FnDE,AA/EoBpD,aA+ECM,OACzBC;S2FoDF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA9kB,YAAkB,MAAGoQ,AAAAA,eAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAQrC2tC,YACExlB,OAAWua,SACb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAkL,YC5RuBrlC,KD6RfgyB,cAJNpS;OAAWua,SAMb,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,W,C;A,E,C,CASAmL,YAAwC,iCA3DT,yBA2DgC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE/DC,YAAwD,MC1SjCvlC,AD0S0C4f,iBAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEzE4lB;EC5SuBxlC,KD6SAylC;8BAhEQ,wBAkE7B/0C;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAg1C;ECnTuB1lC,KDoTA2lC;ECpTA3lC,KDqTL2lC;gCAxEa,wBA0E7Bj1C;QACAk1C;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC;EC5TuB7lC,KD6TA2lC;EACTA;;OAEU/tB,UAAhB+tB;;EAAAA,yEAnFuB,wBAqF7Bj1C;;GACS,SAAS02B,U1IrKXx/B;oB0IsKP,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAk+C,YAAwB,iCA1FO,yBA0FkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEjDC;EACgBvB,cAAAA,SAAc5sB;8BA7FC,wB1I/EtBhwB;mB0I+KP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAo+C;EChVuBhmC,KDiVL4f;ECjVK5f,KDkVH4f;gCArGW,wBAuG7B/d;QACAhS;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAo2C,YAA8B,iCA5GC,yBA4G2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1DC;EC3VuBlmC,KD4VJ2mB;EC5VI3mB,KD6VH2mB;gCAhHW,wBAkH7B3P;QACAD;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAovB;ECpWuBnmC,KDqWJ2mB;8BAxHY,wBA0H7Bsd;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAoB;EC3WuBrlC,KD8WJ2lC;EC9WI3lC,KD+WH2lC;gCAlIW,wBAoI7B5uB;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAhDiC,wBAAO5uB;QAAH;SAAei+C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASlC,wBAAOxmB;QAAH;SAAe74B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CA+CrCk+C,YACEhR,QAASkG,QAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAkM,cAAkB,MAAGpZ,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,CAOjD3lC,kBAAqBmQ,OAAH;MAAGA,SAAW,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAEhCwtC,kBACWxtC,OAATw8B;QAASx8B,QACX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA4uC,cAAkB,MAAGpZ,YAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,I,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,E,C,CAUzCgY,YACEhR,Q1ItNOrsC,K0IsNE0+C,QAAa,2CAExB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAD,cAAkB,MAAGpZ,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAHtC,cAAUxZ,OAAImM,AAAAA,cAAgBA,AAAAA,cAAvB;SAAoCqU,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,E,C,CAejDoS,cAAkB,MAAGpZ,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,CAQjD5lC,kBAAoBoQ,OAAH;MAAGA,SAAW,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAE/BwtC;EAFoBxtC,OAGlBw8B;QAASkG,OAHS1iC;EAKN0iC,KALM1iC;;+C3HtYDkgC,K2HsYClgC,QAQhBmZ;QAAgB,AAAA,2CAOpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAy1B,cAAkB,MAAGpZ,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CATa,eAC/CmU,8BAEF8D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHM,wBAAI;iDAAuC,KAAPlT,aAAUt7B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,G,CA8BxDrP,kBAAuBoQ,OAAH;MAAGA,UAAc,A,C;A,E,C,CAErCwtC;EAC2BxtC;EAAjB8uC,WAAiB9uC;GACZ,KAJQA,iBAKAoiC,AAAAA,aAAnB5F;QAASl+B,8BAEC8jC,OAAV5F;QAAU4F,mBAA+B9jC,SAAE8jC,UAE/C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAwM,cAAkB,MAAGpZ,YAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,G,CAY/C5lC,kBAAuBoQ,OAAH;MAAGA,UAAc,A,C;A,E,C,CAErCwtC;EAFuBxtC;EAGb+uC,WAHa/uC;GAIR,KAJQA,gBAIY,KAJZA,kBAKAuf,AAAAA;;EAAsBD,AAAAA,aAAzCkd;QAASl+B,iCACS,KANC0B,gBAMmB,KANnBA,eAOnBw8B,QAASl+B,SAAEihB,AAAAA,cAAaD,AAAAA;OACfC;GAAAA,eAAuBD,AAAAA,oBAChCkd;QAEa,KAXMx8B,iBAWIuf;;;;KACrBpG,QAAgB,AAAA,KAACoG,2CAGnBid;QAASl+B,SAAEihB,QAAaD,AAAAA,iBAE5B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAsvB,cAAkB,MAAGpZ,YAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAN9B,YAAI,MAAGiY,mBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,G,CAe1C79C,kBAAmBoQ,OAAH;MAAGA,UAAU,A,C;A,E,C,CAE7BwtC;EACsBv0C,AAAAA;YAElBujC,YACA;SAGsBx8B;W3H1ePkgC,K2H0eOlgC,UACxBw8B;QAAS9wB,AAAAA,AlD5gBqCtF;;4CkD+gB5C+S,QAAgB,AAAA,gCAMpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAy1B,cAAkB,MAAGpZ,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CARyB,eACvDmU,8BACF8D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHkB,wBAAI;iDAAuC,KAAPlT,aAAUt7B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,E,C,CAgBpEuuC;EACsBv0C,AAAAA;YAElBujC,YACA;SAEQl7B,AAAAA;SACVk7B;QAASwS;4CAGP71B,QAAgB,AAAA,gCAMpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAy1B,cAAkB,MAAGpZ,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAR0B,eACvDmU,8BACF8D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHkB,wBAAI;iDAAiC,KAANlT,aAASnwB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,G,CAmB9Dxa,kBAAqBoQ,OAAH;MAAGA,UAAY,A,C;A,E,C,CAEjCwtC;EACar0C,OAAAA;;EAAAA;EACSF,AAAAA;YAElBujC,YACA;SAEEx8B;GAAAA,wBAMFw8B;QA4DG3M,8CAJItmB,AAAAA,AAAAA,QAAqBA,gB9HrmBvB5Z,SAC4Bs/B,6BGAlBiR,K2H+iBSlgC,UACxBw8B;QAAS9wB,AAAAA,AlDjlBmCtF;;4CkDolB1C+S,QAAgB,AAAA,iCAStB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAy1B,cAAkB,MAAGpZ,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA9Bb,YAAI,MAAG9kC,SAAE8rC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAoB1B,eACMmN,8BAEF8D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHM,wBAAI;iDAAuC,KAAPlT,aAAUt7B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,E,C,CAkB9DuuC;EAC0BjuB;EACTD,AAAAA;;qEAEuB,aAC9B,KAAA;4CAINnG,QAAgBvoB,AAAAA;EAISq+C;EAgCF,cAhCzBzS;sBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAoS,cAAkB,MAAGpZ,YAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAPE,YAAI,MAAGiY,mBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAkDxEyB,YAAW,MAAGxjC,AAAAA,AAAAA,YAAczM,qBAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAM3DrP,YAAkB,wBAAoByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CAD9C86C,+BAA2B,A,C,C,C,A,E,kC,8C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CGzb7Bz/C;;GACQ,SAAM;oBACgB;GACf,CAAA,KAATgB,QAAYI,UAAU;GAC1B;YAAoBJ;6BAAAA;KAAF;EACZA;;GAAK,CAAA,OAAGI,MAAM,aACpB,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzB,YACa09C,UAEX;MAAOqC,M7IpEEj/C,sB6IqEX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKE2B,oBAC4B;6BAAA;EAAR;EACA,UAAQ,GAAuB,AAAA,CAAR,kBACzC;MAAY,GAAQ,MACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;EACoB,UAAQ,GAAuB,AAAA,CAAR;EAC7B,CAAA,EAAQ,WACpB;MAAkB,WAAQ,GAAuB,AAAA,CAAR,kBAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CA7OAu9C,gBAAwC,qBAAkB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAE1DC,gBAA0D,uBACnC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAavBV,cAAkB,MAAGpZ,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CAQjDoZ,cAAkB,MAAGpZ,YAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEzC5lC,kBAAsBwI,MAAJ;mDAA4C,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE9D1I;;EAAuBw/B,sCAAH;UAA8B,KAARA,QAAW92B,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE1D/I,YAAiB,MAAG+I,MAAAA,QAAc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAQlCw2C,cAAkB,MAAGpZ,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE5C5lC,YAAkB,cAAMi/C,aAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEjCn/C;;SAAoB;iDAAsB6/C,KAAYrgB,SAAW2f,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEzEx/C,YAAiB,MAAGmgD,MAAUX,SAAQ,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CAStCD,cAAkB,MAAGpZ,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEjD5lC,YAAkB,WAAKwa,kBAAMqlC,SAAW,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAExC//C;;SAAoB;iDAAiC,KAANw/B,SAAS9kB,UACpC,KAAb8kB,QAAgBugB,SAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEjCpgD;EA9BoB+I,KAAAA,AA8BsBgS;EAAcqlC,KAAAA,QAAvC;MAmLiBjf,MAAOhqB,KAAQA,cAnL2B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAQ5EooC,cAAkB,MAAGpZ,YAAoC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEzD5lC,YAAkB,cAAMwyC,aAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE/B1yC;;QAAoB;iDAA2C,KAARw/B,KAAWkT,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEvE/yC,YAAiB,MAAG+yC,MAAAA,SAAc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CAQlCwM,cAAkB,MAAGpZ,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE5C5lC,YAAkB,MAAGwI,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE1B1I;;SAAoB;iDAA8B,KAARw/B,QAAW92B,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE1D/I,YAAiB,MAAG+I,MAAAA,QAAc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CASlCw2C,cAAkB,MAAGpZ,YAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE/C5lC,YAAkB,WAAKyG,iBAAU+rC,SAAM,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEvC1yC;;SAAoB;iDAAoC,KAAXw/B,SAAc74B,UAC5C,KAAR64B,QAAWkT,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEvB/yC;EAA0CgH,KAAAA;EAAmB+rC,KAAAA,QAA5C;MAuIiB5R,MAAOhqB,KAAQA,cAvI2B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CAU5EooC,cAAkB,MAAGpZ,YAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEhD5lC,YAAkB,cAAM2vB,iBAAMlpB,iBAAUipB,aAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE/C5vB;;SAAoB;iDAAqC,KAAXw/B,SAAc74B,UAC9C,KAAP64B,SAAU3P,UAAgB,KAAR2P,SAAW5P,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEzCjwB;EAA0CgH,KAAAA;EAAmBkpB,KAAAA;EACzDD,KAAAA,QADa;MAyHbkR,MAAOhqB,KAAQA,KAAQA,iBAxHR,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CASnBooC,cAAkB,MAAGpZ,YAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE9C5lC,YAAkB,cAAM2vB,oBAASD,aAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAExC5vB;;SAAoB;iDAA+B,KAAPw/B,SAAU3P,UACvC,KAAR2P,SAAW5P,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEvBjwB;EAA0CkwB;EAAAA;EAAeD,KAAAA,QAAxC;MAqGiBkR,MAAOhqB,KAAQA,cArGuB,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CASxEooC,cAAkB,MAAGpZ,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEvC5lC,YAAkB,WAAKqJ,iBAAUqI,aAAU,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE3C5R;;QAAoB;iDAEF,KAAXw/B,QAAcj2B,UACH,KAAXi2B,QAAc5tB,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE7BjS;EAC0B4J,KAAAA;EAAmBqI,KAAAA,QAD5B;MAmFiBkvB,MAAOhqB,KAAQA,cAlFc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CAS/DooC,cAAkB,MAAGpZ,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAExC5lC,YAAkB,WAAKqJ,iBAAUR,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEtC/I;;SAAoB;iDAEF,KAAXw/B,QAAcj2B,UACP,KAAPi2B,SAAUz2B,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAErBpJ;EAA0C4J,KAAAA;EAAmBR,KAAAA,QAA5C;MAgEiB+3B,MAAOhqB,KAAQA,cAhE0B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CAmB3EooC,cAAkB,MAAGpZ,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAExC5lC,YAAkB,WAAKqJ,iBAAUsQ,iBAAQpQ,aAAW,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEpDzJ;;SAAoB;iDAEF,KAAXw/B,QAAcj2B,UACL,KAATi2B,SAAY3lB,UACZgmC,KAAYrgB,QAAa/1B,SAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE1C9J;EAA0C4J,KAAAA;EAAmBsQ,KAAAA;EACzDimC,KAAUr2C,QADG;MAsCbq3B,MAAOhqB,KAAQA,KAAQA,iBArCF,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAerB,cAAU,MAAG4oC,QAA2BM,SAAa,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,8B,0C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,e,C;A,E,C,CJ/OzD3D;KACY,SAAuB,CAAA,KAAZ4D,KxIqRN72C,AwInSGgP,kBAeJ,SAAwB,CAAA,KAAb6nC,KxIoRV72C,AwInSGgP;;UAgBV,KAAA,4BxImROhP,AwInSGgP,aAkBlBA,AAAAA;YACF,A,C,Q,C,C,C,M,C,I,C,E,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA8nC,cxI8QiB92C,AwInSGgP,kBAsBS+nC,AAAAA,gBAAP;kBACTC,SACX;oBAA+BC,aACjC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKAH,2BAEE;MAyIOC,UxI0HQ/2C,AwInSGgP,WAgCJ,YACI,KAAZ6nC,cACe,KAAbA,KxIiQO72C,AwInSGgP,oBAmCDkoC,SAEJH;;6BACe,KAAbF,KxI6PA72C,AwInSGgP,oBAuCImoC,SACTJ;;;QAIY,KAAZF,KxIuPE72C,AwInSGgP,gBA6CdikC;EAEOmE,UADKJ,mBAES,KAAZH,KxImPE72C,AwInSGgP,iBAgDwC,KAAb6nC,KxImP9B72C,AwInSGgP;gDAoKV,uDAGRikC;;EACYC,SACL6D;;wBAvHkB,KAAZF,KxIiPE72C,AwInSGgP,gBAmDS,KAAlB6nC,AxIgPM72C,AwInSGgP,sBAoDPqoC;UAIX,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAP;+CAEoCtwB,OAAzBuwB,AAAAA;gBAAP;yEAC4BvwB;;;;QAEI/V,KADZ+V;EAC0BA,OAAvCuwB,AAAAA;gBAAP;iCAEM,KAAA,uCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAD;ExI2NiB92C,AwInSGgP,UA0ElBikC;;EACY+D,SACZ;YxIuNeh3C,AwInSGgP;GA4EJ,WACM,KAAZ6nC,YACW,KAAZA,KxIqNQ72C,AwInSGgP,gBA+EC,KAAZ6nC,KxIoNQ72C,AwInSGgP,iBAgFO,KAAlB6nC,AxImNQ72C,AwInSGgP,iBAgFS6kC;;;EACjBoD,UAAwBJ,AxIkNnB72C,AwInSGgP,kBAkFlB,EACgC6kC,OAAzBkD,AAAAA;gBAAP;uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAD;GACkB,KAAZD,KxI4MW72C,AwInSGgP,kBAwFJ6nC,KxI2MC72C,AwInSGgP;;GAyFN,YAAgB,YACxBikC;GACgB,KAAZ4D,KxIwMO72C,AwInSGgP,kB7HmFXnY,gB6HiK6CggD,KxI+CrC72C,AwInSGgP,uBAoPN+nC,AAAAA;;;yBACZ9D;SAzJM;gBA8JM8D;GA7Je,KAAZF,KxIsMA72C,AwInSGgP,kB7H+FXnY,gB6H2JgDggD,KxIyCxC72C,AwInSGgP,kBA0PN+nC;;;yBACZ9D;SA7JM;gBAEWgE,QAAiBK,aACrBP;UAAP;+BAEa,YACf9D;EACWgE,QAAiBK,aACrBP,AAAAA;gBAAP;sBAGJ,MAAOO,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAR;OACaD,KxIsLI72C,AwInSGgP,uBAgHA6nC,KxImLH72C,AwInSGgP;;GAiHF,eACVikC,SAEO8D,AAAAA;gBAAP;gCACiB,YACjB;;OAIF,MAAOQ;OAEP,MAAOC;OAEP,MAAOC;OAEP,MAAOC;UAEU,KAAbb,KxIiKO72C,AwInSGgP,kBAuOlBikC;EACWC,SACXD;cACO8D,AAAAA;gBAvGD;2BACsB,KAAbF,KxI+JA72C,AwInSGgP,iBAqIZ,MAAO2oC,UAET;;QAEA,QAEN,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAC;;EAiBSb,OAfP;GACE9D;GACgB,KAAZ4D,KxIkJS72C,AwInSGgP,gBAiJiC,KAAb6nC,KxIkJvB72C,AwInSGgP;EA8Oc6nC,KxIqDjB72C,AwInSGgP,WA8ON+nC;;;yBACZ9D;SAnFAA;cARE8C;kBASU7C;ExIsIGlzC,AwInSGgP,iBAqJH,SAAwB,KAAb6nC,aAAoB,AAC9C5D;cACA;mBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAoBA6D;GACmB,KAAbD,KxIsHW72C,AwInSGgP,qBA8KhBikC,SACO8D,AAAAA;gBAAP;oCAEe,KAAbF,KxIkHW72C,AwInSGgP,sBAkLhBikC,SACO8D,AAAAA;gBAAP;oCAEe,KAAbF,KxI8GW72C,AwInSGgP,qBAsLhBikC,SACO8D,AAAAA;gBAAP;sCAYc,CAAA,KAAZF,KxIgGW72C,AwInSGgP,oBAoMV,iCxI+FOhP,AwInSGgP;EAsMN6nC,KxI6FG72C,AwInSGgP,WAuMlBikC;SACO8D,AAAAA;;;EAdIG;WAET;KAEA,0BAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAWA1/C;ExIwFiBwI,AwInSGgP;GA4MP,SAAuB,KAAZ6nC,YAA6C,KAAbA,KxIuFvC72C,AwInSGgP,sBA8MhB;GACEikC;GACgB,KAAZ4D,KxImFO72C,AwInSGgP,gBAgNmC,KAAb6nC,KxImFzB72C,AwInSGgP,sBAoNd6nB;OADWqc;ExIgFAlzC,AwInSGgP,iBAqND,SAAwB,KAAb6nC,aAAoB,AAC9C5D;cACA;SAEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA6D;ExIuEiB92C,AwInSGgP;GA6NP,SAAuB,KAAZ6nC,YAA6C,KAAbA,KxIsEvC72C,AwInSGgP,kBA8NhBikC;EACWC,SACXD;cACA;SAEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CASA4E;EACkChB,KxIqDjB72C,AwInSGgP,WA8ON+nC,AAAAA;;0BACZ9D;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA4E;E7HhKShhD,gB6HiK6CggD,KxI+CrC72C,AwInSGgP,uBAoPN+nC,AAAAA;;0BACZ9D;SACA;SACF,A,C,Q,C,C,C,M,C,I,C,E,C,E,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEA4E;E7H1JShhD,gB6H2JgDggD,KxIyCxC72C,AwInSGgP,kBA0PN+nC,AAAAA;;0BACZ9D;SACA;SACF,A,C,Q,C,C,C,M,C,I,C,E,C,E,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C,C,A,E,mC,+C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CK5PF37C,YAAoD,gCACjB,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,C;A,G,C,kB,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,C,C,CAMjCiG;;QAAc;iDAAgC,KAAR64B,KAAWe,UAAiB,KAARf,IAAW92B,QAAK,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,I,C,C;A,G,C,CAC1E/I,YAAiB,MAAG+I,MAAAA,QAAc,A,C,I,C,I,C,C,C,C,C,G,C,U,C,C;A,E,C,CAClCxI,YAAkB,cAAMqgC,kBAAQ73B,YAAO,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,K,C,I,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,I,C,C,C,C,C;A,M,C,C,E,C,CAEvCw4C,+CAAoC,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,E,C,C,C,C,kB,C,C,C,C;A,e,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,E,CAapCjgD,2BAC6B0W,KAAAA;wCADU;SACS,A,C;A,E,CAGhDhY,YAAe,MAAGgY,MAAAA,SAAgB,A,C;A,G,CAClC3X,YAAiB,MAAG2X,MAAAA,SAAiB,A,C;A,G,CAIrCupC;EALkBvpC;;WAKqC,KALrCA,WAK0CA;wCAAnC;SAAkD,A,C;A,E,C,CAE3EupC,+BAC+BvpC,KAAAA;wCADM;SACqB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,CAW1DupC,WAA4B,MAAG93C,SAAQ,A,C;A,C,C,CAEvCpJ;EACMoY;GAAAA,SAC0BH,OAAAA;QAAM,GAAlC7O;wBAAsCgP,eACtC;SAEFhP,YACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C,C,A,E,mC,+C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCxDF+3C;GvGyqF6B9oC,AAAAA,AuGxqFvB+oC,iBACF,MvGqqFsB/oC,AAAAA,AuGrqFf+oC;EAqBQA;GACE,SACW,CAAA,KAAzB3jC,iBApBUigC,KAAgB0D;GAClB,QACT,SAGJ,MAAA,KAAyBA,SAAzB,UACe1D,K9IuREt0C;G8ItRJ,QACT,SAEJ,AACA,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,A,E,iC,6C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CPgGAzJ,+BAEa;SACA;SACA;SACA;SACA;QACA,UAEb,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,c,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CASEO,YAAkB,UAAMmhD,cAAQ34C,YAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,C,CAgBxC9H;EAHUwX,OAARiL;QAAQjL,MtEmcS2c,SsE9bjB;MA0HAqnB,UA1HM/4B,QAAM,mCALZA,QAAQjL,MtEmcS2c;uBsE1bbusB;kCAJEj+B;KAnDuC,OAAgB,UACzD,OAAgB,uBAA4C;;KAwD5Dk+B;QAhDsB,OAAgB,MAkDtCC;kBAbIppC,MtEmcS2c,SsEncjB1R;;;GArC0B,OAAgB,MAqHxCo+B;KAEArF,2CAlFF/4B,QAAQjL,MtEmcS2c,SsE3WjBqnB;0CAxFA/4B,QAAQjL,MtEmcS2c,SsEtWjBqnB;kCAhIyBsF,mBA8ITr+B;EA3GRjL,MtEmcS2c,SsEncjB1R;;GAnCyBq+B,mBAmJwBr+B;E5HzD1CpjB;G4H0DD0hD,iBAjHNt+B,QAAQjL,MtEmcS2c;WA5eK;EtDgGf90B,gBsDhGe;EtDgGfA,Q4HmEPm8C,oBAA0CwF,sBA3JlBC,aAuDDx+B,YtE/DD,OsEuKcA;E5HvE7BpjB,O4HwEPm8C;oBAA4CwF,aA/H5Cv+B;QAAQjL,MtEmcS2c,esEncjB1R,QAAQjL,MtEmcS2c,UsExajB,AACA,SACF,A,C,Q,C,M,C,C,C,C,C,I,C,C;A,E,C,CAEAusB;EACkBj+B;EAhCRjL;EAAAA,MtEmcS2c,SsEncjB1R;SAkCA;MAOIy+B,QAPS,wCACc,KAAA;aAnCnB1pC,MtEmcS2c,SsEncjB1R;;gBAsC6B,KAAA;EtE/EP,OsEgFA8O;E5HgBflyB,OA6CP0M;KAA6CA,csD7IvB;EtDgGf1M,OA6CP0M;KAA6CA,S4HpGrCyL,MtEmcS2c,SsEncjB1R;UA4CA,AACA+4B,AAAAA,wB5HkEyBzvC,QAHzBA;O4H5GA0W;QAAQjL,MtEmcS2c,UsEnZnB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAwsB;EAlDUnpC;EAoDN0pC,OADF;YAAOz+B;GAAM,sCAANA;KA9FwB,OAAgB,aAC3C,OAAgB,SAAc,OAAgB,uBAChB;;;;EtEAZ;EtDgGfpjB,OA6CP0M;KAA6CA,M4HpG7C0W;QAAQjL,MtEmcS2c,UsE7YjB,E5HyDyBpoB;E4HtDvByvC;GADE2F,gBACF3F;KAEAA,uB5HiDFzvC;Q4H9CF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA60C;EAhEUppC;EAkEN0pC,OADF;YAAOz+B;GAAM,sCAANA;EAtGmB,OAAgB;;EtEJpB;EtDgGfpjB,OA6CP0M;KAA6CA,M4HpG7C0W;QAAQjL,MtEmcS2c,UsE/XjB,aApEQ3c,MtEmcS2c,SsEncjB1R;;;GArC0B,OAAgB,MAqHxCo+B;KAEArF,AAAAA,sCAVAA,AAAAA,wB5HuCuBzvC,QAHzBA;S4HjCF,A,C,Q,C,M,C,C,C,C,C,I,C,C;A,E,C,CAqBA80C;EACEK,O5HOA5sB;KAAM;E4HxGE9c,OAkGR;YAAOiL;GAAM,sCAANA;EAvImB,OAAgB;;EtEJpB;EtDgGfpjB,OA6CP0M;KAA6CA,M4HpG7C0W;QAAQjL,MtEmcS2c,UsE9VjB,AACAqnB,AAAAA,wB5HSyBzvC,QAHzBA;Q4HJF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CA+BAzM,YAAkB,yBAAqByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAD/Cq9C,+BAA4B,A,C,C,C,A,E,+B,2C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,E,C,CGhS5BvxB,YAAoB,MAAG5X,cAAc,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C,C;A,G,C,C;A,G,C,K,C;A,E,C,CAkBrCslC,YAAwC,MAAGF,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE7DG,YApBuBvlC,AAqBf4f,eACNwlB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAI,YAzBuBxlC,KA0Bf2lC,aACNP;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAM,YA9BuB1lC,KA+Bf2lC,aA/Be3lC;KAgCf2lC,aACNP;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAS,iBApCuB7lC;KAqCf2lC;EACFA;GAAY,QACd,sB1ImQkCt9C,8B0InQlC,OAvCmB2X,K1I4SNzP,U0InQb,AAEF60C;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAU,YAAwB,MAAGV,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE7CW,iBACE;MAAcvB,2B1IyPsBn8C,8B0IzPpC,OAjDqB2X,K1I4SNzP,U0IzPf,AACA60C;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAY,YAvDuBhmC,KAwDf4f,cAxDe5f;KAyDf4f,aACNwlB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAa,YAA8B,MAAGb,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEnDc,YA/DuBlmC,KAgEf2mB,cAhEe3mB;KAiEf2mB,cACNye;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAe,YArEuBnmC,KAsEf2mB,aACNye;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,YA1EuBrlC,KA2EfgyB,cA3EehyB;KA4EfgyB,cACNoT;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C,A,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CK3EwBzqC,YAA+B,MAAGu4B,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAA8Ch5B,cAAwCg5B,KAAS32B,eAA2B22B,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAC1MkW;;ErH2FqB;;;gBC5CI;;;;;;SoH/CwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCAzBC,YAAkB,MAAGC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCpvC,cAA2BovC,KAAY/sC,eAA8B+sC,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACvJxiD,YAAY,MAAGyiD,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAA2BrvC,cAAqBqvC,KAAShtC,eAA2BgtC,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CAExHxhD,YAA2B,MAAGyhD,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAA6DtvC,cAAoCsvC,KAAWjtC,eAA6BitC,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAE1N,cACEC,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,e,C,C;A,E,C,CAEA,cACEA,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEA;GACM,AAACC,KAdsCJ,YAezCI,AAAAA,KAfyCJ,qBAoBzC;OAEF/sC;EACiBmtC,AAvB0BJ,QACNC,KAuBrCI;KArBqDH,KAsBrDG;KAtBqDH,KAsB3CE,KAAAA,KAzBiCJ,MAyBV,YACnC,A,C,Q,C,K,C,C,C,C,C,G,C,mB,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CAEAM;ElDfS3gB;;EpE8EY;;;gBC5CI;;;;;;;SqHnBqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAbvB;;;GACXygB,KAhBiCJ,eAiBnCG,QAEJ,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,+C,C,C,G,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,C,wE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCpBkB3iD,YAAY,MAAGyiD,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAgCrvC,cAAqBqvC,KAAShtC,eAA2BgtC,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CAEtJliD,kB9CFiDuiC;W8CI7C,sCAEF;MAAO6E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,E,C,CAEA,cACEgb,gBACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEA,oB9CbiD7f;G8CcvC,SAAW6E,cACjBlyB,mBACAA;qBAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,mB,C,C;A,G,C,CAEAlV;G9CpBiDuiC,W8CsB7C;GAEM,KAxB6B2f,WAyB/B9a,K9CzByC7E;EAAAA;U8C4B3C,oDAAwB8f,KA5BSH;KA8BjC9a,AAAAA,WAAgBgb,aAGpB,uCACF,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,G,C,CAEApiD;G9CpCiDuiC,W8CsC7C;GAEM,KAxC6B2f,WAyC/B9a,K9CzCyC7E;EAAAA;U8C4C3C,oDAA4B8f,KA5CKH;KA8CjC9a,AAAAA,WAAgBgb,aAGpB,uCACF,A,C,I,C,I,C,C,C,C,C,G,C,K,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEAI;;EvHwCqB;;;gBC5CI;;;;;;;;SsHImB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCnDpBR,YAAkB,MAAGC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCpvC,cAA2BovC,KAAY/sC,eAA8B+sC,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACvJniD,YAAsB,MAAG2iD,MAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAA6C5vC,cAA+B4vC,KAAkBvtC,eAAoCutC,QAAyB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,c,C,G,C,C;A,E,C,CAI3N;;EAL6CR;WAQzC,MAEFI;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,YACEntC,oBACF,A,C,Q,C,K,C,C,C,C,C,G,C,oB,C,C;A,E,C,CAEAwtC,cAHExtC,oBAKF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,qB,C,C;A,E,C,CAMYlV;EAzBiCiiD;YA0BnB,AAzBuBQ,UA0B7C;EAEQJ,KAAAA,QAAYM;WAEpB;GAEM,UACN,2CAGF;8CACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,W,C,G,C,C;A,E,C,CAEA,cACEN,AAAAA,KAzC2CJ,YA0C7C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,cACEI,AAAAA,KAAAA,KA7C2CJ,yBAiD7C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,iB,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,sB,C,E,C,CA9CAW;;ExHwFqB;;;gBC5CI;;;;;;;SuH5CoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,M,C,CA0CL,YA/BtC1tC,qBAiCEoyB;gBACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,4C,C,C,G,C,C,A,E,W,mC,A,A,C,C,C,C;A,G,C,E,C;A,E,C3BRFrmC;WAGI;;EA6lC2B,AAARmrB,mBAA+B,AAAVA;GA3lCtC,GACF3Z,AvG8LsB;EuG3LH/S;;OA0lCI6M,YACqBA;;;;;;;;;;;W5F7lCvB;;;;;;gB4F2YU;;;;;EAsHlB;EzBniBRq1B;;;;;;;;;;;;;;WnEkCgB;;;;mBAAA;;sD4F2BvByN,OACA;SACF,A,C;A,E,C,CA2jCFvvC;GACY;EAAqB,AAARssB,mBAA+B,AAAVA,6BAA5C;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQA;4CAEI;4CAGAy2B;iDAEAC,UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cACEpjD,sBASF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,2BACE;MMzmC+Bk/B,SNymCb,EMzmCaA,gBAoBUA;;;MNojCV,AAARxS,mBAA+B,AAAVA,oBAoCxC3rB,QAAU0Z;iDAEV2oC;UAEAD,UAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,G,C,CArrCeE,WAA6B,MAAG5iC,SAAM,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,G,C,CAItC6iC,kBAAa7iC,OAAH;MAAGA,UAAS,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CAGtBxN,kBAAuBwN,OAAH;MAAGA,UAAc,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CAGrCngB,YAAc,MAAGkG,SAAG,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CAIpBlG,WAAuB,MAAGijD,SAAY,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,C;A,G,C,CAItCjjD;EAAmBoC;EAAqB8D,OAAxB;WARCA,iBAQ2B,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,C;A,G,C,CAG5ClG,WAAoB,eAAQulB,gBAAM,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,C;A,G,CAI/CzlB,YAAgB,MAAGojD,SAAO,A,C;A,G,CAK1BpjD,WAAkB,SAAQ,A,C;A,G,CAG1BA,WAAmB,SAAQ,A,C;A,G,C,CAEFE,YAAgB,MAAGmjD,YAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BtwC,cAAyBswC,SAAUjuC,kBAA4BiuC,eAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzInjD,WAAkB,MAAGojD,YAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCvwC,YAA2BuwC,SAAYluC,kBAA8BkuC,eAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,E,C,CA8ChL9tC,eAzDmB4tC,QA2Df,MnFyEK,gBmFtEP;MAAOG,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMA/tC;GACS,KArFqBpP,YAwF1B,MnF2DK;GmFpIUg9C,SA2EHI,WACZ,MnFwDK;EmFtDHC;cACmBpwC,AAAAA,AAAAA,AAAAA,kBAAYoS,qDAAjCg+B;UAeF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA;;EAkhC2Bh3C,KA7gCF7M;EACCA;;GA4gCC6M,cACqBA;EA1gC1CrG;GAAI,SAAe,CAAA,OAAGxG,cAI1BwG,QAAMxG,WAENujD;SACAra;eACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CApCgD;EAChBlpC;;GAoiCL6M,cACqBA;;GApiC5B,CAAA,OAAG02C,MAIb,MAAO,MA9G4B9iC,OAgHrCw9B;OACA;SACJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAgB,WAEZ4F,eACJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,a,C;A,G,C,CAyCSP,YAAU,YAAO,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CACjBrwC,YAAoB,OAAO,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CAE3BnS,iBAAkCgjD,OAAH;MAAGA,UAAoB,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,C;A,G,C,CAEtDxjD,YAAgB,WAzJCkG,SAyJO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,C;A,G,C,CAEZlG,YAAmB,MAAGyjD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAA8C5wC,cAA4B4wC,QrGjG5H3wC,eqGiGwK2wC,WAAoB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC1KzjD,WAAwB,MAAG0jD,SAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAAmD7wC,YAAiC6wC,QrGlGhJ5wC,eqGkGsM4wC,WAAyB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,c,C,G,C,C;A,G,C,CAC7MpiD,WAAkB,MAAGqiD,SAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAuC9wC,YAA2B8wC,QrGnGlH7wC,eqGmG4J6wC,WAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,E,C,CAkBtL3jD;EACY4jD;WAER;ElH/CwC5hD;;;qBAAAA;EAErBA,KAAAA;6BAAAA,OkH+CrB;MAAOoqB,WlH/CY,KkHgDrB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEApsB;EACY6jD;WAER;ElHtDkC7hD;;qBAAAA;EACfA,KAAAA;6BAAAA,OkHuDrB;MAAO+C,UlHvDY,KkHwDrB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKAgO,iBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAuC;UAEI,MnFrDK;EmFuDWkuC,AAAAA;GACN,QACV,MnFzDK,amF6DP;MAAOH,AAAAA,iCAOT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/tC;GAEMvQ,uBACiB++C;EACDC,UAClB;MAAOC,AAAAA,mCAeCC,AAAAA;GACF,QACN,MAAO5U,QAGT;MAAO6U,AAAAA,iCAOT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMA5uC,YACE,MAAO6uC,AAAAA,AAAAA,AAAAA,6FA2CT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA;KAEI,MAEFjB;;;EACUxjD,gBA1JuH+jD;QrGjG5H3wC,eqGiGwK2wC;EA2J9J/jD,qBA1JsIgkD;QrGlGhJ5wC,eqGkGsM4wC;EA2JlMhkD,eA1J8GikD;QrGnGlH7wC,eqGmG4J6wC,UA2JjKS;QAAgB1kD,mBAClB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EACwB8jD;EACA,6BACtB;MAAA,QAAA,UAAA;EACkBa;EACFC;GACF,QACVC;OAEU,YACVA;UACA9xC,AvGlGoB;gCuGpOIvM,YAwU5B,AAEAq+C,kBAIAf;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAhLAR,WAtI2GG,QAAUjuC,kBAA4BiuC,aAC9BC;QAAYluC,kBAA8BkuC,aAwI3Ja,AAAAA;;MnHk+CKhhD,8BAA8B,+BmHj+CnC06C;QzB9JO/b,SyB+JT,A,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CA4CuB;2CAEf,MAGF;MAAO4hB,AAAAA,uBACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQmC;WAK7B;;WAGA,MAAOphD;KAEP,MAAOA,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQqB;;EACX;GACNitC,QACF4U,AAAAA,2BAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAH2B,WAAG,cAAG5U,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAWT;MAECyM;EzB7PpBla;GyB+PC,CAAC4iB,WnHg4CJvhD,6IAA8B;E0F/nD5B2+B;E1DuJA,KmF0GK,yBADN;YAUc,KAAZliC,kCnFnHD,KmFoHuB,yBAAxB;iBACqB,KAAZA,sCnFrHR,KmFsHuB,yBAAxB;SAGF,oBApBF;;kBAsBEyD;OACAA;;EnH42CCF,0HAA8B;E0F/nD5B2+B,OyBoRH;MnF7HG,MmF8HG,2BAQV,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAc,kBAEZ6iB;GzEvFE,AA/EoBlgC,aA+ECM,OACzBC;OyEuFE;MnFzIK,mBmF0IP,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAS,wBAAI;gDAAQ4/B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAyB,kBAE5CC;GzE3FE,AA/EoBpgC,aA+ECM,OACzBC;OyE2FE;MnF7IK,mBmF8IP,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAS,wBAAI;gDAAQ8/B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgCG,cACtBxiD,QACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,G,CAUF3C,WAAY,MAAGolD,SAAI,A,C;A,E,C,CAMnB;EACE,OxH5PAtkD;WwH6PA;MAAoB,aAAF,WAChBskD;EAAQ;6BAAA,OAARA;QAAK,IACP,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIA,+BACE;MAAoB,UAAA,kCAAF,WACGC;;EAAY,OAAEC,KAAjC;;EACAF;6BAD+B,OAC/BA;QAAK,IACP,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA;;EAGuB;;GAFrB;YAAoBC;6BAAAA;KAAF;EACRA;cACW,SAAnB;KAAoC,KAAjB,QAAuB,WAC5C,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA,oBACE;MAAoBA,UAAAA,aAAF,QAChBA,MACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,G,CAMAxjD,WAA4B,MAAG0jD,SAAQ,A,C;A,E,C,CAQvC,6BACEA;;;EACe5b;EACXp8B;GAAAA,cAEFA,UAAao8B,eACb6b;QAAkB7b,KAAAA,kBAClB;MAAoB8b,UAGlBC,cAF2CF,QAD3B,sCAC2BA;;;;iBAC3CG;MACAD;UACF,6BAH6CF;;;8BAK7CI;SACAA;OACA;SAE6CJ;6BAAAA;;;8BAG/CG;OAAyBC,AAAAA,WACzBA,AAAAA;;EACAF,OAAAA;;GAEqB,AAAjBA,SAAmBD,QACrBC,aAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,C,0H,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CAKanC,YAAU,MAjbsB7iC,SAibd,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CAClBxN,YAAoB,YAAO,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,CAExC3S,YAAgB,MAAGkG,SAAG,A,C;A,G,CACtBlG,WAAoB,eAAOkG,SAAI,A,C;A,G,C,CAENpG,WAAuB,MAAGwlD,SAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAA8CzyC,YAAgCyyC,QrGnX1IxyC,eqGmXkMwyC,WAA0B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,e,C,G,C,C;A,G,C,CAC1MxlD,WAAsB,MAAGylD,SAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAA6C1yC,YAA+B0yC,QrGpXtIzyC,eqGoX4LyyC,WAAyB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,c,C,G,C,C;A,G,C,CACnMzlD,WAAiB,MAAG0lD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAwC3yC,YAA0B2yC,QrGrXlH1yC,eqGqX8J0yC,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAChK1lD,WAAc,MAAG2lD,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqC5yC,YAAuB4yC,QrGtXtG3yC,eqGsX4I2yC,WAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAUvJzlD,YAA+B,WA1bdkG,oBA0biC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,c,C,G,C,C;A,E,C,CAElDlG,YAAmC,gBA5blBkG,qBA4b4C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,kB,C,G,C,C;A,E,C,CAK1EyP,WAEE,MAAOsuC,AAAAA,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;;SAIE;MAAA,KADkB9e,gBAClB,OAGEugB,OAFYC,KADd,eAIA,AACAC;SACAC;;EACoB1gB;GACF,QAChB2gB,QAAkBC,aAEtB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBACE9B,OAAAA,AAAAA;0BAMF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;;EACoB9e;EACAA,gBAClB;MAAA,QAAA,UAAA,MAEE3gC,AADYmhD;yBAEd,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEArwC,YACE,MAAOxD,AAAAA,wBAAqBk0C,YAC9B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YAIEC,KAFmBC,mCAKrB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CASAnzC;WAEI;EAEUrT;EACFukD;EAAAA;GACF,QACN;EAGI;GACF5U,QACF4U,UAEF;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA3uC,kBAGY2uC,AAAAA;GACF,QACN,MAAO5U,QAGT;MAAOl8B,AAAAA,AAhiBoCgN,gBAUfja,0CA6hB9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,C,CAEyB8O,WAAuB,MAAGmxC,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCtzC,YAAgCszC,QrGre5HrzC,eqGqewKqzC,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC1KC,WAA2B,MAAGC,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAA0CxzC,YAAoCwzC,QrGtezIvzC,eqGseuLuzC,WAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAE1LrmD,YAAgB,MAAGmjD,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BtwC,cAAyBswC,QrGxepGrwC,eqGwe0IqwC,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzInjD,WAAkB,MAAGojD,SAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCvwC,YAA2BuwC,QrGze5GtwC,eqGyesJswC,WAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACvJpjD,WAAoB,MAAGsmD,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAmCzzC,YAA6ByzC,QrG1epHxzC,eqG0ekKwzC,WAAqB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACrKn/C,WAAc,MAAGo/C,SAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAA6B1zC,YAAuB0zC,QrG3e/FzzC,eqG2euIyzC,WAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,G,C,CAKvI9mD,WAAoB,MAAG+mD,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAAuC3zC,YAA6B2zC,QrGhf3H1zC,eqGgf+K0zC,WAAwB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CACrL/mD,WAAoB,MAAGgnD,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAAuC5zC,YAA6B4zC,QrGjf3H3zC,eqGif+K2zC,WAAwB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CACrLhnD,WAAwB,MAAGinD,SAAkB,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,G,C,G,C,C;A,G,C,CAA2C7zC,YAAiC6zC,QrGlf3I5zC,eqGkfuM4zC,WAA4B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,iB,C,G,C,C;A,G,C,CACjNjnD,WAAwB,MAAGknD,SAAkB,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,G,C,G,C,C;A,G,C,CAA2C9zC,YAAiC8zC,QrGnf3I7zC,eqGmfuM6zC,WAA4B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,iB,C,G,C,C;A,G,C,CAEjN3mD,YAAuB,MAAG4mD,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,I,C,C,M,C,C,C,C,C;A,G,C,CAAsC/zC,cAAgC+zC,QrGrfhI9zC,eqGqfoL8zC,WAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CAE1LC,YAAoB,MAAGzlB,SAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAmCvuB,cAA6BuuB,QrGvfjHtuB,eqGufyJsuB,WAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAElL;;EACa1hC,iBAhB8G4mD;QrG1epHxzC,eqG0ekKwzC;EAiBhK5mD,aAnBkGyjD;QrGxepGrwC,eqGwe0IqwC;EAoBtIzjD,aAnBwG0jD;QrGze5GtwC,eqGyesJswC;KAqBzJ,MAEFF;UACA4D;;GACIpnD,wBACAA,uBACAA,qBACF+S,AvG3VsB,oDuG4VtB;SAEQ/S,gBAnCuHymD;QrGre5HrzC,eqGqewKqzC;GAoC5J,AAAbzmD,wBACMA,cA/B0F6mD;QrG3e/FzzC,eqG2euIyzC,cAiCxH,AAAhB7mD,2BACSA,iBAvCiI2mD;QrGtezIvzC,eqGseuLuzC,gBAA9CA,QrGtezIvzC,eqGseuLuzC;EnHomCvLpjD,QAA8B,+BmHvjCnCvD;KAAAA;EAGAqnD;SAAAA;cAAkBC,4BAClBD;gBAAoBC,0BACpBD;aACAA;aAE0D,KADL,KADH,KAAhCC,6BACAA,iCACAA,sCACAA,yBAClBD;aAAiBC;EAEHtnD,KAAAA,wBA/CkH8mD;QrGhf3H1zC,eqGgf+K0zC;EAgDtK9mD,KAAAA,wBA/CkH+mD;QrGjf3H3zC,eqGif+K2zC;EAgDlK/mD,KAAAA,4BA/C8HgnD;QrGlf3I5zC,eqGkfuM4zC;EAgD1LhnD,KAAAA,4BA/C8HinD;QrGnf3I7zC,eqGmfuM6zC;EAkD5LjnD,sBAlL+H4lD;QrGnX1IxyC,eqGmXkMwyC;EAmLxL5lD,qBAlL4H6lD;QrGpXtIzyC,eqGoX4LyyC;EAmLvL7lD;ErGviBLoT,eqGqX8J0yC,QAkLzI,QAlL6FA;;EAmLhH,AArL0CF,cAqLxB,AApLuBC,cAoLN,MAlLiEE;QrGtXtG3yC,eqGsX4I2yC;EAmLzI/lD,cAlD8G0hC;QrGvfjHtuB,eqGufyJsuB,WAmDhK,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA9rB,WACE,MAAOnC,AAAAA,AAjnBoCgN,gBAUfja,4CA4mB9B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAWA+gD,cAEEC,SACAC;;WAEE;GAEmB,KAAjBA,WAEF,MAGF;MAAOC,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAH;EAEcE;EAAUD;mCAAAA;QAAe;EAAzBC;;EAEDzB;EAECyB;EAAUD;mCAAAA;QAAe;EAAzBC;;;;EAIGA;EAAUD;mCAAAA;QAAe;EAAzBC;6BAAAA;GAEf;KAAkB,WACJC,UACZn3B;;EACAA;EAAyBuiB;6BAAAA,OAAzBviB;KAAsB,IACxB,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,I,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAjMwB;6CA4fkJo3B,KrG15BnKv0C,YqG05B2Ou0C,OAwBhPC;MACAC;MAhB0LC;KrGn6BrL10C,YqGm6BiQ00C,QAC5EC;KrGp6BrL30C,YqGo6BiQ20C,QAkBtQC;KAAAA,KACAC;KAAAA,KACAC;KAAAA,OArhBE,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAoBmB,yBASrBvF,AADgBwF;mBACIA,eAPpB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmC0C;;EAC5B;GACNxY,QACF4U,AAAAA,2BAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAH2B,WAAG,cAAG5U,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAoDb,yBAClB2X;WAASc,cAAiBA,eAC5B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAwBmD,kBAEnD1e,SAAAA;KADwD,AAA1C,AhDlcc,iBgDoc5B;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kC,C;A,G,CAsDFtpC,WACE,OAAqB,KAAbmjD,kBACa,KAAbA,qBACa,KAAbA,qBACD,CAAC/8C,KAAAA,cACV,A,C;A,G,CACApG,WAAmB,MAAGioD,YAAQ,A,C;A,E,C,CAI9B/nD,YAAkB,M5F/hBGoO,M4F+hBAO,SAAe,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAOpC,yBACEu0C;QAAU;EAKVv0C,OAAAA;OACAA;;E5FlmBwCA;EAAAA,kB4F9DiEw0C;QAAUjuC,eAA4BiuC;E5F8DvGx0C,a4F7DyEy0C;QAAYluC,kBAA8BkuC,UAqpB3J0D;OAzrB2C3mC,SAwsB7C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,cAAuB,MAAGxR,AAAAA,iBAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAC5C,YAAa,MAAGA,AAAAA,eAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAC5B7O,YAAsB,M5FhnB2B6O,AAAAA,A4FgnBxBA,kBAAqB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAC9C7O,YAAoB,M5F/mByB6O,AAAAA,A4F+mBtBA,kBAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAC1C,cAAyB,M5F3jBeA,AAAAA,A4F2jBZA,oBAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE3C,cAAiB,MAAGA,AAAAA,iBAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACpClI,cAAe,M5FjnB2BkI,AAAAA,A4FinBxBA,mBAAO,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACzBlI,gBAAsBkI,AAAAA,gBAAH;SAAc,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CACjC7O,kB5F7nB8B6O,A4F6nBVA,UAAH;M5F7nBaA,a4F6nBE,A,C;A,G,CAChC7O,kB5F9nB8B6O,A4F8nBPA,UAAH;M5F1nBgB,AAJNA,a4F8nBQ,A,C;A,G,CACtCnO,kB5FnoBqCmO,A4FmoBhBA,UAAH;M5FnoBmBA,U4FmoBP,A,C;A,G,CAC9BnO,kB5FloBuCmO,A4FkoBhBA,UAAH;M5FloBmBA,U4FkoBL,A,C;A,E,CAClClP,kB5FjoB8BkP,A4FioBZA,UAAH;M5FjoBeA,S4FioBD,A,C;A,E,C,CAG7B7O,kBAAyB6O,OAAH;MAAGA,SAAqB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAC9C,oBAA0CA,OAAH;MAAGA,WAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CACnEuG,kBAAqE,MrGzpB9DpC,MqG0pBHnE,eAAoD,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CACxD,YAAgB,OAAkB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAClC,YrG/rBEw9B,AqG+rBmBx9B,eAAH;OAAoB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,G,CACtC6Y,kBAA0C7Y,OAAH;MAAGA,UAAY,A,C;A,G,CACtD7O;ErGhrByBqsC,AqGgrBAx9B;GrGhrBS,W4B+FHwU;EA1BP,+ByE2mBF;SAAoB,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,I,C,I,C,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,I,C,I,C,C,C;A,K,C,I,C;A,M,C,C,G,C,I,C,C,C;A,E,C,C;A,G,C,kD,C;A,G,C,CAOjBnjB,YAAgB,MAAG8iC,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BjwB,cAAyBiwB,QrGrqBpGhwB,eqGqqB0IgwB,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzI9iC,YAAmB,MAAGgoD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAkCn1C,cAA4Bm1C,QrGtqBhHl1C,eqGsqB4Jk1C,WAAoB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC9JhzC,YAAyB,MAAGizC,SAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAAwCp1C,cAAkCo1C,QrGvqBpIn1C,eqGuqBoLm1C,WAAsB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,W,C,G,C,C;A,G,C,CACxLjzC,WAA0B,MAAGkzC,SAAa,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,G,C,C;A,G,C,CAAyCr1C,YAAmCq1C,QrGxqBxIp1C,eqGwqB0Lo1C,WAAuB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Y,C,G,C,C;A,E,C,CAExN;;EACSxoD,aANkGojC;QrGrqBpGhwB,eqGqqB0IgwB;EAOrIpjC,gBAN2GsoD;QrGtqBhHl1C,eqGsqB4Jk1C;EA1uBtH7nC;EAivB/B,OAAkCzgB,mBAN2FuoD;QrGvqBpIn1C,eqGuqBoLm1C;EAO5K,OAAkCvoD,oBAN8FwoD;QrGxqBxIp1C,eqGwqB0Lo1C;mBAHrJplB;EAtsByE5tB,kBAA4BiuC,UAAtCA;SACQC;QAAYluC,kBAA8BkuC,WAitB7J,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,4C,C;A,G,C,CAUyBpjD,YAAgB,MAAG8iC,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BjwB,cAAyBiwB,QrG3rBpGhwB,eqG2rB0IgwB,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzI9iC,YAAmB,MAAGgoD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAkCn1C,cAA4Bm1C,QrG5rBhHl1C,eqG4rB4Jk1C,WAAoB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAEvL,uBACE9E;;;EACOxjD,aALkGojC;QrG3rBpGhwB,eqG2rB0IgwB;EAMrIpjC,gBAL2GsoD;QrG5rBhHl1C,eqG4rB4Jk1C;sBADvHllB;EA5tByE5tB,kBAA4BiuC,UAAtCA;SACQC;QAAYluC,kBAA8BkuC,WAouB7J,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,+C,C;A,G,C,CASyBpjD,YAAgB,MAAG8iC,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BjwB,cAAyBiwB,QrG7sBpGhwB,eqG6sB0IgwB,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzI9iC,YAAmB,MAAGgoD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAkCn1C,cAA4Bm1C,QrG9sBhHl1C,eqG8sB4Jk1C,WAAoB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC9J/nD,YAAqB,MAAG+S,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAoCH,cAA8BG,QrG/sBvHF,eqG+sBqKE,WAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAEjM;;EACStT,aALkGojC;QrG7sBpGhwB,eqG6sB0IgwB;EAMrIpjC,gBAL2GsoD;QrG9sBhHl1C,eqG8sB4Jk1C;EAMtJtoD,iBALiHsT;QrG/sBvHF,eqG+sBqKE;0BAFhI8vB;EA9uByE5tB,kBAA4BiuC,UAAtCA;SACQC;QAAYluC,kBAA8BkuC,WAuvB7J,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,mB,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,sE,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CAYyBrwC,YAA0B,MAAG+2B,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAyCj3B,cAAmCi3B,QrGnuBrIh3B,eqGmuBiLg3B,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CACnL9pC,YAAgB,MAAG8iC,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BjwB,cAAyBiwB,QrGpuBpGhwB,eqGouB0IgwB,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,CAElKhjC,WAAkB,SAAO,A,C;A,G,CACzBA,WAAmB,SAAO,A,C;A,E,C,CAQ1BL,YAA2B,MAAG0oD,AAAAA,gBAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOjD;;EACSzoD,aAnBkGojC;QrGpuBpGhwB,eqGouB0IgwB;EAoBxIpjC,aAAP0oD;;;EACYA,OAAqC,KAAtBA,eAA3BC;SA1xByGlF;QAAUjuC,kBAA4BiuC;EA4xBtIiF,OA3xBwGhF;QAAYluC,kBAA8BkuC,UA4xB3JkF;QAAe5oD,gBACf6oD;QAAoB7oD,wBACtB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;WAEI,MAEFyoD;QnHs0BKllD,QAA8B,+BmHr0BnCulD;QnHq0BKvlD,QAA8B,+BmHp0BnC;MAAA,QAAA,UAAA;;EAEmB0/C;GACjB;YAAwBA;6BAAAA;KAAF;EAEFA;EACFA,MAAQ,IACxBwF,AAAAA;gBACAK,AAAAA;;KACF,CACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;GACM,CAACtF,QAEHuF;;EAOAC;;GAJF;YAAoBC;6BAAAA;KAAF,UAIhBD;MAHWC,SACDA,MAAa;KAGzB,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,yBAEEzF;;WAEE;EAEgBt6C;GACdggD,aACF,MAGF1F;;EACAZ;SAAAA;OACA7vC,AvGpoBwB;sBuGooBGm2C,kCAAuCR,SAClE;QAAkB,EAAEQ,gBACS,GAA3BtG;iBAAgCsG,OAClC,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,kC,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,C;A,E,C,CAyBa5oD;EACP6oD;;GAAQ,SACV,QAEF;WAAYA,WACd,A,C,Q,C,K,C,C,C,C,C,G,C,kB,C,G,C,C;A,E,C,CAEa7oD;WAET;EAESwE,KAAAA,QAAkBqkD;WAE3B;GAGsB,KAApBC,QAAuBA,SACzB,QAGF;MADYhhB,MAAcghB,QAAqBtkD,kBAC7BskD,aACpB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,oB,C,G,C,C;A,E,C,CAEa9oD;WAET;EAESwE,KAAAA,QAAkBqkD;WAE3B,QAGF;MADY/gB,MAAcghB,QAAqBtkD,kBAC7BskD,aACpB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,oB,C,G,C,C;A,K,C,I,C;A,M,C,C,E,C,CAxCA5mD,cAEE,MAAU6lC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,G,C,C;A,G,C,M,C;A,E,C,CA2CA/nC,YAAkB,MAAK4sC,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,mB,C,E,C,CAE9B1qC;GACQ,gBACJ;QACW,cACX;QACW,mBACX;QACW,gBACX;QACW,aACX,WAEFuQ,AvGttBwB;;KuGutBlB,KAAA,QACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,+H,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CAuByBs2C,YAAkB,MAAGjmB,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAiCjwB,cAA2BiwB,QrGz5B1GhwB,eqGy5BgJgwB,WAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC/IrjC,WAA8B,MAAG4nD,SAAwB,A,C,I,C,I,C,C,C,C,C,G,C,uB,C,G,C,G,C,C;A,G,C,CAAiDx0C,YAAuCw0C,QrG15BnKv0C,eqG05B2Ou0C,WAAkC,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,uB,C,G,C,C;A,G,C,CAS3PrnD,WAAmC,MAAGwnD,SAA0B,A,C,I,C,I,C,C,C,C,C,G,C,yB,C,G,C,G,C,C;A,G,C,CAAuD30C,YAA4C20C,QrGn6BrL10C,eqGm6BiQ00C,WAAoC,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,yB,C,G,C,C;A,G,C,CACnRxnD,WAAmC,MAAGynD,SAA0B,A,C,I,C,I,C,C,C,C,C,G,C,yB,C,G,C,G,C,C;A,G,C,CAAuD50C,YAA4C40C,QrGp6BrL30C,eqGo6BiQ20C,WAAoC,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,yB,C,G,C,C;A,I,C,CACnRzyC,WAA0B,MAAGg0C,SAAa,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,G,C,C;A,I,C,CAAyCn2C,YAAmCm2C,QrGr6BxIl2C,eqGq6B0Lk2C,WAAuB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Y,C,G,C,C;A,G,C,CAC/Lh0C,YAAwB,MAAG4tB,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAuC/vB,cAAiC+vB,QrGt6BhI9vB,eqGs6B8K8vB,WAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,CAI1M9iC,WAAkB,SAAO,A,C;A,G,CACzBA,WAAmB,SAAO,A,C;A,E,C,CAkB1BwV,eAEW,KAtCmCwtB,cAwC1C,wCAEF;MnF12BO,iBmF22BT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;;;GAIE;YAAoBl5B;6BAAAA;KAAF;E5Gp7BX7J,K4Gq7BiB6J;E5Gr7BjB7J,K4Gs7BiB6J,MAAO;yCAG7Bq/C;eAA4BC;KAC9B,AAEAD,mBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQA,uBAjE0K5B;QrG15BnKv0C,eqG05B2Ou0C;SAyEhPE;Q5G78BOxnD,K4G68BoBopD,mCAC3B7B;Q5G98BOvnD,K4G88BoBopD,mCAC3BC;QAAc1B,QAASyB,mBACvBC;QAAczB,QAASwB;EACXA;GACF,QACRE;EAGKvhB,KAAcyf,QAlFmCF,kBAmFjDE,YA1EmLC;QrGn6BrL10C,eqGm6BiQ00C;EA4E/P1f,KAAcwf,QArFmCD,kBAsFjDC,YA5EmLG;QrGp6BrL30C,eqGo6BiQ20C,WA6ExQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;SACE5+C;QAAOujB,kBACPk9B;QAASl9B;EACF28B,KAAoB38B,cA7FoF0W;QrGz5B1GhwB,eqGy5BgJgwB,UA8FrJymB;Q5Gj+BOxpD,K4Gi+BkBqsB,uBACzBo9B;Q5Gl+BOzpD,K4Gk+BgBqsB;EArjCWjM;EAAAA;EAsjCvB/d,KAAmBgqB,kBAnFuGwW;QrGt6BhI9vB,eqGs6B8K8vB;EAoFtKxgC,KAAmBgqB,qBArF6G48B;QrGr6BxIl2C,eqGq6B0Lk2C;EAsF7K58B;GACF,QACdq9B;EAGSC;SAAXxG;SAA+B,KAApBwG,YAAmC,CAAA,KAvGF5mB;EAwGN,CAAA,KAApB4mB,YAAmC,KAxGT5mB,aA2GuG6mB;QrGpgC9I72C,eqGogCwM62C,WAF/M,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,CAEyB7pD,WAAwB,MAAG6pD,SAAiB,A,C,I,C,I,C,C,C,C,C,G,C,gB,C,G,C,G,C,C;A,G,C,CAA+C92C,YAAiC82C,QrGpgC9I72C,eqGogCwM62C,WAA2B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,gB,C,G,C,C;A,E,C,CAE1O;EAEED;SAAAA;;;GAEA;YAAoBE;6BAAAA;KAAF;EAEFA,MAAc;EAChBA,MAAc;EACP,CAAA,KAAfA,a5Gx/BC7pD,K4G0/BiB6pD,qBAGtBF;;KACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;;EAQI9B;;GALF;YAAoBiC;6BAAAA;KAAF;E5GpgCX9pD,K4GqgCmB8pD,iBAIxBjC;mB5GzgCK7nD,K4GsgCqB8pD,MAAe,gB5GtgCpC9pD,K4GugCqB8pD,MAAe;KAG3C,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA/pD,cACkB,OAAGypD,QAAnB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA9pD,WAAsB,MAAGqqD,SAAcpC,SAAQ,A,C,Q,C,M,C,C,C,C,C,I,C,C;A,E,C,CAE/CjoD,YAA4B,MAAGsqD,SAAWrC,WAAc,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMxDjoD,qBAEE;MAAA,YAAA,UACSuqD,AADT;6BACSA;KACT,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAvqD,qBACE;MAAA,QAAA,UAAA;GACkB,KAAZuqD,WACF,MAAOA,SAEX,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,C,CA1GA9nD,cAEE,MAAU6lC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAPa,cAAO,MAAW,MAAR7mC,QAAUJ,SAAEmpD,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAyIvB;;;MACkBzF,QAC1B9kD,aAASya;iDAET2oC;UAEAD,eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,8B,2D,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C4BrqCwB6B,YAAuB,MAAGtjB,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAsCvuB,cAAgCuuB,KAAWlsB,eAA6BksB,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAE1L8oB;;EzHyFqB;;;gBC5CI;;;;;;SwH7C0B,A,C,I,C,I,C,C,C,C,C,G,C,qC,C,C,C,C;A,0B,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,kC,+D,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCF3BtF,YAA+B,MAAGqD,MAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAA8Cp1C,cAAwCo1C,KAAe/yC,eAAiC+yC,QAAsB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,W,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CAElOkC;;E1HyFqB;;;gBC5CI;;;;;;SyH7C8B,A,C,I,C,I,C,C,C,C,C,G,C,yC,C,C,C,C;A,8B,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,gB,wC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,8D,C;A,E,C,C9BkBvD70C,cACE7C,AtGuNwB,wCsGvNayiB,QACrC;MAAOk1B,AAAAA,MAA2B,KAALl1B,qCAc/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA5BAm1B,WAIIn1B,sBAAiBlhB,KAAAA,uBAMrB,A,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAIqD,iBAEjDvB,AtGoNsB;;SsGnNRsW;OACd;MAAO+yB,SlHknDJ74C,mDkH/mDa8lB,KAAAA,qLlH+mDiB,iCkHzmDnC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gE,C;A,E,C,CAaF;;EACWnmB,KAAAA;EACEA,KAAAA;EACAA,KAAAA;GACF,CAAA,0BACP;EAEc0nD;EAAAA,QAEhBA;SACAjyB;UACF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEA/iB;KACmBi1C;ElH8kDZtnD,QAA8B,+BkH5kDnCwB;aACAA;kCACAA;yBACA8lD;QAAc,AAAdA;gBnElEwB,mBmEoExBD,AAAAA;gBACAt2C;KjGy52BuBooB,KAA4B,eiGz52BzB0f,eAC1B;MAAOzjB,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA7BAmyB,iBjGyq4BsCC,eAw9GpC32C;gBA/EI,KAAc,KA8EcC,KiG/n/BR22C,YjGij/BmB,uBiGhj/B3Cj4C,AtG+LwB;sCsG9L1B,A,C,C,A,E,+B,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C+B5CwBM,YAAyB,MAAG43C,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAwC93C,cAAkC83C,KAAYz1C,eAA8By1C,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,E,C,CAIpMze;OACanhC,AALuC4/C,sChI+pShD1xB,yBgItpSE5K;OAT8Cs8B,KAU9C;;uBhIqpSF1xB,4BgIlpSE5K;OAb8Cs8B,KAc9C;;chIipSF1xB,uBgI9oSE5K;OAjB8Cs8B,KAkB9C;;ahI6oSF1xB,sBgI1oSE5K;OArB8Cs8B,KAsB9C;;chIyoSF1xB,uBgItoSE5K;OAzB8Cs8B,KA0B9C;;chIqoSF1xB,uBgIloSE5K;OA7B8Cs8B,KA8B9C;;iBhIioSF1xB,0BgI9nSE5K;OAjC8Cs8B,KAkC9C;;gBhI6nSF1xB,qBgI1nSE5K;OArC8Cs8B,KAsC9C;;+HhIynSF1xB,0BgI9mSE5K;OAjD8Cs8B,KAkD9C;;gBhI6mSF1xB,yBgI1mSE5K;OArD8Cs8B,KAsD9C;;gBhIymSF1xB,yBgItmSE5K;OAzD8Cs8B,KA0D9C;;gBhIqmSF1xB,4BgIlmSE5K;OA7D8Cs8B,KA8D9C;;qBhIimSF1xB,+BgI7lSE5K;OAlE8Cs8B,KAmE9C;;yBhI4lSF1xB,mCgIxlSE5K;OAvE8Cs8B,KAwE9C;;ehIulSF1xB,wBgIplSE5K;OA3E8Cs8B,KA4E9C;;mBhImlSF1xB,wBgIhlSE5K;OA/E8Cs8B,KAgF9C;;WhI+kSF1xB,oBgI5kSE5K;OAnF8Cs8B,KAoF9C;;QAEA,QAEN,A,C,Q,C,K,C,C,C,C,C,G,C,4B,C,C;A,E,C,CAEAC,uBhI+kQE/tB;;EgIzqQkD8tB;YA8FhDl4C,ArI4IsB,mCqI3ItB;SAES1H;EACG8/C;YAEZp4C,ArIsIsB,6DqIrItB;OhIi/PFoqB,gBgI9+PApqB,ArIkIwB;8CqIjI1B,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,e,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CAvGAq4C;;E3HuFqB;;;gBC5CI;;;;;;S0H3C2B,A,C,I,C,I,C,C,C,C,C,G,C,sC,C,C,C,C;A,2B,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,4D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,ClDL5B/3C,YAAsB,MAAGwvB,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAqC1vB,cAA+B0vB,KAASrtB,eAA2BqtB,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CACvJziC,YAAkB,MAAGirD,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyCl4C,cAA2Bk4C,KAAc71C,eAAgC61C,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAG/L,cACE71C,kBAA+B81C,YAC/B91C;kBAAgCrM,YAChCqM;kBAAqC+1C,aACvC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,G,C,CAEAjrD,kBAViDuiC;WAY7C,gBAEF;MAAO6E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,K,C,C;A,G,C,CAEApnC,kBAjBiDuiC;WAmB7C,gBAEF;MAAO6E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAEApnC,kBAxBiDuiC;WA0B7C,gBAEF;MAAO6E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAEApnC,kBA/BiDuiC;WAiC7C,gBAEF;MAAO6E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAlCA8jB;;EzE0FqB;;;gBC5CI;;;;;;;SwE9CoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,4B,yD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CmDFrBprD,YAAiB,MAAGqrD,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAgCt4C,cAA0Bs4C,KAAaj2C,eAA+Bi2C,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CACxJnrD,YAAuB,MAAGorD,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAAsCv4C,cAAgCu4C,KAAiBl2C,eAAmCk2C,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CAC1LprD,YAAyB,MAAGqrD,MAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAAwCx4C,cAAkCw4C,KAAmBn2C,eAAqCm2C,QAA0B,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAEhO,wBAEYC,KADmBhoB,kEALiF6nB;KAAaj2C,eAA+Bi2C,QAO5J,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,Q,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CARAI;;E5H6FqB;;;gBC5CI;;;;;;S2HjDyB,A,C,I,C,I,C,C,C,C,C,G,C,oC,C,C,C,C;A,yB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCA1BnF,YAAwB,MAAGoF,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAuC34C,cAAiC24C,KAAWt2C,eAA6Bs2C,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAC7LC;;E7H4FqB;;;gBC5CI;;;;;;S4HhDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCArBz2C,YAAqB,MAAG02C,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAoC74C,cAA8B64C,KAAWx2C,eAA6Bw2C,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAIpL,cACEC,AAAAA,KAL8CD,YAMhD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAE;;E9H0FqB;;;gBC5CI;;;;;;S6H9CoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CC4B7C1pD;4CACgC,MpI8wWI84B;OoI7wW1B3M,yBAEJ,MAAOw9B;mDAIP,MAAOx9B;QAEP,MAAOA,WAEb,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CCnCFy9B;EAGiBC;;+CxB8HZ1wC,wB7Gq98BMwhB,AAAAA,A6Gl+8B6BxhB,2CACpC2wC,QAAoC3wC;;;UwB3GtC;MAAa4U,oBAAmB,UAAa0a,qBAC5BshB;;aAGkB,8BACjCnyB;WACF,6BAEiE,MAEjE;yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;WAEmB;GAEG,AAAhBp6B,iBACmCA,OCwKnCwsD,AzBrIF7X;;GwBlCa,QACX6X,AxBiCF7X;GwB7Be,AAAb30C,eACFysD,KAAiBzsD;GAGfA,eAAsB;EAQF,AAAhBA,QrIwzmBUm8B,AAAAA,mBqIvzmBlB;MAAa5L,aAAmB,UAAa0a,sBACrC,YACNyhB;OAAmB1sD,KAAAA,mBACrB,CACF,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CC+WA2sD,iBACE;eAAuB,AAAhBp8B,kBACEA,QACT;gIAKE,QAEF;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CC7aAvvB;;4CAEI,MAAO4rD;+CAIMC,KAAgBt8B;GAClB,QAAS,iBAGtB,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAcAvvB;;;;MAME2tB;gCAFqBguB;QA8BN;;;IAEbnD,cAAAA;OACUqT,yBAGZ,WACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,yDAGE;gBA2CY,gEA3CM,EAAErT,gBACPA;EACEA,MAAW;EAENsT;qBAAAA;EAAAA;GACdA,WACeA;qBAAAA;EAAAA;GACF,WACSC;GACF;;GAMlB,CAACD,WACY,SACGA;;qBAIkCA,wBACtD;QAAkB,EAAEA,AAAAA,uBAEJA;qBAAAA;EAAAA;EACGA;EAAgB;qBAAhBA;EAAAA;EACgB,QAC7BC;GAEgB;;GnC7DpB5f,0DAIJF;OAAe,gBmC+Db,AAEAK;;YAKY0N,S1B1C0BrG;K0B2CrBqY,UACrB,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAOAC;EzJ6HsBrsD;SyJ3HL,MAKf;mCAAiB,QACFqY;EACS,OAAWA,eAA2B;GAE/C,gBACS,MAEpB6zC;OAAW7zC;qBAKb6zC;OAAW7zC;EACMA,QAAAA,UAAuB,OACxC6zC;;;KAEII;ElIq6BFrb,uCkIp6BFib;EAEqB,IACvB,SAEyBA;;OAEzB;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAyCA;EACMv2B;WACF;aAIuBA,cAGzB;KAAY,UACVoe,AAAAA;EACOpkB,cACT,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C1BzHA48B;QACkBC;;EvHtCD/sD;eACoBA,OAA+B40B;GuHsCpD,QAAS;;;;;qDAuCpBtZ,wB7Gq98BMwhB,AAAAA,A6Gl+8B6BxhB,2CACpC2wC,QAAoC3wC;;sLANtCyxC;UACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeAhtD;+CACKub,wB7Gq98BMwhB,AAAAA,A6Gl+8B6BxhB,2CACpC2wC,QAAoC3wC;;SAWR;SAC0B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,C,C2B1IxDy9B,+BACEloC;KAAAA;EAGIqqC;;4CAA+B;EAGhCA;qBAAD;UAAA;;EACkCA;E1B+BpB;;mBsBvChB8R;KAAYC,AAAAA,WAAoCC;EIuB7BpkD;MAEjBonB,AAAAA;EACOpnB,SAA8B,KAAZA;E1BaX;;c0B3BTqwC,AAAAA,uBAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAkBA1f,WAAiB,oCAAa,A,C;A,E,C,CAE9B;GACM0zB,WD3BuB,SAAkB;EC6BzBrhD;KxImk9BpBgxB,AAAAA,AwInk9BI5M;KAEAA,AAAAA,kDAKFA;mBxI4j9BF4M,AAAAA;kBwI5j9BkBhxB,YAEpB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAMAwxB,WAAuB,oCAAa,A,C;A,E,C,CAEpC;EAGepN;;+CAEQyqB,KAAAA,K3BsBmBrG;;+C2BnBzB8Y;;;;GAMG,SAAW,A1BtCZlS,e0BuCA,CAAA,KAAbkS,WACFC,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CJhEA,etBsBmBnS,csBrBL,MACZ8R,AAAAA;;kCAEF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEuD;EAItCM,ApI0mPR/0B,+CoI1mPmB;SAC1Bg1B;;;EAEAA,QpI2p/BAx5C;gBA/EI,KAAc,KA8EcC,mBA9EW;EoIzk/B3Cu5C,QpIwp/BAx5C;gBA/EI,KAAc,KA8EcC,mBA9EW;;EA/ja/B4C,kCACZzR;oDoIxglBAooD;kBAGA;MAAOC,mBAA0CA,YACnD,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,U,C;A,M,C,CAV0B,YACtBA,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,U,C;A,M,C,CACyB,YACvBA,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAyBFz7C,WAAS,oCAAa,A,C;A,E,C,CAEtB,kBAEEme,SAAAA;0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,kBACUA,KAAAA,UtBvBRorB;KAAAA,URA0BxN;O8ByB5B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAMA2f,WAAsB,oCAAa,A,C;A,E,C,CAEnC,8CACEv9B;OG9D2B,SAAkB,QH+D/C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EACUA,kCtBtCRorB;KAAAA;;;6CsB2CsC,KAAVprB,4CAC1B,MAAA,KAAcw9B,oCAAd,UAAA;;EACuB/S,KAAAA,gDvBAerG;GuBCjB,QAEjBqZ,WAEJ,A9BlDwB7f,O8BsD5B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,M,C,C,E,C,CAWA3rC;;GACmB,AAAbmsB,kBACKA,QAAAA;;aAAP;MAAOA,4BAOSg+B;WACO;EAEVsB,2CACoBt/B,gBACjC;MAAOu/B,sBAEX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAdoC;;;GACpB,CAAA,wDAENzmB,oBACAA;EAAW9Y;;;SAHf;SAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAOoB,wBAAK;MAAM,CAAA,eAAc8Y,eAAW,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,4B,C;A,E,CAW5D0mB,WAAuB,oCAAa,A,C;A,E,C,CAEpC,iBACEC;;GAEIC,gBAA2B;2FpIgqlB3BzlD,KAAuB4wB,wBoIpplBb;6CAAd80B;UAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAluD;EACM+L;;GAAS,0BACIoiD,OACfh+B;;EACOA,kCAAP;qCACkB,8CAClBA;yBACA;MAAkB,MAAXA,uCAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBACM+9B;GAAY,SACdA,cACAA;cAEJ,A,C,Q,C,M,C,C,C,C,C,I,C,C;A,E,C,CAEA,mBACEF;;EAEIjiD;;GAAS,0BACHokB,kCtBtIVorB;KAAAA,mBsBuIoB,kBACVprB,kCtBxIVorB;KAAAA,YsB0IF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,C,CAMAn5C,mCACuB,M9IzFdnC,wB8I0FP;kDACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAxCqC;GAC7BguD,KtB/GK1S,KAAAA,YsB+GmByS,OAC9B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAoCsD,YAAI,SAAG,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,CKpL/DN,WAAuB,eAAc,A,C;A,E,C,CAErC1U;;GACW,CAAA,gBAAmB,CAAA,iBAC1B;ECqC2BmC;QDlC7BrqC;uDACAqqC,AAAAA;;EACO/B;GAAsB;E3B8Bb;;mBsBvChB6T;KAAYC,AAAAA,WAAoCC;;EtBuChC;;qBsBvChBF;KAAYC,AAAAA,WAAoCC;IKSzC/T,UAAP;SAGF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,c,C;A,E,C,CCJAJ;;;0EACE9kC;;gDAEF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA;GACMk6C,cAAmB;EACThV,AAAAA;GACF,QAASiV,QACvB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGA;GACMD,cAAmB,MACvB;MAAoBhV,iBAAAA,WzGmPlB,2CtD+BkCl4C,8B+JlRpC,U/JoRekI;G+JnRD,QAASilD,QACvB,AACAD,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAIA/mD,kBACM+mD;cAA+B,6BAAZA;UACvB,SACF,A,C;A,G,CAOArB;EAA+B5R;QAAH;uDAA4C,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C,C;A,E,C,C;A,G,C,a,C;A,G,CCzCxE4S,WAAwB,eAAc,A,C;A,E,C,CAEtC/U;GACW;;GACA,CAAA,wBAA2B,CAAA,eAClC;EDoC2BmC;QCjC7BrqC;uDACAqqC,AAAAA;;EACO/B;;E7B6BS;;asBvChB6T;KAAYC,AAAAA,WAAoCC,QOUzC/T;UAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,8C,C;A,G,CLIA1f,WAAkB,eAAc,A,C;A,G,CAEhC40B;;QAAgC;6DACd,A,C;A,E,C,CAElBtV;EACc;EAER5gC;wGAGFA;+BAOEA,OAAAA;MAAAA;MAGAm2C;;sBACOnV,AAAAA;uBAAP;;aAEAhhC,OAAAA;MAAAA;MAGAm2C;;sBACOnV,AAAAA;uBAAP;;SAEAhhC,OAAAA;MAAAA;MAGAm2C;;sBACOnV,AAAAA;uBAAP;;QAEA,gDAEN,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;uBAGUhhC;WAAmB,MACvBA;OAAAA;SAAAA;SAGAm2C;SACAnV,AAAAA;sBACA;;eAEIhhC;WAAmB,MACvBA;OAAAA;SAAAA;SAGAm2C;SACAnV,AAAAA;sBACA;;WAEIhhC;WAAmB,MACvBA;OAAAA;SAAAA;SAGAm2C;SACAnV,AAAAA;sBACA;;2CAGA;QAEN,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,iBACOhhC;GAAD,CAACA,MACHA,OACAgR;KAAkBhR,UAEtB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMAqhB;EAEyB;;6CzBpBiB8a;EyBqB1BjN;EAGJA;cAIF6kB,SACN7kB;WAoKEknB;cACUrT;;EACFsT;cAEFp0C,AAAAA,uCACNo0C;WAEFD;MAvKaE,SAEfpC;eAIAqC;SACA;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CAGA38C,WAAU,MAAG48C,SAAM,A,C;A,G,CAqBnBC,WAAoC,MAAGC,SAAgB,A,C;A,G,CAoBvDp1B,yBACEq1B;;EtI678BOhyB,AAAAA,AsI178BKoe;GACF,WACQoR;EACF,QACHsB;cAKFmB;WACW;EAGR1a,gDzBtG0BC,QyBuGxC;MAAe,aACjB,A,C;A,G,CAKA9a,iBACEs1B;;EACOE,OAAP;MAAgB,WAAqB,8BACvC,A,C;A,E,C,CAeAjvD;GAEMkvD,aAA8B,QAElCC;MAGAD;;;;;EAGmB;;;EtIs48BZnyB,AAAAA,A6Gl+8B6BxhB,2CACpC2wC,QAAoC3wC;SyB+FlB;EAMZ6zC;;6CzBnJkC7a,OyBoJtC8a;;EACWA;;;;QAIT,GAEFA,MAA8BC,KADpBC,KAAkCF;GAI9B,QAGdA;UAEAG;KAEAC,KAAUJ,QAGZ;SACF,A,C,Q,C,C,C,M,C,I,C,E,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,a,C,E,C,CAtHAjtD;EACcstD;;+CzBMXn0C,wB7Gq98BMwhB,AAAAA,A6Gl+8B6BxhB,2CACpC2wC,QAAoC3wC;;;KyBOL,QAE/B;MAAa4U,QAAmB,UAAa0a,cAC3C8kB,cAAajB,UACf,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CAoHAtsD;EACYwtD;GtIivNatzB,KAA4B,qBsIhvN3B;EAEhBuzB;cAIFP,AAAAA,uCACJ;OAAOQ,YAAY,YtIkpmBjB;GAAgB,QAElBh0B,iBsIlpmBA,AACA+zB,gBAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CA4BAztD;;EtIi1OSo2B,AsIh1OQ6O,uCACfA,AAAAA;0BAEA;MAAiBA,WAAAA,QAAAA,4B3JLmBnmC,8B2JKpC,U3JHekI;2BqBg08BA2zB,AsI1z8BTsK,WtI0z8BStK;iBACfA;;;kCsItz8BM6yB;EtIqz8BS7yB,AsIrz8BmBsK;EtIqz8BnBtK,iBACfA;oBALAA;;;UsI9y8BA,AAEA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEA36B;EAGgBwtD;MAEZpZ,SACA;OAIF,0BAAgBnP,SAAe,SAC7BmP,SACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CAUAp0C;;EAWM;GACAm6C,QACFwT,WAGFC;UACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAUA5tD,wBAC2B,MACzB6tD;;MtIywOOz3B,oCsIvwOK;oCAEZ3hB,AtI8ibsBzS;6BsI7ibxB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAjCE;GACM,CA1IJgoD,AzBrIF7X,0ByBgRIkb;KAAUnb,gDzBxQ0BC,WyB0QxC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgBmC,YAAI,2BAAM,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CA0B/C5a,iBAAiBu2B,OAAAA;UAAH;YAAa,A,C;A,G,CAE3Bl+C,WAAU,MAAG48C,SAAM,A,C;A,E,CAInB58C,YAAU,MAAGupC,MAAAA,YAAe,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,CAE5BxoC,cACEwoC,KAAAA,cACF,A,C;A,G,CAGAvpC;EACO48C;;yFACI,KAALh5B,iBACF,MAAOg5B,QAET;MAAO,MAAiBA,QAAQh5B,cAClC,A,C;A,E,C,CAQA,kBAvBmBs6B;WAwBL,MAIZA;OAAYnkD,QAEZ6iD;YACAsB;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CChY2B,yBAMzB;eAAe,KAARnnD,iBACEA,SACT;aAGW;2BAGO,eAAkB;qBAMvB0jD;GACF;;;;YAETrT;SAAAA;WAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,G,CAsGAp5C,WAAoB,MAAG0sD,AAAAA,oBAAkB,A,C;A,G,CACzC1sD;EADuB0sD;EAAAA;wBAAAA;GAC0B,KAAVA,+BADhBA;EAC6C,KAAVA,4BAApC;SAAmD,A,C;A,G,CASzEpvC,WAAwB,MAAG6yC,SAAW,A,C;A,E,C,CAWtCjwD;;EAEYwsD;qBAAAA;MAAAA;qBAAAA,SAAV;aAA4BA,MAC9B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEAxsD;EACkCwsD;qBAAAA;EAAjB,KAAiBA,KAChC;kBAAkB,EAAEA,iBACNvkD,MAAe,QAAL;GACZ,uCjJwDZwE;KAA6CA,SiJvDnB;qBAJM+/C;EAIfA;8BjJuDjB//C;KAA6CA,OiJtD7C,AAEA,MjJ+DyBA,MiJ9D3B,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,CAvBAkgD,YAIEsD,QAhBqBzD,AAAAA,mBAgBM0D,WAAoBC,WACjD,A,C,C;A,E,C,C;A,G,C,4D,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA8DAC,0BACEC;;EAEIC;GAAU,SACZA,MACAA;eAGGC;GAAD,IAAc,CAACC,SACjBC,aACA;WAGwBC,QAAcC;IACfC,QAAaC;GAGlC,CAACC,UACa;;iDnCpNlBnkB;OAAe;EmCqOCokB;EAASC,OnCrOzBrkB;OAAe,emCmOG;QAMlB2jB,QAAYW,AAAAA,2BAEZR;QAAcQ,SAChB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA;EACiBC,OACfC;;;wEAGED;iFAKgB,OAAhBA;eAEAA;UAGgB,kDAChBE,QAAW1kB,AAAAA,WAA4B2kB;EAI5B;EACTH;EAAc;E/BpChB9hB,SAAyB1C,YAA8BD;G9HyCpC,AAFHnsC,a6JDM+wD,WAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA53B;;GACY,UAAO,MAzEa63B;EA0EbC;EAAkB;gCAAlBA;EAAAA;GACZlV,WA3EyBiV;;KA6E5B;EAGYpF,A1B5Pd7X;W0B6PqB,QAErB;MAAOmd,MAAwD,AAAL,QAA3BA,AAAAA,kBACjC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAIA;;EAG2BC,QAAsB;EAElC;OACEx7B;OACU,SAAWy7B,QACrBA;;EAIa,Q7JjP5BnxD;K6JiPAgxD;EACaI,KArGiBL;EAsGPM;KAGrB1nC;QACuB,QACvB,MAAA,QAAA,OACEA,eADF,SAEA,CAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA2nC;;;;EAE2BJ,QAAsB;EAC9BA;EACLF;EAAsB,KAAJ;gCAAlBA;EAAAA,IACZA;UAA8B,SAAe,KAAJ,YAE5BI;KAxHiBL,WAyH9B;cAAkB,CAAA,cACLM;;EvI4imBT;GAAgB,QAElBh2B,gBuI3imBA81B;UACF,AACA,qBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;GACMI,QAAQ;EAnIkBR;;;;EAsIbA;;GAEb5B,gBvIqnNmBtzB,KAA4B,AuIrnNhBszB,6BACjChxB,UACA;UAKE,CAACqzB,SACHA;GACa,SACXC,QAAmBpF,OACnBqF;gBAKgB,+BAEpB;gBAAA,YAAA,UAAA,MACE;MAAkBzjB,UAAlB,kBAAA,OACE0jB,M5JrGWhpD,K4JqGYipD,QAA+B,KAAb3jB,aAC3C;EAEeA;6BAAAA;KACjB,AAEA,MAAA,QAAA,UAAA,MACE;gBAAoBA,mBACP,MAAe,KAAbA,SAAeA,YAClB,YAEE0iB,KAAAA;EAEGgB;GAGF,SAAWzqB,KAAAA;EACdA;EACQA;;GAGK,AAAjBuqB,gBACMA;EAEA,QACGV;OAIfc,iBACF,CACF,AAEA,MAAqBF,8B5JtG8Bz6C,KAAAA,MAAoBO,6B4JsGvE,OACEq6C,QAAsB5qB,K5JpETv+B,M4JqEf,CAGF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CA+CA,iBACE;MAAA,QAAA,OAA2BilD,KAA3B,OAA0C,CAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBACMiD;WAAkB,MACtBA;MACAA;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;GACMU,QAAQ,MAEZX;SACA;MAAoBI,YAAF,EAAEA,cAClBc,QAAsBd,KACxB,A7J5VAjxD;;E6J+VIgwD;GAAU,SACZA,MACAA;aAEFgB,AAAAA,eACAQ;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CArPyC,YAAI,UAAK,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAO9CQ;;EACmBrqD;EACHA;GACV,EA5QmB,SAAkB,QA4Qf,MAC1B;oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASE,YAAI,MAAGwoD,WAAc8B,KAAAA,UAAe,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CK9R1CzZ;GAEW,CAAA,eACP,8CAEF0Z;;EACOtZ;EAAkC+B;E9BiCzB;;kB8BjCT/B;UAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,CAMA,kB9BUiB+B,O8BTfhrB;0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,G,CCfAwiC,WAA0B,eAAc,A,C;A,E,C,CAExC3Z;GACW,CAAA,gBAAY;EHsCQmC;QGpC7BrqC;uDACAqqC,AAAAA;;EACO/B;;E/BgCS;;mBsBvChB6T;KAAYC,AAAAA,WAAoCC,QSOzC/T;UAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C,A,E,yC,qD,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,I,C,C,A,E,qC,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,O,C;A,E,C/BeAzf,WAAc,MAAGwhB,SAAK,A,C;A,G,CAGtBnpC,WAAU,MAAG48C,SAAM,A,C;A,E,CAMnB58C,YAAU,MAAGupC,MAAAA,SAAe,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,CAE5BxoC,cACEwoC,KAAAA,WACF,A,C;A,E,C,CAoCA;GA3CmBJ,cA4CL;EAERyX;GAAS,QAASA,MACtBA;YACArX;YACAJ;YACAyT;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CA1CA5V;EAZa4V;;wFAiBF;EAjBEA;MAmBTrT;WAGY,OAAwB,aAApCA;UAGFqX,QAAWrX,AAAAA,0BACXsX;QApBWtX,KAAAA,UAqBb,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAFsC,wBAAI;MAAGsX,MAnBhCtX,KAAAA,OAmBkD,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,kB,+C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CgClD/DuX;;EzI6FqB;;;gBC5CI;;;;;;;SwIjDe,A,C,I,C,I,C,C,C,C,C,G,C,0B,C,C,C,C;A,e,C,C,G,C,C,A,E,mB,gD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCChB5P,YAAU,MAAG6P,MAAK,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,G,C,C;A,G,C,CAAyBhgD,cAAmBggD,KAAQ39C,eAA0B29C,QAAe,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,I,C,G,C,C;A,G,C,CAC/GhM,YAAoB,MAAGzlB,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAmCvuB,cAA6BuuB,KAAWlsB,eAA6BksB,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAIjL,cACEjuB,AAAAA,KANmC0/C,YAOrC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAC;;E1IyFqB;;;gBC5CI;;;;;;SyI7CgB,A,C,I,C,I,C,C,C,C,C,G,C,2B,C,C,C,C;A,gB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E;A;A;A;A;A,U,C,C,C,C,C;A;A;A,U,C,C,C,C,C;A;A;A;A,W,C,C,C,C,C;A;A,W,C,C,C,C,C;A;A,W,C,C,C,C,C;A;A;A;A,W,C,C,C,C,C;A;A,W,C,C,C,C,C;A;A;A;A;A;A;A;A;A,W,C,C,C,E,C;A;A;A;A,W,C,C,C,E,C;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,W,C,I,C,I,C;A;A,W,C,I,C,I,C;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,W,C,I,C;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,gB,C,I,C,I,C,I,C,C,I,C,I,C,C;A,gB,C,I,C,I,C,G,C,C,C,C,C,I,C,C,C,C,C,C,C;A,gB,C,I,C,I,C,I,C,C,I,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,C,C,U,C,C,C,C,C,C,M,C,C,C,E,C,S;A,M,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,C,E,I,C,M,C,C;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,W,E,K,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,C,C,U,C,C,C,C,C,C,M,C,C,C,E,C,S;A,M,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,C,C,U,C,C,C,C,C,C,M,C,C,C,E,C,S;A,M,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,C,E,I,C,M,C,C;A,E,C,C,C,W,E,K,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,C,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,C,E,C,I,C,K,C,C,C,E,C,C,M,C,C,C,E,C,S;A,M,C,C,C,E,C,S,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C,C,E,C,S;A,E,C,M,C,C,E,S,C,M,C,C,C,E,C,S;A,E,C,C,C,W,E,K,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,C,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,E,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,E,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C,C,G,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,C,C,W,E,K,E,M,C,C,E,Q,E,I,C,C,C,C,C,yB,C,C,C,E,C,C,G,C,G,C,E,C,C,C,C,M,C,M,C,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,C,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,C,E,I,C,M,C,C,E,I;A,E,C,M,C,C,E,Q,C,M,C,C,E,I,E,C,G,C;A,M,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,E,C,C,C,C,W,E,K,E,I,C,C,C,C,C,yB,C,C,C,E,C,C,C,c,E,C,G,C,G,C,E,C,C,C,C,M,C,M,C,C,C,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C,C,G,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,C,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,G,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,G,C,C;A,C,C,E,C,I,G,C,C;A,C,C,G,C,I,K,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,K,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,K,C,W,C;A,C,C,E,C,I,K,C,M,C;A,C,C,E,C,I,K,C,Q,C;A,C,C,E,C,I,K,C,Q,C;A,C,C,E,C,I,K,C,K,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,G,C,I,I,C,wB,C;A,C,C,E,C,I,I,C,qB,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,G,C,I,I,C,c,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,G,C,I,I,C,c,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,G,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,S,C;A,C,C,G,C,I,I,C,c,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,qB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,yB,C;A,C,C,E,C,I,I,C,oB,C;A,C,C,E,C,I,I,C,U,C;A,C,C,G,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,a,C;A,C,C,G,C,I,I,C,c,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,S,C;A,C,C,G,C,I,I,C,a,C;A,C,C,G,C,I,I,C,e,C;A,C,C,E,C,I,I,C,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,C,C,E,C,I,I,C,Q,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,O,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,O,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,Y,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,O,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,M,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,S,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,W,C,C,M,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,G,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,G,C,S;A,C,C,E,C,G,C,S;A,C,C,E,C;;;C;A,C,C,E,C;A;A,C,C,E,C;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;;;C;A,C,C,E,C,I,I,C,I,C,I,C;A,C,C,E,C,I,K,C,I,C;A,C,C,E,C,I,I,C,I,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,O,C,G,C;A,C,C,E,C,I,I,C,M,C,G,C;A,C,C,E,C,I,I,C,M,C,G,C;A,C,C,E,C,I,I,C,Q,C,I,C;A,C,C,E,C,I,I,C,S,C,G,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C;;;;;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,C,C,C,C,K,C,I,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,K,C,I,C,K,C,I,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,K,C,K,C,K,C,K,C,C;A,C,C,E,C,C,C,gB,C,C,Q,C,S,C,S,C,Q,C,M,C,C;A,C,C,E,C,C,C,gB,C,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,G,C,C;A,C,C,E,C,C,C,gB,C,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,gB,C,C,C,C;A,C,C,E,C,C,C,gB,C,C,I,C,M,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,K,C,K,C,K,C,K,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,K,C,K,C,K,C,K,C,K,C,C;A,C,C,E,C,C,C,gB,C,C,E,C,E,C,E,C,E,C,G,C,G,C,C;A,C,C,E,C,C,C,gB,C,C,S,C,K,C,U,C,Q,C,U,C,O,C,I,C,O,C,I,C,O,C,I,C,C;A,C,C,E,C,I,K,C,E,C,C,O,C,I,C,G,C,I,C,Q,C,I,C,M,C,I,C,Q,C,I,C,K,C,I,C,E,C,I,C,K,C,I,C,E,C,I,C,K,C,I,C,E,C,I,C,C,C,C,E,C;A,C,C,E,C,C,C,gB,C,C,sB,C,oB,C,qB,C,a,C,Y,C,c,C,oB,C,gB,C,a,C,kB,C,iB,C,U,C,U,C,Y,C,S,C,c,C,C;A,C,C,E,C,I,K,C,E,C,C,oB,C,sB,C,kB,C,oB,C,mB,C,qB,C,W,C,a,C,U,C,Y,C,Y,C,oB,C,kB,C,0B,C,c,C,sB,C,W,C,U,C,gB,C,wB,C,e,C,uB,C,Q,C,gB,C,Q,C,gB,C,U,C,kB,C,O,C,e,C,Y,C,oB,C,C,C,C,E,C;A,C,C,E,C,C,C,gB,C,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,I,C,I,C,G,C,G,C,G,C,I,C,I,C,I,C,G,C,I,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,C;A,C,C,E,C,I,K,C,E,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,I,C,C,C,I,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,I,C,C,C,I,C,C,C,I,C,C,C,G,C,C,C,I,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,C,C,C,E,C;A,C,C,G,C,C,C,gB,C,C,M,C,S,C,a,C,U,C,Y,C,C;A,C,C,E,C,I,K,C,C,C,C,I,C,C,C,O,C,C,C,W,C,C,C,Q,C,C,C,U,C,C,C,C,C,C,G,C;A,C,C,G,C,C,C,gB,C,C,W,C,C;A,C,C,E,C,I,K,C,C,C,C,S,C,M,C,C,C,C,G,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,oB,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,I,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,sB,C;A,C,C,E,C,I,I,C,yB,C;A,C,C,E,C,I,I,C,yB,C;A,C,C,E,C,I,I,C,8B,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,uB,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,I,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,C,S;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,G,C,G,C,C,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,G,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,Q,C;A,C,C,E,C,C,C,E,C,K,C;A,C,C,E,C,C,C,E,C,K,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,Q,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,K,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,M,C;A,C,C,E,C,C,C,E,C,M,C;A,C,C,E,C,C,C,E,C,S,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,C,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,C,C,E,C,I,I,C,M,C,C,M,C;A,uB;A,C,C,E,C,iB;A,C,C,E,C,mB;A,C,C,E,C,C;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,C,C;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,C,C,E;A,C,C,E,C,C;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,C,C;A,C,C,E,C,C,C,E;A,C,C,E,C,C;A,C,C,E,C,C;A,C,C,E,C,I;A,C,C,E,C,C,C;A,C,C,E,C,C;A,C,C,E,C,C,C;A,C,C,E,C,U;A,C,C,E,C,I;A,C,C,E,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,M,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,M,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,G,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C;A,C,C,E,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,E,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,K,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,G,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,E,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,E,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,G,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,C9J6bvCC,sCAA0C,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CAC1CC,sBAA4C,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CAC5CC,sBAA4C,A,C;A,C,C,K,C,C,C,0B,C,I,C,I,C,Q,C,CAC3CC,oCAC8C,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAQnCC,OAAaC,QAAkB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAGnBrwD,oCAA6B,A,C;A,C,C,K,C,C,C,qB,C,I,C,I,C,Q,C,CFmrBzBswD,OAC1BC,MAAeC,yDAA2C,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CAIhCC,OAC1BF,MAAeC,yEAAyD,A,C;A,C,C,K,C,C,C,iB,C,I,C,I,C,Q,C,CAI9CE,OAC1BH,MAAeC,YAAkC,A,C;A,C,C,K,C,C,C,wB,C,I,C,I,C,Q,C,CAIvBG,OAC1BJ;;;;;;;KAAuC,A,C;A,C,C,K,C,C,C,sB,C,I,C,I,C,Q,C,CAIbK,OAC1BL,MAAeC,cAAoC,A,C;A,C,C,K,C,C,C,6B,C,I,C,I,C,Q,C,CAIzBK,OAC1BN;;;;;;;KAA4C,A,C;A,C,C,K,C,C,C,qB,C,I,C,I,C,Q,C,CAIlBO,OAC1BP,MAAeQ,YAAsC,A,C;A,C,C,K,C,C,C,4B,C,I,C,I,C,Q,C,CAI3BC,OAC1BT;;;;;;KAA2C,A,C;A,C,C,K,C,C,C,0B,C,I,C,I,C,Q,C,CAIjBU,OAC1BV,MAAeQ,cAAwC,A,C;A,C,C,K,C,C,C,iC,C,I,C,I,C,Q,C,CAI7BG,OAC1BX;;;;;;KAAgD,A,C;A,C,C,K,C,C,C,qB,C,I,C,I,C,Q,C,C+BzqC/ChgB,OAAsB,qBAO3B,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CnC8sBYz8B,UAAyB,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CcvtBjBq9C,iBTgBVliD,iKSMU,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CyBiCMmiD,uBACkB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAClBC,uBAAiD,A,C;A,C,C,K,C,C,C,iB,C,I,C,I,C,Q,C,CAE7B15C,OAC1C25C,QAAuB,A,C;A,C,C,K,C,C,C,uB,C,I,C,I,C,Q,C,CA2aRp5C,+BjCndgB5Y,sBiCmd2B,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CEjetCyM,OACtBwlD,4BAA6D,A,C;A,C,C,K,C,C,C,iB,C,I,C,I,C,Q,C,CAIvC12C,OACtB22C,cAAmC,A,C;A,C,C,K,C,C,C,oB,C,I,C,I,C,Q,C,CAIbz7C,OACtBw7C,kCAAkE,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CiB3BlEtoC,OAAoB,YAAqB,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CHwD/BnV,UAAyB,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CzBmqBjB+D,iBzBjsBV5I,gLyBytBF,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CT+9COwiD,mBAAiC,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CAu4TnCr3B,OjBv8UNl6B,4iBAA8B,gCiBs9UrC,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,CF5gYasC,OAAUo6B,qCAA0C,A,C;A,C,C,K,C,C,C,4B,C,I,C,I,C,Q,C,CAmWtD80B,gDACiC,A,C;A,C,C,K,C,C,C,6B,C,I,C,I,C,Q,C,CACjCC,iDACkC,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CkFnZhCC,yBAAgC,A,C;A,C,C,K,C,C,C,sB,C,I,C,I,C,Q,C,CAChCC,mBAAoC,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CrFqMhBpqB,aZ65C1BvnC,QAA8B,4CY75CwB,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,C0GjKlDyqC,OAAU,+BAAkC,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CCmHnDmnB,OAAa36C,YAAmB,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CI8IhCq2B,OAAc,qBAQlB,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CAEIukB,iB1HrUM9iD,gC0HqU0B,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,CAUzB07B,OAAU,8BAAiC,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CEkG9C0E,OAAe,+BAAsB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAKrCC,OAAY,+BAAoC,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAQhDZ,OAAa,qCAA0C,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CAYvDgD,OAAgB,+BAAoC,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CAKxDsgB,OAAc76C,YAAmB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAuH1Bi4B,OAAY,4BAA+B,A,C;A,C,C,K,C,C,C,2B,C,I,C,I,C,Q,C,CA6BlDoI,OAA4B,sBAMhC,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CvG7lBaya,iBrBZHhjD,6CqBY6C,A,C;A,C,C,K,C,C,C,gB,C,I,C,I,C,Q,C,CAuB1BijD,OcIpB,4BAAA;;mBdHoC,A,C;A,C,C,K,C,C,C,Q,C,I,C,I,C,Q,C,CAItBzjB,sByB3DG,oBzB2DoB,A,C;A,C,C,K,C,C,C,gB,C,I,C,I,C,Q,C,CAq4BzB0jB,gBAAwB,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CAiGlChb,OAAc,yBAA4B,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAC1CE,OAAa,wBAA2B,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CACxChB,OAAa,wBAA2B,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CACxCL,OAAW,sBAAyB,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CAEnCpG,oCAAmC,A,C;A,C,C,K,C,C,C,kB,C,I,C,I,C,Q,C,CFn+BpC99B,OACT2+B,eAA2Bx/B,KAAAA,6BAAoB,A,C;A,C,C,K,C,C,C,O,C,I,C,I,C,Q,C,CAoD7CmhD,OAAQt0B,cAAsBhmB,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CAI9B64B,OAAW7S,AAAAA,AAAAA,uBAA0C3K,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAE9C6d,OAAa,wBAA2B,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,C6GnI/C6H,OAAgB,qBAoBpB,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,CCYWlO,OAAU,6BAAgC,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CGpBjDyR,OrIooDGl8C,0NAA8B,gCqIlnDvC,A,C;A,C,C,K,C,C,C,kB,C,I,C,I,C,Q,C,CAEMi8C,OrIgnDGj8C,qDAA8B,gCqI5mDvC,A,C;A,C,C,K,C,C,C,wB,C,I,C,I,C,Q,C,ClBmJsB4gD,iBlH/JV7xC,0CkH+J6D,A,C;A,C,C,K,C,C,C,uB,C,I,C,I,C,Q,C,CACnD4xC,iBlHhKV5xC,2CkHgK6D,A,C;A,C,C,K,C,C,C,oB,C,I,C,I,C,Q,C,CkC1KrC65C,OAAqB,qBAiBrD,A,C;A,C,C,K,C,C,C,gB,C,I,C,I,C,Q,C,CE6NW8D,oCAA6B,A,C;A,C,C,K,C,C,C,uB,C,I,C,I,C,Q,C,CAC7BpB,oCAAoC,A,C;A,C,C,K,C,C,C,wB,C,I,C,I,C,Q,C,CA4G7B6G,OACH,aACbpJ,AAAAA,KAAAA,sCAAiE,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CzBpMzDc,kDAAyC,A,C;A;A,I,C,e,C,C,C;e,G,C,I,C,I,C,I,C,I,C,I,C,Q,C,a,C,O,C,W,C,c,C,M,C,M,C,U,C,S,C,U,C,O,C,Q,C,G,C,K,C,S,C,G,C,Q,C,O,C,Y,C,sB,C,Q,C,Q,C,O,C,a,C,O,C,Y,C,W,C,O,C,O,C,K,C,O,C,S,C,S,C,c,C,O,C,U,C,K,C,qB,C,gB,C,W,C,U,C,O,C,I,C,Y,C,e,C,Q,C,S,C,mB,C,M,C,M,C,M,C,M,C,O,C,W,C,gB,C,U,C,a,C,c,C,e,C,W,C,U,C,Y,C,M,C,Y,C,gB,C,wB,C,K,C,e,C,Q,C,U,C,kB,C,C,gB,C,O,C,Y,C,c,C,W,C,S,C,Q,C,S,C,G,C,G,C,W,C,S,C,a,C,G,C,c,C,K,C,K,C,kB,C,a,C,O,C,S,C,W,C,e,C,Q,C,Q,C,U,C,O,C,M,C,I,C,uB,C,G,C,qB,C,W,C,U,C,G,C,c,C,S,C,e,C,gB,C,O,C,K,C,W,C,K,C,U,C,K,C,U,C,O,C,G,C,S,C,U,C,M,C,O,C,S,C,Q,C,+B,C,W,C,a,C,S,C,W,C,Y,C,M,C,e,C,O,C,Y,C,Q,C,oB,C,gB,C,U,C,K,C,c,C,M,C,W,C,U,C,qB,C,iC,C,4C,C,O,C,Y,C,U,C,W,C,S,C,c,C,Q,C,U,C,qD,C,M,C,Q,C,6C,C,8D,C,K,C,wE,C,6D,C,qF,C,+F,C,uD,C,qE,C,+C,C,M,C,gC,C,gE,C,e,C,Y,C,O,C,qC,C,G,C,gC,C,O,C,G,C,Q,C,M,C,S,C,+B,C,a,C,I,C,qC,C,iB,C,mC,C,+B,C,0F,C,M,C,Q,C,O,C,iB,C,U,C,W,C,K,C,M,C,M,C,I,C,E,C,gB,C,M,C,U,C,a,C,+B,C,e,C,K,C,Y,C,iB,C,Q,C,U,C,gB,C,c,C,U,C,O,C,M,C,K,C,a,C,sC,C,U,C,U,C,U,C,gB,C,G,C,a,C,M,C,a,C,U,C,iB,C,W,C,O,C,oC,C,K,C,S,C,c,C,Y,C,K,C,U,C,Q,C,W,C,M,C,M,C,c,C,S,C,S,C,O,C,K,C,O,C,Q,C,U,C,U,C,O,C,M,C,M,C,wB,C,Y,C,M,C,O,C,O,C,K,C,S,C,M,C,S,C,W,C,c,C,G,C,M,C,G,C,uC,C,a,C,G,C,Y,C,U,C,O,C,O,C,iB,C,I,C,S,C,S,C,U,C,G,C,W,C,I,C,I,C,Q,C,Q,C,Y,C,a,C,W,C,M,C,W,C,mB,C,U,C,Y,C,O,C,U,C,M,C,W,C,W,C,Y,C,M,C,Q,C,S,C,S,C,S,C,S,C,S,C,Q,C,U,C,S,C,Q,C,e,C,iB,C,mB,C,Y,C,e,C,uB,C,W,C,S,C,W,C,U,C,U,C,U,C,U,C,c,C,c,C,Q,C,Y,C,E,C,W,C,C,C,E,C,U,C,gB,C,K,C,kB,C,Q,C,Q,C,M,C,W,C,M,C,4B,C,W,C,e,C,2B,C,2B,C,G,C,I,C,I,C,oB,C,I,C,K,C,uB,C,oB,C,uB,C,mB,C,kC,C,iC,C,W,C,O,C,K,C,O,C,I,C,U,C,S,C,M,C,U,C,I,C,e,C,oB,C,I,C,uB,C,M,C,I,C,I,C,I,C,I,C,sC,C,K,C,I,C,oB,C,uB,C,K,C,G,C,oB,C,uB,C,G,C,2C,C,K,C,2C,C,I,C,Q,C,M,C,I,C,S,C,uB,C,4B,C,gB,C,I,C,S,C,4B,C,c,C,I,C,a,C,Y,C,G,C,gC,C,uB,C,gC,C,+B,C,0B,C,S,C,2C,C,gC,C,kC,C,S,C,S,C,S,C,e,C,Y,C,Y,C,c,C,gB,C,Q,C,Q,C,U,C,4B,C,M,C,sC,C,Y,C,W,C,Y,C,Q,C,M,C,U,C,M,C,S,C,Q,C,G,C,U,C,Q,C,M,C,M,C,M,C,gC,C,0B,C,kB,C,c,C,S,C,+B,C,+B,C,Q,C,U,C,c,C,M,C,W,C,I,C,I,C,gC,C,O,C,gC,C,M,C,qC,C,Y,C,qC,C,M,C,Q,C,gC,C,O,C,K,C,Q,C,W,C,W,C,U,C,Q,C,K,C,K,C,sC,C,I,C,sD,C,yD,C,oB,C,uB,C,iC,C,K,C,I,C,I,C,K,C,I,C,+B,C,K,C,oB,C,uC,C,O,C,iD,C,S,C,sC,C,W,C,a,C,uC,C,sC,C,O,C,uC,C,iC,C,W,C,K,C,U,C,I,C,gC,C,4B,C,+B,C,U,C,K,C,4B,C,sC,C,Q,C,I,C,I,C,I,C,I,C,+B,C,2C,C,I,C,I,C,I,C,Y,C,I,C,I,C,K,C,oB,C,mB,C,K,C,K,C,U,C,K,C,uB,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,oB,C,uB,C,K,C,0C,C,+B,C,M,C,O,C,+B,C,O,C,+B,C,I,C,4B,C,yD,C,+B,C,6B,C,6B,C,W,C,W,C,S,C,iB,C,S,C,Y,C,Q,C,W,C,a,C,gB,C,oC,C,gB,C,wC,C,S,C,Q,C,iC,C,kB,C,M,C,G,C,uC,C,G,C,K,C,gC,C,M,C,qC,C,G,C,M,C,M,C,Y,C,Q,C,C,C,uB,C,K,C,I,C,U,C,oB,C,uB,C,0B,C,6B,C,K,C,I,C,+B,C,K,C,oB,C,oB,C,uB,C,4B,C,oB,C,uB,C,W,C,U,C,a,C,U,C,c,C,e,C,8B,C,S,C,W,C,iC,C,U,C,oB,C,oB,C,uB,C,oB,C,uB,C,gB,C,O,C,O,C,Y,C,+B,C,qB,C,wB,C,O,C,O,C,a,C,a,C,a,C,c,C,S,C,I,C,oB,C,uB,C,K,C,I,C,oB,C,uB,C,K,C,oB,C,K,C,I,C,S,C,I,C,I,C,K,C,K,C,G,C,a,C,8B,C,oC,C,Q,C,e,C,wC,C,sB,C,I,C,wB,C,K,C,E;A;A;A;;;;A;;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,C,Q,C,C,C,Q,C,M,C,C,C,C,I,C,C,C,C;A,C,C,C,C,C,C;A,M,C,M,C,I,C,mB,C,C,C,C,C,C,C,C,I,C,a,C,Q,C,C,C,C,M,C,M,C,U,C,C,C,I,C,U,C,C;A,I,C,C,uB;A,I,C,C,M,C,C,C,E,C,M,C,C,C,C,M,C,M,C,I,C,C;A,I,C,C,Q;A,G,C,I,C,C,C,C,C,C,E,C,C,Q,C,M,C,C,C,G,C,C,C,G,C;A,E,C,C,C,Q,C,E,C,C,C,C,C,C,C,Q,C,C,C;A,I,C,U,C,Q;A,K,C,C,C,C,C;A,I,C,oB,C,I,C,a,C,iB,C;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gB;A"
 }
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index f51ef56..c82f94d 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -288,7 +288,7 @@
         font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
-    <div>
+    <span>
       <template if="{{ isUnexpected(ref.serviceType) }}">
         unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
@@ -298,24 +298,30 @@
       </template>
 
       <template if="{{ isNull(ref.serviceType) }}">
-        <div title="{{ hoverText }}">{{ ref['preview'] }}</div>
+        <div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
       </template>
 
       <template if="{{ (isString(ref.serviceType) ||
                         isBool(ref.serviceType) ||
                         isInt(ref.serviceType)) ||
                         isDouble(ref.serviceType)) }}">
-        <a href="{{ url }}">{{ ref['preview'] }}</a>
+        <a href="{{ url }}">{{ ref['valueAsString'] }}</a>
       </template>
 
-      <template if="{{ isClosure(ref.serviceType) }}">
+      <template if="{{ (isType(ref.serviceType)) }}">
+        <a href="{{ url }}">{{ ref['user_name'] }}</a>
+      </template>
+
+      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
+                       ref['closureFunc'] != null}}">
         <a href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
           {{ ref['closureFunc']['user_name'] }}
         </a>
       </template>
 
-      <template if="{{ isInstance(ref.serviceType) }}">
+      <template if="{{ isInstance(ref.serviceType) &amp;&amp;
+                       ref['closureFunc'] == null}}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
@@ -348,8 +354,7 @@
           </div>
         </curly-block>
       </template>
-
-    </div>
+    </span>
   </template>
   
 </polymer-element>
@@ -434,22 +439,27 @@
 
 
 <polymer-element name="field-ref" extends="service-ref">
-<template>
-<div>
-  <template if="{{ ref['final'] }}"> final </template>
-  <template if="{{ ref['const'] }}"> const </template>
-  <template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp; !ref['final'] &amp;&amp; !ref['const']) }}">
-  var
+  <template>
+    <div>
+      <template if="{{ ref['static'] }}">static</template>
+      <template if="{{ ref['final'] }}">final</template>
+      <template if="{{ ref['const'] }}">const</template>
+      <template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp;
+                        !ref['final'] &amp;&amp; !ref['const']) }}">
+        var
+      </template>
+      <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
+        <instance-ref ref="{{ ref['declared_type'] }}"></instance-ref>
+      </template>
+      <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+    </div>
   </template>
-  <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
-  </template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</div>
-</template>  </polymer-element><polymer-element name="function-ref" extends="service-ref">
+  
+</polymer-element>
+<polymer-element name="function-ref" extends="service-ref">
   <template><!-- These comments are here to allow newlines.
      --><template if="{{ qualified &amp;&amp; !hasParent &amp;&amp; hasClass }}"><!--
-       --><class-ref ref="{{ ref['class'] }}"></class-ref>.</template><!--
+       --><class-ref ref="{{ ref['owner'] }}"></class-ref>.</template><!--
      --><template if="{{ qualified &amp;&amp; hasParent }}"><!--
        --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
           </function-ref>.<!--
@@ -520,7 +530,7 @@
         <div class="memberItem">
           <div class="memberName">script</div>
           <div class="memberValue">
-            <script-ref ref="{{ cls['script'] }}" line="{{ cls['line'] }}">
+            <script-ref ref="{{ cls['script'] }}" pos="{{ cls['tokenPos'] }}">
             </script-ref>
           </div>
         </div>
@@ -623,9 +633,14 @@
   
 </polymer-element>
 <polymer-element name="code-ref" extends="service-ref">
-<template>
-  <a href="{{ url }}">{{ name }}</a>
-</template>
+  <template>
+    <template if="{{ code.isDartCode }}">
+      <a href="{{ url }}">{{ name }}</a>
+    </template>
+    <template if="{{ !code.isDartCode }}">
+      <span>{{ name }}</span>
+    </template>
+  </template>
 
 </polymer-element><polymer-element name="code-view" extends="observatory-element">
   <template>
@@ -745,8 +760,56 @@
   </template>
   
 </polymer-element>
+<polymer-element name="eval-link">
+  <template>
+    <style>
+      .idle {
+        color: #0489c3;
+        cursor: pointer;
+      }
+      .busy {
+        color: #aaa;
+        cursor: wait;
+      }
+    </style>
+
+    <template if="{{ busy }}">
+      <span class="busy">[evaluate]</span>
+    </template>
+    <template if="{{ !busy }}">
+      <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
+    </template>
+    <template if="{{ result != null }}">
+      = <instance-ref ref="{{ result }}"></instance-ref>
+    </template>
+
+  </template>
+  
+</polymer-element>
 <polymer-element name="field-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
@@ -761,103 +824,245 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-          <template if="{{ field['static'] }}">static</template>
-          <template if="{{ field['final'] }}">final</template>
-          <template if="{{ field['const'] }}">const</template>
-          {{ field['user_name'] }} ({{ field['name'] }})
-          <class-ref ref="{{ field['owner'] }}"></class-ref>
+    <div class="content">
+      <h1>
+        <template if="{{ field['static'] }}">static</template>
+        <template if="{{ field['final'] }}">final</template>
+        <template if="{{ field['const'] }}">const</template>
+        <template if="{{ (field['declared_type']['name'] == 'dynamic' &amp;&amp;
+                         !field['final'] &amp;&amp; !field['const']) }}">
+          var
+        </template>
+        <template if="{{ (field['declared_type']['user_name'] != 'dynamic') }}">
+          {{ field['declared_type']['user_name'] }}
+        </template>
+        {{ field['user_name'] }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">owner</div>
+          <div class="memberValue">
+            <template if="{{ field['owner'].serviceType == 'Class' }}">
+              <class-ref ref="{{ field['owner'] }}"></class-ref>
+            </template>
+            <template if="{{ field['owner'].serviceType != 'Class' }}">
+              <library-ref ref="{{ field['owner'] }}"></library-ref>
+            </template>
+          </div>
         </div>
-        <div class="panel-body">
-        <template if="{{ field['guard_class'] == 'dynamic'}}">
-          <div class="alert alert-danger">
-            Field has been assigned multiple types. If a field is only ever
-            assigned a single type, performance may improve.
+        <div class="memberItem">
+          <div class="memberName">script</div>
+          <div class="memberValue">
+            <script-ref ref="{{ field['script'] }}"></script-ref>
+          </div>
+        </div>
+        <template if="{{ !field['static'] }}">
+          <div class="memberItem" title="The types observed for this field at runtime.  Fields that are observed to have a single type at runtime or to never be null may allow for additional optimization.">
+            <div class="memberName">observed types</div>
+            <div class="memberValue">
+              <template if="{{ field['guard_class'] == 'dynamic' }}">
+                various
+              </template>
+              <template if="{{ field['guard_class'] == 'unknown' }}">
+                none
+              </template>
+              <template if="{{ field['guard_class'] != 'unknown' &amp;&amp;
+                            field['guard_class'] != 'dynamic' }}">
+                <class-ref ref="{{ field['guard_class'] }}"></class-ref>
+                <template if="{{ field['guard_nullable'] }}">
+                  — null observed
+                </template>
+                <template if="{{ !field['guard_nullable'] }}">
+                  — null not observed
+                </template>
+              </template>
+            </div>
           </div>
         </template>
-        <template if="{{ (field['guard_class'] != 'dynamic') &amp;&amp; (field['guard_class'] != 'unknown') }}">
-          <div class="alert alert-success">Field has monomorphic type</div>
-          <template if="{{ (field['guard_class'] != 'dynamic') &amp;&amp;
-                        field['guard_nullable'] }}">
-            <div class="alert alert-info">
-              Field has been assigned null. If a field is never assigned null,
-              performance may improve.
+        <template if="{{ field['value'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">static value</div>
+            <div class="memberValue">
+              <instance-ref ref="{{ field['value'] }}"></instance-ref>
             </div>
-          </template>
-          <blockquote>
-            <class-ref ref="{{ field['guard_class'] }}"></class-ref>
-          </blockquote>
+          </div>
         </template>
-        </div>
       </div>
     </div>
-  </div>
+  </template>
+  
+</polymer-element>
+<polymer-element name="script-inset" extends="observatory-element">
+  <template>
+    <style>
+      .sourceInset {
+        padding-left: 15%;
+        padding-right: 15%;
+      }
+      .grayBox {
+        width: 100%;
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+     }
+    </style>
+    <div class="sourceInset">
+      <content></content>
+      <div class="grayBox">
+        <template if="{{ coverage == true }}">
+          <table>
+            <tbody>
+              <tr template="" repeat="{{ line in lines }}">
+                <td style="{{ hitStyle(line) }}"><span>  </span></td>
+                <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
+                <td>&nbsp;</td>
+                <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
+              </tr>
+            </tbody>
+          </table>
+        </template>
+        <template if="{{ coverage == false }}">
+          <table>
+            <tbody>
+              <tr template="" repeat="{{ line in lines }}">
+                <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
+                <td>&nbsp;</td>
+                <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
+              </tr>
+            </tbody>
+          </table>
+        </template>
+      </div>
+    </div>
   </template>
   
 </polymer-element>
 <polymer-element name="function-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
-      <template if="{{ function['owner']['type'] == '@Class' }}">
+      <template if="{{ function['owner'].serviceType == 'Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
         <class-nav-menu cls="{{ function['owner'] }}"></class-nav-menu>
       </template>
-      <template if="{{ function['owner']['type'] == '@Library' }}">
+      <template if="{{ function['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
       <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-          {{ function['user_name'] }} ({{ function['name'] }})
-          <class-ref ref="{{ function['class'] }}"></class-ref>
-        </div>
-        <div class="panel-body">
-          <div>
-          <code-ref ref="{{ function['code'] }}"></code-ref>
-          <code-ref ref="{{ function['unoptimized_code'] }}"></code-ref>
+    <div class="content">
+      <h1>function {{ qualifiedName }}</h1>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">kind</div>
+          <div class="memberValue">
+            <template if="{{ function['is_static'] }}">static</template>
+            <template if="{{ function['is_const'] }}">const</template>
+            {{ kind }}
           </div>
-          <table class="table table-hover">
-            <tbody>
-              <tr>
-                <td>static</td><td>{{ function['is_static'] }}</td>
-              </tr>
-              <tr>
-                <td>Const</td><td>{{ function['is_const'] }}</td>
-              </tr>
-              <tr>
-                <td>Optimizable</td><td>{{ function['is_optimizable'] }}</td>
-              </tr>
-              <tr>
-                <td>Inlinable</td><td>{{ function['is_inlinable'] }}</td>
-              </tr>
-              <tr>
-                <td>Kind</td><td>{{ function['kind'] }}</td>
-              </tr>
-              <tr>
-                <td>Usage Count</td><td>{{ function['usage_counter'] }}</td>
-              </tr>
-              <tr>
-                <td>Optimized Call Site Count</td><td>{{ function['optimized_call_site_count'] }}</td>
-              </tr>
-              <tr>
-                <td>Deoptimizations</td><td>{{ function['deoptimizations'] }}</td>
-              </tr>
-            </tbody>
-          </table>
         </div>
-      </div>
+        <template if="{{ function['parent'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">parent function</div>
+            <div class="memberValue">
+              <function-ref ref="{{ function['parent'] }}"></function-ref>
+            </div>
+          </div>
+        </template>
+        <div class="memberItem">
+          <div class="memberName">owner</div>
+          <div class="memberValue">
+            <template if="{{ function['owner'].serviceType == 'Class' }}">
+              <class-ref ref="{{ function['owner'] }}"></class-ref>
+            </template>
+            <template if="{{ function['owner'].serviceType != 'Class' }}">
+              <library-ref ref="{{ function['owner'] }}"></library-ref>
+            </template>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">script</div>
+          <div class="memberValue">
+            <script-ref ref="{{ function['script'] }}" pos="{{ function['tokenPos'] }}">
+            </script-ref>
+          </div>
+        </div>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ function['code'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">optimized code</div>
+            <div class="memberValue">
+              <code-ref ref="{{ function['code'] }}"></code-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ function['unoptimized_code'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">unoptimized code</div>
+            <div class="memberValue">
+              <code-ref ref="{{ function['unoptimized_code'] }}"></code-ref>
+            </div>
+              <div class="memberValue">
+                <span title="This count is used to determine when a function will be optimized.  It is a combination of call counts and other factors.">
+                  (usage count: {{ function['usage_counter'] }})
+                </span>
+             </div>
+           </div>
+         </template>
+         <div class="memberItem">
+           <div class="memberName">deoptimizations</div>
+           <div class="memberValue">{{ function['deoptimizations'] }}</div>
+         </div>
+         <div class="memberItem">
+           <div class="memberName">optimizable</div>
+           <div class="memberValue">{{ function['is_optimizable'] }}</div>
+         </div>
+         <div class="memberItem">
+           <div class="memberName">inlinable</div>
+           <div class="memberValue">{{ function['is_inlinable'] }}</div>
+         </div>
+         <template if="{{ function.name != function.vmName }}">
+           <div class="memberItem">
+             <div class="memberName">vm name</div>
+             <div class="memberValue">{{ function.vmName }}</div>
+           </div>
+         </template>
+       </div>
     </div>
-  </div>
+
+    <hr>
+    <script-inset script="{{ function['script'] }}" pos="{{ function['tokenPos'] }}" endpos="{{ function['endTokenPos'] }}">
+    </script-inset>
+
+    <br>
   </template>
   
 </polymer-element>
@@ -893,9 +1098,7 @@
 
       <div class="col-md-1">{{ isolate.mainPort }}</div>
 
-      <!-- TODO(turnidge): Use function-ref when it can take isolate param -->
       <div class="col-md-4">
-
         <div class="row">
           <isolate-ref ref="{{ isolate }}"></isolate-ref>
         </div>
@@ -910,33 +1113,6 @@
       </div>
 
       <div class="col-md-2">
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['total'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">total</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['dart'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">dart</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['compile'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">compile</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['gc'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">gc</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['init'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">init</p></div>
-        </div>
-      </div>
-      <div class="col-md-2">
         <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
@@ -952,20 +1128,19 @@
         ( <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a> )
       </div>
     </div>
-    <div class="row">
-      <div class="col-md-3">
-      </div>
-      <div class="col-md-6">
-        <template if="{{ isolate.topFrame != null }}">
-          <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
-          (<script-ref ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
-          <br>
-          <pre>{{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
-        </template>
-      </div>
-      <div class="col-md-3">
-      </div>
+
+    <div class="content">
+      <template repeat="{{ key in isolate.counters.keys }}">
+        <div class="memberValue">{{ key }} ({{ isolate.counters[key] }})</div>
+      </template>
     </div>
+
+    <template if="{{ isolate.topFrame != null }}">
+      <script-inset script="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}">
+        <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
+        (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+      </script-inset>
+    </template>
   </template>
   
 </polymer-element>
@@ -995,6 +1170,9 @@
         padding-left: 15%;
         padding-right: 15%;
       }
+      .miniProfileChart {
+        width: 80%;
+      }
     </style>
 
     <nav-bar>
@@ -1029,7 +1207,8 @@
               @
               <function-ref ref="{{ isolate.topFrame['function'] }}">
               </function-ref>
-              (<script-ref ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
+              (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}">
+              </script-ref>)
             </template>
 
             <template if="{{ isolate.idle }}">
@@ -1071,11 +1250,11 @@
       <hr>
     </template>
 
+    <br>
+
     <template if="{{ isolate.topFrame != null }}">
-      <br>
-      <div class="sourceInset">
-        <pre>          {{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
-      </div>
+      <script-inset script="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}">
+      </script-inset>
     </template>
 
     <br>
@@ -1161,7 +1340,14 @@
     <hr>
 
     <div class="content">
-      <div id="tagProfileChart" class="col-md-8" style="height: 400px"></div>
+      <div class="memberValue">Isolate execution</div>
+      <template repeat="{{ key in isolate.counters.keys }}">
+        <div class="memberValue">{{ key }} ({{ isolate.counters[key] }})</div>
+      </template>
+    </div>
+
+    <div class="content">
+      <div id="tagProfileChart" class="miniProfileChart" style="height: 600px"></div>
     </div>
 
     <hr>
@@ -1214,7 +1400,12 @@
     <template if="{{ instance['error'] == null }}">
       <div class="content">
         <!-- TODO(turnidge): Handle null instances. -->
-        <h1>instance of {{ instance['class']['user_name'] }}</h1>
+        <template if="{{ isType(instance.serviceType) }}">
+          <h1>type {{ instance['user_name'] }}</h1>
+        </template>
+        <template if="{{ !isType(instance.serviceType) }}">
+          <h1>instance of {{ instance['class']['user_name'] }}</h1>
+        </template>
         <div class="memberList">
           <div class="memberItem">
             <div class="memberName">class</div>
@@ -1223,16 +1414,43 @@
               </class-ref>
             </div>
           </div>
-          <template if="{{ instance['preview'] != null }}">
+          <template if="{{ instance['valueAsString'] != null }}">
             <div class="memberItem">
-              <div class="memberName">preview</div>
-              <div class="memberValue">{{ instance['preview'] }}</div>
+              <div class="memberName">value</div>
+              <div class="memberValue">{{ instance['valueAsString'] }}</div>
             </div>
           </template>
           <div class="memberItem">
             <div class="memberName">size</div>
             <div class="memberValue">{{ instance['size'] | formatSize }}</div>
           </div>
+          <template if="{{ instance['type_class'] != null }}">
+            <div class="memberItem">
+              <div class="memberName">type class</div>
+              <div class="memberValue">
+                <class-ref ref="{{ instance['type_class'] }}">
+                </class-ref>
+              </div>
+            </div>
+          </template>
+          <template if="{{ instance['closureFunc'] != null }}">
+            <div class="memberItem">
+              <div class="memberName">closure function</div>
+              <div class="memberValue">
+                <function-ref ref="{{ instance['closureFunc'] }}">
+                </function-ref>
+              </div>
+            </div>
+          </template>
+
+          <div class="memberItem">&nbsp;</div>
+
+          <div class="memberItem">
+            <div class="memberName">toString()</div>
+            <div class="memberValue">
+              <eval-link callback="{{ eval }}" expr="toString()"></eval-link>
+            </div>
+          </div>
         </div>
       </div>
 
@@ -1302,31 +1520,10 @@
 </polymer-element>
 <polymer-element name="json-view" extends="observatory-element">
   <template>
-    <template bind="" if="{{ valueType == 'Primitive' }}">
-      <span>{{primitiveString}}</span>
-    </template>
-    <template bind="" if="{{ valueType == 'List' }}">
-      <table class="table table-condensed table-bordered">
-        <caption class="text-left">List, {{list.length}}</caption>
-        <tbody>
-          <tr template="" repeat="{{item in list)}}">
-            <th>{{counter}}</th>
-            <td><json-view json="{{item}}"></json-view></td>
-          </tr>
-        </tbody>
-      </table>
-    </template>
-    <template if="{{ valueType == 'Map' }}">
-      <table class="table table-condensed table-bordered">
-        <caption class="text-left">Map, {{keys.length}}</caption>
-        <tbody>
-          <tr template="" repeat="{{key in keys}}">
-            <th>{{key}}</th>
-            <td><json-view json="{{value(key)}}"></json-view></td>
-          </tr>
-        </tbody>
-      </table>
-    </template>
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+    </nav-bar>
+      <pre>{{ mapAsString }}</pre>
   </template>
   
 </polymer-element>
@@ -1628,6 +1825,7 @@
         <tbody>
           <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
             <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
+              <span id="expand" style="cursor: pointer;">{{ row.expander }}</span>
               <code-ref ref="{{ row.code }}"></code-ref>
             </td>
             <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
@@ -1724,22 +1922,9 @@
     </nav-refresh>
   </nav-bar>
 
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel-heading">Script source for: {{ script.name }}</div>
-      <div class="panel-body">
-        <table style="width:100%">
-          <tbody>
-          <tr template="" repeat="{{ line in script.lines }}">
-            <td style="{{ hitsStyle(line) }}">  </td>
-            <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
-            <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
-          </tr>
-          </tbody>
-        </table>
-      </div>
-    </div>
-  </div>
+  <script-inset id="scriptInset" script="{{ script }}" pos="{{ script.firstTokenPos }}" endpos="{{ script.lastTokenPos }}">
+  <h1>script {{ script.name }}</h1>
+  </script-inset>
 </template>
 
 </polymer-element>
@@ -1766,7 +1951,7 @@
       </div>
       <div class="col-md-9">
         <function-ref ref="{{ frame['function'] }}"></function-ref>
-        ( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
+        ( <script-ref ref="{{ frame['script'] }}" pos="{{ frame['tokenPos'] }}">
         </script-ref> )
 
         <curly-block>
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 fefe023..6c7020e 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
@@ -53,7 +53,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBW:"__$msg",gCO:"_oldPieChart",gDu:"exclusiveTicks",gFm:"machine",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gKx:"__$callGraphChecked",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gN7:"__$library",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQt:"__$uncheckedText",gRd:"line",gSB:"__$active",gSF:"root",gSw:"lines",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",geb:"__$json",gfF:"inclusiveTicks",gfn:"__$text",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",glb:"__$cls",glc:"__$error",glh:"__$qualified",gmC:"__$object",gnx:"__$callback",goH:"columns",goY:"__$isolate",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",gtT:"code",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked",gzw:"__$line"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",fM:"_pageSeparationColor",he:"hitStyleNone",iJN:"hitStyleExecuted",nK:"_freeColor",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function (reflectionData) {
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDe:"__$function",gDu:"exclusiveTicks",gFZ:"__$coverage",gFm:"machine",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gKx:"__$callGraphChecked",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gN7:"__$library",gNT:"__$refreshTime",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gQt:"__$uncheckedText",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gX7:"__$mapAsString",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",ga:"a",ga3:"__$text",ga4:"text",gb:"b",gbV:"_combinedDataTable",gbY:"__$callback",gci:"callees",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",ghX:"__$endPos",ghi:"_fragmentationCanvas",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gkg:"_combinedChart",glb:"__$cls",glc:"__$error",glh:"__$qualified",gmC:"__$object",gnx:"__$callback",goH:"columns",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",gt7:"__$pos",gtT:"code",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",Vn:"hitStyleNotExecuted",aW:"hitStyleExecuted",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function (reflectionData) {
   "use strict";
   function map(x){x={x:x};delete x.x;return x}
     function processStatics(descriptor) {
@@ -149,7 +149,9 @@
     var optionalParametersAreNamed = (optionalParameterInfo & 1) === 1;
     var isIntercepted = requiredParameterCount + optionalParameterCount != funcs[0].length;
     var functionTypeIndex = array[2];
-    var isReflectable = array.length > 3 * optionalParameterCount + 2 * requiredParameterCount + 3
+    var unmangledNameIndex =  3 * optionalParameterCount + 2 * requiredParameterCount + 3;
+    var isReflectable = array.length > unmangledNameIndex;
+
     if (getterStubName) {
       f = tearOff(funcs, array, isStatic, name, isIntercepted);
       if (isStatic) init.globalFunctions[name] = f;
@@ -166,7 +168,6 @@
       }
     }
     if (isReflectable) {
-      var unmangledNameIndex = 3 * optionalParameterCount + 2 * requiredParameterCount + 3;
       var unmangledName = array[unmangledNameIndex];
       var reflectionName = unmangledName + ":" + requiredParameterCount + ":" + optionalParameterCount;
       if (isGetter) {
@@ -252,7 +253,7 @@
 })
 ([["_foreign_helper","dart:_foreign_helper",,H,{
 "^":"",
-Lt:{
+HT:{
 "^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
 "^":"",
 x:[function(a){return void 0},"call$1","DK",2,0,null,6,[]],
@@ -266,8 +267,9 @@
 x=Object.getPrototypeOf(a)
 if(y===x)return z.i
 if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
-if(w==null)return C.vB
-return w},"call$1","mz",2,0,null,6,[]],
+if(w==null){y=Object.getPrototypeOf(a)
+if(y==null||y===Object.prototype)return C.ZQ
+else return C.vB}return w},"call$1","mz",2,0,null,6,[]],
 e1:[function(a){var z,y,x,w
 z=$.Au
 if(z==null)return
@@ -290,78 +292,79 @@
 return y[x][b]},"call$2","BJ",4,0,null,11,[],12,[]],
 Gv:{
 "^":"a;",
-n:[function(a,b){return a===b},"call$1","gUJ",2,0,null,109,[]],
+n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
-bu:[function(a){return H.a5(a)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,336,[]],
+bu:function(a){return H.a5(a)},
+T:function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},
 gbx:function(a){return new H.cu(H.dJ(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 kn:{
 "^":"bool/Gv;",
-bu:[function(a){return String(a)},"call$0","gXo",0,0,null],
+bu:function(a){return String(a)},
 giO:function(a){return a?519018:218159},
 gbx:function(a){return C.HL},
 $isbool:true},
 Jh:{
 "^":"Null/Gv;",
-n:[function(a,b){return null==b},"call$1","gUJ",2,0,null,109,[]],
-bu:[function(a){return"null"},"call$0","gXo",0,0,null],
+n:function(a,b){return null==b},
+bu:function(a){return"null"},
 giO:function(a){return 0},
 gbx:function(a){return C.Qf}},
-QI:{
+Ue1:{
 "^":"Gv;",
 giO:function(a){return 0},
 gbx:function(a){return C.CS}},
 FP:{
-"^":"QI;"},
+"^":"Ue1;"},
 is:{
-"^":"QI;"},
+"^":"Ue1;"},
 Q:{
 "^":"List/Gv;",
-h:[function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
-a.push(b)},"call$1","ght",2,0,null,30,[]],
-KI:[function(a,b){if(b<0||b>=a.length)throw H.b(new P.bJ("value "+b))
+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(new P.bJ("value "+b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
-return a.splice(b,1)[0]},"call$1","gNM",2,0,null,15,[]],
-xe:[function(a,b,c){if(b<0||b>a.length)throw H.b(new P.bJ("value "+b))
+return a.splice(b,1)[0]},
+xe:function(a,b,c){if(b<0||b>a.length)throw H.b(new P.bJ("value "+b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
-a.splice(b,0,c)},"call$2","gJe",4,0,null,15,[],30,[]],
-oF:[function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
-H.IC(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
-Rz:[function(a,b){var z
+a.splice(b,0,c)},
+oF:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
+H.IC(a,b,c)},
+Rz:function(a,b){var z
 if(!!a.fixed$length)H.vh(P.f("remove"))
 for(z=0;z<a.length;++z)if(J.de(a[z],b)){a.splice(z,1)
-return!0}return!1},"call$1","guH",2,0,null,132,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,117,[]],
-FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,281,[]],
-V1:[function(a){this.sB(a,0)},"call$0","gRa",0,0,null],
-aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,117,[]],
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
-zV:[function(a,b){var z,y,x,w
+return!0}return!1},
+ev:function(a,b){return H.VM(new H.U5(a,b),[null])},
+FV:function(a,b){var z
+for(z=J.GP(b);z.G();)this.h(a,z.gl())},
+V1:function(a){this.sB(a,0)},
+aN:function(a,b){return H.bQ(a,b)},
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},119,[]],
+zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
 y.fixed$length=init
 for(x=0;x<a.length;++x){w=H.d(a[x])
 if(x>=z)return H.e(y,x)
-y[x]=w}return y.join(b)},"call$1","gNU",0,2,null,337,338,[]],
-eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,198,[]],
-Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","gRV",2,0,null,15,[]],
-D6:[function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
+y[x]=w}return y.join(b)},
+eR:function(a,b){return H.q9(a,b,null,null)},
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
+D6:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c==null)c=a.length
 else{if(typeof c!=="number"||Math.floor(c)!==c)throw H.b(new P.AT(c))
 if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))}if(b===c)return H.VM([],[H.Kp(a,0)])
-return H.VM(a.slice(b,c),[H.Kp(a,0)])},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
-Mu:[function(a,b,c){H.K0(a,b,c)
-return H.q9(a,b,c,null)},"call$2","gYf",4,0,null,123,[],124,[]],
+return H.VM(a.slice(b,c),[H.Kp(a,0)])},
+Jk:function(a,b){return this.D6(a,b,null)},
+Mu:function(a,b,c){H.K0(a,b,c)
+return H.q9(a,b,c,null)},
 gtH:function(a){if(a.length>0)return a[0]
 throw H.b(new P.lj("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
-UZ:[function(a,b,c){var z,y
+UZ:function(a,b,c){var z,y
 if(!!a.fixed$length)H.vh(P.f("removeRange"))
 z=a.length
 y=J.Wx(b)
@@ -371,25 +374,29 @@
 if(typeof c!=="number")return H.s(c)
 H.tb(a,c,a,b,z-c)
 if(typeof b!=="number")return H.s(b)
-this.sB(a,z-(c-b))},"call$2","gYH",4,0,null,123,[],124,[]],
-YW:[function(a,b,c,d,e){if(!!a.immutable$list)H.vh(P.f("set range"))
-H.qG(a,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-Vr:[function(a,b){return H.Ck(a,b)},"call$1","gGI",2,0,null,117,[]],
-GT:[function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
-H.rd(a,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,339,132,[],123,[]],
-Pk:[function(a,b,c){return H.lO(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
-tg:[function(a,b){var z
+this.sB(a,z-(c-b))},
+YW:function(a,b,c,d,e){if(!!a.immutable$list)H.vh(P.f("set range"))
+H.qG(a,b,c,d,e)},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+Vr:function(a,b){return H.Ck(a,b)},
+GT:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
+H.rd(a,b)},
+XU:function(a,b,c){return H.TK(a,b,c,a.length)},
+u8:function(a,b){return this.XU(a,b,0)},
+Pk:function(a,b,c){return H.lO(a,b,a.length-1)},
+cn:function(a,b){return this.Pk(a,b,null)},
+tg:function(a,b){var z
 for(z=0;z<a.length;++z)if(J.de(a[z],b))return!0
-return!1},"call$1","gdj",2,0,null,109,[]],
+return!1},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
-bu:[function(a){return H.mx(a,"[","]")},"call$0","gXo",0,0,null],
-tt:[function(a,b){var z
+bu:function(a){return H.mx(a,"[","]")},
+tt:function(a,b){var z
 if(b)return H.VM(a.slice(),[H.Kp(a,0)])
 else{z=H.VM(a.slice(),[H.Kp(a,0)])
 z.fixed$length=init
-return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,340,341,[]],
+return z}},
+br:function(a){return this.tt(a,!0)},
 gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
 giO:function(a){return H.eQ(a)},
 gB:function(a){return a.length},
@@ -397,13 +404,13 @@
 if(b<0)throw H.b(new P.bJ("value "+H.d(b)))
 if(!!a.fixed$length)H.vh(P.f("set length"))
 a.length=b},
-t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
+t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
+return a[b]},
+u:function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
+a[b]=c},
 $isList:true,
 $isList:true,
 $askF:null,
@@ -425,7 +432,7 @@
 $isJt:true},
 P:{
 "^":"num/Gv;",
-iM:[function(a,b){var z
+iM:function(a,b){var z
 if(typeof b!=="number")throw H.b(new P.AT(b))
 if(a<b)return-1
 else if(a>b)return 1
@@ -433,72 +440,72 @@
 if(this.gzP(a)===z)return 0
 if(this.gzP(a))return-1
 return 1}return 0}else if(isNaN(a)){if(this.gG0(b))return 0
-return 1}else return-1},"call$1","gYc",2,0,null,187,[]],
+return 1}else return-1},
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
 gx8:function(a){return isFinite(a)},
-JV:[function(a,b){return a%b},"call$1","gDH",2,0,null,187,[]],
-yu:[function(a){var z
+JV:function(a,b){return a%b},
+yu:function(a){var z
 if(a>=-2147483648&&a<=2147483647)return a|0
 if(isFinite(a)){z=a<0?Math.ceil(a):Math.floor(a)
-return z+0}throw H.b(P.f(''+a))},"call$0","gDi",0,0,null],
-HG:[function(a){return this.yu(this.UD(a))},"call$0","gA0",0,0,null],
-UD:[function(a){if(a<0)return-Math.round(-a)
-else return Math.round(a)},"call$0","gW0",0,0,null],
-yM:[function(a,b){var z
+return z+0}throw H.b(P.f(''+a))},
+HG:function(a){return this.yu(this.UD(a))},
+UD:function(a){if(a<0)return-Math.round(-a)
+else return Math.round(a)},
+yM:function(a,b){var z
 if(b>20)throw H.b(P.C3(b))
 z=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+z
-return z},"call$1","gfE",2,0,null,342,[]],
-WZ:[function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
-return a.toString(b)},"call$1","gEI",2,0,null,34,[]],
-bu:[function(a){if(a===0&&1/a<0)return"-0.0"
-else return""+a},"call$0","gXo",0,0,null],
+return z},
+WZ:function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
+return a.toString(b)},
+bu:function(a){if(a===0&&1/a<0)return"-0.0"
+else return""+a},
 giO:function(a){return a&0x1FFFFFFF},
-J:[function(a){return-a},"call$0","gVd",0,0,null],
-g:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a+b},"call$1","gF1n",2,0,null,109,[]],
-W:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a-b},"call$1","gTG",2,0,null,109,[]],
-V:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a/b},"call$1","gJj",2,0,null,109,[]],
-U:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a*b},"call$1","gEH",2,0,null,109,[]],
-Y:[function(a,b){var z
+J:function(a){return-a},
+g:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+return a+b},
+W:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+return a-b},
+V:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
+return a/b},
+U:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
+return a*b},
+Y:function(a,b){var z
 if(typeof b!=="number")throw H.b(new P.AT(b))
 z=a%b
 if(z===0)return 0
 if(z>0)return z
 if(b<0)return z-b
-else return z+b},"call$1","gQR",2,0,null,109,[]],
-Z:[function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
+else return z+b},
+Z:function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
 else{if(typeof b!=="number")H.vh(new P.AT(b))
-return this.yu(a/b)}},"call$1","guP",2,0,null,109,[]],
-cU:[function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},"call$1","gPf",2,0,null,109,[]],
-O:[function(a,b){if(b<0)throw H.b(new P.AT(b))
-return b>31?0:a<<b>>>0},"call$1","gq8",2,0,null,109,[]],
-W4:[function(a,b){return b>31?0:a<<b>>>0},"call$1","gGu",2,0,null,109,[]],
-m:[function(a,b){var z
+return this.yu(a/b)}},
+cU:function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},
+O:function(a,b){if(b<0)throw H.b(new P.AT(b))
+return b>31?0:a<<b>>>0},
+W4:function(a,b){return b>31?0:a<<b>>>0},
+m:function(a,b){var z
 if(b<0)throw H.b(new P.AT(b))
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
-z=a>>z>>>0}return z},"call$1","gyp",2,0,null,109,[]],
-GG:[function(a,b){var z
+z=a>>z>>>0}return z},
+GG:function(a,b){var z
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
-z=a>>z>>>0}return z},"call$1","gMe",2,0,null,109,[]],
-i:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return(a&b)>>>0},"call$1","gAU",2,0,null,109,[]],
-w:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return(a^b)>>>0},"call$1","gttE",2,0,null,109,[]],
-C:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a<b},"call$1","gix",2,0,null,109,[]],
-D:[function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a>b},"call$1","gh1",2,0,null,109,[]],
-E:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a<=b},"call$1","gER",2,0,null,109,[]],
-F:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
-return a>=b},"call$1","gNH",2,0,null,109,[]],
+z=a>>z>>>0}return z},
+i:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
+return(a&b)>>>0},
+w:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+return(a^b)>>>0},
+C:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+return a<b},
+D:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+return a>b},
+E:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
+return a<=b},
+F:function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
+return a>=b},
 $isnum:true,
 static:{"^":"SAz,N6l"}},
 im:{
@@ -520,12 +527,12 @@
 "^":"VP;"},
 O:{
 "^":"String/Gv;",
-j:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
+j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
-return a.charCodeAt(b)},"call$1","gSu",2,0,null,15,[]],
-dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,343,[]],
-wL:[function(a,b,c){var z,y,x,w
+return a.charCodeAt(b)},
+dd:function(a,b){return H.ZT(a,b)},
+wL:function(a,b,c){var z,y,x,w
 if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
 z=a.length
 y=b.length
@@ -535,22 +542,23 @@
 if(w>=y)H.vh(P.N(w))
 w=b.charCodeAt(w)
 if(x>=z)H.vh(P.N(x))
-if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,339,14,[],123,[]],
-g:[function(a,b){if(typeof b!=="string")throw H.b(P.u(b))
-return a+b},"call$1","gF1n",2,0,null,109,[]],
-Tc:[function(a,b){var z,y
+if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},
+g:function(a,b){if(typeof b!=="string")throw H.b(P.u(b))
+return a+b},
+Tc:function(a,b){var z,y
 z=b.length
 y=a.length
 if(z>y)return!1
-return b===this.yn(a,y-z)},"call$1","gvi",2,0,null,109,[]],
-h8:[function(a,b,c){return H.ys(a,b,c)},"call$2","gcB",4,0,null,110,[],111,[]],
-Fr:[function(a,b){return a.split(b)},"call$1","gOG",2,0,null,103,[]],
-Qi:[function(a,b,c){var z
+return b===this.yn(a,y-z)},
+h8:function(a,b,c){return H.ys(a,b,c)},
+Fr:function(a,b){return a.split(b)},
+Qi:function(a,b,c){var z
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 z=c+b.length
 if(z>a.length)return!1
-return b===a.substring(c,z)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,339,103,[],15,[]],
-Nj:[function(a,b,c){var z
+return b===a.substring(c,z)},
+nC:function(a,b){return this.Qi(a,b,0)},
+Nj:function(a,b,c){var z
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
@@ -558,9 +566,10 @@
 if(z.C(b,0))throw H.b(P.N(b))
 if(z.D(b,c))throw H.b(P.N(b))
 if(J.z8(c,a.length))throw H.b(P.N(c))
-return a.substring(b,c)},function(a,b){return this.Nj(a,b,null)},"yn","call$2",null,"gKj",2,2,null,82,85,[],133,[]],
-hc:[function(a){return a.toLowerCase()},"call$0","gCW",0,0,null],
-bS:[function(a){var z,y,x,w,v
+return a.substring(b,c)},
+yn:function(a,b){return this.Nj(a,b,null)},
+hc:function(a){return a.toLowerCase()},
+bS:function(a){var z,y,x,w,v
 z=a.trim()
 y=z.length
 if(y===0)return z
@@ -569,8 +578,8 @@
 w=y-1
 v=this.j(z,w)===133?J.r9(z,w):y
 if(x===0&&v===y)return z
-return z.substring(x,v)},"call$0","gZH",0,0,null],
-U:[function(a,b){var z,y
+return z.substring(x,v)},
+U:function(a,b){var z,y
 if(typeof b!=="number")return H.s(b)
 if(0>=b)return""
 if(b===1||a.length===0)return a
@@ -578,33 +587,36 @@
 for(z=a,y="";!0;){if((b&1)===1)y=z+y
 b=b>>>1
 if(b===0)break
-z+=z}return y},"call$1","gEH",2,0,null,344,[]],
-XU:[function(a,b,c){var z,y,x,w
+z+=z}return y},
+XU:function(a,b,c){var z,y,x,w
 if(b==null)H.vh(new P.AT(null))
 if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
 if(typeof b==="string")return a.indexOf(b,c)
 z=J.x(b)
 if(!!z.$isVR){y=b.yk(a,c)
 return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
-return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,339,103,[],123,[]],
-Pk:[function(a,b,c){var z,y,x
+return-1},
+u8:function(a,b){return this.XU(a,b,0)},
+Pk:function(a,b,c){var z,y,x
 c=a.length
 if(typeof b==="string"){z=b.length
 y=a.length
 if(c+z>y)c=y-z
 return a.lastIndexOf(b,c)}for(z=J.rY(b),x=c;x>=0;--x)if(z.wL(b,a,x)!=null)return x
-return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,103,[],123,[]],
-Is:[function(a,b,c){if(b==null)H.vh(new P.AT(null))
+return-1},
+cn:function(a,b){return this.Pk(a,b,null)},
+Is:function(a,b,c){if(b==null)H.vh(new P.AT(null))
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
-return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,339,109,[],85,[]],
+return H.m2(a,b,c)},
+tg:function(a,b){return this.Is(a,b,0)},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
-iM:[function(a,b){var z
+iM:function(a,b){var z
 if(typeof b!=="string")throw H.b(new P.AT(b))
 if(a===b)z=0
 else z=a<b?-1:1
-return z},"call$1","gYc",2,0,null,109,[]],
-bu:[function(a){return a},"call$0","gXo",0,0,null],
+return z},
+bu:function(a){return a},
 giO:function(a){var z,y,x
 for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
 y=536870911&y+((524287&y)<<10>>>0)
@@ -613,18 +625,18 @@
 return 536870911&y+((16383&y)<<15>>>0)},
 gbx:function(a){return C.Db},
 gB:function(a){return a.length},
-t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
+t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,15,[]],
+return a[b]},
 $isString:true,
 static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
 default:return!1}},"call$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
-for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
+for(z=a.length;b<z;){if(b>=z)H.vh(new P.bJ("value "+b))
 y=a.charCodeAt(b)
 if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"call$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
 for(z=a.length;b>0;b=y){y=b-1
-if(y>=z)H.vh(P.N(y))
+if(y>=z)H.vh(new P.bJ("value "+y))
 x=a.charCodeAt(y)
 if(x!==32&&x!==13&&!J.Ga(x))break}return b},"call$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
 "^":"",
@@ -739,7 +751,7 @@
 y.toString
 self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
 z=new H.XO(w,null)
-throw H.b(P.FM(z))}},"call$1","o3",2,0,null,22,[]],
+throw H.b(P.FM(z))}},"call$1","eR",2,0,null,22,[]],
 Ws:[function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
@@ -757,17 +769,17 @@
 z.il=new H.fP(null)
 return z.h7(a)}else{z=new H.NO(new H.X1())
 z.il=new H.fP(null)
-return z.h7(a)}},"call$1","hX",2,0,null,24,[]],
+return z.h7(a)}},"call$1","YH",2,0,null,24,[]],
 Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
 else return a},"call$1","m6",2,0,null,24,[]],
 VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","lF",2,0,null,28,[]],
 ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,28,[]],
 PK:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){this.b.call$1(this.a.a)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 JO:{
-"^":"Tp:115;a,c",
+"^":"Tp:117;a,c",
 call$0:[function(){this.c.call$2(this.a.a,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 f0:{
@@ -791,10 +803,10 @@
 $.jk().dartPrint = function (object) {}}}},
 aX:{
 "^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,pa",
-v8:[function(a,b){if(!this.Qy.n(0,a))return
+v8:function(a,b){if(!this.Qy.n(0,a))return
 if(this.lJ.h(0,b)&&!this.RW)this.RW=!0
-this.PC()},"call$2","gfU",4,0,null,345,[],346,[]],
-NR:[function(a){var z,y,x,w,v,u
+this.PC()},
+NR:function(a){var z,y,x,w,v,u
 if(!this.RW)return
 z=this.lJ
 z.Rz(0,a)
@@ -809,26 +821,26 @@
 if(w<0||w>=u)return H.e(v,w)
 v[w]=x
 if(w===y.eZ)y.VW()
-y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gXF",2,0,null,346,[]],
-iK:[function(a){var z=this.Jp
+y.qT=y.qT+1}this.RW=!1}this.PC()},
+iK:function(a){var z=this.Jp
 if(z==null){z=[]
 this.Jp=z}if(J.kE(z,a))return
-this.Jp.push(a)},"call$1","gYd",2,0,null,347,[]],
-Hh:[function(a){var z=this.Jp
+this.Jp.push(a)},
+Hh:function(a){var z=this.Jp
 if(z==null)return
-J.V1(z,a)},"call$1","gr9",2,0,null,347,[]],
-MZ:[function(a,b){if(!this.PX.n(0,a))return
-this.pa=b},"call$2","gvm",4,0,null,345,[],348,[]],
-Wq:[function(a,b){if(J.de(b,2))init.globalState.Xz.Rk.NZ(0,new H.IY(this,new H.oU(a),"ping"))
-else J.Sq(a,null)},"call$2","gWL",4,0,null,347,[],349,[]],
-vV:[function(a,b){var z,y
+J.V1(z,a)},
+MZ:function(a,b){if(!this.PX.n(0,a))return
+this.pa=b},
+Wq:function(a,b){if(J.de(b,2))init.globalState.Xz.Rk.NZ(0,new H.IY(this,new H.oU(a),"ping"))
+else J.Sq(a,null)},
+vV:function(a,b){var z,y
 z=init.globalState.N0
 init.globalState.N0=this
 $=this.En
 y=null
 try{y=b.call$0()}finally{init.globalState.N0=z
-if(z!=null)$=z.gEn()}return y},"call$1","gZm",2,0,null,143,[]],
-Ds:[function(a){var z=J.U6(a)
+if(z!=null)$=z.gEn()}return y},
+Ds:function(a){var z=J.U6(a)
 switch(z.t(a,0)){case"pause":this.v8(z.t(a,1),z.t(a,2))
 break
 case"resume":this.NR(z.t(a,1))
@@ -841,24 +853,24 @@
 break
 case"ping":this.Wq(z.t(a,1),z.t(a,2))
 break
-default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gEd",2,0,null,24,[]],
-Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,350,[]],
-aU:[function(a,b){var z=this.Gx
+default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},
+Zt:function(a){return this.Gx.t(0,a)},
+aU:function(a,b){var z=this.Gx
 if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
-z.u(0,a,b)},"call$2","gPn",4,0,null,350,[],351,[]],
-PC:[function(){if(this.Gx.X5-this.fW.X5>0||this.RW)init.globalState.i2.u(0,this.jO,this)
-else this.UM()},"call$0","gi8",0,0,null],
-UM:[function(){init.globalState.i2.Rz(0,this.jO)
+z.u(0,a,b)},
+PC:function(){if(this.Gx.X5-this.fW.X5>0||this.RW)init.globalState.i2.u(0,this.jO,this)
+else this.UM()},
+UM:function(){init.globalState.i2.Rz(0,this.jO)
 var z=this.Jp
-if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)},"call$0","gAh",0,0,null],
+if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)},
 $isaX:true},
 oU:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){J.Sq(this.a,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
 "^":"a;Rk,GL",
-Jc:[function(){var z,y,x,w,v
+Jc:function(){var z,y,x,w,v
 z=this.Rk
 y=z.av
 if(y===z.eZ)return
@@ -869,8 +881,8 @@
 v=x[y]
 x[y]=null
 z.av=(y+1&w-1)>>>0
-return v},"call$0","gRe",0,0,null],
-xB:[function(){var z,y,x
+return v},
+xB:function(){var z,y,x
 z=this.Jc()
 if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.x4(init.globalState.Nr.jO)&&init.globalState.vu===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
 y=init.globalState
@@ -878,10 +890,10 @@
 x=H.Gy(H.B7(["command","close"],P.L5(null,null,null,null,null)))
 y.toString
 self.postMessage(x)}return!1}z.VU()
-return!0},"call$0","gad",0,0,null],
-oV:[function(){if($.C5()!=null)new H.RA(this).call$0()
-else for(;this.xB(););},"call$0","gVY",0,0,null],
-bL:[function(){var z,y,x,w,v
+return!0},
+oV:function(){if($.C5()!=null)new H.RA(this).call$0()
+else for(;this.xB(););},
+bL:function(){var z,y,x,w,v
 if(init.globalState.EF!==!0)this.oV()
 else try{this.oV()}catch(x){w=H.Ru(x)
 z=w
@@ -889,25 +901,25 @@
 w=init.globalState.vd
 v=H.Gy(H.B7(["command","error","msg",H.d(z)+"\n"+H.d(y)],P.L5(null,null,null,null,null)))
 w.toString
-self.postMessage(v)}},"call$0","gcP",0,0,null]},
+self.postMessage(v)}}},
 RA:{
-"^":"Tp:114;a",
+"^":"Tp:116;a",
 call$0:[function(){if(!this.a.xB())return
 P.rT(C.ny,this)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;F1*,i3,G1*",
-VU:[function(){if(this.F1.gRW()){this.F1.gC9().push(this)
-return}J.yn(this.F1,this.i3)},"call$0","gjF",0,0,null],
+VU:function(){if(this.F1.gRW()){this.F1.gC9().push(this)
+return}J.yn(this.F1,this.i3)},
 $isIY:true},
 JH:{
 "^":"a;"},
 jl:{
-"^":"Tp:115;a,b,c,d,e,f",
+"^":"Tp:117;a,b,c,d,e,f",
 call$0:[function(){H.Ws(this.a,this.b,this.c,this.d,this.e,this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Vg:{
-"^":"Tp:114;a,b,c,d",
+"^":"Tp:116;a,b,c,d",
 call$0:[function(){var z,y,x
 if(this.d!==!0)this.a.call$1(this.c)
 else{z=this.a
@@ -924,7 +936,7 @@
 $ishq:true},
 Z6:{
 "^":"Iy4;JE,Jz",
-zY:[function(a,b){var z,y,x,w,v
+zY:function(a,b){var z,y,x,w,v
 z={}
 y=this.Jz
 x=init.globalState.i2.t(0,y)
@@ -937,15 +949,15 @@
 if(x.gEE()===w){x.Ds(z.a)
 return}y=init.globalState.Xz
 w="receive "+H.d(b)
-y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gMT",2,0,null,24,[]],
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
+y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isZ6&&J.de(this.JE,b.JE)},
 giO:function(a){return J.td(this.JE)},
 $isZ6:true,
 $isbC:true,
 $ishq:true},
 Ua:{
-"^":"Tp:115;a,b,c",
+"^":"Tp:117;a,b,c",
 call$0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
@@ -953,13 +965,13 @@
 $isEH:true},
 ns:{
 "^":"Iy4;hQ,bv,Jz",
-zY:[function(a,b){var z,y
+zY:function(a,b){var z,y
 z=H.Gy(H.B7(["command","message","port",this,"msg",b],P.L5(null,null,null,null,null)))
 if(init.globalState.EF===!0){init.globalState.vd.toString
 self.postMessage(z)}else{y=init.globalState.XC.t(0,this.hQ)
-if(y!=null)y.postMessage(z)}},"call$1","gMT",2,0,null,24,[]],
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,109,[]],
+if(y!=null)y.postMessage(z)}},
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},
 giO:function(a){var z,y,x
 z=J.Eh(this.hQ,16)
 y=J.Eh(this.Jz,8)
@@ -972,7 +984,7 @@
 yo:{
 "^":"a;ng>,bd,P0<",
 wy:function(a){return this.bd.call$1(a)},
-cO:[function(a){var z,y
+cO:function(a){var z,y
 if(this.P0)return
 this.P0=!0
 this.bd=null
@@ -980,28 +992,28 @@
 y=this.ng
 z.Gx.Rz(0,y)
 z.fW.Rz(0,y)
-z.PC()},"call$0","gJK",0,0,null],
-FL:[function(a,b){if(this.P0)return
-this.wy(b)},"call$1","gT5",2,0,null,352,[]],
+z.PC()},
+FL:function(a,b){if(this.P0)return
+this.wy(b)},
 $isyo:true,
 static:{"^":"Vz"}},
 NA:{
 "^":"Tf;CN,il",
-DE:[function(a){if(!!a.$isZ6)return["sendport",init.globalState.oL,a.Jz,J.td(a.JE)]
+DE:function(a){if(!!a.$isZ6)return["sendport",init.globalState.oL,a.Jz,J.td(a.JE)]
 if(!!a.$isns)return["sendport",a.hQ,a.Jz,a.bv]
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
-yf:[function(a){if(!!a.$isku)return["capability",a.ng]
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
+throw H.b("Illegal underlying port "+H.d(a))},
+yf:function(a){if(!!a.$isku)return["capability",a.ng]
+throw H.b("Capability not serializable: "+H.d(a))}},
 NO:{
 "^":"Nt;il",
-DE:[function(a){if(!!a.$isZ6)return new H.Z6(a.JE,a.Jz)
+DE:function(a){if(!!a.$isZ6)return new H.Z6(a.JE,a.Jz)
 if(!!a.$isns)return new H.ns(a.hQ,a.bv,a.Jz)
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
-yf:[function(a){if(!!a.$isku)return new H.ku(a.ng)
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
+throw H.b("Illegal underlying port "+H.d(a))},
+yf:function(a){if(!!a.$isku)return new H.ku(a.ng)
+throw H.b("Capability not serializable: "+H.d(a))}},
 II:{
-"^":"fPc;RZ",
-Vf:[function(a){var z,y,x,w,v,u
+"^":"Xb;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)
@@ -1010,44 +1022,44 @@
 if(v==null)return
 u=v.Zt(w)
 if(u==null)return
-return new H.Z6(u,x)}else return new H.ns(y,w,x)},"call$1","gTm",2,0,null,73,[]],
-Op:[function(a){return new H.ku(J.UQ(a,1))},"call$1","gen",2,0,null,73,[]]},
+return new H.Z6(u,x)}else return new H.ns(y,w,x)},
+Op:function(a){return new H.ku(J.UQ(a,1))}},
 fP:{
 "^":"a;MD",
-t:[function(a,b){return b.__MessageTraverser__attached_info__},"call$1","gIA",2,0,null,6,[]],
-u:[function(a,b,c){this.MD.push(b)
-b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],353,[]],
-Hn:[function(a){this.MD=[]},"call$0","gb6",0,0,null],
-Xq:[function(){var z,y,x
+t:function(a,b){return b.__MessageTraverser__attached_info__},
+u:function(a,b,c){this.MD.push(b)
+b.__MessageTraverser__attached_info__=c},
+Hn:function(a){this.MD=[]},
+Xq:function(){var z,y,x
 for(z=this.MD.length,y=0;y<z;++y){x=this.MD
 if(y>=x.length)return H.e(x,y)
-x[y].__MessageTraverser__attached_info__=null}this.MD=null},"call$0","gt6",0,0,null]},
+x[y].__MessageTraverser__attached_info__=null}this.MD=null}},
 X1:{
 "^":"a;",
-t:[function(a,b){return},"call$1","gIA",2,0,null,6,[]],
-u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],353,[]],
-Hn:[function(a){},"call$0","gb6",0,0,null],
-Xq:[function(){},"call$0","gt6",0,0,null]},
+t:function(a,b){return},
+u:function(a,b,c){},
+Hn:function(a){},
+Xq:function(){}},
 BB:{
 "^":"a;",
-h7:[function(a){var z
+h7:function(a){var z
 if(H.VO(a))return this.Pq(a)
 this.il.Hn(0)
 z=null
-try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,28,[]],
-I8:[function(a){var z
+try{z=this.I8(a)}finally{this.il.Xq()}return z},
+I8:function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
 if(!!z.$isList)return this.wb(a)
 if(!!z.$isZ0)return this.TI(a)
 if(!!z.$isbC)return this.DE(a)
 if(!!z.$ishq)return this.yf(a)
-return this.YZ(a)},"call$1","gRQ",2,0,null,28,[]],
-YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,28,[]]},
+return this.YZ(a)},
+YZ:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
 Nt:{
 "^":"BB;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
-wb:[function(a){var z,y,x,w,v,u
+Pq:function(a){return a},
+wb:function(a){var z,y,x,w,v,u
 z=this.il.t(0,a)
 if(z!=null)return z
 y=J.U6(a)
@@ -1058,8 +1070,8 @@
 this.il.u(0,a,z)
 for(w=z.length,v=0;v<x;++v){u=this.I8(y.t(a,v))
 if(v>=w)return H.e(z,v)
-z[v]=u}return z},"call$1","gqb",2,0,null,73,[]],
-TI:[function(a){var z,y
+z[v]=u}return z},
+TI:function(a){var z,y
 z={}
 y=this.il.t(0,a)
 z.a=y
@@ -1068,32 +1080,32 @@
 z.a=y
 this.il.u(0,a,y)
 a.aN(0,new H.OW(z,this))
-return z.a},"call$1","gnM",2,0,null,151,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
+return z.a},
+DE:function(a){return H.vh(P.SY(null))},
+yf:function(a){return H.vh(P.SY(null))}},
 OW:{
-"^":"Tp:355;a,b",
+"^":"Tp:293;a,b",
 call$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,48,[],354,[],"call"],
+J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,48,[],292,[],"call"],
 $isEH:true},
 Tf:{
 "^":"BB;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
-wb:[function(a){var z,y
+Pq:function(a){return a},
+wb:function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
 y=this.CN
 this.CN=y+1
 this.il.u(0,a,y)
-return["list",y,this.mE(a)]},"call$1","gqb",2,0,null,73,[]],
-TI:[function(a){var z,y
+return["list",y,this.mE(a)]},
+TI:function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
 y=this.CN
 this.CN=y+1
 this.il.u(0,a,y)
-return["map",y,this.mE(J.qA(a.gvc(a))),this.mE(J.qA(a.gUQ(a)))]},"call$1","gnM",2,0,null,151,[]],
-mE:[function(a){var z,y,x,w,v
+return["map",y,this.mE(J.qA(a.gvc())),this.mE(J.qA(a.gUQ(a)))]},
+mE:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
 x=[]
@@ -1102,15 +1114,15 @@
 w=0
 for(;w<y;++w){v=this.I8(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
-x[w]=v}return x},"call$1","gEa",2,0,null,73,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
-fPc:{
+x[w]=v}return x},
+DE:function(a){return H.vh(P.SY(null))},
+yf:function(a){return H.vh(P.SY(null))}},
+Xb:{
 "^":"a;",
-QS:[function(a){if(H.ZR(a))return a
+QS:function(a){if(H.ZR(a))return a
 this.RZ=P.Py(null,null,null,null,null)
-return this.XE(a)},"call$1","gia",2,0,null,28,[]],
-XE:[function(a){var z,y
+return this.XE(a)},
+XE:function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 z=J.U6(a)
 switch(z.t(a,0)){case"ref":y=z.t(a,1)
@@ -1119,8 +1131,8 @@
 case"map":return this.tv(a)
 case"sendport":return this.Vf(a)
 case"capability":return this.Op(a)
-default:return this.PR(a)}},"call$1","gn0",2,0,null,28,[]],
-Dj:[function(a){var z,y,x,w,v
+default:return this.PR(a)}},
+Dj:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.t(a,1)
 x=z.t(a,2)
@@ -1130,8 +1142,8 @@
 if(typeof w!=="number")return H.s(w)
 v=0
 for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
-return x},"call$1","gMS",2,0,null,28,[]],
-tv:[function(a){var z,y,x,w,v,u,t,s
+return x},
+tv:function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
 y=J.U6(a)
 x=y.t(a,1)
@@ -1144,16 +1156,16 @@
 t=J.U6(v)
 s=0
 for(;s<u;++s)z.u(0,this.XE(y.t(w,s)),this.XE(t.t(v,s)))
-return z},"call$1","gwq",2,0,null,28,[]],
-PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,28,[]]},
+return z},
+PR:function(a){throw H.b("Unexpected serialized object")}},
 yH:{
 "^":"a;Kf,zu,p9",
-ed:[function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
+ed:function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
 if(this.p9==null)return
 H.ox()
 if(this.Kf)$.jk().clearTimeout(this.p9)
 else $.jk().clearInterval(this.p9)
-this.p9=null}else throw H.b(P.f("Canceling a timer."))},"call$0","gZS",0,0,null],
+this.p9=null}else throw H.b(P.f("Canceling a timer."))},
 Qa:function(a,b){var z,y
 if(a===0)z=$.jk().setTimeout==null||init.globalState.EF===!0
 else z=!1
@@ -1169,12 +1181,12 @@
 z.Qa(a,b)
 return z}}},
 FA:{
-"^":"Tp:114;a,b",
+"^":"Tp:116;a,b",
 call$0:[function(){this.a.p9=null
 this.b.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Av:{
-"^":"Tp:114;c,d",
+"^":"Tp:116;c,d",
 call$0:[function(){this.c.p9=null
 H.ox()
 this.d.call$0()},"call$0",null,0,0,null,"call"],
@@ -1192,12 +1204,12 @@
 z=((z^z>>>12)>>>0)*5&4294967295
 z=((z^z>>>4)>>>0)*2057&4294967295
 return(z^z>>>16)>>>0},
-n:[function(a,b){var z,y
+n:function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
 if(!!J.x(b).$isku){z=this.ng
 y=b.ng
-return z==null?y==null:z===y}return!1},"call$1","gUJ",2,0,null,109,[]],
+return z==null?y==null:z===y}return!1},
 $isku:true,
 $ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
@@ -1440,7 +1452,7 @@
 v.prototype=w
 u=!d
 if(u){t=e.length==1&&!0
-s=H.SD(z,t)}else{w.$name=f
+s=H.SD(a,z,t)}else{w.$name=f
 s=z
 t=!1}if(typeof x=="number")r=(function(s){return function(){return init.metadata[s]}})(x)
 else if(u&&typeof x=="function"){q=t?H.yS:H.eZ
@@ -1449,92 +1461,98 @@
 w[y]=s
 for(u=b.length,p=1;p<u;++p){o=b[p]
 n=o.$callName
-if(n!=null){m=d?o:H.SD(o,t)
+if(n!=null){m=d?o:H.SD(a,o,t)
 w[n]=m}}w["call*"]=z
 return v},"call$6","Xd",12,0,null,47,[],64,[],65,[],66,[],67,[],68,[]],
-vq:[function(a,b){var z=H.eZ
-switch(a){case 0:return function(F,S){return function(){return F.call(S(this))}}(b,z)
-case 1:return function(F,S){return function(a){return F.call(S(this),a)}}(b,z)
-case 2:return function(F,S){return function(a,b){return F.call(S(this),a,b)}}(b,z)
-case 3:return function(F,S){return function(a,b,c){return F.call(S(this),a,b,c)}}(b,z)
-case 4:return function(F,S){return function(a,b,c,d){return F.call(S(this),a,b,c,d)}}(b,z)
-case 5:return function(F,S){return function(a,b,c,d,e){return F.call(S(this),a,b,c,d,e)}}(b,z)
-default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],17,[]],
-SD:[function(a,b){var z,y,x,w
-if(b)return H.wg(a)
-z=a.length
-if(typeof dart_precompiled=="function")return H.vq(z,a)
-else if(z===0){y=$.bf
-if(y==null){y=H.B3("self")
-$.bf=y}y="return function(){return F.call(this."+H.d(y)+");"
-x=$.OK
-$.OK=J.WB(x,1)
-return new Function("F",y+H.d(x)+"}")(a)}else if(1<=z&&z<27){w="abcdefghijklmnopqrstuvwxyz".split("").splice(0,z).join(",")
-y="return function("+w+"){return F.call(this."
-x=$.bf
-if(x==null){x=H.B3("self")
-$.bf=x}x=y+H.d(x)+","+w+");"
-y=$.OK
-$.OK=J.WB(y,1)
-return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,17,[],69,[]],
-Z4:[function(a,b,c){var z,y
+vq:[function(a,b,c,d){var z=H.eZ
+switch(b?-1:a){case 0:return function(n,S){return function(){return S(this)[n]()}}(c,z)
+case 1:return function(n,S){return function(a){return S(this)[n](a)}}(c,z)
+case 2:return function(n,S){return function(a,b){return S(this)[n](a,b)}}(c,z)
+case 3:return function(n,S){return function(a,b,c){return S(this)[n](a,b,c)}}(c,z)
+case 4:return function(n,S){return function(a,b,c,d){return S(this)[n](a,b,c,d)}}(c,z)
+case 5:return function(n,S){return function(a,b,c,d,e){return S(this)[n](a,b,c,d,e)}}(c,z)
+default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(d,z)}},"call$4","X5",8,0,null,63,[],69,[],70,[],17,[]],
+SD:[function(a,b,c){var z,y,x,w,v,u
+if(c)return H.wg(a,b)
+z=b.$stubName
+y=b.length
+x=a[z]
+w=b==null?x==null:b===x
+if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
+if(y===0){w=$.bf
+if(w==null){w=H.B3("self")
+$.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+v=$.OK
+$.OK=J.WB(v,1)
+return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
+w="return function("+u+"){return this."
+v=$.bf
+if(v==null){v=H.B3("self")
+$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+w=$.OK
+$.OK=J.WB(w,1)
+return new Function(v+H.d(w)+"}")()},"call$3","Fw",6,0,null,47,[],17,[],71,[]],
+Z4:[function(a,b,c,d){var z,y
 z=H.eZ
 y=H.yS
-switch(a){case 0:throw H.b(H.Ef("Intercepted function with no arguments."))
-case 1:return function(f,s,r){return function(){return f.call(s(this),r(this))}}(c,z,y)
-case 2:return function(f,s,r){return function(a){return f.call(s(this),r(this),a)}}(c,z,y)
-case 3:return function(f,s,r){return function(a,b){return f.call(s(this),r(this),a,b)}}(c,z,y)
-case 4:return function(f,s,r){return function(a,b,c){return f.call(s(this),r(this),a,b,c)}}(c,z,y)
-case 5:return function(f,s,r){return function(a,b,c,d){return f.call(s(this),r(this),a,b,c,d)}}(c,z,y)
-case 6:return function(f,s,r){return function(a,b,c,d,e){return f.call(s(this),r(this),a,b,c,d,e)}}(c,z,y)
-default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],17,[]],
-wg:[function(a){var z,y,x,w,v,u
+switch(b?-1:a){case 0:throw H.b(H.Ef("Intercepted function with no arguments."))
+case 1:return function(n,s,r){return function(){return s(this)[n](r(this))}}(c,z,y)
+case 2:return function(n,s,r){return function(a){return s(this)[n](r(this),a)}}(c,z,y)
+case 3:return function(n,s,r){return function(a,b){return s(this)[n](r(this),a,b)}}(c,z,y)
+case 4:return function(n,s,r){return function(a,b,c){return s(this)[n](r(this),a,b,c)}}(c,z,y)
+case 5:return function(n,s,r){return function(a,b,c,d){return s(this)[n](r(this),a,b,c,d)}}(c,z,y)
+case 6:return function(n,s,r){return function(a,b,c,d,e){return s(this)[n](r(this),a,b,c,d,e)}}(c,z,y)
+default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(d,z,y)}},"call$4","VT",8,0,null,63,[],69,[],12,[],17,[]],
+wg:[function(a,b){var z,y,x,w,v,u,t,s
 z=H.oN()
 y=$.P4
 if(y==null){y=H.B3("receiver")
-$.P4=y}x=a.$stubName
-w=a.length
-if(typeof dart_precompiled=="function")return H.Z4(w,x,a)
-else if(w===1){y="return function(){return F.call(this."+H.d(z)+", this."+H.d(y)+");"
-v=$.OK
-$.OK=J.WB(v,1)
-return new Function("F",y+H.d(v)+"}")(a)}else if(1<w&&w<28){u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,w-1).join(",")
-y="return function("+u+"){return F.call(this."+H.d(z)+", this."+H.d(y)+", "+u+");"
-v=$.OK
-$.OK=J.WB(v,1)
-return new Function("F",y+H.d(v)+"}")(a)}else return H.Z4(w,x,a)},"call$1","FT",2,0,null,17,[]],
+$.P4=y}x=b.$stubName
+w=b.length
+v=typeof dart_precompiled=="function"
+u=a[x]
+t=b==null?u==null:b===u
+if(v||!t||w>=28)return H.Z4(w,!t,x,b)
+if(w===1){y="return function(){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+");"
+t=$.OK
+$.OK=J.WB(t,1)
+return new Function(y+H.d(t)+"}")()}s="abcdefghijklmnopqrstuvwxyz".split("").splice(0,w-1).join(",")
+y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
+t=$.OK
+$.OK=J.WB(t,1)
+return new Function(y+H.d(t)+"}")()},"call$2","FT",4,0,null,47,[],17,[]],
 Kq:[function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
 return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,47,[],64,[],65,[],66,[],67,[],12,[]],
 SE:[function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,30,[],71,[]],
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,30,[],73,[]],
 Go:[function(a,b){var z
 if(a!=null)z=typeof a==="object"&&J.x(a)[b]
 else z=!0
 if(z)return a
-H.SE(a,b)},"call$2","CY",4,0,null,30,[],71,[]],
-ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"call$1","RK",2,0,null,72,[]],
-KT:[function(a,b,c){return new H.tD(a,b,c,null)},"call$3","HN",6,0,null,74,[],75,[],76,[]],
+H.SE(a,b)},"call$2","CY",4,0,null,30,[],73,[]],
+ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"call$1","RK",2,0,null,74,[]],
+KT:[function(a,b,c){return new H.tD(a,b,c,null)},"call$3","HN",6,0,null,76,[],77,[],78,[]],
 Og:[function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.tu(z)
-return new H.fw(z,b,null)},"call$2","ZPJ",4,0,null,77,[],78,[]],
+return new H.fw(z,b,null)},"call$2","ZPJ",4,0,null,79,[],80,[]],
 N7:[function(){return C.KZ},"call$0","cI",0,0,null],
 uV:[function(a){return new H.cu(a,null)},"call$1","IZ",2,0,null,12,[]],
 VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},"call$2","Ub",4,0,null,79,[],80,[]],
+return a},"call$2","Ub",4,0,null,81,[],82,[]],
 oX:[function(a){if(a==null)return
-return a.$builtinTypeInfo},"call$1","Qn",2,0,null,79,[]],
-IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"call$2","PE",4,0,null,79,[],81,[]],
+return a.$builtinTypeInfo},"call$1","Qn",2,0,null,81,[]],
+IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"call$2","PE",4,0,null,81,[],83,[]],
 ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"call$3","Cn",6,0,null,79,[],81,[],15,[]],
+return z==null?null:z[c]},"call$3","Cn",6,0,null,81,[],83,[],15,[]],
 Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],15,[]],
+return z==null?null:z[b]},"call$2","tC",4,0,null,81,[],15,[]],
 Ko:[function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
 else if(typeof a==="number"&&Math.floor(a)===a)if(b==null)return C.jn.bu(a)
 else return b.call$1(a)
-else return},"call$2$onTypeVariable","bR",2,3,null,82,11,[],83,[]],
+else return},"call$2$onTypeVariable","bR",2,3,null,84,11,[],85,[]],
 ia:[function(a,b,c){var z,y,x,w,v,u
 if(a==null)return""
 z=P.p9("")
@@ -1544,25 +1562,25 @@
 if(v!=null)w=!1
 u=H.Ko(v,c)
 u=typeof u==="string"?u:H.d(u)
-z.vM=z.vM+u}return w?"":"<"+H.d(z)+">"},"call$3$onTypeVariable","iM",4,3,null,82,84,[],85,[],83,[]],
+z.vM=z.vM+u}return w?"":"<"+H.d(z)+">"},"call$3$onTypeVariable","iM",4,3,null,84,86,[],87,[],85,[]],
 dJ:[function(a){var z=typeof a==="object"&&a!==null&&a.constructor===Array?"List":J.x(a).constructor.builtin$cls
 return z+H.ia(a.$builtinTypeInfo,0,null)},"call$1","Yx",2,0,null,6,[]],
 Y9:[function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
 else if(typeof a=="function"){a=H.ml(a,null,b)
 if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function")b=H.ml(a,null,b)}return b},"call$2","zL",4,0,null,86,[],87,[]],
+else if(typeof a=="function")b=H.ml(a,null,b)}return b},"call$2","zL",4,0,null,88,[],89,[]],
 RB:[function(a,b,c,d){var z,y
 if(a==null)return!1
 z=H.oX(a)
 y=J.x(a)
 if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},"call$4","Ap",8,0,null,6,[],88,[],89,[],90,[]],
+return H.hv(H.Y9(y[d],z),c)},"call$4","Ap",8,0,null,6,[],90,[],91,[],92,[]],
 hv:[function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
 for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},"call$2","QY",4,0,null,91,[],92,[]],
-IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"call$3","k2",6,0,null,93,[],94,[],95,[]],
+return!0},"call$2","QY",4,0,null,93,[],94,[]],
+IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"call$3","k2",6,0,null,95,[],96,[],97,[]],
 XY:[function(a,b){var z,y
 if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="Null"
 if(b==null)return!0
@@ -1570,7 +1588,7 @@
 a=J.x(a)
 if(z!=null){y=z.slice()
 y.splice(0,0,a)}else y=a
-return H.t1(y,b)},"call$2","tk",4,0,null,96,[],92,[]],
+return H.t1(y,b)},"call$2","tk",4,0,null,98,[],94,[]],
 t1:[function(a,b){var z,y,x,w,v,u,t
 if(a===b)return!0
 if(a==null||b==null)return!0
@@ -1588,7 +1606,7 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},"call$2","Mb",4,0,null,91,[],92,[]],
+return H.hv(H.Y9(t,y),w)},"call$2","Mb",4,0,null,93,[],94,[]],
 Hc:[function(a,b,c){var z,y,x,w,v
 if(b==null&&a==null)return!0
 if(b==null)return c
@@ -1598,7 +1616,7 @@
 if(c){if(z<y)return!1}else if(z!==y)return!1
 for(x=0;x<y;++x){w=a[x]
 v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"call$3","C6",6,0,null,91,[],92,[],97,[]],
+if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"call$3","C6",6,0,null,93,[],94,[],99,[]],
 Vt:[function(a,b){var z,y,x,w,v,u
 if(b==null)return!0
 if(a==null)return!1
@@ -1609,7 +1627,7 @@
 if(!Object.hasOwnProperty.call(a,w))return!1
 v=b[w]
 u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"call$2","y3",4,0,null,91,[],92,[]],
+if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"call$2","y3",4,0,null,93,[],94,[]],
 Ly:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(!("func" in a))return!1
 if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
@@ -1631,12 +1649,12 @@
 n=w[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
 n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"call$2","Sj",4,0,null,91,[],92,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,17,[],47,[],87,[]],
+if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"call$2","Sj",4,0,null,93,[],94,[]],
+ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,17,[],47,[],89,[]],
 uc:[function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},"call$1","zB",2,0,null,98,[]],
+return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},"call$1","zB",2,0,null,100,[]],
 wzi:[function(a){return H.eQ(a)},"call$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],30,[]],
+iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,100,[],73,[],30,[]],
 w3:[function(a){var z,y,x,w,v,u
 z=$.NF.call$1(a)
 y=$.nw[z]
@@ -1662,16 +1680,16 @@
 if(v==="*")throw H.b(P.SY(z))
 if(init.leafTags[z]===true){u=H.Va(x)
 Object.defineProperty(Object.getPrototypeOf(a), init.dispatchPropertyName, {value: u, enumerable: false, writable: true, configurable: true})
-return u.i}else return H.Lc(a,x)},"call$1","eU",2,0,null,98,[]],
+return u.i}else return H.Lc(a,x)},"call$1","eU",2,0,null,100,[]],
 Lc:[function(a,b){var z,y
 z=Object.getPrototypeOf(a)
 y=J.Qu(b,z,null,null)
 Object.defineProperty(z, init.dispatchPropertyName, {value: y, enumerable: false, writable: true, configurable: true})
-return b},"call$2","qF",4,0,null,98,[],7,[]],
+return b},"call$2","qF",4,0,null,100,[],7,[]],
 Va:[function(a){return J.Qu(a,!1,null,!!a.$isXj)},"call$1","MlJ",2,0,null,7,[]],
 VF:[function(a,b,c){var z=b.prototype
 if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},"call$3","vi",6,0,null,99,[],100,[],8,[]],
+else return J.Qu(z,c,null,null)},"call$3","vi",6,0,null,101,[],102,[],8,[]],
 XD:[function(){if(!0===$.Bv)return
 $.Bv=!0
 H.Z1()},"call$0","Ki",0,0,null],
@@ -1704,7 +1722,7 @@
 $.NF=new H.dC(v)
 $.TX=new H.wN(u)
 $.x7=new H.VX(t)},"call$0","Hb",0,0,null],
-ud:[function(a,b){return a(b)||b},"call$2","rM",4,0,null,101,[],102,[]],
+ud:[function(a,b){return a(b)||b},"call$2","rM",4,0,null,103,[],104,[]],
 ZT:[function(a,b){var z,y,x,w,v,u
 z=H.VM([],[P.Od])
 y=b.length
@@ -1714,13 +1732,13 @@
 z.push(new H.tQ(v,b,a))
 u=v+x
 if(u===y)break
-else w=v===u?w+1:u}return z},"call$2","tl",4,0,null,107,[],108,[]],
+else w=v===u?w+1:u}return z},"call$2","tl",4,0,null,109,[],110,[]],
 m2:[function(a,b,c){var z,y
 if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
 else{z=J.x(b)
 if(!!z.$isVR){z=C.xB.yn(a,c)
 y=b.Ej
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,47,[],109,[],85,[]],
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,47,[],111,[],87,[]],
 ys:[function(a,b,c){var z,y,x,w,v
 if(typeof b==="string")if(b==="")if(a==="")return c
 else{z=P.p9("")
@@ -1733,7 +1751,7 @@
 else if(!!J.x(b).$isVR){v=b.gF4()
 v.lastIndex=0
 return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(new P.AT(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"call$3","uF",6,0,null,47,[],110,[],111,[]],
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"call$3","uF",6,0,null,47,[],112,[],113,[]],
 Zd:{
 "^":"a;"},
 xQ:{
@@ -1744,27 +1762,27 @@
 "^":"a;",
 gl0:function(a){return J.de(this.gB(this),0)},
 gor:function(a){return!J.de(this.gB(this),0)},
-bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
-Ix:[function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},"call$0","gPb",0,0,null],
-u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,48,[],354,[]],
-Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,48,[]],
-V1:[function(a){return this.Ix()},"call$0","gRa",0,0,null],
-FV:[function(a,b){return this.Ix()},"call$1","gDY",2,0,null,109,[]],
+bu:function(a){return P.vW(this)},
+Ix:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
+u:function(a,b,c){return this.Ix()},
+Rz:function(a,b){return this.Ix()},
+V1:function(a){return this.Ix()},
+FV:function(a,b){return this.Ix()},
 $isZ0:true},
 LPe:{
 "^":"pa;B>,HV,tc",
-di:[function(a){return this.gUQ(this).Vr(0,new H.LD(this,a))},"call$1","gmc",2,0,null,107,[]],
-x4:[function(a){if(typeof a!=="string")return!1
+di:function(a){return this.gUQ(this).Vr(0,new H.LD(this,a))},
+x4:function(a){if(typeof a!=="string")return!1
 if("__proto__"===a)return!1
-return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,48,[]],
-t:[function(a,b){if(!this.x4(b))return
-return this.TZ(b)},"call$1","gIA",2,0,null,48,[]],
-TZ:[function(a){return this.HV[a]},"call$1","gN4",2,0,null,48,[]],
-aN:[function(a,b){var z,y,x
+return this.HV.hasOwnProperty(a)},
+t:function(a,b){if(!this.x4(b))return
+return this.TZ(b)},
+TZ:function(a){return this.HV[a]},
+aN:function(a,b){var z,y,x
 z=this.tc
 for(y=0;y<z.length;++y){x=z[y]
-b.call$2(x,this.TZ(x))}},"call$1","gjw",2,0,null,117,[]],
-gvc:function(a){return H.VM(new H.XR(this),[H.Kp(this,0)])},
+b.call$2(x,this.TZ(x))}},
+gvc:function(){return H.VM(new H.XR(this),[H.Kp(this,0)])},
 gUQ:function(a){return H.K1(this.tc,new H.jJ(this),H.Kp(this,0),H.Kp(this,1))},
 $isyN:true},
 LD:{
@@ -1773,7 +1791,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
 jJ:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,48,[],"call"],
 $isEH:true},
 XR:{
@@ -1815,7 +1833,7 @@
 s=w+u
 if(s<0||s>=x.length)return H.e(x,s)
 v.u(0,new H.GD(t),x[s])}return v},
-ZU:[function(a){var z,y,x,w,v,u,t,s
+ZU:function(a){var z,y,x,w,v,u,t,s
 z=J.x(a)
 y=this.uk
 x=$.Dq.indexOf(y)!==-1
@@ -1831,22 +1849,22 @@
 else z=null}s=!0}else s=!1
 if(typeof u=="function"){if(!("$reflectable" in u))H.Hz(J.GL(this.gWa()))
 if(s)return new H.IW(H.zh(u),y,u,x,z)
-else return new H.A2(y,u,x,z)}else return new H.F3(z)},"call$1","gpW",2,0,null,6,[]],
-static:{"^":"Sb,HT,zl"}},
+else return new H.A2(y,u,x,z)}else return new H.F3(z)},
+static:{"^":"Sb,oY,zl"}},
 A2:{
 "^":"a;Pi<,mr,eK<,Ot",
 gpf:function(){return!1},
-Bj:[function(a,b){var z,y
+Bj:function(a,b){var z,y
 if(!this.eK){if(typeof b!=="object"||b===null||b.constructor!==Array)b=P.F(b,!0,null)
 z=a}else{y=[a]
 C.Nm.FV(y,b)
 z=this.Ot
 z=z!=null?z:a
-b=y}return this.mr.apply(z,b)},"call$2","gUT",4,0,null,147,[],87,[]]},
+b=y}return this.mr.apply(z,b)}},
 IW:{
 "^":"A2;qa,Pi,mr,eK,Ot",
 To:function(a){return this.qa.call$1(a)},
-Bj:[function(a,b){var z,y,x,w,v,u,t
+Bj:function(a,b){var z,y,x,w,v,u,t
 z=this.qa
 y=z.Rv
 x=y+z.hG
@@ -1861,45 +1879,46 @@
 else if(w<y)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too few)."))
 else if(w>x)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too many)."))
 for(t=w;t<x;++t)C.Nm.h(b,init.metadata[z.BX(0,t)])
-return this.mr.apply(v,b)},"call$2","gUT",4,0,null,147,[],87,[]]},
+return this.mr.apply(v,b)}},
 F3:{
 "^":"a;e0",
 gpf:function(){return!0},
-Bj:[function(a,b){var z=this.e0
-return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],336,[]]},
+Bj:function(a,b){var z=this.e0
+return J.jf(z==null?a:z,b)}},
 FD:{
 "^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
-XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,356,[]],
-BX:[function(a,b){var z=this.Rv
+XL:function(a){var z=this.Rn[2*a+this.hG+3]
+return init.metadata[z]},
+BX:function(a,b){var z=this.Rv
 if(J.u6(b,z))return
-return this.Rn[3+b-z]},"call$1","gkv",2,0,null,356,[]],
-Fk:[function(a){var z=this.Rv
+return this.Rn[3+b-z]},
+Fk:function(a){var z=this.Rv
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.BX(0,a)
-return this.BX(0,this.e4(a-z))},"call$1","gtW",2,0,null,356,[]],
-KE:[function(a){var z=this.Rv
+return this.BX(0,this.e4(a-z))},
+KE:function(a){var z=this.Rv
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.XL(a)
-return this.XL(this.e4(a-z))},"call$1","gX4",2,0,null,356,[]],
-e4:[function(a){var z,y,x,w,v,u,t
+return this.XL(this.e4(a-z))},
+e4:function(a){var z,y,x,w,v,u
 z={}
 if(this.NE==null){y=this.hG
 this.NE=Array(y)
 x=H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,J.im])
-for(w=this.Rv,v=this.Rn,u=0;u<y;++u){t=w+u
-x.u(0,init.metadata[v[2*t+y+3]],t)}z.a=0
-y=x.gvc(x)
+for(w=this.Rv,v=0;v<y;++v){u=w+v
+x.u(0,this.XL(u),u)}z.a=0
+y=x.gvc()
 y=P.F(y,!0,H.ip(y,"mW",0))
 H.rd(y,null)
 H.bQ(y,new H.Nv(z,this,x))}z=this.NE
 if(a<0||a>=z.length)return H.e(z,a)
-return z[a]},"call$1","gQF",2,0,null,357,[]],
-hl:[function(a){var z,y
+return z[a]},
+hl:function(a){var z,y
 z=this.AM
 if(typeof z=="number")return init.metadata[z]
 else if(typeof z=="function"){y=new a()
 H.VM(y,y["<>"])
-return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,358,[]],
+return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},
 gx5:function(){return this.mr.$reflectionName},
 static:{"^":"vS,FV,C1,H6",zh:function(a){var z,y,x,w
 z=a.$reflectionInfo
@@ -1922,7 +1941,7 @@
 z[x]=y},"call$1",null,2,0,null,12,[],"call"],
 $isEH:true},
 Cj:{
-"^":"Tp:359;a,b,c",
+"^":"Tp:294;a,b,c",
 call$2:[function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
@@ -1930,14 +1949,14 @@
 z.a=z.a+1},"call$2",null,4,0,null,12,[],52,[],"call"],
 $isEH:true},
 u8:{
-"^":"Tp:359;a,b",
+"^":"Tp:294;a,b",
 call$2:[function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"call$2",null,4,0,null,356,[],30,[],"call"],
+else this.a.a=!0},"call$2",null,4,0,null,295,[],30,[],"call"],
 $isEH:true},
 Zr:{
 "^":"a;bT,rq,Xs,Fa,Ga,EP",
-qS:[function(a){var z,y,x
+qS:function(a){var z,y,x
 z=new RegExp(this.bT).exec(a)
 if(z==null)return
 y={}
@@ -1951,7 +1970,7 @@
 if(x!==-1)y.method=z[x+1]
 x=this.EP
 if(x!==-1)y.receiver=z[x+1]
-return y},"call$1","gul",2,0,null,24,[]],
+return y},
 static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
 a=a.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
@@ -1977,19 +1996,19 @@
 }(a)},"call$1","cl",2,0,null,54,[]]}},
 W0:{
 "^":"Ge;K9,Ga",
-bu:[function(a){var z=this.Ga
+bu:function(a){var z=this.Ga
 if(z==null)return"NullError: "+H.d(this.K9)
-return"NullError: Cannot call \""+H.d(z)+"\" on null"},"call$0","gXo",0,0,null],
+return"NullError: Cannot call \""+H.d(z)+"\" on null"},
 $ismp:true,
 $isGe:true},
 az:{
 "^":"Ge;K9,Ga,EP",
-bu:[function(a){var z,y
+bu:function(a){var z,y
 z=this.Ga
 if(z==null)return"NoSuchMethodError: "+H.d(this.K9)
 y=this.EP
 if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.K9)+")"
-return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},"call$0","gXo",0,0,null],
+return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},
 $ismp:true,
 $isGe:true,
 static:{T3:function(a,b){var z,y
@@ -1999,56 +2018,56 @@
 return new H.az(a,y,z)}}},
 vV:{
 "^":"Ge;K9",
-bu:[function(a){var z=this.K9
-return C.xB.gl0(z)?"Error":"Error: "+z},"call$0","gXo",0,0,null]},
+bu:function(a){var z=this.K9
+return C.xB.gl0(z)?"Error":"Error: "+z}},
 Am:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},"call$1",null,2,0,null,159,[],"call"],
+return a},"call$1",null,2,0,null,161,[],"call"],
 $isEH:true},
 XO:{
 "^":"a;lA,ui",
-bu:[function(a){var z,y
+bu:function(a){var z,y
 z=this.ui
 if(z!=null)return z
 z=this.lA
 y=typeof z==="object"?z.stack:null
 z=y==null?"":y
 this.ui=z
-return z},"call$0","gXo",0,0,null]},
+return z}},
 dr:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){return this.a.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 TL:{
-"^":"Tp:115;b,c",
+"^":"Tp:117;b,c",
 call$0:[function(){return this.b.call$1(this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 KX:{
-"^":"Tp:115;d,e,f",
+"^":"Tp:117;d,e,f",
 call$0:[function(){return this.d.call$2(this.e,this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uZ:{
-"^":"Tp:115;UI,bK,Gq,Rm",
+"^":"Tp:117;UI,bK,Gq,Rm",
 call$0:[function(){return this.UI.call$3(this.bK,this.Gq,this.Rm)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 OQ:{
-"^":"Tp:115;w3,HZ,mG,xC,cj",
+"^":"Tp:117;w3,HZ,mG,xC,cj",
 call$0:[function(){return this.w3.call$4(this.HZ,this.mG,this.xC,this.cj)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Tp:{
 "^":"a;",
-bu:[function(a){return"Closure"},"call$0","gXo",0,0,null],
+bu:function(a){return"Closure"},
 $isTp:true,
 $isEH:true},
 Bp:{
 "^":"Tp;"},
 v:{
 "^":"Bp;nw<,jm<,EP,RA>",
-n:[function(a,b){if(b==null)return!1
+n:function(a,b){if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isv)return!1
-return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},"call$1","gUJ",2,0,null,109,[]],
+return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},
 giO:function(a){var z,y
 z=this.EP
 if(z==null)y=H.eQ(this.nw)
@@ -2063,7 +2082,7 @@
 y.fixed$length=init
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}},"call$1","ec",2,0,null,70,[]]}},
+if(z[v]===a)return v}},"call$1","ec",2,0,null,72,[]]}},
 qq:{
 "^":"a;QW"},
 dN:{
@@ -2072,22 +2091,22 @@
 "^":"a;oc>"},
 Pe:{
 "^":"Ge;G1>",
-bu:[function(a){return this.G1},"call$0","gXo",0,0,null],
+bu:function(a){return this.G1},
 $isGe:true,
 static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
 Eq:{
 "^":"Ge;G1>",
-bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"call$0","gXo",0,0,null],
+bu:function(a){return"RuntimeError: "+H.d(this.G1)},
 static:{Ef:function(a){return new H.Eq(a)}}},
 q1:{
 "^":"a;"},
 tD:{
 "^":"q1;dw,Iq,is,p6",
-BD:[function(a){var z=this.rP(a)
-return z==null?!1:H.Ly(z,this.za())},"call$1","gQ4",2,0,null,54,[]],
-rP:[function(a){var z=J.x(a)
-return"$signature" in z?z.$signature():null},"call$1","gie",2,0,null,96,[]],
-za:[function(){var z,y,x,w,v,u,t
+BD:function(a){var z=this.rP(a)
+return z==null?!1:H.Ly(z,this.za())},
+rP:function(a){var z=J.x(a)
+return"$signature" in z?z.$signature():null},
+za:function(){var z,y,x,w,v,u,t
 z={ "func": "dynafunc" }
 y=this.dw
 x=J.x(y)
@@ -2101,8 +2120,8 @@
 if(y!=null){w={}
 v=H.kU(y)
 for(x=v.length,u=0;u<x;++u){t=v[u]
-w[t]=y[t].za()}z.named=w}return z},"call$0","gGp",0,0,null],
-bu:[function(a){var z,y,x,w,v,u,t,s
+w[t]=y[t].za()}z.named=w}return z},
+bu:function(a){var z,y,x,w,v,u,t,s
 z=this.Iq
 if(z!=null)for(y=z.length,x="(",w=!1,v=0;v<y;++v,w=!0){u=z[v]
 if(w)x+=", "
@@ -2116,28 +2135,28 @@
 t=H.kU(z)
 for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
 if(w)x+=", "
-x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},"call$0","gXo",0,0,null],
+x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},
 static:{"^":"Ot",Dz:[function(a){var z,y,x
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"call$1","eL",2,0,null,73,[]]}},
+return z},"call$1","At",2,0,null,75,[]]}},
 hJ:{
 "^":"q1;",
-bu:[function(a){return"dynamic"},"call$0","gXo",0,0,null],
-za:[function(){return},"call$0","gGp",0,0,null],
+bu:function(a){return"dynamic"},
+za:function(){return},
 $ishJ:true},
 tu:{
 "^":"q1;oc>",
-za:[function(){var z,y
+za:function(){var z,y
 z=this.oc
 y=init.allClasses[z]
 if(y==null)throw H.b("no type for '"+H.d(z)+"'")
-return y},"call$0","gGp",0,0,null],
-bu:[function(a){return this.oc},"call$0","gXo",0,0,null]},
+return y},
+bu:function(a){return this.oc}},
 fw:{
 "^":"q1;oc>,re<,Et",
-za:[function(){var z,y
+za:function(){var z,y
 z=this.Et
 if(z!=null)return z
 z=this.oc
@@ -2146,42 +2165,42 @@
 if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
 for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
-return y},"call$0","gGp",0,0,null],
-bu:[function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"},"call$0","gXo",0,0,null]},
+return y},
+bu:function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"}},
 ZV:{
 "^":"Ge;K9",
-bu:[function(a){return"Unsupported operation: "+this.K9},"call$0","gXo",0,0,null],
+bu:function(a){return"Unsupported operation: "+this.K9},
 $ismp:true,
 $isGe:true,
 static:{WE:function(a){return new H.ZV(a)}}},
 cu:{
 "^":"a;LU<,ke",
-bu:[function(a){var z,y,x
+bu:function(a){var z,y,x
 z=this.ke
 if(z!=null)return z
 y=this.LU
 x=init.mangledGlobalNames[y]
 y=x==null?y:x
 this.ke=y
-return y},"call$0","gXo",0,0,null],
+return y},
 giO:function(a){return J.v1(this.LU)},
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},
 $iscu:true,
 $isuq:true},
-Lm:{
+QT:{
 "^":"a;XP<,oc>,kU>"},
 dC:{
-"^":"Tp:112;a",
-call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,96,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true},
 wN:{
-"^":"Tp:360;b",
-call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,96,[],99,[],"call"],
+"^":"Tp:296;b",
+call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,98,[],101,[],"call"],
 $isEH:true},
 VX:{
 "^":"Tp:32;c",
-call$1:[function(a){return this.c(a)},"call$1",null,2,0,null,99,[],"call"],
+call$1:[function(a){return this.c(a)},"call$1",null,2,0,null,101,[],"call"],
 $isEH:true},
 VR:{
 "^":"a;Ej,Ii,Ua",
@@ -2197,21 +2216,21 @@
 z=H.v4(z.source+"|()",z.multiline,!z.ignoreCase,!0)
 this.Ua=z
 return z},
-ej:[function(a){var z
+ej:function(a){var z
 if(typeof a!=="string")H.vh(new P.AT(a))
 z=this.Ej.exec(a)
 if(z==null)return
-return H.yx(this,z)},"call$1","gvz",2,0,null,343,[]],
-zD:[function(a){if(typeof a!=="string")H.vh(new P.AT(a))
-return this.Ej.test(a)},"call$1","guf",2,0,null,343,[]],
-dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,343,[]],
-yk:[function(a,b){var z,y
+return H.yx(this,z)},
+zD:function(a){if(typeof a!=="string")H.vh(new P.AT(a))
+return this.Ej.test(a)},
+dd:function(a,b){return new H.KW(this,b)},
+yk:function(a,b){var z,y
 z=this.gF4()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
-return H.yx(this,y)},"call$2","gow",4,0,null,14,[],123,[]],
-Bh:[function(a,b){var z,y,x,w
+return H.yx(this,y)},
+Bh:function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
 y=z.exec(a)
@@ -2221,9 +2240,14 @@
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
 C.Nm.sB(y,w)
-return H.yx(this,y)},"call$2","gm4",4,0,null,14,[],123,[]],
-wL:[function(a,b,c){if(c<0||c>J.q8(b))throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,339,14,[],123,[]],
+return H.yx(this,y)},
+wL:function(a,b,c){var z
+if(c>=0){z=J.q8(b)
+if(typeof z!=="number")return H.s(z)
+z=c>z}else z=!0
+if(z)throw H.b(P.TE(c,0,J.q8(b)))
+return this.Bh(b,c)},
+R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
 $isSP:true,
 static:{v4:[function(a,b,c,d){var z,y,x,w,v
@@ -2233,12 +2257,12 @@
 w=(function() {try {return new RegExp(a, z + y + x);} catch (e) {return e;}})()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"call$4","HU",8,0,null,103,[],104,[],105,[],106,[]]}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"call$4","HU",8,0,null,105,[],106,[],107,[],108,[]]}},
 EK:{
 "^":"a;zO,QK",
-t:[function(a,b){var z=this.QK
+t:function(a,b){var z=this.QK
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,15,[]],
+return z[b]},
 VO:function(a,b){},
 $isOd:true,
 static:{yx:function(a,b){var z=new H.EK(a,b)
@@ -2252,7 +2276,7 @@
 Pb:{
 "^":"a;VV,rv,Wh",
 gl:function(){return this.Wh},
-G:[function(){var z,y,x
+G:function(){var z,y,x
 if(this.rv==null)return!1
 z=this.Wh
 if(z!=null){z=z.QK
@@ -2265,27 +2289,27 @@
 z=this.VV.yk(this.rv,x)
 this.Wh=z
 if(z==null){this.rv=null
-return!1}return!0},"call$0","gqy",0,0,null]},
+return!1}return!0}},
 tQ:{
 "^":"a;M,J9,zO",
-t:[function(a,b){if(!J.de(b,0))H.vh(P.N(b))
-return this.zO},"call$1","gIA",2,0,null,361,[]],
+t:function(a,b){if(!J.de(b,0))H.vh(P.N(b))
+return this.zO},
 $isOd:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
 m7:[function(a){var z
 N.Jx("").To("Google Charts API loaded")
 z=J.UQ(J.UQ($.cM(),"google"),"visualization")
 $.NR=z
-return z},"call$1","vN",2,0,112,113,[]],
+return z},"call$1","vN",2,0,114,115,[]],
 mL:{
-"^":["Pi;Z6<-362,zf>-363,Eb,AJ,fz,AP,Lk",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,364,"isolate",365,366],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,367,30,[],"isolate",365],
-gn9:[function(a){return this.AJ},null,null,1,0,368,"response",365,366],
-sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,369,30,[],"response",365],
-gKw:[function(){return this.fz},null,null,1,0,370,"args",365,366],
-sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,32,30,[],"args",365],
-Da:[function(){var z,y
+"^":["Pi;Z6<-297,zf>-298,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,299,"isolate",300,301],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,302,30,[],"isolate",300],
+gn9:[function(a){return this.AJ},null,null,1,0,303,"response",300,301],
+sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,304,30,[],"response",300],
+gKw:[function(){return this.fz},null,null,1,0,305,"args",300,301],
+sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,32,30,[],"args",300],
+Da:function(){var z,y
 z=this.Z6
 z.sec(this)
 z.kI()
@@ -2293,42 +2317,43 @@
 y=z.gG2()
 H.VM(new P.Ik(y),[H.Kp(y,0)]).yI(this.gbf())
 z=z.gLi()
-H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},"call$0","gLW",0,0,null],
+H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
 kj:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"call$1","gbf",2,0,371,159,[]],
+this.Z6.Mp()},"call$1","gbf",2,0,306,161,[]],
 t1:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"call$1","gXa",2,0,372,373,[]],
+this.Z6.Mp()},"call$1","gXa",2,0,307,308,[]],
 US:function(){this.Da()},
 hq:function(){this.Da()}},
 Kf:{
 "^":"a;Yb<",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gWT:function(a){return this.Yb.nQ("getNumberOfRows")},
-Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],374,[]],
-Ti:[function(){var z=this.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gA6",0,0,null],
-aJ:[function(a,b){var z=[]
+Gl:function(a,b){this.Yb.V7("addColumn",[a,b])},
+Ti:function(){var z=this.Yb
+z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
+aJ:function(a,b){var z=[]
 C.Nm.FV(z,H.VM(new H.A8(b,P.En()),[null,null]))
-this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,375,[]]},
+this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])}},
 qu:{
 "^":"a;vR,bG>",
-u5:[function(){var z,y,x
+u5:function(){var z,y,x
 z=this.vR.nQ("getSortInfo")
 if(z!=null&&!J.de(J.UQ(z,"column"),-1)){y=this.bG
 x=J.U6(z)
 y.u(0,"sortColumn",x.t(z,"column"))
-y.u(0,"sortAscending",x.t(z,"ascending"))}},"call$0","gmf",0,0,null],
-W2:[function(a){var z=P.jT(this.bG)
-this.vR.V7("draw",[a.gYb(),z])},"call$1","gnS",2,0,null,185,[]]},
+y.u(0,"sortAscending",x.t(z,"ascending"))}},
+W2:function(a){var z=P.jT(this.bG)
+this.vR.V7("draw",[a.gYb(),z])}},
 dZ:{
-"^":"Pi;ec?,JL,AP,Lk",
-gjW:[function(){return this.JL},null,null,1,0,370,"currentHash",365,366],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",365],
-kI:[function(){var z=C.PP.aM(window)
+"^":"Pi;ec?,JL,AP,fn",
+gjW:[function(){return this.JL},null,null,1,0,305,"currentHash",300,301],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",300],
+kI:function(){var z=C.PP.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
-J.We(C.ol.gyH(window),"#/vm")},"call$0","gV3",0,0,null],
-Mp:[function(){J.We(C.ol.gyH(window),"")},"call$0","ghy",0,0,null],
-df:[function(){var z,y,x
+if(J.de(J.Co(C.ol.gyH(window)),""))J.We(C.ol.gyH(window),"#/vm")
+else this.df()},
+Mp:function(){J.We(C.ol.gyH(window),"")},
+df:function(){var z,y,x
 z=J.Co(C.ol.gyH(window))
 z=F.Wi(this,C.h1,this.JL,z)
 this.JL=z
@@ -2338,46 +2363,51 @@
 if(0>=z)return H.e(y,0)
 x=z>1?y[1]:""
 if(z>2)N.Jx("").j2("Found more than 2 #-characters in "+H.d(this.JL))
-this.ec.zf.ox(J.ZZ(this.JL,2)).ml(new G.GH(this,x))},"call$0","glq",0,0,null],
+this.ec.zf.cv(J.ZZ(this.JL,2)).ml(new G.GH(this,x))},
 static:{"^":"K3D"}},
 Qe:{
-"^":"Tp:112;a",
-call$1:[function(a){this.a.df()},"call$1",null,2,0,null,376,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){this.a.df()},"call$1",null,2,0,null,309,[],"call"],
 $isEH:true},
 GH:{
-"^":"Tp:112;a,b",
+"^":"Tp:114;a,b",
 call$1:[function(a){var z,y
 z=this.a
 y=z.ec
 y.AJ=F.Wi(y,C.mE,y.AJ,a)
 z=z.ec
-z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"call$1",null,2,0,null,98,[],"call"],
+z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"call$1",null,2,0,null,100,[],"call"],
 $isEH:true},
 Y2:{
-"^":["Pi;eT>,yt<-377,wd>-378,oH<-379",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
+"^":["Pi;eT>,yt<-310,wd>-311,oH<-312",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
+gyX:[function(a){return this.R7},null,null,1,0,305,"expander",300,301],
+Qx:function(a){return this.gyX(this).call$0()},
+syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,32,30,[],"expander",300],
 goE:function(a){return this.z3},
 soE:function(a,b){var z=this.z3
 this.z3=b
-if(z!==b)if(b)this.C4(0)
-else this.o8()},
-r8:[function(){this.soE(0,!this.z3)
-return this.z3},"call$0","gMk",0,0,null],
+if(z!==b){z=this.R7
+if(b){this.R7=F.Wi(this,C.Of,z,"\u21b3")
+this.C4(0)}else{this.R7=F.Wi(this,C.Of,z,"\u2192")
+this.o8()}}},
+r8:function(){this.soE(0,!this.z3)
+return this.z3},
 $isY2:true},
 XN:{
-"^":["Pi;WT>-378,AP,Lk",function(){return[C.J19]},null,null],
-rT:[function(a){var z,y
+"^":["Pi;WT>-311,AP,fn",function(){return[C.J19]},null,null],
+rT:function(a){var z,y
 z=this.WT
 y=J.w1(z)
 y.V1(z)
 a.C4(0)
-y.FV(z,a.wd)},"call$1","gcr",2,0,null,380,[]],
-qU:[function(a){var z,y,x
+y.FV(z,a.wd)},
+qU:function(a){var z,y,x
 z=this.WT
 y=J.U6(z)
 x=y.t(z,a)
 if(x.r8())y.oF(z,y.u8(z,x)+1,J.uw(x))
-else this.PP(x)},"call$1","gMk",2,0,null,381,[]],
-PP:[function(a){var z,y,x,w,v
+else this.PP(x)},
+PP:function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.q8(z.gwd(a))
 if(J.de(y,0))return
@@ -2388,17 +2418,17 @@
 z=this.WT
 w=J.U6(z)
 v=w.u8(z,a)+1
-w.UZ(z,v,v+y)},"call$1","gNu",2,0,null,375,[]]}}],["app_bootstrap","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/index_devtools.html_bootstrap.dart",,E,{
+w.UZ(z,v,v+y)}}}],["app_bootstrap","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/index_devtools.html_bootstrap.dart",,E,{
 "^":"",
-YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
+YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
 $.uP=!1
-F.E2()},"call$0","nE",0,0,114]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+F.E2()},"call$0","nE",0,0,116]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 d1:{
-"^":["Ds;BW%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grs:[function(a){return a.BW},null,null,1,0,384,"msg",365,385],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,386,30,[],"msg",365],
-pA:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+"^":["Ds;BW%-313,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grs:[function(a){return a.BW},null,null,1,0,315,"msg",300,316],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,317,30,[],"msg",300],
+pA:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 "@":function(){return[C.jy]},
 static:{t4:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2411,15 +2441,15 @@
 a.X0=w
 C.J0.ZL(a)
 C.J0.oX(a)
-return a},null,null,0,0,115,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[388],
+return a},null,null,0,0,117,"new BreakpointListElement$created"]}},
+"+BreakpointListElement":[319],
 Ds:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
 Tg:{
-"^":["xI;tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.OS]},
+"^":["xI;tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"@":function(){return[C.tSc]},
 static:{rt:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -2432,16 +2462,16 @@
 a.X0=w
 C.oq.ZL(a)
 C.oq.oX(a)
-return a},null,null,0,0,115,"new ClassRefElement$created"]}},
-"+ClassRefElement":[391]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+return a},null,null,0,0,117,"new ClassRefElement$created"]}},
+"+ClassRefElement":[322]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 Jc:{
-"^":["Vfx;lb%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.lb},null,null,1,0,384,"cls",365,385],
-sRu:[function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)},null,null,3,0,386,30,[],"cls",365],
-vV:[function(a,b){return J.QP(a.lb).ox(J.WB(J.F8(a.lb),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,392,212,[],"eval"],
-pA:[function(a,b){J.am(a.lb).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
-"@":function(){return[C.oY]},
+"^":["Vfx;lb%-313,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.lb},null,null,1,0,315,"cls",300,316],
+sdG:[function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)},null,null,3,0,317,30,[],"cls",300],
+vV:[function(a,b){return J.QP(a.lb).cv(J.WB(J.F8(a.lb),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,323,214,[],"eval"],
+pA:[function(a,b){J.am(a.lb).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
+"@":function(){return[C.aQx]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -2453,14 +2483,17 @@
 a.X0=w
 C.ka.ZL(a)
 C.ka.oX(a)
-return a},null,null,0,0,115,"new ClassViewElement$created"]}},
-"+ClassViewElement":[393],
+return a},null,null,0,0,117,"new ClassViewElement$created"]}},
+"+ClassViewElement":[324],
 Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 CN:{
-"^":["xI;tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.tY},null,null,1,0,325,"code",301],
+aZ:[function(a,b){Q.xI.prototype.aZ.call(this,a,b)
+this.ct(a,C.b1,0,1)},"call$1","gLe",2,0,114,232,[],"refChanged"],
 "@":function(){return[C.U8]},
 static:{On:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2474,20 +2507,20 @@
 a.X0=w
 C.IK.ZL(a)
 C.IK.oX(a)
-return a},null,null,0,0,115,"new CodeRefElement$created"]}},
-"+CodeRefElement":[391]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+return a},null,null,0,0,117,"new CodeRefElement$created"]}},
+"+CodeRefElement":[322]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":["Dsd;Xx%-394,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.Xx},null,null,1,0,395,"code",365,385],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,396,30,[],"code",365],
+"^":["Dsd;Xx%-326,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.Xx},null,null,1,0,325,"code",300,316],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,327,30,[],"code",300],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z)},"call$0","gQd",0,0,114,"enteredView"],
-pA:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
-grK:[function(a){return"panel panel-success"},null,null,1,0,370,"cssPanelClass"],
+J.SK(z)},"call$0","gQd",0,0,116,"enteredView"],
+pA:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
+grK:[function(a){return"panel panel-success"},null,null,1,0,305,"cssPanelClass"],
 "@":function(){return[C.xW]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2500,34 +2533,34 @@
 a.X0=w
 C.ux.ZL(a)
 C.ux.oX(a)
-return a},null,null,0,0,115,"new CodeViewElement$created"]}},
-"+CodeViewElement":[397],
+return a},null,null,0,0,117,"new CodeViewElement$created"]}},
+"+CodeViewElement":[328],
 Dsd:{
 "^":"uL+Pi;",
 $isd3:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 i6:{
-"^":["tuj;zh%-398,HX%-398,Uy%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gAQ:[function(a){return a.zh},null,null,1,0,370,"iconClass",365,366],
-sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",365],
-gai:[function(a){return a.HX},null,null,1,0,370,"displayValue",365,366],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",365],
-gxj:[function(a){return a.Uy},null,null,1,0,399,"collapsed"],
+"^":["tuj;zh%-329,HX%-329,Uy%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gAQ:[function(a){return a.zh},null,null,1,0,305,"iconClass",300,301],
+sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",300],
+gai:[function(a){return a.HX},null,null,1,0,305,"displayValue",300,301],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",300],
+gxj:[function(a){return a.Uy},null,null,1,0,330,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,400,401,[],"collapsed"],
+this.SS(a)},null,null,3,0,331,332,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-this.SS(a)},"call$0","gQd",0,0,114,"enteredView"],
+this.SS(a)},"call$0","gQd",0,0,116,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
 this.SS(a)
-this.SS(a)},"call$3","gl8",6,0,402,21,[],310,[],79,[],"toggleDisplay"],
+this.SS(a)},"call$3","gl8",6,0,333,21,[],334,[],81,[],"toggleDisplay"],
 SS:[function(a){var z,y
 z=a.Uy
 y=a.zh
 if(z===!0){a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-down")
 a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
-a.HX=this.ct(a,C.Jw,a.HX,"block")}},"call$0","glg",0,0,114,"_refresh"],
+a.HX=this.ct(a,C.Jw,a.HX,"block")}},"call$0","glg",0,0,116,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-398,CF<-398",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-329,CF<-329",Hv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -2541,30 +2574,30 @@
 a.X0=w
 C.j8.ZL(a)
 C.j8.oX(a)
-return a},null,null,0,0,115,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[403],
+return a},null,null,0,0,117,"new CollapsibleContentElement$created"]}},
+"+CollapsibleContentElement":[335],
 tuj:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
-"^":["LP;GV%-390,Hu%-390,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-goE:[function(a){return a.GV},null,null,1,0,399,"expanded",365,366],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,400,30,[],"expanded",365],
-gO9:[function(a){return a.Hu},null,null,1,0,399,"busy",365,366],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,400,30,[],"busy",365],
-gFR:[function(a){return a.nx},null,null,1,0,115,"callback",365,385],
+"^":["LP;GV%-321,Hu%-321,nx%-84,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+goE:[function(a){return a.GV},null,null,1,0,330,"expanded",300,301],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,331,30,[],"expanded",300],
+gO9:[function(a){return a.Hu},null,null,1,0,330,"busy",300,301],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,331,30,[],"busy",300],
+gFR:[function(a){return a.nx},null,null,1,0,117,"callback",300,316],
 Ki:function(a){return this.gFR(a).call$0()},
 AV:function(a,b,c){return this.gFR(a).call$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,30,[],"callback",365],
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,114,30,[],"callback",300],
 Ey:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
-a.Hu=this.ct(a,C.S4,a.Hu,!1)},"call$0","goJ",0,0,114,"doneCallback"],
+a.Hu=this.ct(a,C.S4,a.Hu,!1)},"call$0","goJ",0,0,116,"doneCallback"],
 AZ:[function(a,b,c,d){var z=a.Hu
 if(z===!0)return
 if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gmd",6,0,404,131,[],187,[],280,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gmd",6,0,336,133,[],189,[],282,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -2580,10 +2613,10 @@
 a.X0=w
 C.O0.ZL(a)
 C.O0.oX(a)
-return a},null,null,0,0,115,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[405],
+return a},null,null,0,0,117,"new CurlyBlockElement$created"]}},
+"+CurlyBlockElement":[337],
 LP:{
-"^":"ir+Pi;",
+"^":"xc+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
 "^":"",
 G9:function(){var z,y
@@ -2593,20 +2626,20 @@
 if(y==null)return"registerElement" in document
 return J.de(J.UQ(y,"ready"),!0)},
 wJ:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){if(B.G9())return P.Ab(null,null)
 var z=H.VM(new W.RO(document,"WebComponentsReady",!1),[null])
 return z.gtH(z)},"call$0",null,0,0,null,"call"],
 $isEH: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.call$1(z.lo)},"call$2","Mn",4,0,null,116,[],117,[]],
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.call$1(z.lo)},"call$2","Mn",4,0,null,118,[],119,[]],
 Ck:[function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.call$1(z.lo)===!0)return!0
-return!1},"call$2","cs",4,0,null,116,[],117,[]],
+return!1},"call$2","cs",4,0,null,118,[],119,[]],
 n3:[function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.call$2(b,z.lo)
-return b},"call$3","hp",6,0,null,116,[],118,[],119,[]],
+return b},"call$3","hp",6,0,null,118,[],120,[],121,[]],
 mx:[function(a,b,c){var z,y,x,w
 for(y=0;x=$.RM(),y<x.length;++y){x=x[y]
 w=a
@@ -2616,13 +2649,13 @@
 z.We(a,", ")
 z.KF(c)}finally{x=$.RM()
 if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},"call$3","FQ",6,0,null,116,[],120,[],121,[]],
+x.pop()}return z.gvM()},"call$3","FQ",6,0,null,118,[],122,[],123,[]],
 rd:[function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},"call$2","xX",4,0,null,73,[],122,[]],
+H.ZE(a,0,a.length-1,b)},"call$2","xX",4,0,null,75,[],124,[]],
 K0:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 z=J.Wx(c)
-if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"call$3","Ze",6,0,null,73,[],123,[],124,[]],
+if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"call$3","Ze",6,0,null,75,[],125,[],126,[]],
 qG:[function(a,b,c,d,e){var z,y,x,w
 H.K0(a,b,c)
 z=J.xH(c,b)
@@ -2632,7 +2665,7 @@
 if(!!y.$isList){x=e
 w=d}else{w=y.eR(d,e).tt(0,!1)
 x=0}if(J.z8(J.WB(x,z),J.q8(w)))throw H.b(new P.lj("Not enough elements"))
-H.tb(w,x,a,b,z)},"call$5","it",10,0,null,73,[],123,[],124,[],110,[],125,[]],
+H.tb(w,x,a,b,z)},"call$5","it",10,0,null,75,[],125,[],126,[],112,[],127,[]],
 IC:[function(a,b,c){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
@@ -2649,36 +2682,36 @@
 H.qG(a,z,w,a,b)
 for(z=y.gA(c);z.G();b=u){v=z.gl()
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],15,[],116,[]],
+C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,75,[],15,[],118,[]],
 ed:[function(a,b,c){var z,y
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 for(z=J.GP(c);z.G();b=y){y=b+1
-C.Nm.u(a,b,z.gl())}},"call$3","Y1",6,0,null,73,[],15,[],116,[]],
+C.Nm.u(a,b,z.gl())}},"call$3","Y1",6,0,null,75,[],15,[],118,[]],
 tb:[function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
 if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"call$5","e8",10,0,null,126,[],127,[],128,[],129,[],130,[]],
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"call$5","e8",10,0,null,128,[],129,[],130,[],131,[],132,[]],
 TK:[function(a,b,c,d){var z
 if(c>=a.length)return-1
 if(c<0)c=0
 for(z=c;z<d;++z){if(z<0||z>=a.length)return H.e(a,z)
-if(J.de(a[z],b))return z}return-1},"call$4","vu",8,0,null,131,[],132,[],85,[],133,[]],
+if(J.de(a[z],b))return z}return-1},"call$4","vu",8,0,null,133,[],134,[],87,[],135,[]],
 lO:[function(a,b,c){var z,y
 if(typeof c!=="number")return c.C()
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
 for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.de(a[y],b))return y}return-1},"call$3","MW",6,0,null,131,[],132,[],85,[]],
+if(J.de(a[y],b))return y}return-1},"call$3","MW",6,0,null,133,[],134,[],87,[]],
 ZE:[function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
-else H.d4(a,b,c,d)},"call$4","UR",8,0,null,131,[],134,[],135,[],122,[]],
+else H.d4(a,b,c,d)},"call$4","UR",8,0,null,133,[],136,[],137,[],124,[]],
 w9:[function(a,b,c,d){var z,y,x,w,v,u
 for(z=J.WB(b,1),y=J.U6(a);x=J.Wx(z),x.E(z,c);z=x.g(z,1)){w=y.t(a,z)
 v=z
 while(!0){u=J.Wx(v)
 if(!(u.D(v,b)&&J.z8(d.call$2(y.t(a,u.W(v,1)),w),0)))break
 y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},"call$4","f7",8,0,null,131,[],134,[],135,[],122,[]],
+v=u.W(v,1)}y.u(a,v,w)}},"call$4","f7",8,0,null,133,[],136,[],137,[],124,[]],
 d4:[function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
 z=J.Wx(a0)
 y=J.Ts(J.WB(z.W(a0,b),1),6)
@@ -2779,32 +2812,32 @@
 k=e}else{t.u(a,i,t.t(a,j))
 d=x.W(j,1)
 t.u(a,j,h)
-j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"call$4","Hm",8,0,null,131,[],134,[],135,[],122,[]],
+j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"call$4","Hm",8,0,null,133,[],136,[],137,[],124,[]],
 aL:{
 "^":"mW;",
 gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.ip(this,"aL",0)])},
-aN:[function(a,b){var z,y
+aN:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.Zv(0,y))
-if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,406,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}},
 gl0:function(a){return J.de(this.gB(this),0)},
 grZ:function(a){if(J.de(this.gB(this),0))throw H.b(new P.lj("No elements"))
 return this.Zv(0,J.xH(this.gB(this),1))},
-tg:[function(a,b){var z,y
+tg:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(J.de(this.Zv(0,y),b))return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gdj",2,0,null,132,[]],
-Vr:[function(a,b){var z,y
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
+Vr:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gGI",2,0,null,407,[]],
-zV:[function(a,b){var z,y,x,w,v,u
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
+zV:function(a,b){var z,y,x,w,v,u
 z=this.gB(this)
 if(b.length!==0){y=J.x(z)
 if(y.n(z,0))return""
@@ -2823,18 +2856,18 @@
 for(;v<z;++v){u=this.Zv(0,v)
 u=typeof u==="string"?u:H.d(u)
 w.vM=w.vM+u
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,337,338,[]],
-ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,407,[]],
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
-es:[function(a,b,c){var z,y,x
+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.A8(this,b),[null,null])},"call$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},119,[]],
+es:function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=b
 x=0
 for(;x<z;++x){y=c.call$2(y,this.Zv(0,x))
-if(z!==this.gB(this))throw H.b(P.a4(this))}return y},"call$2","gTu",4,0,null,118,[],119,[]],
-eR:[function(a,b){return H.q9(this,b,null,null)},"call$1","gZo",2,0,null,130,[]],
-tt:[function(a,b){var z,y,x
+if(z!==this.gB(this))throw H.b(P.a4(this))}return y},
+eR:function(a,b){return H.q9(this,b,null,null)},
+tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
 if(typeof y!=="number")return H.s(y)
@@ -2846,7 +2879,8 @@
 if(!(x<y))break
 y=this.Zv(0,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,340,341,[]],
+z[x]=y;++x}return z},
+br:function(a){return this.tt(a,!0)},
 $isyN:true},
 nH:{
 "^":"aL;l6,SH,AN",
@@ -2867,19 +2901,19 @@
 x=this.AN
 if(x==null||J.J5(x,z))return J.xH(z,y)
 return J.xH(x,y)},
-Zv:[function(a,b){var z=J.WB(this.gjX(),b)
+Zv:function(a,b){var z=J.WB(this.gjX(),b)
 if(J.u6(b,0)||J.J5(z,this.gMa()))throw H.b(P.TE(b,0,this.gB(this)))
-return J.i4(this.l6,z)},"call$1","gRV",2,0,null,15,[]],
-eR:[function(a,b){if(J.u6(b,0))throw H.b(new P.bJ("value "+H.d(b)))
-return H.q9(this.l6,J.WB(this.SH,b),this.AN,null)},"call$1","gZo",2,0,null,130,[]],
-qZ:[function(a,b){var z,y,x
+return J.i4(this.l6,z)},
+eR:function(a,b){if(J.u6(b,0))throw H.b(new P.bJ("value "+H.d(b)))
+return H.q9(this.l6,J.WB(this.SH,b),this.AN,null)},
+qZ:function(a,b){var z,y,x
 if(J.u6(b,0))throw H.b(new P.bJ("value "+H.d(b)))
 z=this.AN
 y=this.SH
 if(z==null)return H.q9(this.l6,y,J.WB(y,b),null)
 else{x=J.WB(y,b)
 if(J.u6(z,x))return this
-return H.q9(this.l6,y,x,null)}},"call$1","gVw",2,0,null,130,[]],
+return H.q9(this.l6,y,x,null)}},
 Hd:function(a,b,c,d){var z,y,x
 z=this.SH
 y=J.Wx(z)
@@ -2893,7 +2927,7 @@
 a7:{
 "^":"a;l6,SW,G7,lo",
 gl:function(){return this.lo},
-G:[function(){var z,y,x,w
+G:function(){var z,y,x,w
 z=this.l6
 y=J.U6(z)
 x=y.gB(z)
@@ -2903,7 +2937,7 @@
 if(w>=x){this.lo=null
 return!1}this.lo=y.Zv(z,w)
 this.G7=this.G7+1
-return!0},"call$0","gqy",0,0,null]},
+return!0}},
 i1:{
 "^":"mW;l6,T6",
 mb:function(a){return this.T6.call$1(a)},
@@ -2913,7 +2947,7 @@
 gB:function(a){return J.q8(this.l6)},
 gl0:function(a){return J.FN(this.l6)},
 grZ:function(a){return this.mb(J.MQ(this.l6))},
-Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","gRV",2,0,null,15,[]],
+Zv:function(a,b){return this.mb(J.i4(this.l6,b))},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 static:{K1:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
@@ -2924,17 +2958,17 @@
 MH:{
 "^":"AC;lo,OI,T6",
 mb:function(a){return this.T6.call$1(a)},
-G:[function(){var z=this.OI
+G:function(){var z=this.OI
 if(z.G()){this.lo=this.mb(z.gl())
 return!0}this.lo=null
-return!1},"call$0","gqy",0,0,null],
+return!1},
 gl:function(){return this.lo},
 $asAC:function(a,b){return[b]}},
 A8:{
 "^":"aL;CR,T6",
 mb:function(a){return this.T6.call$1(a)},
 gB:function(a){return J.q8(this.CR)},
-Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","gRV",2,0,null,15,[]],
+Zv:function(a,b){return this.mb(J.i4(this.CR,b))},
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
@@ -2947,8 +2981,8 @@
 SO:{
 "^":"AC;OI,T6",
 mb:function(a){return this.T6.call$1(a)},
-G:[function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
-return!1},"call$0","gqy",0,0,null],
+G:function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
+return!1},
 gl:function(){return this.OI.gl()}},
 kV:{
 "^":"mW;l6,T6",
@@ -2961,14 +2995,14 @@
 "^":"a;OI,T6,C2,lo",
 mb:function(a){return this.T6.call$1(a)},
 gl:function(){return this.lo},
-G:[function(){var z,y
+G:function(){var z,y
 z=this.C2
 if(z==null)return!1
 for(y=this.OI;!z.G();){this.lo=null
 if(y.G()){this.C2=null
 z=J.GP(this.mb(y.gl()))
 this.C2=z}else return!1}this.lo=this.C2.gl()
-return!0},"call$0","gqy",0,0,null]},
+return!0}},
 ao:{
 "^":"mW;l6,Vg",
 gA:function(a){var z=this.l6
@@ -2989,17 +3023,17 @@
 $isyN:true},
 y9:{
 "^":"AC;OI,GE",
-G:[function(){var z=J.xH(this.GE,1)
+G:function(){var z=J.xH(this.GE,1)
 this.GE=z
 if(J.J5(z,0))return this.OI.G()
 this.GE=-1
-return!1},"call$0","gqy",0,0,null],
+return!1},
 gl:function(){if(J.u6(this.GE,0))return
 return this.OI.gl()}},
 AM:{
 "^":"mW;l6,FT",
-eR:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(new P.bJ("value "+H.d(b)))
-return H.ke(this.l6,J.WB(this.FT,b),H.Kp(this,0))},"call$1","gZo",2,0,null,198,[]],
+eR:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(new P.bJ("value "+H.d(b)))
+return H.ke(this.l6,J.WB(this.FT,b),H.Kp(this,0))},
 gA:function(a){var z=this.l6
 z=new H.U1(z.gA(z),this.FT)
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -3022,43 +3056,44 @@
 $isyN:true},
 U1:{
 "^":"AC;OI,FT",
-G:[function(){var z,y,x
+G:function(){var z,y,x
 z=this.OI
 y=0
 while(!0){x=this.FT
 if(typeof x!=="number")return H.s(x)
 if(!(y<x))break
 z.G();++y}this.FT=0
-return z.G()},"call$0","gqy",0,0,null],
+return z.G()},
 gl:function(){return this.OI.gl()}},
-Ma:{
+yq:{
 "^":"a;",
-G:[function(){return!1},"call$0","gqy",0,0,null],
+G:function(){return!1},
 gl:function(){return}},
 SU7:{
 "^":"a;",
 sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,30,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gJe",4,0,null,15,[],30,[]],
-oF:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gFD",4,0,null,408,[],116,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,116,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","guH",2,0,null,132,[]],
-V1:[function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},"call$0","gRa",0,0,null],
-UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$2","gYH",4,0,null,123,[],124,[]]},
+h:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
+oF:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
+FV:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
+Rz:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
+V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
+UZ:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
 Tv:{
 "^":"a;",
-u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,15,[],30,[]],
+u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gpH",4,0,null,408,[],116,[]],
-h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,30,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gJe",4,0,null,15,[],30,[]],
-oF:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gFD",4,0,null,408,[],116,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,116,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","guH",2,0,null,132,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,82,122,[]],
-V1:[function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},"call$0","gRa",0,0,null],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$2","gYH",4,0,null,123,[],124,[]],
+Mh:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
+h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+oF:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+FV:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+Rz:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
+GT:function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},
+V1:function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},
+YW:function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+UZ:function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
 $isList:true,
 $askF:null,
 $isyN:true,
@@ -3074,21 +3109,21 @@
 iK:{
 "^":"aL;CR",
 gB:function(a){return J.q8(this.CR)},
-Zv:[function(a,b){var z,y
+Zv:function(a,b){var z,y
 z=this.CR
 y=J.U6(z)
-return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","gRV",2,0,null,15,[]]},
+return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))}},
 GD:{
 "^":"a;fN>",
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isGD&&J.de(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)+"\")"},"call$0","gXo",0,0,null],
+bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
 $isGD:true,
 $iswv:true,
-static:{"^":"RWj,yq,quP,xc,Np,p1",u1:[function(a){var z,y
+static:{"^":"RWj,z3,quP,kj,Np,p1",u1:[function(a){var z,y
 z=J.U6(a)
 if(z.gl0(a)!==!0){y=$.bw().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
@@ -3099,15 +3134,15 @@
 "^":"",
 YC:[function(a){if(a==null)return
 return new H.GD(a)},"call$1","Rc",2,0,null,12,[]],
-X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,136,[]],
+X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,138,[]],
 vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
-else return new H.iu(a,4)},"call$1","Yf",2,0,137,138,[]],
+else return new H.iu(a,4)},"call$1","Yf",2,0,139,140,[]],
 jO:[function(a){var z,y
 z=$.Sl().t(0,a)
 y=J.x(a)
 if(y.n(a,"dynamic"))return $.P8()
 if(y.n(a,"void"))return $.oj()
-return H.tT(H.YC(z==null?a:z),a)},"call$1","vC",2,0,null,139,[]],
+return H.tT(H.YC(z==null?a:z),a)},"call$1","vC",2,0,null,141,[]],
 tT:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=J.U6(b)
 y=z.u8(b,"/")
@@ -3142,15 +3177,15 @@
 if(m==null||m.length===0)x=n
 else{for(z=m.length,l="dynamic",k=1;k<z;++k)l+=",dynamic"
 x=new H.bl(n,l,null,null,null,null,null,null,null,null,null,null,null,null,null,n.If)}}$.tY[b]=x
-return x},"call$2","ER",4,0,null,136,[],139,[]],
+return x},"call$2","ER",4,0,null,138,[],141,[]],
 Vv:[function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"call$1","yM",2,0,null,140,[]],
+if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"call$1","yM",2,0,null,142,[]],
 Fk:[function(a){var z,y,x
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.gxV())z.u(0,x.gIf(),x)}return z},"call$1","Pj",2,0,null,140,[]],
+if(x.gxV())z.u(0,x.gIf(),x)}return z},"call$1","Pj",2,0,null,142,[]],
 vE:[function(a,b){var z,y,x,w,v
 z=P.L5(null,null,null,null,null)
 z.FV(0,b)
@@ -3158,7 +3193,7 @@
 if(x.ghB()){w=x.gIf().fN
 v=J.U6(w)
 if(!!J.x(z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))).$isRY)continue}if(x.gxV())continue
-z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,140,[],141,[]],
+z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,142,[],143,[]],
 MJ:[function(a,b){var z,y,x,w
 z=[]
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();)z.push(H.jO(y.lo))
@@ -3166,14 +3201,14 @@
 x.G()
 w=x.lo
 for(;x.G();)w=new H.BI(w,x.lo,null,null,H.YC(b))
-return w},"call$2","R9",4,0,null,142,[],139,[]],
+return w},"call$2","R9",4,0,null,144,[],141,[]],
 w2:[function(a,b){var z,y,x
 z=J.U6(a)
 y=0
 while(!0){x=z.gB(a)
 if(typeof x!=="number")return H.s(x)
 if(!(y<x))break
-if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(new P.AT("Type variable not present in list."))},"call$2","CE",4,0,null,144,[],12,[]],
+if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(new P.AT("Type variable not present in list."))},"call$2","CE",4,0,null,146,[],12,[]],
 Jf:[function(a,b){var z,y,x,w,v,u,t
 z={}
 z.a=null
@@ -3189,9 +3224,9 @@
 else{z=new H.rh(z)
 if(typeof b==="number"){t=z.call$1(b)
 if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
-return P.re(C.yQ)},"call$2","xN",4,0,null,145,[],11,[]],
+return P.re(C.yQ)},"call$2","xN",4,0,null,147,[],11,[]],
 fb:[function(a,b){if(a==null)return b
-return H.YC(H.d(a.gUx().fN)+"."+H.d(b.fN))},"call$2","WS",4,0,null,145,[],146,[]],
+return H.YC(H.d(J.GL(J.Ba(a)))+"."+H.d(b.fN))},"call$2","WS",4,0,null,147,[],148,[]],
 pj:[function(a){var z,y,x,w
 z=a["@"]
 if(z!=null)return z()
@@ -3201,7 +3236,7 @@
 return H.VM(new H.A8(y,new H.ye()),[null,null]).br(0)}x=Function.prototype.toString.call(a)
 w=C.xB.cn(x,new H.VR(H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
 if(w===-1)return C.xD;++w
-return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"call$1","C7",2,0,null,147,[]],
+return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"call$1","C7",2,0,null,149,[]],
 jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=J.x(b)
 if(!!z.$isList){y=H.Mk(z.t(b,0),",")
@@ -3212,10 +3247,10 @@
 s=x[v]
 v=t}else s=null
 r=H.pS(u,s,a,c)
-if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,145,[],148,[],66,[],56,[]],
+if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,147,[],150,[],66,[],56,[]],
 Mk:[function(a,b){var z=J.U6(a)
 if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"call$2","EO",4,0,null,14,[],103,[]],
+return z.Fr(a,b)},"call$2","EO",4,0,null,14,[],105,[]],
 BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
 default:return!1}},"call$1","IX",2,0,null,12,[]],
 Y6:[function(a){var z,y
@@ -3251,14 +3286,14 @@
 m=q==null?C.xD:q()
 J.bi(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"call$0","jc",0,0,null]}},
 nI:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){return H.VM([],[P.D4])},"call$0",null,0,0,null,"call"],
 $isEH:true},
 jU:{
 "^":"a;",
-bu:[function(a){return this.gOO()},"call$0","gXo",0,0,null],
-IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,47,[]],
-Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gR6",4,0,null,47,[],172,[]],
+bu:function(a){return this.gOO()},
+IB:function(a){throw H.b(P.SY(null))},
+Hy:function(a,b){throw H.b(P.SY(null))},
 $isej:true},
 Lj:{
 "^":"jU;MA",
@@ -3267,21 +3302,21 @@
 return z.gUQ(z).XG(0,new H.mb())},
 $isej:true},
 mb:{
-"^":"Tp:410;",
-call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:339;",
+call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,338,[],"call"],
 $isEH:true},
 cb:{
 "^":"jU;If<",
-gUx:function(){return H.fb(this.gXP(),this.gIf())},
+gUx:function(a){return H.fb(this.gXP(),this.gIf())},
 gq4:function(){return J.co(this.gIf().fN,"_")},
-bu:[function(a){return this.gOO()+" on '"+H.d(this.gIf().fN)+"'"},"call$0","gXo",0,0,null],
-jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gqi",4,0,null,49,[],50,[]],
+bu:function(a){return this.gOO()+" on '"+H.d(this.gIf().fN)+"'"},
+jd:function(a,b){throw H.b(H.Ef("Should not call _invoke"))},
 $isNL:true,
 $isej:true},
 cw:{
-"^":"EE;XP<,yG,Nz,LQ,If",
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,109,[]],
+"^":"EE;XP<,zn,Nz,LQ,If",
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},
 giO:function(a){var z,y
 z=J.v1(C.Gp.LU)
 if(typeof z!=="number")return H.s(z)
@@ -3290,7 +3325,7 @@
 gOO:function(){return"TypeVariableMirror"},
 gFo:function(){return!1},
 $iscw:true,
-$isFw:true,
+$istg:true,
 $isX9:true,
 $isNL:true,
 $isej:true},
@@ -3310,7 +3345,7 @@
 Uz:{
 "^":"uh;FP<,aP,wP,le,LB,GD<,ae<,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
 gOO:function(){return"LibraryMirror"},
-gUx:function(){return this.If},
+gUx:function(a){return this.If},
 gEO:function(){return this.gm8()},
 gqh:function(){var z,y,x
 z=this.P8
@@ -3322,7 +3357,7 @@
 x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
 this.P8=z
 return z},
-PU:[function(a,b){var z,y,x,w
+PU:function(a,b){var z,y,x,w
 z=a.gfN(a)
 if(z.Tc(0,"="))throw H.b(new P.AT(""))
 y=this.gQn()
@@ -3331,14 +3366,15 @@
 if(w==null)w=this.gcc().nb.t(0,a)
 if(w==null)throw H.b(P.lr(this,H.X7(a),[b],null,null))
 w.Hy(this,b)
-return H.vn(b)},"call$2","gtd",4,0,null,70,[],172,[]],
-rN:[function(a){var z=this.gQH().nb.t(0,a)
+return H.vn(b)},
+rN:function(a){var z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,[],null,null))
-return H.vn(z.IB(this))},"call$1","gPo",2,0,null,70,[]],
-F2:[function(a,b,c){var z=this.gQH().nb.t(0,a)
+return H.vn(z.IB(this))},
+F2:function(a,b,c){var z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,b,c,null))
 if(!!J.x(z).$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
+return H.vn(z.jd(b,c))},
+CI:function(a,b){return this.F2(a,b,null)},
 gm8:function(){var z,y,x,w,v,u,t,s,r,q,p
 z=this.SD
 if(z!=null)return z
@@ -3428,15 +3464,15 @@
 "^":"cb+M2;",
 $isej:true},
 IB:{
-"^":"Tp:411;a",
+"^":"Tp:340;a",
 call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 oP:{
-"^":"Tp:411;a",
+"^":"Tp:340;a",
 call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 YX:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){return this.a},"call$0",null,0,0,null,"call"],
 $isEH:true},
 BI:{
@@ -3445,16 +3481,17 @@
 gIf:function(){var z,y
 z=this.BB
 if(z!=null)return z
-y=this.AY.gUx().fN
+y=J.GL(J.Ba(this.AY))
 z=this.XW
-z=J.kE(y," with ")===!0?H.YC(H.d(y)+", "+H.d(z.gUx().fN)):H.YC(H.d(y)+" with "+H.d(z.gUx().fN))
+z=J.kE(y," with ")===!0?H.YC(H.d(y)+", "+H.d(J.GL(J.Ba(z)))):H.YC(H.d(y)+" with "+H.d(J.GL(J.Ba(z))))
 this.BB=z
 return z},
-gUx:function(){return this.gIf()},
+gUx:function(a){return this.gIf()},
 gYK:function(){return this.XW.gYK()},
-F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
-rN:[function(a){throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
-PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,70,[],172,[]],
+F2:function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},
+CI:function(a,b){return this.F2(a,b,null)},
+rN:function(a){throw H.b(P.lr(this,a,null,null,null))},
+PU:function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},
 gkZ:function(){return[this.XW]},
 gHA:function(){return!0},
 gJi:function(){return this},
@@ -3473,8 +3510,9 @@
 iu:{
 "^":"M2;Ax<,xq",
 gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
-F2:[function(a,b,c){var z=J.GL(a)
-return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
+F2:function(a,b,c){var z=J.GL(a)
+return this.tu(a,0,z+":"+b.length+":0",b)},
+CI:function(a,b){return this.F2(a,b,null)},
 gK8:function(){var z,y,x
 z=$.eb
 y=this.Ax
@@ -3482,7 +3520,7 @@
 x=y.constructor[z]
 if(x==null){x=H.Pq()
 y.constructor[z]=x}return x},
-tu:[function(a,b,c,d){var z,y,x,w,v
+tu:function(a,b,c,d){var z,y,x,w,v
 z=this.gK8()
 y=z[c]
 if(y==null){x=$.I6().t(0,c)
@@ -3491,11 +3529,11 @@
 y=v.ZU(this.Ax)
 z[c]=y}else v=null
 if(y.gpf()){if(v==null)v=new H.LI(a,$.I6().t(0,c),b,d,[],null)
-return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gqi",8,0,null,12,[],11,[],412,[],87,[]],
-PU:[function(a,b){var z=H.d(a.gfN(a))+"="
+return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},
+PU:function(a,b){var z=H.d(a.gfN(a))+"="
 this.tu(H.YC(z),2,z,[b])
-return H.vn(b)},"call$2","gtd",4,0,null,70,[],172,[]],
-rN:[function(a){var z,y,x,w
+return H.vn(b)},
+rN:function(a){var z,y,x,w
 $loop$0:{z=this.xq
 if(typeof z=="number"||typeof a.$p=="undefined")break $loop$0
 y=a.$p(z)
@@ -3505,8 +3543,8 @@
 else{w=H.vn(x)
 y.v=x
 y.m=w
-return w}}return this.Dm(a)},"call$1","gPo",2,0,null,70,[]],
-Dm:[function(a){var z,y,x,w,v,u,t
+return w}}return this.Dm(a)},
+Dm:function(a){var z,y,x,w,v,u,t
 z=J.GL(a)
 y=this.tu(a,1,z,C.xD)
 x=this.gK8()[z]
@@ -3522,42 +3560,42 @@
 t=x.geK()?this.QN(u,v):this.x0(u,v)
 w[z]=t
 t.v=t.m=w
-return y},"call$1","gFf",2,0,null,70,[]],
-ds:[function(a,b){if(b)return(function(b){return eval(b)})("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
-else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,413,[],414,[]],
-x0:[function(a,b){if(!b)return(function(n){return(function(o){return o[n]()})})(a)
-return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],414,[]],
-QN:[function(a,b){var z=J.x(this.Ax)
+return y},
+ds:function(a,b){if(b)return(function(b){return eval(b)})("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
+else return(function(n){return(function(c){return c[n]})})(a)},
+x0:function(a,b){if(!b)return(function(n){return(function(o){return o[n]()})})(a)
+return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},
+QN:function(a,b){var z=J.x(this.Ax)
 if(!b)return(function(n,i){return(function(o){return i[n](o)})})(a,z)
-return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gDw",4,0,null,12,[],414,[]],
-n:[function(a,b){var z,y
+return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},
+n:function(a,b){var z,y
 if(b==null)return!1
 if(!!J.x(b).$isiu){z=this.Ax
 y=b.Ax
 y=z==null?y==null:z===y
 z=y}else z=!1
-return z},"call$1","gUJ",2,0,null,109,[]],
+return z},
 giO:function(a){return J.UN(H.CU(this.Ax),909522486)},
-bu:[function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},"call$0","gXo",0,0,null],
+bu:function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},
 $isiu:true,
 $isvr:true,
 $isej:true},
 mg:{
-"^":"Tp:415;a",
+"^":"Tp:341;a",
 call$2:[function(a,b){var z,y
 z=a.gfN(a)
 y=this.a
 if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,136,[],30,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,138,[],30,[],"call"],
 $isEH:true},
 bl:{
 "^":"cb;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,dk,If",
 gOO:function(){return"ClassMirror"},
-bu:[function(a){var z,y,x
+bu:function(a){var z,y,x
 z="ClassMirror on "+H.d(this.NK.gIf().fN)
 if(this.gw8()!=null){y=z+"<"
 x=this.gw8()
-z=y+x.zV(x,", ")+">"}return z},"call$0","gXo",0,0,null],
+z=y+x.zV(x,", ")+">"}return z},
 gCr:function(){for(var z=this.gw8(),z=z.gA(z);z.G();)if(!J.de(z.lo,$.P8()))return H.d(this.NK.gCr())+"<"+this.EZ+">"
 return this.NK.gCr()},
 gNy:function(){return this.NK.gNy()},
@@ -3608,8 +3646,8 @@
 z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
-PU:[function(a,b){return this.NK.PU(a,b)},"call$2","gtd",4,0,null,70,[],172,[]],
-rN:[function(a){return this.NK.rN(a)},"call$1","gPo",2,0,null,70,[]],
+PU:function(a,b){return this.NK.PU(a,b)},
+rN:function(a){return this.NK.rN(a)},
 gXP:function(){return this.NK.gXP()},
 gc9:function(){return this.NK.gc9()},
 gAY:function(){var z=this.qN
@@ -3617,7 +3655,8 @@
 z=H.Jf(this,init.metadata[J.UQ(init.typeInformation[this.NK.gCr()],0)])
 this.qN=z
 return z},
-F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
+F2:function(a,b,c){return this.NK.F2(a,b,c)},
+CI:function(a,b){return this.F2(a,b,null)},
 gHA:function(){return!1},
 gJi:function(){return this.NK},
 gkZ:function(){var z=this.qm
@@ -3626,7 +3665,8 @@
 this.qm=z
 return z},
 gq4:function(){return J.co(this.NK.gIf().fN,"_")},
-gUx:function(){return this.NK.gUx()},
+gUx:function(a){var z=this.NK
+return z.gUx(z)},
 gYj:function(){return new H.cu(this.gCr(),null)},
 gIf:function(){return this.NK.gIf()},
 $isbl:true,
@@ -3641,20 +3681,20 @@
 y=this.a
 if(J.de(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,416,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,342,[],"call"],
 $isEH:true},
 Oo:{
-"^":"Tp:112;",
-call$1:[function(a){return-1},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return-1},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 Tc:{
-"^":"Tp:112;b",
-call$1:[function(a){return this.b.call$1(a)},"call$1",null,2,0,null,92,[],"call"],
+"^":"Tp:114;b",
+call$1:[function(a){return this.b.call$1(a)},"call$1",null,2,0,null,94,[],"call"],
 $isEH:true},
 Ax:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,417,[],"call"],
+return a},"call$1",null,2,0,null,343,[],"call"],
 $isEH:true},
 Wf:{
 "^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,dk,jE,If",
@@ -3667,7 +3707,7 @@
 z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
 this.b0=z
 return z},
-ly:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+ly:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=this.gaB().prototype
 y=H.kU(z)
 x=H.VM([],[H.Zk])
@@ -3690,13 +3730,13 @@
 p=H.ys(n,"$",".")}}else continue
 s=H.Sd(p,q,!o,o)
 x.push(s)
-s.jE=a}return x},"call$1","gqJ",2,0,null,418,[]],
+s.jE=a}return x},
 gEO:function(){var z=this.qu
 if(z!=null)return z
 z=this.ly(this)
 this.qu=z
 return z},
-ws:[function(a){var z,y,x,w
+ws:function(a){var z,y,x,w
 z=H.VM([],[P.RY])
 y=this.H8.split(";")
 if(1>=y.length)return H.e(y,1)
@@ -3706,7 +3746,7 @@
 C.Nm.FV(x,y)}H.jw(a,x,!1,z)
 w=init.statics[this.Cr]
 if(w!=null)H.jw(a,w["^"],!0,z)
-return z},"call$1","gap",2,0,null,419,[]],
+return z},
 gTH:function(){var z=this.zE
 if(z!=null)return z
 z=this.ws(this)
@@ -3741,18 +3781,18 @@
 z=H.VM(new H.Oh(y),[P.wv,P.NL])
 this.Db=z
 return z},
-PU:[function(a,b){var z,y
+PU:function(a,b){var z,y
 z=this.gcc().nb.t(0,a)
 if(z!=null&&z.gFo()&&J.WO(z)!==!0){y=z.gao()
 if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
 $[y]=b
-return H.vn(b)}throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,70,[],172,[]],
-rN:[function(a){var z,y
+return H.vn(b)}throw H.b(P.lr(this,H.X7(a),[b],null,null))},
+rN:function(a){var z,y
 z=this.gcc().nb.t(0,a)
 if(z!=null&&z.gFo()){y=z.gao()
 if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
 if(y in init.lazies)return H.vn($[init.lazies[y]]())
-else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
+else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))},
 gXP:function(){var z,y
 z=this.jE
 if(z==null){if(H.SG(this.Tx))this.jE=H.jO(C.nY.LU).gXP()
@@ -3784,16 +3824,17 @@
 z=H.jO(v[0])
 this.qN=z}else{z=x.n(w,"")?this:H.jO(w)
 this.qN=z}}}return J.de(z,this)?null:this.qN},
-F2:[function(a,b,c){var z=this.ghp().nb.t(0,a)
+F2:function(a,b,c){var z=this.ghp().nb.t(0,a)
 if(z==null||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
 if(!z.tB())H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
+return H.vn(z.jd(b,c))},
+CI:function(a,b){return this.F2(a,b,null)},
 gHA:function(){return!0},
 gJi:function(){return this},
-MR:[function(a){var z,y
+MR:function(a){var z,y
 z=init.typeInformation[this.Cr]
 y=z!=null?H.VM(new H.A8(J.Ld(z,1),new H.t0(a)),[null,null]).br(0):C.Me
-return H.VM(new P.Yp(y),[P.Ms])},"call$1","gki",2,0,null,145,[]],
+return H.VM(new P.Yp(y),[P.Ms])},
 gkZ:function(){var z=this.qm
 if(z!=null)return z
 z=this.MR(this)
@@ -3822,17 +3863,17 @@
 "^":"EE+M2;",
 $isej:true},
 Ei:{
-"^":"Tp:411;a",
+"^":"Tp:340;a",
 call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 Ci:{
-"^":"Tp:112;b",
+"^":"Tp:114;b",
 call$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,417,[],"call"],
+return a},"call$1",null,2,0,null,343,[],"call"],
 $isEH:true},
 t0:{
-"^":"Tp:421;a",
-call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,420,[],"call"],
+"^":"Tp:345;a",
+call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true},
 XJ:{
 "^":"cb;ao<,V5>,Fo<,n6,jE,Ay>,le,If",
@@ -3842,10 +3883,10 @@
 gc9:function(){var z=this.le
 if(z==null){z=this.n6
 z=z==null?C.xD:z()
-this.le=z}return J.kl(z,H.Yf()).br(0)},
-IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,47,[]],
-Hy:[function(a,b){if(this.V5)throw H.b(P.lr(this,H.X7(this.If),[b],null,null))
-$[this.ao]=b},"call$2","gR6",4,0,null,47,[],172,[]],
+this.le=z}return J.qA(J.kl(z,H.Yf()))},
+IB:function(a){return $[this.ao]},
+Hy:function(a,b){if(this.V5)throw H.b(P.lr(this,H.X7(this.If),[b],null,null))
+$[this.ao]=b},
 $isRY:true,
 $isNL:true,
 $isej:true,
@@ -3876,7 +3917,7 @@
 return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
 if(a>=123&&a<=126)return a-117
 if(a>=37&&a<=43)return a-27
-return 0},"call$1","fS",2,0,null,143,[]]}},
+return 0},"call$1","fS",2,0,null,145,[]]}},
 Sz:{
 "^":"iu;Ax,xq",
 gMj:function(a){var z,y,x,w,v,u,t,s
@@ -3901,7 +3942,7 @@
 s=H.Sd(t,u,!1,!1)}else s=new H.Zk(y[x],v,!1,!1,!0,!1,!1,null,null,null,null,H.YC(x))
 y.constructor[z]=s
 return s},
-bu:[function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},"call$0","gXo",0,0,null],
+bu:function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},
 $isvr:true,
 $isej:true},
 Zk:{
@@ -3911,7 +3952,7 @@
 if(z!=null)return z
 this.gc9()
 return this.H3},
-tB:[function(){return"$reflectable" in this.dl},"call$0","gX1",0,0,null],
+tB:function(){return"$reflectable" in this.dl},
 gXP:function(){return this.jE},
 gdw:function(){this.gc9()
 return this.wM},
@@ -3930,7 +3971,7 @@
 else this.wM=t.gdw()
 s=v.Mo
 for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.Rv,q=v.Rn,p=v.hG,o=0;z.G();o=h){n=z.lo
-m=init.metadata[q[2*o+p+3]]
+m=v.XL(o)
 l=q[2*o+p+3+1]
 k=J.RE(n)
 if(o<r)j=new H.fu(this,k.gAy(n),!1,!1,null,l,H.YC(m))
@@ -3940,13 +3981,13 @@
 w[o]=j}}this.H3=H.VM(new P.Yp(w),[P.Ys])
 z=H.VM(new P.Yp(J.kl(y,H.Yf())),[null])
 this.le=z}return z},
-jd:[function(a,b){if(!this.Fo&&!this.xV)throw H.b(H.Ef("Cannot invoke instance method without receiver."))
+jd:function(a,b){if(!this.Fo&&!this.xV)throw H.b(H.Ef("Cannot invoke instance method without receiver."))
 if(!J.de(this.Yq,a.length)||this.dl==null)throw H.b(P.lr(this.gXP(),this.If,a,b,null))
-return this.dl.apply($,P.F(a,!0,null))},"call$2","gqi",4,0,null,49,[],50,[]],
-IB:[function(a){if(this.lT)return this.jd([],null)
-else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,47,[]],
-Hy:[function(a,b){if(this.hB)return this.jd([b],null)
-else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gR6",4,0,null,47,[],172,[]],
+return this.dl.apply($,P.F(a,!0,null))},
+IB:function(a){if(this.lT)return this.jd([],null)
+else throw H.b(P.SY("getField on "+H.d(a)))},
+Hy:function(a,b){if(this.hB)return this.jd([b],null)
+else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},
 guU:function(){return!this.lT&&!this.hB&&!this.xV},
 $isZk:true,
 $isRS:true,
@@ -3973,19 +4014,18 @@
 gt5:function(a){return H.Jf(this.XP,this.Ay)},
 gFo:function(){return!1},
 gV5:function(a){return!1},
-gc9:function(){return J.kl(this.QY,new H.wt()).br(0)},
+gc9:function(){return J.qA(J.kl(this.QY,new H.wt()))},
 $isYs:true,
 $isRY:true,
 $isNL:true,
 $isej:true},
 wt:{
-"^":"Tp:422;",
-call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,420,[],"call"],
+"^":"Tp:346;",
+call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true},
 ng:{
 "^":"cb;Cr<,CM,If",
 gP:function(a){return this.CM},
-r6:function(a,b){return this.gP(this).call$1(b)},
 gOO:function(){return"TypedefMirror"},
 gYj:function(){return H.vh(P.SY(null))},
 gJi:function(){return H.vh(P.SY(null))},
@@ -4001,14 +4041,15 @@
 gAY:function(){return H.vh(P.SY(null))},
 gkZ:function(){return H.vh(P.SY(null))},
 gYK:function(){return H.vh(P.SY(null))},
-F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
-rN:[function(a){return H.vh(P.SY(null))},"call$1","gPo",2,0,null,70,[]],
-PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],30,[]],
+F2:function(a,b,c){return H.vh(P.SY(null))},
+CI:function(a,b){return this.F2(a,b,null)},
+rN:function(a){return H.vh(P.SY(null))},
+PU:function(a,b){return H.vh(P.SY(null))},
 gNy:function(){return H.vh(P.SY(null))},
 gw8:function(){return H.vh(P.SY(null))},
 gJi:function(){return H.vh(P.SY(null))},
 gIf:function(){return H.vh(P.SY(null))},
-gUx:function(){return H.vh(P.SY(null))},
+gUx:function(a){return H.vh(P.SY(null))},
 gq4:function(){return H.vh(P.SY(null))},
 gc9:function(){return H.vh(P.SY(null))}},
 Ar:{
@@ -4036,7 +4077,7 @@
 y.push(new H.fu(this,z.named[u],!1,!1,null,C.iH,H.YC(u)))}z=H.VM(new P.Yp(y),[P.Ys])
 this.zM=z
 return z},
-bu:[function(a){var z,y,x,w,v,u
+bu:function(a){var z,y,x,w,v,u
 z=this.o3
 if(z!=null)return z
 z=this.d9
@@ -4051,7 +4092,7 @@
 else x="ret" in z?C.xB.g(x,H.Ko(z.ret,null)):x+"dynamic"
 z=x+"'"
 this.o3=z
-return z},"call$0","gXo",0,0,null],
+return z},
 gah:function(){return H.vh(P.SY(null))},
 V7:function(a,b){return this.gah().call$2(a,b)},
 nQ:function(a){return this.gah().call$1(a)},
@@ -4060,7 +4101,7 @@
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:423;a",
+"^":"Tp:347;a",
 call$1:[function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
@@ -4068,7 +4109,7 @@
 return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 jB:{
-"^":"Tp:424;b",
+"^":"Tp:348;b",
 call$1:[function(a){var z,y
 z=this.b.call$1(a)
 y=J.x(z)
@@ -4079,33 +4120,32 @@
 return z.gCr()},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 ye:{
-"^":"Tp:422;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,420,[],"call"],
+"^":"Tp:346;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:422;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,420,[],"call"],
+"^":"Tp:346;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true},
 Oh:{
 "^":"a;nb",
 gB:function(a){return this.nb.X5},
 gl0:function(a){return this.nb.X5===0},
 gor:function(a){return this.nb.X5!==0},
-t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,48,[]],
-x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,48,[]],
-di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,30,[]],
-aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-gvc:function(a){var z=this.nb
+t:function(a,b){return this.nb.t(0,b)},
+x4:function(a){return this.nb.x4(a)},
+di:function(a){return this.nb.di(a)},
+aN:function(a,b){return this.nb.aN(0,b)},
+gvc:function(){var z=this.nb
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gUQ:function(a){var z=this.nb
 return z.gUQ(z)},
-u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,48,[],30,[]],
-FV:[function(a,b){return H.kT()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,48,[]],
-V1:[function(a){return H.kT()},"call$0","gRa",0,0,null],
+u:function(a,b,c){return H.kT()},
+FV:function(a,b){return H.kT()},
+Rz:function(a,b){H.kT()},
+V1:function(a){return H.kT()},
 $isZ0:true,
-static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","lY",0,0,null]}},
-"^":"zix<"}],["dart._js_names","dart:_js_names",,H,{
+static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","lY",0,0,null]}}}],["dart._js_names","dart:_js_names",,H,{
 "^":"",
 hY:[function(a,b){var z,y,x,w,v,u,t
 z=H.kU(a)
@@ -4114,10 +4154,10 @@
 u=a[v]
 y.u(0,v,u)
 if(w){t=J.rY(v)
-if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"call$2","BH",4,0,null,149,[],150,[]],
+if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"call$2","BH",4,0,null,151,[],152,[]],
 YK:[function(a){var z=H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,J.O])
 a.aN(0,new H.Xh(z))
-return z},"call$1","OX",2,0,null,151,[]],
+return z},"call$1","OX",2,0,null,153,[]],
 kU:[function(a){var z=H.VM((function(victim, hasOwnProperty) {
   var result = [];
   for (var key in victim) {
@@ -4126,16 +4166,16 @@
   return result;
 })(a, Object.prototype.hasOwnProperty),[null])
 z.fixed$length=init
-return z},"call$1","DF",2,0,null,147,[]],
+return z},"call$1","DF",2,0,null,149,[]],
 Xh:{
-"^":"Tp:425;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],412,[],"call"],
+"^":"Tp:350;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,141,[],349,[],"call"],
 $isEH:true}}],["dart.async","dart:async",,P,{
 "^":"",
 VH:[function(a,b){var z=H.N7()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
-else return b.cR(a)},"call$2","p3",4,0,null,152,[],153,[]],
+else return b.cR(a)},"call$2","zZ",4,0,null,154,[],155,[]],
 e4:function(a,b){var z=P.Dt(b)
 P.rT(C.ny,new P.ZC(a,z))
 return z},
@@ -4147,7 +4187,7 @@
 try{P.Cx()}catch(z){H.Ru(z)
 P.jL(C.ny,P.qZ())
 $.S6=$.S6.gaw()
-throw z}},"call$0","qZ",0,0,114],
+throw z}},"call$0","qZ",0,0,116],
 IA:[function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
@@ -4155,11 +4195,11 @@
 $.S6=z
 P.jL(C.ny,P.qZ())}else{y=new P.OM(a,null)
 z.aw=y
-$.k8=y}},"call$1","e6",2,0,null,155,[]],
+$.k8=y}},"call$1","e6",2,0,null,157,[]],
 rb:[function(a){var z
 if(J.de($.X3,C.NU)){$.X3.wr(a)
 return}z=$.X3
-z.wr(z.xi(a,!0))},"call$1","Rf",2,0,null,155,[]],
+z.wr(z.xi(a,!0))},"call$1","Rf",2,0,null,157,[]],
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -4173,56 +4213,56 @@
 return}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-$.X3.hk(y,x)}},"call$1","DC",2,0,null,156,[]],
-YE:[function(a){},"call$1","bZ",2,0,157,30,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,158,82,159,[],160,[]],
-dL:[function(){},"call$0","v3",0,0,114],
+$.X3.hk(y,x)}},"call$1","DC",2,0,null,158,[]],
+YE:[function(a){},"call$1","bZ",2,0,159,30,[]],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,160,84,161,[],162,[]],
+dL:[function(){},"call$0","v3",0,0,116],
 FE:[function(a,b,c){var z,y,x,w
 try{b.call$1(a.call$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
-c.call$2(z,y)}},"call$3","CV",6,0,null,161,[],162,[],163,[]],
+c.call$2(z,y)}},"call$3","CV",6,0,null,163,[],164,[],165,[]],
 NX:[function(a,b,c,d){a.ed()
-b.K5(c,d)},"call$4","QD",8,0,null,164,[],165,[],159,[],160,[]],
-TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,164,[],165,[]],
+b.K5(c,d)},"call$4","QD",8,0,null,166,[],167,[],161,[],162,[]],
+TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,166,[],167,[]],
 Bb:[function(a,b,c){a.ed()
-b.rX(c)},"call$3","E1",6,0,null,164,[],165,[],30,[]],
+b.rX(c)},"call$3","E1",6,0,null,166,[],167,[],30,[]],
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
 jL:[function(a,b){var z=a.gVs()
-return H.cy(z<0?0:z,b)},"call$2","et",4,0,null,166,[],155,[]],
+return H.cy(z<0?0:z,b)},"call$2","et",4,0,null,168,[],157,[]],
 PJ:[function(a){var z=$.X3
 $.X3=a
-return z},"call$1","kb",2,0,null,153,[]],
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"call$5","Gx",10,0,167,168,[],169,[],153,[],159,[],160,[]],
+return z},"call$1","kb",2,0,null,155,[]],
+L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"call$5","Gx",10,0,169,170,[],171,[],155,[],161,[],162,[]],
 T8:[function(a,b,c,d){var z,y
 if(J.de($.X3,c))return d.call$0()
 z=P.PJ(c)
 try{y=d.call$0()
-return y}finally{$.X3=z}},"call$4","AI",8,0,170,168,[],169,[],153,[],117,[]],
+return y}finally{$.X3=z}},"call$4","AI",8,0,172,170,[],171,[],155,[],119,[]],
 V7:[function(a,b,c,d,e){var z,y
 if(J.de($.X3,c))return d.call$1(e)
 z=P.PJ(c)
 try{y=d.call$1(e)
-return y}finally{$.X3=z}},"call$5","MM",10,0,171,168,[],169,[],153,[],117,[],172,[]],
+return y}finally{$.X3=z}},"call$5","MM",10,0,173,170,[],171,[],155,[],119,[],174,[]],
 Qx:[function(a,b,c,d,e,f){var z,y
 if(J.de($.X3,c))return d.call$2(e,f)
 z=P.PJ(c)
 try{y=d.call$2(e,f)
-return y}finally{$.X3=z}},"call$6","l4",12,0,173,168,[],169,[],153,[],117,[],59,[],60,[]],
-Ee:[function(a,b,c,d){return d},"call$4","EU",8,0,174,168,[],169,[],153,[],117,[]],
-cQ:[function(a,b,c,d){return d},"call$4","zi",8,0,175,168,[],169,[],153,[],117,[]],
-VI:[function(a,b,c,d){return d},"call$4","uu",8,0,176,168,[],169,[],153,[],117,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"call$4","G2",8,0,177,168,[],169,[],153,[],117,[]],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"call$5","KF",10,0,178,168,[],169,[],153,[],166,[],155,[]],
-XB:[function(a,b,c,d){H.qw(d)},"call$4","YM",8,0,179,168,[],169,[],153,[],180,[]],
-CI:[function(a){J.O2($.X3,a)},"call$1","Fl",2,0,181,180,[]],
+return y}finally{$.X3=z}},"call$6","l4",12,0,175,170,[],171,[],155,[],119,[],59,[],60,[]],
+Ee:[function(a,b,c,d){return d},"call$4","EU",8,0,176,170,[],171,[],155,[],119,[]],
+cQ:[function(a,b,c,d){return d},"call$4","zi",8,0,177,170,[],171,[],155,[],119,[]],
+VI:[function(a,b,c,d){return d},"call$4","uu",8,0,178,170,[],171,[],155,[],119,[]],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"call$4","G2",8,0,179,170,[],171,[],155,[],119,[]],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"call$5","KF",10,0,180,170,[],171,[],155,[],168,[],157,[]],
+XB:[function(a,b,c,d){H.qw(d)},"call$4","YM",8,0,181,170,[],171,[],155,[],182,[]],
+CI:[function(a){J.O2($.X3,a)},"call$1","Fl",2,0,183,182,[]],
 UA:[function(a,b,c,d,e){var z
 $.oK=P.Fl()
 z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"call$5","hn",10,0,182,168,[],169,[],153,[],183,[],184,[]],
+return new P.uo(c,d,z)},"call$5","hn",10,0,184,170,[],171,[],155,[],185,[],186,[]],
 Ca:{
 "^":"a;kc>,I4<",
 $isGe:true},
@@ -4231,65 +4271,65 @@
 JI:{
 "^":"yU;Ae@,iE@,SJ@,Y8,dB,o7,Bd,Lj,Gv,lz,Ri",
 gY8:function(){return this.Y8},
-uR:[function(a){var z=this.Ae
+uR:function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
-return(z&1)===a},"call$1","gLM",2,0,null,426,[]],
-Ac:[function(){var z=this.Ae
+return(z&1)===a},
+Ac:function(){var z=this.Ae
 if(typeof z!=="number")return z.w()
-this.Ae=z^1},"call$0","gUe",0,0,null],
+this.Ae=z^1},
 gP4:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&2)!==0},
-dK:[function(){var z=this.Ae
+dK:function(){var z=this.Ae
 if(typeof z!=="number")return z.k()
-this.Ae=z|4},"call$0","gno",0,0,null],
+this.Ae=z|4},
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){},"call$0","gp4",0,0,114],
-LP:[function(){},"call$0","gZ9",0,0,114],
+uO:[function(){},"call$0","gp4",0,0,116],
+LP:[function(){},"call$0","gZ9",0,0,116],
 static:{"^":"FJ,CM,VCd"}},
 WVu:{
 "^":"a;iE@,SJ@",
 gRW:function(){return!1},
 gP4:function(){return(this.Gv&2)!==0},
-SL:[function(){var z=this.Ip
+SL:function(){var z=this.Ip
 if(z!=null)return z
 z=P.Dt(null)
 this.Ip=z
-return z},"call$0","gop",0,0,null],
-p1:[function(a){var z,y
+return z},
+p1:function(a){var z,y
 z=a.gSJ()
 y=a.giE()
 z.siE(y)
 y.sSJ(z)
 a.sSJ(a)
-a.siE(a)},"call$1","gCL",2,0,null,164,[]],
-j0:[function(a){if(a.giE()===a)return
+a.siE(a)},
+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()}},"call$1","gOr",2,0,null,164,[]],
-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")},"call$0","gVo",0,0,null],
+if((this.Gv&2)===0&&this.iE===this)this.Of()}},
+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)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},236,[]],
+this.Iv(b)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},238,[]],
 fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,427,82,159,[],160,[]],
-cO:[function(a){var z,y
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,351,84,161,[],162,[]],
+cO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
 if(z>=4)throw H.b(this.q7())
 this.Gv=z|4
 y=this.SL()
 this.SY()
-return y},"call$0","gJK",0,0,null],
-Rg:[function(a,b){this.Iv(b)},"call$1","gHR",2,0,null,236,[]],
-V8:[function(a,b){this.pb(a,b)},"call$2","gEm",4,0,null,159,[],160,[]],
-Qj:[function(){var z=this.WX
+return y},
+Rg:function(a,b){this.Iv(b)},
+V8:function(a,b){this.pb(a,b)},
+Qj:function(){var z=this.WX
 this.WX=null
 this.Gv=this.Gv&4294967287
-C.jN.tZ(z)},"call$0","gS2",0,0,null],
-nE:[function(a){var z,y,x,w
+C.jN.tZ(z)},
+nE:function(a){var z,y,x,w
 z=this.Gv
 if((z&2)!==0)throw H.b(new P.lj("Cannot fire new event. Controller is already firing an event"))
 y=this.iE
@@ -4308,53 +4348,53 @@
 y.sAe(z&4294967293)
 y=w}else y=y.giE()
 this.Gv=this.Gv&4294967293
-if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,406,[]],
-Of:[function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
-P.ot(this.QC)},"call$0","gRj",0,0,null]},
+if(this.iE===this)this.Of()},
+Of:function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
+P.ot(this.QC)}},
 dz:{
 "^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
-Iv:[function(a){var z=this.iE
+Iv:function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.Gv=this.Gv|2
 this.iE.Rg(0,a)
 this.Gv=this.Gv&4294967293
 if(this.iE===this)this.Of()
-return}this.nE(new P.tK(this,a))},"call$1","gm9",2,0,null,236,[]],
-pb:[function(a,b){if(this.iE===this)return
-this.nE(new P.OR(this,a,b))},"call$2","gTb",4,0,null,159,[],160,[]],
-SY:[function(){if(this.iE!==this)this.nE(new P.Bg(this))
-else this.Ip.OH(null)},"call$0","gXm",0,0,null]},
+return}this.nE(new P.tK(this,a))},
+pb:function(a,b){if(this.iE===this)return
+this.nE(new P.OR(this,a,b))},
+SY:function(){if(this.iE!==this)this.nE(new P.Bg(this))
+else this.Ip.OH(null)}},
 tK:{
 "^":"Tp;a,b",
-call$1:[function(a){a.Rg(0,this.b)},"call$1",null,2,0,null,164,[],"call"],
+call$1:[function(a){a.Rg(0,this.b)},"call$1",null,2,0,null,166,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 OR:{
 "^":"Tp;a,b,c",
-call$1:[function(a){a.V8(this.b,this.c)},"call$1",null,2,0,null,164,[],"call"],
+call$1:[function(a){a.V8(this.b,this.c)},"call$1",null,2,0,null,166,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
 Bg:{
 "^":"Tp;a",
-call$1:[function(a){a.Qj()},"call$1",null,2,0,null,164,[],"call"],
+call$1:[function(a){a.Qj()},"call$1",null,2,0,null,166,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"m6",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
 "^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
-Iv:[function(a){var z,y
+Iv:function(a){var z,y
 for(z=this.iE;z!==this;z=z.giE()){y=new P.LV(a,null)
 y.$builtinTypeInfo=[null]
-z.w6(y)}},"call$1","gm9",2,0,null,236,[]],
-pb:[function(a,b){var z
-for(z=this.iE;z!==this;z=z.giE())z.w6(new P.DS(a,b,null))},"call$2","gTb",4,0,null,159,[],160,[]],
-SY:[function(){var z=this.iE
+z.w6(y)}},
+pb:function(a,b){var z
+for(z=this.iE;z!==this;z=z.giE())z.w6(new P.DS(a,b,null))},
+SY:function(){var z=this.iE
 if(z!==this)for(;z!==this;z=z.giE())z.w6(C.Wj)
-else this.Ip.OH(null)},"call$0","gXm",0,0,null]},
+else this.Ip.OH(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
 ZC:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){var z,y,x,w
 try{this.b.rX(this.a.call$0())}catch(x){w=H.Ru(x)
 z=w
@@ -4367,12 +4407,12 @@
 "^":"Ia;MM",
 oo:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,428,82,30,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,352,84,30,[]],
 w0:[function(a,b){var z
 if(a==null)throw H.b(new P.AT("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(new P.lj("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,427,82,159,[],160,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,351,84,161,[],162,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -4384,51 +4424,53 @@
 gyK:function(){return this.Gv===2?null:this.As},
 go7:function(){return this.Gv===2?null:this.qV},
 gIa:function(){return this.Gv===2?null:this.o4},
-Rx:[function(a,b){var z,y
+Rx:function(a,b){var z,y
 z=$.X3
 y=H.VM(new P.vs(0,z,null,null,z.cR(a),null,P.VH(b,$.X3),null),[null])
 this.au(y)
-return y},function(a){return this.Rx(a,null)},"ml","call$2$onError",null,"grf",2,3,null,82,117,[],163,[]],
-yd:[function(a,b){var z,y,x
+return y},
+ml:function(a){return this.Rx(a,null)},
+yd:function(a,b){var z,y,x
 z=$.X3
 y=P.VH(a,z)
 x=H.VM(new P.vs(0,z,null,null,null,$.X3.cR(b),y,null),[null])
 this.au(x)
-return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],407,[]],
-YM:[function(a){var z,y
+return x},
+OA:function(a){return this.yd(a,null)},
+YM:function(a){var z,y
 z=$.X3
 y=new P.vs(0,z,null,null,null,null,null,z.Al(a))
 y.$builtinTypeInfo=this.$builtinTypeInfo
 this.au(y)
-return y},"call$1","gE1",2,0,null,406,[]],
+return y},
 gDL:function(){return this.jk},
 gcG:function(){return this.jk},
-Am:[function(a){this.Gv=4
-this.jk=a},"call$1","goU",2,0,null,30,[]],
-E6:[function(a,b){this.Gv=8
-this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,159,[],160,[]],
-au:[function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
+Am:function(a){this.Gv=4
+this.jk=a},
+E6:function(a,b){this.Gv=8
+this.jk=new P.Ca(a,b)},
+au:function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
 else{a.sBQ(this.jk)
-this.jk=a}},"call$1","gXA",2,0,null,301,[]],
-L3:[function(){var z,y,x
+this.jk=a}},
+L3:function(){var z,y,x
 z=this.jk
 this.jk=null
 for(y=null;z!=null;y=z,z=x){x=z.gBQ()
-z.sBQ(y)}return y},"call$0","gAw",0,0,null],
-rX:[function(a){var z,y
+z.sBQ(y)}return y},
+rX:function(a){var z,y
 z=J.x(a)
 if(!!z.$isb8)if(!!z.$isvs)P.A9(a,this)
 else P.k3(a,this)
 else{y=this.L3()
 this.Am(a)
-P.HZ(this,y)}},"call$1","gBO",2,0,null,30,[]],
-R8:[function(a){var z=this.L3()
+P.HZ(this,y)}},
+R8:function(a){var z=this.L3()
 this.Am(a)
-P.HZ(this,z)},"call$1","gFt",2,0,null,30,[]],
+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","call$2","call$1","gbY",2,2,158,82,159,[],160,[]],
-OH:[function(a){var z
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","call$2","call$1","gaq",2,2,160,84,161,[],162,[]],
+OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
 if(z>=4&&z===8){if(this.Gv!==0)H.vh(P.w("Future already completed"))
@@ -4436,10 +4478,10 @@
 this.Lj.wr(new P.rH(this,a))}else P.A9(a,this)}else P.k3(a,this)
 return}}if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
-this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,30,[]],
-CG:[function(a,b){if(this.Gv!==0)H.vh(new P.lj("Future already completed"))
+this.Lj.wr(new P.cX(this,a))},
+CG:function(a,b){if(this.Gv!==0)H.vh(new P.lj("Future already completed"))
 this.Gv=1
-this.Lj.wr(new P.ZL(this,a,b))},"call$2","glC",4,0,null,159,[],160,[]],
+this.Lj.wr(new P.ZL(this,a,b))},
 X8:function(a,b,c){this.CG(a,b)},
 L7:function(a,b){this.OH(a)},
 $isvs:true,
@@ -4449,14 +4491,14 @@
 return z},Vu:function(a,b,c){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
 return z},k3:[function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,33,[],79,[]],A9:[function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,33,[],81,[]],A9:[function(a,b){b.swG(!0)
 if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},"call$2","dd",4,0,null,33,[],79,[]],yE:[function(a,b){var z
+else a.au(b)},"call$2","dd",4,0,null,33,[],81,[]],yE:[function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"call$2","cN",4,0,null,33,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
+continue}else break}while(!0)},"call$2","cN",4,0,null,33,[],156,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -4494,33 +4536,33 @@
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=q}},"call$2","XX",4,0,null,33,[],154,[]]}},
+b=q}},"call$2","XX",4,0,null,33,[],156,[]]}},
 da:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){P.HZ(this.a,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pV:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 U7:{
-"^":"Tp:429;b",
-call$2:[function(a,b){this.b.K5(a,b)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
+"^":"Tp:353;b",
+call$2:[function(a,b){this.b.K5(a,b)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,84,161,[],162,[],"call"],
 $isEH:true},
 rH:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){P.A9(this.b,this.a)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 cX:{
-"^":"Tp:115;c,d",
+"^":"Tp:117;c,d",
 call$0:[function(){this.c.R8(this.d)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"Tp:115;a,b,c",
+"^":"Tp:117;a,b,c",
 call$0:[function(){this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:399;b,d,e,f",
+"^":"Tp:330;b,d,e,f",
 call$0:[function(){var z,y,x,w
 try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
@@ -4530,7 +4572,7 @@
 return!1}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 RW:{
-"^":"Tp:114;c,b,UI,bK",
+"^":"Tp:116;c,b,UI,bK",
 call$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
@@ -4566,7 +4608,7 @@
 r.b=!1}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 RT:{
-"^":"Tp:114;c,b,Gq,Rm,w3",
+"^":"Tp:116;c,b,Gq,Rm,w3",
 call$0:[function(){var z,y,x,w,v,u
 z={}
 z.a=null
@@ -4586,121 +4628,121 @@
 z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 jZ:{
-"^":"Tp:112;c,HZ",
-call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,430,[],"call"],
+"^":"Tp:114;c,HZ",
+call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,354,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:429;a,mG",
+"^":"Tp:353;a,mG",
 call$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.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,84,161,[],162,[],"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.call$0()}},
 qh:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,431,[]],
-tg:[function(a,b){var z,y
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")},355,[]],
+tg:function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
 z.a=null
-z.a=this.KR(new P.YJ(z,this,b,y),!0,new P.DO(y),y.gbY())
-return y},"call$1","gdj",2,0,null,107,[]],
-aN:[function(a,b){var z,y
+z.a=this.KR(new P.YJ(z,this,b,y),!0,new P.DO(y),y.gaq())
+return y},
+aN:function(a,b){var z,y
 z={}
 y=P.Dt(null)
 z.a=null
-z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gbY())
-return y},"call$1","gjw",2,0,null,406,[]],
-Vr:[function(a,b){var z,y
+z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gaq())
+return y},
+Vr:function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
 z.a=null
-z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gbY())
-return y},"call$1","gGI",2,0,null,407,[]],
+z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gaq())
+return y},
 gB:function(a){var z,y
 z={}
 y=P.Dt(J.im)
 z.a=0
-this.KR(new P.B5(z),!0,new P.PI(z,y),y.gbY())
+this.KR(new P.B5(z),!0,new P.PI(z,y),y.gaq())
 return y},
 gl0:function(a){var z,y
 z={}
 y=P.Dt(J.kn)
 z.a=null
-z.a=this.KR(new P.j4(z,y),!0,new P.i9(y),y.gbY())
+z.a=this.KR(new P.j4(z,y),!0,new P.i9(y),y.gaq())
 return y},
-br:[function(a){var z,y
+br:function(a){var z,y
 z=H.VM([],[H.ip(this,"qh",0)])
 y=P.Dt([J.Q,H.ip(this,"qh",0)])
-this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gbY())
-return y},"call$0","gdn",0,0,null],
-qZ:[function(a,b){var z=H.VM(new P.Zz(b,this),[null])
+this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gaq())
+return y},
+qZ:function(a,b){var z=H.VM(new P.Zz(b,this),[null])
 z.K6(this,b,null)
-return z},"call$1","gVw",2,0,null,130,[]],
-eR:[function(a,b){var z=H.VM(new P.dq(b,this),[null])
+return z},
+eR:function(a,b){var z=H.VM(new P.dq(b,this),[null])
 z.U6(this,b,null)
-return z},"call$1","gZo",2,0,null,130,[]],
+return z},
 gtH:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"qh",0))
 z.a=null
-z.a=this.KR(new P.lU(z,this,y),!0,new P.OC(y),y.gbY())
+z.a=this.KR(new P.lU(z,this,y),!0,new P.OC(y),y.gaq())
 return y},
 grZ:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"qh",0))
 z.a=null
 z.b=!1
-this.KR(new P.UH(z,this),!0,new P.Z5(z,y),y.gbY())
+this.KR(new P.UH(z,this),!0,new P.Z5(z,y),y.gaq())
 return y},
-Zv:[function(a,b){var z,y
+Zv:function(a,b){var z,y
 z={}
 z.a=b
 if(typeof b!=="number"||Math.floor(b)!==b||J.u6(b,0))throw H.b(new P.AT(z.a))
 y=P.Dt(H.ip(this,"qh",0))
 z.b=null
-z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gbY())
-return y},"call$1","gRV",2,0,null,15,[]],
+z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gaq())
+return y},
 $isqh:true},
 YJ:{
 "^":"Tp;a,b,c,d",
 call$1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,132,[],"call"],
+P.FE(new P.jv(this.c,a),new P.LB(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,134,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 jv:{
-"^":"Tp:115;e,f",
+"^":"Tp:117;e,f",
 call$0:[function(){return J.de(this.f,this.e)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 LB:{
-"^":"Tp:400;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,432,[],"call"],
+"^":"Tp:331;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,356,[],"call"],
 $isEH:true},
 DO:{
-"^":"Tp:115;bK",
+"^":"Tp:117;bK",
 call$0:[function(){this.bK.rX(!1)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"Tp;a,b,c,d",
-call$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"call$1",null,2,0,null,132,[],"call"],
+call$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"call$1",null,2,0,null,134,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Rl:{
-"^":"Tp:115;e,f",
+"^":"Tp:117;e,f",
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Jb:{
-"^":"Tp:112;",
-call$1:[function(a){},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 M4:{
-"^":"Tp:115;UI",
+"^":"Tp:117;UI",
 call$0:[function(){this.UI.rX(null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Jp:{
@@ -4708,45 +4750,45 @@
 call$1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,132,[],"call"],
+P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"call$1",null,2,0,null,134,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 h7:{
-"^":"Tp:115;e,f",
+"^":"Tp:117;e,f",
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pr:{
-"^":"Tp:400;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,432,[],"call"],
+"^":"Tp:331;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,356,[],"call"],
 $isEH:true},
 eN:{
-"^":"Tp:115;bK",
+"^":"Tp:117;bK",
 call$0:[function(){this.bK.rX(!1)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 B5:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=this.a
-z.a=z.a+1},"call$1",null,2,0,null,113,[],"call"],
+z.a=z.a+1},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 PI:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){this.b.rX(this.a.a)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 j4:{
-"^":"Tp:112;a,b",
-call$1:[function(a){P.Bb(this.a.a,this.b,!1)},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;a,b",
+call$1:[function(a){P.Bb(this.a.a,this.b,!1)},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 i9:{
-"^":"Tp:115;c",
+"^":"Tp:117;c",
 call$0:[function(){this.c.rX(!0)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 VV:{
 "^":"Tp;a,b",
-call$1:[function(a){this.b.push(a)},"call$1",null,2,0,null,236,[],"call"],
+call$1:[function(a){this.b.push(a)},"call$1",null,2,0,null,238,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.a,"qh")}},
 Dy:{
-"^":"Tp:115;c,d",
+"^":"Tp:117;c,d",
 call$0:[function(){this.d.rX(this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 lU:{
@@ -4755,7 +4797,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 OC:{
-"^":"Tp:115;d",
+"^":"Tp:117;d",
 call$0:[function(){this.d.Lp(new P.lj("No elements"))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 UH:{
@@ -4766,7 +4808,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Z5:{
-"^":"Tp:115;a,c",
+"^":"Tp:117;a,c",
 call$0:[function(){var z=this.a
 if(z.b){this.c.rX(z.a)
 return}this.c.Lp(new P.lj("No elements"))},"call$0",null,0,0,null,"call"],
@@ -4779,7 +4821,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 ii:{
-"^":"Tp:115;a,d",
+"^":"Tp:117;a,d",
 call$0:[function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 MO:{
@@ -4787,7 +4829,7 @@
 $isMO:true},
 O9:{
 "^":"ez;",
-w4:[function(a){var z,y,x,w
+w4:function(a){var z,y,x,w
 z=this.Y8
 if((z.Gv&4)!==0)H.vh(new P.lj("Subscribing to closed stream"))
 y=$.X3
@@ -4802,100 +4844,101 @@
 z.SJ=w
 w.Ae=z.Gv&1
 if(z.iE===w)P.ot(z.nL)
-return w},"call$1","gmn",2,0,null,433,[]],
+return w},
 giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
-n:[function(a,b){if(b==null)return!1
+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},"call$1","gUJ",2,0,null,109,[]],
+return b.Y8===this.Y8},
 $isO9:true},
 yU:{
 "^":"KA;Y8<",
-tA:[function(){return this.gY8().j0(this)},"call$0","gQC",0,0,null],
-uO:[function(){this.gY8()},"call$0","gp4",0,0,114],
-LP:[function(){this.gY8()},"call$0","gZ9",0,0,114]},
+tA:function(){return this.gY8().j0(this)},
+uO:[function(){this.gY8()},"call$0","gp4",0,0,116],
+LP:[function(){this.gY8()},"call$0","gZ9",0,0,116]},
 nP:{
 "^":"a;"},
 KA:{
 "^":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
-fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,434,[]],
-fm:[function(a,b){if(b==null)b=P.AY()
-this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,35,[]],
-y5:[function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,435,[]],
-Fv:[function(a,b){var z,y,x
+fe:function(a){this.dB=this.Lj.cR(a)},
+fm:function(a,b){if(b==null)b=P.AY()
+this.o7=P.VH(b,this.Lj)},
+y5:function(a){if(a==null)a=P.v3()
+this.Bd=this.Lj.Al(a)},
+TJ:function(a,b){var z,y,x
 z=this.Gv
 if((z&8)!==0)return
 y=(z+128|4)>>>0
 this.Gv=y
 if(z<128&&this.Ri!=null){x=this.Ri
-if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,436,[]],
-QE:[function(a){var z=this.Gv
+if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},
+yy:function(a){return this.TJ(a,null)},
+QE:function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
 this.Gv=z
 if(z<128)if((z&64)!==0&&this.Ri.N6!=null)this.Ri.t2(this)
 else{z=(z&4294967291)>>>0
 this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}},"call$0","gDQ",0,0,null],
-ed:[function(){var z=(this.Gv&4294967279)>>>0
+if((z&32)===0)this.J7(this.gZ9())}}},
+ed:function(){var z=(this.Gv&4294967279)>>>0
 this.Gv=z
 if((z&8)!==0)return this.lz
 this.Ek()
-return this.lz},"call$0","gZS",0,0,null],
+return this.lz},
 gRW:function(){return this.Gv>=128},
-Ek:[function(){var z,y
+Ek:function(){var z,y
 z=(this.Gv|8)>>>0
 this.Gv=z
 if((z&64)!==0){y=this.Ri
 if(y.Gv===1)y.Gv=3}if((z&32)===0)this.Ri=null
-this.lz=this.tA()},"call$0","gbz",0,0,null],
-Rg:[function(a,b){var z=this.Gv
+this.lz=this.tA()},
+Rg:function(a,b){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.Iv(b)
-else this.w6(H.VM(new P.LV(b,null),[null]))},"call$1","gHR",2,0,null,236,[]],
-V8:[function(a,b){var z=this.Gv
+else this.w6(H.VM(new P.LV(b,null),[null]))},
+V8:function(a,b){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.pb(a,b)
-else this.w6(new P.DS(a,b,null))},"call$2","gEm",4,0,null,159,[],160,[]],
-Qj:[function(){var z=this.Gv
+else this.w6(new P.DS(a,b,null))},
+Qj:function(){var z=this.Gv
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.Gv=z
 if(z<32)this.SY()
-else this.w6(C.Wj)},"call$0","gS2",0,0,null],
-uO:[function(){},"call$0","gp4",0,0,114],
-LP:[function(){},"call$0","gZ9",0,0,114],
-tA:[function(){},"call$0","gQC",0,0,null],
-w6:[function(a){var z,y
+else this.w6(C.Wj)},
+uO:[function(){},"call$0","gp4",0,0,116],
+LP:[function(){},"call$0","gZ9",0,0,116],
+tA:function(){},
+w6:function(a){var z,y
 z=this.Ri
 if(z==null){z=new P.Qk(null,null,0)
 this.Ri=z}z.h(0,a)
 y=this.Gv
 if((y&64)===0){y=(y|64)>>>0
 this.Gv=y
-if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,376,[]],
-Iv:[function(a){var z=this.Gv
+if(y<128)this.Ri.t2(this)}},
+Iv:function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 this.Lj.m1(this.dB,a)
 this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},"call$1","gm9",2,0,null,236,[]],
-pb:[function(a,b){var z,y
+this.Kl((z&4)!==0)},
+pb:function(a,b){var z,y
 z=this.Gv
 y=new P.Vo(this,a,b)
 if((z&1)!==0){this.Gv=(z|16)>>>0
 this.Ek()
 y.call$0()}else{y.call$0()
-this.Kl((z&4)!==0)}},"call$2","gTb",4,0,null,159,[],160,[]],
-SY:[function(){this.Ek()
+this.Kl((z&4)!==0)}},
+SY:function(){this.Ek()
 this.Gv=(this.Gv|16)>>>0
-new P.qB(this).call$0()},"call$0","gXm",0,0,null],
-J7:[function(a){var z=this.Gv
+new P.qB(this).call$0()},
+J7:function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 a.call$0()
 this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},"call$1","gEq",2,0,null,155,[]],
-Kl:[function(a){var z,y,x
+this.Kl((z&4)!==0)},
+Kl:function(a){var z,y,x
 z=this.Gv
 if((z&64)!==0&&this.Ri.N6==null){z=(z&4294967231)>>>0
 this.Gv=z
@@ -4910,11 +4953,11 @@
 if(x)this.uO()
 else this.LP()
 z=(this.Gv&4294967263)>>>0
-this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,437,[]],
+this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},
 $isMO:true,
 static:{"^":"ry,bG,Q9,wd,yJ,Dr,HX,GC,bsZ"}},
 Vo:{
-"^":"Tp:114;a,b,c",
+"^":"Tp:116;a,b,c",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 y=z.Gv
@@ -4930,7 +4973,7 @@
 else y.m1(x,v)}z.Gv=(z.Gv&4294967263)>>>0},"call$0",null,0,0,null,"call"],
 $isEH:true},
 qB:{
-"^":"Tp:114;a",
+"^":"Tp:116;a",
 call$0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -4941,40 +4984,41 @@
 $isEH:true},
 ez:{
 "^":"qh;",
-KR:[function(a,b,c,d){var z=this.w4(!0===b)
+KR:function(a,b,c,d){var z=this.w4(!0===b)
 z.fe(a)
 z.fm(0,d)
 z.y5(c)
-return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gdH",2,7,null,82,82,82,438,[],163,[],439,[],433,[]],
-w4:[function(a){var z,y
+return z},
+yI:function(a){return this.KR(a,null,null,null)},
+zC:function(a,b,c){return this.KR(a,null,b,c)},
+w4:function(a){var z,y
 z=$.X3
 y=a?1:0
 y=new P.KA(null,null,null,z,y,null,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},"call$1","gmn",2,0,null,433,[]]},
+return y}},
 fIm:{
 "^":"a;aw@"},
 LV:{
 "^":"fIm;P>,aw",
-r6:function(a,b){return this.P.call$1(b)},
-dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,440,[]]},
+dP:function(a){a.Iv(this.P)}},
 DS:{
 "^":"fIm;kc>,I4<,aw",
-dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,440,[]]},
+dP:function(a){a.pb(this.kc,this.I4)}},
 JF:{
 "^":"a;",
-dP:[function(a){a.SY()},"call$1","gqp",2,0,null,440,[]],
+dP:function(a){a.SY()},
 gaw:function(){return},
 saw:function(a){throw H.b(new P.lj("No events after a done."))}},
 ht:{
 "^":"a;",
-t2:[function(a){var z=this.Gv
+t2:function(a){var z=this.Gv
 if(z===1)return
 if(z>=1){this.Gv=1
 return}P.rb(new P.CR(this,a))
-this.Gv=1},"call$1","gQu",2,0,null,440,[]]},
+this.Gv=1}},
 CR:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -4985,34 +5029,34 @@
 Qk:{
 "^":"ht;zR,N6,Gv",
 gl0:function(a){return this.N6==null},
-h:[function(a,b){var z=this.N6
+h:function(a,b){var z=this.N6
 if(z==null){this.N6=b
 this.zR=b}else{z.saw(b)
-this.N6=b}},"call$1","ght",2,0,null,376,[]],
-TO:[function(a){var z,y
+this.N6=b}},
+TO:function(a){var z,y
 z=this.zR
 y=z.gaw()
 this.zR=y
 if(y==null)this.N6=null
-z.dP(a)},"call$1","gKt",2,0,null,440,[]],
-V1:[function(a){if(this.Gv===1)this.Gv=3
+z.dP(a)},
+V1:function(a){if(this.Gv===1)this.Gv=3
 this.N6=null
-this.zR=null},"call$0","gRa",0,0,null]},
+this.zR=null}},
 v1y:{
-"^":"Tp:115;a,b,c",
+"^":"Tp:117;a,b,c",
 call$0:[function(){return this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:441;a,b",
-call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,159,[],160,[],"call"],
+"^":"Tp:357;a,b",
+call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,161,[],162,[],"call"],
 $isEH:true},
 Xa:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){return this.a.rX(this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 YR:{
 "^":"qh;",
-KR:[function(a,b,c,d){var z,y,x,w,v
+KR:function(a,b,c,d){var z,y,x,w,v
 b=!0===b
 z=H.ip(this,"YR",0)
 y=H.ip(this,"YR",1)
@@ -5023,27 +5067,29 @@
 v.fe(a)
 v.fm(0,d)
 v.y5(c)
-return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gdH",2,7,null,82,82,82,438,[],163,[],439,[],433,[]],
-Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,236,[],442,[]],
+return v},
+zC:function(a,b,c){return this.KR(a,null,b,c)},
+yI:function(a){return this.KR(a,null,null,null)},
+Ml:function(a,b){b.Rg(0,a)},
 $asqh:function(a,b){return[b]}},
 fB:{
 "^":"KA;UY,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
-Rg:[function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.Rg.call(this,this,b)},"call$1","gHR",2,0,null,236,[]],
-V8:[function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.V8.call(this,a,b)},"call$2","gEm",4,0,null,159,[],160,[]],
+Rg:function(a,b){if((this.Gv&2)!==0)return
+P.KA.prototype.Rg.call(this,this,b)},
+V8:function(a,b){if((this.Gv&2)!==0)return
+P.KA.prototype.V8.call(this,a,b)},
 uO:[function(){var z=this.Ee
 if(z==null)return
-z.yy(0)},"call$0","gp4",0,0,114],
+z.yy(0)},"call$0","gp4",0,0,116],
 LP:[function(){var z=this.Ee
 if(z==null)return
-z.QE(0)},"call$0","gZ9",0,0,114],
-tA:[function(){var z=this.Ee
+z.QE(0)},"call$0","gZ9",0,0,116],
+tA:function(){var z=this.Ee
 if(z!=null){this.Ee=null
-z.ed()}return},"call$0","gQC",0,0,null],
-vx:[function(a){this.UY.Ml(a,this)},"call$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},236,[]],
-xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,443,159,[],160,[]],
-nn:[function(){this.Qj()},"call$0","gH1",0,0,114],
+z.ed()}return},
+vx:[function(a){this.UY.Ml(a,this)},"call$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},238,[]],
+xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,358,161,[],162,[]],
+nn:[function(){this.Qj()},"call$0","gH1",0,0,116],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
@@ -5053,39 +5099,39 @@
 nO:{
 "^":"YR;qs,Sb",
 Dr:function(a){return this.qs.call$1(a)},
-Ml:[function(a,b){var z,y,x,w,v
+Ml:function(a,b){var z,y,x,w,v
 z=null
 try{z=this.Dr(a)}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,444,[],442,[]],
+return}if(z===!0)J.QM(b,a)},
 $asYR:function(a){return[a,a]},
 $asqh:null},
 t3:{
 "^":"YR;TN,Sb",
 kn:function(a){return this.TN.call$1(a)},
-Ml:[function(a,b){var z,y,x,w,v
+Ml:function(a,b){var z,y,x,w,v
 z=null
 try{z=this.kn(a)}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}J.QM(b,z)},"call$2","gOa",4,0,null,444,[],442,[]]},
+return}J.QM(b,z)}},
 Zz:{
-"^":"YR;q6,Sb",
-Ml:[function(a,b){var z
-if(J.z8(this.q6,0)){b.Rg(0,a)
-z=J.xH(this.q6,1)
-this.q6=z
-if(J.de(z,0))b.Qj()}},"call$2","gOa",4,0,null,444,[],442,[]],
+"^":"YR;Em,Sb",
+Ml:function(a,b){var z
+if(J.z8(this.Em,0)){b.Rg(0,a)
+z=J.xH(this.Em,1)
+this.Em=z
+if(J.de(z,0))b.Qj()}},
 K6:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))},
 $asYR:function(a){return[a,a]},
 $asqh:null},
 dq:{
-"^":"YR;q6,Sb",
-Ml:[function(a,b){if(J.z8(this.q6,0)){this.q6=J.xH(this.q6,1)
-return}b.Rg(0,a)},"call$2","gOa",4,0,null,444,[],442,[]],
+"^":"YR;Em,Sb",
+Ml:function(a,b){if(J.z8(this.Em,0)){this.Em=J.xH(this.Em,1)
+return}b.Rg(0,a)},
 U6:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(new P.AT(b))},
 $asYR:function(a){return[a,a]},
 $asqh:null},
@@ -5114,131 +5160,133 @@
 Id:{
 "^":"a;oh",
 gLj:function(){return this.oh},
-c1:[function(a,b,c){var z,y
+c1:function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gE2()==null;)z=z.geT(z)
-return y.gE2().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gE2",6,0,null,153,[],159,[],160,[]],
-Vn:[function(a,b){var z,y
+return y.gE2().call$5(z,new P.Id(z.geT(z)),a,b,c)},
+Vn:function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gcP()==null;)z=z.geT(z)
-return y.gcP().call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gcP",4,0,null,153,[],117,[]],
-qG:[function(a,b,c){var z,y
+return y.gcP().call$4(z,new P.Id(z.geT(z)),a,b)},
+qG:function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gJl()==null;)z=z.geT(z)
-return y.gJl().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gJl",6,0,null,153,[],117,[],172,[]],
-nA:[function(a,b,c,d){var z,y
+return y.gJl().call$5(z,new P.Id(z.geT(z)),a,b,c)},
+nA:function(a,b,c,d){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gpU()==null;)z=z.geT(z)
-return y.gpU().call$6(z,new P.Id(z.geT(z)),a,b,c,d)},"call$4","gpU",8,0,null,153,[],117,[],59,[],60,[]],
-TE:[function(a,b){var z,y
+return y.gpU().call$6(z,new P.Id(z.geT(z)),a,b,c,d)},
+TE:function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gFh(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gFh",4,0,null,153,[],117,[]],
-V6:[function(a,b){var z,y
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},
+V6:function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gXp(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,153,[],117,[]],
-mz:[function(a,b){var z,y
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},
+mz:function(a,b){var z,y
 z=this.oh
 for(;y=z.gzU().gfb(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gfb",4,0,null,153,[],117,[]],
-RK:[function(a,b){var z,y,x
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},
+RK:function(a,b){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.grb()==null;)z=z.geT(z)
 x=z.geT(z)
-y.grb().call$4(z,new P.Id(x),a,b)},"call$2","grb",4,0,null,153,[],117,[]],
-pX:[function(a,b,c){var z,y
+y.grb().call$4(z,new P.Id(x),a,b)},
+pX:function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gZq()==null;)z=z.geT(z)
-return y.gZq().call$5(z,new P.Id(z.geT(z)),a,b,c)},"call$3","gZq",6,0,null,153,[],166,[],117,[]],
-RB:[function(a,b,c){var z,y
+return y.gZq().call$5(z,new P.Id(z.geT(z)),a,b,c)},
+RB:function(a,b,c){var z,y
 z=this.oh
 for(;y=z.gzU(),y.gJS(y)==null;)z=z.geT(z)
-y.gJS(y).call$4(z,new P.Id(z.geT(z)),b,c)},"call$2","gJS",4,0,null,153,[],180,[]],
-ld:[function(a,b,c){var z,y,x
+y.gJS(y).call$4(z,new P.Id(z.geT(z)),b,c)},
+ld:function(a,b,c){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.giq()==null;)z=z.geT(z)
 x=z.geT(z)
-return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,153,[],183,[],184,[]]},
+return y.giq().call$5(z,new P.Id(x),a,b,c)}},
 WH:{
 "^":"a;",
-fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,445,[]],
-bH:[function(a){var z,y,x,w
+fC:function(a){return this.gC5()===a.gC5()},
+bH:function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$1","gSI",2,0,null,117,[]],
-m1:[function(a,b){var z,y,x,w
+return this.hk(z,y)}},
+m1:function(a,b){var z,y,x,w
 try{x=this.FI(a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$2","gNY",4,0,null,117,[],172,[]],
-z8:[function(a,b,c){var z,y,x,w
+return this.hk(z,y)}},
+z8:function(a,b,c){var z,y,x,w
 try{x=this.mg(a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
 y=new H.XO(w,null)
-return this.hk(z,y)}},"call$3","gLG",6,0,null,117,[],59,[],60,[]],
-xi:[function(a,b){var z=this.Al(a)
+return this.hk(z,y)}},
+xi:function(a,b){var z=this.Al(a)
 if(b)return new P.TF(this,z)
-else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,340,117,[],446,[]],
-oj:[function(a,b){var z=this.cR(a)
+else return new P.K5(this,z)},
+ce:function(a){return this.xi(a,!0)},
+oj:function(a,b){var z=this.cR(a)
 if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,340,117,[],446,[]],
-PT:[function(a,b){var z=this.O8(a)
+else return new P.Hs(this,z)},
+PT:function(a,b){var z=this.O8(a)
 if(b)return new P.dv(this,z)
-else return new P.ph(this,z)},"call$2$runGuarded","gma",2,3,null,340,117,[],446,[]]},
+else return new P.ph(this,z)}},
 TF:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){return this.a.bH(this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 K5:{
-"^":"Tp:115;c,d",
+"^":"Tp:117;c,d",
 call$0:[function(){return this.c.Gr(this.d)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
-"^":"Tp:112;a,b",
-call$1:[function(a){return this.a.m1(this.b,a)},"call$1",null,2,0,null,172,[],"call"],
+"^":"Tp:114;a,b",
+call$1:[function(a){return this.a.m1(this.b,a)},"call$1",null,2,0,null,174,[],"call"],
 $isEH:true},
 Hs:{
-"^":"Tp:112;c,d",
-call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,172,[],"call"],
+"^":"Tp:114;c,d",
+call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,174,[],"call"],
 $isEH:true},
 dv:{
-"^":"Tp:355;a,b",
+"^":"Tp:293;a,b",
 call$2:[function(a,b){return this.a.z8(this.b,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
 ph:{
-"^":"Tp:355;c,d",
+"^":"Tp:293;c,d",
 call$2:[function(a,b){return this.c.mg(this.d,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
 uo:{
 "^":"WH;eT>,zU<,R1",
 gC5:function(){return this.eT.gC5()},
-t:[function(a,b){var z,y
+t:function(a,b){var z,y
 z=this.R1
 y=z.t(0,b)
 if(y!=null||z.x4(b))return y
-return this.eT.t(0,b)},"call$1","gIA",2,0,null,48,[]],
-hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
-c6:[function(a,b){return new P.Id(this).ld(this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
-Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,117,[]],
-FI:[function(a,b){return new P.Id(this).qG(this,a,b)},"call$2","gJl",4,0,null,117,[],172,[]],
-mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
-Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,117,[]],
-cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gfb",2,0,null,117,[]],
-wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,117,[]],
-uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
-Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,180,[]]},
+return this.eT.t(0,b)},
+hk:function(a,b){return new P.Id(this).c1(this,a,b)},
+c6:function(a,b){return new P.Id(this).ld(this,a,b)},
+iT:function(a){return this.c6(a,null)},
+Gr:function(a){return new P.Id(this).Vn(this,a)},
+FI:function(a,b){return new P.Id(this).qG(this,a,b)},
+mg:function(a,b,c){return new P.Id(this).nA(this,a,b,c)},
+Al:function(a){return new P.Id(this).TE(this,a)},
+cR:function(a){return new P.Id(this).V6(this,a)},
+O8:function(a){return new P.Id(this).mz(this,a)},
+wr:function(a){new P.Id(this).RK(this,a)},
+uN:function(a,b){return new P.Id(this).pX(this,a,b)},
+Ch:function(a,b){new P.Id(this).RB(0,this,b)}},
 pK:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){P.IA(new P.eM(this.a,this.b))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 eM:{
-"^":"Tp:115;c,d",
+"^":"Tp:117;c,d",
 call$0:[function(){var z,y
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
@@ -5248,9 +5296,8 @@
 throw H.b(z)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Uez:{
-"^":"Tp:415;a",
-call$2:[function(a,b){if(a==null)throw H.b(new P.AT("ZoneValue key must not be null"))
-this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
+"^":"Tp:293;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 W5:{
 "^":"a;",
@@ -5282,23 +5329,24 @@
 geT:function(a){return},
 gzU:function(){return C.v8},
 gC5:function(){return this},
-fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,445,[]],
-t:[function(a,b){return},"call$1","gIA",2,0,null,48,[]],
-hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
-c6:[function(a,b){return P.UA(this,null,this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
-Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,117,[]],
-FI:[function(a,b){return P.V7(this,null,this,a,b)},"call$2","gJl",4,0,null,117,[],172,[]],
-mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
-Al:[function(a){return a},"call$1","gFh",2,0,null,117,[]],
-cR:[function(a){return a},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return a},"call$1","gfb",2,0,null,117,[]],
-wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,117,[]],
-uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
-Ch:[function(a,b){H.qw(b)
-return},"call$1","gJS",2,0,null,180,[]]}}],["dart.collection","dart:collection",,P,{
+fC:function(a){return a.gC5()===this},
+t:function(a,b){return},
+hk:function(a,b){return P.L2(this,null,this,a,b)},
+c6:function(a,b){return P.UA(this,null,this,a,b)},
+iT:function(a){return this.c6(a,null)},
+Gr:function(a){return P.T8(this,null,this,a)},
+FI:function(a,b){return P.V7(this,null,this,a,b)},
+mg:function(a,b,c){return P.Qx(this,null,this,a,b,c)},
+Al:function(a){return a},
+cR:function(a){return a},
+O8:function(a){return a},
+wr:function(a){P.Tk(this,null,this,a)},
+uN:function(a,b){return P.h8(this,null,this,a,b)},
+Ch:function(a,b){H.qw(b)
+return}}}],["dart.collection","dart:collection",,P,{
 "^":"",
-TQ:[function(a,b){return J.de(a,b)},"call$2","S5",4,0,186,131,[],187,[]],
-T9:[function(a){return J.v1(a)},"call$1","py",2,0,188,131,[]],
+TQ:[function(a,b){return J.de(a,b)},"call$2","S5",4,0,188,133,[],189,[]],
+T9:[function(a){return J.v1(a)},"call$1","py",2,0,190,133,[]],
 Py:function(a,b,c,d,e){var z
 if(a==null){z=new P.k6(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -5313,7 +5361,7 @@
 try{P.Vr(a,z)}finally{$.xb().Rz(0,a)}y=P.p9("(")
 y.We(z,", ")
 y.KF(")")
-return y.vM},"call$1","Zw",2,0,null,116,[]],
+return y.vM},"call$1","Zw",2,0,null,118,[]],
 Vr:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z=a.gA(a)
 y=0
@@ -5350,7 +5398,7 @@
 if(p==null){y+=5
 p="..."}}if(p!=null)b.push(p)
 b.push(u)
-b.push(v)},"call$2","zE",4,0,null,116,[],189,[]],
+b.push(v)},"call$2","zE",4,0,null,118,[],191,[]],
 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.b6(0,null,null,null,null,null,0),[d])},
 vW:[function(a){var z,y,x,w,v
@@ -5361,28 +5409,28 @@
 try{$.tw().push(a)
 y.KF("{")
 z.a=!0
-J.kH(a,new P.ZQ(z,y))
+J.kH(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},"call$1","DH",2,0,null,190,[]],
+z.pop()}return y.gvM()},"call$1","DH",2,0,null,192,[]],
 k6:{
 "^":"a;X5,vv,OX,OB,wV",
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-gvc:function(a){return H.VM(new P.fG(this),[H.Kp(this,0)])},
+gvc:function(){return H.VM(new P.fG(this),[H.Kp(this,0)])},
 gUQ:function(a){return H.K1(H.VM(new P.fG(this),[H.Kp(this,0)]),new P.oi(this),H.Kp(this,0),H.Kp(this,1))},
-x4:[function(a){var z,y,x
+x4:function(a){var z,y,x
 if(typeof a==="string"&&a!=="__proto__"){z=this.vv
 return z==null?!1:z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
 return y==null?!1:y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
-di:[function(a){var z=this.Ig()
+return this.aH(x[this.nm(a)],a)>=0}},
+di:function(a){var z=this.Ig()
 z.toString
-return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,30,[]],
-FV:[function(a,b){J.kH(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
-t:[function(a,b){var z,y,x,w,v,u,t
+return H.Ck(z,new P.ce(this,a))},
+FV:function(a,b){J.kH(b,new P.DJ(this))},
+t:function(a,b){var z,y,x,w,v,u,t
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)y=null
 else{x=z[b]
@@ -5393,8 +5441,8 @@
 if(v==null)return
 u=v[this.nm(b)]
 t=this.aH(u,b)
-return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,48,[]],
-u:[function(a,b,c){var z,y,x,w,v,u
+return t<0?null:u[t+1]}},
+u:function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.a0()
 this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
@@ -5409,8 +5457,8 @@
 if(u>=0)v[u+1]=c
 else{v.push(b,c)
 this.X5=this.X5+1
-this.wV=null}}}},"call$2","gj3",4,0,null,48,[],30,[]],
-Rz:[function(a,b){var z,y,x
+this.wV=null}}}},
+Rz:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
 else{z=this.OB
@@ -5420,18 +5468,18 @@
 if(x<0)return
 this.X5=this.X5-1
 this.wV=null
-return y.splice(x,2)[1]}},"call$1","guH",2,0,null,48,[]],
-V1:[function(a){if(this.X5>0){this.wV=null
+return y.splice(x,2)[1]}},
+V1:function(a){if(this.X5>0){this.wV=null
 this.OB=null
 this.OX=null
 this.vv=null
-this.X5=0}},"call$0","gRa",0,0,null],
-aN:[function(a,b){var z,y,x,w
+this.X5=0}},
+aN:function(a,b){var z,y,x,w
 z=this.Ig()
 for(y=z.length,x=0;x<y;++x){w=z[x]
 b.call$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,406,[]],
-Ig:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
+if(z!==this.wV)throw H.b(P.a4(this))}},
+Ig:function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.wV
 if(z!=null)return z
 y=Array(this.X5)
@@ -5449,35 +5497,35 @@
 for(t=0;t<v;++t){q=r[w[t]]
 p=q.length
 for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.wV=y
-return y},"call$0","gtL",0,0,null],
-dg:[function(a,b,c){if(a[b]==null){this.X5=this.X5+1
-this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
-Nv:[function(a,b){var z
+return y},
+dg:function(a,b,c){if(a[b]==null){this.X5=this.X5+1
+this.wV=null}P.cW(a,b,c)},
+Nv:function(a,b){var z
 if(a!=null&&a[b]!=null){z=P.vL(a,b)
 delete a[b]
 this.X5=this.X5-1
 this.wV=null
-return z}else return},"call$2","got",4,0,null,185,[],48,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
-aH:[function(a,b){var z,y
+return z}else return},
+nm:function(a){return J.v1(a)&0x3ffffff},
+aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
-return-1},"call$2","gXD",4,0,null,447,[],48,[]],
+return-1},
 $isZ0:true,
 static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"call$2","ME",4,0,null,185,[],48,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"call$3","rn",6,0,null,185,[],48,[],30,[]],a0:[function(){var z=Object.create(null)
+return z===a?null:z},"call$2","ME",4,0,null,187,[],48,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"call$3","rn",6,0,null,187,[],48,[],30,[]],a0:[function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
 return z},"call$0","l1",0,0,null]}},
 oi:{
-"^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,448,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,359,[],"call"],
 $isEH:true},
 ce:{
-"^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,448,[],"call"],
+"^":"Tp:114;a,b",
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,359,[],"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
@@ -5486,36 +5534,36 @@
 $signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
 PL:{
 "^":"k6;X5,vv,OX,OB,wV",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
-aH:[function(a,b){var z,y,x
+nm:function(a){return H.CU(a)&0x3ffffff},
+aH:function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gXD",4,0,null,447,[],48,[]]},
+if(x==null?b==null:x===b)return y}return-1}},
 Fq:{
 "^":"k6;y9,Q6,ac,X5,vv,OX,OB,wV",
 WV:function(a,b){return this.y9.call$2(a,b)},
 H5:function(a){return this.Q6.call$1(a)},
 Ef:function(a){return this.ac.call$1(a)},
-t:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,48,[]],
-x4:[function(a){if(this.Ef(a)!==!0)return!1
-return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,48,[]],
-Rz:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,48,[]],
-nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
-aH:[function(a,b){var z,y
+t:function(a,b){if(this.Ef(b)!==!0)return
+return P.k6.prototype.t.call(this,this,b)},
+x4:function(a){if(this.Ef(a)!==!0)return!1
+return P.k6.prototype.x4.call(this,a)},
+Rz:function(a,b){if(this.Ef(b)!==!0)return
+return P.k6.prototype.Rz.call(this,this,b)},
+nm:function(a){return this.H5(a)&0x3ffffff},
+aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(this.WV(a[y],b)===!0)return y
-return-1},"call$2","gXD",4,0,null,447,[],48,[]],
-bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
+return-1},
+bu:function(a){return P.vW(this)},
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,275,[],"call"],
+return z},"call$1",null,2,0,null,277,[],"call"],
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -5525,17 +5573,17 @@
 z=new P.EQ(z,z.Ig(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,132,[]],
-aN:[function(a,b){var z,y,x,w
+tg:function(a,b){return this.Fb.x4(b)},
+aN:function(a,b){var z,y,x,w
 z=this.Fb
 y=z.Ig()
 for(x=y.length,w=0;w<x;++w){b.call$1(y[w])
-if(y!==z.wV)throw H.b(P.a4(z))}},"call$1","gjw",2,0,null,117,[]],
+if(y!==z.wV)throw H.b(P.a4(z))}},
 $isyN:true},
 EQ:{
 "^":"a;Fb,wV,zi,fD",
 gl:function(){return this.fD},
-G:[function(){var z,y,x
+G:function(){var z,y,x
 z=this.wV
 y=this.zi
 x=this.Fb
@@ -5543,25 +5591,25 @@
 else if(y>=z.length){this.fD=null
 return!1}else{this.fD=z[y]
 this.zi=y+1
-return!0}},"call$0","gqy",0,0,null]},
+return!0}}},
 YB:{
 "^":"a;X5,vv,OX,OB,H9,lX,zN",
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-gvc:function(a){return H.VM(new P.i5(this),[H.Kp(this,0)])},
+gvc:function(){return H.VM(new P.i5(this),[H.Kp(this,0)])},
 gUQ:function(a){return H.K1(H.VM(new P.i5(this),[H.Kp(this,0)]),new P.a1(this),H.Kp(this,0),H.Kp(this,1))},
-x4:[function(a){var z,y,x
+x4:function(a){var z,y,x
 if(typeof a==="string"&&a!=="__proto__"){z=this.vv
 if(z==null)return!1
 return z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
 if(y==null)return!1
 return y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
-di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,30,[]],
-FV:[function(a,b){J.kH(b,new P.S9(this))},"call$1","gDY",2,0,null,109,[]],
-t:[function(a,b){var z,y,x,w,v,u
+return this.aH(x[this.nm(a)],a)>=0}},
+di:function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},
+FV:function(a,b){J.kH(b,new P.S9(this))},
+t:function(a,b){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)return
 y=z[b]
@@ -5573,8 +5621,8 @@
 v=w[this.nm(b)]
 u=this.aH(v,b)
 if(u<0)return
-return v[u].gS4()}},"call$1","gIA",2,0,null,48,[]],
-u:[function(a,b,c){var z,y,x,w,v,u
+return v[u].gS4()}},
+u:function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.Qs()
 this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
@@ -5586,13 +5634,13 @@
 if(v==null)x[w]=[this.pE(b,c)]
 else{u=this.aH(v,b)
 if(u>=0)v[u].sS4(c)
-else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,48,[],30,[]],
-to:[function(a,b){var z
+else v.push(this.pE(b,c))}}},
+to:function(a,b){var z
 if(this.x4(a))return this.t(0,a)
 z=b.call$0()
 this.u(0,a,z)
-return z},"call$2","gME",4,0,null,48,[],449,[]],
-Rz:[function(a,b){var z,y,x,w
+return z},
+Rz:function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
 else{z=this.OB
@@ -5602,31 +5650,31 @@
 if(x<0)return
 w=y.splice(x,1)[0]
 this.Vb(w)
-return w.gS4()}},"call$1","guH",2,0,null,48,[]],
-V1:[function(a){if(this.X5>0){this.lX=null
+return w.gS4()}},
+V1:function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
 this.OX=null
 this.vv=null
 this.X5=0
-this.zN=this.zN+1&67108863}},"call$0","gRa",0,0,null],
-aN:[function(a,b){var z,y
+this.zN=this.zN+1&67108863}},
+aN:function(a,b){var z,y
 z=this.H9
 y=this.zN
 for(;z!=null;){b.call$2(z.gkh(),z.gS4())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,406,[]],
-dg:[function(a,b,c){var z=a[b]
+z=z.gDG()}},
+dg:function(a,b,c){var z=a[b]
 if(z==null)a[b]=this.pE(b,c)
-else z.sS4(c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
-Nv:[function(a,b){var z
+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.gS4()},"call$2","got",4,0,null,185,[],48,[]],
-pE:[function(a,b){var z,y
+return z.gS4()},
+pE:function(a,b){var z,y
 z=new P.db(a,b,null,null)
 if(this.H9==null){this.lX=z
 this.H9=z}else{y=this.lX
@@ -5634,8 +5682,8 @@
 y.sDG(z)
 this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
-return z},"call$2","gTM",4,0,null,48,[],30,[]],
-Vb:[function(a){var z,y
+return z},
+Vb:function(a){var z,y
 z=a.gzQ()
 y=a.gDG()
 if(z==null)this.H9=y
@@ -5643,14 +5691,14 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,450,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
-aH:[function(a,b){var z,y
+this.zN=this.zN+1&67108863},
+nm:function(a){return J.v1(a)&0x3ffffff},
+aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gkh(),b))return y
-return-1},"call$2","gXD",4,0,null,447,[],48,[]],
-bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
+return-1},
+bu:function(a){return P.vW(this)},
 $isFo:true,
 $isZ0:true,
 static:{Qs:[function(){var z=Object.create(null)
@@ -5658,12 +5706,12 @@
 delete z["<non-identifier-key>"]
 return z},"call$0","Bs",0,0,null]}},
 a1:{
-"^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,448,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,359,[],"call"],
 $isEH:true},
 ou:{
-"^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,448,[],"call"],
+"^":"Tp:114;a,b",
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,359,[],"call"],
 $isEH:true},
 S9:{
 "^":"Tp;a",
@@ -5682,25 +5730,25 @@
 y.$builtinTypeInfo=this.$builtinTypeInfo
 y.zq=z.H9
 return y},
-tg:[function(a,b){return this.Fb.x4(b)},"call$1","gdj",2,0,null,132,[]],
-aN:[function(a,b){var z,y,x
+tg:function(a,b){return this.Fb.x4(b)},
+aN:function(a,b){var z,y,x
 z=this.Fb
 y=z.H9
 x=z.zN
 for(;y!=null;){b.call$1(y.gkh())
 if(x!==z.zN)throw H.b(P.a4(z))
-y=y.gDG()}},"call$1","gjw",2,0,null,117,[]],
+y=y.gDG()}},
 $isyN:true},
 N6:{
 "^":"a;Fb,zN,zq,fD",
 gl:function(){return this.fD},
-G:[function(){var z=this.Fb
+G:function(){var z=this.Fb
 if(this.zN!==z.zN)throw H.b(P.a4(z))
 else{z=this.zq
 if(z==null){this.fD=null
 return!1}else{this.fD=z.gkh()
 this.zq=this.zq.gDG()
-return!0}}},"call$0","gqy",0,0,null]},
+return!0}}}},
 Rr:{
 "^":"lN;",
 gA:function(a){var z=new P.oz(this,this.Zl(),0,null)
@@ -5709,13 +5757,13 @@
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-tg:[function(a,b){var z,y,x
+tg:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
 return y==null?!1:y[b]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(b)],b)>=0}},"call$1","gdj",2,0,null,6,[]],
-Zt:[function(a){var z,y,x,w
+return this.aH(x[this.nm(b)],b)>=0}},
+Zt:function(a){var z,y,x,w
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
@@ -5724,8 +5772,8 @@
 x=y[this.nm(a)]
 w=this.aH(x,a)
 if(w<0)return
-return J.UQ(x,w)},"call$1","gQB",2,0,null,6,[]],
-h:[function(a,b){var z,y,x,w,v,u
+return J.UQ(x,w)},
+h:function(a,b){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
@@ -5747,12 +5795,11 @@
 else{if(this.aH(u,b)>=0)return!1
 u.push(b)}this.X5=this.X5+1
 this.DM=null
-return!0}},"call$1","ght",2,0,null,132,[]],
-FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,451,[]],
-Rz:[function(a,b){var z,y,x
+return!0}},
+FV:function(a,b){var z
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},
+Rz:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
 else{z=this.OB
 if(z==null)return!1
 y=z[this.nm(b)]
@@ -5761,13 +5808,13 @@
 this.X5=this.X5-1
 this.DM=null
 y.splice(x,1)
-return!0}},"call$1","guH",2,0,null,6,[]],
-V1:[function(a){if(this.X5>0){this.DM=null
+return!0}},
+V1:function(a){if(this.X5>0){this.DM=null
 this.OB=null
 this.OX=null
 this.vv=null
-this.X5=0}},"call$0","gRa",0,0,null],
-Zl:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
+this.X5=0}},
+Zl:function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.DM
 if(z!=null)return z
 y=Array(this.X5)
@@ -5785,38 +5832,38 @@
 for(t=0;t<v;++t){q=r[w[t]]
 p=q.length
 for(o=0;o<p;++o){y[u]=q[o];++u}}}this.DM=y
-return y},"call$0","gK2",0,0,null],
-cA:[function(a,b){if(a[b]!=null)return!1
+return y},
+cA:function(a,b){if(a[b]!=null)return!1
 a[b]=0
 this.X5=this.X5+1
 this.DM=null
-return!0},"call$2","gLa",4,0,null,185,[],132,[]],
-Nv:[function(a,b){if(a!=null&&a[b]!=null){delete a[b]
+return!0},
+Nv:function(a,b){if(a!=null&&a[b]!=null){delete a[b]
 this.X5=this.X5-1
 this.DM=null
-return!0}else return!1},"call$2","got",4,0,null,185,[],132,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,132,[]],
-aH:[function(a,b){var z,y
+return!0}else return!1},
+nm:function(a){return J.v1(a)&0x3ffffff},
+aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y],b))return y
-return-1},"call$2","gXD",4,0,null,447,[],132,[]],
+return-1},
 $isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 YO:{
 "^":"Rr;X5,vv,OX,OB,DM",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
-aH:[function(a,b){var z,y,x
+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},"call$2","gXD",4,0,null,447,[],132,[]]},
+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
+G:function(){var z,y,x
 z=this.DM
 y=this.zi
 x=this.O2
@@ -5824,7 +5871,7 @@
 else if(y>=z.length){this.fD=null
 return!1}else{this.fD=z[y]
 this.zi=y+1
-return!0}},"call$0","gqy",0,0,null]},
+return!0}}},
 b6:{
 "^":"lN;X5,vv,OX,OB,H9,lX,zN",
 gA:function(a){var z=H.VM(new P.zQ(this,this.zN,null,null),[null])
@@ -5833,15 +5880,15 @@
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
 gor:function(a){return this.X5!==0},
-tg:[function(a,b){var z,y,x
+tg:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)return!1
 return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
 if(y==null)return!1
 return y[b]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(b)],b)>=0}},"call$1","gdj",2,0,null,6,[]],
-Zt:[function(a){var z,y,x,w
+return this.aH(x[this.nm(b)],b)>=0}},
+Zt:function(a){var z,y,x,w
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
@@ -5850,17 +5897,17 @@
 x=y[this.nm(a)]
 w=this.aH(x,a)
 if(w<0)return
-return J.UQ(x,w).gGc()}},"call$1","gQB",2,0,null,6,[]],
-aN:[function(a,b){var z,y
+return J.UQ(x,w).gGc()}},
+aN:function(a,b){var z,y
 z=this.H9
 y=this.zN
 for(;z!=null;){b.call$1(z.gGc())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,406,[]],
+z=z.gDG()}},
 grZ:function(a){var z=this.lX
 if(z==null)throw H.b(new P.lj("No elements"))
 return z.gGc()},
-h:[function(a,b){var z,y,x,w,v,u
+h:function(a,b){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
@@ -5880,10 +5927,10 @@
 u=w[v]
 if(u==null)w[v]=[this.xf(b)]
 else{if(this.aH(u,b)>=0)return!1
-u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,132,[]],
-FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,451,[]],
-Rz:[function(a,b){var z,y,x
+u.push(this.xf(b))}return!0}},
+FV:function(a,b){var z
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},
+Rz:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
 else{z=this.OB
@@ -5892,25 +5939,25 @@
 x=this.aH(y,b)
 if(x<0)return!1
 this.Vb(y.splice(x,1)[0])
-return!0}},"call$1","guH",2,0,null,6,[]],
-V1:[function(a){if(this.X5>0){this.lX=null
+return!0}},
+V1:function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
 this.OX=null
 this.vv=null
 this.X5=0
-this.zN=this.zN+1&67108863}},"call$0","gRa",0,0,null],
-cA:[function(a,b){if(a[b]!=null)return!1
+this.zN=this.zN+1&67108863}},
+cA:function(a,b){if(a[b]!=null)return!1
 a[b]=this.xf(b)
-return!0},"call$2","gLa",4,0,null,185,[],132,[]],
-Nv:[function(a,b){var z
+return!0},
+Nv:function(a,b){var z
 if(a==null)return!1
 z=a[b]
 if(z==null)return!1
 this.Vb(z)
 delete a[b]
-return!0},"call$2","got",4,0,null,185,[],132,[]],
-xf:[function(a){var z,y
+return!0},
+xf:function(a){var z,y
 z=new P.ef(a,null,null)
 if(this.H9==null){this.lX=z
 this.H9=z}else{y=this.lX
@@ -5918,8 +5965,8 @@
 y.sDG(z)
 this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
-return z},"call$1","gTM",2,0,null,132,[]],
-Vb:[function(a){var z,y
+return z},
+Vb:function(a){var z,y
 z=a.gzQ()
 y=a.gDG()
 if(z==null)this.H9=y
@@ -5927,13 +5974,13 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,450,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,132,[]],
-aH:[function(a,b){var z,y
+this.zN=this.zN+1&67108863},
+nm:function(a){return J.v1(a)&0x3ffffff},
+aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gGc(),b))return y
-return-1},"call$2","gXD",4,0,null,447,[],132,[]],
+return-1},
 $isz5:true,
 $isyN:true,
 $isQV:true,
@@ -5943,42 +5990,43 @@
 zQ:{
 "^":"a;O2,zN,zq,fD",
 gl:function(){return this.fD},
-G:[function(){var z=this.O2
+G:function(){var z=this.O2
 if(this.zN!==z.zN)throw H.b(P.a4(z))
 else{z=this.zq
 if(z==null){this.fD=null
 return!1}else{this.fD=z.gGc()
 this.zq=this.zq.gDG()
-return!0}}},"call$0","gqy",0,0,null]},
+return!0}}}},
 Yp:{
 "^":"w2Y;G4",
 gB:function(a){return J.q8(this.G4)},
-t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,15,[]]},
+t:function(a,b){return J.i4(this.G4,b)}},
 lN:{
 "^":"mW;",
-tt:[function(a,b){var z,y,x,w,v
+tt:function(a,b){var z,y,x,w,v
 if(b){z=H.VM([],[H.Kp(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
 z=H.VM(y,[H.Kp(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
 v=x+1
 if(x>=z.length)return H.e(z,x)
-z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,340,341,[]],
-bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
+z[x]=w}return z},
+br:function(a){return this.tt(a,!0)},
+bu:function(a){return H.mx(this,"{","}")},
 $isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"call$1","gIr",2,0,null,117,[]],
-ev:[function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},"call$1","gIR",2,0,null,117,[]],
-tg:[function(a,b){var z
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"call$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")},119,[]],
+ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
+tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.de(z.gl(),b))return!0
-return!1},"call$1","gdj",2,0,null,132,[]],
-aN:[function(a,b){var z
-for(z=this.gA(this);z.G();)b.call$1(z.gl())},"call$1","gjw",2,0,null,117,[]],
-zV:[function(a,b){var z,y,x
+return!1},
+aN:function(a,b){var z
+for(z=this.gA(this);z.G();)b.call$1(z.gl())},
+zV:function(a,b){var z,y,x
 z=this.gA(this)
 if(!z.G())return""
 y=P.p9("")
@@ -5987,35 +6035,37 @@
 else{y.KF(H.d(z.gl()))
 for(;z.G();){y.vM=y.vM+b
 x=H.d(z.gl())
-y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,337,338,[]],
-Vr:[function(a,b){var z
+y.vM=y.vM+x}}return y.vM},
+Vr:function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.call$1(z.gl())===!0)return!0
-return!1},"call$1","gGI",2,0,null,117,[]],
-tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,340,341,[]],
+return!1},
+tt:function(a,b){return P.F(this,b,H.ip(this,"mW",0))},
+br:function(a){return this.tt(a,!0)},
 gB:function(a){var z,y
 z=this.gA(this)
 for(y=0;z.G();)++y
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
-qZ:[function(a,b){return H.Dw(this,b,H.ip(this,"mW",0))},"call$1","gVw",2,0,null,198,[]],
-eR:[function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},"call$1","gZo",2,0,null,198,[]],
+qZ:function(a,b){return H.Dw(this,b,H.ip(this,"mW",0))},
+eR:function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},
 grZ:function(a){var z,y
 z=this.gA(this)
 if(!z.G())throw H.b(new P.lj("No elements"))
 do y=z.gl()
 while(z.G())
 return y},
-qA:[function(a,b,c){var z,y
+qA:function(a,b,c){var z,y
 for(z=this.gA(this);z.G();){y=z.gl()
-if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,407,[],452,[]],
-Zv:[function(a,b){var z,y,x,w
+if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},
+XG:function(a,b){return this.qA(a,b,null)},
+Zv:function(a,b){var z,y,x,w
 if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
 for(z=this.gA(this),y=b;z.G();){x=z.gl()
 w=J.x(y)
 if(w.n(y,0))return x
-y=w.W(y,1)}throw H.b(P.N(b))},"call$1","gRV",2,0,null,15,[]],
-bu:[function(a){return P.FO(this)},"call$0","gXo",0,0,null],
+y=w.W(y,1)}throw H.b(P.N(b))},
+bu:function(a){return P.FO(this)},
 $isQV:true,
 $asQV:null},
 ar:{
@@ -6028,18 +6078,18 @@
 lD:{
 "^":"a;",
 gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
-Zv:[function(a,b){return this.t(a,b)},"call$1","gRV",2,0,null,15,[]],
-aN:[function(a,b){var z,y
+Zv:function(a,b){return this.t(a,b)},
+aN:function(a,b){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.t(a,y))
-if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,406,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}},
 gl0:function(a){return J.de(this.gB(a),0)},
 gor:function(a){return!this.gl0(a)},
 grZ:function(a){if(J.de(this.gB(a),0))throw H.b(new P.lj("No elements"))
 return this.t(a,J.xH(this.gB(a),1))},
-tg:[function(a,b){var z,y,x,w
+tg:function(a,b){var z,y,x,w
 z=this.gB(a)
 y=J.x(z)
 x=0
@@ -6047,22 +6097,22 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 if(J.de(this.t(a,x),b))return!0
-if(!y.n(z,this.gB(a)))throw H.b(P.a4(a));++x}return!1},"call$1","gdj",2,0,null,132,[]],
-Vr:[function(a,b){var z,y
+if(!y.n(z,this.gB(a)))throw H.b(P.a4(a));++x}return!1},
+Vr:function(a,b){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.t(a,y))===!0)return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gGI",2,0,null,407,[]],
-zV:[function(a,b){var z
+if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
+zV:function(a,b){var z
 if(J.de(this.gB(a),0))return""
 z=P.p9("")
 z.We(a,b)
-return z.vM},"call$1","gNU",0,2,null,337,338,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,407,[]],
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
-eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,130,[]],
-tt:[function(a,b){var z,y,x
+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.A8(a,b),[null,null])},"call$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")},119,[]],
+eR:function(a,b){return H.q9(a,b,null,null)},
+tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
 C.Nm.sB(z,this.gB(a))}else{y=this.gB(a)
 if(typeof y!=="number")return H.s(y)
@@ -6074,30 +6124,31 @@
 if(!(x<y))break
 y=this.t(a,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,340,341,[]],
-h:[function(a,b){var z=this.gB(a)
+z[x]=y;++x}return z},
+br:function(a){return this.tt(a,!0)},
+h:function(a,b){var z=this.gB(a)
 this.sB(a,J.WB(z,1))
-this.u(a,z,b)},"call$1","ght",2,0,null,132,[]],
-FV:[function(a,b){var z,y,x
+this.u(a,z,b)},
+FV:function(a,b){var z,y,x
 for(z=J.GP(b);z.G();){y=z.gl()
 x=this.gB(a)
 this.sB(a,J.WB(x,1))
-this.u(a,x,y)}},"call$1","gDY",2,0,null,116,[]],
-Rz:[function(a,b){var z,y
+this.u(a,x,y)}},
+Rz:function(a,b){var z,y
 z=0
 while(!0){y=this.gB(a)
 if(typeof y!=="number")return H.s(y)
 if(!(z<y))break
 if(J.de(this.t(a,z),b)){this.YW(a,z,J.xH(this.gB(a),1),a,z+1)
 this.sB(a,J.xH(this.gB(a),1))
-return!0}++z}return!1},"call$1","guH",2,0,null,132,[]],
-V1:[function(a){this.sB(a,0)},"call$0","gRa",0,0,null],
-GT:[function(a,b){H.ZE(a,0,J.xH(this.gB(a),1),b)},"call$1","gH7",0,2,null,82,122,[]],
-pZ:[function(a,b,c){var z=J.Wx(b)
+return!0}++z}return!1},
+V1:function(a){this.sB(a,0)},
+GT:function(a,b){H.ZE(a,0,J.xH(this.gB(a),1),b)},
+pZ:function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
 z=J.Wx(c)
-if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},"call$2","gm0",4,0,null,123,[],124,[]],
-D6:[function(a,b,c){var z,y,x,w
+if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},
+D6:function(a,b,c){var z,y,x,w
 c=this.gB(a)
 this.pZ(a,b,c)
 z=J.xH(c,b)
@@ -6107,15 +6158,16 @@
 x=0
 for(;x<z;++x){w=this.t(a,b+x)
 if(x>=y.length)return H.e(y,x)
-y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
-Mu:[function(a,b,c){this.pZ(a,b,c)
-return H.q9(a,b,c,null)},"call$2","gYf",4,0,null,123,[],124,[]],
-UZ:[function(a,b,c){var z
+y[x]=w}return y},
+Jk:function(a,b){return this.D6(a,b,null)},
+Mu:function(a,b,c){this.pZ(a,b,c)
+return H.q9(a,b,c,null)},
+UZ:function(a,b,c){var z
 this.pZ(a,b,c)
 z=c-b
 this.YW(a,b,J.xH(this.gB(a),z),a,c)
-this.sB(a,J.xH(this.gB(a),z))},"call$2","gYH",4,0,null,123,[],124,[]],
-YW:[function(a,b,c,d,e){var z,y,x,w,v,u
+this.sB(a,J.xH(this.gB(a),z))},
+YW:function(a,b,c,d,e){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,this.gB(a)))H.vh(P.TE(b,0,this.gB(a)))
 z=J.Wx(c)
@@ -6133,8 +6185,9 @@
 if(x+y>v)throw H.b(new P.lj("Not enough elements"))
 if(typeof b!=="number")return H.s(b)
 if(x<b)for(u=y-1;u>=0;--u)this.u(a,b+u,z.t(w,x+u))
-else for(u=0;u<y;++u)this.u(a,b+u,z.t(w,x+u))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-XU:[function(a,b,c){var z,y
+else for(u=0;u<y;++u)this.u(a,b+u,z.t(w,x+u))},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+XU:function(a,b,c){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 if(c>=z)return-1
@@ -6143,20 +6196,22 @@
 while(!0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 if(!(y<z))break
-if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,339,132,[],85,[]],
-Pk:[function(a,b,c){var z,y
+if(J.de(this.t(a,y),b))return y;++y}return-1},
+u8:function(a,b){return this.XU(a,b,0)},
+Pk:function(a,b,c){var z,y
 c=J.xH(this.gB(a),1)
 for(z=c;y=J.Wx(z),y.F(z,0);z=y.W(z,1))if(J.de(this.t(a,z),b))return z
-return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],85,[]],
-xe:[function(a,b,c){var z=this.gB(a)
+return-1},
+cn:function(a,b){return this.Pk(a,b,null)},
+xe:function(a,b,c){var z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 z=b>z
 if(z)throw H.b(P.TE(b,0,this.gB(a)))
 if(b===this.gB(a)){this.h(a,c)
 return}this.sB(a,J.WB(this.gB(a),1))
 this.YW(a,b+1,this.gB(a),a,b)
-this.u(a,b,c)},"call$2","gJe",4,0,null,15,[],132,[]],
-oF:[function(a,b,c){var z,y
+this.u(a,b,c)},
+oF:function(a,b,c){var z,y
 if(b>=0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 z=b>z}else z=!0
@@ -6167,46 +6222,46 @@
 this.sB(a,J.WB(this.gB(a),y))
 if(typeof y!=="number")return H.s(y)
 this.YW(a,b+y,this.gB(a),a,b)
-this.Mh(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
-Mh:[function(a,b,c){var z,y
+this.Mh(a,b,c)},
+Mh:function(a,b,c){var z,y
 z=J.x(c)
 if(!!z.$isList){z=z.gB(c)
 if(typeof z!=="number")return H.s(z)
 this.zB(a,b,b+z,c)}else for(z=z.gA(c);z.G();b=y){y=b+1
-this.u(a,b,z.gl())}},"call$2","gpH",4,0,null,15,[],116,[]],
-bu:[function(a){var z
+this.u(a,b,z.gl())}},
+bu:function(a){var z
 if($.xb().tg(0,a))return"[...]"
 z=P.p9("")
 try{$.xb().h(0,a)
 z.KF("[")
 z.We(a,", ")
-z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},"call$0","gXo",0,0,null],
+z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},
 $isList:true,
 $askF:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
-ZQ:{
-"^":"Tp:355;a,b",
+LG:{
+"^":"Tp:293;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"call$2",null,4,0,null,453,[],275,[],"call"],
+z.KF(b)},"call$2",null,4,0,null,360,[],277,[],"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
 gA:function(a){var z=new P.o0(this,this.eZ,this.qT,this.av,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-aN:[function(a,b){var z,y,x
+aN:function(a,b){var z,y,x
 z=this.qT
 for(y=this.av;y!==this.eZ;y=(y+1&this.v5.length-1)>>>0){x=this.v5
 if(y<0||y>=x.length)return H.e(x,y)
 b.call$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,406,[]],
+if(z!==this.qT)H.vh(P.a4(this))}},
 gl0:function(a){return this.av===this.eZ},
 gB:function(a){return J.mQ(J.xH(this.eZ,this.av),this.v5.length-1)},
 grZ:function(a){var z,y
@@ -6217,7 +6272,7 @@
 y=J.mQ(J.xH(y,1),this.v5.length-1)
 if(y>=z.length)return H.e(z,y)
 return z[y]},
-Zv:[function(a,b){var z,y,x
+Zv:function(a,b){var z,y,x
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,this.gB(this)))throw H.b(P.TE(b,0,this.gB(this)))
 z=this.v5
@@ -6226,15 +6281,16 @@
 x=z.length
 y=(y+b&x-1)>>>0
 if(y<0||y>=x)return H.e(z,y)
-return z[y]},"call$1","gRV",2,0,null,15,[]],
-tt:[function(a,b){var z,y
+return z[y]},
+tt:function(a,b){var z,y
 if(b){z=H.VM([],[H.Kp(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
 z=H.VM(y,[H.Kp(this,0)])}this.wR(z)
-return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,340,341,[]],
-h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,132,[]],
-FV:[function(a,b){var z,y,x,w,v,u,t,s,r
+return z},
+br:function(a){return this.tt(a,!0)},
+h:function(a,b){this.NZ(0,b)},
+FV:function(a,b){var z,y,x,w,v,u,t,s,r
 z=J.x(b)
 if(!!z.$isList){y=z.gB(b)
 x=this.gB(this)
@@ -6259,22 +6315,22 @@
 H.qG(w,z,z+s,b,0)
 z=this.v5
 H.qG(z,0,r,b,s)
-this.eZ=r}}this.qT=this.qT+1}else for(z=z.gA(b);z.G();)this.NZ(0,z.gl())},"call$1","gDY",2,0,null,454,[]],
-Rz:[function(a,b){var z,y
+this.eZ=r}}this.qT=this.qT+1}else for(z=z.gA(b);z.G();)this.NZ(0,z.gl())},
+Rz:function(a,b){var z,y
 for(z=this.av;z!==this.eZ;z=(z+1&this.v5.length-1)>>>0){y=this.v5
 if(z<0||z>=y.length)return H.e(y,z)
 if(J.de(y[z],b)){this.bB(z)
 this.qT=this.qT+1
-return!0}}return!1},"call$1","guH",2,0,null,6,[]],
-V1:[function(a){var z,y,x,w,v
+return!0}}return!1},
+V1:function(a){var z,y,x,w,v
 z=this.av
 y=this.eZ
 if(z!==y){for(x=this.v5,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
 x[z]=null}this.eZ=0
 this.av=0
-this.qT=this.qT+1}},"call$0","gRa",0,0,null],
-bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
-NZ:[function(a,b){var z,y
+this.qT=this.qT+1}},
+bu:function(a){return H.mx(this,"{","}")},
+NZ:function(a,b){var z,y
 z=this.v5
 y=this.eZ
 if(y>>>0!==y||y>=z.length)return H.e(z,y)
@@ -6282,8 +6338,8 @@
 y=(y+1&this.v5.length-1)>>>0
 this.eZ=y
 if(this.av===y)this.VW()
-this.qT=this.qT+1},"call$1","gXk",2,0,null,132,[]],
-bB:[function(a){var z,y,x,w,v,u,t,s
+this.qT=this.qT+1},
+bB:function(a){var z,y,x,w,v,u,t,s
 z=this.v5.length-1
 if((a-this.av&z)>>>0<J.mQ(J.xH(this.eZ,a),z)){for(y=this.av,x=this.v5,w=x.length,v=a;v!==y;v=u){u=(v-1&z)>>>0
 if(u<0||u>=w)return H.e(x,u)
@@ -6300,8 +6356,8 @@
 if(v<0||v>=w)return H.e(x,v)
 x[v]=t}if(y>=w)return H.e(x,y)
 x[y]=null
-return a}},"call$1","gzv",2,0,null,455,[]],
-VW:[function(){var z,y,x,w
+return a}},
+VW:function(){var z,y,x,w
 z=Array(this.v5.length*2)
 z.fixed$length=init
 y=H.VM(z,[H.Kp(this,0)])
@@ -6314,8 +6370,8 @@
 H.qG(y,w,w+z,x,0)
 this.av=0
 this.eZ=this.v5.length
-this.v5=y},"call$0","gJm",0,0,null],
-wR:[function(a){var z,y,x,w
+this.v5=y},
+wR:function(a){var z,y,x,w
 z=this.av
 y=this.eZ
 if(typeof y!=="number")return H.s(y)
@@ -6330,7 +6386,7 @@
 if(typeof z!=="number")return H.s(z)
 y=this.v5
 H.qG(a,w,w+z,y,0)
-return J.WB(this.eZ,w)}},"call$1","gLR",2,0,null,79,[]],
+return J.WB(this.eZ,w)}},
 Eo:function(a,b){var z=Array(8)
 z.fixed$length=init
 this.v5=H.VM(z,[b])},
@@ -6343,11 +6399,11 @@
 if(typeof a!=="number")return a.O()
 a=(a<<2>>>0)-1
 for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}},"call$1","bD",2,0,null,191,[]]}},
+if(z===0)return a}},"call$1","bD",2,0,null,193,[]]}},
 o0:{
 "^":"a;Lz,pP,qT,Dc,fD",
 gl:function(){return this.fD},
-G:[function(){var z,y,x
+G:function(){var z,y,x
 z=this.Lz
 if(this.qT!==z.qT)H.vh(P.a4(z))
 y=this.Dc
@@ -6357,17 +6413,16 @@
 if(y>=x)return H.e(z,y)
 this.fD=z[y]
 this.Dc=(y+1&x-1)>>>0
-return!0},"call$0","gqy",0,0,null]},
+return!0}},
 qv:{
 "^":"a;G3>,Bb>,T8>",
 $isqv:true},
 jp:{
 "^":"qv;P*,G3,Bb,T8",
-r6:function(a,b){return this.P.call$1(b)},
 $asqv:function(a,b){return[a]}},
 GZ:{
 "^":"a;",
-vh:[function(a){var z,y,x,w,v,u,t,s
+vh:function(a){var z,y,x,w,v,u,t,s
 z=this.aY
 if(z==null)return-1
 y=this.iW
@@ -6401,11 +6456,11 @@
 y.T8=null
 y.Bb=null
 this.bb=this.bb+1
-return v},"call$1","gST",2,0,null,48,[]],
-Xu:[function(a){var z,y
+return v},
+Xu:function(a){var z,y
 for(z=a;y=z.T8,y!=null;z=y){z.T8=y.Bb
-y.Bb=z}return z},"call$1","gug",2,0,null,263,[]],
-bB:[function(a){var z,y,x
+y.Bb=z}return z},
+bB:function(a){var z,y,x
 if(this.aY==null)return
 if(!J.de(this.vh(a),0))return
 z=this.aY
@@ -6416,8 +6471,8 @@
 y=this.Xu(y)
 this.aY=y
 y.T8=x}this.qT=this.qT+1
-return z},"call$1","gzv",2,0,null,48,[]],
-fS:[function(a,b){var z,y
+return z},
+fS:function(a,b){var z,y
 this.P6=this.P6+1
 this.qT=this.qT+1
 if(this.aY==null){this.aY=a
@@ -6427,97 +6482,97 @@
 a.T8=y.T8
 y.T8=null}else{a.T8=y
 a.Bb=y.Bb
-y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,263,[],456,[]]},
-Ba:{
+y.Bb=null}this.aY=a}},
+Nb:{
 "^":"GZ;Cw,ac,aY,iW,P6,qT,bb",
 wS:function(a,b){return this.Cw.call$2(a,b)},
 Ef:function(a){return this.ac.call$1(a)},
-yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,457,[],458,[]],
-t:[function(a,b){if(b==null)throw H.b(new P.AT(b))
+yV:function(a,b){return this.wS(a,b)},
+t:function(a,b){if(b==null)throw H.b(new P.AT(b))
 if(this.Ef(b)!==!0)return
 if(this.aY!=null)if(J.de(this.vh(b),0))return this.aY.P
-return},"call$1","gIA",2,0,null,48,[]],
-Rz:[function(a,b){var z
+return},
+Rz:function(a,b){var z
 if(this.Ef(b)!==!0)return
 z=this.bB(b)
 if(z!=null)return z.P
-return},"call$1","guH",2,0,null,48,[]],
-u:[function(a,b,c){var z
+return},
+u:function(a,b,c){var z
 if(b==null)throw H.b(new P.AT(b))
 z=this.vh(b)
 if(J.de(z,0)){this.aY.P=c
-return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,48,[],30,[]],
-FV:[function(a,b){J.kH(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
+return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},
+FV:function(a,b){J.kH(b,new P.bF(this))},
 gl0:function(a){return this.aY==null},
 gor:function(a){return this.aY!=null},
-aN:[function(a,b){var z,y,x
+aN:function(a,b){var z,y,x
 z=H.Kp(this,0)
 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.call$2(z.gG3(x),z.gP(x))}},"call$1","gjw",2,0,null,117,[]],
+b.call$2(z.gG3(x),z.gP(x))}},
 gB:function(a){return this.P6},
-V1:[function(a){this.aY=null
+V1:function(a){this.aY=null
 this.P6=0
-this.qT=this.qT+1},"call$0","gRa",0,0,null],
-x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,48,[]],
-di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,30,[]],
-gvc:function(a){return H.VM(new P.OG(this),[H.Kp(this,0)])},
+this.qT=this.qT+1},
+x4:function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},
+di:function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},
+gvc:function(){return H.VM(new P.OG(this),[H.Kp(this,0)])},
 gUQ:function(a){var z=new P.uM(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
-$isBa:true,
+bu:function(a){return P.vW(this)},
+$isNb:true,
 $asGZ:function(a,b){return[a]},
 $asZ0:null,
 $isZ0:true,
 static:{GV:function(a,b,c,d){var z,y
 z=P.n4()
 y=new P.An(c)
-return H.VM(new P.Ba(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
+return H.VM(new P.Nb(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,275,[],"call"],
+return z},"call$1",null,2,0,null,277,[],"call"],
 $isEH:true},
 bF:{
 "^":"Tp;a",
 call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
+$signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Nb")}},
 BW:{
-"^":"Tp:459;a,b,c",
+"^":"Tp:361;a,b,c",
 call$1:[function(a){var z,y,x,w
 for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
 w=a.T8
 if(w!=null&&this.call$1(w)===!0)return!0
-a=a.Bb}return!1},"call$1",null,2,0,null,263,[],"call"],
+a=a.Bb}return!1},"call$1",null,2,0,null,265,[],"call"],
 $isEH:true},
 S6B:{
 "^":"a;",
 gl:function(){var z=this.ya
 if(z==null)return
 return this.Wb(z)},
-p0:[function(a){var z
+zw:function(a){var z
 for(z=this.Jt;a!=null;){z.push(a)
-a=J.NI(a)}},"call$1","gBl",2,0,null,263,[]],
-G:[function(){var z,y,x
+a=J.NI(a)}},
+G:function(){var z,y,x
 z=this.Dn
 if(this.qT!==z.qT)throw H.b(P.a4(z))
 y=this.Jt
 if(y.length===0){this.ya=null
 return!1}if(z.bb!==this.bb&&this.ya!=null){x=this.ya
 C.Nm.sB(y,0)
-if(x==null)this.p0(z.aY)
+if(x==null)this.zw(z.aY)
 else{z.vh(J.WI(x))
-this.p0(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
+this.zw(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
 z=y.pop()
 this.ya=z
-this.p0(J.xP(z))
-return!0},"call$0","gqy",0,0,null],
-Qf:function(a,b){this.p0(a.aY)}},
+this.zw(J.xP(z))
+return!0},
+Qf:function(a,b){this.zw(a.aY)}},
 OG:{
 "^":"mW;Dn",
 gB:function(a){return this.Dn.P6},
@@ -6544,32 +6599,32 @@
 $isyN:true},
 DN:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return J.WI(a)},"call$1","gBL",2,0,null,263,[]]},
+Wb:function(a){return J.WI(a)}},
 ZM:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return J.Vm(a)},"call$1","gBL",2,0,null,263,[]],
+Wb:function(a){return J.Vm(a)},
 $asS6B:function(a,b){return[b]}},
 HW:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a},"call$1","gBL",2,0,null,263,[]],
+Wb:function(a){return a},
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
 VQ:[function(a,b){var z=new P.JC()
-return z.call$2(null,new P.f1(z).call$1(a))},"call$2","os",4,0,null,192,[],193,[]],
+return z.call$2(null,new P.f1(z).call$1(a))},"call$2","os",4,0,null,194,[],195,[]],
 BS:[function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(new P.AT(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H4",4,0,null,33,[],193,[]],
-tp:[function(a){return a.Lt()},"call$1","BC",2,0,194,6,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H4",4,0,null,33,[],195,[]],
+tp:[function(a){return a.Lt()},"call$1","BC",2,0,196,6,[]],
 JC:{
-"^":"Tp:355;",
+"^":"Tp:293;",
 call$2:[function(a,b){return b},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 f1:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$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
@@ -6590,76 +6645,107 @@
 $asUk:function(){return[J.O,[J.Q,J.im]]}},
 Ud:{
 "^":"Ge;Ct,FN",
-bu:[function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
-else return"Converting object did not return an encodable object."},"call$0","gXo",0,0,null],
+bu:function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
+else return"Converting object did not return an encodable object."},
 static:{NM:function(a,b){return new P.Ud(a,b)}}},
 K8:{
 "^":"Ud;Ct,FN",
-bu:[function(a){return"Cyclic error in JSON stringify"},"call$0","gXo",0,0,null],
+bu:function(a){return"Cyclic error in JSON stringify"},
 static:{TP:function(a){return new P.K8(a,null)}}},
 by:{
 "^":"Uk;N5,iY",
-c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,33,[],193,[]],
-Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,30,[],195,[]],
+pW:function(a,b){return P.BS(a,this.gHe().N5)},
+kV:function(a){return this.pW(a,null)},
+Co:function(a,b){return P.Ks(a,this.gZE().Xi)},
+KP:function(a){return this.Co(a,null)},
 gZE:function(){return C.nX},
 gHe:function(){return C.A3},
 $asUk:function(){return[P.a,J.O]}},
 dI:{
 "^":"zF;Xi",
 $aszF:function(){return[P.a,J.O]}},
-Cf:{
+pz:{
 "^":"zF;N5",
 $aszF:function(){return[J.O,P.a]}},
 Sh:{
 "^":"a;iY,Vy,S7",
 Wt:function(a){return this.iY.call$1(a)},
-aK:[function(a){var z,y,x,w,v,u,t
+aK:function(a){var z,y,x,w,v,u,t,s,r
 z=J.U6(a)
 y=z.gB(a)
-x=H.VM([],[J.im])
 if(typeof y!=="number")return H.s(y)
-w=!1
+x=this.Vy
+w=0
 v=0
 for(;v<y;++v){u=z.j(a,v)
-if(u<32){x.push(92)
-switch(u){case 8:x.push(98)
+if(u>92)continue
+if(u<32){if(v>w){t=z.Nj(a,w,v)
+x.vM=x.vM+t}w=v+1
+s=P.O8(1,92,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
+switch(u){case 8:s=P.O8(1,98,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
 break
-case 9:x.push(116)
+case 9:s=P.O8(1,116,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
 break
-case 10:x.push(110)
+case 10:s=P.O8(1,110,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
 break
-case 12:x.push(102)
+case 12:s=P.O8(1,102,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
 break
-case 13:x.push(114)
+case 13:s=P.O8(1,114,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
 break
-default:x.push(117)
-t=u>>>12&15
-x.push(t<10?48+t:87+t)
-t=u>>>8&15
-x.push(t<10?48+t:87+t)
+default:s=P.O8(1,117,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
+s=P.O8(1,48,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
+s=P.O8(1,48,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
 t=u>>>4&15
-x.push(t<10?48+t:87+t)
+t=t<10?48+t:87+t
+s=P.O8(1,t,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
 t=u&15
-x.push(t<10?48+t:87+t)
-break}w=!0}else if(u===34||u===92){x.push(92)
-x.push(u)
-w=!0}else x.push(u)}z=w?P.HM(x):a
-this.Vy.KF(z)},"call$1","gPz",2,0,null,91,[]],
-WD:[function(a){var z=this.S7
-if(z.tg(0,a))throw H.b(P.TP(a))
-z.h(0,a)},"call$1","gaS",2,0,null,6,[]],
-rl:[function(a){var z,y,x,w,v
-if(!this.IS(a)){x=a
-w=this.S7
-if(w.tg(0,x))H.vh(P.TP(x))
-w.h(0,x)
+t=t<10?48+t:87+t
+s=P.O8(1,t,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
+break}}else if(u===34||u===92){if(v>w){t=z.Nj(a,w,v)
+x.vM=x.vM+t}w=v+1
+s=P.O8(1,92,J.im)
+t=H.eT(s)
+x.vM=x.vM+t
+s=P.O8(1,u,J.im)
+t=H.eT(s)
+x.vM=x.vM+t}}if(w===0){r=typeof a==="string"?a:H.d(a)
+x.vM=x.vM+r}else if(w<y){z=z.Nj(a,w,y)
+x.vM=x.vM+z}},
+WD:function(a){var z,y,x,w
+for(z=this.S7,y=z.length,x=0;x<y;++x){w=z[x]
+if(a==null?w==null:a===w)throw H.b(P.TP(a))}z.push(a)},
+rl:function(a){var z,y,x,w
+if(!this.IS(a)){this.WD(a)
 try{z=this.Wt(a)
 if(!this.IS(z)){x=P.NM(a,null)
-throw H.b(x)}w.Rz(0,a)}catch(v){x=H.Ru(v)
+throw H.b(x)}x=this.S7
+if(0>=x.length)return H.e(x,0)
+x.pop()}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.NM(a,y))}}},"call$1","gO5",2,0,null,6,[]],
-IS:[function(a){var z,y,x,w
-z={}
+throw H.b(P.NM(a,y))}}},
+IS:function(a){var z,y,x,w,v,u
 if(typeof a==="number"){if(!C.CD.gx8(a))return!1
 this.Vy.KF(C.CD.bu(a))
 return!0}else if(a===!0){this.Vy.KF("true")
@@ -6669,61 +6755,54 @@
 z.KF("\"")
 this.aK(a)
 z.KF("\"")
-return!0}else{y=J.x(a)
-if(!!y.$isList){this.WD(a)
-z=this.Vy
-z.KF("[")
-if(J.z8(y.gB(a),0)){this.rl(y.t(a,0))
+return!0}else{z=J.x(a)
+if(!!z.$isList){this.WD(a)
+y=this.Vy
+y.KF("[")
+if(J.z8(z.gB(a),0)){this.rl(z.t(a,0))
 x=1
-while(!0){w=y.gB(a)
+while(!0){w=z.gB(a)
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
-z.vM=z.vM+","
-this.rl(y.t(a,x));++x}}z.KF("]")
-this.S7.Rz(0,a)
-return!0}else if(!!y.$isZ0){this.WD(a)
-w=this.Vy
-w.KF("{")
-z.a=!0
-y.aN(a,new P.tF(z,this))
-w.KF("}")
-this.S7.Rz(0,a)
-return!0}else return!1}},"call$1","gjQ",2,0,null,6,[]],
-static:{"^":"P3,Ib,FC,Yz,NoV,Jl,bz,eJ,Ho,ql,XI,PBv,QVv",Ks:[function(a,b){var z
+y.vM=y.vM+","
+this.rl(z.t(a,x));++x}}y.KF("]")
+this.Ei(a)
+return!0}else if(!!z.$isZ0){this.WD(a)
+y=this.Vy
+y.KF("{")
+for(w=J.GP(a.gvc()),v="\"";w.G();v=",\""){u=w.gl()
+y.vM=y.vM+v
+this.aK(u)
+y.vM=y.vM+"\":"
+this.rl(z.t(a,u))}y.KF("}")
+this.Ei(a)
+return!0}else return!1}},
+Ei:function(a){var z=this.S7
+if(0>=z.length)return H.e(z,0)
+z.pop()},
+static:{"^":"P3,Ib,FC,Yz,NoV,Jl,dH,bz,eJ,Ho,ql,XI,PBv,QVv",Ks:[function(a,b){var z
 b=P.BC()
 z=P.p9("")
-new P.Sh(b,z,P.yv(null)).rl(a)
-return z.vM},"call$2","nB",4,0,null,6,[],195,[]]}},
-tF:{
-"^":"Tp:460;a,b",
-call$2:[function(a,b){var z,y,x
-z=this.a
-y=this.b
-if(!z.a){x=y.Vy
-x.KF(",\"")}else{x=y.Vy
-x.KF("\"")}y.aK(a)
-x.KF("\":")
-y.rl(b)
-z.a=!1},"call$2",null,4,0,null,48,[],30,[],"call"],
-$isEH:true},
+new P.Sh(b,z,[]).rl(a)
+return z.vM},"call$2","nB",4,0,null,6,[],197,[]]}},
 z0:{
 "^":"ro;lH",
 goc:function(a){return"utf-8"},
 gZE:function(){return new P.om()}},
 om:{
 "^":"zF;",
-WJ:[function(a){var z,y,x
+WJ:function(a){var z,y,x
 z=J.U6(a)
 y=J.vX(z.gB(a),3)
 if(typeof y!=="number")return H.s(y)
 y=H.VM(Array(y),[J.im])
 x=new P.Rw(0,0,y)
 if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
-return C.Nm.D6(y,0,x.ZP)},"call$1","gj5",2,0,null,14,[]],
+return C.Nm.D6(y,0,x.ZP)},
 $aszF:function(){return[J.O,[J.Q,J.im]]}},
 Rw:{
 "^":"a;WF,ZP,EN",
-Lb:[function(a,b){var z,y,x,w,v
+Lb:function(a,b){var z,y,x,w,v
 z=this.EN
 y=this.ZP
 if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
@@ -6755,8 +6834,8 @@
 this.ZP=y+1
 if(y>=v)return H.e(z,y)
 z[y]=128|a&63
-return!1}},"call$2","gkL",4,0,null,461,[],462,[]],
-fJ:[function(a,b,c){var z,y,x,w,v,u,t,s
+return!1}},
+fJ:function(a,b,c){var z,y,x,w,v,u,t,s
 if(b!==c&&(J.lE(a,J.xH(c,1))&64512)===55296)c=J.xH(c,1)
 if(typeof c!=="number")return H.s(c)
 z=this.EN
@@ -6788,11 +6867,11 @@
 z[s]=128|v>>>6&63
 this.ZP=u+1
 if(u>=y)return H.e(z,u)
-z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,343,[],123,[],124,[]],
+z[u]=128|v&63}}return w},
 static:{"^":"n9"}}}],["dart.core","dart:core",,P,{
 "^":"",
 Te:[function(a){return},"call$1","Ex",2,0,null,50,[]],
-Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,196,131,[],187,[]],
+Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,198,133,[],189,[]],
 hl:[function(a){var z,y,x,w,v,u
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
@@ -6818,9 +6897,9 @@
 z.vM=y
 return y}return"Instance of '"+H.lh(a)+"'"},"call$1","Zx",2,0,null,6,[]],
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,199,131,[],187,[]],
-NS:[function(a){return H.CU(a)},"call$1","cE",2,0,200,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,33,[],34,[],163,[]],
+ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,201,133,[],189,[]],
+NS:[function(a){return H.CU(a)},"call$1","cE",2,0,202,6,[]],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,203,84,84,33,[],34,[],165,[]],
 O8:function(a,b,c){var z,y,x
 z=J.Qi(a,c)
 if(a!==0&&b!=null)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -6839,11 +6918,11 @@
 HM:function(a){return H.eT(a)},
 fc:function(a){return P.HM(P.O8(1,a,J.im))},
 HB:{
-"^":"Tp:355;a",
-call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],30,[],"call"],
+"^":"Tp:293;a",
+call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,138,[],30,[],"call"],
 $isEH:true},
 CL:{
-"^":"Tp:415;a",
+"^":"Tp:341;a",
 call$2:[function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
@@ -6853,21 +6932,21 @@
 $isEH:true},
 p4:{
 "^":"a;OF",
-bu:[function(a){return"Deprecated feature. Will be removed "+this.OF},"call$0","gXo",0,0,null]},
+bu:function(a){return"Deprecated feature. Will be removed "+this.OF}},
 a2:{
 "^":"a;",
-bu:[function(a){return this?"true":"false"},"call$0","gXo",0,0,null],
+bu:function(a){return this?"true":"false"},
 $isbool:true},
 Tx:{
 "^":"a;"},
 iP:{
 "^":"a;y3<,aL",
-n:[function(a,b){if(b==null)return!1
+n:function(a,b){if(b==null)return!1
 if(!J.x(b).$isiP)return!1
-return this.y3===b.y3&&this.aL===b.aL},"call$1","gUJ",2,0,null,109,[]],
-iM:[function(a,b){return C.CD.iM(this.y3,b.gy3())},"call$1","gYc",2,0,null,109,[]],
+return this.y3===b.y3&&this.aL===b.aL},
+iM:function(a,b){return C.CD.iM(this.y3,b.gy3())},
 giO:function(a){return this.y3},
-bu:[function(a){var z,y,x,w,v,u,t,s
+bu:function(a){var z,y,x,w,v,u,t,s
 z=this.aL
 y=P.Gq(z?H.o2(this).getUTCFullYear()+0:H.o2(this).getFullYear()+0)
 x=P.h0(z?H.o2(this).getUTCMonth()+1:H.o2(this).getMonth()+1)
@@ -6877,8 +6956,8 @@
 t=P.h0(z?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
 s=P.Vx(z?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0)
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
-else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"call$0","gXo",0,0,null],
-h:[function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},"call$1","ght",2,0,null,166,[]],
+else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},
+h:function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(new P.AT(a))},
 $isiP:true,
@@ -6916,7 +6995,7 @@
 if(typeof l!=="number")return H.s(l)
 s=J.xH(s,n*l)}k=!0}else k=!1
 j=H.zW(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"call$1","le",2,0,null,197,[]],Wu:function(a,b){var z=new P.iP(a,b)
+return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"call$1","le",2,0,null,199,[]],Wu:function(a,b){var z=new P.iP(a,b)
 z.RM(a,b)
 return z},Gq:[function(a){var z,y
 z=Math.abs(a)
@@ -6924,62 +7003,62 @@
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},"call$1","Cp",2,0,null,198,[]],Vx:[function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},"call$1","Cp",2,0,null,200,[]],Vx:[function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
-return"00"+a},"call$1","Dv",2,0,null,198,[]],h0:[function(a){if(a>=10)return""+a
-return"0"+a},"call$1","wI",2,0,null,198,[]]}},
+return"00"+a},"call$1","Dv",2,0,null,200,[]],h0:[function(a){if(a>=10)return""+a
+return"0"+a},"call$1","wI",2,0,null,200,[]]}},
 MF:{
-"^":"Tp:464;",
+"^":"Tp:363;",
 call$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"call$1",null,2,0,null,463,[],"call"],
+return H.BU(a,null,null)},"call$1",null,2,0,null,362,[],"call"],
 $isEH:true},
 Rq:{
-"^":"Tp:465;",
+"^":"Tp:364;",
 call$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"call$1",null,2,0,null,463,[],"call"],
+return H.IH(a,null)},"call$1",null,2,0,null,362,[],"call"],
 $isEH:true},
 a6:{
 "^":"a;Fq<",
-g:[function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},"call$1","gF1n",2,0,null,109,[]],
-W:[function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},"call$1","gTG",2,0,null,109,[]],
-U:[function(a,b){if(typeof b!=="number")return H.s(b)
-return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,466,[]],
-Z:[function(a,b){if(J.de(b,0))throw H.b(P.ts())
+g:function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},
+W:function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},
+U:function(a,b){if(typeof b!=="number")return H.s(b)
+return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},
+Z:function(a,b){if(J.de(b,0))throw H.b(P.ts())
 if(typeof b!=="number")return H.s(b)
-return P.k5(0,0,C.CD.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,467,[]],
-C:[function(a,b){return this.Fq<b.gFq()},"call$1","gix",2,0,null,109,[]],
-D:[function(a,b){return this.Fq>b.gFq()},"call$1","gh1",2,0,null,109,[]],
-E:[function(a,b){return this.Fq<=b.gFq()},"call$1","gER",2,0,null,109,[]],
-F:[function(a,b){return this.Fq>=b.gFq()},"call$1","gNH",2,0,null,109,[]],
+return P.k5(0,0,C.CD.Z(this.Fq,b),0,0,0)},
+C:function(a,b){return this.Fq<b.gFq()},
+D:function(a,b){return this.Fq>b.gFq()},
+E:function(a,b){return this.Fq<=b.gFq()},
+F:function(a,b){return this.Fq>=b.gFq()},
 gVs:function(){return C.CD.cU(this.Fq,1000)},
-n:[function(a,b){if(b==null)return!1
+n:function(a,b){if(b==null)return!1
 if(!J.x(b).$isa6)return!1
-return this.Fq===b.Fq},"call$1","gUJ",2,0,null,109,[]],
+return this.Fq===b.Fq},
 giO:function(a){return this.Fq&0x1FFFFFFF},
-iM:[function(a,b){return C.CD.iM(this.Fq,b.gFq())},"call$1","gYc",2,0,null,109,[]],
-bu:[function(a){var z,y,x,w,v
+iM:function(a,b){return C.CD.iM(this.Fq,b.gFq())},
+bu:function(a){var z,y,x,w,v
 z=new P.DW()
 y=this.Fq
 if(y<0)return"-"+H.d(P.k5(0,0,-y,0,0,0))
 x=z.call$1(C.CD.JV(C.CD.cU(y,60000000),60))
 w=z.call$1(C.CD.JV(C.CD.cU(y,1000000),60))
 v=new P.P7().call$1(C.CD.JV(y,1000000))
-return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},"call$0","gXo",0,0,null],
+return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
 $isa6:true,
-static:{"^":"Kl,S4d,pk,LoB,RD,b2,jS,ll,Do,f4,za,IJZ,iI,Vk,fm,rGr",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"Bk,S4d,pk,LoB,zj5,b2,jS,ll,Do,f4,za,IJZ,iI,Vk,fm,rGr",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Tp:424;",
+"^":"Tp:348;",
 call$1:[function(a){if(a>=100000)return H.d(a)
 if(a>=10000)return"0"+H.d(a)
 if(a>=1000)return"00"+H.d(a)
 if(a>=100)return"000"+H.d(a)
 if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},"call$1",null,2,0,null,198,[],"call"],
+return"00000"+H.d(a)},"call$1",null,2,0,null,200,[],"call"],
 $isEH:true},
 DW:{
-"^":"Tp:424;",
+"^":"Tp:348;",
 call$1:[function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},"call$1",null,2,0,null,198,[],"call"],
+return"0"+H.d(a)},"call$1",null,2,0,null,200,[],"call"],
 $isEH:true},
 Ge:{
 "^":"a;",
@@ -6987,23 +7066,23 @@
 $isGe:true},
 LK:{
 "^":"Ge;",
-bu:[function(a){return"Throw of null."},"call$0","gXo",0,0,null]},
+bu:function(a){return"Throw of null."}},
 AT:{
 "^":"Ge;G1>",
-bu:[function(a){var z=this.G1
+bu:function(a){var z=this.G1
 if(z!=null)return"Illegal argument(s): "+H.d(z)
-return"Illegal argument(s)"},"call$0","gXo",0,0,null],
+return"Illegal argument(s)"},
 static:{u:function(a){return new P.AT(a)}}},
 bJ:{
 "^":"AT;G1",
-bu:[function(a){return"RangeError: "+H.d(this.G1)},"call$0","gXo",0,0,null],
+bu:function(a){return"RangeError: "+H.d(this.G1)},
 static:{C3:function(a){return new P.bJ(a)},N:function(a){return new P.bJ("value "+H.d(a))},TE:function(a,b,c){return new P.bJ("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
 yd:{
 "^":"Ge;",
 static:{hS:function(){return new P.yd()}}},
 mp:{
 "^":"Ge;uF,UP,mP,SA,mZ",
-bu:[function(a){var z,y,x,w,v,u,t
+bu:function(a){var z,y,x,w,v,u,t
 z={}
 z.a=P.p9("")
 z.b=0
@@ -7015,70 +7094,70 @@
 t=typeof t==="string"?t:H.d(t)
 u.vM=u.vM+t}y=this.SA
 if(y!=null)y.aN(0,new P.CL(z))
-return"NoSuchMethodError : method not found: '"+H.d(this.UP)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+H.d(z.a)+"]"},"call$0","gXo",0,0,null],
+return"NoSuchMethodError : method not found: '"+H.d(this.UP)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+H.d(z.a)+"]"},
 $ismp:true,
 static:{lr:function(a,b,c,d,e){return new P.mp(a,b,c,d,e)}}},
 ub:{
 "^":"Ge;G1>",
-bu:[function(a){return"Unsupported operation: "+this.G1},"call$0","gXo",0,0,null],
+bu:function(a){return"Unsupported operation: "+this.G1},
 static:{f:function(a){return new P.ub(a)}}},
 ds:{
 "^":"Ge;G1>",
-bu:[function(a){var z=this.G1
-return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},"call$0","gXo",0,0,null],
+bu:function(a){var z=this.G1
+return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},
 $isGe:true,
 static:{SY:function(a){return new P.ds(a)}}},
 lj:{
 "^":"Ge;G1>",
-bu:[function(a){return"Bad state: "+this.G1},"call$0","gXo",0,0,null],
+bu:function(a){return"Bad state: "+this.G1},
 static:{w:function(a){return new P.lj(a)}}},
 UV:{
 "^":"Ge;YA",
-bu:[function(a){var z=this.YA
+bu:function(a){var z=this.YA
 if(z==null)return"Concurrent modification during iteration."
-return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"call$0","gXo",0,0,null],
+return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},
 static:{a4:function(a){return new P.UV(a)}}},
 TO:{
 "^":"a;",
-bu:[function(a){return"Out of Memory"},"call$0","gXo",0,0,null],
+bu:function(a){return"Out of Memory"},
 gI4:function(){return},
 $isGe:true},
 VS:{
 "^":"a;",
-bu:[function(a){return"Stack Overflow"},"call$0","gXo",0,0,null],
+bu:function(a){return"Stack Overflow"},
 gI4:function(){return},
 $isGe:true},
 t7:{
 "^":"Ge;Wo",
-bu:[function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},"call$0","gXo",0,0,null],
+bu:function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},
 static:{Gz:function(a){return new P.t7(a)}}},
 HG:{
 "^":"a;G1>",
-bu:[function(a){var z=this.G1
+bu:function(a){var z=this.G1
 if(z==null)return"Exception"
-return"Exception: "+H.d(z)},"call$0","gXo",0,0,null]},
+return"Exception: "+H.d(z)}},
 aE:{
 "^":"a;G1>",
-bu:[function(a){return"FormatException: "+H.d(this.G1)},"call$0","gXo",0,0,null],
+bu:function(a){return"FormatException: "+H.d(this.G1)},
 static:{cD:function(a){return new P.aE(a)}}},
 eV:{
 "^":"a;",
-bu:[function(a){return"IntegerDivisionByZeroException"},"call$0","gXo",0,0,null],
+bu:function(a){return"IntegerDivisionByZeroException"},
 static:{ts:function(){return new P.eV()}}},
 kM:{
 "^":"a;oc>",
-bu:[function(a){return"Expando:"+H.d(this.oc)},"call$0","gXo",0,0,null],
-t:[function(a,b){var z=H.of(b,"expando$values")
-return z==null?null:H.of(z,this.Qz())},"call$1","gIA",2,0,null,6,[]],
-u:[function(a,b,c){var z=H.of(b,"expando$values")
+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.Qz())},
+u:function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],30,[]],
-Qz:[function(){var z,y
+H.aw(b,"expando$values",z)}H.aw(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.aw(this,"expando$key",z)}return z},"call$0","gwT",0,0,null],
+H.aw(this,"expando$key",z)}return z},
 static:{"^":"bZT,rly,Ss"}},
 EH:{
 "^":"a;",
@@ -7094,13 +7173,13 @@
 $isZ0:true},
 L9:{
 "^":"a;",
-bu:[function(a){return"null"},"call$0","gXo",0,0,null]},
+bu:function(a){return"null"}},
 a:{
 "^":";",
-n:[function(a,b){return this===b},"call$1","gUJ",2,0,null,109,[]],
+n:function(a,b){return this===b},
 giO:function(a){return H.eQ(this)},
-bu:[function(a){return H.a5(this)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,336,[]],
+bu:function(a){return H.a5(this)},
+T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
 gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
@@ -7111,7 +7190,7 @@
 WU:{
 "^":"a;Qk,SU,Oq,Wn",
 gl:function(){return this.Wn},
-G:[function(){var z,y,x,w,v,u
+G:function(){var z,y,x,w,v,u
 z=this.Oq
 this.SU=z
 y=this.Qk
@@ -7127,15 +7206,15 @@
 this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
 return!0}}this.Oq=v
 this.Wn=w
-return!0},"call$0","gqy",0,0,null]},
+return!0}},
 Rn:{
 "^":"a;vM<",
 gB:function(a){return this.vM.length},
 gl0:function(a){return this.vM.length===0},
 gor:function(a){return this.vM.length!==0},
-KF:[function(a){var z=typeof a==="string"?a:H.d(a)
-this.vM=this.vM+z},"call$1","gMG",2,0,null,98,[]],
-We:[function(a,b){var z,y
+KF:function(a){var z=typeof a==="string"?a:H.d(a)
+this.vM=this.vM+z},
+We:function(a,b){var z,y
 z=J.GP(a)
 if(!z.G())return
 if(b.length===0)do{y=z.gl()
@@ -7145,9 +7224,9 @@
 for(;z.G();){this.vM=this.vM+b
 y=z.gl()
 y=typeof y==="string"?y:H.d(y)
-this.vM=this.vM+y}}},"call$2","gCA",2,2,null,337,451,[],338,[]],
-V1:[function(a){this.vM=""},"call$0","gRa",0,0,null],
-bu:[function(a){return this.vM},"call$0","gXo",0,0,null],
+this.vM=this.vM+y}}},
+V1:function(a){this.vM=""},
+bu:function(a){return this.vM},
 PD:function(a){if(typeof a==="string")this.vM=a
 else this.KF(a)},
 static:{p9:function(a){var z=new P.Rn("")
@@ -7173,18 +7252,18 @@
 if(z==="http")return 80
 if(z==="https")return 443}return this.HC},
 Ja:function(a,b){return this.tP.call$1(b)},
-x6:[function(a,b){var z,y
+x6:function(a,b){var z,y
 z=a==null
 if(z&&!0)return""
 z=!z
 if(z);y=z?P.Xc(a):C.jN.ez(b,new P.Kd()).zV(0,"/")
 if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
-return y},"call$2","gbQ",4,0,null,264,[],468,[]],
-Ky:[function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},"call$2","gAj",4,0,null,469,[],470,[]],
-uo:[function(a){if(a.length>0&&J.lE(a,0)===58)return!0
-return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,264,[]],
-SK:[function(a){var z,y,x,w,v
+return y},
+Ky:function(a,b){if(a==="")return"/"+H.d(b)
+return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
+uo:function(a){if(a.length>0&&J.lE(a,0)===58)return!0
+return J.UU(a,"/.")!==-1},
+SK:function(a){var z,y,x,w,v
 if(!this.uo(a))return a
 z=[]
 for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=!1;y.G();){w=y.lo
@@ -7196,13 +7275,13 @@
 z.pop()}x=!0}else if("."===w)x=!0
 else{z.push(w)
 x=!1}}if(x)z.push("")
-return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,264,[]],
-tb:[function(a){var z=this.ku
+return C.Nm.zV(z,"/")},
+tb:function(a){var z=this.ku
 if(""!==z){a.KF(z)
 a.KF("@")}a.KF(this.NN)
 if(!J.de(this.HC,0)){a.KF(":")
-a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,471,[]],
-bu:[function(a){var z,y
+a.KF(J.AG(this.HC))}},
+bu:function(a){var z,y
 z=P.p9("")
 y=this.Fi
 if(""!==y){z.KF(y)
@@ -7212,8 +7291,8 @@
 if(""!==y){z.KF("?")
 z.KF(y)}y=this.Ka
 if(""!==y){z.KF("#")
-z.KF(y)}return z.vM},"call$0","gXo",0,0,null],
-n:[function(a,b){var z,y
+z.KF(y)}return z.vM},
+n:function(a,b){var z,y
 if(b==null)return!1
 z=J.x(b)
 if(!z.$isiD)return!1
@@ -7223,7 +7302,7 @@
 else z=!1
 else z=!1
 else z=!1
-return z},"call$1","gUJ",2,0,null,109,[]],
+return z},
 giO:function(a){var z=new P.XZ()
 return z.call$2(this.Fi,z.call$2(this.ku,z.call$2(this.gJf(this),z.call$2(this.gtp(this),z.call$2(this.r0,z.call$2(this.tP,z.call$2(this.Ka,1)))))))},
 n3:function(a,b,c,d,e,f,g,h,i){if(h==="http"&&J.de(e,80))this.HC=0
@@ -7231,7 +7310,7 @@
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"y2,q7,tv,v5,vI,SF,fd,IL,dH,zk,yt,fC,O5,lf,qf,ML,j3,Pk,R1,qs,lL,WT,t2,H5,zst,eK,ws,Sp,aJ,JA7,wo,SQU,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+static:{"^":"y2,q7,tv,v5,vI,SF,fd,IL,hO,zk,yt,fC,O5,lf,qf,ML,j3,Pk,R1,qs,lL,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,wo,SQU,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
 x=new P.hP()
 w=new P.Uo(a1)
 v=J.U6(a1)
@@ -7288,7 +7367,7 @@
 a=x.C(k,i)?v.Nj(a1,x.g(k,1),i):""
 x=J.Wx(i)
 a0=x.C(i,u)?v.Nj(a1,x.g(i,1),u):""
-return P.R6(a0,c,b,null,z,a,null,g,e)},"call$1","rp",2,0,null,202,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
+return P.R6(a0,c,b,null,z,a,null,g,e)},"call$1","rp",2,0,null,204,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
 z=new P.iD(P.L7(b),null,null,z,i,P.LE(f,g),P.UJ(a),null,null)
 z.n3(a,b,c,d,e,f,g,h,i)
 return z},L7:[function(a){var z,y
@@ -7298,7 +7377,7 @@
 P.eg(C.xB.Nj(a,1,z))
 return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(new P.bJ("value "+y))
 if(a.charCodeAt(y)===58){P.eg(a)
-return"["+a+"]"}}return a},"call$1","jC",2,0,null,203,[]],iy:[function(a){var z,y,x,w,v,u
+return"["+a+"]"}}return a},"call$1","jC",2,0,null,205,[]],iy:[function(a){var z,y,x,w,v,u
 z=new P.hb()
 if(a==null)return""
 y=a.length
@@ -7312,7 +7391,7 @@
 if(u>=8)return H.e(C.mK,u)
 u=J.mQ(C.mK[u],C.jn.W4(1,v&15))!==0}else u=!1
 if(u);else throw H.b(new P.AT("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},"call$1","Um",2,0,null,204,[]],LE:[function(a,b){var z,y,x
+x=!1}}return x?a:a.toLowerCase()},"call$1","Um",2,0,null,206,[]],LE:[function(a,b){var z,y,x
 z={}
 y=a==null
 if(y&&!0)return""
@@ -7321,7 +7400,7 @@
 x=P.p9("")
 z.a=!0
 C.jN.aN(b,new P.yZ(z,x))
-return x.vM},"call$2","wF",4,0,null,205,[],206,[]],UJ:[function(a){return P.Xc(a)},"call$1","p7",2,0,null,207,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+return x.vM},"call$2","wF",4,0,null,207,[],208,[]],UJ:[function(a){return P.Xc(a)},"call$1","p7",2,0,null,209,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z={}
 y=J.U6(a).u8(a,"%")
 z.a=y
@@ -7366,11 +7445,11 @@
 r=l}else{z.a=t
 r=t}}if(z.b==null)return a
 if(z.c!==r)s.call$0()
-return J.AG(z.b)},"call$1","Sy",2,0,null,208,[]],q5:[function(a){var z,y
+return J.AG(z.b)},"call$1","Sy",2,0,null,210,[]],q5:[function(a){var z,y
 z=new P.Mx()
 y=a.split(".")
 if(y.length!==4)z.call$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"call$1","cf",2,0,null,203,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"call$1","cf",2,0,null,205,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=new P.kZ()
 y=new P.JT(a,z)
 if(J.q8(a)<2)z.call$1("address is too short")
@@ -7409,7 +7488,7 @@
 z.call$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.call$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.call$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.kV(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"call$1","q3",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+return P.F(s,!0,H.ip(s,"mW",0))},"call$1","q3",2,0,null,205,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -7425,35 +7504,35 @@
 y.vM=y.vM+u}else{s=P.O8(1,37,J.im)
 u=H.eT(s)
 y.vM=y.vM+u
-z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,209,210,211,[],212,[],213,[],214,[]]}},
+z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,211,212,213,[],214,[],215,[],216,[]]}},
 hP:{
-"^":"Tp:473;",
+"^":"Tp:366;",
 call$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.aa,z)
 z=J.mQ(C.aa[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,472,[],"call"],
+return z},"call$1",null,2,0,null,365,[],"call"],
 $isEH:true},
 Uo:{
-"^":"Tp:474;a",
+"^":"Tp:367;a",
 call$1:[function(a){a=J.aK(this.a,"]",a)
 if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
 return a+1},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 hb:{
-"^":"Tp:473;",
+"^":"Tp:366;",
 call$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.HE,z)
 z=J.mQ(C.HE[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,472,[],"call"],
+return z},"call$1",null,2,0,null,365,[],"call"],
 $isEH:true},
 Kd:{
-"^":"Tp:112;",
-call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,93,[],"call"],
 $isEH:true},
 yZ:{
-"^":"Tp:355;a,b",
+"^":"Tp:293;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -7464,26 +7543,26 @@
 z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 Gs:{
-"^":"Tp:473;",
+"^":"Tp:366;",
 call$1:[function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
-return z},"call$1",null,2,0,null,475,[],"call"],
+return z},"call$1",null,2,0,null,368,[],"call"],
 $isEH:true},
 pm:{
-"^":"Tp:473;",
-call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,475,[],"call"],
+"^":"Tp:366;",
+call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,368,[],"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:473;",
+"^":"Tp:366;",
 call$1:[function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.kg,z)
 z=J.mQ(C.kg[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,472,[],"call"],
+return z},"call$1",null,2,0,null,365,[],"call"],
 $isEH:true},
 wm:{
-"^":"Tp:474;b,c,d",
+"^":"Tp:367;b,c,d",
 call$1:[function(a){var z,y
 z=this.b
 y=C.xB.j(z,a)
@@ -7492,7 +7571,7 @@
 else return y},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 FB:{
-"^":"Tp:474;e",
+"^":"Tp:367;e",
 call$1:[function(a){var z,y,x,w
 for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
 if(48<=w&&w<=57)y=y*16+w-48
@@ -7501,7 +7580,7 @@
 else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 Lk:{
-"^":"Tp:114;a,f",
+"^":"Tp:116;a,f",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 y=z.b
@@ -7512,54 +7591,54 @@
 else y.KF(C.xB.Nj(w,x,v))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 XZ:{
-"^":"Tp:477;",
+"^":"Tp:370;",
 call$2:[function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"call$2",null,4,0,null,476,[],244,[],"call"],
+return b*31+z&1073741823},"call$2",null,4,0,null,369,[],246,[],"call"],
 $isEH:true},
 Mx:{
-"^":"Tp:181;",
+"^":"Tp:183;",
 call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 C9:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z,y
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.call$1("each part must be in the range of `0..255`")
-return z},"call$1",null,2,0,null,478,[],"call"],
+return z},"call$1",null,2,0,null,371,[],"call"],
 $isEH:true},
 kZ:{
-"^":"Tp:181;",
+"^":"Tp:183;",
 call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 JT:{
-"^":"Tp:479;a,b",
+"^":"Tp:372;a,b",
 call$2:[function(a,b){var z,y
 if(b-a>4)this.b.call$1("an IPv6 part can only contain a maximum of 4 hex digits")
 z=H.BU(C.xB.Nj(this.a,a,b),16,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.b.call$1("each part must be in the range of `0x0..0xFFFF`")
-return z},"call$2",null,4,0,null,123,[],124,[],"call"],
+return z},"call$2",null,4,0,null,125,[],126,[],"call"],
 $isEH:true},
 d9:{
-"^":"Tp:112;c",
+"^":"Tp:114;c",
 call$1:[function(a){var z=J.x(a)
 if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
 else return[z.m(a,8)&255,z.i(a,255)]},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rI:{
-"^":"Tp:355;",
+"^":"Tp:293;",
 call$2:[function(a,b){var z=J.Wx(a)
 b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,480,[],481,[],"call"],
+b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,373,[],374,[],"call"],
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"call$1","pq",2,0,215,21,[]],
-r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,99,[],216,[]],
-It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"call$3$onProgress$withCredentials","xF",2,5,null,82,82,217,[],218,[],219,[]],
+return"transitionend"},"call$1","pq",2,0,217,21,[]],
+r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,101,[],218,[]],
+It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"call$3$onProgress$withCredentials","xF",2,5,null,84,84,219,[],220,[],221,[]],
 lt:[function(a,b,c,d,e,f,g,h){var z,y,x
 z=W.zU
 y=H.VM(new P.Zf(P.Dt(z)),[z])
@@ -7570,18 +7649,18 @@
 z=C.MD.aM(x)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
-return y.MM},"call$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,82,82,82,82,82,82,82,217,[],220,[],218,[],221,[],222,[],223,[],224,[],219,[]],
+return y.MM},"call$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,84,84,84,84,84,84,84,219,[],222,[],220,[],223,[],224,[],225,[],226,[],221,[]],
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
 uC:[function(a){var z
 try{return!!J.x(a).$iscS}catch(z){H.Ru(z)
-return!1}},"call$1","pR",2,0,null,225,[]],
+return!1}},"call$1","pR",2,0,null,227,[]],
 C0:[function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"call$2","jx",4,0,null,226,[],30,[]],
+return a^a>>>6},"call$2","jx",4,0,null,228,[],30,[]],
 Pv:[function(a){if(a==null)return
-return W.P1(a)},"call$1","Ie",2,0,null,227,[]],
+return W.P1(a)},"call$1","Ie",2,0,null,229,[]],
 qc:[function(a){var z
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
@@ -7589,11 +7668,11 @@
 return}else return a},"call$1","Wq",2,0,null,21,[]],
 qr:[function(a){return a},"call$1","Ku",2,0,null,21,[]],
 Z9:[function(a){if(!!J.x(a).$isQF)return a
-return P.o7(a,!0)},"call$1","cj",2,0,null,96,[]],
-YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,228,[],7,[]],
-GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,47,[]],
-Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,47,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,229,47,[],12,[],230,[],231,[]],
+return P.o7(a,!0)},"call$1","cj",2,0,null,98,[]],
+YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,230,[],7,[]],
+GO:[function(a){return J.TD(a)},"call$1","V5",2,0,114,47,[]],
+Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,114,47,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,231,47,[],12,[],232,[],233,[]],
 wi:[function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Xr(d)
 if(z==null)throw H.b(new P.AT(d))
@@ -7632,15 +7711,15 @@
 Object.defineProperty(s, init.dispatchPropertyName, {value: r, enumerable: false, writable: true, configurable: true})
 q={prototype: s}
 if(!v)q.extends=e
-b.registerElement(c,q)},"call$5","uz",10,0,null,94,[],232,[],99,[],11,[],233,[]],
+b.registerElement(c,q)},"call$5","uz",10,0,null,96,[],234,[],101,[],11,[],235,[]],
 aF:[function(a){if(J.de($.X3,C.NU))return a
 if(a==null)return
-return $.X3.oj(a,!0)},"call$1","Rj",2,0,null,155,[]],
+return $.X3.oj(a,!0)},"call$1","Rj",2,0,null,157,[]],
 K2:[function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,155,[]],
+return $.X3.PT(a,!0)},"call$1","o6",2,0,null,157,[]],
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|GN|ir|uL|Ds|d1|pv|xI|Tg|Vfx|Jc|CN|Dsd|Be|tuj|i6|LP|lw|Vct|Ir|D13|rm|m8|WZq|jM|T5|AX|pva|mk|cda|pL|waa|jY|NG|V4|hx|V9|kKl|oO|V10|Kz|V11|qkb|V12|vj|LU|V13|KL|F1|V14|aQ|V15|Qa|V16|Ww|V17|tz|V18|fl|V19|Zt|V20|wM|V21|lI|XP|V22|JG|qe|knI|V23|fI|V24|HF|V25|nk|V26|ob|Nr|Uj|V27|xT|V28|uwf|I5|V29|en"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ao|xc|uL|Ds|d1|pv|xI|Tg|Vfx|Jc|CN|Dsd|Be|tuj|i6|LP|lw|Vct|Ir|D13|rm|Nr|Lt|UL|WZq|jM|qe|AX|pva|mk|cda|pL|waa|jY|NG|V4|hx|V9|kKl|oO|V10|fl|V11|qkb|V12|vj|LU|V13|KL|F1|V14|aQ|V15|Qa|V16|Ww|V17|tz|V18|Mv|V19|Zt|V20|wM|V21|lI|XP|V22|JG|V23|ov|rs|knI|V24|fI|V25|HF|V26|nk|V27|ob|Bc|Uj|V28|xT|V29|uwf|I5|V30|en"},
 zw:{
 "^":"Gv;",
 $isList:true,
@@ -7651,11 +7730,11 @@
 "%":"EntryArray"},
 Ps:{
 "^":"qE;N:target=,t5:type%,cC:hash%,Jf:host=,mH:href=",
-bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
+bu:function(a){return a.toString()},
 "%":"HTMLAnchorElement"},
 Ym:{
 "^":"qE;N:target=,cC:hash%,Jf:host=,mH:href=",
-bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
+bu:function(a){return a.toString()},
 "%":"HTMLAreaElement"},
 Xk:{
 "^":"qE;mH:href=,N:target=",
@@ -7673,7 +7752,6 @@
 "%":"HTMLBodyElement"},
 QW:{
 "^":"qE;MB:form=,oc:name%,t5:type%,P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLButtonElement"},
 Ny:{
 "^":"qE;fg:height%,R:width%",
@@ -7684,11 +7762,11 @@
 "%":";CanvasRenderingContext"},
 mj:{
 "^":"Oi;",
-A8:[function(a,b,c,d,e,f,g,h){var z
+A8:function(a,b,c,d,e,f,g,h){var z
 if(g!=null)z=!0
 else z=!1
 if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
-return}throw H.b(new P.AT("Incorrect number or type of arguments"))},"call$7","gFg",6,8,null,82,82,82,82,290,[],291,[],292,[],293,[],294,[],295,[],296,[]],
+return}throw H.b(new P.AT("Incorrect number or type of arguments"))},
 "%":"CanvasRenderingContext2D"},
 Zv:{
 "^":"KV;Rn:data=,B:length=",
@@ -7711,17 +7789,17 @@
 "%":"HTMLDataListElement"},
 QF:{
 "^":"KV;",
-JP:[function(a){return a.createDocumentFragment()},"call$0","gf8",0,0,null],
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,297,[]],
-ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,263,[],298,[]],
+JP:function(a){return a.createDocumentFragment()},
+Kb:function(a,b){return a.getElementById(b)},
+ek:function(a,b,c){return a.importNode(b,c)},
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,299,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,300,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,300,[]],
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+Ja:function(a,b){return a.querySelector(b)},
+pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 $isQF:true,
-"%":"Document|HTMLDocument|SVGDocument"},
+"%":"Document|HTMLDocument|XMLDocument"},
 Aj:{
 "^":"KV;",
 gwd:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.e7(a)),[null])
@@ -7732,11 +7810,11 @@
 x=J.w1(y)
 x.V1(y)
 x.FV(y,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,299,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,300,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,300,[]],
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+Ja:function(a,b){return a.querySelector(b)},
+pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 "%":";DocumentFragment"},
-rz:{
+rv:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
 Nh:{
@@ -7745,7 +7823,7 @@
 if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
 if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
 return z},
-bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
+bu:function(a){return a.toString()},
 $isNh:true,
 "%":"DOMException"},
 cv:{
@@ -7757,32 +7835,32 @@
 y=this.gwd(a)
 y.V1(0)
 y.FV(0,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,299,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,300,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,300,[]],
+Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+Ja:function(a,b){return a.querySelector(b)},
+pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 gDD:function(a){return new W.I4(a)},
 gwl:function(a){return P.T7(a.clientLeft,a.clientTop,a.clientWidth,a.clientHeight,null)},
 gD7:function(a){return P.T7(a.offsetLeft,a.offsetTop,a.offsetWidth,a.offsetHeight,null)},
-i4:[function(a){},"call$0","gQd",0,0,null],
-xo:[function(a){},"call$0","gbt",0,0,null],
-aC:[function(a,b,c,d){},"call$3","gxR",6,0,null,12,[],230,[],231,[]],
+i4:function(a){},
+xo:function(a){},
+aC:function(a,b,c,d){},
 gqn:function(a){return a.localName},
-bu:[function(a){return a.localName},"call$0","gXo",0,0,null],
-WO:[function(a,b){if(!!a.matches)return a.matches(b)
+bu:function(a){return a.localName},
+WO:function(a,b){if(!!a.matches)return a.matches(b)
 else if(!!a.webkitMatchesSelector)return a.webkitMatchesSelector(b)
 else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
 else if(!!a.msMatchesSelector)return a.msMatchesSelector(b)
 else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
-else throw H.b(P.f("Not supported on this platform"))},"call$1","geA",2,0,null,299,[]],
-bA:[function(a,b){var z=a
+else throw H.b(P.f("Not supported on this platform"))},
+bA:function(a,b){var z=a
 do{if(J.RF(z,b))return!0
 z=z.parentElement}while(z!=null)
-return!1},"call$1","gMn",2,0,null,299,[]],
-er:[function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},"call$0","gzd",0,0,null],
+return!1},
+er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
 gIW:function(a){return a.shadowRoot||a.webkitShadowRoot},
 gI:function(a){return new W.DM(a,a)},
-PN:[function(a,b){return a.getAttribute(b)},"call$1","gBy",2,0,null,12,[]],
-Zi:[function(a){return a.getBoundingClientRect()},"call$0","gfP",0,0,null],
+PN:function(a,b){return a.getAttribute(b)},
+Zi:function(a){return a.getBoundingClientRect()},
 gi9:function(a){return C.mt.f0(a)},
 gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
@@ -7800,14 +7878,14 @@
 ea:{
 "^":"Gv;It:_selector},Xt:bubbles=,t5:type=",
 gN:function(a){return W.qc(a.target)},
-aA:[function(a){return a.preventDefault()},"call$0","gnr",0,0,null],
+aA:function(a){return a.preventDefault()},
 $isea:true,
 "%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},
 D0:{
 "^":"Gv;",
 gI:function(a){return new W.Jn(a)},
-On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gtS",4,2,null,82,11,[],301,[],302,[]],
-Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],301,[],302,[]],
+On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
+Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
 $isD0:true,
 "%":";EventTarget"},
 as:{
@@ -7818,7 +7896,7 @@
 $ishH:true,
 "%":"File"},
 QU:{
-"^":"rz;tT:code=",
+"^":"rv;tT:code=",
 "%":"FileError"},
 Tq:{
 "^":"qE;B:length=,bP:method=,oc:name%,N:target=",
@@ -7826,16 +7904,16 @@
 xn:{
 "^":"Gb;",
 gB:function(a){return a.length},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
+return a[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
-Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","gRV",2,0,null,15,[]],
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
 $isList:true,
 $askF:function(){return[W.KV]},
 $isyN:true,
@@ -7846,8 +7924,9 @@
 zU:{
 "^":"wa;iC:responseText=,ys:status=",
 gn9:function(a){return W.Z9(a.response)},
-R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],303,[],304,[],305,[]],
-zY:[function(a,b){return a.send(b)},"call$1","gMT",0,2,null,82,236,[]],
+R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
+eo:function(a,b,c,d){return a.open(b,c,d)},
+zY:function(a,b){return a.send(b)},
 $iszU:true,
 "%":"XMLHttpRequest"},
 wa:{
@@ -7865,9 +7944,8 @@
 oo:function(a,b){return a.complete.call$1(b)},
 "%":"HTMLImageElement"},
 Mi:{
-"^":"qE;Tq:checked%,MB:form=,fg:height%,o6:list=,oc:name%,LA:src=,t5:type%,P:value%,R:width%",
+"^":"qE;Tq:checked%,MB:form=,fg:height%,oc:name%,LA:src=,t5:type%,P:value%,R:width%",
 RR:function(a,b){return a.accept.call$1(b)},
-r6:function(a,b){return a.value.call$1(b)},
 $isMi:true,
 $iscv:true,
 $isD0:true,
@@ -7878,7 +7956,6 @@
 "%":"HTMLKeygenElement"},
 wP:{
 "^":"qE;P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLLIElement"},
 eP:{
 "^":"qE;MB:form=",
@@ -7892,8 +7969,8 @@
 "%":"HTMLLinkElement"},
 cS:{
 "^":"Gv;cC:hash%,Jf:host=,mH:href=",
-VD:[function(a){return a.reload()},"call$0","gQU",0,0,null],
-bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
+VD:function(a){return a.reload()},
+bu:function(a){return a.toString()},
 $iscS:true,
 "%":"Location"},
 YI:{
@@ -7901,7 +7978,7 @@
 "%":"HTMLMapElement"},
 El:{
 "^":"qE;kc:error=,LA:src=",
-xW:[function(a){return a.load()},"call$0","gnB",0,0,null],
+xW:function(a){return a.load()},
 "%":"HTMLAudioElement;HTMLMediaElement"},
 zm:{
 "^":"Gv;tT:code=",
@@ -7928,22 +8005,22 @@
 "%":"HTMLMetaElement"},
 E9:{
 "^":"qE;P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLMeterElement"},
 Hw:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
 bn:{
 "^":"tH;",
-fZ:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gMT",2,2,null,82,236,[],306,[]],
+fZ:function(a,b,c){return a.send(b,c)},
+zY:function(a,b){return a.send(b)},
 "%":"MIDIOutput"},
 tH:{
 "^":"D0;jO:id=,oc:name=,t5:type=,Ye:version=",
 "%":"MIDIInput;MIDIPort"},
 Wp:{
 "^":"Mf;",
-nH:[function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
-return},"call$15","gEx",30,0,null,11,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[],314,[],315,[],316,[],317,[],318,[],319,[],320,[]],
+nH:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
+return},
 gwl:function(a){return H.VM(new P.hL(a.clientX,a.clientY),[null])},
 gD7:function(a){var z,y
 if(!!a.offsetX)return H.VM(new P.hL(a.offsetX,a.offsetY),[null])
@@ -7955,7 +8032,7 @@
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 H9:{
 "^":"Gv;",
-jh:[function(a,b,c,d,e,f,g,h,i){var z,y
+jh:function(a,b,c,d,e,f,g,h,i){var z,y
 z={}
 y=new W.Yg(z)
 y.call$2("childList",h)
@@ -7964,7 +8041,8 @@
 y.call$2("subtree",i)
 y.call$2("attributeOldValue",d)
 y.call$2("characterDataOldValue",g)
-a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],321,[],322,[],323,[],324,[],325,[],326,[],327,[]],
+a.observe(b,z)},
+yN:function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},
 "%":"MutationObserver|WebKitMutationObserver"},
 o4:{
 "^":"Gv;jL:oldValue=,N:target=,t5:type=",
@@ -7975,37 +8053,37 @@
 KV:{
 "^":"D0;p8:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,KV:parentNode=,a4:textContent%",
 gyT:function(a){return new W.e7(a)},
-wg:[function(a){var z=a.parentNode
-if(z!=null)z.removeChild(a)},"call$0","guH",0,0,null],
-Tk:[function(a,b){var z,y
+wg:function(a){var z=a.parentNode
+if(z!=null)z.removeChild(a)},
+Tk:function(a,b){var z,y
 try{z=a.parentNode
-J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,328,[]],
-aD:[function(a,b,c){var z,y,x
+J.ky(z,b,a)}catch(y){H.Ru(y)}return a},
+aD:function(a,b,c){var z,y,x
 z=J.x(b)
 if(!!z.$ise7){z=b.NL
 if(z===a)throw H.b(new P.AT(b))
-for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},"call$2","gZM",4,0,null,329,[],330,[]],
-bu:[function(a){var z=a.nodeValue
-return z==null?J.Gv.prototype.bu.call(this,a):z},"call$0","gXo",0,0,null],
-jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,331,[]],
-tg:[function(a,b){return a.contains(b)},"call$1","gdj",2,0,null,109,[]],
-mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gHc",4,0,null,331,[],330,[]],
-dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,331,[],332,[]],
+for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},
+bu:function(a){var z=a.nodeValue
+return z==null?J.Gv.prototype.bu.call(this,a):z},
+jx:function(a,b){return a.appendChild(b)},
+tg:function(a,b){return a.contains(b)},
+mK:function(a,b,c){return a.insertBefore(b,c)},
+dR:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
-"%":"DocumentType|Entity|Notation;Node"},
+"%":"DocumentType|Notation;Node"},
 yk:{
 "^":"ma;",
 gB:function(a){return a.length},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
+return a[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
-Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","gRV",2,0,null,15,[]],
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
 $isList:true,
 $askF:function(){return[W.KV]},
 $isyN:true,
@@ -8024,16 +8102,13 @@
 "%":"HTMLOptGroupElement"},
 Ql:{
 "^":"qE;MB:form=,vH:index=,ph:label%,P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 $isQl:true,
 "%":"HTMLOptionElement"},
 Xp:{
 "^":"qE;MB:form=,oc:name%,t5:type=,P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLOutputElement"},
-HD:{
+me:{
 "^":"qE;oc:name%,P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLParamElement"},
 jg:{
 "^":"Gv;tT:code=,G1:message=",
@@ -8043,10 +8118,9 @@
 "%":"ProcessingInstruction"},
 KR:{
 "^":"qE;P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLProgressElement"},
 kQ:{
-"^":"ea;",
+"^":"ea;ox:loaded=",
 $iskQ:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 LY:{
@@ -8058,7 +8132,6 @@
 "%":"HTMLScriptElement"},
 lp:{
 "^":"qE;MB:form=,B:length%,oc:name%,ig:selectedIndex%,t5:type=,P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 gbG:function(a){var z=W.vD(a.querySelectorAll("option"),null)
 z=z.ev(z,new W.Ou())
 return H.VM(new P.Yp(P.F(z,!0,H.ip(z,"mW",0))),[null])},
@@ -8066,7 +8139,7 @@
 "%":"HTMLSelectElement"},
 I0:{
 "^":"Aj;pQ:applyAuthorStyles=,Jf:host=",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,297,[]],
+Kb:function(a,b){return a.getElementById(b)},
 $isI0:true,
 "%":"ShadowRoot"},
 QR:{
@@ -8098,7 +8171,7 @@
 "%":"HTMLStyleElement"},
 Tb:{
 "^":"qE;",
-gWT:function(a){return H.VM(new W.Of(a.rows),[W.qp])},
+gWT:function(a){return H.VM(new W.uB(a.rows),[W.qp])},
 "%":"HTMLTableElement"},
 qp:{
 "^":"qE;",
@@ -8106,7 +8179,7 @@
 "%":"HTMLTableRowElement"},
 BT:{
 "^":"qE;",
-gWT:function(a){return H.VM(new W.Of(a.rows),[W.qp])},
+gWT:function(a){return H.VM(new W.uB(a.rows),[W.qp])},
 "%":"HTMLTableSectionElement"},
 yY:{
 "^":"qE;rz:content=",
@@ -8118,7 +8191,6 @@
 "%":"CDATASection|Text"},
 AE:{
 "^":"qE;MB:form=,oc:name%,WT:rows%,t5:type=,P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 $isAE:true,
 "%":"HTMLTextAreaElement"},
 R0:{
@@ -8143,8 +8215,8 @@
 if(W.uC(z)===!0)return z
 if(null==a._location_wrapper)a._location_wrapper=new W.Dk(z)
 return a._location_wrapper},
-oB:[function(a,b){return a.requestAnimationFrame(H.tR(b,1))},"call$1","gfl",2,0,null,155,[]],
-hr:[function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return
+oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
+hr:function(a){if(!!(a.requestAnimationFrame&&a.cancelAnimationFrame))return
   (function($this) {
    var vendors = ['ms', 'moz', 'webkit', 'o'];
    for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
@@ -8160,12 +8232,13 @@
       }, 16 /* 16ms ~= 60fps */);
    };
    $this.cancelAnimationFrame = function(id) { clearTimeout(id); }
-  })(a)},"call$0","gGO",0,0,null],
+  })(a)},
 geT:function(a){return W.Pv(a.parent)},
-cO:[function(a){return a.close()},"call$0","gJK",0,0,null],
-xc:[function(a,b,c,d){a.postMessage(P.bL(b),c)
-return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],333,[],334,[]],
-bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
+cO:function(a){return a.close()},
+xc:function(a,b,c,d){a.postMessage(P.bL(b),c)
+return},
+X6:function(a,b,c){return this.xc(a,b,c,null)},
+bu:function(a){return a.toString()},
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
@@ -8174,12 +8247,11 @@
 "%":"DOMWindow|Window"},
 Bn:{
 "^":"KV;oc:name=,P:value%",
-r6:function(a,b){return a.value.call$1(b)},
 "%":"Attr"},
 FR:{
 "^":"Gv;QG:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,R:width=",
-bu:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},"call$0","gXo",0,0,null],
-n:[function(a,b){var z,y,x
+bu:function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},
+n:function(a,b){var z,y,x
 if(b==null)return!1
 z=J.x(b)
 if(!z.$istn)return!1
@@ -8192,7 +8264,7 @@
 if(y==null?x==null:y===x){y=a.height
 z=z.gfg(b)
 z=y==null?z==null:y===z}else z=!1}else z=!1}else z=!1
-return z},"call$1","gUJ",2,0,null,109,[]],
+return z},
 giO:function(a){var z,y,x,w,v
 z=J.v1(a.left)
 y=J.v1(a.top)
@@ -8213,16 +8285,16 @@
 Cy:{
 "^":"ecX;",
 gB:function(a){return a.length},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
+return a[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
-Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","gRV",2,0,null,15,[]],
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
 $isList:true,
 $askF:function(){return[W.KV]},
 $isyN:true,
@@ -8233,16 +8305,16 @@
 c5:{
 "^":"w1p;",
 gB:function(a){return a.length},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
+return a[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
-Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","gRV",2,0,null,15,[]],
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
 $isList:true,
 $askF:function(){return[W.yg]},
 $isyN:true,
@@ -8253,16 +8325,16 @@
 LO:{
 "^":"kEI;",
 gB:function(a){return a.length},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
+return a[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
-Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","gRV",2,0,null,15,[]],
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
 $isList:true,
 $askF:function(){return[W.uj]},
 $isyN:true,
@@ -8272,35 +8344,36 @@
 "%":"SpeechRecognitionResultList"},
 VG:{
 "^":"ar;MW,vG",
-tg:[function(a,b){return J.kE(this.vG,b)},"call$1","gdj",2,0,null,132,[]],
+tg:function(a,b){return J.kE(this.vG,b)},
 gl0:function(a){return this.MW.firstElementChild==null},
 gB:function(a){return this.vG.length},
-t:[function(a,b){var z=this.vG
+t:function(a,b){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=this.vG
+return z[b]},
+u:function(a,b,c){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,15,[],30,[]],
+this.MW.replaceChild(c,z[b])},
 sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
-h:[function(a,b){this.MW.appendChild(b)
-return b},"call$1","ght",2,0,null,30,[]],
+h:function(a,b){this.MW.appendChild(b)
+return b},
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
-FV:[function(a,b){var z,y
-for(z=J.GP(!!J.x(b).$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-Rz:[function(a,b){return!1},"call$1","guH",2,0,null,6,[]],
-xe:[function(a,b,c){var z,y,x
+FV:function(a,b){var z,y
+for(z=J.GP(!!J.x(b).$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},
+GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
+YW:function(a,b,c,d,e){throw H.b(P.SY(null))},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+Rz:function(a,b){return!1},
+xe:function(a,b,c){var z,y,x
 if(b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
 z=this.vG
 y=z.length
 x=this.MW
 if(b===y)x.appendChild(c)
 else{if(b>=y)return H.e(z,b)
-x.insertBefore(c,z[b])}},"call$2","gJe",4,0,null,15,[],132,[]],
-Mh:[function(a,b,c){throw H.b(P.SY(null))},"call$2","gpH",4,0,null,15,[],116,[]],
-V1:[function(a){J.c9(this.MW,"")},"call$0","gRa",0,0,null],
+x.insertBefore(c,z[b])}},
+Mh:function(a,b,c){throw H.b(P.SY(null))},
+V1:function(a){J.c9(this.MW,"")},
 grZ:function(a){var z=this.MW.lastElementChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
@@ -8310,17 +8383,17 @@
 wz:{
 "^":"ar;Sn,Sc",
 gB:function(a){return this.Sn.length},
-t:[function(a,b){var z=this.Sn
+t:function(a,b){var z=this.Sn
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,15,[],30,[]],
+return z[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot modify list"))},
 sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
-GT:[function(a,b){throw H.b(P.f("Cannot sort list"))},"call$1","gH7",0,2,null,82,122,[]],
+GT:function(a,b){throw H.b(P.f("Cannot sort list"))},
 grZ:function(a){return C.t5.grZ(this.Sn)},
 gDD:function(a){return W.or(this.Sc)},
-gi9:function(a){return C.mt.vo(this)},
-gVl:function(a){return C.pi.vo(this)},
-gLm:function(a){return C.i3.vo(this)},
+gi9:function(a){return C.mt.Uh(this)},
+gVl:function(a){return C.pi.Uh(this)},
+gLm:function(a){return C.i3.Uh(this)},
 nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
 $isList:true,
@@ -8332,21 +8405,21 @@
 z.nJ(a,b)
 return z}}},
 B1:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 M5:{
 "^":"Gv;"},
 Jn:{
 "^":"a;WK<",
-t:[function(a,b){return H.VM(new W.RO(this.gWK(),b,!1),[null])},"call$1","gIA",2,0,null,11,[]]},
+t:function(a,b){return H.VM(new W.RO(this.gWK(),b,!1),[null])}},
 DM:{
 "^":"Jn;WK:YO<,WK",
-t:[function(a,b){var z,y
+t:function(a,b){var z,y
 z=$.Vp()
 y=J.rY(b)
-if(z.gvc(z).Fb.x4(y.hc(b)))if(P.F7()===!0)return H.VM(new W.eu(this.YO,z.t(0,y.hc(b)),!1),[null])
-return H.VM(new W.eu(this.YO,b,!1),[null])},"call$1","gIA",2,0,null,11,[]],
+if(z.gvc().Fb.x4(y.hc(b)))if(P.F7()===!0)return H.VM(new W.eu(this.YO,z.t(0,y.hc(b)),!1),[null])
+return H.VM(new W.eu(this.YO,b,!1),[null])},
 static:{"^":"fD"}},
 RAp:{
 "^":"Gv+lD;",
@@ -8363,15 +8436,15 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Kx:{
-"^":"Tp:112;",
-call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,482,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,375,[],"call"],
 $isEH:true},
 iO:{
-"^":"Tp:355;a",
-call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,483,[],30,[],"call"],
+"^":"Tp:293;a",
+call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,376,[],30,[],"call"],
 $isEH:true},
 bU:{
-"^":"Tp:112;b,c",
+"^":"Tp:114;b,c",
 call$1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -8383,7 +8456,7 @@
 y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Yg:{
-"^":"Tp:355;a",
+"^":"Tp:293;a",
 call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 e7:{
@@ -8391,42 +8464,43 @@
 grZ:function(a){var z=this.NL.lastChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
-h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
-FV:[function(a,b){var z,y,x,w
+h:function(a,b){this.NL.appendChild(b)},
+FV:function(a,b){var z,y,x,w
 z=J.x(b)
 if(!!z.$ise7){z=b.NL
 y=this.NL
 if(z!==y)for(x=z.childNodes.length,w=0;w<x;++w)y.appendChild(z.firstChild)
-return}for(z=z.gA(b),y=this.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
-xe:[function(a,b,c){var z,y,x
+return}for(z=z.gA(b),y=this.NL;z.G();)y.appendChild(z.gl())},
+xe:function(a,b,c){var z,y,x
 if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
 z=this.NL
 y=z.childNodes
 x=y.length
 if(b===x)z.appendChild(c)
 else{if(b>=x)return H.e(y,b)
-z.insertBefore(c,y[b])}},"call$2","gJe",4,0,null,15,[],263,[]],
-oF:[function(a,b,c){var z,y
+z.insertBefore(c,y[b])}},
+oF:function(a,b,c){var z,y
 z=this.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
-Mh:[function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},"call$2","gpH",4,0,null,15,[],116,[]],
-Rz:[function(a,b){return!1},"call$1","guH",2,0,null,6,[]],
-V1:[function(a){J.c9(this.NL,"")},"call$0","gRa",0,0,null],
-u:[function(a,b,c){var z,y
+J.qD(z,c,y[b])},
+Mh:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
+Rz:function(a,b){return!1},
+V1:function(a){J.c9(this.NL,"")},
+u:function(a,b,c){var z,y
 z=this.NL
 y=z.childNodes
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
-z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,15,[],30,[]],
+z.replaceChild(c,y[b])},
 gA:function(a){return C.t5.gA(this.NL.childNodes)},
-GT:[function(a,b){throw H.b(P.f("Cannot sort Node list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
+GT:function(a,b){throw H.b(P.f("Cannot sort Node list"))},
+YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 gB:function(a){return this.NL.childNodes.length},
 sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
-t:[function(a,b){var z=this.NL.childNodes
+t:function(a,b){var z=this.NL.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,15,[]],
+return z[b]},
 $ise7:true,
 $asar:function(){return[W.KV]},
 $askF:function(){return[W.KV]},
@@ -8446,7 +8520,7 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Ou:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){return!!J.x(a).$isQl},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 yoo:{
@@ -8493,15 +8567,15 @@
 $asQV:function(){return[W.uj]}},
 tJ:{
 "^":"a;",
-FV:[function(a,b){J.kH(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
-di:[function(a){var z
-for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,30,[]],
-V1:[function(a){var z
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},"call$0","gRa",0,0,null],
-aN:[function(a,b){var z,y
-for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-b.call$2(y,this.t(0,y))}},"call$1","gjw",2,0,null,117,[]],
-gvc:function(a){var z,y,x,w
+FV:function(a,b){J.kH(b,new W.Zc(this))},
+di:function(a){var z
+for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},
+V1:function(a){var z
+for(z=this.gvc(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},
+aN:function(a,b){var z,y
+for(z=this.gvc(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+b.call$2(y,this.t(0,y))}},
+gvc:function(){var z,y,x,w
 z=this.MW.attributes
 y=H.VM([],[J.O])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
@@ -8518,210 +8592,224 @@
 $isZ0:true,
 $asZ0:function(){return[J.O,J.O]}},
 Zc:{
-"^":"Tp:355;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,453,[],275,[],"call"],
+"^":"Tp:293;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,360,[],277,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
-x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,48,[]],
-t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,48,[]],
-u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
-Rz:[function(a,b){var z,y
+x4:function(a){return this.MW.hasAttribute(a)},
+t:function(a,b){return this.MW.getAttribute(b)},
+u:function(a,b,c){this.MW.setAttribute(b,c)},
+Rz:function(a,b){var z,y
 z=this.MW
 y=z.getAttribute(b)
 z.removeAttribute(b)
-return y},"call$1","guH",2,0,null,48,[]],
-gB:function(a){return this.gvc(this).length},
-FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,263,[]]},
+return y},
+gB:function(a){return this.gvc().length},
+FJ:function(a){return a.namespaceURI==null}},
 nF:{
 "^":"As;QX,Kd",
-lF:[function(){var z=P.Ls(null,null,null,J.O)
+lF:function(){var z=P.Ls(null,null,null,J.O)
 this.Kd.aN(0,new W.Si(z))
-return z},"call$0","gt8",0,0,null],
-p5:[function(a){var z,y
+return z},
+p5:function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.QX,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},"call$1","gpJ",2,0,null,91,[]],
-OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,117,[]],
-O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],484,[]],
-Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,30,[]],
-xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,117,[]],
+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))},
+O4:function(a,b){return this.xz(new W.Iw(a,b))},
+qU:function(a){return this.O4(a,null)},
+Rz:function(a,b){return this.xz(new W.Fc(b))},
+xz:function(a){return this.Kd.es(0,!1,new W.hD(a))},
 yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.QX,!0,null),new W.FK()),[null,null])},
 static:{or:function(a){var z=new W.nF(a,null)
 z.yJ(a)
 return z}}},
 FK:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Si:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 vf:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Iw:{
-"^":"Tp:112;a,b",
+"^":"Tp:114;a,b",
 call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Fc:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 hD:{
-"^":"Tp:355;a",
-call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,485,[],132,[],"call"],
+"^":"Tp:293;a",
+call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,377,[],134,[],"call"],
 $isEH:true},
 I4:{
 "^":"As;MW",
-lF:[function(){var z,y,x
+lF:function(){var z,y,x
 z=P.Ls(null,null,null,J.O)
 for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
-if(x.length!==0)z.h(0,x)}return z},"call$0","gt8",0,0,null],
-p5:[function(a){P.F(a,!0,null)
-J.Pw(this.MW,a.zV(0," "))},"call$1","gpJ",2,0,null,91,[]]},
+if(x.length!==0)z.h(0,x)}return z},
+p5:function(a){P.F(a,!0,null)
+J.Pw(this.MW,a.zV(0," "))}},
 UC:{
 "^":"a;Ph",
-zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],302,[]],
-Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gVX",2,3,null,210,21,[],302,[]],
-jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,21,[],302,[]]},
+zc:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
+aM:function(a){return this.zc(a,!1)},
+Qm:function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},
+f0:function(a){return this.Qm(a,!1)},
+jl:function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},
+Uh:function(a){return this.jl(a,!1)}},
 RO:{
 "^":"qh;uv,Ph,Sg",
-KR:[function(a,b,c,d){var z=new W.Ov(0,this.uv,this.Ph,W.aF(a),this.Sg)
+KR:function(a,b,c,d){var z=new W.Ov(0,this.uv,this.Ph,W.aF(a),this.Sg)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.Zz()
-return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gdH",2,7,null,82,82,82,438,[],163,[],439,[],433,[]]},
+return z},
+zC:function(a,b,c){return this.KR(a,null,b,c)},
+yI:function(a){return this.KR(a,null,null,null)}},
 eu:{
 "^":"RO;uv,Ph,Sg",
-WO:[function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","geA",2,0,null,486,[]],
+WO:function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"qh",0)])
+return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},
 $isqh:true},
 ie:{
-"^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,376,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,309,[],"call"],
 $isEH:true},
 Ea:{
-"^":"Tp:112;b",
+"^":"Tp:114;b",
 call$1:[function(a){J.og(a,this.b)
 return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 pu:{
 "^":"qh;DI,Sg,Ph",
-WO:[function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","geA",2,0,null,486,[]],
-KR:[function(a,b,c,d){var z,y,x,w,v
+WO:function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"qh",0)])
+return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},
+KR:function(a,b,c,d){var z,y,x,w,v
 z=H.VM(new W.qO(null,P.L5(null,null,null,[P.qh,null],[P.MO,null])),[null])
 z.KS(null)
 for(y=this.DI,y=y.gA(y),x=this.Ph,w=this.Sg;y.G();){v=new W.RO(y.lo,x,w)
 v.$builtinTypeInfo=[null]
 z.h(0,v)}y=z.aV
 y.toString
-return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gdH",2,7,null,82,82,82,438,[],163,[],439,[],433,[]],
+return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},
+zC:function(a,b,c){return this.KR(a,null,b,c)},
+yI:function(a){return this.KR(a,null,null,null)},
 $isqh:true},
 i2:{
-"^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,376,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,309,[],"call"],
 $isEH:true},
 b0:{
-"^":"Tp:112;b",
+"^":"Tp:114;b",
 call$1:[function(a){J.og(a,this.b)
 return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Ov:{
 "^":"MO;VP,uv,Ph,u7,Sg",
-ed:[function(){if(this.uv==null)return
+ed:function(){if(this.uv==null)return
 this.Ns()
 this.uv=null
 this.u7=null
-return},"call$0","gZS",0,0,null],
-Fv:[function(a,b){if(this.uv==null)return
+return},
+TJ:function(a,b){if(this.uv==null)return
 this.VP=this.VP+1
-this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,436,[]],
+this.Ns()},
+yy:function(a){return this.TJ(a,null)},
 gRW:function(){return this.VP>0},
-QE:[function(a){if(this.uv==null||this.VP<=0)return
+QE:function(a){if(this.uv==null||this.VP<=0)return
 this.VP=this.VP-1
-this.Zz()},"call$0","gDQ",0,0,null],
-Zz:[function(){var z=this.u7
-if(z!=null&&this.VP<=0)J.cZ(this.uv,this.Ph,z,this.Sg)},"call$0","gBZ",0,0,null],
-Ns:[function(){var z=this.u7
-if(z!=null)J.GJ(this.uv,this.Ph,z,this.Sg)},"call$0","gEv",0,0,null]},
+this.Zz()},
+Zz:function(){var z=this.u7
+if(z!=null&&this.VP<=0)J.cZ(this.uv,this.Ph,z,this.Sg)},
+Ns:function(){var z=this.u7
+if(z!=null)J.GJ(this.uv,this.Ph,z,this.Sg)}},
 qO:{
 "^":"a;aV,eM",
-h:[function(a,b){var z,y
+h:function(a,b){var z,y
 z=this.eM
 if(z.x4(b))return
 y=this.aV
-z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},"call$1","ght",2,0,null,487,[]],
-Rz:[function(a,b){var z=this.eM.Rz(0,b)
-if(z!=null)z.ed()},"call$1","guH",2,0,null,487,[]],
+z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},
+Rz:function(a,b){var z=this.eM.Rz(0,b)
+if(z!=null)z.ed()},
 cO:[function(a){var z,y
 for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.aV.cO(0)},"call$0","gJK",0,0,114],
+this.aV.cO(0)},"call$0","gJK",0,0,116],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
 RX:{
-"^":"Tp:115;a,b",
+"^":"Tp:117;a,b",
 call$0:[function(){return this.a.Rz(0,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 bO:{
-"^":"a;De",
-cN:function(a){return this.De.call$1(a)},
-zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],302,[]]},
+"^":"a;xY",
+cN:function(a){return this.xY.call$1(a)},
+zc:function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},
+aM:function(a){return this.zc(a,!1)}},
 Gm:{
 "^":"a;",
 gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.ip(a,"Gm",0)])},
-h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,30,[]],
-FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,116,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,82,122,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gJe",4,0,null,15,[],132,[]],
-oF:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gFD",4,0,null,15,[],116,[]],
-Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},"call$2","gpH",4,0,null,15,[],116,[]],
-Rz:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","guH",2,0,null,6,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-UZ:[function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},"call$2","gYH",4,0,null,123,[],124,[]],
+h:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
+FV:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
+GT:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
+xe:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+oF:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+Mh:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
+Rz:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
+YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+UZ:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
 $isList:true,
 $askF:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
-Of:{
+uB:{
 "^":"ar;xa",
 gA:function(a){return H.VM(new W.Qg(J.GP(this.xa)),[null])},
 gB:function(a){return this.xa.length},
-h:[function(a,b){J.bi(this.xa,b)},"call$1","ght",2,0,null,132,[]],
-Rz:[function(a,b){return J.V1(this.xa,b)},"call$1","guH",2,0,null,132,[]],
-V1:[function(a){J.U2(this.xa)},"call$0","gRa",0,0,null],
-t:[function(a,b){var z=this.xa
+h:function(a,b){J.bi(this.xa,b)},
+Rz:function(a,b){return J.V1(this.xa,b)},
+V1:function(a){J.U2(this.xa)},
+t:function(a,b){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=this.xa
+return z[b]},
+u:function(a,b,c){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
+z[b]=c},
 sB:function(a,b){J.KM(this.xa,b)},
-GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,339,132,[],123,[]],
-Pk:[function(a,b,c){return J.ff(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
-xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gJe",4,0,null,15,[],132,[]],
-YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-UZ:[function(a,b,c){J.Y8(this.xa,b,c)},"call$2","gYH",4,0,null,123,[],124,[]]},
+GT:function(a,b){J.LH(this.xa,b)},
+XU:function(a,b,c){return J.aK(this.xa,b,c)},
+u8:function(a,b){return this.XU(a,b,0)},
+Pk:function(a,b,c){return J.ff(this.xa,b,c)},
+cn:function(a,b){return this.Pk(a,b,null)},
+xe:function(a,b,c){return J.BM(this.xa,b,c)},
+YW:function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+UZ:function(a,b,c){J.Y8(this.xa,b,c)}},
 Qg:{
 "^":"a;je",
-G:[function(){return this.je.G()},"call$0","gqy",0,0,null],
+G:function(){return this.je.G()},
 gl:function(){return this.je.QZ}},
 W9:{
 "^":"a;nj,vN,Nq,QZ",
-G:[function(){var z,y
+G:function(){var z,y
 z=this.Nq+1
 y=this.vN
 if(z<y){this.QZ=J.UQ(this.nj,z)
 this.Nq=z
 return!0}this.QZ=null
 this.Nq=y
-return!1},"call$0","gqy",0,0,null],
+return!1},
 gl:function(){return this.QZ}},
 vZ:{
-"^":"Tp:112;a,b",
+"^":"Tp:114;a,b",
 call$1:[function(a){var z=H.Va(this.b)
 Object.defineProperty(a, init.dispatchPropertyName, {value: z, enumerable: false, writable: true, configurable: true})
 a.constructor=a.__proto__.constructor
@@ -8730,22 +8818,23 @@
 dW:{
 "^":"a;Ui",
 geT:function(a){return W.P1(this.Ui.parent)},
-cO:[function(a){return this.Ui.close()},"call$0","gJK",0,0,null],
-xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],333,[],334,[]],
+cO:function(a){return this.Ui.close()},
+xc:function(a,b,c,d){this.Ui.postMessage(b,c)},
+X6:function(a,b,c){return this.xc(a,b,c,null)},
 gI:function(a){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-On:[function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},"call$3","gtS",4,2,null,82,11,[],301,[],302,[]],
-Y9:[function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},"call$3","gcF",4,2,null,82,11,[],301,[],302,[]],
+On:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
+Y9:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 $isD0:true,
 static:{P1:[function(a){if(a===window)return a
-else return new W.dW(a)},"call$1","lG",2,0,null,234,[]]}},
+else return new W.dW(a)},"call$1","lG",2,0,null,236,[]]}},
 Dk:{
 "^":"a;WK",
 gcC:function(a){return this.WK.hash},
 scC:function(a,b){this.WK.hash=b},
 gJf:function(a){return this.WK.host},
 gmH:function(a){return this.WK.href},
-VD:[function(a){return this.WK.reload()},"call$0","gQU",0,0,null],
-bu:[function(a){return this.WK.toString()},"call$0","gXo",0,0,null],
+VD:function(a){return this.WK.reload()},
+bu:function(a){return this.WK.toString()},
 $iscS:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
 "^":"",
 hF:{
@@ -8760,58 +8849,58 @@
 "^":"Eo;mH:href=",
 "%":"SVGAltGlyphElement"},
 eG:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEBlendElement"},
 lv:{
-"^":"d5;t5:type=,UQ:values=,fg:height=,R:width=,x=,y=",
+"^":"d5;t5:type=,UQ:values=,fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
 pf:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
 NV:{
-"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
+"^":"d5;kp:operator=,fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFECompositeElement"},
 nm:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
 mCz:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEDiffuseLightingElement"},
 kK:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEDisplacementMapElement"},
 bb:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEFloodElement"},
 Ob:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
-me:{
-"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
+TM:{
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=,mH:href=",
 "%":"SVGFEImageElement"},
 oB:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEMergeElement"},
 EI:{
-"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
+"^":"d5;kp:operator=,fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEMorphologyElement"},
 MI8:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFEOffsetElement"},
 ca:{
 "^":"d5;x=,y=",
 "%":"SVGFEPointLightElement"},
 um:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
 eW:{
 "^":"d5;x=,y=",
 "%":"SVGFESpotLightElement"},
 kL:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFETileElement"},
 Fu:{
-"^":"d5;t5:type=,fg:height=,R:width=,x=,y=",
+"^":"d5;t5:type=,fg:height=,yG:result=,R:width=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 QN:{
 "^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
@@ -8831,7 +8920,7 @@
 Yd:{
 "^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGMaskElement"},
-Gr:{
+Ac:{
 "^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
 MU:{
@@ -8856,10 +8945,10 @@
 gLm:function(a){return C.i3.f0(a)},
 gE8:function(a){return C.W2.f0(a)},
 $isD0:true,
-"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement"},
+"%":"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"},
 hy:{
 "^":"zp;fg:height=,R:width=,x=,y=",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,297,[]],
+Kb:function(a,b){return a.getElementById(b)},
 $ishy:true,
 "%":"SVGSVGElement"},
 mHq:{
@@ -8874,20 +8963,20 @@
 pyk:{
 "^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGUseElement"},
-wD:{
+GN:{
 "^":"d5;mH:href=",
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
 O7:{
 "^":"As;LO",
-lF:[function(){var z,y,x,w
+lF:function(){var z,y,x,w
 z=this.LO.getAttribute("class")
 y=P.Ls(null,null,null,J.O)
 if(z==null)return y
 for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
-if(w.length!==0)y.h(0,w)}return y},"call$0","gt8",0,0,null],
-p5:[function(a){this.LO.setAttribute("class",a.zV(0," "))},"call$1","gpJ",2,0,null,91,[]]}}],["dart.dom.web_sql","dart:web_sql",,P,{
+if(w.length!==0)y.h(0,w)}return y},
+p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
 "^":"",
-TM:{
+Cf:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
 "^":"",
@@ -8896,16 +8985,16 @@
 $ishq:true,
 static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-xZ:[function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.R4, a, b)},"call$2$captureThis","oo",2,3,null,210,117,[],235,[]],
+xZ:[function(a,b){return function(_call, f, captureThis) {return function() {return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));}}(P.R4, a, b)},"call$2$captureThis","oo",2,3,null,212,119,[],237,[]],
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.Ek(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"call$4","qH",8,0,null,155,[],235,[],168,[],87,[]],
+d=z}return P.wY(H.Ek(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"call$4","qH",8,0,null,157,[],237,[],170,[],89,[]],
 Dm:[function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a, b, { value: c})
-return!0}catch(z){H.Ru(z)}return!1},"call$3","Iy",6,0,null,96,[],12,[],30,[]],
+return!0}catch(z){H.Ru(z)}return!1},"call$3","Iy",6,0,null,98,[],12,[],30,[]],
 Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},"call$2","Cb",4,0,null,96,[],12,[]],
+return},"call$2","Cb",4,0,null,98,[],12,[]],
 wY:[function(a){var z
 if(a==null)return
 else{if(typeof a!=="string")if(typeof a!=="number")if(typeof a!=="boolean"){z=J.x(a)
@@ -8917,10 +9006,10 @@
 if(!!z.$isiP)return H.o2(a)
 else if(!!z.$isE4)return a.eh
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}}},"call$1","En",2,0,112,96,[]],
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}}},"call$1","En",2,0,114,98,[]],
 hE:[function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.call$1(a)
-P.Dm(a,b,z)}return z},"call$3","dw",6,0,null,96,[],68,[],237,[]],
+P.Dm(a,b,z)}return z},"call$3","dw",6,0,null,98,[],68,[],239,[]],
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
 else{if(a instanceof Object){z=J.x(a)
@@ -8928,31 +9017,32 @@
 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)}},"call$1","Xl",2,0,194,96,[]],
+else return P.ND(a)}},"call$1","Xl",2,0,196,98,[]],
 ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),new P.QS())},"call$1","ln",2,0,null,96,[]],
+else return P.iQ(a,$.Iq(),new P.QS())},"call$1","ln",2,0,null,98,[]],
 iQ:[function(a,b,c){var z=P.Om(a,b)
 if(z==null||!(a instanceof Object)){z=c.call$1(a)
-P.Dm(a,b,z)}return z},"call$3","yF",6,0,null,96,[],68,[],237,[]],
+P.Dm(a,b,z)}return z},"call$3","yF",6,0,null,98,[],68,[],239,[]],
 E4:{
 "^":"a;eh",
-t:[function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
-return P.dU(this.eh[b])},"call$1","gIA",2,0,null,71,[]],
-u:[function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
-this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],30,[]],
+t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
+return P.dU(this.eh[b])},
+u:function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
+this.eh[b]=P.wY(c)},
 giO:function(a){return 0},
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
-Bm:[function(a){return a in this.eh},"call$1","gVOe",2,0,null,71,[]],
-bu:[function(a){var z,y
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isE4&&this.eh===b.eh},
+Bm:function(a){return a in this.eh},
+bu:function(a){var z,y
 try{z=String(this.eh)
 return z}catch(y){H.Ru(y)
-return P.a.prototype.bu.call(this,this)}},"call$0","gXo",0,0,null],
-V7:[function(a,b){var z,y
+return P.a.prototype.bu.call(this,this)}},
+V7:function(a,b){var z,y
 z=this.eh
 y=b==null?null:P.F(J.kl(b,P.En()),!0,null)
-return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],19,[]],
+return P.dU(z[a].apply(z,y))},
+nQ:function(a){return this.V7(a,null)},
 $isE4:true,
 static:{zV:function(a,b){var z,y,x
 z=P.wY(a)
@@ -8961,53 +9051,53 @@
 C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).call$1(a)},"call$1","Ij",2,0,null,236,[]]}},
+return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).call$1(a)},"call$1","Ij",2,0,null,238,[]]}},
 Gn:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
 y=J.x(a)
 if(!!y.$isZ0){x={}
 z.u(0,a,x)
-for(z=J.GP(y.gvc(a));z.G();){w=z.gl()
+for(z=J.GP(a.gvc());z.G();){w=z.gl()
 x[w]=this.call$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
 z.u(0,a,v)
 C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"call$1",null,2,0,null,96,[],"call"],
+return v}else return P.wY(a)},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true},
 r7:{
 "^":"E4;eh"},
 Tz:{
 "^":"Wk;eh",
-Lu:[function(a,b){var z=J.Wx(a)
+Lu:function(a,b){var z=J.Wx(a)
 if(z.C(a,0)||z.D(a,P.E4.prototype.t.call(this,this,"length")))throw H.b(P.TE(a,0,P.E4.prototype.t.call(this,this,"length")))
 z=J.Wx(b)
-if(z.C(b,a)||z.D(b,P.E4.prototype.t.call(this,this,"length")))throw H.b(P.TE(b,a,P.E4.prototype.t.call(this,this,"length")))},"call$2","goA",4,0,null,123,[],124,[]],
-t:[function(a,b){var z
+if(z.C(b,a)||z.D(b,P.E4.prototype.t.call(this,this,"length")))throw H.b(P.TE(b,a,P.E4.prototype.t.call(this,this,"length")))},
+t:function(a,b){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},
+u:function(a,b,c){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,15,[],30,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},
 gB:function(a){return P.E4.prototype.t.call(this,this,"length")},
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
-h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,30,[]],
-FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,116,[]],
-xe:[function(a,b,c){var z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
+h:function(a,b){this.V7("push",[b])},
+FV:function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},
+xe:function(a,b,c){var z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
 if(typeof z!=="number")return H.s(z)
 z=b>=z
 if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
-this.V7("splice",[b,0,c])},"call$2","gJe",4,0,null,15,[],132,[]],
-UZ:[function(a,b,c){this.Lu(b,c)
-this.V7("splice",[b,c-b])},"call$2","gYH",4,0,null,123,[],124,[]],
-YW:[function(a,b,c,d,e){var z,y,x
+this.V7("splice",[b,0,c])},
+UZ:function(a,b,c){this.Lu(b,c)
+this.V7("splice",[b,c-b])},
+YW:function(a,b,c,d,e){var z,y,x
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,P.E4.prototype.t.call(this,this,"length")))H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
 z=J.Wx(c)
@@ -9017,8 +9107,9 @@
 if(e<0)throw H.b(new P.AT(e))
 x=[b,y]
 C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
-this.V7("splice",x)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,82,122,[]]},
+this.V7("splice",x)},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+GT:function(a,b){this.V7("sort",[b])}},
 Wk:{
 "^":"E4+lD;",
 $isList:true,
@@ -9027,41 +9118,41 @@
 $isQV:true,
 $asQV:null},
 DV:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
-return z},"call$1",null,2,0,null,96,[],"call"],
+return z},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true},
 Hp:{
-"^":"Tp:112;a",
-call$1:[function(a){return new this.a(a)},"call$1",null,2,0,null,96,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return new this.a(a)},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true},
 Nz:{
-"^":"Tp:112;",
-call$1:[function(a){return new P.r7(a)},"call$1",null,2,0,null,96,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return new P.r7(a)},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true},
 Jd:{
-"^":"Tp:112;",
-call$1:[function(a){return H.VM(new P.Tz(a),[null])},"call$1",null,2,0,null,96,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return H.VM(new P.Tz(a),[null])},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true},
 QS:{
-"^":"Tp:112;",
-call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,96,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
 VC:[function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"call$2","hj",4,0,null,226,[],30,[]],
+return a^a>>>6},"call$2","hj",4,0,null,228,[],30,[]],
 Up:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
 a^=a>>>11
-return 536870911&a+((16383&a)<<15>>>0)},"call$1","Hj",2,0,null,226,[]],
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","Hj",2,0,null,228,[]],
 J:[function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(b))
 if(a>b)return b
 if(a<b)return a
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return(a+b)*a*b
 if(a===0&&C.ON.gzP(b)||C.ON.gG0(b))return b
-return a}return a},"call$2","yT",4,0,null,131,[],187,[]],
+return a}return a},"call$2","yT",4,0,null,133,[],189,[]],
 y:[function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(b))
 if(a>b)return a
@@ -9069,14 +9160,14 @@
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},"call$2","Rb",4,0,null,131,[],187,[]],
+return a},"call$2","Rb",4,0,null,133,[],189,[]],
 KD:{
 "^":"a;",
-j1:[function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
-return Math.random()*a>>>0},"call$1","gRD",2,0,null,488,[]]},
+j1:function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
+return Math.random()*a>>>0}},
 vY:{
 "^":"a;Bo,Hz",
-o2:[function(){var z,y,x,w,v,u
+o2:function(){var z,y,x,w,v,u
 z=this.Bo
 y=4294901760*z
 x=(y&4294967295)>>>0
@@ -9085,15 +9176,15 @@
 u=v+x+this.Hz
 z=(u&4294967295)>>>0
 this.Bo=z
-this.Hz=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},"call$0","gKC",0,0,null],
-j1:[function(a){var z,y,x
+this.Hz=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
+j1:function(a){var z,y,x
 if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
 if((a&z)===0){this.o2()
 return(this.Bo&z)>>>0}do{this.o2()
 y=this.Bo
 x=y%a}while(y-x+a>=4294967296)
-return x},"call$1","gRD",2,0,null,488,[]],
+return x},
 c3:function(a){var z,y,x,w,v,u,t,s
 z=J.u6(a,0)?-1:0
 do{y=J.Wx(a)
@@ -9128,23 +9219,23 @@
 this.o2()
 this.o2()
 this.o2()},
-static:{"^":"tg,PZ,r6",r2:function(a){var z=new P.vY(0,0)
+static:{"^":"dK,PZ,r6",r2:function(a){var z=new P.vY(0,0)
 z.c3(a)
 return z}}},
 hL:{
 "^":"a;x>,y>",
-bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z,y
+bu:function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},
+n:function(a,b){var z,y
 if(b==null)return!1
 if(!J.x(b).$ishL)return!1
 z=this.x
 y=b.x
-return(z==null?y==null:z===y)&&J.de(this.y,b.y)},"call$1","gUJ",2,0,null,109,[]],
+return(z==null?y==null:z===y)&&J.de(this.y,b.y)},
 giO:function(a){var z,y
 z=J.v1(this.x)
 y=J.v1(this.y)
 return P.Up(P.VC(P.VC(0,z),y))},
-g:[function(a,b){var z,y,x
+g:function(a,b){var z,y,x
 z=this.x
 y=J.RE(b)
 x=y.gx(b)
@@ -9152,8 +9243,8 @@
 if(typeof x!=="number")return H.s(x)
 y=new P.hL(z+x,J.WB(this.y,y.gy(b)))
 y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},"call$1","gF1n",2,0,null,109,[]],
-W:[function(a,b){var z,y,x
+return y},
+W:function(a,b){var z,y,x
 z=this.x
 y=J.RE(b)
 x=y.gx(b)
@@ -9161,13 +9252,13 @@
 if(typeof x!=="number")return H.s(x)
 y=new P.hL(z-x,J.xH(this.y,y.gy(b)))
 y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},"call$1","gTG",2,0,null,109,[]],
-U:[function(a,b){var z=this.x
+return y},
+U:function(a,b){var z=this.x
 if(typeof z!=="number")return z.U()
 if(typeof b!=="number")return H.s(b)
 z=new P.hL(z*b,J.vX(this.y,b))
 z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},"call$1","gEH",2,0,null,466,[]],
+return z},
 $ishL:true},
 HDe:{
 "^":"a;",
@@ -9177,8 +9268,8 @@
 gQG:function(a){var z=this.gG6(this)
 if(typeof z!=="number")return z.g()
 return z+this.fg},
-bu:[function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+this.R+" x "+this.fg},"call$0","gXo",0,0,null],
-n:[function(a,b){var z,y,x
+bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+this.R+" x "+this.fg},
+n:function(a,b){var z,y,x
 if(b==null)return!1
 z=J.x(b)
 if(!z.$istn)return!1
@@ -9190,7 +9281,7 @@
 if(typeof x!=="number")return x.g()
 if(x+this.R===z.gT8(b)){if(typeof y!=="number")return y.g()
 z=y+this.fg===z.gQG(b)}else z=!1}else z=!1}else z=!1
-return z},"call$1","gUJ",2,0,null,109,[]],
+return z},
 giO:function(a){var z,y,x,w
 z=J.v1(this.gBb(this))
 y=this.G6
@@ -9252,9 +9343,9 @@
 $isej:true,
 $isX9:true,
 $isNL:true},
-Fw:{
+tg:{
 "^":"X9;",
-$isFw:true},
+$istg:true},
 RS:{
 "^":"a;",
 $isRS:true,
@@ -9282,26 +9373,26 @@
 $isZ0:true},
 B8q:{
 "^":"a;",
-u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,48,[],30,[]],
-FV:[function(a,b){return Q.ah()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,48,[]],
-V1:[function(a){return Q.ah()},"call$0","gRa",0,0,null],
+u:function(a,b,c){return Q.ah()},
+FV:function(a,b){return Q.ah()},
+Rz:function(a,b){Q.ah()},
+V1:function(a){return Q.ah()},
 $isZ0:true},
 Nx:{
 "^":"a;",
-t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,48,[]],
-u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
-FV:[function(a,b){this.EV.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
-V1:[function(a){this.EV.V1(0)},"call$0","gRa",0,0,null],
-x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,48,[]],
-di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,30,[]],
-aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
+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)},
+x4:function(a){return this.EV.x4(a)},
+di:function(a){return this.EV.di(a)},
+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(a){var z=this.EV
+gvc:function(){var z=this.EV
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gB:function(a){return this.EV.X5},
-Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
+Rz:function(a,b){return this.EV.Rz(0,b)},
 gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
@@ -9319,12 +9410,12 @@
 "%":"ArrayBuffer"},
 pF:{
 "^":"Gv;",
-J2:[function(a,b,c){var z=J.Wx(b)
+J2:function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,15,[],335,[]],
-ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,15,[],335,[]],
-PZ:[function(a,b,c,d){this.ZF(a,b,d+1)
-return d},"call$3","gyD",6,0,null,123,[],124,[],335,[]],
+else throw H.b(new P.AT("Invalid list index "+H.d(b)))},
+ZF:function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},
+PZ:function(a,b,c,d){this.ZF(a,b,d+1)
+return d},
 $ispF:true,
 $isHY:true,
 "%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
@@ -9336,13 +9427,14 @@
 Hg:{
 "^":"Dg;",
 gbx:function(a){return C.hN},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.GW]},
 $isyN:true,
@@ -9353,13 +9445,14 @@
 L3:{
 "^":"Dg;",
 gbx:function(a){return C.lk},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.GW]},
 $isyN:true,
@@ -9370,13 +9463,14 @@
 zz:{
 "^":"Pg;",
 gbx:function(a){return C.jV},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.im]},
 $isyN:true,
@@ -9387,13 +9481,14 @@
 dE:{
 "^":"Pg;",
 gbx:function(a){return C.Im},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.im]},
 $isyN:true,
@@ -9404,13 +9499,14 @@
 IJ:{
 "^":"Pg;",
 gbx:function(a){return C.la},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.im]},
 $isyN:true,
@@ -9420,14 +9516,15 @@
 "%":"Int8Array"},
 us:{
 "^":"Pg;",
-gbx:function(a){return C.iN},
-t:[function(a,b){var z=a.length
+gbx:function(a){return C.iG},
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.im]},
 $isyN:true,
@@ -9438,13 +9535,14 @@
 N2:{
 "^":"Pg;",
 gbx:function(a){return C.Vh},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.im]},
 $isyN:true,
@@ -9456,13 +9554,14 @@
 "^":"Pg;",
 gbx:function(a){return C.nG},
 gB:function(a){return a.length},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.im]},
 $isyN:true,
@@ -9474,13 +9573,14 @@
 "^":"Pg;",
 gbx:function(a){return C.eY},
 gB:function(a){return a.length},
-t:[function(a,b){var z=a.length
+t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,15,[]],
-u:[function(a,b,c){var z=a.length
+return a[b]},
+u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
-D6:[function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
+a[b]=c},
+D6:function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
+Jk:function(a,b){return this.D6(a,b,null)},
 $isList:true,
 $askF:function(){return[J.im]},
 $isyN:true,
@@ -9491,7 +9591,7 @@
 b0B:{
 "^":"pF;",
 gB:function(a){return a.length},
-oZ:[function(a,b,c,d,e){var z,y,x
+oZ:function(a,b,c,d,e){var z,y,x
 z=a.length+1
 this.ZF(a,b,z)
 this.ZF(a,c,z)
@@ -9502,12 +9602,13 @@
 if(typeof y!=="number")return H.s(y)
 if(x-e<y)throw H.b(new P.lj("Not enough elements"))
 if(e!==0||x!==y)d=d.subarray(e,e+y)
-a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],33,[],125,[]],
+a.set(d,b)},
 $isXj:true},
 Dg:{
 "^":"Ip;",
-YW:[function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
+YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(a,b,c,d,e)
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true,
 $isList:true,
 $askF:function(){return[J.GW]},
@@ -9525,8 +9626,9 @@
 "^":"Ui+SU7;"},
 Pg:{
 "^":"nA;",
-YW:[function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
+YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isPg:true,
 $isList:true,
 $askF:function(){return[J.im]},
@@ -9550,11 +9652,11 @@
 return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 Ir:{
-"^":["Vct;Py%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.Py},null,null,1,0,368,"error",365,385],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,369,30,[],"error",365],
+"^":["Vct;Py%-320,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.Py},null,null,1,0,303,"error",300,316],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,304,30,[],"error",300],
 "@":function(){return[C.uW]},
-static:{TW:[function(a){var z,y,x,w
+static:{hG:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -9565,40 +9667,40 @@
 a.X0=w
 C.OD.ZL(a)
 C.OD.oX(a)
-return a},null,null,0,0,115,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[489],
+return a},null,null,0,0,117,"new ErrorViewElement$created"]}},
+"+ErrorViewElement":[378],
 Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
 rm:{
-"^":["D13;fn%-398,Ab%-398,Ln%-490,y4%-491,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.fn},null,null,1,0,370,"text",365,366],
-sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,32,30,[],"text",365],
-gzW:[function(a){return a.Ab},null,null,1,0,370,"lineMode",365,366],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",365],
-gFR:[function(a){return a.Ln},null,null,1,0,492,"callback",365,385],
+"^":["D13;a3%-329,Ab%-329,Ln%-379,y4%-380,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.a3},null,null,1,0,305,"text",300,301],
+sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,32,30,[],"text",300],
+gzW:[function(a){return a.Ab},null,null,1,0,305,"lineMode",300,301],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",300],
+gFR:[function(a){return a.Ln},null,null,1,0,381,"callback",300,316],
 Ki:function(a){return this.gFR(a).call$0()},
 VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,493,30,[],"callback",365],
-gPK:[function(a){return a.y4},null,null,1,0,494,"results",365,366],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,495,30,[],"results",365],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,382,30,[],"callback",300],
+gPK:[function(a){return a.y4},null,null,1,0,383,"results",300,301],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,384,30,[],"results",300],
 az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
 z=this.ct(a,C.eh,a.Ab,z)
 a.Ab=z
-if(J.de(z,"1-line")){z=J.JA(a.fn,"\n"," ")
-a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,402,21,[],310,[],79,[],"updateLineMode"],
+if(J.de(z,"1-line")){z=J.JA(a.a3,"\n"," ")
+a.a3=this.ct(a,C.mi,a.a3,z)}},"call$3","gxb",6,0,333,21,[],334,[],81,[],"updateLineMode"],
 kk:[function(a,b,c,d){var z,y,x
 J.zJ(b)
-z=a.fn
-a.fn=this.ct(a,C.mi,z,"")
+z=a.a3
+a.a3=this.ct(a,C.mi,z,"")
 if(a.Ln!=null){y=H.B7([],P.L5(null,null,null,null,null))
 x=R.Jk(y)
 J.kW(x,"expr",z)
 J.BM(a.y4,0,x)
-this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,402,21,[],310,[],79,[],"eval"],
+this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,333,21,[],334,[],81,[],"eval"],
 A3:[function(a,b){var z=J.MI(J.l2(b),"expr")
-a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,496,21,[],"selectExpr"],
+a.a3=this.ct(a,C.mi,a.a3,z)},"call$1","gHo",2,0,385,21,[],"selectExpr"],
 "@":function(){return[C.Qz]},
 static:{Rp:[function(a){var z,y,x,w,v
 z=R.Jk([])
@@ -9614,19 +9716,74 @@
 a.X0=v
 C.Gh.ZL(a)
 C.Gh.oX(a)
-return a},null,null,0,0,115,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[497],
+return a},null,null,0,0,117,"new EvalBoxElement$created"]}},
+"+EvalBoxElement":[386],
 D13:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"Tp:112;a-82",
-call$1:[function(a){J.kW(this.a,"value",a)},"call$1",null,2,0,112,56,[],"call"],
+"^":"Tp:114;a-84",
+call$1:[function(a){J.kW(this.a,"value",a)},"call$1",null,2,0,114,56,[],"call"],
 $isEH:true},
-"+ YW":[498]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ YW":[387]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
-m8:{
-"^":["xI;tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+Lt:{
+"^":["Nr;TS%-321,bY%-84,jv%-329,oy%-320,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gO9:[function(a){return a.TS},null,null,1,0,330,"busy",300,301],
+sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,331,30,[],"busy",300],
+gFR:[function(a){return a.bY},null,null,1,0,117,"callback",300,316],
+Ki:function(a){return this.gFR(a).call$0()},
+VN:function(a,b){return this.gFR(a).call$1(b)},
+sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,114,30,[],"callback",300],
+gNW:[function(a){return a.jv},null,null,1,0,305,"expr",300,316],
+sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,32,30,[],"expr",300],
+gyG:[function(a){return a.oy},null,null,1,0,303,"result",300,316],
+syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,304,30,[],"result",300],
+hT:[function(a,b,c,d){var z=a.TS
+if(z===!0)return
+if(a.bY!=null){a.TS=this.ct(a,C.S4,z,!0)
+a.oy=this.ct(a,C.UY,a.oy,null)
+this.VN(a,a.jv).ml(new R.Kz(a)).YM(new R.tM(a))}},"call$3","gDf",6,0,336,133,[],189,[],282,[],"evalNow"],
+"@":function(){return[C.P9]},
+static:{fL:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.TS=!1
+a.bY=null
+a.jv=""
+a.oy=null
+a.SO=z
+a.B7=y
+a.X0=w
+C.UF.ZL(a)
+C.UF.oX(a)
+return a},null,null,0,0,117,"new EvalLinkElement$created"]}},
+"+EvalLinkElement":[388],
+Nr:{
+"^":"xc+Pi;",
+$isd3:true},
+Kz:{
+"^":"Tp:304;a-84",
+call$1:[function(a){var z,y
+z=this.a
+y=J.RE(z)
+y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"call$1",null,2,0,304,100,[],"call"],
+$isEH:true},
+"+ Kz":[387],
+tM:{
+"^":"Tp:117;b-84",
+call$0:[function(){var z,y
+z=this.b
+y=J.RE(z)
+y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"call$0",null,0,0,117,"call"],
+$isEH:true},
+"+ tM":[387]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"^":"",
+UL:{
+"^":["xI;tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.E6]},
 static:{zY:[function(a){var z,y,x,w
 z=$.Nd()
@@ -9640,14 +9797,14 @@
 a.X0=w
 C.MC.ZL(a)
 C.MC.oX(a)
-return a},null,null,0,0,115,"new FieldRefElement$created"]}},
-"+FieldRefElement":[391]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+return a},null,null,0,0,117,"new FieldRefElement$created"]}},
+"+FieldRefElement":[322]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 jM:{
-"^":["WZq;vt%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gt0:[function(a){return a.vt},null,null,1,0,384,"field",365,385],
-st0:[function(a,b){a.vt=this.ct(a,C.IV,a.vt,b)},null,null,3,0,386,30,[],"field",365],
-pA:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+"^":["WZq;vt%-313,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gt0:[function(a){return a.vt},null,null,1,0,315,"field",300,316],
+st0:[function(a,b){a.vt=this.ct(a,C.IV,a.vt,b)},null,null,3,0,317,30,[],"field",300],
+pA:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 "@":function(){return[C.vc]},
 static:{bH:[function(a){var z,y,x,w
 z=$.Nd()
@@ -9660,16 +9817,16 @@
 a.X0=w
 C.LT.ZL(a)
 C.LT.oX(a)
-return a},null,null,0,0,115,"new FieldViewElement$created"]}},
-"+FieldViewElement":[499],
+return a},null,null,0,0,117,"new FieldViewElement$created"]}},
+"+FieldViewElement":[389],
 WZq:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
 AX:{
-"^":["T5;lh%-390,qe%-390,zg%-390,AP,Lk,tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gU4:[function(a){return a.lh},null,null,1,0,399,"qualified",365,385],
-sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,400,30,[],"qualified",365],
+"^":["qe;lh%-321,qe%-321,zg%-321,AP,fn,tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gU4:[function(a){return a.lh},null,null,1,0,330,"qualified",300,316],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,331,30,[],"qualified",300],
 aZ:[function(a,b){var z,y,x
 Q.xI.prototype.aZ.call(this,a,b)
 this.ct(a,C.D2,0,1)
@@ -9679,13 +9836,13 @@
 x=y&&J.UQ(z,"parent")!=null
 a.qe=this.ct(a,C.D2,a.qe,x)
 if(y){y=J.U6(z)
-y=y.t(z,"class")!=null&&J.UQ(y.t(z,"class"),"name")!=null&&!J.de(J.UQ(y.t(z,"class"),"name"),"::")}else y=!1
-a.zg=this.ct(a,C.Mo,a.zg,y)},"call$1","gLe",2,0,157,230,[],"refChanged"],
-gRH:[function(a){return a.qe},null,null,1,0,399,"hasParent",365,366],
-sRH:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,400,30,[],"hasParent",365],
-gE7:[function(a){return a.zg},null,null,1,0,399,"hasClass",365,366],
-sE7:[function(a,b){a.zg=this.ct(a,C.Mo,a.zg,b)},null,null,3,0,400,30,[],"hasClass",365],
-"@":function(){return[C.U7Q]},
+y=y.t(z,"owner")!=null&&J.de(y.t(z,"owner").gzS(),"Class")}else y=!1
+a.zg=this.ct(a,C.Mo,a.zg,y)},"call$1","gLe",2,0,159,232,[],"refChanged"],
+gRH:[function(a){return a.qe},null,null,1,0,330,"hasParent",300,301],
+sRH:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,331,30,[],"hasParent",300],
+gE7:[function(a){return a.zg},null,null,1,0,330,"hasClass",300,301],
+sE7:[function(a,b){a.zg=this.ct(a,C.Mo,a.zg,b)},null,null,3,0,331,30,[],"hasClass",300],
+"@":function(){return[C.o3]},
 static:{Wz:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -9701,17 +9858,63 @@
 a.X0=w
 C.Xo.ZL(a)
 C.Xo.oX(a)
-return a},null,null,0,0,115,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[500],
-T5:{
+return a},null,null,0,0,117,"new FunctionRefElement$created"]}},
+"+FunctionRefElement":[390],
+qe:{
 "^":"xI+Pi;",
 $isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 mk:{
-"^":["pva;Z8%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.Z8},null,null,1,0,384,"function",365,385],
-sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,386,30,[],"function",365],
-pA:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+"^":["pva;De%-313,Iu%-329,Ru%-329,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.De},null,null,1,0,315,"function",300,316],
+sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,317,30,[],"function",300],
+gUx:[function(a){return a.Iu},null,null,1,0,305,"qualifiedName",300,316],
+sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,32,30,[],"qualifiedName",300],
+gfY:[function(a){return a.Ru},null,null,1,0,305,"kind",300,316],
+sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,32,30,[],"kind",300],
+FW:[function(a,b){var z,y,x
+z=b!=null
+y=z&&J.UQ(b,"parent")!=null?J.UQ(b,"parent"):null
+if(y!=null)return this.FW(a,y)+"."+H.d(J.UQ(b,"user_name"))
+if(z){z=J.U6(b)
+z=z.t(b,"owner")!=null&&J.de(z.t(b,"owner").gzS(),"Class")}else z=!1
+x=z?J.UQ(b,"owner"):null
+if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
+return H.d(J.UQ(b,"user_name"))},"call$1","gWd",2,0,391,17,[],"_getQualifiedName"],
+ql:[function(a,b){var z,y
+this.ct(a,C.AO,0,1)
+this.ct(a,C.fy,0,1)
+z=this.FW(a,a.De)
+a.Iu=this.ct(a,C.AO,a.Iu,z)
+z=J.UQ(a.De,"kind")
+y=a.Ru
+switch(z){case"kRegularFunction":a.Ru=this.ct(a,C.fy,y,"function")
+break
+case"kClosureFunction":a.Ru=this.ct(a,C.fy,y,"closure function")
+break
+case"kSignatureFunction":a.Ru=this.ct(a,C.fy,y,"signature function")
+break
+case"kGetterFunction":a.Ru=this.ct(a,C.fy,y,"getter function")
+break
+case"kSetterFunction":a.Ru=this.ct(a,C.fy,y,"setter function")
+break
+case"kConstructor":a.Ru=this.ct(a,C.fy,y,"constructor")
+break
+case"kImplicitGetterFunction":a.Ru=this.ct(a,C.fy,y,"implicit getter function")
+break
+case"kImplicitSetterFunction":a.Ru=this.ct(a,C.fy,y,"implicit setter function")
+break
+case"kStaticInitializer":a.Ru=this.ct(a,C.fy,y,"static initializer")
+break
+case"kMethodExtractor":a.Ru=this.ct(a,C.fy,y,"method extractor")
+break
+case"kNoSuchMethodDispatcher":a.Ru=this.ct(a,C.fy,y,"noSuchMethod dispatcher")
+break
+case"kInvokeFieldDispatcher":a.Ru=this.ct(a,C.fy,y,"invoke field dispatcher")
+break
+default:a.Ru=this.ct(a,C.fy,y,"UNKNOWN")
+break}},"call$1","gNC",2,0,159,232,[],"functionChanged"],
+pA:[function(a,b){J.am(a.De).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
@@ -9724,36 +9927,36 @@
 a.X0=w
 C.h4.ZL(a)
 C.h4.oX(a)
-return a},null,null,0,0,115,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[501],
+return a},null,null,0,0,117,"new FunctionViewElement$created"]}},
+"+FunctionViewElement":[392],
 pva:{
 "^":"uL+Pi;",
 $isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
 "^":"",
 Qb:{
 "^":"a;HW,mS",
-F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"call$0","gaw",0,0,502],
+F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"call$0","gaw",0,0,393],
 gvH:function(a){return J.Ts(this.mS,4)},
 static:{"^":"Q0z",x6:function(a,b){var z=J.RE(b)
 return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.YD(a)),z.gx(b)),4))}}},
 pL:{
-"^":["cda;hi%-82,An%-82,dW%-82,rM%-82,Ge%-82,UL%-82,PA%-398,Oh%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gys:[function(a){return a.PA},null,null,1,0,370,"status",365,366],
-sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",365],
-gyw:[function(a){return a.Oh},null,null,1,0,384,"fragmentation",365,385],
-syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,386,30,[],"fragmentation",365],
+"^":["cda;hi%-84,An%-84,dW%-84,rM%-84,Ge%-84,UL%-84,PA%-329,Oh%-313,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gys:[function(a){return a.PA},null,null,1,0,305,"status",300,301],
+sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",300],
+gyw:[function(a){return a.Oh},null,null,1,0,315,"fragmentation",300,316],
+syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,317,30,[],"fragmentation",300],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
 a.hi=z
-J.oL(z).yI(this.gmo(a))},"call$0","gQd",0,0,114,"enteredView"],
+J.oL(z).yI(this.gmo(a))},"call$0","gQd",0,0,116,"enteredView"],
 LV:[function(a,b){var z,y,x
 for(z=J.GP(b),y=0;z.G();){x=z.gl()
 if(typeof x!=="number")return H.s(x)
-y=y*256+x}return y},"call$1","gzK",2,0,503,504,[],"_packColor"],
+y=y*256+x}return y},"call$1","gzK",2,0,394,395,[],"_packColor"],
 tn:[function(a,b,c,d){J.kW(a.UL,b,c)
 J.kW(a.rM,b,d)
-J.kW(a.Ge,this.LV(a,d),b)},"call$3","gkY",6,0,505,506,[],12,[],504,[],"_addClass"],
+J.kW(a.Ge,this.LV(a,d),b)},"call$3","gAa",6,0,396,397,[],12,[],395,[],"_addClass"],
 an:[function(a,b,c){var z,y,x,w,v,u
 for(z=J.GP(J.UQ(b,"members"));z.G();){y=z.gl()
 x=J.U6(y)
@@ -9765,14 +9968,14 @@
 J.kW(a.UL,w,x)
 J.kW(a.rM,w,u)
 J.kW(a.Ge,this.LV(a,u),w)}this.tn(a,c,"Free",$.R2())
-this.tn(a,0,"",$.mI())},"call$2","gUw",4,0,507,508,[],509,[],"_updateClassList"],
+this.tn(a,0,"",$.eK())},"call$2","gUw",4,0,398,399,[],400,[],"_updateClassList"],
 LI:[function(a,b){var z=b==null?C.vT:P.r2(b)
-return[z.j1(128),z.j1(128),z.j1(128),255]},"call$1","gz4",2,0,510,506,[],"_classIdToRGBA"],
+return[z.j1(128),z.j1(128),z.j1(128),255]},"call$1","gz4",2,0,401,397,[],"_classIdToRGBA"],
 Ic:[function(a,b){var z,y,x
 z=O.x6(a.An,b)
 y=z.mS
 x=J.Cl(J.Qd(z.HW),y,J.WB(y,4))
-return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"call$1","gQe",2,0,511,512,[],"_classNameAt"],
+return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"call$1","gQe",2,0,402,403,[],"_classNameAt"],
 yl:[function(a,b){var z,y,x,w,v,u,t
 z=J.vX(a.dW,J.YD(a.An))
 y=J.Ts(O.x6(a.An,b).mS,4)
@@ -9787,7 +9990,7 @@
 if(x){x=H.BU(J.UQ(J.UQ(u,w),"object_start"),null,null)
 t=J.UQ(a.Oh,"unit_size_bytes")
 if(typeof t!=="number")return H.s(t)
-return J.WB(x,v*t)}else return 0},"call$1","gdO",2,0,513,512,[],"_addressAt"],
+return J.WB(x,v*t)}else return 0},"call$1","gdO",2,0,404,403,[],"_addressAt"],
 U8:[function(a,b){var z,y,x,w,v
 z=J.RE(b)
 y="@ 0x"+J.cR(this.yl(a,z.gD7(b)),16)
@@ -9797,7 +10000,7 @@
 w=J.Cl(J.Qd(z.HW),x,J.WB(x,4))
 v=J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,w)))
 z=J.de(v,"")?"-":H.d(v)+" "+y
-a.PA=this.ct(a,C.PM,a.PA,z)},"call$1","gmo",2,0,496,376,[],"_handleMouseMove"],
+a.PA=this.ct(a,C.PM,a.PA,z)},"call$1","gmo",2,0,385,309,[],"_handleMouseMove"],
 My:[function(a){var z,y,x,w
 z=a.Oh
 if(z==null||a.hi==null)return
@@ -9815,7 +10018,7 @@
 a.An=w
 J.No(a.hi,J.YD(w))
 J.OE(a.hi,J.kd(a.An))
-this.ps(a,0)},"call$0","gCT",0,0,114,"_updateFragmentationData"],
+this.ps(a,0)},"call$0","gCT",0,0,116,"_updateFragmentationData"],
 ps:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 z=J.UQ(a.Oh,"pages")
 y=J.U6(z)
@@ -9847,18 +10050,18 @@
 k=J.Ts(x.Z(y,4),n.gR(o))
 new P.hL(l,k).$builtinTypeInfo=[null]
 if(!J.u6(k,m))break
-l=$.mI()
+l=$.eK()
 J.wp(n.gRn(o),y,x.g(y,4),l)
 v=new O.Qb(o,x.g(y,4))}y=J.Vf(a.hi)
 x=a.An
 J.My(y,x,0,0,0,w,J.YD(x),m)
-P.e4(new O.WQ(a,b),null)},"call$1","guq",2,0,514,515,[],"_renderPages"],
+P.e4(new O.WQ(a,b),null)},"call$1","guq",2,0,405,406,[],"_renderPages"],
 pA:[function(a,b){var z=a.Oh
 if(z==null)return
-J.QP(z).ox("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
-YS:[function(a,b){P.e4(new O.oc(a),null)},"call$1","gR2",2,0,157,230,[],"fragmentationChanged"],
+J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"call$1","gR2",2,0,159,232,[],"fragmentationChanged"],
 "@":function(){return[C.Cu]},
-static:{"^":"nK<-82,fM<-82,SoT<-82",pn:[function(a){var z,y,x,w,v,u,t
+static:{"^":"nK<-84,RD<-84,SoT<-84",pn:[function(a){var z,y,x,w,v,u,t
 z=H.B7([],P.L5(null,null,null,null,null))
 y=H.B7([],P.L5(null,null,null,null,null))
 x=H.B7([],P.L5(null,null,null,null,null))
@@ -9875,39 +10078,39 @@
 a.X0=t
 C.pJ.ZL(a)
 C.pJ.oX(a)
-return a},null,null,0,0,115,"new HeapMapElement$created"]}},
-"+HeapMapElement":[516],
+return a},null,null,0,0,117,"new HeapMapElement$created"]}},
+"+HeapMapElement":[407],
 cda:{
 "^":"uL+Pi;",
 $isd3:true},
 WQ:{
-"^":"Tp:115;a-82,b-377",
-call$0:[function(){J.fi(this.a,J.WB(this.b,1))},"call$0",null,0,0,115,"call"],
+"^":"Tp:117;a-84,b-310",
+call$0:[function(){J.fi(this.a,J.WB(this.b,1))},"call$0",null,0,0,117,"call"],
 $isEH:true},
-"+ WQ":[498],
+"+ WQ":[387],
 aG:{
-"^":"Tp:386;a-82",
+"^":"Tp:317;a-84",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"call$1",null,2,0,386,517,[],"call"],
+y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"call$1",null,2,0,317,408,[],"call"],
 $isEH:true},
-"+ aG":[498],
+"+ aG":[387],
 aO:{
-"^":"Tp:355;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,355,21,[],518,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,293,21,[],409,[],"call"],
 $isEH:true},
-"+ aO":[498],
+"+ aO":[387],
 oc:{
-"^":"Tp:115;a-82",
-call$0:[function(){J.vP(this.a)},"call$0",null,0,0,115,"call"],
+"^":"Tp:117;a-84",
+call$0:[function(){J.vP(this.a)},"call$0",null,0,0,117,"call"],
 $isEH:true},
-"+ oc":[498]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+"+ oc":[387]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 jY:{
-"^":["waa;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-382,X3%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.Ol},null,null,1,0,384,"profile",365,385],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,386,30,[],"profile",365],
+"^":["waa;GQ%-84,J0%-84,Oc%-84,CO%-84,bV%-84,kg%-84,LY%-84,q3%-84,Ol%-313,X3%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.Ol},null,null,1,0,315,"profile",300,316],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,317,30,[],"profile",300],
 i4:[function(a){var z,y
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#table")
@@ -9934,7 +10137,7 @@
 z.bG.u(0,"allowHtml",!0)
 J.kW(J.wc(a.kg),"sortColumn",1)
 J.kW(J.wc(a.kg),"sortAscending",!1)
-this.uB(a)},"call$0","gQd",0,0,114,"enteredView"],
+this.uB(a)},"call$0","gQd",0,0,116,"enteredView"],
 hZ:[function(a){var z,y,x,w,v,u
 z=a.Ol
 if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
@@ -9958,21 +10161,21 @@
 J.qK(a.Oc,["Used",z.t(u,"used")])
 J.qK(a.Oc,["Free",J.xH(z.t(u,"capacity"),z.t(u,"used"))])
 J.qK(a.Oc,["External",z.t(u,"external")])
-this.uB(a)},"call$0","gYs",0,0,114,"_updateChartData"],
+this.uB(a)},"call$0","gYs",0,0,116,"_updateChartData"],
 uB:[function(a){if(a.q3==null||a.kg==null)return
 a.kg.u5()
 a.kg.W2(a.bV)
 a.q3.u5()
 a.q3.W2(a.LY)
 a.J0.W2(a.GQ)
-a.CO.W2(a.Oc)},"call$0","goI",0,0,114,"_draw"],
+a.CO.W2(a.Oc)},"call$0","goI",0,0,116,"_draw"],
 K1:[function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
 x=z.t(b,"old")
 for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
 for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"call$1","gbU",2,0,519,275,[],"_classHasNoAllocations"],
+return!0},"call$1","gbU",2,0,410,277,[],"_classHasNoAllocations"],
 iF:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -9984,7 +10187,7 @@
 return J.WB(J.UQ(z.t(b,"old"),3),J.UQ(z.t(b,"old"),5))
 case 6:return J.UQ(J.UQ(b,"old"),5)
 case 7:return J.UQ(J.UQ(b,"old"),1)
-case 8:return J.UQ(J.UQ(b,"old"),3)}throw H.b(P.hS())},"call$2","gym",4,0,520,275,[],15,[],"_fullTableColumnValue"],
+case 8:return J.UQ(J.UQ(b,"old"),3)}throw H.b(P.hS())},"call$2","gym",4,0,411,277,[],15,[],"_fullTableColumnValue"],
 VI:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -9998,34 +10201,34 @@
 case 5:z=J.U6(b)
 return J.WB(J.UQ(z.t(b,"new"),1),J.UQ(z.t(b,"old"),1))
 case 6:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"old"),3))}throw H.b(P.hS())},"call$2","gcY",4,0,520,275,[],15,[],"_combinedTableColumnValue"],
+return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"old"),3))}throw H.b(P.hS())},"call$2","gcY",4,0,411,277,[],15,[],"_combinedTableColumnValue"],
 pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 ii:[function(a,b,c,d){var z=a.Ol
 if(z==null)return
-J.QP(z).ox("/allocationprofile/reset").ml(new K.xj(a)).OA(new K.VB())},"call$3","gNb",6,0,402,21,[],310,[],79,[],"resetAccumulator"],
+J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB())},"call$3","gNb",6,0,333,21,[],334,[],81,[],"resetAccumulator"],
 pM:[function(a,b){this.hZ(a)
 this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gJN(a))},"call$1","gwm",2,0,157,230,[],"profileChanged"],
+this.ct(a,C.WG,[],this.gJN(a))},"call$1","gwm",2,0,159,232,[],"profileChanged"],
 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.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,521,522,[],"formattedAverage",366],
-NC:[function(a,b){var z,y
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,412,413,[],"formattedAverage",301],
+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"))},"call$1","gJN",2,0,521,522,[],"formattedCollections",366],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gJN",2,0,412,413,[],"formattedCollections",301],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,521,522,[],"formattedTotalCollectionTime",366],
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,412,413,[],"formattedTotalCollectionTime",301],
 Dd:[function(a){var z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.LY=z
 z.Gl("string","Class")
@@ -10053,9 +10256,9 @@
 a.bV.Gl("number","Current")
 a.bV.Gl("number","Allocated Since GC")
 a.bV.Gl("number","Total before GC")
-a.bV.Gl("number","Survivors after GC")},null,null,0,0,115,"created"],
+a.bV.Gl("number","Survivors after GC")},null,null,0,0,117,"created"],
 "@":function(){return[C.dA]},
-static:{"^":"BO<-82,bQj<-82,xK<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",Lz:[function(a){var z,y,x,w
+static:{"^":"BO<-84,bQj<-84,xK<-84,V1g<-84,r1<-84,d6<-84,pC<-84,DP<-84",Lz:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -10068,37 +10271,37 @@
 C.Vc.ZL(a)
 C.Vc.oX(a)
 C.Vc.Dd(a)
-return a},null,null,0,0,115,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[523],
+return a},null,null,0,0,117,"new HeapProfileElement$created"]}},
+"+HeapProfileElement":[414],
 waa:{
 "^":"uL+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:386;a-82",
+"^":"Tp:317;a-84",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,386,517,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,317,408,[],"call"],
 $isEH:true},
-"+ nx":[498],
+"+ nx":[387],
 jm:{
-"^":"Tp:355;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,355,21,[],518,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,293,21,[],409,[],"call"],
 $isEH:true},
-"+ jm":[498],
+"+ jm":[387],
 xj:{
-"^":"Tp:386;a-82",
+"^":"Tp:317;a-84",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,386,517,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,317,408,[],"call"],
 $isEH:true},
-"+ xj":[498],
+"+ xj":[387],
 VB:{
-"^":"Tp:355;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,355,21,[],518,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,293,21,[],409,[],"call"],
 $isEH:true},
-"+ VB":[498]}],["html_common","dart:html_common",,P,{
+"+ VB":[387]}],["html_common","dart:html_common",,P,{
 "^":"",
 bL:[function(a){var z,y
 z=[]
@@ -10106,14 +10309,14 @@
 new P.wO().call$0()
 return y},"call$1","Lq",2,0,null,30,[]],
 o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],238,[]],
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,212,6,[],240,[]],
 f9:[function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
 if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"call$1","D3",2,0,null,239,[]],
+y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"call$1","D3",2,0,null,241,[]],
 QO:[function(a){if(!!J.x(a).$isqS)return{data: a.Rn, height: a.fg, width: a.R}
-return a},"call$1","Gg",2,0,null,240,[]],
+return a},"call$1","Gg",2,0,null,242,[]],
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
 $.L4=z}return z},
@@ -10121,7 +10324,7 @@
 if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
 $.PN=z}return z},
 aI:{
-"^":"Tp:188;b,c",
+"^":"Tp:190;b,c",
 call$1:[function(a){var z,y,x
 z=this.b
 y=z.length
@@ -10131,23 +10334,23 @@
 return y},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rG:{
-"^":"Tp:422;d",
+"^":"Tp:346;d",
 call$1:[function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,420,[],"call"],
+return z[a]},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true},
 yh:{
-"^":"Tp:524;e",
+"^":"Tp:415;e",
 call$2:[function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,420,[],28,[],"call"],
+z[a]=b},"call$2",null,4,0,null,344,[],28,[],"call"],
 $isEH:true},
 wO:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Tm:{
-"^":"Tp:112;f,UI,bK",
+"^":"Tp:114;f,UI,bK",
 call$1:[function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
@@ -10183,11 +10386,11 @@
 w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ib:{
-"^":"Tp:355;a,Gq",
+"^":"Tp:293;a,Gq",
 call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 CA:{
-"^":"Tp:188;a,b",
+"^":"Tp:190;a,b",
 call$1:[function(a){var z,y,x,w
 z=this.a
 y=z.length
@@ -10197,19 +10400,19 @@
 return y},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 YL:{
-"^":"Tp:422;c",
+"^":"Tp:346;c",
 call$1:[function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,420,[],"call"],
+return z[a]},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true},
 KC:{
-"^":"Tp:524;d",
+"^":"Tp:415;d",
 call$2:[function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,420,[],28,[],"call"],
+z[a]=b},"call$2",null,4,0,null,344,[],28,[],"call"],
 $isEH:true},
 xL:{
-"^":"Tp:112;e,f,UI,bK",
+"^":"Tp:114;e,f,UI,bK",
 call$1:[function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -10242,127 +10445,130 @@
 $isSg:true},
 As:{
 "^":"a;",
-bu:[function(a){return this.lF().zV(0," ")},"call$0","gXo",0,0,null],
-O4:[function(a,b){var z,y
+bu:function(a){return this.lF().zV(0," ")},
+O4:function(a,b){var z,y
 z=this.lF()
 if(!z.tg(0,a)){z.h(0,a)
 y=!0}else{z.Rz(0,a)
 y=!1}this.p5(z)
-return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],484,[]],
+return y},
+qU:function(a){return this.O4(a,null)},
 gA:function(a){var z=this.lF()
 z=H.VM(new P.zQ(z,z.zN,null,null),[null])
 z.zq=z.O2.H9
 return z},
-aN:[function(a,b){this.lF().aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,337,338,[]],
+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.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,null,117,[]],
-ev:[function(a,b){var z=this.lF()
-return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},"call$1","gIR",2,0,null,117,[]],
-Vr:[function(a,b){return this.lF().Vr(0,b)},"call$1","gGI",2,0,null,117,[]],
+return H.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,416,119,[]],
+ev:function(a,b){var z=this.lF()
+return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},
+Vr:function(a,b){return this.lF().Vr(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
 gB:function(a){return this.lF().X5},
-tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,30,[]],
-Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,30,[]],
-h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,30,[]],
-Rz:[function(a,b){var z,y
+tg:function(a,b){return this.lF().tg(0,b)},
+Zt:function(a){return this.lF().tg(0,a)?a:null},
+h:function(a,b){return this.OS(new P.GE(b))},
+Rz:function(a,b){var z,y
 z=this.lF()
 y=z.Rz(0,b)
 this.p5(z)
-return y},"call$1","guH",2,0,null,30,[]],
-FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,116,[]],
+return y},
+FV:function(a,b){this.OS(new P.rl(b))},
 grZ:function(a){var z=this.lF().lX
 if(z==null)H.vh(new P.lj("No elements"))
 return z.gGc()},
-tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,340,341,[]],
-eR:[function(a,b){var z=this.lF()
-return H.ke(z,b,H.ip(z,"mW",0))},"call$1","gZo",2,0,null,198,[]],
-Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","gRV",2,0,null,15,[]],
-V1:[function(a){this.OS(new P.uQ())},"call$0","gRa",0,0,null],
-OS:[function(a){var z,y
+tt:function(a,b){return this.lF().tt(0,b)},
+br:function(a){return this.tt(a,!0)},
+eR:function(a,b){var z=this.lF()
+return H.ke(z,b,H.ip(z,"mW",0))},
+Zv:function(a,b){return this.lF().Zv(0,b)},
+V1:function(a){this.OS(new P.uQ())},
+OS:function(a){var z,y
 z=this.lF()
 y=a.call$1(z)
 this.p5(z)
-return y},"call$1","gFd",2,0,null,117,[]],
+return y},
 $isz5:true,
 $asz5:function(){return[J.O]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[J.O]}},
 GE:{
-"^":"Tp:112;a",
-call$1:[function(a){return a.h(0,this.a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return a.h(0,this.a)},"call$1",null,2,0,null,93,[],"call"],
 $isEH:true},
 rl:{
-"^":"Tp:112;a",
-call$1:[function(a){return a.FV(0,this.a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return a.FV(0,this.a)},"call$1",null,2,0,null,93,[],"call"],
 $isEH:true},
 uQ:{
-"^":"Tp:112;",
-call$1:[function(a){return a.V1(0)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return a.V1(0)},"call$1",null,2,0,null,93,[],"call"],
 $isEH:true},
 D7:{
 "^":"ar;qt,h2",
 gzT:function(){var z=this.h2
 return P.F(z.ev(z,new P.hT()),!0,W.cv)},
-aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,117,[]],
-u:[function(a,b,c){var z=this.gzT()
+aN:function(a,b){H.bQ(this.gzT(),b)},
+u:function(a,b,c){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.ZP(z[b],c)},"call$2","gj3",4,0,null,15,[],30,[]],
+J.ZP(z[b],c)},
 sB:function(a,b){var z,y
 z=this.gzT().length
 y=J.Wx(b)
 if(y.F(b,z))return
 else if(y.C(b,0))throw H.b(new P.AT("Invalid list length"))
 this.UZ(0,b,z)},
-h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
-FV:[function(a,b){var z,y
-for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
-tg:[function(a,b){return!1},"call$1","gdj",2,0,null,107,[]],
-GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,339,123,[],124,[],116,[],125,[]],
-UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,123,[],124,[]],
-V1:[function(a){J.c9(this.h2.NL,"")},"call$0","gRa",0,0,null],
-xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gJe",4,0,null,15,[],30,[]],
-oF:[function(a,b,c){var z,y
+h:function(a,b){this.h2.NL.appendChild(b)},
+FV:function(a,b){var z,y
+for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},
+tg:function(a,b){return!1},
+GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
+YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},
+zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+UZ:function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},
+V1:function(a){J.c9(this.h2.NL,"")},
+xe:function(a,b,c){this.h2.xe(0,b,c)},
+oF:function(a,b,c){var z,y
 z=this.h2.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
-Rz:[function(a,b){return!1},"call$1","guH",2,0,null,132,[]],
+J.qD(z,c,y[b])},
+Rz:function(a,b){return!1},
 gB:function(a){return this.gzT().length},
-t:[function(a,b){var z=this.gzT()
+t:function(a,b){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,15,[]],
+return z[b]},
 gA:function(a){var z=this.gzT()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
-"^":"Tp:112;",
-call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,198,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,200,[],"call"],
 $isEH:true},
 GS:{
-"^":"Tp:112;",
-call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,286,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,288,[],"call"],
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
 NG:{
-"^":["xI;tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gD5:[function(a){var z=a.tY
 if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
 else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
 else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,370,"hoverText"],
-Qx:[function(a){return this.gus(a)},"call$0","gyX",0,0,115,"expander"],
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,305,"hoverText"],
+Qx:[function(a){return this.gus(a)},"call$0","gyX",0,0,117,"expander"],
 vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.call$0()}},"call$2","gus",4,0,525,526,[],387,[],"expandEvent"],
+c.call$0()}},"call$2","gus",4,0,417,418,[],318,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{b4:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10376,27 +10582,27 @@
 a.X0=w
 C.cp.ZL(a)
 C.cp.oX(a)
-return a},null,null,0,0,115,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[391],
+return a},null,null,0,0,117,"new InstanceRefElement$created"]}},
+"+InstanceRefElement":[322],
 Js:{
-"^":"Tp:112;a-82",
+"^":"Tp:114;a-84",
 call$1:[function(a){var z,y
 z=J.U6(a)
-if(z.t(a,"preview")!=null){z.soc(a,z.t(a,"preview"))
-a.szz(z.t(a,"preview"))}z=this.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)
 y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
-y.ct(z,C.kY,0,1)},"call$1",null,2,0,112,56,[],"call"],
+y.ct(z,C.kY,0,1)},"call$1",null,2,0,114,56,[],"call"],
 $isEH:true},
-"+ Js":[498]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[387]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["V4;Xh%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gQr:[function(a){return a.Xh},null,null,1,0,384,"instance",365,385],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,386,30,[],"instance",365],
-vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,392,212,[],"eval"],
-pA:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
-"@":function(){return[C.be]},
+"^":["V4;Xh%-313,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gQr:[function(a){return a.Xh},null,null,1,0,315,"instance",300,316],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,317,30,[],"instance",300],
+vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,323,214,[],"eval"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
+"@":function(){return[C.qlk]},
 static:{HC:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -10408,16 +10614,16 @@
 a.X0=w
 C.pU.ZL(a)
 C.pU.oX(a)
-return a},null,null,0,0,115,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[527],
+return a},null,null,0,0,117,"new InstanceViewElement$created"]}},
+"+InstanceViewElement":[419],
 V4:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 Se:{
-"^":["Y2;B1>,SF<-528,H<-528,eT,yt-377,wd-378,oH-379,z3,AP,Lk",null,function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null],
-gtT:[function(a){return J.on(this.H)},null,null,1,0,395,"code",365],
-C4:[function(a){var z,y,x,w,v,u,t,s,r
+"^":["Y2;B1>,SF<-420,H<-420,eT,yt-310,wd-311,oH-312,R7,z3,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null],
+gtT:[function(a){return J.on(this.H)},null,null,1,0,325,"code",300],
+C4:function(a){var z,y,x,w,v,u,t,s,r
 z=this.B1
 y=J.UQ(z,"threshold")
 x=this.wd
@@ -10427,8 +10633,8 @@
 r=J.FW(s.gAv(),v.gAv())
 if(typeof y!=="number")return H.s(y)
 if(!(r>y||J.FW(J.on(s).gDu(),t.gAv())>y))continue
-w.h(x,X.SJ(z,t,s,this))}},"call$0","gDT",0,0,null],
-o8:[function(){},"call$0","gPY",0,0,null],
+w.h(x,X.SJ(z,t,s,this))}},
+o8:function(){},
 mW:function(a,b,c,d){var z,y,x,w
 z=this.SF
 y=z.gAv()
@@ -10437,15 +10643,15 @@
 if(d==null)J.bi(x,X.j6(w.gAv(),z.gAv()))
 else J.bi(x,X.j6(w.gAv(),d.H.gAv()))
 J.bi(x,X.j6(J.on(w).gDu(),y))},
-static:{j6:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","E7",4,0,null,131,[],241,[]],SJ:function(a,b,c,d){var z,y
+static:{j6:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","E7",4,0,null,133,[],243,[]],SJ:function(a,b,c,d){var z,y
 z=H.VM([],[G.Y2])
 y=d!=null?J.WB(d.yt,1):0
-z=new X.Se(a,b,c,d,y,z,[],!1,null,null)
+z=new X.Se(a,b,c,d,y,z,[],"\u2192",!1,null,null)
 z.mW(a,b,c,d)
 return z}}},
 qm:{
-"^":["Y2;B1>,tT>-394,eT,yt-377,wd-378,oH-379,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null],
-C4:[function(a){var z,y,x,w,v,u,t,s,r,q
+"^":["Y2;B1>,tT>-326,eT,yt-310,wd-311,oH-312,R7,z3,AP,fn",null,function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null],
+C4:function(a){var z,y,x,w,v,u,t,s,r,q
 z=this.B1
 y=J.U6(z)
 x=y.t(z,"threshold")
@@ -10458,8 +10664,8 @@
 q=J.FW(u.dJ(r.gtT(s)),u.QQ())
 if(typeof x!=="number")return H.s(x)
 if(!(q>x||J.FW(r.gtT(s).gDu(),w)>x))continue
-v.h(y,X.Tl(z,r.gtT(s),this))}},"call$0","gDT",0,0,null],
-o8:[function(){},"call$0","gPY",0,0,null],
+v.h(y,X.Tl(z,r.gtT(s),this))}},
+o8:function(){},
 Af:function(a,b,c){var z,y,x,w,v,u
 z=this.B1
 y=J.U6(z)
@@ -10469,30 +10675,30 @@
 if(c==null){u=y.gF1(z).RL()
 J.bi(v,X.eI(u.dJ(w),u.QQ()))}else{z=c.tT
 J.bi(v,X.eI(z.dJ(w),z.QQ()))}J.bi(v,X.eI(w.gDu(),x))},
-static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],241,[]],Tl:function(a,b,c){var z,y
+static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,133,[],243,[]],Tl:function(a,b,c){var z,y
 z=H.VM([],[G.Y2])
 y=c!=null?J.WB(c.yt,1):0
-z=new X.qm(a,b,c,y,z,[],!1,null,null)
+z=new X.qm(a,b,c,y,z,[],"\u2192",!1,null,null)
 z.Af(a,b,c)
 return z}}},
 kKl:{
-"^":["V9;pD%-382,Kx%-390,zt%-390,eH%-398,vk%-398,Xv%-398,M5%-398,ik%-398,XX%-529,qO=-82,Hm%-530,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.pD},null,null,1,0,384,"profile",365,385],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,386,30,[],"profile",365],
-gJQ:[function(a){return a.Kx},null,null,1,0,399,"callGraphChecked",365,366],
-sJQ:[function(a,b){a.Kx=this.ct(a,C.Hx,a.Kx,b)},null,null,3,0,400,30,[],"callGraphChecked",365],
-gPL:[function(a){return a.zt},null,null,1,0,399,"hideTagsChecked",365,366],
-sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,400,30,[],"hideTagsChecked",365],
-gJy:[function(a){return a.eH},null,null,1,0,370,"sampleCount",365,366],
-sJy:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,32,30,[],"sampleCount",365],
-gUo:[function(a){return a.vk},null,null,1,0,370,"refreshTime",365,366],
-sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,32,30,[],"refreshTime",365],
-gEly:[function(a){return a.Xv},null,null,1,0,370,"sampleRate",365,366],
-sEly:[function(a,b){a.Xv=this.ct(a,C.kA,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",365],
-gFZ:[function(a){return a.M5},null,null,1,0,370,"sampleDepth",365,366],
-sFZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",365],
-gNG:[function(a){return a.ik},null,null,1,0,370,"displayCutoff",365,366],
-sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",365],
+"^":["V9;pD%-313,Kx%-321,zt%-321,eH%-329,NT%-329,Xv%-329,M5%-329,ik%-329,XX%-421,qO=-84,Hm%-422,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,315,"profile",300,316],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,317,30,[],"profile",300],
+gJQ:[function(a){return a.Kx},null,null,1,0,330,"callGraphChecked",300,301],
+sJQ:[function(a,b){a.Kx=this.ct(a,C.Hx,a.Kx,b)},null,null,3,0,331,30,[],"callGraphChecked",300],
+gPL:[function(a){return a.zt},null,null,1,0,330,"hideTagsChecked",300,301],
+sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,331,30,[],"hideTagsChecked",300],
+gJy:[function(a){return a.eH},null,null,1,0,305,"sampleCount",300,301],
+sJy:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,32,30,[],"sampleCount",300],
+gUo:[function(a){return a.NT},null,null,1,0,305,"refreshTime",300,301],
+sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,32,30,[],"refreshTime",300],
+gEly:[function(a){return a.Xv},null,null,1,0,305,"sampleRate",300,301],
+sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",300],
+gIZ:[function(a){return a.M5},null,null,1,0,305,"sampleDepth",300,301],
+sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",300],
+gNG:[function(a){return a.ik},null,null,1,0,305,"displayCutoff",300,301],
+sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",300],
 pM:[function(a,b){var z,y,x,w
 z=a.pD
 if(z==null)return
@@ -10502,68 +10708,70 @@
 z=J.AG(y)
 a.eH=this.ct(a,C.XU,a.eH,z)
 z=x.bu(0)
-a.vk=this.ct(a,C.Dj,a.vk,z)
+a.NT=this.ct(a,C.Dj,a.NT,z)
 z=J.AG(J.UQ(a.pD,"depth"))
 a.M5=this.ct(a,C.bE,a.M5,z)
 w=J.UQ(a.pD,"period")
 if(typeof w!=="number")return H.s(w)
 z=C.CD.yM(1000000/w,0)
-a.Xv=this.ct(a,C.kA,a.Xv,z)
+a.Xv=this.ct(a,C.mI,a.Xv,z)
 z=J.AG(J.vX(a.XX,100))+"%"
 a.ik=this.ct(a,C.aH,a.ik,z)
 J.QP(a.pD).N3(a.pD)
 J.kW(a.pD,"threshold",a.XX)
-this.Cx(a)},"call$1","gwm",2,0,157,230,[],"profileChanged"],
-Cs:[function(a,b){this.Cx(a)},"call$1","gS5",2,0,157,230,[],"callGraphCheckedChanged"],
+this.Cx(a)},"call$1","gwm",2,0,159,232,[],"profileChanged"],
+Cs:[function(a,b){this.Cx(a)},"call$1","gS5",2,0,159,232,[],"callGraphCheckedChanged"],
 i4:[function(a){var z=R.Jk([])
 a.Hm=new G.XN(z,null,null)
-this.Cx(a)},"call$0","gQd",0,0,114,"enteredView"],
-Mm:[function(a,b){this.pA(a,null)},"call$1","gDJ",2,0,157,230,[],"hideTagsCheckedChanged"],
+this.Cx(a)},"call$0","gQd",0,0,116,"enteredView"],
+Mm:[function(a,b){this.pA(a,null)},"call$1","gDJ",2,0,159,232,[],"hideTagsCheckedChanged"],
 pA:[function(a,b){var z,y
 z=a.zt
 y=z!=null&&z===!0?"profile"+"?tags=hide":"profile"
-J.QP(a.pD).ox(y).ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+J.QP(a.pD).cv(y).ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 Cx:[function(a){var z
 if(a.pD==null)return
 z=a.Kx
 if(z!=null&&z===!0)this.QI(a)
-else this.EX(a)},"call$0","gBn",0,0,114,"_update"],
+else this.EX(a)},"call$0","gBn",0,0,116,"_update"],
 QI:[function(a){var z,y,x,w,v
 z=J.QP(a.pD).RL()
 if(z==null)N.Jx("").j2("No profile root tag.")
 try{a.Hm.rT(X.Tl(a.pD,z,null))}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-N.Jx("").xH("_buildCallersTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","geF",0,0,114,"_buildCallersTree"],
+N.Jx("").xH("_buildCallersTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","geF",0,0,116,"_buildCallersTree"],
 EX:[function(a){var z,y,x,w,v
 z=J.QP(a.pD).gBC()
 if(z==null)N.Jx("").j2("No profile trie root.")
 try{a.Hm.rT(X.SJ(a.pD,z,z,null))}catch(w){v=H.Ru(w)
 y=v
 x=new H.XO(w,null)
-N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","gzo",0,0,114,"_buildStackTree"],
+N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","gzo",0,0,116,"_buildStackTree"],
 ba:[function(a){var z=a.Kx
 if(z!=null&&z===!0)this.QI(a)
-else this.EX(a)},"call$0","gvr",0,0,114,"_buildTree"],
-ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,531,375,[],"padding",366],
+else this.EX(a)},"call$0","gvr",0,0,116,"_buildTree"],
+ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,423,424,[],"padding",301],
 ZZ:[function(a,b){var z=J.bY(b.gyt(),5)
 if(z>>>0!==z||z>=5)return H.e(C.PQ,z)
-return C.PQ[z]},"call$1","gth",2,0,531,375,[],"coloring",366],
+return C.PQ[z]},"call$1","gth",2,0,423,424,[],"coloring",301],
 YF:[function(a,b,c,d){var z,y,x
-z=J.u3(d)
-if(!!J.x(z).$isqp){y=a.Hm
-x=z.rowIndex
+z=J.RE(b)
+if(!J.de(J.F8(z.gN(b)),"expand")&&!J.de(z.gN(b),d))return
+y=J.u3(d)
+if(!!J.x(y).$isqp){z=a.Hm
+x=y.rowIndex
 if(typeof x!=="number")return x.W()
-y.qU(x-1)}},"call$3","gpR",6,0,532,21,[],310,[],79,[],"toggleExpanded",366],
+z.qU(x-1)}},"call$3","gpR",6,0,425,21,[],334,[],81,[],"toggleExpanded",301],
 "@":function(){return[C.jR]},
-static:{"^":"B6<-82",jD:[function(a){var z,y,x,w
+static:{"^":"B6<-84",jD:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.eH=""
-a.vk=""
+a.NT=""
 a.Xv=""
 a.M5=""
 a.ik=""
@@ -10574,24 +10782,24 @@
 a.X0=w
 C.kS.ZL(a)
 C.kS.oX(a)
-return a},null,null,0,0,115,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[533],
+return a},null,null,0,0,117,"new IsolateProfileElement$created"]}},
+"+IsolateProfileElement":[426],
 V9:{
 "^":"uL+Pi;",
 $isd3:true},
 SV:{
-"^":"Tp:386;a-82",
+"^":"Tp:317;a-84",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,386,190,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,317,192,[],"call"],
 $isEH:true},
-"+ SV":[498]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+"+ SV":[387]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oO:{
-"^":["xI;tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.X0]},
-static:{Qm:[function(a){var z,y,x,w
+static:{Zgg:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -10603,13 +10811,13 @@
 a.X0=w
 C.LN.ZL(a)
 C.LN.oX(a)
-return a},null,null,0,0,115,"new IsolateRefElement$created"]}},
-"+IsolateRefElement":[391]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+return a},null,null,0,0,117,"new IsolateRefElement$created"]}},
+"+IsolateRefElement":[322]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
-Kz:{
-"^":["V10;Pw%-534,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,364,"isolate",365,385],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,367,30,[],"isolate",365],
+fl:{
+"^":["V10;Pw%-427,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,299,"isolate",300,316],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,302,30,[],"isolate",300],
 "@":function(){return[C.aM]},
 static:{N5:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10622,15 +10830,15 @@
 a.X0=w
 C.Qt.ZL(a)
 C.Qt.oX(a)
-return a},null,null,0,0,115,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[535],
+return a},null,null,0,0,117,"new IsolateSummaryElement$created"]}},
+"+IsolateSummaryElement":[428],
 V10:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
 Lr:{
 "^":"a;hO,Pl",
-eC:[function(a){var z,y,x,w,v,u,t,s,r,q,p
+eC:function(a){var z,y,x,w,v,u,t,s,r,q,p
 z=this.hO.Yb
 if(J.de(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
 for(y=a.gaf(),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=y.lo
@@ -10651,49 +10859,51 @@
 if(r===0){q=0
 while(!0){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].ghw().length))break
+y=J.q8(y[u].ghw())
+if(typeof y!=="number")return H.s(y)
+if(!(q<y))break
 c$1:{if(q===w)break c$1
 s.push(0)}++q}}else{q=0
 while(!0){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].ghw().length))break
+y=J.q8(y[u].ghw())
+if(typeof y!=="number")return H.s(y)
+if(!(q<y))break
 c$1:{if(q===w)break c$1
 y=a.glI()
 if(u>=y.length)return H.e(y,u)
-y=y[u].ghw()
-if(q>=y.length)return H.e(y,q)
-s.push(C.CD.yu(J.FW(y[q],r)*100))}++q}}y=[]
+s.push(C.CD.yu(J.FW(J.UQ(y[u].ghw(),q),r)*100))}++q}}y=[]
 p=new H.A8(s,P.En())
 p.$builtinTypeInfo=[null,null]
 C.Nm.FV(y,p)
 y=new P.Tz(y)
 y.$builtinTypeInfo=[null]
-z.V7("addRow",[y])}},"call$1","gpn",2,0,null,536,[]],
-W2:[function(a){var z,y
+z.V7("addRow",[y])}},
+W2:function(a){var z,y
 if(this.Pl==null){z=P.L5(null,null,null,null,null)
 y=new G.qu(null,z)
 y.vR=P.zV(J.UQ($.NR,"SteppedAreaChart"),[a])
 this.Pl=y
 z.u(0,"isStacked",!0)
 this.Pl.bG.u(0,"connectSteps",!1)
-this.Pl.bG.u(0,"vAxis",H.B7(["minValue",0,"maxValue",100],P.L5(null,null,null,null,null)))}this.Pl.W2(this.hO)},"call$1","gnS",2,0,null,132,[]]},
+this.Pl.bG.u(0,"vAxis",H.B7(["minValue",0,"maxValue",100],P.L5(null,null,null,null,null)))}this.Pl.W2(this.hO)}},
 qkb:{
-"^":["V11;oY%-534,ts%-537,e6%-538,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.oY},null,null,1,0,364,"isolate",365,385],
-sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,367,30,[],"isolate",365],
+"^":["V11;oY%-427,ts%-429,e6%-430,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.oY},null,null,1,0,299,"isolate",300,316],
+sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,302,30,[],"isolate",300],
 vV:[function(a,b){var z=a.oY
-return z.ox(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,392,212,[],"eval"],
-Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"call$0","gjB",0,0,114,"_updateTagProfile"],
+return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,323,214,[],"eval"],
+Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"call$0","gjB",0,0,116,"_updateTagProfile"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"call$0","gQd",0,0,114,"enteredView"],
+a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"call$0","gQd",0,0,116,"enteredView"],
 xo:[function(a){var z
 Z.uL.prototype.xo.call(this,a)
 z=a.ts
-if(z!=null)z.ed()},"call$0","gbt",0,0,114,"leftView"],
+if(z!=null)z.ed()},"call$0","gbt",0,0,116,"leftView"],
 Ob:[function(a){var z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#tagProfileChart")
-if(z!=null)a.e6.W2(z)},"call$0","gPE",0,0,114,"_drawTagProfileChart"],
-pA:[function(a,b){J.am(a.oY).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
-lp:[function(a,b,c,d){a.oY.ox("resume").ml(new L.IT(a))},"call$3","gDQ",6,0,404,131,[],187,[],280,[],"resume"],
+if(z!=null)a.e6.W2(z)},"call$0","gPE",0,0,116,"_drawTagProfileChart"],
+pA:[function(a,b){J.am(a.oY).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
+xU:[function(a,b,c,d){a.oY.cv("resume").ml(new L.IT(a))},"call$3","gDQ",6,0,336,133,[],189,[],282,[],"resume"],
 "@":function(){return[C.fO]},
 static:{uD:[function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.NR,"DataTable"),null)
@@ -10708,52 +10918,120 @@
 a.X0=v
 C.Xe.ZL(a)
 C.Xe.oX(a)
-return a},null,null,0,0,115,"new IsolateViewElement$created"]}},
-"+IsolateViewElement":[539],
+return a},null,null,0,0,117,"new IsolateViewElement$created"]}},
+"+IsolateViewElement":[431],
 V11:{
 "^":"uL+Pi;",
 $isd3:true},
 BQ:{
-"^":"Tp:112;a-82",
+"^":"Tp:114;a-84",
 call$1:[function(a){var z,y,x
 z=this.a
 y=J.RE(z)
 y.ge6(z).eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
 if(x!=null)y.ge6(z).W2(x)
-y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"call$1",null,2,0,112,536,[],"call"],
+y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"call$1",null,2,0,114,432,[],"call"],
 $isEH:true},
-"+ BQ":[498],
+"+ BQ":[387],
 IT:{
-"^":"Tp:112;a-82",
-call$1:[function(a){J.am(J.Ag(this.a))},"call$1",null,2,0,112,56,[],"call"],
+"^":"Tp:114;a-84",
+call$1:[function(a){J.am(J.Ag(this.a))},"call$1",null,2,0,114,56,[],"call"],
 $isEH:true},
-"+ IT":[498]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+"+ IT":[387]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
+fM:{
+"^":"a;Fv,lp",
+KN:function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+z=this.lp
+if(z.tg(0,a))return
+z.h(0,a)
+for(y=J.GP(a.gvc()),x=this.Fv,w=J.U6(a),v=b+1;y.G();){u=y.gl()
+t=w.t(a,u)
+s=J.x(t)
+if(!!s.$isZ0){if(typeof "  "!=="number")return H.s("  ")
+r=b*"  "
+s=typeof r==="string"
+q=s?r:H.d(r)
+x.vM=x.vM+q
+p="\""+H.d(u)+"\": {\n"
+x.vM=x.vM+p
+this.KN(t,v)
+r=s?r:H.d(r)
+s=x.vM+r
+x.vM=s
+x.vM=s+"}\n"}else if(!!s.$isList){if(typeof "  "!=="number")return H.s("  ")
+r=b*"  "
+s=typeof r==="string"
+q=s?r:H.d(r)
+x.vM=x.vM+q
+p="\""+H.d(u)+"\": [\n"
+x.vM=x.vM+p
+this.lG(t,v)
+r=s?r:H.d(r)
+s=x.vM+r
+x.vM=s
+x.vM=s+"]\n"}else{if(typeof "  "!=="number")return H.s("  ")
+r=b*"  "
+r=typeof r==="string"?r:H.d(r)
+x.vM=x.vM+r
+s="\""+H.d(u)+"\": "+H.d(t)
+s=x.vM+s
+x.vM=s
+x.vM=s+"\n"}}z.Rz(0,a)},
+lG:function(a,b){var z,y,x,w,v,u,t,s,r
+z=this.lp
+if(z.tg(0,a))return
+z.h(0,a)
+for(y=J.GP(a),x=this.Fv,w=b+1;y.G();){v=y.gl()
+u=J.x(v)
+if(!!u.$isZ0){if(typeof "  "!=="number")return H.s("  ")
+t=b*"  "
+u=typeof t==="string"
+s=u?t:H.d(t)
+r=x.vM+s
+x.vM=r
+x.vM=r+"{\n"
+this.KN(v,w)
+t=u?t:H.d(t)
+u=x.vM+t
+x.vM=u
+x.vM=u+"}\n"}else if(!!u.$isList){if(typeof "  "!=="number")return H.s("  ")
+t=b*"  "
+u=typeof t==="string"
+s=u?t:H.d(t)
+r=x.vM+s
+x.vM=r
+x.vM=r+"[\n"
+this.lG(v,w)
+t=u?t:H.d(t)
+u=x.vM+t
+x.vM=u
+x.vM=u+"]\n"}else{if(typeof "  "!=="number")return H.s("  ")
+t=b*"  "
+t=typeof t==="string"?t:H.d(t)
+x.vM=x.vM+t
+t=typeof v==="string"?v:H.d(v)
+u=x.vM+t
+x.vM=u
+x.vM=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":["V12;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gvL:[function(a){return a.eb},null,null,1,0,115,"json",365,385],
-svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,30,[],"json",365],
-i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.kf=0},"call$0","gQd",0,0,114,"enteredView"],
-yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,157,230,[],"jsonChanged"],
-gf0c:[function(a){return J.AG(a.eb)},null,null,1,0,370,"primitiveString"],
-gmm:[function(a){var z=J.x(a.eb)
-if(!!z.$isZ0)return"Map"
-else if(!!z.$isList)return"List"
-return"Primitive"},null,null,1,0,370,"valueType"],
-gkG:[function(a){var z=a.kf
-a.kf=J.WB(z,1)
-return z},null,null,1,0,540,"counter"],
-go6:[function(a){var z=a.eb
-if(!!J.x(z).$isList)return z
-return[]},null,null,1,0,541,"list"],
-gvc:[function(a){var z,y
-z=a.eb
-y=J.x(z)
-if(!!y.$isZ0)return J.qA(y.gvc(z))
-return[]},null,null,1,0,541,"keys"],
-r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,32,48,[],"value"],
+"^":["V12;OZ%-313,X7%-329,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gIr:[function(a){return a.OZ},null,null,1,0,315,"map",300,316],
+ez:function(a,b){return this.gIr(a).call$1(b)},
+sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,317,30,[],"map",300],
+gdQ:[function(a){return a.X7},null,null,1,0,305,"mapAsString",300,301],
+sdQ:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,32,30,[],"mapAsString",300],
+oC:[function(a,b){var z,y,x
+z=P.p9("")
+y=P.Ls(null,null,null,null)
+x=a.OZ
+z.vM=""
+z.KF("{\n")
+new Z.fM(z,y).KN(x,0)
+z.KF("}\n")
+z=z.vM
+a.X7=this.ct(a,C.t6,a.X7,z)},"call$1","gar",2,0,159,232,[],"mapChanged"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10761,21 +11039,19 @@
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.eb=null
-a.kf=0
 a.SO=z
 a.B7=y
 a.X0=w
 C.Yt.ZL(a)
 C.Yt.oX(a)
-return a},null,null,0,0,115,"new JsonViewElement$created"]}},
-"+JsonViewElement":[542],
+return a},null,null,0,0,117,"new JsonViewElement$created"]}},
+"+JsonViewElement":[433],
 V12:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.uy]},
 static:{rA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10789,15 +11065,15 @@
 a.X0=w
 C.Z3.ZL(a)
 C.Z3.oX(a)
-return a},null,null,0,0,115,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[391]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+return a},null,null,0,0,117,"new LibraryRefElement$created"]}},
+"+LibraryRefElement":[322]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 KL:{
-"^":["V13;N7%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.N7},null,null,1,0,384,"library",365,385],
-stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,386,30,[],"library",365],
-vV:[function(a,b){return J.QP(a.N7).ox(J.WB(J.F8(a.N7),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,392,212,[],"eval"],
-pA:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+"^":["V13;N7%-313,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.N7},null,null,1,0,315,"library",300,316],
+stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,317,30,[],"library",300],
+vV:[function(a,b){return J.QP(a.N7).cv(J.WB(J.F8(a.N7),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,323,214,[],"eval"],
+pA:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 "@":function(){return[C.Oyb]},
 static:{Ro:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10810,8 +11086,8 @@
 a.X0=w
 C.MG.ZL(a)
 C.MG.oX(a)
-return a},null,null,0,0,115,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[543],
+return a},null,null,0,0,117,"new LibraryViewElement$created"]}},
+"+LibraryViewElement":[434],
 V13:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
@@ -10831,8 +11107,8 @@
 else{if(this.eT!=null)throw H.b(P.f("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."))
 $.Y4=a}},
 gSZ:function(){return this.IE()},
-Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,30,[]],
-Y6:[function(a,b,c,d){var z,y,x,w,v
+Im:function(a){return a.P>=this.gOR().P},
+Y6:function(a,b,c,d){var z,y,x,w,v
 if(a.P>=this.gOR().P){z=this.gB8()
 y=new P.iP(Date.now(),!1)
 y.EK()
@@ -10841,25 +11117,30 @@
 w=new N.HV(a,b,z,y,x,c,d)
 if($.RL)for(v=this;v!=null;){z=J.RE(v)
 z.od(v,w)
-v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,82,82,544,[],24,[],159,[],160,[]],
-X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,24,[],159,[],160,[]],
-dL:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.dL(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,24,[],159,[],160,[]],
-ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,24,[],159,[],160,[]],
-xH:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.xH(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,24,[],159,[],160,[]],
-WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,24,[],159,[],160,[]],
-IE:[function(){if($.RL||this.eT==null){var z=this.Gs
+v=z.geT(v)}else J.EY(N.Jx(""),w)}},
+X2:function(a,b,c){return this.Y6(C.VZ,a,b,c)},
+x9:function(a){return this.X2(a,null,null)},
+dL:function(a,b,c){return this.Y6(C.R5,a,b,c)},
+J4:function(a){return this.dL(a,null,null)},
+ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
+To:function(a){return this.ZG(a,null,null)},
+xH:function(a,b,c){return this.Y6(C.UP,a,b,c)},
+j2:function(a){return this.xH(a,null,null)},
+WB:function(a,b,c){return this.Y6(C.cV,a,b,c)},
+hh:function(a){return this.WB(a,null,null)},
+IE:function(){if($.RL||this.eT==null){var z=this.Gs
 if(z==null){z=P.bK(null,null,!0,N.HV)
 this.Gs=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.Jx("").IE()},"call$0","gnc",0,0,null],
-od:[function(a,b){var z=this.Gs
+return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.Jx("").IE()},
+od:function(a,b){var z=this.Gs
 if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(b)}},"call$1","gBq",2,0,null,29,[]],
+z.Iv(b)}},
 QL:function(a,b,c){var z=this.eT
 if(z!=null)J.Tr(z).u(0,this.oc,this)},
 $isTJ:true,
 static:{"^":"DY",Jx:function(a){return $.U0().to(a,new N.dG(a))}}},
 dG:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(new P.AT("name shouldn't start with a '.'"))
@@ -10873,31 +11154,30 @@
 $isEH:true},
 qV:{
 "^":"a;oc>,P>",
-r6:function(a,b){return this.P.call$1(b)},
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
-C:[function(a,b){var z=J.Vm(b)
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isqV&&this.P===b.P},
+C:function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P<z},"call$1","gix",2,0,null,109,[]],
-E:[function(a,b){var z=J.Vm(b)
+return this.P<z},
+E:function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P<=z},"call$1","gER",2,0,null,109,[]],
-D:[function(a,b){var z=J.Vm(b)
+return this.P<=z},
+D:function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P>z},"call$1","gh1",2,0,null,109,[]],
-F:[function(a,b){var z=J.Vm(b)
+return this.P>z},
+F:function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P>=z},"call$1","gNH",2,0,null,109,[]],
-iM:[function(a,b){var z=J.Vm(b)
+return this.P>=z},
+iM:function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
-return this.P-z},"call$1","gYc",2,0,null,109,[]],
+return this.P-z},
 giO:function(a){return this.P},
-bu:[function(a){return this.oc},"call$0","gXo",0,0,null],
+bu:function(a){return this.oc},
 $isqV:true,
 static:{"^":"V7K,tmj,EL,LkO,reI,pd,Wr,MHK,ow,lM,B9"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
-bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},"call$0","gXo",0,0,null],
+bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
 $isHV:true,
 static:{"^":"xO"}}}],["","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
 "^":"",
@@ -10909,14 +11189,14 @@
 J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(H.B7(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],P.L5(null,null,null,null,null)))])
 z.MM.ml(G.vN()).ml(new F.Lb())},"call$0","qg",0,0,null],
 em:{
-"^":"Tp:546;",
-call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,545,[],"call"],
+"^":"Tp:436;",
+call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.z2(a)))},"call$1",null,2,0,null,435,[],"call"],
 $isEH:true},
 Lb:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){N.Jx("").To("Initializing Polymer")
-A.Ok()},"call$1",null,2,0,null,113,[],"call"],
-$isEH:true}}],["metadata","file:///usr/local/google/home/johnmccutchan/dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
+A.Ok()},"call$1",null,2,0,null,115,[],"call"],
+$isEH:true}}],["metadata","file:///usr/local/google/home/johnmccutchan/workspace/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
 jh:{
 "^":"a;T9,Bu",
@@ -10931,7 +11211,7 @@
 "^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 F1:{
-"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["uL;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.nW]},
 static:{aD:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10944,16 +11224,16 @@
 a.X0=w
 C.kD.ZL(a)
 C.kD.oX(a)
-return a},null,null,0,0,115,"new NavBarElement$created"]}},
-"+NavBarElement":[547],
+return a},null,null,0,0,117,"new NavBarElement$created"]}},
+"+NavBarElement":[437],
 aQ:{
-"^":["V14;KU%-398,V4%-398,Jo%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,370,"link",365,385],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",365],
-gdU:[function(a){return a.V4},null,null,1,0,370,"anchor",365,385],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",365],
-grZ:[function(a){return a.Jo},null,null,1,0,399,"last",365,385],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,400,30,[],"last",365],
+"^":["V14;KU%-329,V4%-329,Jo%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,305,"link",300,316],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",300],
+gdU:[function(a){return a.V4},null,null,1,0,305,"anchor",300,316],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",300],
+grZ:[function(a){return a.Jo},null,null,1,0,330,"last",300,316],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,331,30,[],"last",300],
 "@":function(){return[C.u7]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10969,17 +11249,17 @@
 a.X0=w
 C.SU.ZL(a)
 C.SU.oX(a)
-return a},null,null,0,0,115,"new NavMenuElement$created"]}},
-"+NavMenuElement":[548],
+return a},null,null,0,0,117,"new NavMenuElement$created"]}},
+"+NavMenuElement":[438],
 V14:{
 "^":"uL+Pi;",
 $isd3:true},
 Qa:{
-"^":["V15;KU%-398,V4%-398,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,370,"link",365,385],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",365],
-gdU:[function(a){return a.V4},null,null,1,0,370,"anchor",365,385],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",365],
+"^":["V15;KU%-329,V4%-329,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,305,"link",300,316],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",300],
+gdU:[function(a){return a.V4},null,null,1,0,305,"anchor",300,316],
+sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",300],
 "@":function(){return[C.nh]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10994,26 +11274,26 @@
 a.X0=w
 C.nn.ZL(a)
 C.nn.oX(a)
-return a},null,null,0,0,115,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[549],
+return a},null,null,0,0,117,"new NavMenuItemElement$created"]}},
+"+NavMenuItemElement":[439],
 V15:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":["V16;rU%-82,SB%-390,Hq%-398,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFR:[function(a){return a.rU},null,null,1,0,115,"callback",365,385],
+"^":["V16;rU%-84,SB%-321,Hq%-329,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFR:[function(a){return a.rU},null,null,1,0,117,"callback",300,316],
 Ki:function(a){return this.gFR(a).call$0()},
 VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,30,[],"callback",365],
-gxw:[function(a){return a.SB},null,null,1,0,399,"active",365,385],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,400,30,[],"active",365],
-gph:[function(a){return a.Hq},null,null,1,0,370,"label",365,385],
-sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,32,30,[],"label",365],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,114,30,[],"callback",300],
+gxw:[function(a){return a.SB},null,null,1,0,330,"active",300,316],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,331,30,[],"active",300],
+gph:[function(a){return a.Hq},null,null,1,0,305,"label",300,316],
+sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,32,30,[],"label",300],
 Ty:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gyr",6,0,402,21,[],310,[],79,[],"buttonClick"],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,114,"refreshDone"],
+if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gyr",6,0,333,21,[],334,[],81,[],"buttonClick"],
+ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,116,"refreshDone"],
 "@":function(){return[C.XG]},
 static:{zN:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11028,15 +11308,15 @@
 a.X0=w
 C.J7.ZL(a)
 C.J7.oX(a)
-return a},null,null,0,0,115,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[550],
+return a},null,null,0,0,117,"new NavRefreshElement$created"]}},
+"+NavRefreshElement":[440],
 V16:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["V17;Jo%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,399,"last",365,385],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,400,30,[],"last",365],
+"^":["V17;Jo%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,330,"last",300,316],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,331,30,[],"last",300],
 "@":function(){return[C.hr]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11050,17 +11330,17 @@
 a.X0=w
 C.lx.ZL(a)
 C.lx.oX(a)
-return a},null,null,0,0,115,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[551],
+return a},null,null,0,0,117,"new TopNavMenuElement$created"]}},
+"+TopNavMenuElement":[441],
 V17:{
 "^":"uL+Pi;",
 $isd3:true},
-fl:{
-"^":["V18;Jo%-390,iy%-534,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,399,"last",365,385],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,400,30,[],"last",365],
-gF1:[function(a){return a.iy},null,null,1,0,364,"isolate",365,385],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,367,30,[],"isolate",365],
+Mv:{
+"^":["V18;Jo%-321,iy%-427,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,330,"last",300,316],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,331,30,[],"last",300],
+gF1:[function(a){return a.iy},null,null,1,0,299,"isolate",300,316],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,302,30,[],"isolate",300],
 "@":function(){return[C.zaS]},
 static:{Du:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11074,17 +11354,17 @@
 a.X0=w
 C.RR.ZL(a)
 C.RR.oX(a)
-return a},null,null,0,0,115,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[552],
+return a},null,null,0,0,117,"new IsolateNavMenuElement$created"]}},
+"+IsolateNavMenuElement":[442],
 V18:{
 "^":"uL+Pi;",
 $isd3:true},
 Zt:{
-"^":["V19;Ap%-382,Jo%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.Ap},null,null,1,0,384,"library",365,385],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,386,30,[],"library",365],
-grZ:[function(a){return a.Jo},null,null,1,0,399,"last",365,385],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,400,30,[],"last",365],
+"^":["V19;Ap%-313,Jo%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.Ap},null,null,1,0,315,"library",300,316],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,317,30,[],"library",300],
+grZ:[function(a){return a.Jo},null,null,1,0,330,"last",300,316],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,331,30,[],"last",300],
 "@":function(){return[C.KI]},
 static:{fg:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11098,17 +11378,17 @@
 a.X0=w
 C.ct.ZL(a)
 C.ct.oX(a)
-return a},null,null,0,0,115,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[553],
+return a},null,null,0,0,117,"new LibraryNavMenuElement$created"]}},
+"+LibraryNavMenuElement":[443],
 V19:{
 "^":"uL+Pi;",
 $isd3:true},
 wM:{
-"^":["V20;Au%-382,Jo%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.Au},null,null,1,0,384,"cls",365,385],
-sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,386,30,[],"cls",365],
-grZ:[function(a){return a.Jo},null,null,1,0,399,"last",365,385],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,400,30,[],"last",365],
+"^":["V20;Au%-313,Jo%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gdG:[function(a){return a.Au},null,null,1,0,315,"cls",300,316],
+sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,317,30,[],"cls",300],
+grZ:[function(a){return a.Jo},null,null,1,0,330,"last",300,316],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,331,30,[],"last",300],
 "@":function(){return[C.qJ]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11122,30 +11402,30 @@
 a.X0=w
 C.ae.ZL(a)
 C.ae.oX(a)
-return a},null,null,0,0,115,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[554],
+return a},null,null,0,0,117,"new ClassNavMenuElement$created"]}},
+"+ClassNavMenuElement":[444],
 V20:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 lI:{
-"^":["V21;k5%-390,Oe%-555,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzj:[function(a){return a.k5},null,null,1,0,399,"devtools",365,385],
-szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,400,30,[],"devtools",365],
-guw:[function(a){return a.Oe},null,null,1,0,556,"app",365,366],
-suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,557,30,[],"app",365],
+"^":["V21;k5%-321,Oe%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,330,"devtools",300,316],
+szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,331,30,[],"devtools",300],
+guw:[function(a){return a.Oe},null,null,1,0,446,"app",300,301],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,447,30,[],"app",300],
 ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null)
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.PI()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.hq()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null)
+a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
-z.aq()
+z.SC()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.US()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,115,"created"],
+a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,117,"created"],
 "@":function(){return[C.bd]},
 static:{fv:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11160,19 +11440,19 @@
 C.k0.ZL(a)
 C.k0.oX(a)
 C.k0.ZB(a)
-return a},null,null,0,0,115,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[558],
+return a},null,null,0,0,117,"new ObservatoryApplicationElement$created"]}},
+"+ObservatoryApplicationElement":[448],
 V21:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,114,"enteredView"],
-xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,114,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,559,12,[],230,[],231,[],"attributeChanged"],
-gpQ:[function(a){return!0},null,null,1,0,399,"applyAuthorStyles"],
-OZ:[function(a,b){var z,y,x,w
+"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,116,"enteredView"],
+xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,116,"leftView"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,449,12,[],232,[],233,[],"attributeChanged"],
+gpQ:[function(a){return!0},null,null,1,0,330,"applyAuthorStyles"],
+Kn:[function(a,b){var z,y,x,w
 if(b==null)return"-"
 z=J.LL(J.vX(b,1000))
 y=C.jn.cU(z,3600000)
@@ -11181,7 +11461,7 @@
 z=C.jn.Y(z,60000)
 w=C.jn.cU(z,1000)
 z=C.jn.Y(z,1000)
-return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gjC",2,0,560,561,[],"formatTimePrecise"],
+return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gjC",2,0,450,451,[],"formatTimePrecise"],
 Om:[function(a,b){var z,y,x,w
 if(b==null)return"-"
 z=J.LL(J.vX(b,1000))
@@ -11192,31 +11472,31 @@
 P.p9("")
 if(y!==0)return""+y+"h "+x+"m "+w+"s"
 if(x!==0)return""+x+"m "+w+"s"
-return""+w+"s"},"call$1","gSs",2,0,560,561,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,560,28,[],"formatSeconds"],
+return""+w+"s"},"call$1","gSs",2,0,450,451,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,450,28,[],"formatSeconds"],
 Ze:[function(a,b){var z=J.Wx(b)
 if(z.C(b,1024))return H.d(b)+"B"
 else if(z.C(b,1048576))return""+C.CD.yu(C.CD.UD(z.V(b,1024)))+"KB"
 else if(z.C(b,1073741824))return""+C.CD.yu(C.CD.UD(z.V(b,1048576)))+"MB"
 else if(z.C(b,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(b,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,424,562,[],"formatSize"],
+else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,348,452,[],"formatSize"],
 at:[function(a,b){var z,y,x
 z=J.U6(b)
 y=J.UQ(z.t(b,"script"),"user_name")
 x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,563,564,[],"fileAndLine"],
-b1:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,565,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,565,11,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,453,454,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,455,11,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,455,11,[],"isError"],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gKo",2,0,565,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,565,11,[],"isBool"],
-ff:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,565,11,[],"isString"],
-rW:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,565,11,[],"isInstance"],
-F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,565,11,[],"isClosure"],
-JG:[function(a,b){return J.de(b,"Double")},"call$1","gmL",2,0,565,11,[],"isDouble"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gKo",2,0,455,11,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,455,11,[],"isBool"],
+ff:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,455,11,[],"isString"],
+rW:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,455,11,[],"isInstance"],
+JG:[function(a,b){return J.de(b,"Double")},"call$1","gUu",2,0,455,11,[],"isDouble"],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,565,11,[],"isList"],
-Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Double","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,565,11,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,455,11,[],"isList"],
+tR:[function(a,b){return J.de(b,"Type")},"call$1","gqNn",2,0,455,11,[],"isType"],
+Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"call$1","gaE",2,0,455,11,[],"isUnexpected"],
 "@":function(){return[C.Br]},
 static:{ew:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11229,12 +11509,12 @@
 a.X0=w
 C.Pf.ZL(a)
 C.Pf.oX(a)
-return a},null,null,0,0,115,"new ObservatoryElement$created"],Ce:[function(a,b){var z,y,x,w
+return a},null,null,0,0,117,"new ObservatoryElement$created"],Ce:[function(a,b){var z,y,x,w
 for(z=J.Wx(a),y="";x=J.Wx(b),x.D(b,1);){w=x.W(b,1)
 if(typeof w!=="number")H.vh(new P.AT(w))
 if(z.C(a,Math.pow(10,w)))y+="0"
-b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,242,30,[],243,[],"_zeroPad"]}},
-"+ObservatoryElement":[566]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,244,30,[],245,[],"_zeroPad"]}},
+"+ObservatoryElement":[456]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -11243,42 +11523,41 @@
 z=P.bK(this.gl1(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"call$0","gqw",0,0,114],
-ni:[function(a){a.AP=null},"call$0","gl1",0,0,114],
+k0:[function(a){},"call$0","gqw",0,0,116],
+ni:[function(a){a.AP=null},"call$0","gl1",0,0,116],
 BN:[function(a){var z,y,x
-z=a.Lk
-a.Lk=null
+z=a.fn
+a.fn=null
 if(this.gnz(a)&&z!=null){y=a.AP
-x=H.VM(new P.Yp(z),[T.z2])
+x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"call$0","gDx",0,0,399],
+return!0}return!1},"call$0","gDx",0,0,330],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gyWA",6,0,null,256,[],230,[],231,[]],
-nq:[function(a,b){if(!this.gnz(a))return
-if(a.Lk==null){a.Lk=[]
-P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,29,[]],
+ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
+nq:function(a,b){if(!this.gnz(a))return
+if(a.fn==null){a.fn=[]
+P.rb(this.gDx(a))}a.fn.push(b)},
 $isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
 "^":"",
-z2:{
+yj:{
 "^":"a;",
-$isz2:true},
+$isyj:true},
 qI:{
-"^":"z2;WA>,oc>,jL>,zZ>",
-bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"call$0","gXo",0,0,null],
+"^":"yj;WA>,oc>,jL>,zZ>",
+bu:function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
 $isqI:true}}],["observe.src.compound_path_observer","package:observe/src/compound_path_observer.dart",,Y,{
 "^":"",
 J3:{
-"^":"Pi;b9,kK,Sv,rk,YX,B6,AP,Lk",
+"^":"Pi;b9,kK,Sv,rk,YX,B6,AP,fn",
 kb:function(a){return this.rk.call$1(a)},
 gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,115,"value",365],
-r6:function(a,b){return this.gP(this).call$1(b)},
-wE:[function(a){var z,y,x,w,v
+gP:[function(a){return this.Sv},null,null,1,0,117,"value",300],
+wE:function(a){var z,y,x,w,v
 if(this.YX)return
 this.YX=!0
 z=this.geu()
@@ -11287,30 +11566,30 @@
 w.dB=v.cR(z)
 w.o7=P.VH(P.AY(),v)
 w.Bd=v.Al(P.v3())
-x.push(w)}this.Ow()},"call$0","gM",0,0,null],
+x.push(w)}this.Ow()},
 TF:[function(a){if(this.B6)return
 this.B6=!0
-P.rb(this.gMc())},"call$1","geu",2,0,157,113,[]],
+P.rb(this.gMc())},"call$1","geu",2,0,159,115,[]],
 Ow:[function(){var z,y
 this.B6=!1
 z=this.b9
 if(z.length===0)return
 y=H.VM(new H.A8(z,new Y.E5()),[null,null]).br(0)
 if(this.rk!=null)y=this.kb(y)
-this.Sv=F.Wi(this,C.ls,this.Sv,y)},"call$0","gMc",0,0,114],
-cO:[function(a){var z,y
+this.Sv=F.Wi(this,C.ls,this.Sv,y)},"call$0","gMc",0,0,116],
+cO:function(a){var z,y
 z=this.b9
 if(z.length===0)return
 if(this.YX)for(y=this.kK,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)y.lo.ed()
 C.Nm.sB(z,0)
 C.Nm.sB(this.kK,0)
-this.Sv=null},"call$0","gJK",0,0,null],
-k0:[function(a){return this.wE(0)},"call$0","gqw",0,0,115],
-ni:[function(a){return this.cO(0)},"call$0","gl1",0,0,115],
+this.Sv=null},
+k0:[function(a){return this.wE(0)},"call$0","gqw",0,0,117],
+ni:[function(a){return this.cO(0)},"call$0","gl1",0,0,117],
 $isJ3:true},
 E5:{
-"^":"Tp:112;",
-call$1:[function(a){return J.Vm(a)},"call$1",null,2,0,null,96,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return J.Vm(a)},"call$1",null,2,0,null,98,[],"call"],
 $isEH:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
 Y3:[function(){var z,y,x,w,v,u,t,s,r,q
@@ -11340,34 +11619,34 @@
 z=new O.o5(z)
 return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"call$0","Zq",0,0,null],
 o5:{
-"^":"Tp:567;a",
+"^":"Tp:457;a",
 call$2:[function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
-a.RK(b,new O.b5(z))},"call$2",null,4,0,null,169,[],153,[],"call"],
+a.RK(b,new O.b5(z))},"call$2",null,4,0,null,171,[],155,[],"call"],
 $isEH:true},
 b5:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){this.a.a=!1
 O.Y3()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"Tp:170;b",
+"^":"Tp:172;b",
 call$4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"call$4",null,8,0,null,168,[],169,[],153,[],117,[],"call"],
+return new O.Zb(this.b,b,c,d)},"call$4",null,8,0,null,170,[],171,[],155,[],119,[],"call"],
 $isEH:true},
 Zb:{
-"^":"Tp:115;c,d,e,f",
+"^":"Tp:117;c,d,e,f",
 call$0:[function(){this.c.call$2(this.d,this.e)
 return this.f.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 id:{
-"^":"Tp:568;UI",
+"^":"Tp:458;UI",
 call$4:[function(a,b,c,d){if(d==null)return d
-return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,168,[],169,[],153,[],117,[],"call"],
+return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,170,[],171,[],155,[],119,[],"call"],
 $isEH:true},
 iV:{
-"^":"Tp:112;bK,Gq,Rm,w3",
+"^":"Tp:114;bK,Gq,Rm,w3",
 call$1:[function(a){this.bK.call$2(this.Gq,this.Rm)
 return this.w3.call$1(a)},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
@@ -11396,7 +11675,7 @@
 l=J.WB(J.UQ(m,t),1)
 if(v>=w)return H.e(x,v)
 k=J.WB(J.UQ(x[v],n),1)
-J.kW(x[v],t,P.J(l,k))}}return x},"call$6","cL",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
+J.kW(x[v],t,P.J(l,k))}}return x},"call$6","cL",12,0,null,246,[],247,[],248,[],249,[],250,[],251,[]],
 Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p
 z=a.length
 y=z-1
@@ -11424,10 +11703,10 @@
 w=r
 y=t}else{v.push(2)
 x=u.W(x,1)
-w=q}}}return H.VM(new H.iK(v),[null]).br(0)},"call$1","fZ",2,0,null,250,[]],
+w=q}}}return H.VM(new H.iK(v),[null]).br(0)},"call$1","fZ",2,0,null,252,[]],
 rB:[function(a,b,c){var z,y,x
 for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},"call$3","UF",6,0,null,251,[],252,[],253,[]],
+return c},"call$3","QI",6,0,null,253,[],254,[],255,[]],
 xU:[function(a,b,c){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
@@ -11438,7 +11717,7 @@
 u=z.t(a,y)
 w=J.xH(w,1)
 u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},"call$3","M9",6,0,null,251,[],252,[],253,[]],
+if(!u)break;++v}return v},"call$3","M9",6,0,null,253,[],254,[],255,[]],
 jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.Wx(c)
 y=J.Wx(f)
@@ -11487,7 +11766,7 @@
 y.$builtinTypeInfo=[null]
 s=new G.DA(a,y,t,n,0)}J.bi(s.Il,z.t(d,o));++o
 break}if(s!=null)p.push(s)
-return p},"call$6","mu",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
+return p},"call$6","mu",12,0,null,246,[],247,[],248,[],249,[],250,[],251,[]],
 m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.RE(b)
 y=z.gWA(b)
@@ -11528,11 +11807,11 @@
 q.sjr(J.WB(q.gjr(),m))
 if(typeof m!=="number")return H.s(m)
 s+=m
-t=!0}else t=!1}if(!t)a.push(u)},"call$2","pE",4,0,null,254,[],29,[]],
+t=!0}else t=!1}if(!t)a.push(u)},"call$2","pE",4,0,null,256,[],29,[]],
 xl:[function(a,b){var z,y
 z=H.VM([],[G.DA])
 for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"call$2","bN",4,0,null,73,[],255,[]],
+return z},"call$2","l0",4,0,null,75,[],257,[]],
 u2:[function(a,b){var z,y,x,w,v,u
 if(b.length===1)return b
 z=[]
@@ -11542,21 +11821,21 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.de(v,x[u]))z.push(w)
 continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","AH",4,0,null,73,[],255,[]],
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","AH",4,0,null,75,[],257,[]],
 DA:{
 "^":"a;WA>,ok<,Il<,jr@,dM",
 gvH:function(a){return this.jr},
 gRt:function(){return this.ok},
 gNg:function(){return this.dM},
-ck:[function(a){var z=this.jr
+ck:function(a){var z=this.jr
 if(typeof z!=="number")return H.s(z)
 z=a<z
 if(z)return!1
 if(!J.de(this.dM,J.q8(this.ok.G4)))return!0
 z=J.WB(this.jr,this.dM)
 if(typeof z!=="number")return H.s(z)
-return a<z},"call$1","gcW",2,0,null,48,[]],
-bu:[function(a){return"#<ListChangeRecord index: "+H.d(this.jr)+", removed: "+H.d(this.ok)+", addedCount: "+H.d(this.dM)+">"},"call$0","gXo",0,0,null],
+return a<z},
+bu:function(a){return"#<ListChangeRecord index: "+H.d(this.jr)+", removed: "+H.d(this.ok)+", addedCount: "+H.d(this.dM)+">"},
 $isDA:true,
 static:{XM:function(a,b,c,d){var z
 if(d==null)d=[]
@@ -11572,12 +11851,12 @@
 "^":"",
 Wi:[function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},"call$4","Ha",8,0,null,98,[],256,[],230,[],231,[]],
+return d},"call$4","Ha",8,0,null,100,[],258,[],232,[],233,[]],
 d3:{
 "^":"a;",
 $isd3:true},
 lS:{
-"^":"Tp:355;a,b",
+"^":"Tp:293;a,b",
 call$2:[function(a,b){var z,y,x,w,v
 z=this.b
 y=z.wv.rN(a).gAx()
@@ -11587,23 +11866,22 @@
 x.a=v
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
-z.V2.u(0,a,y)}},"call$2",null,4,0,null,12,[],230,[],"call"],
+z.V2.u(0,a,y)}},"call$2",null,4,0,null,12,[],232,[],"call"],
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
 xh:{
-"^":"Pi;L1,AP,Lk",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",365],
-r6:function(a,b){return this.gP(this).call$1(b)},
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},231,[],"value",365],
-bu:[function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"},"call$0","gXo",0,0,null]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+"^":"Pi;L1,AP,fn",
+gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",300],
+sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},233,[],"value",300],
+bu:function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
-"^":"er;b3,xg,h3,AP,Lk",
+"^":"er;b3,xg,h3,AP,fn",
 gvp:function(){var z=this.xg
 if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
 this.xg=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.h3.length},null,null,1,0,540,"length",365],
+gB:[function(a){return this.h3.length},null,null,1,0,459,"length",300],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.h3
 y=z.length
@@ -11631,10 +11909,10 @@
 u=[]
 w=new P.Yp(u)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,422,30,[],"length",365],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,346,30,[],"length",300],
 t:[function(a,b){var z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},15,[],"[]",365],
+return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[J.im]}},this.$receiver,"wn")},15,[],"[]",300],
 u:[function(a,b,c){var z,y,x,w
 z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -11646,10 +11924,10 @@
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[J.im,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",365],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,399,"isEmpty",365],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,399,"isNotEmpty",365],
-Mh:[function(a,b,c){var z,y,x
+z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[J.im,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",300],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,330,"isEmpty",300],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,330,"isNotEmpty",300],
+Mh:function(a,b,c){var z,y,x
 z=J.x(c)
 if(!z.$isList&&!z.$isz5)c=z.br(c)
 y=J.q8(c)
@@ -11658,8 +11936,8 @@
 z=x==null?z!=null:x!==z}else z=!1
 if(z&&J.z8(y,0)){z=this.h3
 H.K0(z,b,y)
-this.iH(G.XM(this,b,y,H.q9(z,b,y,null).br(0)))}H.ed(this.h3,b,c)},"call$2","gpH",4,0,null,15,[],116,[]],
-h:[function(a,b){var z,y,x,w
+this.iH(G.XM(this,b,y,H.q9(z,b,y,null).br(0)))}H.ed(this.h3,b,c)},
+h:function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
 this.nU(y,y+1)
@@ -11667,8 +11945,8 @@
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)this.iH(G.XM(this,y,1,null))
-C.Nm.h(z,b)},"call$1","ght",2,0,null,30,[]],
-FV:[function(a,b){var z,y,x,w
+C.Nm.h(z,b)},
+FV:function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
 C.Nm.FV(z,b)
@@ -11677,11 +11955,11 @@
 z=this.xg
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.iH(G.XM(this,y,x,null))},"call$1","gDY",2,0,null,116,[]],
-Rz:[function(a,b){var z,y
+if(z&&x>0)this.iH(G.XM(this,y,x,null))},
+Rz:function(a,b){var z,y
 for(z=this.h3,y=0;y<z.length;++y)if(J.de(z[y],b)){this.UZ(0,y,y+1)
-return!0}return!1},"call$1","guH",2,0,null,132,[]],
-UZ:[function(a,b,c){var z,y,x,w,v,u,t
+return!0}return!1},
+UZ:function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
 if(!z||b>this.h3.length)H.vh(P.TE(b,0,this.h3.length))
 y=!(c<b)
@@ -11708,8 +11986,8 @@
 z=z.br(0)
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},"call$2","gYH",4,0,null,123,[],124,[]],
-oF:[function(a,b,c){var z,y,x,w
+this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
+oF:function(a,b,c){var z,y,x,w
 if(b<0||b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
 z=J.x(c)
 if(!z.$isList&&!z.$isz5)c=z.br(c)
@@ -11725,8 +12003,8 @@
 z=this.xg
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&y>0)this.iH(G.XM(this,b,y,null))},"call$2","gFD",4,0,null,15,[],116,[]],
-xe:[function(a,b,c){var z,y,x
+if(z&&y>0)this.iH(G.XM(this,b,y,null))},
+xe:function(a,b,c){var z,y,x
 if(b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
 z=this.h3
 y=z.length
@@ -11741,21 +12019,21 @@
 y=x==null?y!=null:x!==y}else y=!1
 if(y)this.iH(G.XM(this,b,1,null))
 if(b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gJe",4,0,null,15,[],132,[]],
-iH:[function(a){var z,y
+z[b]=c},
+iH:function(a){var z,y
 z=this.xg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
 if(this.b3==null){this.b3=[]
-P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,29,[]],
-nU:[function(a,b){var z,y
+P.rb(this.gL6())}this.b3.push(a)},
+nU:function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
 y=J.x(b)
 this.ct(this,C.ai,z,y.n(b,0))
-this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gdX",4,0,null,230,[],231,[]],
-oC:[function(){var z,y,x
+this.ct(this,C.nZ,!z,!y.n(b,0))},
+Ju:[function(){var z,y,x
 z=this.b3
 if(z==null)return!1
 y=G.u2(this,z)
@@ -11766,7 +12044,7 @@
 if(x){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"call$0","gL6",0,0,399],
+return!0}return!1},"call$0","gL6",0,0,330],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -11774,32 +12052,31 @@
 "^":"ar+Pi;",
 $isd3:true},
 Bj:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){this.a.xg=null},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
 HA:{
-"^":"z2;G3>,jL>,zZ>,JD,dr",
-bu:[function(a){var z
+"^":"yj;G3>,jL>,zZ>,JD,dr",
+bu:function(a){var z
 if(this.JD)z="insert"
 else z=this.dr?"remove":"set"
-return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"call$0","gXo",0,0,null],
+return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
 $isHA:true},
 qC:{
-"^":"Pi;Zp,AP,Lk",
-gvc:[function(a){var z=this.Zp
-return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",365],
+"^":"Pi;Zp,AP,fn",
+gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",300],
 gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.QV,b]}},this.$receiver,"qC")},"values",365],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.QV,b]}},this.$receiver,"qC")},"values",300],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,540,"length",365],
+return z.gB(z)},null,null,1,0,459,"length",300],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,399,"isEmpty",365],
+return z.gB(z)===0},null,null,1,0,330,"isEmpty",300],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,399,"isNotEmpty",365],
-di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,569,30,[],"containsValue",365],
-x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,569,48,[],"containsKey",365],
-t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},48,[],"[]",365],
+return z.gB(z)!==0},null,null,1,0,330,"isNotEmpty",300],
+di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,460,30,[],"containsValue",300],
+x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,460,48,[],"containsKey",300],
+t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},48,[],"[]",300],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -11810,9 +12087,9 @@
 w=v==null?w!=null:v!==w}else w=!1
 if(w){z=z.gB(z)
 if(y!==z){F.Wi(this,C.Wn,y,z)
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},48,[],30,[],"[]=",365],
-FV:[function(a,b){J.kH(b,new V.zT(this))},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){var z,y,x,w,v
+this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},48,[],30,[],"[]=",300],
+FV:function(a,b){J.kH(b,new V.zT(this))},
+Rz:function(a,b){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
 x=z.Rz(0,b)
@@ -11820,24 +12097,24 @@
 if(w!=null){v=w.iE
 w=v==null?w!=null:v!==w}else w=!1
 if(w&&y!==z.gB(z)){this.nq(this,H.VM(new V.HA(b,x,null,!1,!0),[null,null]))
-F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","guH",2,0,null,48,[]],
-V1:[function(a){var z,y,x,w
+F.Wi(this,C.Wn,y,z.gB(z))}return x},
+V1:function(a){var z,y,x,w
 z=this.Zp
 y=z.gB(z)
 x=this.AP
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x&&y>0){z.aN(0,new V.Lo(this))
-F.Wi(this,C.Wn,y,0)}z.V1(0)},"call$0","gRa",0,0,null],
-aN:[function(a,b){return this.Zp.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
+F.Wi(this,C.Wn,y,0)}z.V1(0)},
+aN:function(a,b){return this.Zp.aN(0,b)},
+bu:function(a){return P.vW(this)},
 $isqC:true,
 $isZ0:true,
 static:{WF:function(a,b,c){var z=V.Bq(a,b,c)
 z.FV(0,a)
 return z},Bq:function(a,b,c){var z,y
 z=J.x(a)
-if(!!z.$isBa)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
+if(!!z.$isNb)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
 else y=!!z.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.Py(null,null,null,b,c),null,null),[b,c])
 return y}}},
 zT:{
@@ -11846,7 +12123,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:355;a",
+"^":"Tp:293;a",
 call$2:[function(a,b){var z=this.a
 z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
@@ -11865,8 +12142,8 @@
 return x}if(L.M6(y,C.fz)){x=J.UQ(a,J.GL(b))
 return x}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't get "+H.d(b)+" in "+H.d(a))
-return},"call$2","MT",4,0,null,6,[],71,[]],
-h6:[function(a,b,c){var z,y,x,w
+return},"call$2","MT",4,0,null,6,[],73,[]],
+ir:[function(a,b,c){var z,y,x,w
 if(a==null)return!1
 x=b
 if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
@@ -11876,7 +12153,7 @@
 return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
 return!0}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"call$3","nV",6,0,null,6,[],71,[],30,[]],
+return!1},"call$3","J6",6,0,null,6,[],73,[],30,[]],
 TH:[function(a,b){var z
 for(;!J.de(a,$.aA());){z=a.gYK().nb
 if(z.x4(b))return!0
@@ -11901,9 +12178,9 @@
 if(a==="")return!0
 if(0>=a.length)return H.e(a,0)
 if(a[0]===".")return!1
-return $.tN().zD(a)},"call$1","wf",2,0,null,91,[]],
+return $.tN().zD(a)},"call$1","wf",2,0,null,93,[]],
 WR:{
-"^":"Pi;ay,YB,BK,kN,cs,cT,AP,Lk",
+"^":"Pi;ay,YB,BK,kN,cs,cT,AP,fn",
 E4:function(a){return this.cT.call$1(a)},
 gWA:function(a){var z=this.kN
 if(0>=z.length)return H.e(z,0)
@@ -11914,8 +12191,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",365],
-r6:function(a,b){return this.gP(this).call$1(b)},
+return C.Nm.grZ(this.kN)},null,null,1,0,117,"value",300],
 sP:[function(a,b){var z,y,x,w
 z=this.BK
 y=z.length
@@ -11929,19 +12205,19 @@
 if(w<0||w>=x.length)return H.e(x,w)
 x=x[w]
 if(w>=z.length)return H.e(z,w)
-if(L.h6(x,z[w],b)){z=this.kN
+if(L.ir(x,z[w],b)){z=this.kN
 if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,570,231,[],"value",365],
+z[y]=b}},null,null,3,0,461,233,[],"value",300],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
-this.XI()},"call$0","gqw",0,0,114],
+this.XI()},"call$0","gqw",0,0,116],
 ni:[function(a){var z,y
 for(z=0;y=this.cs,z<y.length;++z){y=y[z]
 if(y!=null){y.ed()
 y=this.cs
 if(z>=y.length)return H.e(y,z)
-y[z]=null}}O.Pi.prototype.ni.call(this,this)},"call$0","gl1",0,0,114],
-Zy:[function(a){var z,y,x,w,v,u
+y[z]=null}}O.Pi.prototype.ni.call(this,this)},"call$0","gl1",0,0,116],
+Zy:function(a){var z,y,x,w,v,u
 if(a==null)a=this.BK.length
 z=this.BK
 y=z.length-1
@@ -11956,8 +12232,9 @@
 if(w===y&&x)u=this.E4(u)
 v=this.kN;++w
 if(w>=v.length)return H.e(v,w)
-v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gJh",0,3,null,82,124,[]],
-hd:[function(a){var z,y,x,w,v,u,t,s,r
+v[w]=u}},
+ov:function(){return this.Zy(null)},
+hd:function(a){var z,y,x,w,v,u,t,s,r
 for(z=this.BK,y=z.length-1,x=this.cT!=null,w=a,v=null,u=null;w<=y;w=s){t=this.kN
 s=w+1
 r=t.length
@@ -11974,8 +12251,8 @@
 t[s]=u}this.ij(a)
 if(this.gnz(this)&&!J.de(v,u)){z=new T.qI(this,C.ls,v,u)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}},"call$1$start","gHi",0,3,null,339,123,[]],
-Rl:[function(a,b){var z,y
+this.nq(this,z)}},
+Rl:function(a,b){var z,y
 if(b==null)b=this.BK.length
 if(typeof b!=="number")return H.s(b)
 z=a
@@ -11983,8 +12260,10 @@
 if(z>=y.length)return H.e(y,z)
 y=y[z]
 if(y!=null)y.ed()
-this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,339,82,123,[],124,[]],
-Kh:[function(a){var z,y,x,w,v
+this.Kh(z)}},
+XI:function(){return this.Rl(0,null)},
+ij:function(a){return this.Rl(a,null)},
+Kh:function(a){var z,y,x,w,v
 z=this.kN
 if(a>=z.length)return H.e(z,a)
 y=z[a]
@@ -12006,7 +12285,7 @@
 w.o7=P.VH(P.AY(),z)
 w.Bd=z.Al(P.v3())
 if(a>=v.length)return H.e(v,a)
-v[a]=w}}},"call$1","gzm",2,0,null,420,[]],
+v[a]=w}}},
 d4:function(a,b,c){var z,y,x,w
 if(this.YB)for(z=J.rr(b).split("."),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),y=this.BK;z.G();){x=z.lo
 if(J.de(x,""))continue
@@ -12023,23 +12302,23 @@
 z.d4(a,b,c)
 return z}}},
 qL:{
-"^":"Tp:112;",
-call$1:[function(a){return},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 Px:{
-"^":"Tp:571;a,b,c",
+"^":"Tp:462;a,b,c",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"call$1",null,2,0,null,255,[],"call"],
+return}},"call$1",null,2,0,null,257,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:572;d,e,f",
+"^":"Tp:463;d,e,f",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"call$1",null,2,0,null,255,[],"call"],
+return}},"call$1",null,2,0,null,257,[],"call"],
 $isEH:true},
 Md:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){return new H.VR(H.v4("^(?:(?:[$_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)},"call$0",null,0,0,null,"call"],
 $isEH:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
@@ -12051,10 +12330,10 @@
 return y}if(!!z.$isQV){z=z.ez(a,R.np())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"call$1","np",2,0,112,30,[]],
+return x}return a},"call$1","np",2,0,114,30,[]],
 km:{
-"^":"Tp:355;a",
-call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,453,[],275,[],"call"],
+"^":"Tp:293;a",
+call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,360,[],277,[],"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 JX:[function(){var z,y
@@ -12079,17 +12358,17 @@
 if(!(!!x.$isRY&&!x.gV5(y)))w=!!x.$isRS&&y.glT()
 else w=!0
 if(w)for(w=J.GP(y.gc9());w.G();)if(!!J.x(w.lo.gAx()).$isyL){if(!x.$isRS||A.bc(a,y)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
-b.u(0,y.gIf(),y)}break}}return b},"call$2","Cd",4,0,null,257,[],258,[]],
+b.u(0,y.gIf(),y)}break}}return b},"call$2","Cd",4,0,null,259,[],260,[]],
 Oy:[function(a,b){var z,y
 do{z=a.gYK().nb.t(0,b)
 y=J.x(z)
 if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
 a=a.gAY()}while(!J.de(a,$.H8()))
-return},"call$2","il",4,0,null,257,[],71,[]],
+return},"call$2","il",4,0,null,259,[],73,[]],
 bc:[function(a,b){var z,y
 z=H.u1(H.d(b.gIf().fN)+"=")
 y=a.gYK().nb.t(0,new H.GD(z))
-return!!J.x(y).$isRS&&y.ghB()},"call$2","i8",4,0,null,257,[],259,[]],
+return!!J.x(y).$isRS&&y.ghB()},"call$2","i8",4,0,null,259,[],261,[]],
 YG:[function(a,b,c){var z,y,x
 z=$.cM()
 if(z==null||a==null)return
@@ -12098,7 +12377,7 @@
 if(y==null)return
 x=J.UQ(y,"ShadowCSS")
 if(x==null)return
-x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,260,[],12,[],261,[]],
+x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,262,[],12,[],263,[]],
 Hl:[function(a){var z,y,x,w,v,u
 if(a==null)return""
 w=J.RE(a)
@@ -12117,28 +12396,28 @@
 if(!!J.x(w).$isNh){y=w
 x=new H.XO(u,null)
 $.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},"call$1","BV",2,0,null,262,[]],
+return""}else throw u}},"call$1","BV",2,0,null,264,[]],
 Ad:[function(a,b){var z
-if(b==null)b=C.hG
+if(b==null)b=C.Tu
 $.Ej().u(0,a,b)
 z=$.p2().Rz(0,a)
-if(z!=null)J.Or(z)},"call$2","ZK",2,2,null,82,12,[],11,[]],
-xv:[function(a){A.pb(a,new A.Mq())},"call$1","J2",2,0,null,263,[]],
+if(z!=null)J.Or(z)},"call$2","ZK",2,2,null,84,12,[],11,[]],
+xv:[function(a){A.pb(a,new A.Mq())},"call$1","J2",2,0,null,265,[]],
 pb:[function(a,b){var z
 if(a==null)return
 b.call$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"call$2","e0",4,0,null,263,[],155,[]],
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"call$2","e0",4,0,null,265,[],157,[]],
 lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.call$3(a,b,c)
-return new A.L6(a,b)},"call$4","y4",8,0,null,264,[],12,[],263,[],265,[]],
+return new A.L6(a,b)},"call$4","y4",8,0,null,266,[],12,[],265,[],267,[]],
 z9:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"call$1","DI",2,0,null,263,[]],
+return $.od().t(0,a)},"call$1","DI",2,0,null,265,[]],
 HR:[function(a,b,c){var z,y,x
 z=H.vn(a)
 y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
 if(y!=null){x=y.gMP()
 x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,47,[],266,[],19,[]],
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,47,[],268,[],19,[]],
 Rk:[function(a,b){var z
 do{z=a.gYK().nb.t(0,b)
 if(!!J.x(z).$isRS)return z
@@ -12149,16 +12428,17 @@
 J.c9(z,J.nJ(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"call$2","tO",4,0,null,267,[],268,[]],
+b.appendChild(z)},"call$2","tO",4,0,null,269,[],270,[]],
 pX:[function(){var z=window
 C.ol.hr(z)
 C.ol.oB(z,W.aF(new A.hm()))},"call$0","ji",0,0,null],
 al:[function(a,b){var z,y,x
 z=J.x(b)
 y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
-if(J.de(y.gUx(),C.PU)||J.de(y.gUx(),C.nN))if(a!=null){x=A.h5(a)
+z=J.RE(y)
+if(J.de(z.gUx(y),C.PU)||J.de(z.gUx(y),C.nN))if(a!=null){x=A.h5(a)
 if(x!=null)return P.re(x)
-return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","bP",4,0,null,30,[],71,[]],
+return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","bP",4,0,null,30,[],73,[]],
 h5:[function(a){if(a==null)return C.Qf
 if(typeof a==="number"&&Math.floor(a)===a)return C.yw
 if(typeof a==="number")return C.O4
@@ -12174,7 +12454,7 @@
 W.wi(window,z,"polymer-element",C.Bm,null)
 A.Jv()
 A.JX()
-$.ax().ml(new A.rD())},"call$0","PB",0,0,114],
+$.ax().ml(new A.rD())},"call$0","PB",0,0,116],
 Jv:[function(){var z,y,x,w,v,u,t
 for(w=$.nT(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
 try{A.pw(z)}catch(v){u=H.Ru(v)
@@ -12204,7 +12484,7 @@
 x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
 v=$.oK
 if(v==null)H.qw(z)
-else v.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,269,[],270,[],271,[],272,[]],
+else v.call$1(z)}}return d},"call$4","fE",4,4,null,84,84,271,[],272,[],273,[],274,[]],
 pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=$.RQ()
 z.toString
@@ -12260,7 +12540,7 @@
 j=l.gYj()
 $.Ej().u(0,q,j)
 i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,273,[]],
+if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,275,[]],
 ZB:[function(a,b){var z,y,x
 for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
 break}if(!y)return
@@ -12274,10 +12554,10 @@
 z=$.oK
 if(z==null)H.qw(x)
 else z.call$1(x)
-return}a.CI(b.gIf(),C.xD)},"call$2","Ii",4,0,null,98,[],220,[]],
+return}a.CI(b.gIf(),C.xD)},"call$2","Ii",4,0,null,100,[],222,[]],
 Zj:{
-"^":"Tp:112;",
-call$1:[function(a){A.pX()},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){A.pX()},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 XP:{
 "^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,lk",
@@ -12289,7 +12569,7 @@
 if(z!=null)y=J.G6(!!J.x(z).$isTU?z:M.Ky(z))
 else y=null
 return y},
-yx:[function(a){var z,y,x,w,v
+yx:function(a){var z,y,x,w,v
 if(this.y0(a,a.RT))return
 z=a.getAttribute("extends")
 if(this.PM(a,z))return
@@ -12316,20 +12596,20 @@
 v=w.gYK().nb.t(0,C.c8)
 if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
 this.Ba(a,y)
-A.yV(a.RT)},"call$0","gGy",0,0,null],
-y0:[function(a,b){if($.Ej().t(0,b)!=null)return!1
+A.yV(a.RT)},
+y0:function(a,b){if($.Ej().t(0,b)!=null)return!1
 $.p2().u(0,b,a)
 if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
-return!0},"call$1","gox0",2,0,null,12,[]],
-PM:[function(a,b){if(b!=null&&C.xB.u8(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
-return!0}return!1},"call$1","gd7",2,0,null,261,[]],
-Ba:[function(a,b){var z,y,x,w
+return!0},
+PM:function(a,b){if(b!=null&&C.xB.u8(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
+return!0}return!1},
+Ba:function(a,b){var z,y,x,w
 for(z=a,y=null;z!=null;){x=J.RE(z)
 y=x.gQg(z).MW.getAttribute("extends")
 z=x.gP1(z)}x=document
 w=a.zx
-W.wi(window,x,b,w,y)},"call$1","gr7",2,0,null,12,[]],
-YU:[function(a,b,c){var z,y,x,w,v,u
+W.wi(window,x,b,w,y)},
+YU:function(a,b,c){var z,y,x,w,v,u
 if(c!=null&&J.YP(c)!=null){z=J.YP(c)
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
@@ -12348,21 +12628,21 @@
 if(typeof console!="undefined")console.warn(y)
 continue}y=a.Q7
 if(y==null){y=H.B7([],P.L5(null,null,null,null,null))
-a.Q7=y}y.u(0,v,u)}}},"call$2","ga2",4,0,null,257,[],573,[]],
-Vk:[function(a){var z,y
+a.Q7=y}y.u(0,v,u)}}},
+Vk:function(a){var z,y
 z=P.L5(null,null,null,J.O,P.a)
 a.xX=z
 y=a.aa
 if(y!=null)z.FV(0,J.Ng(y))
-new W.i7(a).aN(0,new A.CK(a))},"call$0","gYi",0,0,null],
-W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,574,[]],
-Mi:[function(a){var z=this.Hs(a,"[rel=stylesheet]")
+new W.i7(a).aN(0,new A.CK(a))},
+W3:function(a,b){new W.i7(a).aN(0,new A.LJ(b))},
+Mi:function(a){var z=this.Hs(a,"[rel=stylesheet]")
 a.cI=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},"call$0","gax",0,0,null],
-f6:[function(a){var z=this.Hs(a,"style[polymer-scope]")
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},
+f6:function(a){var z=this.Hs(a,"style[polymer-scope]")
 a.lD=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},"call$0","gyS",0,0,null],
-yq:[function(a){var z,y,x,w,v,u,t
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},
+yq:function(a){var z,y,x,w,v,u,t
 z=a.cI
 z.toString
 y=H.VM(new H.U5(z,new A.ZG()),[null])
@@ -12375,14 +12655,15 @@
 w.vM=t+"\n"}if(w.vM.length>0){z=document.createElement("style",null)
 J.c9(z,H.d(w))
 v=J.RE(x)
-v.mK(x,z,v.gp8(x))}}},"call$0","gnt",0,0,null],
-oP:[function(a,b,c){var z,y,x
+v.mK(x,z,v.gp8(x))}}},
+oP:function(a,b,c){var z,y,x
 z=W.vD(a.querySelectorAll(b),null)
 y=z.br(z)
 x=this.gZf(a)
 if(x!=null)C.Nm.FV(y,J.pe(x,b))
-return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gIG",2,2,null,82,486,[],575,[]],
-kO:[function(a,b){var z,y,x,w,v,u
+return y},
+Hs:function(a,b){return this.oP(a,b,null)},
+kO:function(a,b){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.Oc("[polymer-scope="+b+"]")
 for(x=a.cI,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.SO(J.GP(x.l6),x.T6),[H.Kp(x,0)]),w=x.OI;x.G();){v=A.Hl(w.gl())
@@ -12392,14 +12673,14 @@
 z.vM=u+"\n\n"}for(x=a.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.SO(J.GP(y.l6),y.T6),[H.Kp(y,0)]),x=y.OI;y.G();){w=x.gl().ghg()
 w=z.vM+w
 z.vM=w
-z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,576,[]],
-J3:[function(a,b,c){var z
+z.vM=w+"\n\n"}return z.vM},
+J3:function(a,b,c){var z
 if(b==="")return
 z=document.createElement("style",null)
 J.c9(z,b)
 z.setAttribute("element",H.d(a.RT)+"-"+c)
-return z},"call$2","gye",4,0,null,577,[],576,[]],
-q1:[function(a,b){var z,y,x,w
+return z},
+q1:function(a,b){var z,y,x,w
 if(J.de(b,$.H8()))return
 this.q1(a,b.gAY())
 for(z=b.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
@@ -12408,10 +12689,10 @@
 w=J.rY(x)
 if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
 x=w.Nj(x,0,J.xH(w.gB(x),7))
-a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},"call$1","gHv",2,0,null,257,[]],
-qC:[function(a,b){var z=P.L5(null,null,null,J.O,null)
+a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},
+qC:function(a,b){var z=P.L5(null,null,null,J.O,null)
 b.aN(0,new A.MX(z))
-return z},"call$1","gh6",2,0,null,578,[]],
+return z},
 du:function(a){a.RT=a.getAttribute("name")
 this.yx(a)},
 $isXP:true,
@@ -12420,15 +12701,15 @@
 C.zb.du(a)
 return a}}},
 q6:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){return[]},"call$0",null,0,0,null,"call"],
 $isEH:true},
 CK:{
-"^":"Tp:355;a",
+"^":"Tp:293;a",
 call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 LJ:{
-"^":"Tp:355;a",
+"^":"Tp:293;a",
 call$2:[function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
@@ -12436,38 +12717,38 @@
 if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 ZG:{
-"^":"Tp:112;",
-call$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"call$1",null,2,0,null,93,[],"call"],
 $isEH:true},
 Oc:{
-"^":"Tp:112;a",
-call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,91,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,93,[],"call"],
 $isEH:true},
 MX:{
-"^":"Tp:355;a",
+"^":"Tp:293;a",
 call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 w13:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){var z=P.L5(null,null,null,J.O,J.O)
 C.FS.aN(0,new A.r3y(z))
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 r3y:{
-"^":"Tp:355;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,579,[],580,[],"call"],
+"^":"Tp:293;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,464,[],465,[],"call"],
 $isEH:true},
 yL:{
 "^":"ndx;",
 $isyL:true},
 zs:{
-"^":["a;KM:X0=-383",function(){return[C.Nw]}],
+"^":["a;KM:X0=-314",function(){return[C.Nw]}],
 gpQ:function(a){return!1},
-Pa:[function(a){var z
+Pa:function(a){var z
 if(W.Pv(this.gM0(a).defaultView)==null)z=$.Bh>0
 else z=!0
-if(z)this.Ec(a)},"call$0","gu1",0,0,null],
-Ec:[function(a){var z,y
+if(z)this.Ec(a)},
+Ec:function(a){var z,y
 z=this.gQg(a).MW.getAttribute("is")
 y=z==null||z===""?this.gqn(a):z
 a.dZ=$.cd().t(0,y)
@@ -12477,13 +12758,13 @@
 this.Uc(a)
 $.Bh=$.Bh+1
 this.z2(a,a.dZ)
-$.Bh=$.Bh-1},"call$0","gUr",0,0,null],
-i4:[function(a){if(a.dZ==null)this.Ec(a)
-this.BT(a,!0)},"call$0","gQd",0,0,null],
-xo:[function(a){this.x3(a)},"call$0","gbt",0,0,null],
-z2:[function(a,b){if(b!=null){this.z2(a,J.lB(b))
-this.d0(a,b)}},"call$1","gET",2,0,null,581,[]],
-d0:[function(a,b){var z,y,x,w
+$.Bh=$.Bh-1},
+i4:function(a){if(a.dZ==null)this.Ec(a)
+this.BT(a,!0)},
+xo:function(a){this.x3(a)},
+z2:function(a,b){if(b!=null){this.z2(a,J.lB(b))
+this.d0(a,b)}},
+d0:function(a,b){var z,y,x,w
 z=J.RE(b)
 y=z.Ja(b,"template")
 if(y!=null)if(J.Vs(a.dZ).MW.hasAttribute("lightdom")===!0){this.Se(a,y)
@@ -12492,15 +12773,15 @@
 if(!J.x(x).$isI0)return
 w=z.gQg(b).MW.getAttribute("name")
 if(w==null)return
-a.B7.u(0,w,x)},"call$1","gEB",2,0,null,582,[]],
-Se:[function(a,b){var z,y
+a.B7.u(0,w,x)},
+Se:function(a,b){var z,y
 if(b==null)return
 z=!!J.x(b).$isTU?b:M.Ky(b)
 y=z.ZK(a,a.SO)
 this.jx(a,y)
 this.lj(a,a)
-return y},"call$1","gAt",2,0,null,260,[]],
-Tp:[function(a,b){var z,y
+return y},
+Tp:function(a,b){var z,y
 if(b==null)return
 this.gIW(a)
 z=this.er(a)
@@ -12510,15 +12791,15 @@
 y=!!J.x(b).$isTU?b:M.Ky(b)
 z.appendChild(y.ZK(a,a.SO))
 this.lj(a,z)
-return z},"call$1","gCS",2,0,null,260,[]],
-lj:[function(a,b){var z,y,x,w
+return z},
+lj:function(a,b){var z,y,x,w
 for(z=J.pe(b,"[id]"),z=z.gA(z),y=a.X0,x=J.w1(y);z.G();){w=z.lo
-x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,380,[]],
-aC:[function(a,b,c,d){var z=J.x(b)
-if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},"call$3","gxR",6,0,null,12,[],230,[],231,[]],
-Z2:[function(a){J.Ng(a.dZ).aN(0,new A.WC(a))},"call$0","gGN",0,0,null],
-fk:[function(a){if(J.ak(a.dZ)==null)return
-this.gQg(a).aN(0,this.ghW(a))},"call$0","goQ",0,0,null],
+x.u(y,J.F8(w),w)}},
+aC:function(a,b,c,d){var z=J.x(b)
+if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},
+Z2:function(a){J.Ng(a.dZ).aN(0,new A.WC(a))},
+fk:function(a){if(J.ak(a.dZ)==null)return
+this.gQg(a).aN(0,this.ghW(a))},
 D3:[function(a,b,c){var z,y,x,w
 z=this.B2(a,b)
 if(z==null)return
@@ -12526,20 +12807,20 @@
 y=H.vn(a)
 x=y.rN(z.gIf()).gAx()
 w=Z.Zh(c,x,A.al(x,z))
-if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,583,12,[],30,[]],
-B2:[function(a,b){var z=J.ak(a.dZ)
+if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,466,12,[],30,[]],
+B2:function(a,b){var z=J.ak(a.dZ)
 if(z==null)return
-return z.t(0,b)},"call$1","gHf",2,0,null,12,[]],
-TW:[function(a,b){if(b==null)return
+return z.t(0,b)},
+TW:function(a,b){if(b==null)return
 if(typeof b==="boolean")return b?"":null
 else if(typeof b==="string"||typeof b==="number"&&Math.floor(b)===b||typeof b==="number")return H.d(b)
-return},"call$1","gt4",2,0,null,30,[]],
-Id:[function(a,b){var z,y
+return},
+Id:function(a,b){var z,y
 z=H.vn(a).rN(b).gAx()
 y=this.TW(a,z)
 if(y!=null)this.gQg(a).MW.setAttribute(J.GL(b),y)
-else if(typeof z==="boolean")this.gQg(a).Rz(0,J.GL(b))},"call$1","gQp",2,0,null,12,[]],
-Z1:[function(a,b,c,d){var z,y,x,w,v,u,t
+else if(typeof z==="boolean")this.gQg(a).Rz(0,J.GL(b))},
+Z1:function(a,b,c,d){var z,y,x,w,v,u,t
 if(a.dZ==null)this.Ec(a)
 z=this.B2(a,b)
 if(z==null)return J.Jj(M.Ky(a),b,c,d)
@@ -12557,10 +12838,10 @@
 t.bw(a,y,c,d)
 this.Id(a,z.gIf())
 J.kW(J.QE(M.Ky(a)),b,t)
-return t}},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]],
+return t}},
 gCd:function(a){return J.QE(M.Ky(a))},
-Ih:[function(a,b){return J.MV(M.Ky(a),b)},"call$1","gC8",2,0,null,12,[]],
-x3:[function(a){var z,y
+Ih:function(a,b){return J.MV(M.Ky(a),b)},
+x3:function(a){var z,y
 if(a.Uk===!0)return
 $.P5().J4("["+H.d(this.gqn(a))+"] asyncUnbindAll")
 z=a.oq
@@ -12569,7 +12850,7 @@
 else z=new A.S0(null,null)
 z.M3=y
 z.ih=P.rT(C.ny,z.gv6(z))
-a.oq=z},"call$0","gpj",0,0,null],
+a.oq=z},
 GB:[function(a){var z,y
 if(a.Uk===!0)return
 z=a.Wz
@@ -12578,27 +12859,28 @@
 J.AA(M.Ky(a))
 y=this.gIW(a)
 for(;y!=null;){A.xv(y)
-y=y.olderShadowRoot}a.Uk=!0},"call$0","gJg",0,0,114],
-BT:[function(a,b){var z
+y=y.olderShadowRoot}a.Uk=!0},"call$0","gJg",0,0,116],
+BT:function(a,b){var z
 if(a.Uk===!0){$.P5().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
 return}$.P5().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
 z=a.oq
 if(z!=null){z.TP(0)
 a.oq=null}if(b===!0)return
-A.pb(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,584,[]],
-Xl:[function(a){var z,y,x,w,v
+A.pb(this.gIW(a),new A.TV())},
+oW:function(a){return this.BT(a,null)},
+Xl:function(a){var z,y,x,w,v
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
 if(z!=null)for(x=H.VM(new P.i5(z),[H.Kp(z,0)]),w=x.Fb,x=H.VM(new P.N6(w,w.zN,null,null),[H.Kp(x,0)]),x.zq=x.Fb.H9;x.G();){v=x.fD
-this.rJ(a,v,H.vn(a).rN(v),null)}if(z!=null||y!=null)a.Wz=this.gUj(a).yI(this.gnu(a))},"call$0","gJx",0,0,null],
+this.rJ(a,v,H.vn(a).rN(v),null)}if(z!=null||y!=null)a.Wz=this.gUj(a).yI(this.gnu(a))},
 Pv:[function(a,b){var z,y,x,w,v
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
 x=P.L5(null,null,null,P.wv,A.bS)
 for(w=J.GP(b);w.G();){v=w.gl()
 if(!J.x(v).$isqI)continue
-J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,585,586,[]],
-rJ:[function(a,b,c,d){var z,y,x,w,v
+J.iF(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,467,468,[]],
+rJ:function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
 y=z.t(0,b)
@@ -12615,23 +12897,23 @@
 x=H.d(J.GL(b))+"__array"
 v=a.Sa
 if(v==null){v=P.L5(null,null,null,J.O,P.MO)
-a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],30,[],247,[]],
-l5:[function(a,b){var z=a.Sa.Rz(0,b)
+a.Sa=v}v.u(0,x,w)}},
+l5:function(a,b){var z=a.Sa.Rz(0,b)
 if(z==null)return!1
 z.ed()
-return!0},"call$1","gbe",2,0,null,12,[]],
-C0:[function(a){var z=a.Sa
+return!0},
+C0:function(a){var z=a.Sa
 if(z==null)return
 for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)z.lo.ed()
 a.Sa.V1(0)
-a.Sa=null},"call$0","gNX",0,0,null],
-Uc:[function(a){var z,y
+a.Sa=null},
+Uc:function(a){var z,y
 z=J.yxg(a.dZ)
 if(z.gl0(z))return
 y=$.SS()
 if(y.Im(C.R5))y.J4("["+H.d(this.gqn(a))+"] addHostListeners: "+H.d(z))
-this.UH(a,a,z.gvc(z),this.gD4(a))},"call$0","gxD",0,0,null],
-UH:[function(a,b,c,d){var z,y,x,w,v,u,t
+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)
 v=w.Ph
@@ -12639,7 +12921,7 @@
 t=new W.Ov(0,w.uv,v,W.aF(d),u)
 t.$builtinTypeInfo=[H.Kp(w,0)]
 w=t.u7
-if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,263,[],587,[],301,[]],
+if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},
 iw:[function(a,b){var z,y,x,w,v,u,t
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
@@ -12651,15 +12933,15 @@
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,588,376,[]],
-ea:[function(a,b,c,d){var z,y
+this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,469,309,[]],
+ea:function(a,b,c,d){var z,y
 z=$.SS()
 y=z.Im(C.R5)
 if(y)z.J4(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
 if(!!J.x(c).$isEH)H.Ek(c,d,P.Te(null))
 else if(typeof c==="string")A.HR(b,new H.GD(H.u1(c)),d)
 else z.j2("invalid callback")
-if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],589,[],19,[]],
+if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},
 $iszs:true,
 $isTU:true,
 $isd3:true,
@@ -12667,30 +12949,30 @@
 $isD0:true,
 $isKV:true},
 WC:{
-"^":"Tp:355;a",
+"^":"Tp:293;a",
 call$2:[function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).call$0())
 z.t(0,a)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 Xi:{
-"^":"Tp:115;b",
+"^":"Tp:117;b",
 call$0:[function(){return this.b},"call$0",null,0,0,null,"call"],
 $isEH:true},
 TV:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){var z=J.x(a)
-if(!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
+if(!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,200,[],"call"],
 $isEH:true},
 Mq:{
-"^":"Tp:112;",
-call$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"call$1",null,2,0,null,263,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"call$1",null,2,0,null,265,[],"call"],
 $isEH:true},
 Oa:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){return new A.bS(this.a.jL,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 n1:{
-"^":"Tp:355;b,c,d,e",
+"^":"Tp:293;b,c,d,e",
 call$2:[function(a,b){var z,y,x
 z=this.e
 if(z!=null&&z.x4(a))J.Jr(this.b,a)
@@ -12700,14 +12982,14 @@
 if(y!=null){z=this.b
 x=J.RE(b)
 J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],590,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],470,[],"call"],
 $isEH:true},
 xf:{
-"^":"Tp:112;a,b,c",
-call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,586,[],"call"],
+"^":"Tp:114;a,b,c",
+call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,468,[],"call"],
 $isEH:true},
 L6:{
-"^":"Tp:355;a,b",
+"^":"Tp:293;a,b",
 call$2:[function(a,b){var z,y,x
 z=$.SS()
 if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
@@ -12716,10 +12998,10 @@
 if(x!=null)y=x
 z=J.f5(b).t(0,y)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,283,[],263,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,285,[],265,[],"call"],
 $isEH:true},
 Rs:{
-"^":"Tp:112;c,d,e",
+"^":"Tp:114;c,d,e",
 call$1:[function(a){var z,y,x,w,v,u
 z=this.e
 y=A.z9(z)
@@ -12731,42 +13013,42 @@
 u=L.Sk(v,C.xB.yn(w,1),null)
 w=u.gP(u)}else v=y
 u=J.x(a)
-x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,376,[],"call"],
+x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,309,[],"call"],
 $isEH:true},
 uJ:{
-"^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,591,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,471,[],"call"],
 $isEH:true},
 hm:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){var z,y,x
 z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
 for(y=z.gA(z);y.G();){x=J.pP(y.lo)
 x.h(0,"polymer-unveil")
 x.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
-y.gtH(y).ml(new A.Ji(z))}},"call$1",null,2,0,null,113,[],"call"],
+y.gtH(y).ml(new A.Ji(z))}},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 Ji:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z
-for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"call$1",null,2,0,null,113,[],"call"],
+for(z=this.a,z=z.gA(z);z.G();)J.pP(z.lo).Rz(0,"polymer-unveil")},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 Bf:{
 "^":"TR;I6,iU,Jq,dY,qP,ZY,xS,PB,eS,ay",
-cO:[function(a){if(this.qP==null)return
+cO:function(a){if(this.qP==null)return
 this.Jq.ed()
-X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null],
-EC:[function(a){this.dY=a
-this.I6.PU(this.iU,a)},"call$1","gH0",2,0,null,231,[]],
+X.TR.prototype.cO.call(this,this)},
+EC:function(a){this.dY=a
+this.I6.PU(this.iU,a)},
 aL4:[function(a){var z,y,x,w
 for(z=J.GP(a),y=this.iU;z.G();){x=z.gl()
 if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
 z=this.dY
 if(z==null?w!=null:z!==w)J.ta(this.xS,w)
-return}}},"call$1","giz",2,0,592,255,[]],
+return}}},"call$1","giz",2,0,472,257,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
-ir:{
-"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+xc:{
+"^":["Ao;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 oX:function(a){this.Pa(a)},
 static:{G7:function(a){var z,y,x,w
 z=$.Nd()
@@ -12781,14 +13063,14 @@
 C.Iv.oX(a)
 return a}}},
 jpR:{
-"^":["qE+zs;KM:X0=-383",function(){return[C.Nw]}],
+"^":["qE+zs;KM:X0=-314",function(){return[C.Nw]}],
 $iszs:true,
 $isTU:true,
 $isd3:true,
 $iscv:true,
 $isD0:true,
 $isKV:true},
-GN:{
+Ao:{
 "^":"jpR+Pi;",
 $isd3:true},
 bS:{
@@ -12799,44 +13081,44 @@
 S0:{
 "^":"a;M3,ih",
 Ws:function(){return this.M3.call$0()},
-TP:[function(a){var z=this.ih
+TP:function(a){var z=this.ih
 if(z!=null){z.ed()
-this.ih=null}},"call$0","gol",0,0,null],
+this.ih=null}},
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"call$0","gv6",0,0,114]},
+this.Ws()}},"call$0","gv6",0,0,116]},
 V3:{
 "^":"a;ns",
 $isV3:true},
 rD:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){var z=$.mC().MM
 if(z.Gv!==0)H.vh(new P.lj("Future already completed"))
 z.OH(null)
-return},"call$1",null,2,0,null,113,[],"call"],
+return},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 Fn:{
-"^":"Tp:112;",
-call$1:[function(a){return!!J.x(a).$isRS},"call$1",null,2,0,null,593,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return!!J.x(a).$isRS},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 e3:{
-"^":"Tp:112;",
-call$1:[function(a){return!!J.x(a).$isMs},"call$1",null,2,0,null,593,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return!!J.x(a).$isMs},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 pM:{
-"^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,591,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,471,[],"call"],
 $isEH:true},
 Mh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
 "^":"",
 Zh:[function(a,b,c){var z,y,x
-z=J.UQ($.CT(),c.gUx())
+z=J.UQ($.CT(),J.Ba(c))
 if(z!=null)return z.call$2(a,b)
 try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},"call$3","jo",6,0,null,30,[],274,[],11,[]],
+return a}},"call$3","jo",6,0,null,30,[],276,[],11,[]],
 W6:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){var z=P.L5(null,null,null,null,null)
 z.u(0,C.AZ,new Z.Lf())
 z.u(0,C.ok,new Z.fT())
@@ -12847,60 +13129,60 @@
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Lf:{
-"^":"Tp:355;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],115,[],"call"],
 $isEH:true},
 fT:{
-"^":"Tp:355;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],115,[],"call"],
 $isEH:true},
 pp:{
-"^":"Tp:355;",
+"^":"Tp:293;",
 call$2:[function(a,b){var z,y
 try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},"call$2",null,4,0,null,28,[],594,[],"call"],
+return b}},"call$2",null,4,0,null,28,[],474,[],"call"],
 $isEH:true},
 nl:{
-"^":"Tp:355;",
-call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,28,[],113,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,28,[],115,[],"call"],
 $isEH:true},
 ik:{
-"^":"Tp:355;",
-call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,28,[],594,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,28,[],474,[],"call"],
 $isEH:true},
 mf:{
-"^":"Tp:112;a",
-call$1:[function(a){return this.a},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return this.a},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 LfS:{
-"^":"Tp:355;",
-call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,28,[],594,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,28,[],474,[],"call"],
 $isEH:true},
 HK:{
-"^":"Tp:112;b",
-call$1:[function(a){return this.b},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;b",
+call$1:[function(a){return this.b},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 ul:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
+if(!!z.$isZ0)z=J.vo(a.gvc(),new T.o8(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"call$1","qP",2,0,194,275,[]],
+return z},"call$1","qP",2,0,196,277,[]],
 PX:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.kl(z.gvc(a),new T.ex(a)).zV(0,";")
+if(!!z.$isZ0)z=J.kl(a.gvc(),new T.ex(a)).zV(0,";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"call$1","Fx",2,0,194,275,[]],
+return z},"call$1","Fx",2,0,196,277,[]],
 o8:{
-"^":"Tp:112;a",
-call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,453,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,360,[],"call"],
 $isEH:true},
 ex:{
-"^":"Tp:112;a",
-call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,453,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,360,[],"call"],
 $isEH:true},
 e9:{
-"^":"ve;",
-cl:[function(a,b,c){var z,y,x
+"^":"T4p;",
+op:[function(a,b,c){var z,y,x
 if(a==null)return
 z=new Y.hc(H.VM([],[Y.Pn]),P.p9(""),new P.WU(a,0,0,null),null)
 y=new U.tc()
@@ -12913,38 +13195,37 @@
 if(M.wR(c)){z=J.x(b)
 z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"call$3","gca",6,0,595,264,[],12,[],263,[]],
-CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,260,[]]},
+return new T.Xy(this,b,x)},"call$3","gca",6,0,475,266,[],12,[],265,[]],
+CE:function(a){return new T.uK(this)}},
 Xy:{
-"^":"Tp:355;a,b,c",
+"^":"Tp:293;a,b,c",
 call$2:[function(a,b){var z
 if(!J.x(a).$isz6){z=this.a.nF
 a=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}z=!!J.x(b).$iscv
 if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
 if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"call$2",null,4,0,null,283,[],263,[],"call"],
+return T.FL(this.c,a,null)},"call$2",null,4,0,null,285,[],265,[],"call"],
 $isEH:true},
 uK:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z
 if(!!J.x(a).$isz6)z=a
 else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,283,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,285,[],"call"],
 $isEH:true},
 mY:{
-"^":"Pi;a9,Cu,uI,Y7,AP,Lk",
+"^":"Pi;a9,Cu,uI,Y7,AP,fn",
 u0:function(a){return this.uI.call$1(a)},
 KX:[function(a){var z,y
 z=this.Y7
-if(!!J.x(a).$isfk){y=J.kl(a.bm,new T.mB(this,a)).tt(0,!1)
+if(!!J.x(a).$isfk){y=J.OS(J.kl(a.bm,new T.mB(this,a)),!1)
 this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,275,[]],
-gP:[function(a){return this.Y7},null,null,1,0,115,"value",365],
-r6:function(a,b){return this.gP(this).call$1(b)},
+this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,114,277,[]],
+gP:[function(a){return this.Y7},null,null,1,0,117,"value",300],
 sP:[function(a,b){var z,y,x
 try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
 if(!!J.x(x).$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,275,[],"value",365],
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,114,277,[],"value",300],
 yB:function(a,b,c){var z,y,x,w
 y=this.Cu
 y.gju().yI(this.gUG()).fm(0,new T.GX(this))
@@ -12952,23 +13233,23 @@
 y.gLl()
 this.KX(y.gLl())}catch(x){w=H.Ru(x)
 if(!!J.x(w).$isB0){z=w
-$.eH().j2("Error evaluating expression '"+H.d(y)+"': "+J.yj(z))}else throw x}},
+$.eH().j2("Error evaluating expression '"+H.d(y)+"': "+J.z2(z))}else throw x}},
 static:{FL:function(a,b,c){var z=new T.mY(b,a.RR(0,new K.G1(b,P.NZ(null,null))),c,null,null,null)
 z.yB(a,b,c)
 return z}}},
 GX:{
-"^":"Tp:112;a",
-call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,21,[],"call"],
+"^":"Tp:114;a",
+call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 mB:{
-"^":"Tp:112;a,b",
+"^":"Tp:114;a,b",
 call$1:[function(a){var z=P.L5(null,null,null,null,null)
 z.u(0,this.b.F5,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,420,[],"call"],
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 XF:{
-"^":"xh;vq,L1,AP,Lk",
+"^":"xh;vq,L1,AP,fn",
 vb:function(a,b){this.vq.yI(new B.bX(b,this))},
 $asxh:function(a){return[null]},
 static:{z4:function(a,b){var z=H.VM(new B.XF(a,null,null,null),[b])
@@ -12977,13 +13258,13 @@
 bX:{
 "^":"Tp;a,b",
 call$1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,420,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,344,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"CV",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
 OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
 J.UK(z,new K.Ed(b))
-return z.gLv()},"call$2","ly",4,0,null,276,[],268,[]],
+return z.gLv()},"call$2","ly",4,0,null,278,[],270,[]],
 jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
@@ -13011,78 +13292,78 @@
 throw H.b(K.kG("filter must implement Transformer: "+H.d(r)))}p=K.OH(t,c)
 if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
-else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,276,[],30,[],268,[]],
+else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,278,[],30,[],270,[]],
 ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
-return a},"call$1","W1",2,0,null,275,[]],
+return a},"call$1","W1",2,0,null,277,[]],
 wJY:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 zOQ:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 W6o:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.vX(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.vX(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 MdQ:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 YJG:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 DOe:{
-"^":"Tp:355;",
-call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 lPa:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 Ufa:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 Raa:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 w0:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.Bl(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.Bl(a,b)},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 w4:{
-"^":"Tp:355;",
-call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 w5:{
-"^":"Tp:355;",
-call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 w7:{
-"^":"Tp:355;",
+"^":"Tp:293;",
 call$2:[function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.call$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},"call$2",null,4,0,null,131,[],117,[],"call"],
+throw H.b(K.kG("Filters must be a one-argument function."))},"call$2",null,4,0,null,133,[],119,[],"call"],
 $isEH:true},
 w10:{
-"^":"Tp:112;",
-call$1:[function(a){return a},"call$1",null,2,0,null,131,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return a},"call$1",null,2,0,null,133,[],"call"],
 $isEH:true},
 w11:{
-"^":"Tp:112;",
-call$1:[function(a){return J.Z7(a)},"call$1",null,2,0,null,131,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return J.Z7(a)},"call$1",null,2,0,null,133,[],"call"],
 $isEH:true},
 w12:{
-"^":"Tp:112;",
-call$1:[function(a){return a!==!0},"call$1",null,2,0,null,131,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return a!==!0},"call$1",null,2,0,null,133,[],"call"],
 $isEH:true},
 c4:{
-"^":"Tp:115;a",
+"^":"Tp:117;a",
 call$0:[function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 z6:{
@@ -13092,7 +13373,7 @@
 z=H.vn(this.k8)
 this.G9=z
 return z},
-t:[function(a,b){var z,y,x,w
+t:function(a,b){var z,y,x,w
 if(J.de(b,"this"))return this.k8
 else{z=this.bq.Zp
 if(z.x4(b))return K.ci(z.t(0,b))
@@ -13104,33 +13385,33 @@
 if(w)return K.ci(this.gCH().rN(y).gAx())
 else if(!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
 if(z!=null)return K.ci(z.t(0,b))
-else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},"call$1","gIA",2,0,null,12,[]],
-tI:[function(a){var z
+else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},
+tI:function(a){var z
 if(J.de(a,"this"))return
 else{z=this.bq
 if(z.Zp.x4(a))return z
 else{z=H.u1(a)
 if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return this.k8}}z=this.eT
-if(z!=null)return z.tI(a)},"call$1","gXe",2,0,null,12,[]],
-tg:[function(a,b){var z
+if(z!=null)return z.tI(a)},
+tg:function(a,b){var z
 if(this.bq.Zp.x4(b))return!0
 else{z=H.u1(b)
 if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return!0}z=this.eT
 if(z!=null)return z.tg(0,b)
-return!1},"call$1","gdj",2,0,null,12,[]],
+return!1},
 $isz6:true},
 Ay:{
 "^":"a;bO?,Lv<",
 gju:function(){var z=this.k6
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
 gLl:function(){return this.Lv},
-eC:[function(a){return this.Qh(a)},"call$1","gpn",2,0,null,268,[]],
-Qh:[function(a){},"call$1","gVj",2,0,null,268,[]],
-DX:[function(a){var z
+eC:function(a){return this.Qh(a)},
+Qh:function(a){},
+DX:function(a){var z
 this.yc(0,a)
 z=this.bO
-if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,268,[]],
-yc:[function(a,b){var z,y,x
+if(z!=null)z.DX(a)},
+yc:function(a,b){var z,y,x
 z=this.tj
 if(z!=null){z.ed()
 this.tj=null}y=this.Lv
@@ -13138,31 +13419,31 @@
 z=this.Lv
 if(z==null?y!=null:z!==y){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
-x.Iv(z)}},"call$1","gcz",2,0,null,268,[]],
-bu:[function(a){return this.KL.bu(0)},"call$0","gXo",0,0,null],
+x.Iv(z)}},
+bu:function(a){return this.KL.bu(0)},
 $ishw:true},
 Ed:{
 "^":"d2;Jd",
-xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,21,[]],
-ky:[function(a){J.UK(a.gT8(a),this)
-a.yc(0,this.Jd)},"call$1","gXf",2,0,null,280,[]]},
+xn:function(a){a.yc(0,this.Jd)},
+ky:function(a){J.UK(a.gT8(a),this)
+a.yc(0,this.Jd)}},
 G1:{
 "^":"fr;Jd,ZGj",
-W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,21,[]],
-LT:[function(a){return a.wz.RR(0,this)},"call$1","gaT",2,0,null,21,[]],
-co:[function(a){var z,y
+W9:function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},
+LT:function(a){return a.wz.RR(0,this)},
+co:function(a){var z,y
 z=J.UK(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(y)
-return y},"call$1","gEW",2,0,null,361,[]],
-CU:[function(a){var z,y,x
+return y},
+CU:function(a){var z,y,x
 z=J.UK(a.ghP(),this)
 y=J.UK(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","gA2",2,0,null,420,[]],
-ZR:[function(a){var z,y,x,w,v
+return x},
+ZR:function(a){var z,y,x,w,v
 z=J.UK(a.ghP(),this)
 y=a.gre()
 if(y==null)x=null
@@ -13171,55 +13452,55 @@
 x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
 if(x!=null)H.bQ(x,new K.Os(v))
-return v},"call$1","gES",2,0,null,420,[]],
-ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gvs",2,0,null,277,[]],
-o0:[function(a){var z,y
+return v},
+ti:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
+o0:function(a){var z,y
 z=H.VM(new H.A8(a.gPu(a),this.gnG()),[null,null]).tt(0,!1)
 y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.B8(y))
-return y},"call$1","gX7",2,0,null,277,[]],
-YV:[function(a){var z,y,x
+return y},
+YV:function(a){var z,y,x
 z=J.UK(a.gG3(a),this)
 y=J.UK(a.gv4(),this)
 x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","ghH",2,0,null,21,[]],
-qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,420,[]],
-im:[function(a){var z,y,x
+return x},
+qv:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
+im:function(a){var z,y,x
 z=J.UK(a.gBb(a),this)
 y=J.UK(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},"call$1","glf",2,0,null,96,[]],
-Hx:[function(a){var z,y
+return x},
+Hx:function(a){var z,y
 z=J.UK(a.gwz(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(y)
-return y},"call$1","ghe",2,0,null,96,[]],
-ky:[function(a){var z,y,x
+return y},
+ky:function(a){var z,y,x
 z=J.UK(a.gBb(a),this)
 y=J.UK(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},"call$1","gXf",2,0,null,420,[]]},
+return x}},
 Os:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
-return z},"call$1",null,2,0,null,131,[],"call"],
+return z},"call$1",null,2,0,null,133,[],"call"],
 $isEH:true},
 B8:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
 return z},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Wh:{
 "^":"Ay;KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
+Qh:function(a){this.Lv=a.gk8()},
+RR:function(a,b){return b.W9(this)},
 $asAy:function(){return[U.EZ]},
 $isEZ:true,
 $ishw:true},
@@ -13227,29 +13508,28 @@
 "^":"Ay;KL,bO,tj,Lv,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-r6:function(a,b){return this.gP(this).call$1(b)},
-Qh:[function(a){var z=this.KL
-this.Lv=z.gP(z)},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
+Qh:function(a){var z=this.KL
+this.Lv=z.gP(z)},
+RR:function(a,b){return b.ti(this)},
 $asAy:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
 $ishw:true},
 ev:{
 "^":"Ay;Pu>,KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
+Qh:function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},
+RR:function(a,b){return b.o0(this)},
 $asAy:function(){return[U.kB]},
 $iskB:true,
 $ishw:true},
 ID:{
-"^":"Tp:355;",
+"^":"Tp:293;",
 call$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"call$2",null,4,0,null,190,[],21,[],"call"],
+return a},"call$2",null,4,0,null,192,[],21,[],"call"],
 $isEH:true},
 qR:{
 "^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
+RR:function(a,b){return b.YV(this)},
 $asAy:function(){return[U.wk]},
 $iswk:true,
 $ishw:true},
@@ -13257,37 +13537,36 @@
 "^":"Ay;KL,bO,tj,Lv,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-r6:function(a,b){return this.gP(this).call$1(b)},
-Qh:[function(a){var z,y,x
+Qh:function(a){var z,y,x
 z=this.KL
 this.Lv=J.UQ(a,z.gP(z))
 y=a.tI(z.gP(z))
 x=J.x(y)
 if(!!x.$isd3){z=H.u1(z.gP(z))
-this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
+this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},
+RR:function(a,b){return b.qv(this)},
 $asAy:function(){return[U.w6]},
 $isw6:true,
 $ishw:true},
 Qv:{
-"^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,586,[],"call"],
+"^":"Tp:114;a,b,c",
+call$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,468,[],"call"],
 $isEH:true},
 Xm:{
-"^":"Tp:112;d",
-call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
+"^":"Tp:114;d",
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,282,[],"call"],
 $isEH:true},
 mv:{
 "^":"Ay;wz<,KL,bO,tj,Lv,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
-Qh:[function(a){var z,y
+Qh:function(a){var z,y
 z=this.KL
 y=$.ww().t(0,z.gkp(z))
 if(J.de(z.gkp(z),"!")){z=this.wz.gLv()
 this.Lv=y.call$1(z==null?!1:z)}else{z=this.wz
-this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
+this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},
+RR:function(a,b){return b.Hx(this)},
 $asAy:function(){return[U.jK]},
 $isjK:true,
 $ishw:true},
@@ -13295,7 +13574,7 @@
 "^":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
-Qh:[function(a){var z,y,x
+Qh:function(a){var z,y,x
 z=this.KL
 y=$.Ra().t(0,z.gkp(z))
 if(J.de(z.gkp(z),"&&")||J.de(z.gkp(z),"||")){z=this.Bb.gLv()
@@ -13305,20 +13584,20 @@
 else{x=this.Bb
 if(x.gLv()==null||this.T8.gLv()==null)this.Lv=null
 else{if(J.de(z.gkp(z),"|")&&!!J.x(x.gLv()).$iswn)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
-this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
+this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},
+RR:function(a,b){return b.im(this)},
 $asAy:function(){return[U.uk]},
 $isuk:true,
 $ishw:true},
 uA:{
-"^":"Tp:112;a,b",
-call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;a,b",
+call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 vl:{
 "^":"Ay;hP<,KL,bO,tj,Lv,k6",
 goc:function(a){var z=this.KL
 return z.goc(z)},
-Qh:[function(a){var z,y,x,w
+Qh:function(a){var z,y,x,w
 z=this.hP.gLv()
 if(z==null){this.Lv=null
 return}y=H.vn(z)
@@ -13326,45 +13605,45 @@
 w=new H.GD(H.u1(x.goc(x)))
 this.Lv=y.rN(w).gAx()
 x=J.x(z)
-if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.Li(this,a,w))},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.Li(this,a,w))},
+RR:function(a,b){return b.co(this)},
 $asAy:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
 Li:{
-"^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,586,[],"call"],
+"^":"Tp:114;a,b,c",
+call$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,468,[],"call"],
 $isEH:true},
 WK:{
-"^":"Tp:112;d",
-call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
+"^":"Tp:114;d",
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,282,[],"call"],
 $isEH:true},
 iT:{
 "^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
-Qh:[function(a){var z,y,x
+Qh:function(a){var z,y,x
 z=this.hP.gLv()
 if(z==null){this.Lv=null
 return}y=this.Jn.gLv()
 x=J.U6(z)
 this.Lv=x.t(z,y)
-if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},
+RR:function(a,b){return b.CU(this)},
 $asAy:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
 tE:{
-"^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,586,[],"call"],
+"^":"Tp:114;a,b,c",
+call$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,468,[],"call"],
 $isEH:true},
 ey:{
-"^":"Tp:112;d",
-call$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,280,[],"call"],
+"^":"Tp:114;d",
+call$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,282,[],"call"],
 $isEH:true},
 fa:{
 "^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
 gbP:function(a){var z=this.KL
 return z.gbP(z)},
-Qh:[function(a){var z,y,x,w,v
+Qh:function(a){var z,y,x,w,v
 z=this.re
 z.toString
 y=H.VM(new H.A8(z,new K.WW()),[null,null]).br(0)
@@ -13376,26 +13655,26 @@
 v=new H.GD(H.u1(z.gbP(z)))
 this.Lv=w.F2(v,y,null).Ax
 z=J.x(x)
-if(!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,v))}},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
+if(!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,v))}},
+RR:function(a,b){return b.ZR(this)},
 $asAy:function(){return[U.Jy]},
 $isJy:true,
 $ishw:true},
 WW:{
-"^":"Tp:112;",
-call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,131,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,133,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:572;a,b,c",
-call$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,586,[],"call"],
+"^":"Tp:463;a,b,c",
+call$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,468,[],"call"],
 $isEH:true},
 a9:{
-"^":"Tp:112;d",
-call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
+"^":"Tp:114;d",
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,282,[],"call"],
 $isEH:true},
 VA:{
 "^":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
-Qh:[function(a){var z,y,x,w
+Qh:function(a){var z,y,x,w
 z=this.Bb
 y=this.T8.gLv()
 x=J.x(y)
@@ -13403,26 +13682,26 @@
 if(!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
 x=J.Vm(z)
 w=y!=null?y:C.xD
-this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,268,[]],
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
+this.Lv=new K.fk(x,w)},
+RR:function(a,b){return b.ky(this)},
 $asAy:function(){return[U.K9]},
 $isK9:true,
 $ishw:true},
 J1:{
-"^":"Tp:112;a,b",
-call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;a,b",
+call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 fk:{
 "^":"a;F5,bm",
 $isfk:true},
 wL:{
-"^":"a:112;lR,ex",
-call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,596,[]],
+"^":"a:114;lR,ex",
+call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,476,[]],
 $iswL:true,
 $isEH:true},
 B0:{
 "^":"a;G1>",
-bu:[function(a){return"EvalException: "+this.G1},"call$0","gXo",0,0,null],
+bu:function(a){return"EvalException: "+this.G1},
 $isB0:true,
 static:{kG:function(a){return new K.B0(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
 "^":"",
@@ -13432,59 +13711,58 @@
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},"call$2","xV",4,0,null,131,[],187,[]],
+if(!J.de(y,b[z]))return!1}return!0},"call$2","xV",4,0,null,133,[],189,[]],
 au:[function(a){a.toString
-return U.xk(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,277,[]],
+return U.xk(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,279,[]],
 Zm:[function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"call$2","uN",4,0,null,226,[],30,[]],
+return a^a>>>6},"call$2","uN",4,0,null,228,[],30,[]],
 xk:[function(a){if(typeof a!=="number")return H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},"call$1","UY",2,0,null,226,[]],
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","Zy",2,0,null,228,[]],
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,597,21,[],131,[]],
-F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,21,[],190,[],131,[]]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,477,21,[],133,[]],
+F2:function(a,b,c){return new U.Jy(a,b,c)}},
 hw:{
 "^":"a;",
 $ishw:true},
 EZ:{
 "^":"hw;",
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
+RR:function(a,b){return b.W9(this)},
 $isEZ:true},
 no:{
 "^":"hw;P>",
-r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){var z=this.P
-return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.ti(this)},
+bu:function(a){var z=this.P
+return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},
+n:function(a,b){var z
 if(b==null)return!1
 z=H.RB(b,"$isno",[H.Kp(this,0)],"$asno")
-return z&&J.de(J.Vm(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
+return z&&J.de(J.Vm(b),this.P)},
 giO:function(a){return J.v1(this.P)},
 $isno:true},
 kB:{
 "^":"hw;Pu>",
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return"{"+H.d(this.Pu)+"}"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.o0(this)},
+bu:function(a){return"{"+H.d(this.Pu)+"}"},
+n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},
 giO:function(a){return U.au(this.Pu)},
 $iskB:true},
 wk:{
 "^":"hw;G3>,v4<",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return H.d(this.G3)+": "+H.d(this.v4)},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.YV(this)},
+bu:function(a){return H.d(this.G3)+": "+H.d(this.v4)},
+n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$iswk&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$iswk&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},
 giO:function(a){var z,y
 z=J.v1(this.G3.P)
 y=J.v1(this.v4)
@@ -13492,31 +13770,30 @@
 $iswk:true},
 XC:{
 "^":"hw;wz",
-RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return"("+H.d(this.wz)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
+RR:function(a,b){return b.LT(this)},
+bu:function(a){return"("+H.d(this.wz)+")"},
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isXC&&J.de(b.wz,this.wz)},
 giO:function(a){return J.v1(this.wz)},
 $isXC:true},
 w6:{
 "^":"hw;P>",
-r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return this.P},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.qv(this)},
+bu:function(a){return this.P},
+n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$isw6&&J.de(z.gP(b),this.P)},
 giO:function(a){return J.v1(this.P)},
 $isw6:true},
 jK:{
 "^":"hw;kp>,wz<",
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.Hx(this)},
+bu:function(a){return H.d(this.kp)+" "+H.d(this.wz)},
+n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},
 giO:function(a){var z,y
 z=J.v1(this.kp)
 y=J.v1(this.wz)
@@ -13524,12 +13801,12 @@
 $isjK:true},
 uk:{
 "^":"hw;kp>,Bb>,T8>",
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.im(this)},
+bu:function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},
+n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(z.gBb(b),this.Bb)&&J.de(z.gT8(b),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(z.gBb(b),this.Bb)&&J.de(z.gT8(b),this.T8)},
 giO:function(a){var z,y,x
 z=J.v1(this.kp)
 y=J.v1(this.Bb)
@@ -13538,12 +13815,12 @@
 $isuk:true},
 K9:{
 "^":"hw;Bb>,T8>",
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+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.$isK9&&J.de(z.gBb(b),this.Bb)&&J.de(z.gT8(b),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$isK9&&J.de(z.gBb(b),this.Bb)&&J.de(z.gT8(b),this.T8)},
 giO:function(a){var z,y
 z=this.Bb
 z=z.giO(z)
@@ -13552,10 +13829,10 @@
 $isK9:true},
 zX:{
 "^":"hw;hP<,Jn<",
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return H.d(this.hP)+"["+H.d(this.Jn)+"]"},"call$0","gXo",0,0,null],
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,96,[]],
+RR:function(a,b){return b.CU(this)},
+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.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.Jn)
@@ -13563,12 +13840,12 @@
 $iszX:true},
 x9:{
 "^":"hw;hP<,oc>",
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return H.d(this.hP)+"."+H.d(this.oc)},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.co(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.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.oc)
@@ -13576,12 +13853,12 @@
 $isx9:true},
 Jy:{
 "^":"hw;hP<,bP>,re<",
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
-bu:[function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
+RR:function(a,b){return b.ZR(this)},
+bu:function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},
+n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,96,[]],
+return!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},
 giO:function(a){var z,y,x
 z=J.v1(this.hP)
 y=J.v1(this.bP)
@@ -13589,21 +13866,22 @@
 return U.xk(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:355;",
-call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,598,[],599,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,478,[],479,[],"call"],
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
 "^":"a;Sk,GP,qM,fL",
-XJ:[function(a,b){var z
+XJ:function(a,b){var z
 if(!(a!=null&&!J.de(J.Iz(this.fL.lo),a)))z=b!=null&&!J.de(J.Vm(this.fL.lo),b)
 else z=!0
 if(z)throw H.b(Y.RV("Expected "+H.d(b)+": "+H.d(this.fL.lo)))
-this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,600,[],30,[]],
-o9:[function(){if(this.fL.lo==null){this.Sk.toString
+this.fL.G()},
+w5:function(){return this.XJ(null,null)},
+o9:function(){if(this.fL.lo==null){this.Sk.toString
 return C.OL}var z=this.Dl()
-return z==null?null:this.BH(z,0)},"call$0","gVPD",0,0,null],
-BH:[function(a,b){var z,y,x,w
+return z==null?null:this.BH(z,0)},
+BH:function(a,b){var z,y,x,w
 for(;z=this.fL.lo,z!=null;)if(J.de(J.Iz(z),9))if(J.de(J.Vm(this.fL.lo),"(")){y=this.qj()
 this.Sk.toString
 a=new U.Jy(a,null,y)}else if(J.de(J.Vm(this.fL.lo),"[")){x=this.eY()
@@ -13616,16 +13894,16 @@
 this.Sk.toString
 a=new U.K9(a,w)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
 else break
-return a},"call$2","gHr",4,0,null,134,[],601,[]],
-qL:[function(a,b){var z,y
+return a},
+qL:function(a,b){var z,y
 z=J.x(b)
 if(!!z.$isw6){z=z.gP(b)
 this.Sk.toString
 return new U.x9(a,z)}else if(!!z.$isJy&&!!J.x(b.ghP()).$isw6){z=J.Vm(b.ghP())
 y=b.gre()
 this.Sk.toString
-return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},"call$2","gE5",4,0,null,134,[],135,[]],
-Tw:[function(a){var z,y,x
+return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
+Tw:function(a){var z,y,x
 z=this.fL.lo
 this.w5()
 y=this.Dl()
@@ -13635,8 +13913,8 @@
 if(!x)break
 y=this.BH(y,this.fL.lo.gG8())}x=J.Vm(z)
 this.Sk.toString
-return new U.uk(x,a,y)},"call$1","gvB",2,0,null,134,[]],
-Dl:[function(){var z,y,x,w
+return new U.uk(x,a,y)},
+Dl:function(){var z,y,x,w
 if(J.de(J.Iz(this.fL.lo),8)){z=J.Vm(this.fL.lo)
 y=J.x(z)
 if(y.n(z,"+")||y.n(z,"-")){this.w5()
@@ -13656,8 +13934,8 @@
 return new U.jK(z,w)}}}else if(y.n(z,"!")){this.w5()
 w=this.BH(this.Ai(),11)
 this.Sk.toString
-return new U.jK(z,w)}}return this.Ai()},"call$0","gna",0,0,null],
-Ai:[function(){var z,y,x
+return new U.jK(z,w)}}return this.Ai()},
+Ai:function(){var z,y,x
 switch(J.Iz(this.fL.lo)){case 10:z=J.Vm(this.fL.lo)
 y=J.x(z)
 if(y.n(z,"this")){this.w5()
@@ -13674,8 +13952,8 @@
 this.Sk.toString
 return new U.XC(x)}else if(J.de(J.Vm(this.fL.lo),"{"))return this.Wc()
 return
-default:return}},"call$0","gUN",0,0,null],
-Wc:[function(){var z,y,x
+default:return}},
+Wc:function(){var z,y,x
 z=[]
 do{this.w5()
 if(J.de(J.Iz(this.fL.lo),9)&&J.de(J.Vm(this.fL.lo),"}"))break
@@ -13688,8 +13966,8 @@
 z.push(new U.wk(x,this.o9()))
 y=this.fL.lo}while(y!=null&&J.de(J.Vm(y),","))
 this.XJ(9,"}")
-return new U.kB(z)},"call$0","grL",0,0,null],
-Cy:[function(){var z,y,x
+return new U.kB(z)},
+Cy:function(){var z,y,x
 if(J.de(J.Vm(this.fL.lo),"true")){this.w5()
 this.Sk.toString
 return H.VM(new U.no(!0),[null])}if(J.de(J.Vm(this.fL.lo),"false")){this.w5()
@@ -13703,8 +13981,8 @@
 y=new U.w6(z)
 x=this.qj()
 if(x==null)return y
-else return new U.Jy(y,null,x)},"call$0","gbc",0,0,null],
-qj:[function(){var z,y
+else return new U.Jy(y,null,x)},
+qj:function(){var z,y
 z=this.fL.lo
 if(z!=null&&J.de(J.Iz(z),9)&&J.de(J.Vm(this.fL.lo),"(")){y=[]
 do{this.w5()
@@ -13712,96 +13990,96 @@
 y.push(this.o9())
 z=this.fL.lo}while(z!=null&&J.de(J.Vm(z),","))
 this.XJ(9,")")
-return y}return},"call$0","gCg",0,0,null],
-eY:[function(){var z,y
+return y}return},
+eY:function(){var z,y
 z=this.fL.lo
 if(z!=null&&J.de(J.Iz(z),9)&&J.de(J.Vm(this.fL.lo),"[")){this.w5()
 y=this.o9()
 this.XJ(9,"]")
-return y}return},"call$0","gw7",0,0,null],
-qF:[function(){var z,y
+return y}return},
+qF:function(){var z,y
 z=J.Vm(this.fL.lo)
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},"call$0","gJA",0,0,null],
-pT:[function(a){var z,y
+return y},
+pT:function(a){var z,y
 z=H.BU(H.d(a)+H.d(J.Vm(this.fL.lo)),null,null)
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,337,602,[]],
-yj:[function(a){var z,y
+return y},
+Ud:function(){return this.pT("")},
+yj:function(a){var z,y
 z=H.IH(H.d(a)+H.d(J.Vm(this.fL.lo)),null)
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,337,602,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+return y},
+tw:function(){return this.yj("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,278,116,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,280,118,[]],
 Ae:{
-"^":"a;vH>-377,P>-603",
-r6:function(a,b){return this.P.call$1(b)},
+"^":"a;vH>-310,P>-480",
 n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,112,96,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,540,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,370,"toString"],
+return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,114,98,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,459,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,305,"toString"],
 $isAe:true,
 "@":function(){return[C.Nw]},
 "<>":[3],
 static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
 "+IndexedValue":[0],
 Bt:{
-"^":"mW;YR",
-gA:function(a){var z=new K.vR(J.GP(this.YR),0,null)
+"^":"mW;ty",
+gA:function(a){var z=new K.vR(J.GP(this.ty),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.YR)},
-gl0:function(a){return J.FN(this.YR)},
+gB:function(a){return J.q8(this.ty)},
+gl0:function(a){return J.FN(this.ty)},
 grZ:function(a){var z,y
-z=this.YR
+z=this.ty
 y=J.U6(z)
 z=new K.Ae(J.xH(y.gB(z),1),y.grZ(z))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-Zv:[function(a,b){var z=new K.Ae(b,J.i4(this.YR,b))
+Zv:function(a,b){var z=new K.Ae(b,J.i4(this.ty,b))
 z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},"call$1","gRV",2,0,null,15,[]],
+return z},
 $asmW:function(a){return[[K.Ae,a]]},
 $asQV:function(a){return[[K.Ae,a]]}},
 vR:{
-"^":"AC;WS,wX,CD",
-gl:function(){return this.CD},
-G:[function(){var z,y
-z=this.WS
-if(z.G()){y=this.wX
-this.wX=y+1
-this.CD=H.VM(new K.Ae(y,z.gl()),[null])
-return!0}this.CD=null
-return!1},"call$0","gqy",0,0,null],
+"^":"AC;XY,vk,CK",
+gl:function(){return this.CK},
+G:function(){var z,y
+z=this.XY
+if(z.G()){y=this.vk
+this.vk=y+1
+this.CK=H.VM(new K.Ae(y,z.gl()),[null])
+return!0}this.CK=null
+return!1},
 $asAC:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{
 "^":"",
 y1:[function(a,b){var z,y,x
 if(a.gYK().nb.x4(b))return a.gYK().nb.t(0,b)
 z=a.gAY()
-if(z!=null&&!J.de(z.gUx(),C.PU)){y=Z.y1(a.gAY(),b)
+if(z!=null&&!J.de(J.Ba(z),C.PU)){y=Z.y1(a.gAY(),b)
 if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return},"call$2","Nb",4,0,null,279,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return},"call$2","rz",4,0,null,281,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
 wX:[function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
 case 118:return 11
-default:return a}},"call$1","uO",2,0,null,280,[]],
+default:return a}},"call$1","uO",2,0,null,282,[]],
 Pn:{
 "^":"a;fY>,P>,G8<",
-r6:function(a,b){return this.P.call$1(b)},
-bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"call$0","gXo",0,0,null],
+bu:function(a){return"("+this.fY+", '"+this.P+"')"},
 $isPn:true},
 hc:{
 "^":"a;MV,zy,jI,VQ",
-zl:[function(){var z,y,x,w,v,u,t,s,r
+zl:function(){var z,y,x,w,v,u,t,s,r
 z=this.jI
 this.VQ=z.G()?z.Wn:null
 for(y=this.MV;x=this.VQ,x!=null;)if(x===32||x===9||x===160)this.VQ=z.G()?z.Wn:null
@@ -13828,8 +14106,8 @@
 t=H.eT(s)}y.push(new Y.Pn(8,t,C.dj.t(0,t)))}else if(C.Nm.tg(C.iq,this.VQ)){s=P.O8(1,this.VQ,J.im)
 r=H.eT(s)
 y.push(new Y.Pn(9,r,C.dj.t(0,r)))
-this.VQ=z.G()?z.Wn:null}else this.VQ=z.G()?z.Wn:null}return y},"call$0","gty",0,0,null],
-DS:[function(){var z,y,x,w,v
+this.VQ=z.G()?z.Wn:null}else this.VQ=z.G()?z.Wn:null}return y},
+DS:function(){var z,y,x,w,v
 z=this.VQ
 y=this.jI
 x=y.G()?y.Wn:null
@@ -13845,8 +14123,8 @@
 w.vM=w.vM+x}x=y.G()?y.Wn:null
 this.VQ=x}this.MV.push(new Y.Pn(1,w.vM,0))
 w.vM=""
-this.VQ=y.G()?y.Wn:null},"call$0","gPJ",0,0,null],
-zI:[function(){var z,y,x,w,v,u
+this.VQ=y.G()?y.Wn:null},
+zI:function(){var z,y,x,w,v,u
 z=this.jI
 y=this.zy
 while(!0){x=this.VQ
@@ -13862,8 +14140,8 @@
 z=this.MV
 if(C.Nm.tg(C.Qy,u))z.push(new Y.Pn(10,u,0))
 else z.push(new Y.Pn(2,u,0))
-y.vM=""},"call$0","gLo",0,0,null],
-jj:[function(){var z,y,x,w,v
+y.vM=""},
+jj:function(){var z,y,x,w,v
 z=this.jI
 y=this.zy
 while(!0){x=this.VQ
@@ -13878,8 +14156,8 @@
 if(typeof z!=="number")return H.s(z)
 if(48<=z&&z<=57)this.e1()
 else this.MV.push(new Y.Pn(3,".",11))}else{this.MV.push(new Y.Pn(6,y.vM,0))
-y.vM=""}},"call$0","gCga",0,0,null],
-e1:[function(){var z,y,x,w,v
+y.vM=""}},
+e1:function(){var z,y,x,w,v
 z=this.zy
 z.KF(P.fc(46))
 y=this.jI
@@ -13891,51 +14169,51 @@
 x=H.eT(v)
 z.vM=z.vM+x
 this.VQ=y.G()?y.Wn:null}this.MV.push(new Y.Pn(7,z.vM,0))
-z.vM=""},"call$0","gpS",0,0,null]},
+z.vM=""}},
 hA:{
 "^":"a;G1>",
-bu:[function(a){return"ParseException: "+this.G1},"call$0","gXo",0,0,null],
+bu:function(a){return"ParseException: "+this.G1},
 static:{RV:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,604,91,[]]},
+DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,481,93,[]]},
 d2:{
 "^":"fr;",
-W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,21,[]],
-LT:[function(a){a.wz.RR(0,this)
-this.xn(a)},"call$1","gaT",2,0,null,21,[]],
-co:[function(a){J.UK(a.ghP(),this)
-this.xn(a)},"call$1","gEW",2,0,null,420,[]],
-CU:[function(a){J.UK(a.ghP(),this)
+W9:function(a){return this.xn(a)},
+LT:function(a){a.wz.RR(0,this)
+this.xn(a)},
+co:function(a){J.UK(a.ghP(),this)
+this.xn(a)},
+CU:function(a){J.UK(a.ghP(),this)
 J.UK(a.gJn(),this)
-this.xn(a)},"call$1","gA2",2,0,null,420,[]],
-ZR:[function(a){var z
+this.xn(a)},
+ZR:function(a){var z
 J.UK(a.ghP(),this)
 z=a.gre()
 if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gES",2,0,null,420,[]],
-ti:[function(a){return this.xn(a)},"call$1","gvs",2,0,null,277,[]],
-o0:[function(a){var z
+this.xn(a)},
+ti:function(a){return this.xn(a)},
+o0:function(a){var z
 for(z=a.gPu(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gX7",2,0,null,277,[]],
-YV:[function(a){J.UK(a.gG3(a),this)
+this.xn(a)},
+YV:function(a){J.UK(a.gG3(a),this)
 J.UK(a.gv4(),this)
-this.xn(a)},"call$1","ghH",2,0,null,21,[]],
-qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,420,[]],
-im:[function(a){J.UK(a.gBb(a),this)
+this.xn(a)},
+qv:function(a){return this.xn(a)},
+im:function(a){J.UK(a.gBb(a),this)
 J.UK(a.gT8(a),this)
-this.xn(a)},"call$1","glf",2,0,null,96,[]],
-Hx:[function(a){J.UK(a.gwz(),this)
-this.xn(a)},"call$1","ghe",2,0,null,96,[]],
-ky:[function(a){J.UK(a.gBb(a),this)
+this.xn(a)},
+Hx:function(a){J.UK(a.gwz(),this)
+this.xn(a)},
+ky:function(a){J.UK(a.gBb(a),this)
 J.UK(a.gT8(a),this)
-this.xn(a)},"call$1","gXf",2,0,null,280,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
+this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 JG:{
-"^":["V22;kW%-555,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-guw:[function(a){return a.kW},null,null,1,0,556,"app",365,385],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,557,30,[],"app",365],
+"^":["V22;kW%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,446,"app",300,316],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,447,30,[],"app",300],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
@@ -13948,28 +14226,98 @@
 a.X0=w
 C.Cc.ZL(a)
 C.Cc.oX(a)
-return a},null,null,0,0,115,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[605],
+return a},null,null,0,0,117,"new ResponseViewerElement$created"]}},
+"+ResponseViewerElement":[482],
 V22:{
 "^":"uL+Pi;",
-$isd3:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+$isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
+"^":"",
+ov:{
+"^":["V23;QV%-483,t7%-310,hX%-310,FZ%-321,Bs%-484,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.QV},null,null,1,0,485,"script",300,316],
+sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,486,30,[],"script",300],
+gBV:[function(a){return a.t7},null,null,1,0,459,"pos",300,316],
+sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,346,30,[],"pos",300],
+gJb:[function(a){return a.hX},null,null,1,0,459,"endPos",300,316],
+sJb:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,346,30,[],"endPos",300],
+gHp:[function(a){return a.FZ},null,null,1,0,330,"coverage",300,316],
+sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,331,30,[],"coverage",300],
+gSw:[function(a){return a.Bs},null,null,1,0,487,"lines",300,301],
+sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,488,30,[],"lines",300],
+rh:[function(a,b){this.VH(a)
+this.ct(a,C.du,0,1)},"call$1","grO",2,0,159,232,[],"scriptChanged"],
+Ly:[function(a,b){this.VH(a)},"call$1","gXN",2,0,159,232,[],"posChanged"],
+xx:[function(a,b){this.ct(a,C.Cv,0,1)
+this.ct(a,C.du,0,1)},"call$1","gTA",2,0,114,232,[],"coverageChanged"],
+qEQ:[function(a,b){var z,y
+z=a.QV
+if(z==null||a.FZ!==!0)return"min-width:32px;"
+y=J.UQ(z.gu9(),b.gRd())
+if(y==null)return"min-width:32px;"
+if(J.de(y,0))return"min-width:32px;background-color:red"
+return"min-width:32px;background-color:green"},"call$1","gL0",2,0,489,182,[],"hitStyle",301],
+VH:[function(a){var z,y,x,w,v
+if(J.iS(a.QV)!==!0){J.SK(a.QV).ml(new T.ZJ(a))
+return}this.ct(a,C.Cv,0,1)
+J.U2(a.Bs)
+z=a.QV.q6(a.t7)
+y=a.hX
+x=a.QV
+if(y==null)J.bi(a.Bs,J.UQ(J.Ew(x),J.xH(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.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}},"call$0","gI2",0,0,116,"_updateProperties"],
+"@":function(){return[C.OLi]},
+static:{"^":"bN<-84,aW<-84,Vn<-84",T5:[function(a){var z,y,x,w,v
+z=R.Jk([])
+y=$.Nd()
+x=P.Py(null,null,null,J.O,W.I0)
+w=J.O
+v=W.cv
+v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
+a.FZ=!1
+a.Bs=z
+a.SO=y
+a.B7=x
+a.X0=v
+C.HD.ZL(a)
+C.HD.oX(a)
+return a},null,null,0,0,117,"new ScriptInsetElement$created"]}},
+"+ScriptInsetElement":[490],
+V23:{
+"^":"uL+Pi;",
+$isd3:true},
+ZJ:{
+"^":"Tp:114;a-84",
+call$1:[function(a){var z,y
+z=this.a
+y=J.RE(z)
+if(J.iS(y.gQV(z))===!0)y.VH(z)},"call$1",null,2,0,114,115,[],"call"],
+$isEH:true},
+"+ ZJ":[387]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 knI:{
-"^":["qe;zw%-377,AP,Lk,tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRd:[function(a){return a.zw},null,null,1,0,540,"line",365,385],
-sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,422,30,[],"line",365],
-gD5:[function(a){var z,y
-if(a.tY==null)return Q.xI.prototype.gD5.call(this,a)
-z=J.u6(a.zw,0)
-y=a.tY
-if(z)return y.gzz()
-else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,370,"hoverText"],
+"^":["rs;jJ%-310,AP,fn,tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gBV:[function(a){return a.jJ},null,null,1,0,459,"pos",300,316],
+sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,346,30,[],"pos",300],
+gD5:[function(a){var z=a.tY
+if(z==null)return Q.xI.prototype.gD5.call(this,a)
+return z.gzz()},null,null,1,0,305,"hoverText"],
+Ly:[function(a,b){this.r6(a,null)},"call$1","gXN",2,0,159,232,[],"posChanged"],
+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)}},"call$1","gvo",2,0,159,115,[],"_updateProperties"],
 goc:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
-z=J.u6(a.zw,0)
+if(J.J5(a.jJ,0)){z=J.iS(a.tY)
 y=a.tY
-if(z)return J.O6(y)
-else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,370,"name"],
+if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.jJ))
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,305,"name"],
+gO3:[function(a){var z,y
+if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
+if(J.J5(a.jJ,0)){z=J.iS(a.tY)
+y=a.tY
+if(z===!0)return Q.xI.prototype.gO3.call(this,a)+"#line="+H.d(y.q6(a.jJ))
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,305,"url"],
 "@":function(){return[C.Ur]},
 static:{Th:[function(a){var z,y,x,w
 z=$.Nd()
@@ -13977,43 +14325,35 @@
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.zw=-1
+a.jJ=-1
 a.Pe=!1
 a.SO=z
 a.B7=y
 a.X0=w
 C.c0.ZL(a)
 C.c0.oX(a)
-return a},null,null,0,0,115,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[606],
-qe:{
+return a},null,null,0,0,117,"new ScriptRefElement$created"]}},
+"+ScriptRefElement":[491],
+rs:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V23;Uz%-607,HJ%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.Uz},null,null,1,0,608,"script",365,385],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,609,30,[],"script",365],
-gnN:[function(a){return a.HJ},null,null,1,0,399,"showCoverage",365,385],
-snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,400,30,[],"showCoverage",365],
+"^":["V24;Uz%-483,HJ%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,485,"script",300,316],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,486,30,[],"script",300],
+gnN:[function(a){return a.HJ},null,null,1,0,330,"showCoverage",300,316],
+snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,331,30,[],"showCoverage",300],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Uz
 if(z==null)return
-J.SK(z)},"call$0","gQd",0,0,114,"enteredView"],
-da:[function(a){this.ct(a,C.YH,0,1)},"call$0","gze",0,0,114,"_triggerHitRefresh"],
-ib:[function(a,b){this.ct(a,C.YH,0,1)},"call$1","gKg",2,0,112,230,[],"showCoverageChanged"],
-PQ:[function(a,b){var z,y
-z=a.Uz
-if(z==null||a.HJ!==!0)return"min-width:32px;"
-y=J.UQ(z.gu9(),J.f2(b))
-if(y==null)return"min-width:32px;"
-if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"call$1","go1",2,0,610,180,[],"hitsStyle",366],
-pA:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
-j9:[function(a,b){J.IQ(J.QP(a.Uz)).ml(new U.l0(a,b))},"call$1","gWp",2,0,157,387,[],"refreshCoverage"],
+J.SK(z)},"call$0","gQd",0,0,116,"enteredView"],
+ib:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"call$1","gKg",2,0,114,232,[],"showCoverageChanged"],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"call$1","gWp",2,0,159,318,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
-static:{"^":"he<-82,iJN<-82,oM<-82",Ry:[function(a){var z,y,x,w
+static:{Ry:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -14025,17 +14365,11 @@
 a.X0=w
 C.cJ.ZL(a)
 C.cJ.oX(a)
-return a},null,null,0,0,115,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[611],
-V23:{
+return a},null,null,0,0,117,"new ScriptViewElement$created"]}},
+"+ScriptViewElement":[492],
+V24:{
 "^":"uL+Pi;",
-$isd3:true},
-l0:{
-"^":"Tp:112;a-82,b-82",
-call$1:[function(a){J.ni(this.a,C.YH,0,1)
-this.b.call$0()},"call$1",null,2,0,112,113,[],"call"],
-$isEH:true},
-"+ l0":[498]}],["service","package:observatory/service.dart",,D,{
+$isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
 ac:function(a,b){var z,y,x,w,v,u,t,s
 if(b==null)return
@@ -14057,22 +14391,25 @@
 u=D.N8
 t=new V.qC(P.Py(null,null,null,w,u),null,null)
 t.$builtinTypeInfo=[w,u]
-s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,null,!1,null,null,a,null,null,!1,null,null,null,null)
+s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"Error":s=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null)
+case"Error":s=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"Isolate":z=P.L5(null,null,null,J.O,D.af)
-x=[]
-x.$builtinTypeInfo=[J.O]
+case"Isolate":z=new V.qC(P.Py(null,null,null,null,null),null,null)
+z.$builtinTypeInfo=[null,null]
+z=R.Jk(z)
+x=P.L5(null,null,null,J.O,D.af)
 w=[]
-w.$builtinTypeInfo=[D.e5]
-v=P.L5(null,null,null,J.O,J.GW)
-v=R.Jk(v)
-s=new D.bv(!1,!1,!1,!1,z,new D.tL(x,w,null,null,20,0),null,null,null,null,null,null,v,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null)
+w.$builtinTypeInfo=[J.O]
+v=[]
+v.$builtinTypeInfo=[D.e5]
+u=P.L5(null,null,null,J.O,J.GW)
+u=R.Jk(u)
+s=new D.bv(z,!1,!1,!1,!1,x,new D.tL(w,v,null,null,20,0),null,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"ServiceError":s=new D.fJ(null,null,null,null,a,null,null,!1,null,null,null,null)
+case"ServiceError":s=new D.fJ(null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"ServiceException":s=new D.hR(null,null,null,null,null,a,null,null,!1,null,null,null,null)
+case"ServiceException":s=new D.hR(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Script":z=D.c2
 x=[]
@@ -14083,21 +14420,21 @@
 w=J.im
 v=new V.qC(P.Py(null,null,null,z,w),null,null)
 v.$builtinTypeInfo=[z,w]
-s=new D.rj(x,v,null,null,null,null,null,null,a,null,null,!1,null,null,null,null)
+s=new D.rj(x,v,null,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 default:z=new V.qC(P.Py(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
-s=new D.SI(z,a,null,null,!1,null,null,null,null)}s.eC(b)
+s=new D.SI(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
 return s},
 D5:[function(a){var z
 if(a!=null){z=J.U6(a)
 z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
-return z},"call$1","SSc",2,0,null,190,[]],
+return z},"call$1","SSc",2,0,null,192,[]],
 ES:[function(a,b){var z=J.x(a)
 if(!!z.$isSI)return
 if(!!z.$isqC)D.Gf(a,b)
-else if(!!z.$iswn)D.f3(a,b)},"call$2","Ja",4,0,null,281,[],145,[]],
-Gf:[function(a,b){a.aN(0,new D.UZ(a,b))},"call$2","Xb",4,0,null,151,[],145,[]],
+else if(!!z.$iswn)D.f3(a,b)},"call$2","Ja",4,0,null,283,[],147,[]],
+Gf:[function(a,b){a.aN(0,new D.UZ(a,b))},"call$2","nV",4,0,null,153,[],147,[]],
 f3:[function(a,b){var z,y,x,w,v,u
 for(z=a.h3,y=0;y<z.length;++y){x=z[y]
 w=J.x(x)
@@ -14106,33 +14443,37 @@
 else u=!1
 if(u)a.u(0,y,b.Zr(x))
 else if(!!w.$iswn)D.f3(x,b)
-else if(v)D.Gf(x,b)}},"call$2","PV",4,0,null,73,[],145,[]],
+else if(v)D.Gf(x,b)}},"call$2","PV",4,0,null,75,[],147,[]],
 af:{
 "^":"Pi;bN@,GR@",
-gXP:[function(){return this.P3},null,null,1,0,612,"owner",365],
+gXP:[function(){return this.P3},null,null,1,0,493,"owner",300],
 gzf:[function(a){var z=this.P3
-return z.gzf(z)},null,null,1,0,613,"vm",365],
+return z.gzf(z)},null,null,1,0,494,"vm",300],
 gF1:[function(a){var z=this.P3
-return z.gF1(z)},null,null,1,0,364,"isolate",365],
-gjO:[function(a){return this.KG},null,null,1,0,370,"id",365],
-gzS:[function(){return this.mQ},null,null,1,0,370,"serviceType",365],
+return z.gF1(z)},null,null,1,0,299,"isolate",300],
+gjO:[function(a){return this.KG},null,null,1,0,305,"id",300],
+gzS:[function(){return this.mQ},null,null,1,0,305,"serviceType",300],
 gPj:[function(a){var z,y
 z=this.gF1(this)
 y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,370,"link",365],
-gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,370,"hashLink",365],
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,305,"link",300],
+gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,305,"hashLink",300],
+gox:function(a){return this.kT},
 gUm:function(){return!1},
 gM8:function(){return!1},
-goc:[function(a){return this.gbN()},null,null,1,0,370,"name",365,366],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",365],
-gzz:[function(){return this.gGR()},null,null,1,0,370,"vmName",365,366],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",365],
-xW:[function(a){if(this.kT)return P.Ab(this,null)
-return this.VD(0)},"call$0","gnB",0,0,null],
-VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
+goc:[function(a){return this.gbN()},null,null,1,0,305,"name",300,301],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",300],
+gzz:[function(){return this.gGR()},null,null,1,0,305,"vmName",300,301],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",300],
+xW:function(a){if(this.kT)return P.Ab(this,null)
+return this.VD(0)},
+VD:function(a){var z
+if(J.de(this.KG,""))return P.Ab(this,null)
 if(this.kT&&this.gM8())return P.Ab(this,null)
-return this.gzf(this).jU(this.gPj(this)).ml(new D.Pa(this))},"call$0","gQU",0,0,null],
-eC:[function(a){var z,y,x,w
+z=this.VR
+if(z==null){z=this.gzf(this).jU(this.gPj(this)).ml(new D.Pa(this)).YM(new D.jI(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")
@@ -14141,10 +14482,10 @@
 w=this.KG
 if(w!=null&&!J.de(w,z.t(a,"id")));this.KG=z.t(a,"id")
 this.mQ=x
-this.bF(0,a,y)},"call$1","gpn",2,0,null,151,[]],
+this.bF(0,a,y)},
 $isaf:true},
 Pa:{
-"^":"Tp:614;a",
+"^":"Tp:495;a",
 call$1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -14152,24 +14493,28 @@
 y=this.a
 if(!J.de(z,y.mQ))return D.ac(y.P3,a)
 y.eC(a)
-return y},"call$1",null,2,0,null,151,[],"call"],
+return y},"call$1",null,2,0,null,153,[],"call"],
+$isEH:true},
+jI:{
+"^":"Tp:117;b",
+call$0:[function(){this.b.VR=null},"call$0",null,0,0,null,"call"],
 $isEH:true},
 u0g:{
 "^":"af;"},
 zM:{
 "^":"O1w;Li<,G2<",
-gzf:[function(a){return this},null,null,1,0,613,"vm",365],
-gF1:[function(a){return},null,null,1,0,364,"isolate",365],
+gzf:[function(a){return this},null,null,1,0,494,"vm",300],
+gF1:[function(a){return},null,null,1,0,299,"isolate",300],
 gi2:[function(){var z=this.z7
-return z.gUQ(z)},null,null,1,0,615,"isolates",365],
-gPj:[function(a){return H.d(this.KG)},null,null,1,0,370,"link",365],
-gYe:[function(a){return this.Ox},null,null,1,0,370,"version",365,366],
-sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,32,30,[],"version",365],
-ghs:[function(){return this.GY},null,null,1,0,370,"architecture",365,366],
-shs:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,32,30,[],"architecture",365],
-gI2:[function(){return this.Rp},null,null,1,0,616,"uptime",365,366],
-sI2:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,617,30,[],"uptime",365],
-hV:[function(a){var z,y,x,w
+return z.gUQ(z)},null,null,1,0,496,"isolates",300],
+gPj:[function(a){return H.d(this.KG)},null,null,1,0,305,"link",300],
+gYe:[function(a){return this.Ox},null,null,1,0,305,"version",300,301],
+sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,32,30,[],"version",300],
+gF6:[function(){return this.GY},null,null,1,0,305,"architecture",300,301],
+sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,32,30,[],"architecture",300],
+gUn:[function(){return this.Rp},null,null,1,0,497,"uptime",300,301],
+sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,498,30,[],"uptime",300],
+hV:function(a){var z,y,x,w
 z=$.rc().R4(0,a)
 if(z==null)return
 y=z.QK
@@ -14178,8 +14523,8 @@
 if(0>=y.length)return H.e(y,0)
 y=J.q8(y[0])
 if(typeof y!=="number")return H.s(y)
-return C.xB.yn(x,w+y)},"call$1","goe",2,0,null,413,[]],
-jz:[function(a){var z,y,x
+return C.xB.yn(x,w+y)},
+jz:function(a){var z,y,x
 z=$.PY().R4(0,a)
 if(z==null)return""
 y=z.QK
@@ -14187,21 +14532,27 @@
 if(0>=y.length)return H.e(y,0)
 y=J.q8(y[0])
 if(typeof y!=="number")return H.s(y)
-return J.Nj(a,0,x+y)},"call$1","gj6",2,0,null,413,[]],
-Zr:[function(a){throw H.b(P.SY(null))},"call$1","gOJ",2,0,null,151,[]],
-Tn:[function(a){var z
+return J.Nj(a,0,x+y)},
+Zr:function(a){throw H.b(P.SY(null))},
+Tn:function(a){var z
 if(a==="")return P.Ab(null,null)
 z=this.z7.t(0,a)
 if(z!=null)return P.Ab(z,null)
-return this.VD(0).ml(new D.MZ(this,a))},"call$1","gFB",2,0,null,618,[]],
-ox:[function(a){var z,y,x
-if(J.co(a,"isolates/")){z=this.jz(a)
-y=this.hV(a)
-return this.Tn(z).ml(new D.oe(this,y))}x=this.A4.t(0,a)
-if(x!=null)return J.am(x)
-return this.jU(a).ml(new D.kk(this,a))},"call$1","gUb",2,0,null,413,[]],
-jU:[function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.mR(this),new D.bp())},"call$1","gzF",2,0,null,413,[]],
-bF:[function(a,b,c){var z,y
+return this.VD(0).ml(new D.MZ(this,a))},
+cv:function(a){var z,y,x,w,v
+z={}
+z.a=a
+y=J.uH(a,"#")
+if(0>=y.length)return H.e(y,0)
+a=y[0]
+z.a=a
+if(J.co(a,"isolates/")){x=this.jz(z.a)
+w=this.hV(z.a)
+return this.Tn(x).ml(new D.oe(this,w))}v=this.A4.t(0,z.a)
+if(v!=null)return J.am(v)
+return this.jU(z.a).ml(new D.kk(z,this))},
+jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.mR(this),new D.bp())},
+bF:function(a,b,c){var z,y
 if(c)return
 this.kT=!0
 z=J.U6(b)
@@ -14211,8 +14562,8 @@
 this.GY=F.Wi(this,C.US,this.GY,y)
 y=z.t(b,"uptime")
 this.Rp=F.Wi(this,C.mh,this.Rp,y)
-this.l9(z.t(b,"isolates"))},"call$2","gYh",4,0,null,151,[],619,[]],
-l9:[function(a){var z,y,x,w,v,u
+this.l9(z.t(b,"isolates"))},
+l9:function(a){var z,y,x,w,v,u
 z=this.z7
 y=P.L5(null,null,null,J.O,D.bv)
 for(x=J.GP(a);x.G();){w=x.gl()
@@ -14222,7 +14573,7 @@
 else{u=D.ac(this,w)
 y.u(0,v,u)
 N.Jx("").To("New isolate '"+H.d(u.KG)+"'")}}y.aN(0,new D.Yu())
-this.z7=y},"call$1","geV",2,0,null,620,[]],
+this.z7=y},
 Lw:function(){this.bN=this.ct(this,C.YS,this.bN,"vm")
 this.GR=this.ct(this,C.KS,this.GR,"vm")
 this.A4.u(0,"vm",this)
@@ -14233,32 +14584,32 @@
 "^":"u0g+Pi;",
 $isd3:true},
 MZ:{
-"^":"Tp:112;a,b",
+"^":"Tp:114;a,b",
 call$1:[function(a){if(!J.x(a).$iszM)return
 return this.a.z7.t(0,this.b)},"call$1",null,2,0,null,56,[],"call"],
 $isEH:true},
 oe:{
-"^":"Tp:112;a,b",
+"^":"Tp:114;b,c",
 call$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.am(a)
-else return a.ox(z)},"call$1",null,2,0,null,16,[],"call"],
+else return a.cv(z)},"call$1",null,2,0,null,16,[],"call"],
 $isEH:true},
 kk:{
-"^":"Tp:614;c,d",
+"^":"Tp:495;a,d",
 call$1:[function(a){var z,y
-z=this.c
+z=this.d
 y=D.ac(z,a)
-if(y.gUm())z.A4.to(this.d,new D.QZ(y))
-return y},"call$1",null,2,0,null,151,[],"call"],
+if(y.gUm())z.A4.to(this.a.a,new D.QZ(y))
+return y},"call$1",null,2,0,null,153,[],"call"],
 $isEH:true},
 QZ:{
-"^":"Tp:115;e",
+"^":"Tp:117;e",
 call$0:[function(){return this.e},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Ey:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z,y,x,w,v
 try{w=C.xr.kV(a)
 z=R.Jk(w)
@@ -14274,53 +14625,53 @@
 P.JS(x)
 w=H.B7(["type","ServiceException","id","","kind","DecodeException","response",a,"message","Could not decode JSON: "+H.d(y)],P.L5(null,null,null,null,null))
 w=R.Jk(w)
-return P.Vu(D.ac(this.a,w),null,null)}},"call$1",null,2,0,null,517,[],"call"],
+return P.Vu(D.ac(this.a,w),null,null)}},"call$1",null,2,0,null,408,[],"call"],
 $isEH:true},
 tm:{
-"^":"Tp:112;b",
+"^":"Tp:114;b",
 call$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)},"call$1",null,2,0,null,159,[],"call"],
+return P.Vu(a,null,null)},"call$1",null,2,0,null,161,[],"call"],
 $isEH:true},
 Gk:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){return!!J.x(a).$isfJ},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 mR:{
-"^":"Tp:112;c",
+"^":"Tp:114;c",
 call$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)},"call$1",null,2,0,null,373,[],"call"],
+return P.Vu(a,null,null)},"call$1",null,2,0,null,308,[],"call"],
 $isEH:true},
 bp:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){return!!J.x(a).$ishR},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Yu:{
-"^":"Tp:355;",
-call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,618,[],16,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,499,[],16,[],"call"],
 $isEH:true},
 e5:{
 "^":"a;SP<,hw<,wZ",
 gaQ:function(){return this.wZ},
-Bv:[function(a){var z,y,x,w,v
+Bv:function(a){var z,y,x,w,v
 z=this.hw
 H.ed(z,0,a)
 for(y=z.length,x=0;x<y;++x){w=this.wZ
 v=z[x]
 if(typeof v!=="number")return H.s(v)
-this.wZ=w+v}},"call$1","gh4",2,0,null,621,[]],
-nZ:[function(a,b){var z,y,x,w,v,u,t
+this.wZ=w+v}},
+nZ:function(a,b){var z,y,x,w,v,u,t
 for(z=this.hw,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.t(a,v)
 if(v>=w)return H.e(b,v)
 u=J.xH(u,b[v])
 z[v]=u
 t=this.wZ
 if(typeof u!=="number")return H.s(u)
-this.wZ=t+u}},"call$2","gNx",4,0,null,621,[],622,[]],
-wY:[function(a,b){var z,y,x,w,v,u
+this.wZ=t+u}},
+wY:function(a,b){var z,y,x,w,v,u
 z=J.U6(b)
 y=this.hw
 x=y.length
@@ -14330,14 +14681,14 @@
 if(!(w<v))break
 u=z.t(b,w)
 if(w>=x)return H.e(y,w)
-y[w]=J.z8(y[w],u)?y[w]:u;++w}},"call$1","gA5",2,0,null,621,[]],
-CJ:[function(){var z,y,x
-for(z=this.hw,y=z.length,x=0;x<y;++x)z[x]=0},"call$0","gWI",0,0,null],
+y[w]=J.z8(y[w],u)?y[w]:u;++w}},
+CJ:function(){var z,y,x
+for(z=this.hw,y=z.length,x=0;x<y;++x)z[x]=0},
 $ise5:true},
 tL:{
 "^":"a;af<,lI<,TR,yP,hD,RP",
 gZ0:function(){return this.TR},
-xZ:[function(a,b){var z,y,x,w,v,u
+xZ:function(a,b){var z,y,x,w,v,u
 this.TR=a
 z=J.U6(b)
 y=z.t(b,"counters")
@@ -14365,43 +14716,45 @@
 this.yP.wY(0,y)
 z=this.lI
 z.push(u)
-if(z.length>this.hD)C.Nm.KI(z,0)},"call$2","gaI",4,0,null,44,[],536,[]]},
+if(z.length>this.hD)C.Nm.KI(z,0)}},
 bv:{
-"^":["uz4;l2,No,EY,eU,A4,KJ,v9,zb,bN:KT@,GR:f5@,Er,cL,LE<-623,Cf,W1,p2,Hw,S9,yv,BC@-528,FF,bj,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null],
-gzf:[function(a){return this.P3},null,null,1,0,613,"vm",365],
-gF1:[function(a){return this},null,null,1,0,364,"isolate",365],
+"^":["uz4;V3,l2,No,EY,eU,A4,KJ,v9,zb,bN:KT@,GR:f5@,Er,cL,LE<-500,Cf,W1,p2,Hw,S9,yv,BC@-420,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+gzf:[function(a){return this.P3},null,null,1,0,494,"vm",300],
+gF1:[function(a){return this},null,null,1,0,299,"isolate",300],
+ghw:[function(){return this.V3},null,null,1,0,501,"counters",300,301],
+shw:[function(a){this.V3=F.Wi(this,C.MR,this.V3,a)},null,null,3,0,495,30,[],"counters",300],
 gPj:function(a){return this.KG},
 gHP:function(){return"#/"+H.d(this.KG)},
-gko:[function(){return this.l2},null,null,1,0,399,"pausedOnStart",365,366],
-sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,400,30,[],"pausedOnStart",365],
-geB:[function(){return this.No},null,null,1,0,399,"pausedOnExit",365,366],
-seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,400,30,[],"pausedOnExit",365],
-gLd:[function(){return this.EY},null,null,1,0,399,"running",365,366],
-sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,400,30,[],"running",365],
-gaj:[function(){return this.eU},null,null,1,0,399,"idle",365,366],
-saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,400,30,[],"idle",365],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,624,413,[],"relativeLink",365],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,624,413,[],"relativeHashLink",365],
-RL:[function(){return this.A4.t(0,"code/tag-0")},"call$0","gOT",0,0,null],
-N3:[function(a){var z,y,x,w
+gko:[function(){return this.l2},null,null,1,0,330,"pausedOnStart",300,301],
+sko:[function(a){this.l2=F.Wi(this,C.NT,this.l2,a)},null,null,3,0,331,30,[],"pausedOnStart",300],
+geB:[function(){return this.No},null,null,1,0,330,"pausedOnExit",300,301],
+seB:[function(a){this.No=F.Wi(this,C.wq,this.No,a)},null,null,3,0,331,30,[],"pausedOnExit",300],
+gLd:[function(){return this.EY},null,null,1,0,330,"running",300,301],
+sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,331,30,[],"running",300],
+gaj:[function(){return this.eU},null,null,1,0,330,"idle",300,301],
+saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,331,30,[],"idle",300],
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,502,503,[],"relativeLink",300],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,502,503,[],"relativeHashLink",300],
+RL:function(){return this.A4.t(0,"code/tag-0")},
+N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
 for(x=J.GP(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
 this.c2()
 this.pl(a,z)
 w=y.t(a,"exclusive_trie")
-if(w!=null)this.BC=this.KQ(w,z)},"call$1","gNk",2,0,null,625,[]],
-c2:[function(){var z=this.A4
-z.gUQ(z).aN(0,new D.iz())},"call$0","gKW",0,0,null],
-pl:[function(a,b){var z,y,x,w
+if(w!=null)this.BC=this.KQ(w,z)},
+c2:function(){var z=this.A4
+z.gUQ(z).aN(0,new D.iz())},
+pl:function(a,b){var z,y,x,w
 z=J.U6(a)
 y=z.t(a,"codes")
 x=z.t(a,"samples")
 for(z=J.GP(y);z.G();){w=z.gl()
-J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,625,[],626,[]],
-Ms:[function(a){return this.ox("coverage").ml(this.gJJ())},"call$0","gWp",0,0,null],
-ZA:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"call$1","gJJ",2,0,627,628,[]],
-Zr:[function(a){var z,y,x
+J.UQ(w,"code").eL(w,b,x)}},
+Ms:function(a){return this.cv("coverage").ml(this.gJJ())},
+ZA:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"call$1","gJJ",2,0,504,505,[]],
+Zr:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
 y=this.A4
@@ -14409,36 +14762,36 @@
 if(x!=null)return x
 x=D.ac(this,a)
 if(x.gUm())y.u(0,z,x)
-return x},"call$1","gOJ",2,0,null,151,[]],
-ox:[function(a){var z=this.A4.t(0,a)
+return x},
+cv:function(a){var z=this.A4.t(0,a)
 if(z!=null)return J.am(z)
-return this.P3.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this,a))},"call$1","gUb",2,0,null,413,[]],
-gVc:[function(){return this.v9},null,null,1,0,384,"rootLib",365,366],
-sVc:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,386,30,[],"rootLib",365],
-gf4:[function(){return this.zb},null,null,1,0,629,"topFrame",365,366],
-sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,614,30,[],"topFrame",365],
-goc:[function(a){return this.KT},null,null,1,0,370,"name",365,366],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",365],
-gzz:[function(){return this.f5},null,null,1,0,370,"vmName",365,366],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",365],
-gv1:[function(){return this.Er},null,null,1,0,370,"mainPort",365,366],
-sv1:[function(a){this.Er=F.Wi(this,C.wT,this.Er,a)},null,null,3,0,32,30,[],"mainPort",365],
-gw2:[function(){return this.cL},null,null,1,0,630,"entry",365,366],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,631,30,[],"entry",365],
-gCi:[function(){return this.Cf},null,null,1,0,540,"newHeapUsed",365,366],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,422,30,[],"newHeapUsed",365],
-gcu:[function(){return this.W1},null,null,1,0,540,"oldHeapUsed",365,366],
-scu:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,422,30,[],"oldHeapUsed",365],
-gab:[function(){return this.p2},null,null,1,0,540,"newHeapCapacity",365,366],
-sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,422,30,[],"newHeapCapacity",365],
-gRy:[function(){return this.Hw},null,null,1,0,540,"oldHeapCapacity",365,366],
-sRy:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,422,30,[],"oldHeapCapacity",365],
-gNh:[function(a){return this.S9},null,null,1,0,370,"fileAndLine",365,366],
+return this.P3.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this,a))},
+gVc:[function(){return this.v9},null,null,1,0,315,"rootLib",300,301],
+sVc:[function(a){this.v9=F.Wi(this,C.xe,this.v9,a)},null,null,3,0,317,30,[],"rootLib",300],
+gf4:[function(){return this.zb},null,null,1,0,501,"topFrame",300,301],
+sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,495,30,[],"topFrame",300],
+goc:[function(a){return this.KT},null,null,1,0,305,"name",300,301],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",300],
+gzz:[function(){return this.f5},null,null,1,0,305,"vmName",300,301],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",300],
+gv1:[function(){return this.Er},null,null,1,0,305,"mainPort",300,301],
+sv1:[function(a){this.Er=F.Wi(this,C.wT,this.Er,a)},null,null,3,0,32,30,[],"mainPort",300],
+gw2:[function(){return this.cL},null,null,1,0,506,"entry",300,301],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,507,30,[],"entry",300],
+gCi:[function(){return this.Cf},null,null,1,0,459,"newHeapUsed",300,301],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,346,30,[],"newHeapUsed",300],
+gcu:[function(){return this.W1},null,null,1,0,459,"oldHeapUsed",300,301],
+scu:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,346,30,[],"oldHeapUsed",300],
+gab:[function(){return this.p2},null,null,1,0,459,"newHeapCapacity",300,301],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,346,30,[],"newHeapCapacity",300],
+gRy:[function(){return this.Hw},null,null,1,0,459,"oldHeapCapacity",300,301],
+sRy:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,346,30,[],"oldHeapCapacity",300],
+gNh:[function(a){return this.S9},null,null,1,0,305,"fileAndLine",300,301],
 at:function(a,b){return this.gNh(this).call$1(b)},
-sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",365],
-gkc:[function(a){return this.yv},null,null,1,0,632,"error",365,366],
-skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,633,30,[],"error",365],
-bF:[function(a,b,c){var z,y,x,w
+sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",300],
+gkc:[function(a){return this.yv},null,null,1,0,508,"error",300,301],
+skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,509,30,[],"error",300],
+bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z=J.U6(b)
 y=z.t(b,"mainPort")
 this.Er=F.Wi(this,C.wT,this.Er,y)
@@ -14451,19 +14804,44 @@
 D.ES(b,this)
 if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(b))
 return}y=z.t(b,"rootLib")
-this.v9=F.Wi(this,C.iF,this.v9,y)
+this.v9=F.Wi(this,C.xe,this.v9,y)
 if(z.t(b,"entry")!=null){y=z.t(b,"entry")
 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.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
-x=H.B7([],P.L5(null,null,null,null,null))
-J.kH(z.t(b,"timers"),new D.Qq(x))
+x=z.t(b,"tagCounters")
+if(x!=null){y=J.U6(x)
+w=y.t(x,"names")
+v=y.t(x,"counters")
+y=J.U6(v)
+u=0
+t=0
+while(!0){s=y.gB(v)
+if(typeof s!=="number")return H.s(s)
+if(!(t<s))break
+s=y.t(v,t)
+if(typeof s!=="number")return H.s(s)
+u+=s;++t}s=H.B7([],P.L5(null,null,null,null,null))
+s=R.Jk(s)
+this.V3=F.Wi(this,C.MR,this.V3,s)
+if(u===0){y=J.U6(w)
+t=0
+while(!0){s=y.gB(w)
+if(typeof s!=="number")return H.s(s)
+if(!(t<s))break
+J.kW(this.V3,y.t(w,t),"0.0%");++t}}else{s=J.U6(w)
+t=0
+while(!0){r=s.gB(w)
+if(typeof r!=="number")return H.s(r)
+if(!(t<r))break
+J.kW(this.V3,s.t(w,t),C.CD.yM(J.FW(y.t(v,t),u)*100,2)+"%");++t}}}q=H.B7([],P.L5(null,null,null,null,null))
+J.kH(z.t(b,"timers"),new D.Qq(q))
 y=this.LE
-w=J.w1(y)
-w.u(y,"total",x.t(0,"time_total_runtime"))
-w.u(y,"compile",x.t(0,"time_compilation"))
-w.u(y,"gc",0)
-w.u(y,"init",J.WB(J.WB(J.WB(x.t(0,"time_script_loading"),x.t(0,"time_creating_snapshot")),x.t(0,"time_isolate_initialization")),x.t(0,"time_bootstrap")))
-w.u(y,"dart",x.t(0,"time_dart_execution"))
+s=J.w1(y)
+s.u(y,"total",q.t(0,"time_total_runtime"))
+s.u(y,"compile",q.t(0,"time_compilation"))
+s.u(y,"gc",0)
+s.u(y,"init",J.WB(J.WB(J.WB(q.t(0,"time_script_loading"),q.t(0,"time_creating_snapshot")),q.t(0,"time_isolate_initialization")),q.t(0,"time_bootstrap")))
+s.u(y,"dart",q.t(0,"time_dart_execution"))
 y=J.UQ(z.t(b,"heap"),"usedNew")
 this.Cf=F.Wi(this,C.IO,this.Cf,y)
 y=J.UQ(z.t(b,"heap"),"usedOld")
@@ -14482,14 +14860,14 @@
 y=this.l2!==!0&&this.No!==!0&&y!==!0
 this.eU=F.Wi(this,C.q2,this.eU,y)
 z=z.t(b,"error")
-this.yv=F.Wi(this,C.YU,this.yv,z)},"call$2","gYh",4,0,null,151,[],619,[]],
-m7:[function(){return this.P3.jU(H.d(this.KG)+"/profile/tag").ml(new D.AP(this))},"call$0","gTK",0,0,null],
-KQ:[function(a,b){this.FF=0
+this.yv=F.Wi(this,C.YU,this.yv,z)},
+m7:function(){return this.P3.jU(H.d(this.KG)+"/profile/tag").ml(new D.AP(this))},
+KQ:function(a,b){this.FF=0
 this.bj=a
 if(a==null)return
 if(J.u6(J.q8(a),3))return
-return this.AW(b)},"call$2","gTh",4,0,null,236,[],626,[]],
-AW:[function(a){var z,y,x,w,v,u,t,s,r,q
+return this.AW(b)},
+AW:function(a){var z,y,x,w,v,u,t,s,r,q
 z=this.bj
 y=this.FF
 if(typeof y!=="number")return y.g()
@@ -14517,15 +14895,15 @@
 y=u.Jv
 t=q.Av
 if(typeof t!=="number")return H.s(t)
-u.Jv=y+t}return u},"call$1","gyi",2,0,null,626,[]],
+u.Jv=y+t}return u},
 $isbv:true,
 static:{"^":"ZW"}},
 uz4:{
 "^":"u0g+Pi;",
 $isd3:true},
 iz:{
-"^":"Tp:112;",
-call$1:[function(a){if(!!J.x(a).$iskx){a.jv=F.Wi(a,C.QK,a.jv,0)
+"^":"Tp:114;",
+call$1:[function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
 a.Du=0
 a.fF=0
 a.mM=F.Wi(a,C.EF,a.mM,"")
@@ -14535,42 +14913,42 @@
 J.U2(a.Oo)}},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 oa:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=J.U6(a)
-z.t(a,"script").SC(z.t(a,"hits"))},"call$1",null,2,0,null,634,[],"call"],
+z.t(a,"script").vW(z.t(a,"hits"))},"call$1",null,2,0,null,510,[],"call"],
 $isEH:true},
 KQ:{
-"^":"Tp:614;a,b",
+"^":"Tp:495;a,b",
 call$1:[function(a){var z,y
 z=this.a
 y=D.ac(z,a)
 if(y.gUm())z.A4.to(this.b,new D.Ai(y))
-return y},"call$1",null,2,0,null,151,[],"call"],
+return y},"call$1",null,2,0,null,153,[],"call"],
 $isEH:true},
 Ai:{
-"^":"Tp:115;c",
+"^":"Tp:117;c",
 call$0:[function(){return this.c},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Qq:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,635,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,511,[],"call"],
 $isEH:true},
 AP:{
-"^":"Tp:614;a",
+"^":"Tp:495;a",
 call$1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.KJ
 y.xZ(z/1000,a)
-return y},"call$1",null,2,0,null,190,[],"call"],
+return y},"call$1",null,2,0,null,192,[],"call"],
 $isEH:true},
 SI:{
-"^":"af;RF,P3,KG,mQ,kT,bN,GR,AP,Lk",
+"^":"af;RF,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
 gUm:function(){return(J.de(this.mQ,"Class")||J.de(this.mQ,"Function")||J.de(this.mQ,"Library"))&&!J.co(this.KG,$.n7)},
 gM8:function(){return this.gUm()},
-bu:[function(a){return P.vW(this.RF)},"call$0","gXo",0,0,null],
-bF:[function(a,b,c){var z,y,x
+bu:function(a){return P.vW(this.RF)},
+bF:function(a,b,c){var z,y,x
 this.kT=!c
 z=this.RF
 z.V1(0)
@@ -14580,34 +14958,33 @@
 this.bN=this.ct(0,C.YS,this.bN,x)
 y=y.t(0,"name")
 this.GR=this.ct(this,C.KS,this.GR,y)
-D.ES(z,this.P3)},"call$2","gYh",4,0,null,151,[],619,[]],
-FV:[function(a,b){return this.RF.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
-V1:[function(a){return this.RF.V1(0)},"call$0","gRa",0,0,null],
-di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,275,[]],
-x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,453,[]],
-aN:[function(a,b){return this.RF.Zp.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
-t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,453,[]],
-u:[function(a,b,c){this.RF.u(0,b,c)
-return c},"call$2","gj3",4,0,null,453,[],275,[]],
+D.ES(z,this.P3)},
+FV:function(a,b){return this.RF.FV(0,b)},
+V1:function(a){return this.RF.V1(0)},
+di:function(a){return this.RF.Zp.di(a)},
+x4:function(a){return this.RF.Zp.x4(a)},
+aN:function(a,b){return this.RF.Zp.aN(0,b)},
+Rz:function(a,b){return this.RF.Rz(0,b)},
+t:function(a,b){return this.RF.Zp.t(0,b)},
+u:function(a,b,c){this.RF.u(0,b,c)
+return c},
 gl0:function(a){var z=this.RF.Zp
 return z.gB(z)===0},
 gor:function(a){var z=this.RF.Zp
 return z.gB(z)!==0},
-gvc:function(a){var z=this.RF.Zp
-return z.gvc(z)},
+gvc:function(){return this.RF.Zp.gvc()},
 gUQ:function(a){var z=this.RF.Zp
 return z.gUQ(z)},
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 BN:[function(a){var z=this.RF
-return z.BN(z)},"call$0","gDx",0,0,399],
-nq:[function(a,b){var z=this.RF
-return z.nq(z,b)},"call$1","giA",2,0,null,29,[]],
-ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gyWA",6,0,null,256,[],230,[],231,[]],
-k0:[function(a){return},"call$0","gqw",0,0,114],
+return z.BN(z)},"call$0","gDx",0,0,330],
+nq:function(a,b){var z=this.RF
+return z.nq(z,b)},
+ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
+k0:[function(a){return},"call$0","gqw",0,0,116],
 ni:[function(a){this.RF.AP=null
-return},"call$0","gl1",0,0,114],
+return},"call$0","gl1",0,0,116],
 gUj:function(a){var z=this.RF
 return z.gUj(z)},
 gnz:function(a){var z,y
@@ -14623,16 +15000,16 @@
 $isd3:true,
 static:{"^":"n7"}},
 pD:{
-"^":"wVq;J6,LD,jo,Ne,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",
-gfY:[function(a){return this.J6},null,null,1,0,370,"kind",365,366],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",365],
-gG1:[function(a){return this.LD},null,null,1,0,370,"message",365,366],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",365],
-gFA:[function(a){return this.jo},null,null,1,0,384,"exception",365,366],
-sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,386,30,[],"exception",365],
-gK7:[function(){return this.Ne},null,null,1,0,384,"stacktrace",365,366],
-sK7:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,386,30,[],"stacktrace",365],
-bF:[function(a,b,c){var z,y,x
+"^":"wVq;J6,LD,jo,Ne,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+gfY:[function(a){return this.J6},null,null,1,0,305,"kind",300,301],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",300],
+gG1:[function(a){return this.LD},null,null,1,0,305,"message",300,301],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",300],
+gFA:[function(a){return this.jo},null,null,1,0,315,"exception",300,301],
+sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,317,30,[],"exception",300],
+gK7:[function(){return this.Ne},null,null,1,0,315,"stacktrace",300,301],
+sK7:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,317,30,[],"stacktrace",300],
+bF:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"kind")
 this.J6=F.Wi(this,C.fy,this.J6,y)
@@ -14646,17 +15023,17 @@
 z="DartError "+H.d(this.J6)
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},"call$2","gYh",4,0,null,151,[],619,[]]},
+this.GR=this.ct(this,C.KS,this.GR,z)}},
 wVq:{
 "^":"af+Pi;",
 $isd3:true},
 fJ:{
-"^":"dZL;J6,LD,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",
-gfY:[function(a){return this.J6},null,null,1,0,370,"kind",365,366],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",365],
-gG1:[function(a){return this.LD},null,null,1,0,370,"message",365,366],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",365],
-bF:[function(a,b,c){var z,y
+"^":"dZL;J6,LD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+gfY:[function(a){return this.J6},null,null,1,0,305,"kind",300,301],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",300],
+gG1:[function(a){return this.LD},null,null,1,0,305,"message",300,301],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",300],
+bF:function(a,b,c){var z,y
 this.kT=!0
 z=J.U6(b)
 y=z.t(b,"kind")
@@ -14666,20 +15043,20 @@
 z="ServiceError "+H.d(this.J6)
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},"call$2","gYh",4,0,null,151,[],619,[]],
+this.GR=this.ct(this,C.KS,this.GR,z)},
 $isfJ:true},
 dZL:{
 "^":"af+Pi;",
 $isd3:true},
 hR:{
-"^":"w8F;J6,LD,IV,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",
-gfY:[function(a){return this.J6},null,null,1,0,370,"kind",365,366],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",365],
-gG1:[function(a){return this.LD},null,null,1,0,370,"message",365,366],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",365],
-gn9:[function(a){return this.IV},null,null,1,0,115,"response",365,366],
-sn9:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,112,30,[],"response",365],
-bF:[function(a,b,c){var z,y
+"^":"w8F;J6,LD,IV,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+gfY:[function(a){return this.J6},null,null,1,0,305,"kind",300,301],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",300],
+gG1:[function(a){return this.LD},null,null,1,0,305,"message",300,301],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",300],
+gn9:[function(a){return this.IV},null,null,1,0,117,"response",300,301],
+sn9:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,114,30,[],"response",300],
+bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
 this.J6=F.Wi(this,C.fy,this.J6,y)
@@ -14690,23 +15067,34 @@
 z="ServiceException "+H.d(this.J6)
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},"call$2","gYh",4,0,null,151,[],619,[]],
+this.GR=this.ct(this,C.KS,this.GR,z)},
 $ishR:true},
 w8F:{
 "^":"af+Pi;",
 $isd3:true},
 c2:{
-"^":["a;Rd>-377,a4>-398",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd<-310,a4>-329",function(){return[C.Nw]},function(){return[C.Nw]}],
 $isc2:true},
 rj:{
-"^":["V4b;Sw<-82,u9<-82,Gz,J6,mB,wA,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gtD:[function(a){return this.Gz},null,null,1,0,368,"library",365,366],
-stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,369,30,[],"library",365],
-gfY:[function(a){return this.J6},null,null,1,0,370,"kind",365,366],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",365],
+"^":["V4b;Sw>-84,u9<-84,Gz,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gtD:[function(a){return this.Gz},null,null,1,0,303,"library",300,301],
+stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,304,30,[],"library",300],
+gfY:[function(a){return this.J6},null,null,1,0,305,"kind",300,301],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",300],
+gVB:[function(){return this.wJ},null,null,1,0,459,"firstTokenPos",300,301],
+sVB:[function(a){var z=this.wJ
+if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Gd,z,a)
+z.$builtinTypeInfo=[null]
+this.nq(this,z)}this.wJ=a},null,null,3,0,346,30,[],"firstTokenPos",300],
+gSKw:[function(){return this.lx},null,null,1,0,459,"lastTokenPos",300,301],
+sSKw:[function(a){var z=this.lx
+if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.kA,z,a)
+z.$builtinTypeInfo=[null]
+this.nq(this,z)}this.lx=a},null,null,3,0,346,30,[],"lastTokenPos",300],
 gUm:function(){return!0},
 gM8:function(){return!0},
-bF:[function(a,b,c){var z,y,x
+q6:function(a){return this.y6.t(0,a)},
+bF:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"kind")
 this.J6=F.Wi(this,C.fy,this.J6,y)
@@ -14718,9 +15106,43 @@
 this.bN=this.ct(this,C.YS,this.bN,y)
 y=this.wA
 this.GR=this.ct(this,C.KS,this.GR,y)
-this.W8(z.t(b,"source"))},"call$2","gYh",4,0,null,151,[],619,[]],
-SC:[function(a){var z,y,x,w,v
-if(!this.kT)this.xW(0)
+this.W8(z.t(b,"source"))
+this.up(z.t(b,"tokenPosTable"))},
+up:function(a){var z,y,x,w,v,u,t,s,r
+if(a==null)return
+this.y6=H.B7([],P.L5(null,null,null,null,null))
+this.FB=H.B7([],P.L5(null,null,null,null,null))
+this.wJ=F.Wi(this,C.Gd,this.wJ,null)
+this.lx=F.Wi(this,C.kA,this.lx,null)
+for(z=J.GP(a);z.G();){y=z.gl()
+x=J.U6(y)
+w=x.t(y,0)
+v=1
+while(!0){u=x.gB(y)
+if(typeof u!=="number")return H.s(u)
+if(!(v<u))break
+t=x.t(y,v)
+s=x.t(y,v+1)
+u=this.wJ
+if(u==null){if(this.gnz(this)&&!J.de(u,t)){u=new T.qI(this,C.Gd,u,t)
+u.$builtinTypeInfo=[null]
+this.nq(this,u)}this.wJ=t
+u=this.lx
+if(this.gnz(this)&&!J.de(u,t)){u=new T.qI(this,C.kA,u,t)
+u.$builtinTypeInfo=[null]
+this.nq(this,u)}this.lx=t}else{u=J.Bl(u,t)?this.wJ:t
+r=this.wJ
+if(this.gnz(this)&&!J.de(r,u)){r=new T.qI(this,C.Gd,r,u)
+r.$builtinTypeInfo=[null]
+this.nq(this,r)}this.wJ=u
+u=J.J5(this.lx,t)?this.lx:t
+r=this.lx
+if(this.gnz(this)&&!J.de(r,u)){r=new T.qI(this,C.kA,r,u)
+r.$builtinTypeInfo=[null]
+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,v
 z=J.U6(a)
 y=this.u9
 x=J.w1(y)
@@ -14729,8 +15151,8 @@
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
 x.u(y,z.t(a,w),z.t(a,w+1))
-w+=2}},"call$1","gHS",2,0,null,636,[]],
-W8:[function(a){var z,y,x,w,v
+w+=2}},
+W8:function(a){var z,y,x,w,v
 this.kT=!1
 if(a==null)return
 z=J.uH(a,"\n")
@@ -14741,7 +15163,7 @@
 x.V1(y)
 N.Jx("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
 for(w=0;w<z.length;w=v){v=w+1
-x.h(y,new D.c2(v,z[w]))}},"call$1","gI3",2,0,null,33,[]]},
+x.h(y,new D.c2(v,z[w]))}}},
 V4b:{
 "^":"af+Pi;",
 $isd3:true},
@@ -14749,28 +15171,28 @@
 "^":"a;Yu<,Du<,fF<",
 $isN8:true},
 Q4:{
-"^":["Pi;Yu<-377,Fm<-398,L4<-398,AP,Lk",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null],
+"^":["Pi;Yu<-310,Fm<-329,L4<-329,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null],
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,370,"formattedAddress",365],
+return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,305,"formattedAddress",300],
 Io:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
 if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,637,143,[],"formattedInclusive",365],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,512,145,[],"formattedInclusive",300],
 HU:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gOo(),this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,637,143,[],"formattedExclusive",365],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,512,145,[],"formattedExclusive",300],
 $isQ4:true,
-static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","I9",4,0,null,131,[],241,[]]}},
+static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","I9",4,0,null,133,[],243,[]]}},
 WAE:{
 "^":"a;uX",
-bu:[function(a){return this.uX},"call$0","gXo",0,0,null],
+bu:function(a){return this.uX},
 static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.nj
 else if(z.n(a,"Dart"))return C.l8
@@ -14778,7 +15200,7 @@
 else if(z.n(a,"Reused"))return C.yP
 else if(z.n(a,"Tag"))return C.oA
 N.Jx("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.hS())},"call$1","J6",2,0,null,91,[]]}},
+throw H.b(P.hS())},"call$1","Ma",2,0,null,93,[]]}},
 Vi:{
 "^":"a;tT>,Av<",
 $isVi:true},
@@ -14786,24 +15208,24 @@
 "^":"a;tT>,Av<,wd>,Jv",
 $ist9:true},
 kx:{
-"^":["Zqa;J6,jv,Du@-377,fF@-377,vg@-377,Mb@-377,VS<-82,ci<-82,va<-82,Oo<-82,mM,qH,Ni,MO,oc*,zz@,TD,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,638,"kind",365,366],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,639,30,[],"kind",365],
-glt:[function(){return this.jv},null,null,1,0,540,"totalSamplesInProfile",365,366],
-slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,422,30,[],"totalSamplesInProfile",365],
-gAg:[function(){return this.mM},null,null,1,0,370,"formattedInclusiveTicks",365,366],
-sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",365],
-ga3:[function(){return this.qH},null,null,1,0,370,"formattedExclusiveTicks",365,366],
-sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",365],
-gL1E:[function(){return this.Ni},null,null,1,0,384,"objectPool",365,366],
-sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,386,30,[],"objectPool",365],
-gMj:[function(a){return this.MO},null,null,1,0,384,"function",365,366],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,386,30,[],"function",365],
+"^":["Zqa;J6,xM,Du@-310,fF@-310,vg@-310,Mb@-310,VS<-84,ci<-84,va<-84,Oo<-84,mM,qH,Ni,MO,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,513,"kind",300,301],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,514,30,[],"kind",300],
+glt:[function(){return this.xM},null,null,1,0,459,"totalSamplesInProfile",300,301],
+slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,346,30,[],"totalSamplesInProfile",300],
+gAg:[function(){return this.mM},null,null,1,0,305,"formattedInclusiveTicks",300,301],
+sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",300],
+gN8:[function(){return this.qH},null,null,1,0,305,"formattedExclusiveTicks",300,301],
+sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",300],
+gL1E:[function(){return this.Ni},null,null,1,0,315,"objectPool",300,301],
+sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,317,30,[],"objectPool",300],
+gMj:[function(a){return this.MO},null,null,1,0,315,"function",300,301],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,317,30,[],"function",300],
 gUm:function(){return!0},
 gM8:function(){return!0},
-VD:[function(a){if(J.de(this.J6,C.l8))return D.af.prototype.VD.call(this,this)
-return P.Ab(this,null)},"call$0","gQU",0,0,null],
-fp:[function(a,b,c){var z,y,x,w,v,u
+VD:function(a){if(J.de(this.J6,C.l8))return D.af.prototype.VD.call(this,this)
+return P.Ab(this,null)},
+fp:function(a,b,c){var z,y,x,w,v,u
 z=J.U6(b)
 y=J.w1(a)
 x=0
@@ -14814,9 +15236,9 @@
 u=H.BU(z.t(b,x+1),null,null)
 if(v>>>0!==v||v>=c.length)return H.e(c,v)
 y.h(a,new D.Vi(c[v],u))
-x+=2}y.GT(a,new D.fx())},"call$3","goR",6,0,null,640,[],236,[],641,[]],
-eL:[function(a,b,c){var z,y
-this.jv=F.Wi(this,C.QK,this.jv,c)
+x+=2}y.GT(a,new D.fx())},
+eL:function(a,b,c){var z,y
+this.xM=F.Wi(this,C.QK,this.xM,c)
 z=J.U6(a)
 this.fF=H.BU(z.t(a,"inclusive_ticks"),null,null)
 this.Du=H.BU(z.t(a,"exclusive_ticks"),null,null)
@@ -14824,11 +15246,11 @@
 this.fp(this.ci,z.t(a,"callees"),b)
 y=z.t(a,"ticks")
 if(y!=null)this.pd(y)
-z=D.Vb(this.fF,this.jv)+" ("+H.d(this.fF)+")"
+z=D.Vb(this.fF,this.xM)+" ("+H.d(this.fF)+")"
 this.mM=F.Wi(this,C.EF,this.mM,z)
-z=D.Vb(this.Du,this.jv)+" ("+H.d(this.Du)+")"
-this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,642,[],626,[],643,[]],
-bF:[function(a,b,c){var z,y,x,w
+z=D.Vb(this.Du,this.xM)+" ("+H.d(this.Du)+")"
+this.qH=F.Wi(this,C.uU,this.qH,z)},
+bF:function(a,b,c){var z,y,x,w
 z=J.U6(b)
 this.oc=z.t(b,"user_name")
 this.zz=z.t(b,"name")
@@ -14848,10 +15270,10 @@
 y=J.U6(z)
 this.kT=!J.de(y.gB(z),0)||!J.de(this.J6,C.l8)
 z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
-this.TD=F.Wi(this,C.zS,this.TD,z)},"call$2","gYh",4,0,null,190,[],619,[]],
-gvS:[function(){return this.TD},null,null,1,0,399,"hasDisassembly",365,366],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,400,30,[],"hasDisassembly",365],
-xs:[function(a){var z,y,x,w,v,u,t,s
+this.TD=F.Wi(this,C.zS,this.TD,z)},
+gvS:[function(){return this.TD},null,null,1,0,330,"hasDisassembly",300,301],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,331,30,[],"hasDisassembly",300],
+xs:function(a){var z,y,x,w,v,u,t,s
 z=this.va
 y=J.w1(z)
 y.V1(z)
@@ -14864,8 +15286,8 @@
 t=x.t(a,w+2)
 s=!J.de(x.t(a,w),"")?H.BU(x.t(a,w),null,null):0
 y.h(z,new D.Q4(s,u,t,null,null))
-w+=3}},"call$1","gxk",2,0,null,644,[]],
-pd:[function(a){var z,y,x,w,v,u
+w+=3}},
+pd:function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=this.Oo
 x=J.w1(y)
@@ -14875,41 +15297,42 @@
 if(!(w<v))break
 u=H.BU(z.t(a,w),16,null)
 x.u(y,u,new D.N8(u,H.BU(z.t(a,w+1),null,null),H.BU(z.t(a,w+2),null,null)))
-w+=3}},"call$1","gfi",2,0,null,645,[]],
-tg:[function(a,b){J.J5(b,this.vg)
-return!1},"call$1","gdj",2,0,null,646,[]],
-QQ:[function(){return this.F3(this.VS)},"call$0","gZzZ",0,0,null],
-dJ:[function(a){return this.Ov(this.VS,a)},"call$1","gf7",2,0,null,143,[]],
-F3:[function(a){var z,y,x
+w+=3}},
+tg:function(a,b){J.J5(b,this.vg)
+return!1},
+QQ:function(){return this.F3(this.VS)},
+dJ:function(a){return this.Ov(this.VS,a)},
+F3:function(a){var z,y,x
 for(z=J.GP(a),y=0;z.G();){x=z.gl().gAv()
 if(typeof x!=="number")return H.s(x)
-y+=x}return y},"call$1","gh9",2,0,null,640,[]],
-Ov:[function(a,b){var z,y
+y+=x}return y},
+Ov:function(a,b){var z,y
 for(z=J.GP(a);z.G();){y=z.gl()
-if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,640,[],143,[]],
+if(J.de(J.on(y),b))return y.gAv()}return 0},
+gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,330,"isDartCode",300],
 $iskx:true,
-static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],241,[]]}},
+static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,133,[],243,[]]}},
 Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 fx:{
-"^":"Tp:355;",
-call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,131,[],187,[],"call"],
+"^":"Tp:293;",
+call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,133,[],189,[],"call"],
 $isEH:true},
 UZ:{
-"^":"Tp:355;a,b",
+"^":"Tp:293;a,b",
 call$2:[function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
 if(y&&D.D5(b))this.a.u(0,a,this.b.Zr(b))
 else if(!!z.$iswn)D.f3(b,this.b)
-else if(y)D.Gf(b,this.b)},"call$2",null,4,0,null,453,[],275,[],"call"],
+else if(y)D.Gf(b,this.b)},"call$2",null,4,0,null,360,[],277,[],"call"],
 $isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
 "^":"",
 HF:{
-"^":["V24;jA%-647,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.jA},null,null,1,0,648,"error",365,385],
-skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,649,30,[],"error",365],
+"^":["V25;jA%-515,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.jA},null,null,1,0,516,"error",300,316],
+skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,517,30,[],"error",300],
 "@":function(){return[C.uvO]},
 static:{qa:[function(a){var z,y,x,w
 z=$.Nd()
@@ -14922,16 +15345,16 @@
 a.X0=w
 C.SX.ZL(a)
 C.SX.oX(a)
-return a},null,null,0,0,115,"new ServiceErrorViewElement$created"]}},
-"+ServiceErrorViewElement":[650],
-V24:{
+return a},null,null,0,0,117,"new ServiceErrorViewElement$created"]}},
+"+ServiceErrorViewElement":[518],
+V25:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
 "^":"",
 nk:{
-"^":["V25;Xc%-651,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFA:[function(a){return a.Xc},null,null,1,0,652,"exception",365,385],
-sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,653,30,[],"exception",365],
+"^":["V26;Xc%-519,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFA:[function(a){return a.Xc},null,null,1,0,520,"exception",300,316],
+sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,521,30,[],"exception",300],
 "@":function(){return[C.vr3]},
 static:{dS:[function(a){var z,y,x,w
 z=$.Nd()
@@ -14944,30 +15367,30 @@
 a.X0=w
 C.Vd.ZL(a)
 C.Vd.oX(a)
-return a},null,null,0,0,115,"new ServiceExceptionViewElement$created"]}},
-"+ServiceExceptionViewElement":[654],
-V25:{
+return a},null,null,0,0,117,"new ServiceExceptionViewElement$created"]}},
+"+ServiceExceptionViewElement":[522],
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
 XK:{
-"^":"zM;Jf>,Ox,GY,Rp,Li,G2,A4,z7,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",
-z6:[function(a,b){var z
+"^":"zM;Jf>,Ox,GY,Rp,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+z6:function(a,b){var z
 N.Jx("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
 z=this.Jf
 if(typeof z!=="string")return z.g()
-return W.It(J.WB(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,413,[]],
-aq:function(){this.Jf="http://"+H.d(J.cP(C.ol.gyH(window)))+"/"}},
+return W.It(J.WB(z,b),null,null).OA(new U.dT())},
+SC:function(){this.Jf="http://"+H.d(J.cP(C.ol.gyH(window)))+"/"}},
 dT:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){var z
 N.Jx("").hh("HttpRequest.getString failed.")
 z=J.RE(a)
 z.gN(a)
-return C.xr.KP(H.B7(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],P.L5(null,null,null,null,null)))},"call$1",null,2,0,null,159,[],"call"],
+return C.xr.KP(H.B7(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],P.L5(null,null,null,null,null)))},"call$1",null,2,0,null,161,[],"call"],
 $isEH:true},
 ho:{
-"^":"zM;ja,yb,Ox,GY,Rp,Li,G2,A4,z7,AP,Lk,P3,KG,mQ,kT,bN,GR,AP,Lk",
+"^":"zM;ja,yb,Ox,GY,Rp,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
 bI:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -14977,8 +15400,8 @@
 z=this.ja
 v=z.t(0,y)
 z.Rz(0,y)
-J.Xf(v,w)},"call$1","gVx",2,0,157,22,[]],
-z6:[function(a,b){var z,y,x
+J.Xf(v,w)},"call$1","gVx",2,0,159,22,[]],
+z6:function(a,b){var z,y,x
 z=""+this.yb
 y=H.B7([],P.L5(null,null,null,null,null))
 y.u(0,"id",z)
@@ -14988,15 +15411,15 @@
 x=H.VM(new P.Zf(P.Dt(null)),[null])
 this.ja.u(0,z,x)
 J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
-return x.MM},"call$1","gpV",2,0,null,264,[]],
+return x.MM},
 PI:function(){var z=C.Ns.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
 N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 ob:{
-"^":["V26;mC%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gWA:[function(a){return a.mC},null,null,1,0,368,"object",365,385],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,369,30,[],"object",365],
+"^":["V27;mC%-320,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gWA:[function(a){return a.mC},null,null,1,0,303,"object",300,316],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,304,30,[],"object",300],
 hu:[function(a){var z
 switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
 J.CJ(z,a.mC)
@@ -15005,7 +15428,7 @@
 J.oJ(z,a.mC)
 return z
 case"Class":z=W.r3("class-view",null)
-J.At(z,a.mC)
+J.ve(z,a.mC)
 return z
 case"Code":z=W.r3("code-view",null)
 J.fH(z,a.mC)
@@ -15022,7 +15445,7 @@
 case"HeapMap":z=W.r3("heap-map",null)
 J.Nf(z,a.mC)
 return z
-case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"String":z=W.r3("instance-view",null)
+case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"String":case"Type":z=W.r3("instance-view",null)
 J.ti(z,a.mC)
 return z
 case"Isolate":z=W.r3("isolate-view",null)
@@ -15049,7 +15472,9 @@
 case"VM":z=W.r3("vm-view",null)
 J.rK(z,a.mC)
 return z
-default:return}},"call$0","gbs",0,0,655,"_constructElementForObject"],
+default:z=W.r3("json-view",null)
+J.wD(z,a.mC)
+return z}},"call$0","gbs",0,0,523,"_constructElementForObject"],
 fa:[function(a,b){var z,y,x
 a.textContent=""
 z=a.mC
@@ -15058,7 +15483,7 @@
 x=this.hu(a)
 if(x==null){N.Jx("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"call$1","gYQ",2,0,112,230,[],"objectChanged"],
+N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"call$1","gYQ",2,0,114,232,[],"objectChanged"],
 "@":function(){return[C.hpj]},
 static:{zy:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15071,33 +15496,33 @@
 a.X0=w
 C.ZO.ZL(a)
 C.ZO.oX(a)
-return a},null,null,0,0,115,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[656],
-V26:{
+return a},null,null,0,0,117,"new ServiceObjectViewElement$created"]}},
+"+ServiceObjectViewElement":[524],
+V27:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["pv;tY%-389,Pe%-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gnv:[function(a){return a.tY},null,null,1,0,368,"ref",365,385],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,369,30,[],"ref",365],
-gjT:[function(a){return a.Pe},null,null,1,0,399,"internal",365,385],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,400,30,[],"internal",365],
+"^":["pv;tY%-320,Pe%-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gnv:[function(a){return a.tY},null,null,1,0,303,"ref",300,316],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,304,30,[],"ref",300],
+gjT:[function(a){return a.Pe},null,null,1,0,330,"internal",300,316],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,331,30,[],"internal",300],
 aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.bA,"",this.gD5(a))},"call$1","gLe",2,0,157,230,[],"refChanged"],
+this.ct(a,C.bA,"",this.gD5(a))},"call$1","gLe",2,0,159,232,[],"refChanged"],
 gO3:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,370,"url"],
+return z.gHP()},null,null,1,0,305,"url"],
 gOL:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,370,"serviceId"],
+return J.F8(z)},null,null,1,0,305,"serviceId"],
 gD5:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,370,"hoverText"],
+return z.gzz()},null,null,1,0,305,"hoverText"],
 goc:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,370,"name"],
+return J.O6(z)},null,null,1,0,305,"name"],
 "@":function(){return[C.JD]},
 static:{lK:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15111,22 +15536,22 @@
 a.X0=w
 C.wU.ZL(a)
 C.wU.oX(a)
-return a},null,null,0,0,115,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[657],
+return a},null,null,0,0,117,"new ServiceRefElement$created"]}},
+"+ServiceRefElement":[525],
 pv:{
 "^":"uL+Pi;",
 $isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
 "^":"",
 Uj:{
-"^":["Nr;kF%-390,IK%-398,Qt%-398,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gTq:[function(a){return a.kF},null,null,1,0,399,"checked",365,385],
-sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,400,30,[],"checked",365],
-gEu:[function(a){return a.IK},null,null,1,0,370,"checkedText",365,385],
-sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",365],
-gRY:[function(a){return a.Qt},null,null,1,0,370,"uncheckedText",365,385],
-sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,32,30,[],"uncheckedText",365],
+"^":["Bc;kF%-321,IK%-329,Qt%-329,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gTq:[function(a){return a.kF},null,null,1,0,330,"checked",300,316],
+sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,331,30,[],"checked",300],
+gEu:[function(a){return a.IK},null,null,1,0,305,"checkedText",300,316],
+sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",300],
+gRY:[function(a){return a.Qt},null,null,1,0,305,"uncheckedText",300,316],
+sRY:[function(a,b){a.Qt=this.ct(a,C.WY,a.Qt,b)},null,null,3,0,32,30,[],"uncheckedText",300],
 RC:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.wb,a.kF,z)},"call$3","gR7",6,0,402,21,[],658,[],79,[],"change"],
+a.kF=this.ct(a,C.wb,a.kF,z)},"call$3","gBk",6,0,333,21,[],526,[],81,[],"change"],
 "@":function(){return[C.mS]},
 static:{Al:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15139,16 +15564,16 @@
 a.X0=w
 C.fA.ZL(a)
 C.fA.oX(a)
-return a},null,null,0,0,115,"new SlidingCheckboxElement$created"]}},
-"+SlidingCheckboxElement":[659],
-Nr:{
-"^":"ir+Pi;",
+return a},null,null,0,0,117,"new SlidingCheckboxElement$created"]}},
+"+SlidingCheckboxElement":[527],
+Bc:{
+"^":"xc+Pi;",
 $isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 xT:{
-"^":["V27;Va%-660,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.Va},null,null,1,0,629,"frame",365,385],
-sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,614,30,[],"frame",365],
+"^":["V28;Va%-528,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.Va},null,null,1,0,501,"frame",300,316],
+sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,495,30,[],"frame",300],
 "@":function(){return[C.Xv]},
 static:{an:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15161,17 +15586,17 @@
 a.X0=w
 C.dX.ZL(a)
 C.dX.oX(a)
-return a},null,null,0,0,115,"new StackFrameElement$created"]}},
-"+StackFrameElement":[661],
-V27:{
+return a},null,null,0,0,117,"new StackFrameElement$created"]}},
+"+StackFrameElement":[529],
+V28:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 uwf:{
-"^":["V28;B3%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtN:[function(a){return a.B3},null,null,1,0,384,"trace",365,385],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,386,30,[],"trace",365],
-pA:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+"^":["V29;B3%-313,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtN:[function(a){return a.B3},null,null,1,0,315,"trace",300,316],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,317,30,[],"trace",300],
+pA:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 "@":function(){return[C.js]},
 static:{bV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15184,9 +15609,9 @@
 a.X0=w
 C.bg.ZL(a)
 C.bg.oX(a)
-return a},null,null,0,0,115,"new StackTraceElement$created"]}},
-"+StackTraceElement":[662],
-V28:{
+return a},null,null,0,0,117,"new StackTraceElement$created"]}},
+"+StackTraceElement":[530],
+V29:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
@@ -15194,7 +15619,7 @@
 if(!!z.$isQl)return C.i3.f0(a)
 switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
 case"radio":case"select-multiple":case"select-one":return z.gi9(a)
-default:return z.gLm(a)}},"call$1","nc",2,0,null,132,[]],
+default:return z.gLm(a)}},"call$1","tF",2,0,null,134,[]],
 iX:[function(a,b){var z,y,x,w,v,u,t,s
 z=M.pN(a,b)
 y=J.x(a)
@@ -15206,7 +15631,7 @@
 if(s==null)continue
 if(u==null)u=P.Py(null,null,null,null,null)
 u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,263,[],282,[]],
+return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,265,[],284,[]],
 HP:[function(a,b,c,d,e){var z,y,x
 if(b==null)return
 if(b.gN2()!=null){z=b.gN2()
@@ -15216,16 +15641,16 @@
 if(z.gwd(b)==null)return
 y=b.gTe()-a.childNodes.length
 for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,263,[],151,[],283,[],282,[],284,[]],
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","K4",10,0,null,265,[],153,[],285,[],284,[],286,[]],
 bM:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
 if(!!z.$isQF||!!z.$isI0||!!z.$ishy)return a
-return},"call$1","ay",2,0,null,263,[]],
+return},"call$1","ay",2,0,null,265,[]],
 pN:[function(a,b){var z,y
 z=J.x(a)
 if(!!z.$iscv)return M.F5(a,b)
 if(!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"call$2","vw",4,0,null,263,[],282,[]],
+if(y!=null)return["text",y]}return},"call$2","vw",4,0,null,265,[],284,[]],
 F5:[function(a,b){var z,y,x
 z={}
 z.a=null
@@ -15236,7 +15661,7 @@
 if(y==null){x=[]
 z.a=x
 y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,132,[],282,[]],
+y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,134,[],284,[]],
 Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 for(z=J.U6(a),y=d!=null,x=!!J.x(b).$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
 u=z.t(a,w+1)
@@ -15266,7 +15691,7 @@
 t.push(L.Sk(j,l,null))}o.wE(0)
 p=o
 s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},"call$4","NJ",6,2,null,82,289,[],263,[],283,[],284,[]],
+if(y)d.push(i)}},"call$4","NJ",6,2,null,84,291,[],265,[],285,[],286,[]],
 F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s
 z=a.length
 if(z===0)return
@@ -15282,13 +15707,13 @@
 v=t+2}if(v===z)w.push("")
 z=new M.HS(w,null)
 z.Yn(w)
-return z},"call$4","jF",8,0,null,91,[],12,[],263,[],282,[]],
+return z},"call$4","jF",8,0,null,93,[],12,[],265,[],284,[]],
 SH:[function(a,b){var z,y
 z=a.firstChild
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
 for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"call$2","St",4,0,null,207,[],283,[]],
+z=z.nextSibling}},"call$2","St",4,0,null,209,[],285,[]],
 Ky:[function(a){var z,y,x,w
 z=$.rw()
 z.toString
@@ -15303,15 +15728,15 @@
 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.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
 z.u(0,a,x)
-return x},"call$1","La",2,0,null,263,[]],
+return x},"call$1","La",2,0,null,265,[]],
 wR:[function(a){var z=J.x(a)
 if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
 else z=!0
 else z=!1
-return z},"call$1","xS",2,0,null,198,[]],
+return z},"call$1","xS",2,0,null,200,[]],
 V2:{
 "^":"TU;N1,mD,Ck",
-Z1:[function(a,b,c,d){var z,y,x,w,v
+Z1:function(a,b,c,d){var z,y,x,w,v
 J.MV(this.glN(),b)
 if(!!J.x(this.gN1()).$isQl&&J.de(b,"value")){z=H.Go(this.gN1(),"$isQl")
 z.toString
@@ -15328,21 +15753,21 @@
 y=d!=null?d:""
 x=new M.D8(w,z,c,null,null,v,y)
 x.Og(z,v,c,d)}this.gCd(this).u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]]},
+return x}},
 D8:{
 "^":"TR;Y0,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
-EC:[function(a){var z,y
+EC:function(a){var z,y
 if(this.Y0){z=null!=a&&!1!==a
 y=this.eS
 if(z)J.Vs(X.TR.prototype.gH.call(this)).MW.setAttribute(y,"")
 else J.Vs(X.TR.prototype.gH.call(this)).Rz(0,y)}else{z=J.Vs(X.TR.prototype.gH.call(this))
 y=a==null?"":H.d(a)
-z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,30,[]]},
+z.MW.setAttribute(this.eS,y)}}},
 zP:{
 "^":"NP;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return M.NP.prototype.gH.call(this)},
-EC:[function(a){var z,y,x,w,v
+EC:function(a){var z,y,x,w,v
 z=J.u3(M.NP.prototype.gH.call(this))
 y=J.x(z)
 if(!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
@@ -15350,14 +15775,14 @@
 v=x}else{w=null
 v=null}}else{w=null
 v=null}M.NP.prototype.EC.call(this,a)
-if(v!=null&&v.gqP()!=null&&!J.de(y.gP(z),w))v.FC(null)},"call$1","gH0",2,0,null,231,[]]},
+if(v!=null&&v.gqP()!=null&&!J.de(y.gP(z),w))v.FC(null)}},
 H2:{
 "^":"TR;",
-cO:[function(a){if(this.qP==null)return
+cO:function(a){if(this.qP==null)return
 this.Ca.ed()
-X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null]},
+X.TR.prototype.cO.call(this,this)}},
 lP:{
-"^":"Tp:115;",
+"^":"Tp:117;",
 call$0:[function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
@@ -15374,32 +15799,32 @@
 return x.length===1?C.mt:C.Nm.gtH(x)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 fTP:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ppY:{
-"^":"Tp:112;b",
+"^":"Tp:114;b",
 call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 NP:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
-EC:[function(a){var z=this.gH()
-J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,231,[]],
+EC:function(a){var z=this.gH()
+J.ta(z,a==null?"":H.d(a))},
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"call$1","gqf",2,0,157,21,[]]},
+O.Y3()},"call$1","gqf",2,0,159,21,[]]},
 jt:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
-EC:[function(a){var z=X.TR.prototype.gH.call(this)
-J.rP(z,null!=a&&!1!==a)},"call$1","gH0",2,0,null,231,[]],
+EC:function(a){var z=X.TR.prototype.gH.call(this)
+J.rP(z,null!=a&&!1!==a)},
 FC:[function(a){var z,y,x
 z=J.Hf(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)
 if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
 x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
-if(x!=null)J.ta(x,!1)}O.Y3()},"call$1","gqf",2,0,157,21,[]],
+if(x!=null)J.ta(x,!1)}O.Y3()},"call$1","gqf",2,0,159,21,[]],
 static:{kv:[function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
@@ -15408,9 +15833,9 @@
 return z.ev(z,new M.r0(a))}else{y=M.bM(a)
 if(y==null)return C.xD
 x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.jz(a))}},"call$1","VE",2,0,null,132,[]]}},
+return x.ev(x,new M.jz(a))}},"call$1","VE",2,0,null,134,[]]}},
 r0:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z,y
 z=this.a
 y=J.x(a)
@@ -15419,23 +15844,23 @@
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},"call$1",null,2,0,null,286,[],"call"],
+return z},"call$1",null,2,0,null,288,[],"call"],
 $isEH:true},
 jz:{
-"^":"Tp:112;b",
+"^":"Tp:114;b",
 call$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,286,[],"call"],
+return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,288,[],"call"],
 $isEH:true},
 SA:{
 "^":"H2;Dh,Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return X.TR.prototype.gH.call(this)},
-EC:[function(a){var z
+EC:function(a){var z
 this.C7()
 if(this.Gh(a)===!0)return
 z=new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.K2(new M.hB(this)),2))
 C.S2.yN(z,X.TR.prototype.gH.call(this),!0,!0)
-this.Dh=z},"call$1","gH0",2,0,null,231,[]],
-Gh:[function(a){var z,y,x
+this.Dh=z},
+Gh:function(a){var z,y,x
 z=this.eS
 y=J.x(z)
 if(y.n(z,"selectedIndex")){x=M.qb(a)
@@ -15443,33 +15868,33 @@
 z=J.m4(X.TR.prototype.gH.call(this))
 return z==null?x==null:z===x}else if(y.n(z,"value")){z=X.TR.prototype.gH.call(this)
 J.ta(z,a==null?"":H.d(a))
-return J.de(J.Vm(X.TR.prototype.gH.call(this)),a)}},"call$1","goz",2,0,null,231,[]],
-C7:[function(){var z=this.Dh
+return J.de(J.Vm(X.TR.prototype.gH.call(this)),a)}},
+C7:function(){var z=this.Dh
 if(z!=null){z.disconnect()
-this.Dh=null}},"call$0","glnT",0,0,null],
+this.Dh=null}},
 FC:[function(a){var z,y
 this.C7()
 z=this.eS
 y=J.x(z)
 if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"call$1","gqf",2,0,157,21,[]],
+J.ta(this.xS,z)}},"call$1","gqf",2,0,159,21,[]],
 $isSA:true,
 static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
 return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,30,[]]}},
 hB:{
-"^":"Tp:355;a",
+"^":"Tp:293;a",
 call$2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,28,[],663,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,28,[],531,[],"call"],
 $isEH:true},
 nv:{
-"^":"Tp:112;",
-call$1:[function(a){return 0},"call$1",null,2,0,null,113,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return 0},"call$1",null,2,0,null,115,[],"call"],
 $isEH:true},
 ee:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
-Z1:[function(a,b,c,d){var z,y,x
+Z1:function(a,b,c,d){var z,y,x
 z=J.x(b)
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 y=this.gN1()
@@ -15487,23 +15912,23 @@
 x.Og(z,"checked",c,d)
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}y.u(0,b,z)
-return z},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]]},
+return z}},
 K6:{
 "^":"a;Cd>,wd>,N2<,Te<"},
 TU:{
 "^":"a;N1<,mD,Ck?",
-Z1:[function(a,b,c,d){var z
+Z1:function(a,b,c,d){var z
 window
 z="Unhandled binding to Node: "+H.d(this)+" "+H.d(b)+" "+H.d(c)+" "+H.d(d)
-if(typeof console!="undefined")console.error(z)},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]],
-Ih:[function(a,b){var z
+if(typeof console!="undefined")console.error(z)},
+Ih:function(a,b){var z
 if(this.mD==null)return
 z=this.gCd(this).Rz(0,b)
-if(z!=null)J.wC(z)},"call$1","gC8",2,0,null,12,[]],
-GB:[function(a){var z,y
+if(z!=null)J.wC(z)},
+GB:function(a){var z,y
 if(this.mD==null)return
 for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(y!=null)J.wC(y)}this.mD=null},"call$0","gJg",0,0,null],
+if(y!=null)J.wC(y)}this.mD=null},
 gCd:function(a){var z=this.mD
 if(z==null){z=P.L5(null,null,null,J.O,X.TR)
 this.mD=z}return z},
@@ -15515,7 +15940,7 @@
 ug:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
-Z1:[function(a,b,c,d){var z,y,x
+Z1:function(a,b,c,d){var z,y,x
 if(J.de(b,"selectedindex"))b="selectedIndex"
 z=J.x(b)
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
@@ -15529,12 +15954,12 @@
 x.Og(y,b,c,d)
 x.Ca=M.IP(y).yI(x.gqf())
 z.u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]]},
+return x}},
 DT:{
 "^":"V2;lr,xT?,kr<,Mf,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
 gN1:function(){return this.N1},
 glN:function(){return!!J.x(this.N1).$isDT?this.N1:this},
-Z1:[function(a,b,c,d){var z
+Z1:function(a,b,c,d){var z
 d=d!=null?d:""
 z=this.kr
 if(z==null){z=new M.TG(this,[],null,!1,!1,!1,!1,!1,null,null,null,null,null,null,null,null,!1,null,null)
@@ -15559,8 +15984,8 @@
 z=new M.p8(this,c,b,d)
 this.gCd(this).u(0,b,z)
 return z
-default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]],
-Ih:[function(a,b){var z
+default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},
+Ih:function(a,b){var z
 switch(b){case"bind":z=this.kr
 if(z==null)return
 z.js=!1
@@ -15586,11 +16011,11 @@
 this.gCd(this).Rz(0,b)
 return
 default:M.TU.prototype.Ih.call(this,this,b)
-return}},"call$1","gC8",2,0,null,12,[]],
-jq:[function(){var z=this.kr
+return}},
+jq:function(){var z=this.kr
 if(!z.t9){z.t9=!0
-P.rb(z.gjM())}},"call$0","gTd",0,0,null],
-a5:[function(a,b,c){var z,y,x,w,v,u,t
+P.rb(z.gjM())}},
+a5:function(a,b,c){var z,y,x,w,v,u,t
 z=this.gnv(this)
 z=!!J.x(z).$isTU?z:M.Ky(z)
 y=J.G6(z)
@@ -15605,7 +16030,8 @@
 w=u}t=M.Fz(y,w)
 M.HP(t,x,a,b,c)
 M.SH(t,a)
-return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,283,[],282,[],284,[]],
+return t},
+ZK:function(a,b){return this.a5(a,b,null)},
 gk8:function(){return this.lr},
 gzH:function(){return this.xT},
 gnv:function(a){var z,y,x,w
@@ -15620,7 +16046,7 @@
 this.Sy()
 z=this.jH
 return z!=null?z:H.Go(this.N1,"$isyY").content},
-wh:[function(a){var z,y,x,w,v,u
+wh:function(a){var z,y,x,w,v,u
 if(this.mj===!0)return!1
 M.oR()
 this.mj=!0
@@ -15639,7 +16065,8 @@
 if(a!=null)v.sQO(a)
 else if(y)M.KE(v,this.N1,u)
 else M.GM(J.G6(v))
-return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,664,[]],
+return!0},
+Sy:function(){return this.wh(null)},
 $isDT:true,
 static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
 z=J.Lh(b,a,!1)
@@ -15649,17 +16076,17 @@
 else y=!1
 if(y)return z
 for(x=J.Q8(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"call$2","G0",4,0,null,263,[],285,[]],TA:[function(a){var z,y,x,w
+return z},"call$2","G0",4,0,null,265,[],287,[]],TA:[function(a){var z,y,x,w
 z=J.VN(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
 if(y==null){y=z.implementation.createHTMLDocument("")
 for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","lA",2,0,null,260,[]],eX:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","lA",2,0,null,262,[]],eX:[function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gKV(a).insertBefore(y,a)
-for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=x.lo
+for(x=C.Nm.br(z.gQg(a).gvc()),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=x.lo
 switch(w){case"template":v=z.gQg(a).MW
 v.getAttribute(w)
 v.removeAttribute(w)
@@ -15669,25 +16096,25 @@
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
-break}}return y},"call$1","Bw",2,0,null,286,[]],KE:[function(a,b,c){var z,y,x,w
+break}}return y},"call$1","Bw",2,0,null,288,[]],KE:[function(a,b,c){var z,y,x,w
 z=J.G6(a)
 if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,260,[],286,[],287,[]],GM:[function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,262,[],288,[],289,[]],GM:[function(a){var z,y
 z=new M.OB()
 y=J.MK(a,$.cz())
 if(M.wR(a))z.call$1(a)
-y.aN(y,z)},"call$1","DR",2,0,null,288,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},"call$1","DR",2,0,null,290,[]],oR:[function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
 J.c9(z,H.d($.cz())+" { display: none; }")
 document.head.appendChild(z)},"call$0","Lv",0,0,null]}},
 OB:{
-"^":"Tp:157;",
-call$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},"call$1",null,2,0,null,260,[],"call"],
+"^":"Tp:159;",
+call$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},"call$1",null,2,0,null,262,[],"call"],
 $isEH:true},
 Uf:{
-"^":"Tp:112;",
-call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,453,[],"call"],
+"^":"Tp:114;",
+call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,360,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
@@ -15696,19 +16123,18 @@
 return z.N1},
 gk8:function(){return this.lr},
 gP:function(a){return J.Vm(this.gND())},
-r6:function(a,b){return this.gP(this).call$1(b)},
 sP:function(a,b){J.ta(this.gND(),b)},
 gND:function(){var z=J.x(this.lr)
 if((!!z.$isWR||!!z.$isJ3)&&J.de(this.ay,"value"))return this.lr
 return L.Sk(this.lr,this.ay,null)},
-cO:[function(a){var z=this.ud
+cO:function(a){var z=this.ud
 if(z==null)return
 z.Ih(0,this.eS)
 this.lr=null
-this.ud=null},"call$0","gJK",0,0,null],
+this.ud=null},
 $isTR:true},
 NW:{
-"^":"Tp:355;a,b,c,d",
+"^":"Tp:293;a,b,c,d",
 call$2:[function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)if(z.n(a,"if")){this.a.b=!0
@@ -15739,7 +16165,7 @@
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"call$1","gBg",2,0,665,30,[]],
+return y+H.d(z[3])},"call$1","gBg",2,0,532,30,[]],
 b5:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
@@ -15750,7 +16176,7 @@
 if(t>=z.length)return H.e(z,t)
 u=z[t]
 u=typeof u==="string"?u:H.d(u)
-y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,666,667,[]],
+y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,533,534,[]],
 Yn:function(a){this.bX=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
 "^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -15771,8 +16197,8 @@
 u=this.eD
 v.push(L.Sk(z,u,null))
 w.wE(0)}this.FS=w.gUj(w).yI(new M.R7(this))
-this.Az(w.gP(w))},"call$0","gjM",0,0,115],
-Az:[function(a){var z,y,x,w
+this.Az(w.gP(w))},"call$0","gjM",0,0,117],
+Az:function(a){var z,y,x,w
 z=this.xG
 this.Gb()
 y=J.x(a)
@@ -15784,8 +16210,8 @@
 x=this.xG
 x=x!=null?x:[]
 w=G.jj(x,0,J.q8(x),y,0,J.q8(y))
-if(w.length!==0)this.El(w)},"call$1","ghC",2,0,null,231,[]],
-wx:[function(a){var z,y,x,w
+if(w.length!==0)this.El(w)},
+wx:function(a){var z,y,x,w
 z=J.x(a)
 if(z.n(a,-1))return this.e9.N1
 y=this.YC
@@ -15797,8 +16223,8 @@
 if(z)return x
 w=M.Ky(x).gkr()
 if(w==null)return x
-return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gKD",2,0,null,15,[]],
-lP:[function(a,b,c,d){var z,y,x,w,v,u
+return w.wx(C.jn.cU(w.YC.length,2)-1)},
+lP:function(a,b,c,d){var z,y,x,w,v,u
 z=J.Wx(a)
 y=this.wx(z.W(a,1))
 x=b!=null
@@ -15810,8 +16236,8 @@
 v=J.TZ(this.e9.N1)
 u=J.tx(y)
 if(x)v.insertBefore(b,u)
-else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,15,[],207,[],668,[],284,[]],
-MC:[function(a){var z,y,x,w,v,u,t,s
+else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},
+MC:function(a){var z,y,x,w,v,u,t,s
 z=[]
 z.$builtinTypeInfo=[W.KV]
 y=J.Wx(a)
@@ -15827,7 +16253,7 @@
 if(s==null?w==null:s===w)w=x
 v=s.parentNode
 if(v!=null)v.removeChild(s)
-z.push(s)}return new M.Ya(z,t)},"call$1","gtx",2,0,null,15,[]],
+z.push(s)}return new M.Ya(z,t)},
 El:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 if(this.pq)return
 z=this.e9
@@ -15851,14 +16277,14 @@
 k=null}else{m=[]
 if(this.DO!=null)o=this.Mv(o)
 k=o!=null?z.a5(o,x,m):null
-l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,669,254,[]],
-uS:[function(a){var z
-for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,284,[]],
-Gb:[function(){var z=this.IY
+l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,535,256,[]],
+uS:function(a){var z
+for(z=J.GP(a);z.G();)J.wC(z.gl())},
+Gb:function(){var z=this.IY
 if(z==null)return
 z.ed()
-this.IY=null},"call$0","gY2",0,0,null],
-cO:[function(a){var z,y
+this.IY=null},
+cO:function(a){var z,y
 if(this.pq)return
 this.Gb()
 for(z=this.YC,y=1;y<z.length;y+=2)this.uS(z[y])
@@ -15866,30 +16292,30 @@
 z=this.FS
 if(z!=null){z.ed()
 this.FS=null}this.e9.kr=null
-this.pq=!0},"call$0","gJK",0,0,null]},
+this.pq=!0}},
 VU:{
-"^":"Tp:112;",
+"^":"Tp:114;",
 call$1:[function(a){return[a]},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:670;a",
+"^":"Tp:536;a",
 call$1:[function(a){var z,y,x
 z=J.U6(a)
 y=z.t(a,0)
 x=z.t(a,1)
 if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"call$1",null,2,0,null,667,[],"call"],
+return this.a?y:[y]},"call$1",null,2,0,null,534,[],"call"],
 $isEH:true},
 R7:{
-"^":"Tp:112;b",
-call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,401,[],"call"],
+"^":"Tp:114;b",
+call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,332,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
 $isYa:true},
 XT:{
 "^":"TU;N1,mD,Ck",
-Z1:[function(a,b,c,d){var z,y,x
+Z1:function(a,b,c,d){var z,y,x
 if(!J.de(b,"text"))return M.TU.prototype.Z1.call(this,this,b,c,d)
 this.Ih(0,b)
 z=this.gCd(this)
@@ -15898,15 +16324,15 @@
 x=new M.ic(y,c,null,null,"text",x)
 x.Og(y,"text",c,d)
 z.u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]]},
+return x}},
 ic:{
 "^":"TR;qP,ZY,xS,PB,eS,ay",
-EC:[function(a){var z=this.qP
-J.c9(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,231,[]]},
+EC:function(a){var z=this.qP
+J.c9(z,a==null?"":H.d(a))}},
 wl:{
 "^":"V2;N1,mD,Ck",
 gN1:function(){return this.N1},
-Z1:[function(a,b,c,d){var z,y,x
+Z1:function(a,b,c,d){var z,y,x
 if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
 J.MV(!!J.x(z).$isTU?z:this,b)
@@ -15918,9 +16344,9 @@
 x.Og(y,"value",c,d)
 x.Ca=M.IP(y).yI(x.gqf())
 z.u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],283,[],264,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
+return x}}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
 "^":"",
-ve:{
+T4p:{
 "^":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{
 "^":"",
 TR:{
@@ -15928,16 +16354,15 @@
 gH:function(){return this.qP},
 gk8:function(){return this.ZY},
 gP:function(a){return J.Vm(this.xS)},
-r6:function(a,b){return this.gP(this).call$1(b)},
 sP:function(a,b){J.ta(this.xS,b)},
-cO:[function(a){var z
+cO:function(a){var z
 if(this.qP==null)return
 z=this.PB
 if(z!=null)z.ed()
 this.PB=null
 this.xS=null
 this.qP=null
-this.ZY=null},"call$0","gJK",0,0,null],
+this.ZY=null},
 Og:function(a,b,c,d){var z,y
 z=J.x(this.ZY)
 z=(!!z.$isWR||!!z.$isJ3)&&J.de(d,"value")
@@ -15948,13 +16373,13 @@
 this.EC(J.Vm(this.xS))},
 $isTR:true},
 VD:{
-"^":"Tp:112;a",
+"^":"Tp:114;a",
 call$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,401,[],"call"],
+return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,332,[],"call"],
 $isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
 "^":"",
 I5:{
-"^":["xI;tY-389,Pe-390,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-320,Pe-321,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.Ye]},
 static:{cF:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15968,16 +16393,16 @@
 a.X0=w
 C.V8.ZL(a)
 C.V8.oX(a)
-return a},null,null,0,0,115,"new VMRefElement$created"]}},
-"+VMRefElement":[391]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
+return a},null,null,0,0,117,"new VMRefElement$created"]}},
+"+VMRefElement":[322]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
 "^":"",
 en:{
-"^":["V29;ID%-363,lc%-671,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-383",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzf:[function(a){return a.ID},null,null,1,0,613,"vm",365,385],
-szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,672,30,[],"vm",365],
-gkc:[function(a){return a.lc},null,null,1,0,632,"error",365,385],
-skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,633,30,[],"error",365],
-pA:[function(a,b){J.am(a.ID).YM(b)},"call$1","gvC",2,0,157,387,[],"refresh"],
+"^":["V30;ID%-298,lc%-537,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-314",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzf:[function(a){return a.ID},null,null,1,0,494,"vm",300,316],
+szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,538,30,[],"vm",300],
+gkc:[function(a){return a.lc},null,null,1,0,508,"error",300,316],
+skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,509,30,[],"error",300],
+pA:[function(a,b){J.am(a.ID).YM(b)},"call$1","gvC",2,0,159,318,[],"refresh"],
 "@":function(){return[C.Hk]},
 static:{oH:[function(a){var z,y,x,w
 z=$.Nd()
@@ -15990,9 +16415,9 @@
 a.X0=w
 C.nt.ZL(a)
 C.nt.oX(a)
-return a},null,null,0,0,115,"new VMViewElement$created"]}},
-"+VMViewElement":[673],
-V29:{
+return a},null,null,0,0,117,"new VMViewElement$created"]}},
+"+VMViewElement":[539],
+V30:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
@@ -16071,10 +16496,10 @@
 N.TJ.$isa=true
 P.wv.$iswv=true
 P.wv.$isa=true
+T.yj.$isyj=true
+T.yj.$isa=true
 J.kn.$isbool=true
 J.kn.$isa=true
-T.z2.$isz2=true
-T.z2.$isa=true
 W.OJ.$isea=true
 W.OJ.$isa=true
 A.XP.$isXP=true
@@ -16102,9 +16527,9 @@
 P.ej.$isa=true
 P.RY.$isej=true
 P.RY.$isa=true
-P.Fw.$isX9=true
-P.Fw.$isej=true
-P.Fw.$isa=true
+P.tg.$isX9=true
+P.tg.$isej=true
+P.tg.$isa=true
 P.X9.$isX9=true
 P.X9.$isej=true
 P.X9.$isa=true
@@ -16153,7 +16578,9 @@
 W.I0.$isKV=true
 W.I0.$isD0=true
 W.I0.$isa=true
+D.af.$isaf=true
 D.af.$isa=true
+D.bv.$isaf=true
 D.bv.$isa=true
 W.cx.$isea=true
 W.cx.$isa=true
@@ -16166,6 +16593,7 @@
 W.zU.$isa=true
 W.kQ.$isea=true
 W.kQ.$isa=true
+D.kx.$isaf=true
 D.kx.$isa=true
 D.t9.$isa=true
 W.qp.$iscv=true
@@ -16200,6 +16628,7 @@
 V.qC.$isZ0=true
 V.qC.$isa=true
 D.SI.$isSI=true
+D.SI.$isaf=true
 D.SI.$isqC=true
 D.SI.$asqC=[null,null]
 D.SI.$isZ0=true
@@ -16232,8 +16661,10 @@
 O.Qb.$isQb=true
 O.Qb.$isa=true
 D.fJ.$isfJ=true
+D.fJ.$isaf=true
 D.fJ.$isa=true
 D.hR.$ishR=true
+D.hR.$isaf=true
 D.hR.$isa=true
 P.EH.$isEH=true
 P.EH.$isa=true
@@ -16278,8 +16709,9 @@
 J.AG=function(a){return J.x(a).bu(a)}
 J.AK=function(a){return J.RE(a).Zi(a)}
 J.Ag=function(a){return J.RE(a).goY(a)}
-J.At=function(a,b){return J.RE(a).sRu(a,b)}
+J.Aw=function(a,b){return J.RE(a).sHp(a,b)}
 J.BM=function(a,b,c){return J.w1(a).xe(a,b,c)}
+J.Ba=function(a){return J.RE(a).gUx(a)}
 J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
 J.CC=function(a){return J.RE(a).gmH(a)}
@@ -16290,6 +16722,7 @@
 J.EY=function(a,b){return J.RE(a).od(a,b)}
 J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
 J.Eh=function(a,b){return J.Wx(a).O(a,b)}
+J.Ew=function(a){return J.RE(a).gSw(a)}
 J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
 J.F6=function(a,b){return J.RE(a).stD(a,b)}
 J.F8=function(a){return J.RE(a).gjO(a)}
@@ -16336,6 +16769,7 @@
 J.O2=function(a,b){return J.RE(a).Ch(a,b)}
 J.O6=function(a){return J.RE(a).goc(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
+J.OS=function(a,b){return J.w1(a).tt(a,b)}
 J.Or=function(a){return J.RE(a).yx(a)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
 J.Q5=function(a){return J.RE(a).gwl(a)}
@@ -16407,13 +16841,13 @@
 return J.x(a).n(a,b)}
 J.dk=function(a,b){return J.RE(a).sMj(a,b)}
 J.e2=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
-J.f2=function(a){return J.RE(a).gRd(a)}
 J.f5=function(a){return J.RE(a).gI(a)}
 J.fH=function(a,b){return J.RE(a).stT(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.fi=function(a,b){return J.RE(a).ps(a,b)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
-J.iG=function(a,b){return J.RE(a).szZ(a,b)}
+J.iF=function(a,b){return J.RE(a).szZ(a,b)}
+J.iS=function(a){return J.RE(a).gox(a)}
 J.iZ=function(a){return J.RE(a).gzZ(a)}
 J.ja=function(a,b){return J.w1(a).Vr(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
@@ -16432,7 +16866,6 @@
 J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
 return J.Wx(a).i(a,b)}
 J.nJ=function(a){return J.RE(a).ga4(a)}
-J.ni=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
 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).gE8(a)}
@@ -16465,9 +16898,11 @@
 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.ve=function(a,b){return J.RE(a).sdG(a,b)}
 J.vo=function(a,b){return J.w1(a).ev(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wC=function(a){return J.RE(a).cO(a)}
+J.wD=function(a,b){return J.w1(a).sIr(a,b)}
 J.wc=function(a){return J.RE(a).gbG(a)}
 J.wp=function(a,b,c,d){return J.w1(a).zB(a,b,c,d)}
 J.xH=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
@@ -16476,9 +16911,9 @@
 J.xR=function(a){return J.RE(a).ghf(a)}
 J.xq=function(a){return J.RE(a).gUj(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yj=function(a){return J.RE(a).gG1(a)}
 J.yn=function(a,b){return J.RE(a).vV(a,b)}
 J.yxg=function(a){return J.RE(a).gGd(a)}
+J.z2=function(a){return J.RE(a).gG1(a)}
 J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
 return J.Wx(a).D(a,b)}
 J.zH=function(a){return J.RE(a).gt5(a)}
@@ -16487,7 +16922,7 @@
 C.J0=B.d1.prototype
 C.KZ=new H.hJ()
 C.OL=new U.EZ()
-C.Gw=new H.Ma()
+C.Gw=new H.yq()
 C.E3=new J.Q()
 C.Fm=new J.kn()
 C.yX=new J.GW()
@@ -16524,6 +16959,7 @@
 C.E6=new A.V3("field-ref")
 C.aM=new A.V3("isolate-summary")
 C.Is=new A.V3("response-viewer")
+C.OLi=new A.V3("script-inset")
 C.nh=new A.V3("nav-menu-item")
 C.KI=new A.V3("library-nav-menu")
 C.hpj=new A.V3("service-view")
@@ -16531,8 +16967,9 @@
 C.nu=new A.V3("function-view")
 C.jR=new A.V3("isolate-profile")
 C.xW=new A.V3("code-view")
-C.oY=new A.V3("class-view")
+C.aQx=new A.V3("class-view")
 C.fO=new A.V3("isolate-view")
+C.P9=new A.V3("eval-link")
 C.mS=new A.V3("sliding-checkbox")
 C.Hk=new A.V3("vm-view")
 C.Oyb=new A.V3("library-view")
@@ -16540,7 +16977,7 @@
 C.hr=new A.V3("top-nav-menu")
 C.js=new A.V3("stack-trace")
 C.Ur=new A.V3("script-ref")
-C.OS=new A.V3("class-ref")
+C.tSc=new A.V3("class-ref")
 C.jy=new A.V3("breakpoint-list")
 C.VW=new A.V3("instance-ref")
 C.Ye=new A.V3("vm-ref")
@@ -16555,16 +16992,17 @@
 C.u7=new A.V3("nav-menu")
 C.KH=new A.V3("json-view")
 C.X0=new A.V3("isolate-ref")
-C.U7Q=new A.V3("function-ref")
+C.o3=new A.V3("function-ref")
 C.uy=new A.V3("library-ref")
 C.vc=new A.V3("field-view")
 C.JD=new A.V3("service-ref")
 C.nW=new A.V3("nav-bar")
 C.DKS=new A.V3("curly-block")
-C.be=new A.V3("instance-view")
+C.qlk=new A.V3("instance-view")
 C.ny=new P.a6(0)
 C.OD=F.Ir.prototype
 C.Gh=L.rm.prototype
+C.UF=R.Lt.prototype
 C.mt=H.VM(new W.UC("change"),[W.ea])
 C.pi=H.VM(new W.UC("click"),[W.Wp])
 C.MD=H.VM(new W.UC("error"),[W.kQ])
@@ -16573,7 +17011,7 @@
 C.fK=H.VM(new W.UC("load"),[W.kQ])
 C.Ns=H.VM(new W.UC("message"),[W.cx])
 C.W2=H.VM(new W.UC("mousemove"),[W.Wp])
-C.MC=D.m8.prototype
+C.MC=D.UL.prototype
 C.LT=A.jM.prototype
 C.Xo=U.AX.prototype
 C.h4=N.mk.prototype
@@ -16582,10 +17020,10 @@
 C.W3=W.zU.prototype
 C.cp=B.NG.prototype
 C.pU=Z.hx.prototype
-C.RR=A.fl.prototype
+C.RR=A.Mv.prototype
 C.kS=X.kKl.prototype
 C.LN=N.oO.prototype
-C.Qt=D.Kz.prototype
+C.Qt=D.fl.prototype
 C.Xe=L.qkb.prototype
 C.Nm=J.Q.prototype
 C.ON=J.GW.prototype
@@ -16724,7 +17162,7 @@
   hooks.prototypeForTag = prototypeForTagFixed;
 }
 C.xr=new P.by(null,null)
-C.A3=new P.Cf(null)
+C.A3=new P.pz(null)
 C.nX=new P.dI(null)
 C.Yt=Z.vj.prototype
 C.VZ=new N.qV("FINER",400)
@@ -16747,7 +17185,7 @@
 C.xu=I.makeConstantList([43,45,42,47,33,38,60,61,62,63,94,124])
 C.u0=I.makeConstantList(["==","!=","<=",">=","||","&&"])
 C.Me=H.VM(I.makeConstantList([]),[P.Ms])
-C.dn=H.VM(I.makeConstantList([]),[P.Fw])
+C.dn=H.VM(I.makeConstantList([]),[P.tg])
 C.hU=H.VM(I.makeConstantList([]),[P.X9])
 C.iH=H.VM(I.makeConstantList([]),[J.im])
 C.xD=I.makeConstantList([])
@@ -16774,9 +17212,11 @@
 C.t5=W.yk.prototype
 C.k0=V.lI.prototype
 C.Pf=Z.uL.prototype
+C.ZQ=J.FP.prototype
 C.zb=A.XP.prototype
-C.Iv=A.ir.prototype
+C.Iv=A.xc.prototype
 C.Cc=Q.JG.prototype
+C.HD=T.ov.prototype
 C.c0=A.knI.prototype
 C.cJ=U.fI.prototype
 C.SX=R.HF.prototype
@@ -16803,17 +17243,23 @@
 C.lH=new H.GD("checkedText")
 C.XA=new H.GD("cls")
 C.b1=new H.GD("code")
+C.MR=new H.GD("counters")
+C.Xs=new H.GD("coverage")
 C.h1=new H.GD("currentHash")
 C.Na=new H.GD("devtools")
 C.aH=new H.GD("displayCutoff")
 C.Jw=new H.GD("displayValue")
 C.nN=new H.GD("dynamic")
+C.Gr=new H.GD("endPos")
 C.tP=new H.GD("entry")
 C.YU=new H.GD("error")
 C.ne=new H.GD("exception")
 C.mr=new H.GD("expanded")
+C.Of=new H.GD("expander")
+C.Yy=new H.GD("expr")
 C.IV=new H.GD("field")
 C.CX=new H.GD("fileAndLine")
+C.Gd=new H.GD("firstTokenPos")
 C.Aq=new H.GD("formattedAverage")
 C.WG=new H.GD("formattedCollections")
 C.uU=new H.GD("formattedExclusiveTicks")
@@ -16826,7 +17272,7 @@
 C.zS=new H.GD("hasDisassembly")
 C.D2=new H.GD("hasParent")
 C.lb=new H.GD("hideTagsChecked")
-C.YH=new H.GD("hitsStyle")
+C.du=new H.GD("hitStyle")
 C.bA=new H.GD("hoverText")
 C.AZ=new H.GD("dart.core.String")
 C.Di=new H.GD("iconClass")
@@ -16836,16 +17282,18 @@
 C.ai=new H.GD("isEmpty")
 C.nZ=new H.GD("isNotEmpty")
 C.Z8=new H.GD("isolate")
-C.Gd=new H.GD("json")
 C.fy=new H.GD("kind")
 C.hf=new H.GD("label")
 C.QL=new H.GD("last")
+C.kA=new H.GD("lastTokenPos")
 C.Wn=new H.GD("length")
 C.EV=new H.GD("library")
-C.Cv=new H.GD("line")
 C.eh=new H.GD("lineMode")
+C.Cv=new H.GD("lines")
 C.dB=new H.GD("link")
 C.wT=new H.GD("mainPort")
+C.p3=new H.GD("map")
+C.t6=new H.GD("mapAsString")
 C.PC=new H.GD("dart.core.int")
 C.ch=new H.GD("message")
 C.UX=new H.GD("msg")
@@ -16859,20 +17307,23 @@
 C.ap=new H.GD("oldHeapUsed")
 C.wq=new H.GD("pausedOnExit")
 C.NT=new H.GD("pausedOnStart")
+C.Kl=new H.GD("pos")
 C.vb=new H.GD("profile")
 C.zc=new H.GD("qualified")
+C.AO=new H.GD("qualifiedName")
 C.kY=new H.GD("ref")
 C.Dj=new H.GD("refreshTime")
 C.c8=new H.GD("registerCallback")
 C.mE=new H.GD("response")
+C.UY=new H.GD("result")
 C.Aa=new H.GD("results")
-C.iF=new H.GD("rootLib")
+C.xe=new H.GD("rootLib")
 C.X8=new H.GD("running")
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
 C.XU=new H.GD("sampleCount")
 C.bE=new H.GD("sampleDepth")
-C.kA=new H.GD("sampleRate")
+C.mI=new H.GD("sampleRate")
 C.fX=new H.GD("script")
 C.eC=new H.GD("[]=")
 C.V0=new H.GD("showCoverage")
@@ -16887,21 +17338,20 @@
 C.mh=new H.GD("uptime")
 C.Fh=new H.GD("url")
 C.ls=new H.GD("value")
-C.eR=new H.GD("valueType")
 C.zn=new H.GD("version")
 C.RJ=new H.GD("vm")
 C.KS=new H.GD("vmName")
 C.v6=new H.GD("void")
 C.lx=A.tz.prototype
 C.n8=H.uV('qC')
-C.WP=new H.Lm(C.n8,"K",0)
+C.WP=new H.QT(C.n8,"K",0)
 C.SL=H.uV('Ae')
-C.xC=new H.Lm(C.SL,"V",0)
+C.xC=new H.QT(C.SL,"V",0)
 C.QJ=H.uV('xh')
-C.wW=new H.Lm(C.QJ,"T",0)
+C.wW=new H.QT(C.QJ,"T",0)
 C.Gsc=H.uV('wn')
-C.io=new H.Lm(C.Gsc,"E",0)
-C.nz=new H.Lm(C.n8,"V",0)
+C.io=new H.QT(C.Gsc,"E",0)
+C.nz=new H.QT(C.n8,"V",0)
 C.RP=H.uV('hx')
 C.Ln=H.uV('Dg')
 C.z6Y=H.uV('Tg')
@@ -16915,12 +17365,12 @@
 C.GTO=H.uV('F1')
 C.nY=H.uV('a')
 C.Yc=H.uV('iP')
+C.Pt=H.uV('ov')
 C.jRs=H.uV('Be')
-C.P9=H.uV('oO')
+C.Ow=H.uV('oO')
 C.PT=H.uV('I2')
 C.P0k=H.uV('lI')
 C.T1=H.uV('Wy')
-C.hG=H.uV('ir')
 C.aj=H.uV('fI')
 C.UrY=H.uV('kKl')
 C.cK=H.uV('I5')
@@ -16936,22 +17386,22 @@
 C.X6M=H.uV('jM')
 C.yiu=H.uV('knI')
 C.dUi=H.uV('Uj')
-C.iN=H.uV('yc')
+C.U9=H.uV('UL')
+C.iG=H.uV('yc')
 C.cNA=H.uV('NG')
 C.HI=H.uV('Pg')
 C.ab=H.uV('xI')
 C.lk=H.uV('mJ')
 C.lpG=H.uV('LU')
 C.Ch=H.uV('KL')
-C.pI=H.uV('fl')
+C.raB=H.uV('fl')
 C.jV=H.uV('rF')
 C.OdR=H.uV('pL')
 C.ix=H.uV('HF')
 C.wE=H.uV('vj')
+C.yB=H.uV('Mv')
 C.JW=H.uV('Ww')
 C.qo=H.uV('jY')
-C.wH=H.uV('Kz')
-C.cx5=H.uV('m8')
 C.l49=H.uV('uL')
 C.yQ=H.uV('EH')
 C.Im=H.uV('X6')
@@ -16960,14 +17410,16 @@
 C.px=H.uV('tz')
 C.epC=H.uV('Jc')
 C.JA3=H.uV('b0B')
-C.piC=H.uV('nk')
+C.PF=H.uV('nk')
 C.qY=H.uV('wM')
 C.Db=H.uV('String')
 C.BP=H.uV('qkb')
+C.Tu=H.uV('xc')
 C.bh=H.uV('i6')
 C.Bm=H.uV('XP')
 C.hg=H.uV('hd')
 C.Fv=H.uV('ob')
+C.leN=H.uV('Lt')
 C.HL=H.uV('bool')
 C.Qf=H.uV('Null')
 C.HH=H.uV('dynamic')
@@ -16976,7 +17428,7 @@
 C.hI=H.uV('Ir')
 C.CS=H.uV('vm')
 C.hN=H.uV('oI')
-C.LF=H.uV('xT')
+C.R4R=H.uV('xT')
 C.vB=J.is.prototype
 C.xM=new P.z0(!1)
 C.V8=X.I5.prototype
@@ -17015,8 +17467,8 @@
 $.uP=!0
 $.n7="objects/"
 $.To=null
-$.Dq=["A3","A8","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cs","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","F6","FL","FV","Fr","Fv","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Md","Mh","Mi","Mm","Ms","Mu","My","NC","NZ","Nj","O","OP","OZ","Ob","Om","On","PM","PN","PQ","PZ","Pa","Pk","Pv","Q0","QE","QI","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vp","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","aZ","an","at","az","b1","bA","bF","bS","ba","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","ff","fk","fm","g","gA","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBP","gBW","gBb","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gE7","gE8","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHq","gHu","gI","gID","gIF","gIK","gIW","gIt","gJ0","gJQ","gJS","gJf","gJo","gJy","gKK","gKM","gKU","gKV","gKx","gLA","gLY","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gN7","gNF","gNG","gNh","gNl","gO3","gO9","gOL","gOc","gOe","gOh","gOl","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQb","gQg","gQr","gQt","gR","gRA","gRH","gRY","gRd","gRn","gRu","gSB","gSR","gT8","gTq","gU4","gUL","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVE","gVa","gVe","gVl","gWA","gWT","gX3","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","gdW","gdt","ge6","geH","geT","geb","gey","gf0c","gfN","gfY","gfc","gfg","gfn","ghU","ghf","ghi","gho","gi9","giC","giO","gig","gik","giy","gjA","gjL","gjO","gjT","gk5","gkF","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","glb","glc","glh","gm2","gmC","gmH","gmm","gn9","gnN","gng","gnv","gnx","gnz","go6","goE","goY","goc","gor","gp8","gpD","gpQ","gph","gq3","gqO","gqe","gqn","grK","grM","grU","grZ","grs","grz","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtp","gts","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gwl","gx","gx8","gxA","gxX","gxj","gxr","gxw","gy","gy4","gyH","gyT","gys","gyw","gz1","gzP","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","kk","l5","lj","lp","m","mK","n","nC","nH","ni","nq","oB","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","rW","ra","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBP","sBW","sBb","sCO","sCY","sCd","sCj","sE7","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHq","sHu","sID","sIF","sIK","sIt","sJ0","sJQ","sJS","sJf","sJo","sJy","sKK","sKM","sKU","sKV","sKx","sLA","sLY","sLn","sLx","sM0","sM5","sMB","sMj","sN","sN7","sNF","sNG","sNh","sNl","sO3","sO9","sOc","sOe","sOh","sOl","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQb","sQr","sQt","sR","sRA","sRH","sRY","sRd","sRn","sRu","sSB","sT8","sTq","sU4","sUL","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sVe","sWA","sWT","sX3","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","sdW","sdt","se6","seH","seT","seb","sfN","sfY","sfc","sfg","sfn","shU","shf","shi","sho","siC","sig","sik","siy","sjA","sjL","sjO","sjT","sk5","skF","skG","skU","skW","skc","skf","skg","skp","slb","slc","slh","sm2","smC","smH","sn9","snN","sng","snv","snx","so6","soE","soY","soc","sp8","spD","spQ","sph","sq3","sqO","sqe","srM","srU","srZ","srs","srz","st0","st5","stD","stN","stT","stY","sts","suD","suw","svH","svL","svk","svt","swd","sx","sxA","sxX","sxj","sxr","sxw","sy","sy4","syT","sys","syw","sz1","szW","szZ","szf","szg","szh","szj","szt","szw","t","tZ","tg","tn","tt","u","u8","uB","ub","vQ","vV","w","wE","wL","wY","wg","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yl","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY"]
-$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.zw1,B.d1,{created:B.t4},C.xFi,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.JR},C.tf,A.Zt,{created:A.fg},C.pkU,Q.JG,{created:Q.Zo},C.GTO,A.F1,{created:A.aD},C.jRs,F.Be,{created:F.Fe},C.P9,N.oO,{created:N.Qm},C.P0k,V.lI,{created:V.fv},C.hG,A.ir,{created:A.G7},C.aj,U.fI,{created:U.Ry},C.UrY,X.kKl,{created:X.jD},C.cK,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.Wz},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.cNA,B.NG,{created:B.b4},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.pI,A.fl,{created:A.Du},C.OdR,O.pL,{created:O.pn},C.ix,R.HF,{created:R.qa},C.wE,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.wH,D.Kz,{created:D.N5},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.ew},C.FU,R.lw,{created:R.fR},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.JA3,H.b0B,{"":H.UI},C.piC,D.nk,{created:D.dS},C.qY,A.wM,{created:A.lT},C.BP,L.qkb,{created:L.uD},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.ri,W.yy,{},C.hI,F.Ir,{created:F.TW},C.LF,K.xT,{created:K.an}]
+$.Dq=["A3","A8","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cs","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","Kn","LI","LV","Ly","Md","Mh","Mi","Mm","Ms","Mu","My","NZ","Nj","O","OP","Ob","Om","On","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","QI","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","aZ","an","at","az","b1","bA","bF","bS","ba","br","bu","cO","cU","cn","ct","d0","dR","dd","du","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","ff","fk","fm","g","gA","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBP","gBV","gBW","gBb","gBs","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE7","gE8","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gHu","gI","gID","gIF","gIK","gIW","gIZ","gIr","gIt","gIu","gJ0","gJQ","gJS","gJb","gJf","gJo","gJy","gKK","gKM","gKU","gKV","gKx","gLA","gLY","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gN7","gNF","gNG","gNT","gNW","gNh","gNl","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQV","gQb","gQg","gQr","gQt","gR","gRA","gRH","gRY","gRn","gRu","gSB","gSR","gSw","gT8","gTS","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVa","gVe","gVl","gWA","gWT","gX3","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gZf","ga3","ga4","gai","gbG","gbP","gbV","gbY","gbx","gcC","gdG","gdQ","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","ghU","ghX","ghf","ghi","gho","gi9","giC","giO","gig","gik","giy","gjA","gjJ","gjL","gjO","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkg","gkp","gl0","glb","glc","glh","gm2","gmC","gmH","gn9","gnN","gng","gnv","gnx","gnz","goE","goY","goc","gor","gox","goy","gp8","gpD","gpQ","gph","gq3","gqO","gqe","gqn","grK","grM","grU","grZ","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","guD","guw","gvH","gvt","gwd","gwl","gx","gx8","gxA","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gz1","gzP","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hT","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","mK","n","nC","nH","ni","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rW","ra","rh","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBP","sBV","sBW","sBb","sBs","sCO","sCY","sCd","sCj","sDe","sE7","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sHu","sID","sIF","sIK","sIZ","sIr","sIt","sIu","sJ0","sJQ","sJS","sJb","sJf","sJo","sJy","sKK","sKM","sKU","sKV","sKx","sLA","sLY","sLn","sLx","sM0","sM5","sMB","sMj","sN","sN7","sNF","sNG","sNT","sNW","sNh","sNl","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQV","sQb","sQr","sQt","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSw","sT8","sTS","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sVa","sVe","sWA","sWT","sX3","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sa3","sa4","sai","sbG","sbP","sbV","sbY","scC","sdG","sdQ","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","shU","shX","shf","shi","sho","siC","sig","sik","siy","sjA","sjJ","sjL","sjO","sjT","sjv","sk5","skF","skU","skW","skc","skg","skp","slb","slc","slh","sm2","smC","smH","sn9","snN","sng","snv","snx","soE","soY","soc","sox","soy","sp8","spD","spQ","sph","sq3","sqO","sqe","srM","srU","srZ","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","suD","suw","svH","svt","swd","sx","sxA","sxX","sxj","sxr","sxw","sy","sy4","syG","syT","syX","sys","syw","sz1","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vQ","vV","w","wE","wL","wY","wg","x3","xU","xW","xc","xe","xo","xx","y0","yM","yN","yc","yl","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY"]
+$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.zw1,B.d1,{created:B.t4},C.xFi,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.JR},C.tf,A.Zt,{created:A.fg},C.pkU,Q.JG,{created:Q.Zo},C.GTO,A.F1,{created:A.aD},C.Pt,T.ov,{created:T.T5},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.P0k,V.lI,{created:V.fv},C.aj,U.fI,{created:U.Ry},C.UrY,X.kKl,{created:X.jD},C.cK,X.I5,{created:X.cF},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.Wz},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.cNA,B.NG,{created:B.b4},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Ch,M.KL,{created:M.Ro},C.raB,D.fl,{created:D.N5},C.OdR,O.pL,{created:O.pn},C.ix,R.HF,{created:R.qa},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.ew},C.FU,R.lw,{created:R.fR},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.JA3,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.qY,A.wM,{created:A.lT},C.BP,L.qkb,{created:L.uD},C.Tu,A.xc,{created:A.G7},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.leN,R.Lt,{created:R.fL},C.ri,W.yy,{},C.hI,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
 I.$lazy($,"globalThis","DX","jk",function(){return function() { return this; }()})
 I.$lazy($,"globalWindow","cO","C5",function(){return $.jk().window})
 I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
@@ -17077,7 +17529,7 @@
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(o) { this.o = o; }})
 I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
-I.$lazy($,"_pageSeparationColor","fM","mI",function(){return[0,0,0,255]})
+I.$lazy($,"_pageSeparationColor","RD","eK",function(){return[0,0,0,255]})
 I.$lazy($,"_loggers","DY","U0",function(){return H.VM(H.B7([],P.L5(null,null,null,null,null)),[J.O,N.TJ])})
 I.$lazy($,"_logger","G3","iU",function(){return N.Jx("Observable.dirtyCheck")})
 I.$lazy($,"objectType","XV","aA",function(){return P.re(C.nY)})
@@ -17115,11 +17567,11 @@
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().call$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(C.uE),new M.Uf()).zV(0,", ")})
+I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.Uf()).zV(0,", ")})
 I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
 
 init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.JB,P.AN,P.JB,null,P.MN]},"self","parent",{func:"UW",args:[P.JB,P.AN,P.JB,{func:"NT"}]},{func:"wD",args:[P.JB,P.AN,P.JB,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.JB,P.AN,P.JB,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.JB,P.AN,P.JB,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.JB,P.AN,P.JB,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.JB,P.AN,P.JB,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JB,P.AN,P.JB,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.JB,P.AN,P.JB,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.JB,P.AN,P.JB,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.JB,args:[P.JB,P.AN,P.JB,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","nativeImageData","imageData","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","imagedata","dx","dy","dirtyX","dirtyY","dirtyWidth","dirtyHeight","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newNodes","refChild","newChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.zM,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:J.O},{func:"lrq",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","label","row","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"root","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Ds,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Vfx,D.kx,{func:"bR",ret:D.kx},{func:"FH",args:[D.kx]},F.Dsd,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.tuj,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","at","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","id","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"VG",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"UC",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"Dt",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"HE",ret:J.im,args:[J.im,J.im]},"byte","buffer","xhr","header","shouldAdd","prevValue","selector","stream","max",F.Vct,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.D13,H.Tp,A.WZq,U.T5,N.pva,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.im,args:[[P.QV,J.im]]},"color",{func:"S1",void:true,args:[J.im,J.O,[P.QV,J.im]]},"classId",{func:"D8",void:true,args:[null,J.im]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.im],args:[J.im]},{func:"D9",ret:J.O,args:[[P.hL,J.im]]},"point",{func:"Dp",ret:J.im,args:[[P.hL,J.im]]},{func:"j4",void:true,args:[J.im]},"startPage",O.cda,"response","st",{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.waa,{func:"iR",args:[J.im,null]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V4,D.t9,J.GW,G.XN,{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V9,D.bv,D.V10,"tagProfile",P.tU,L.Lr,L.V11,{func:"cH",ret:J.im},{func:"r5",ret:J.Q},Z.V12,M.V13,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V14,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V21,{func:"a7",void:true,args:[J.O,null,null]},{func:"nxg",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"YI",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.AN,P.JB]},{func:"TB",args:[P.JB,P.AN,P.JB,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"Ym",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V22,A.qe,D.rj,{func:"ls",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Yg",ret:J.O,args:[D.c2]},U.V23,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"JC",args:[V.qC]},{func:"dtC",ret:[P.QV,D.bv]},{func:"m3",ret:J.GW},{func:"Uu",args:[J.GW]},"isolateId","mapIsRef","newIsolates","counters","old_counters",[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"profile","codeTable",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"c7",ret:V.qC},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V24,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V25,{func:"nR",ret:Z.uL},U.V26,Q.pv,"details",Q.Nr,V.qC,K.V27,X.V28,"y","instanceRef",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"Gm",args:[J.Q]},D.pD,{func:"AfY",args:[D.zM]},U.V29,];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isSuperCall","stubName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"ny"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.JB,P.AN,P.JB,null,P.MN]},"self","parent",{func:"UW",args:[P.JB,P.AN,P.JB,{func:"ny"}]},{func:"wD",args:[P.JB,P.AN,P.JB,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.JB,P.AN,P.JB,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.JB,P.AN,P.JB,{func:"ny"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.JB,P.AN,P.JB,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.JB,P.AN,P.JB,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.JB,P.AN,P.JB,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.JB,P.AN,P.JB,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.JB,P.AN,P.JB,J.O]},"line",{func:"kx",void:true,args:[J.O]},{func:"Nf",ret:P.JB,args:[P.JB,P.AN,P.JB,P.aY,P.Z0]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","nativeImageData","imageData","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","val",{func:"bh",args:[null,null]},{func:"Za",args:[J.O,null]},"parameter",{func:"np",args:[null,J.O]},G.dZ,D.zM,{func:"Wy",ret:D.bv},C.Nw,C.J19,{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"I0",ret:J.O},{func:"lrq",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event",J.im,[J.Q,G.Y2],[J.Q,J.O],D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Ds,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Vfx,{func:"bR",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},F.Dsd,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",R.tuj,{func:"ZT",void:true,args:[null,null,null]},R.LP,"library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},{func:"lv",args:[P.wv,null]},"typeArgument","tv","i",{func:"VG",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"UC",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},"reflectiveName",{func:"ag",args:[J.O,J.O]},{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each","k",{func:"Yz",ret:J.kn,args:[P.jp]},"matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"Dt",ret:J.im,args:[J.im]},"digit","part",{func:"GF",ret:J.im,args:[null,null]},"byteString",{func:"HE",ret:J.im,args:[J.im,J.im]},"byte","buffer","xhr","header","prevValue",F.Vct,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.D13,H.Tp,R.Nr,A.WZq,U.qe,{func:"fO",ret:J.O,args:[D.SI]},N.pva,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.im,args:[[P.QV,J.im]]},"color",{func:"S1",void:true,args:[J.im,J.O,[P.QV,J.im]]},"classId",{func:"D8",void:true,args:[null,J.im]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.im],args:[J.im]},{func:"D9",ret:J.O,args:[[P.hL,J.im]]},"point",{func:"Dp",ret:J.im,args:[[P.hL,J.im]]},{func:"j4",void:true,args:[J.im]},"startPage",O.cda,"response","st",{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.waa,{func:"iR",args:[J.im,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[J.O]}]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V4,D.t9,J.GW,G.XN,{func:"Ta",ret:J.O,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V9,D.bv,D.V10,P.tU,L.Lr,L.V11,"tagProfile",Z.V12,M.V13,"rec",{func:"IM",args:[N.HV]},Z.uL,A.V14,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V21,{func:"Z8",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"YI",ret:J.kn,args:[J.O]},A.xc,{func:"B4",args:[P.AN,P.JB]},{func:"TB",args:[P.JB,P.AN,P.JB,{func:"Dv",args:[null]}]},{func:"cH",ret:J.im},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.yj]]},"onName","eventType",{func:"rj",void:true,args:[J.O,J.O]},{func:"Ym",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"pair","p",{func:"YT",void:true,args:[[J.Q,T.yj]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item",3,{func:"qo",args:[U.hw]},Q.V22,D.rj,[J.Q,D.c2],{func:"ls",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[J.Q,D.c2]},{func:"oe",args:[[J.Q,D.c2]]},{func:"Yg",ret:J.O,args:[D.c2]},T.V23,A.rs,U.V24,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"JC",args:[V.qC]},{func:"dtC",ret:[P.QV,D.bv]},{func:"m3",ret:J.GW},{func:"mV",args:[J.GW]},"isolateId",[P.Z0,J.O,J.GW],{func:"c7",ret:V.qC},{func:"zs",ret:J.O,args:[J.O]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V25,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V26,{func:"nR",ret:Z.uL},U.V27,Q.pv,"details",Q.Bc,V.qC,K.V28,X.V29,"y",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"Gm",args:[J.Q]},D.pD,{func:"AfY",args:[D.zM]},U.V30,];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js.map b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js.map
index 51721a8..5948d0b 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js.map
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js.map
@@ -1,7 +1,7 @@
 {
   "version": 3,
   "sourceRoot": "",
-  "sources": ["file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/interceptors.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_rti.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_array.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/iterable.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/sort.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_number.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_string.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/regexp_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/isolate_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/queue.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/collection_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/timer.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/native_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/core_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/string_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/constant_map.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/symbol.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/chart.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/logging/logging.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/application.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/change_notifier.dart","file:///Users/turnidge/dart/dart-sdk/lib/js/dart2js/js_dart2js.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/location_manager.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/dart2js/html_dart2js.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/view_model.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/index_devtools.html_bootstrap.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/loader.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/breakpoint_list.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/instance.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable_map.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/class_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/class_view.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/uri.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/code_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/code_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/collapsible_content.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/curly_block.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/custom_element/polyfill.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/future.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/lists.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/list.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_mirrors.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/linked_hash_map.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_names.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/async_error.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/schedule_microtask.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/async_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream_controller.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/broadcast_stream_controller.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream_impl.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream_pipe.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/duration.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/zone.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/internal_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/future_impl.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/hash_map.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/iterable.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/maps.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/collections.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/hash_set.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/list.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/splay_tree.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/convert_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/convert/json.dart","file:///Users/turnidge/dart/dart-sdk/lib/convert/utf.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/comparable.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/errors.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/string.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/exceptions.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/list.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/print.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/annotations.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/bool.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/date_time.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/expando.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/null.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/object.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/string_buffer.dart","file:///Users/turnidge/dart/dart-sdk/lib/convert/codec.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/conversions.dart","file:///Users/turnidge/dart/dart-sdk/lib/svg/dart2js/svg_dart2js.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/filtered_element_list.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/isolate_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/jenkins_smi_hash.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/math.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/math_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/point.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/rectangle.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/mirrors_patch.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/collection/src/unmodifiable_wrappers.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/collection/wrappers.dart","file:///Users/turnidge/dart/dart-sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_primitives.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/error_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/eval_box.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/to_observable.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/field_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/field_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/function_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/service_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/function_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/heap_map.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/heap_profile.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/observatory_element.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/device.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/css_class_set.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/instance_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/instance_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_profile.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_summary.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/json_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/library_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/library_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/nav_bar.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/observatory_application.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/service_html.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/service/object.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/change_record.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/compound_path_observer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/dirty_check.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/list_diff.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable_list.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable_box.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/path_observer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/boot.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/declaration.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/template_binding.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/node_binding.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/job.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/deserialize.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/polymer_expressions.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/tokenizer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/parser.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/eval.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/visitor.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/async.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/expression.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/src/globals.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/src/mirrors.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/response_viewer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/script_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/script_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/service_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/sliding_checkbox.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/stack_frame.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/stack_trace.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/input_bindings.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/instance_binding_map.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/template.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/template_iterator.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/input_element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/node.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/select_element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/text.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/text_area_element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/vm_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/vm_view.dart"],
-  "names": ["getInterceptor","makeDispatchRecord","getNativeInterceptor","initNativeDispatch","lookupAndCacheInterceptor","int","map","findInterceptorConstructorForType","findIndexForNativeSubclassType","findConstructorForNativeSubclassType","bool","Primitives","String","dynamic","invocation","Type","getRuntimeTypeString","length","IterableMixinWorkaround","Iterable","list","E","List","_rangeCheck","Lists","_doSort","a","Iterator","iterable","factory","b","isNegative","num","roundToDouble","double","allMatchesInStringUnchecked","Match","string","other","substring","stringReplaceAllUnchecked","pattern","_isWhitespace","regExp","_match","stringContainsUnchecked","static","_callInIsolate","isolate","_globalState","weakPorts","_addRegistration","entry","rootContext","computeThisScriptD8","_deserializeMessage","msg","_add","events","workerIds","_serializeMessage","fillLiteralMap","_log","print","supportsWorkers","_visited","_Manager","isWorker","fromCommandLine","topEventLoop","isolates","managers","mainManager","pauseCapability","pauseTokens","isPaused","_length","delayedEvents","_head","_table","_tail","_grow","_modificationCount","isolateStatics","code","message","addPause","removePause","RawReceivePortImpl","ports","_updateGlobalState","id","_IsolateEvent","dequeue","event","next","runIteration","_runHelper","fn","context","mirrorFunctionCacheName","mirrorInvokeCacheName","replyTo","topLevel","_isolateId","_receivePort","_workerId","_receivePortId","_isClosed","_handler","_id","visitSendPort","port","visitCapability","x","SendPort","Capability","operator","tagged","traverse","isPrimitive","visitPrimitive","_dispatch","visitList","visitMap","visitObject","copy","Map","_nextFreeRefId","_serializeList","result","deserialize","_deserialized","_deserializeHelper","_deserializeList","_deserializeMap","deserializeSendPort","deserializeCapability","deserializeObject","dartList","keys","values","_inEventLoop","_handle","_once","TimerImpl","convertDartClosureToJS","callback","value","match","handleError","digitsPart","source","name","getRuntimeTypeInfo","joinArguments","objectTypeName","array","_current","_fromCharCodeApply","stringFromCodePoints","receiver","positionalArguments","arguments","namedArguments","function","functionNoSuchMethod","info","data","defaultArguments","iae","ioore","wrapException","toStringWrapper","JS","throwExpression","unwrapException","saveStackTrace","nsme","notClosure","nullCall","nullLiteralCall","undefCall","undefLiteralCall","nullProperty","undefProperty","undefLiteralProperty","object","invokeClosure","JS_CALL_IN_ISOLATE","functionCounter","forwardCallTo","functions","forwardInterceptedCallTo","cspForwardCall","computeFieldNamed","selfFieldNameCache","cspForwardInterceptedCall","BoundClosure","closureFromTearOff","Closure","property","interceptedTypeCast","propertyTypeCastError","RuntimeFunctionType","RuntimeType","Object","getRuntimeTypeArguments","substitute","getRuntimeTypeArgument","getTypeArgumentByIndex","type","onTypeVariable","_contents","runtimeTypeToString","invokeOn","areSubtypes","isSubtype","computeSignature","isFunctionSubtype","names","areAssignable","areAssignableMaps","getTagFunction","alternateTagFunction","makeLeafDispatchRecord","patchInteriorProto","makeDefaultDispatchRecord","initNativeDispatchFlag","initNativeDispatchContinue","dispatchRecordsForInstanceTags","interceptorsForUncacheableTags","initHooks","tags","prototypeForTagFunction","applyHooksTransformer","haystack","needle","_nativeRegExp","regexp","Maps","_throwUnmodifiable","V","_jsObject","containsKey","_keys","f","_map","Symbol","_memberName","mangledNames","unmangledName","_kind","_arguments","_namedArgumentNames","_getCachedInvocation","_internalName","symbol","memberName","throwInvalidReflectionError","isIntercepted","cachedInterceptor","jsFunction","interceptor","requiredParameterCount","computeFunctionRti","functionType","setRuntimeTypeInfo","namedArgumentList","matchTypeError","_pattern","_argumentsExpr","_expr","_method","_receiver","_message","JsNoSuchMethodError","_trace","_exception","closure","_self","_target","receiverFieldNameCache","CastErrorImplementation","RuntimeError","_extractFunctionTypeObjectFrom","toRti","returnType","parameterTypes","listToRti","optionalParameterTypes","namedParameters","extractKeys","rti","argument","UnimplementedNoSuchMethodError","_unmangledName","_typeName","get","_nativeGlobalRegExp","makeNative","_nativeAnchoredRegExp","_nativeGlobalVersion","_nativeAnchoredVersion","_execAnchored","_MatchImplementation","_re","_string","_regExp","Logger","_api","Isolate","__$isolate","set","notifyPropertyChangeHelper","ServiceObject","__$response","__$args","locationManager","ObservatoryApplication","_initOnce","_chart","props","options","table","__$currentHash","hashChangeEvent","_tryResume","_wrapZone","setDefaultHash","requestCurrentHash","window","currentHash","parts","_app","_expanded","onShow","onHide","expanded","rows","root","row","_collapse","_librariesToLoad","_useDirtyChecking","i37","ServiceMap","__$msg","notifyPropertyChange","BreakpointListElement","ClassRefElement","__$cls","Future","cls","_uriEncode","ClassViewElement","CodeRefElement","Code","__$code","CodeViewElement","__$iconClass","__$displayValue","_collapsed","_refresh","CollapsibleContentElement","__$expanded","__$busy","__$callback","doneCallback","CurlyBlockElement","js","customElements","_isReady","document","combine","_toStringList","from","otherList","dst","src","_insertionSort","_dualPivotQuicksort","compare","action","elementAt","test","fold","_iterable","_endOrLength","_start","_startIndex","_endIndex","SubListIterable","_index","_f","T","_iterator","_source","_currentExpansion","_takeCount","_remaining","_skipCount","SkipIterable","_name","toString","s","InstanceMirror","TypeMirror","mangledGlobalNames","reflectClassByName","mangledName","JsCache","classMirrors","reflectClassByMangledName","originalDeclaration","referent","fields","superclassName","mixins","reflectMixinApplication","typeVariables","method","ClassMirror","it","ownerClass","findTypeVariableIndex","typeVariable","getTypeArgument","reflectClass","owner","JSArray","splitFields","fieldSpecification","fieldsMetadata","key","_cachedLibraries","librariesByName","library","_splitRe","libraries","_prettyName","_getField","LibraryMirror","currentJsMirrorSystem","_isRoot","computeQualifiedName","simpleName","n","_invoke","DeclarationMirror","_functionMirrors","_cachedClasses","_classes","__functions","__variables","setterSymbol","mirror","reflect","__members","_jsFunction","_cachedFunctionMirrors","_functions","_globalObject","_cachedFields","parseCompactFieldSpecification","_compactFieldSpecification","_cachedFunctions","_cachedGetters","_cachedSetters","_cachedVariables","_fields","_cachedMembers","__classes","__getters","__setters","_cachedDeclarations","_cachedMetadata","_metadata","Function","addToResult","_cachedSimpleName","superclass","mixin","superName","reflectee","_classInvocationCache","reflectiveNames","reflectiveName","cacheEntry","_getterCache","_getFieldSlow","_newProbeFn","_newInterceptedGetterFn","_newGetterFn","objectHashCode","Error","typeArguments","_class","_typeArguments","_cachedTypeArguments","addTypeArgument","_cachedMethods","_cachedConstructors","filterConstructors","_methods","filterMembers","__constructors","JsLibraryMirror","_superclass","typeMirrorFromRuntimeTypeRepresentation","typeInformation","_cachedSuperinterfaces","_mangledName","typeArgument","tv","_jsConstructorOrInterceptor","_jsConstructor","isReflectiveDataInPrototype","reflectionName","_getMethodsWithOwner","_fieldsDescriptor","_fieldsMetadata","_getFieldsWithOwner","_cachedMethodsMap","filterMethods","_owner","reflectType","JsMirrorSystem","extractMetadata","__methods","_getSuperinterfacesWithOwner","_cachedTypeVariables","_type","_metadataFunction","_jsName","isFinal","descriptor","fieldInformation","field","fieldCode","accessorName","MethodMirror","callName","_parameters","metadata","_returnType","_parameterCount","ownerType","isConstructor","optionalParameterCount","parameter","formals","raw","isStatic","isGetter","_setField","isSetter","isOperatorName","metadataList","JsFunctionTypeMirror","_cachedReturnType","_typeData","_cachedParameters","_cachedToString","_throw","errorHandler","zone","_nextCallback","_lastCallback","_asyncRunCallbackLoop","_createTimer","Zone","_previous","_next","notificationHandler","_runUserCode","onSuccess","userCode","onError","subscription","future","_cancelAndErrorClosure","Timer","_duration","self","ZoneCallback","ZoneUnaryCallback","ZoneBinaryCallback","_scheduleAsyncCallback","printString","printToZone","_BroadcastStreamController","_eventState","_state","_Future","_doneFuture","previous","_removeListener","_callOnCancel","_addEventError","_sendData","_sendError","_ensureDoneFuture","_sendDone","_addStreamState","addState","_runGuarded","_onCancel","_forEachListener","link","computation","_FutureOnValue","_onValueCallback","_FutureErrorTest","_errorTestCallback","_onErrorCallback","_FutureAction","_whenCompleteActionCallback","_registerErrorHandler","_addListener","_resultOrListeners","_AsyncError","_zone","listener","current","_chainFutures","_removeListeners","_setValue","_propagateToListeners","_setError","_complete","_asyncComplete","target","internalFuture","asyncError","_propagateMultipleListeners","handleValueCallback","handleWhenCompleteCallback","_completeError","errorCallback","completeResult","Stream","_cancelAndValue","StreamSubscription","_controller","_onListen","otherStream","_onData","_onError","_onDone","_pending","_guardCallback","_onPause","lastPendingEvent","_onResume","_cancelFuture","_cancel","_addPending","pending","_checkState","sendError","sendDone","_createSubscription","_BufferingStreamSubscription","dispatch","error","stackTrace","_DelayedEvent","scheduleMicrotask","handleNext","firstPendingEvent","_cancelAndError","sink","_subscription","_stream","_ForwardingStreamSubscription","_handleData","_handleError","_handleDone","_test","_transform","_TakeStream","_SkipStream","_degelationTarget","parent","_errorZone","otherZone","run","handleUncaughtError","runUnary","runBinary","registerCallback","registerUnaryCallback","registerBinaryCallback","copiedMap","HandleUncaughtErrorHandler","RunHandler","RunUnaryHandler","RunBinaryHandler","RegisterCallbackHandler","RegisterUnaryCallbackHandler","RegisterBinaryCallbackHandler","ScheduleMicrotaskHandler","CreateTimerHandler","PrintHandler","ForkHandler","ZoneSpecification","_rootHandleUncaughtError","_rootFork","_rootRun","_rootRunUnary","_rootRunBinary","_rootScheduleMicrotask","_rootCreateTimer","_toStringVisiting","_iterablePartsToStrings","ultimateString","penultimateString","m","_strings","_nums","_rest","_findBucketIndex","_computeHashCode","_computeKeys","_newHashTable","_addHashTableEntry","_setTableEntry","_removeHashTableEntry","_getTableEntry","_validKey","_hashCode","_equals","_CustomHashMap","K","_offset","cell","_newLinkedCell","ifAbsent","_unlinkCell","_last","_first","_modifications","LinkedHashMapCell","last","_LinkedCustomHashMap","_cell","_computeElements","bucket","_elements","add","element","_set","LinkedHashSetCell","iterator","buffer","isEmpty","_iterableToString","setRange","setAll","queue","_writeToList","_nextPowerOf2","_remove","ListQueue","_queue","_position","_end","_root","_dummy","_compare","tmp","right","left","_splayCount","_SplayTreeNode","_splay","_count","_splayMax","node","_comparator","mapRoot","_addNewRoot","tree","nodes","visit","SplayTreeMap","_currentNode","_getValue","_workList","_tree","_findLeftMostDescendent","currentNode","_SplayTreeIterator","_convertJsonToDart","revive","walk","_parseJson","cause","JsonUnsupportedObjectError","JsonCyclicError","_reviver","decoder","_JsonStringifier","_toEncodableFunction","encoder","JsonEncoder","JsonDecoder","seen","stringifyJsonValue","toEncodable","escape","checkCycle","stringifyValue","stringifier","charCodes","sb","Converter","_buffer","_bufferIndex","str","_writeSurrogate","fixedList","expires","millisecondsSinceEpoch","isUtc","lazyAsJsDate","fourDigits","twoDigits","threeDigits","DateTime","duration","re","parseIntOrZero","parseDoubleOrZero","Duration","inMinutes","inSeconds","sixDigits","inMicroseconds","StackTrace","ArgumentError","RangeError","FallThroughError","_namedArguments","NoSuchMethodError","UnsupportedError","UnimplementedError","StateError","modifiedObject","ConcurrentModificationError","variableName","CyclicInitializationError","_getKey","_keyCount","_currentCodePoint","_nextPosition","objects","write","StringBuffer","host","_writeAuthority","_host","_port","scheme","_normalize","pathSegments","base","path","_hasDotSegments","output","userInfo","ss","_path","query","fragment","uri","Uri","_makePath","_makeScheme","_eitherOf","_parseIntOrZero","_makeHost","_makeQuery","_makeFragment","parseIPv6Address","isSchemeLowerCharacter","isSchemeCharacter","queryParameters","component","decodeHexDigitPair","isNormalizedHexDigit","isUnreserved","fillResult","normalizeHexDigit","bytes","parseHex","parseIPv4Address","canonicalTable","byteToHex","_schemeLowerTable","_schemeTable","_unreservedTable","isLowerCaseHexDigit","part","hex","Device","request","xhr","loadEvent","errorEvent","completer","_createElement","e","WindowBase","_DOMWindowCrossFrame","EventTarget","_convertNativeToDart_XHR_Response","convertNativeToDart_AcceptStructuredClone","_callConstructor","_callEnteredView","_callLeftView","_callAttributeChanged","_ElementFactoryProvider","_wrapBinaryZone","CanvasRenderingContext2D","_putImageData_2","convertDartToNative_ImageData","_dartDetail","DocumentFragment","Element","Node","ElementList","_querySelectorAll","querySelector","_docChildren","children","CssClassSet","Rectangle","clientLeft","clientTop","clientWidth","clientHeight","offsetLeft","offsetTop","offsetWidth","offsetHeight","_localName","elem","ShadowRoot","ElementEvents","ElementStream","changeEvent","clickEvent","inputEvent","mouseMoveEvent","_convertNativeToDart_EventTarget","Events","_initMouseEvent_1","_convertDartToNative_EventTarget","Point","_clientX","_clientY","point","override","_call","parentNode","_this","nodeValue","_rows","Location","_isDartLocation","_location_wrapper","_ensureRequestAnimationFrame","_convertNativeToDart_Window","_postMessage_2","_convertDartToNative_PrepareForStructuredClone","top","width","height","SpeechInputResult","SpeechRecognitionResult","_childElements","_element","toList","_nodeList","_elementList","_FrozenElementList","_ptr","webkitEvents","responseText","OptionElement","remove","attributes","_matches","Set","_elementCssClassSetIterable","_elementIterable","modify","_modifyWithReturnValue","_MultiElementCssClassSet","prevValue","classname","_eventType","_targetList","_useCapture","pool","_unlisten","_pauseCount","_subscriptions","stream","_StreamPool","close","_eventTypeGetter","_list","_array","_createSafe","_window","_cssClassSet","_childNodes","_convertDartFunction","_callDartFunction","_convertToJS","_toMangledNames","o","_getJsProxy","_getOwnProperty","createProxy","_defineProperty","_wrapToDart","JsObject","_getDartProxy","_convertToDart","args","_convertDataTree","_convert","_convertedObjects","convertedList","_checkRange","index","callMethod","_lo","_hi","_nextState","_Random","y","finish","currentMirrorSystem","_base","abstract","_invalidIndex","_checkIndex","_checkSublistArguments","_setRangeFast","__$error","ErrorViewElement","__$text","__$lineMode","evalType","ObservableList","__$results","text","_toObservableDeep","results","targetElement","EvalBoxElement","FieldRefElement","__$field","FieldViewElement","__$qualified","__$ref","refMap","__$hasParent","__$hasClass","FunctionRefElement","__$function","FunctionViewElement","PixelReference","_data","_dataIndex","__$status","__$fragmentation","shadowRoot","_fragmentationCanvas","_handleMouseMove","_classIdToName","_classIdToColor","_colorToClassId","_packColor","classList","member","rng","_addClass","_fragmentationData","_pageHeight","fragmentation","pages","_addressAt","_updateClassList","convertNativeToDart_ImageData","_createImageData_1","_renderPages","HeapMapElement","_updateFragmentationData","__$profile","GoogleChart","_fullChart","_newPieChart","_oldPieChart","_combinedChart","_draw","profile","_fullDataTable","_combinedDataTable","_classHasNoAllocations","_fullTableColumnValue","_combinedTableColumnValue","_newPieDataTable","heap","_oldPieDataTable","v","_updateChartData","formattedAverage","formattedTotalCollectionTime","formattedCollections","HeapProfileElement","cleanupSlots","ImageData","nativeImageData","imageData","userAgent","_isOpera","isOpera","_isWebKit","copies","readSlot","writeSlot","date","findSlot","readClasses","writeClasses","_filtered","removeRange","el","ref","expandEvent","done","InstanceRefElement","__$instance","instance","InstanceViewElement","childNode","ProfileCodeTrieNodeTreeRow","columns","formatPercent","percent","codeCaller","ProfileCallerTreeRow","__$callGraphChecked","__$hideTagsChecked","__$sampleCount","__$refreshTime","__$sampleRate","__$sampleDepth","__$displayCutoff","totalSamples","now","displayThreshold","_update","refresh","_buildCallersTree","_buildStackTree","colors","IsolateProfileElement","IsolateRefElement","IsolateSummaryElement","IsolateViewElement","__$json","json","JsonViewElement","LibraryRefElement","__$library","LibraryViewElement","Level","_level","_rootLevel","_getStream","level","fullName","LogRecord","log","_loggers","loggerName","main","c","rec","initPolymer","NavBarElement","__$link","__$anchor","__$last","NavMenuElement","NavMenuItemElement","__$active","__$label","refreshDone","NavRefreshElement","TopNavMenuElement","IsolateNavMenuElement","LibraryNavMenuElement","ClassNavMenuElement","__$devtools","__$app","ObservatoryApplicationElement","_zeroPad","frame","file","ObservatoryElement","_changes","observed","unobserved","_records","hasObservers","deliverChanges","oldValue","newValue","_observers","_value","_started","_scheduleResolve","_subs","observer","_resolve","_scheduled","_computeValue","sub","start","_delivering","_allObservables","toCheck","debugLoop","_logger","_allObservablesCount","enqueueDirtyCheck","dirtyCheckObservables","wrapCallback","wrapUnaryCallback","distances","old","math","edits","arr1","arr2","_sharedPrefix","_sharedSuffix","splice","_spliceOperationsFromEditDistances","_calcEditDistances","ops","splices","record","_unmodifiableRemoved","_addedCount","removed","_mergeSplice","records","_createInitialSplices","calcSplices","obj","_mirror","_values","_listChanges","_recordChange","_notifyChangeLength","_listRecords","deliverListChanges","projectListSplices","isInsert","isRemove","notifyChange","_getObjectProperty","_maybeHasGetter","_hasMethod","_maybeHasSetter","_safeSuperclass","validate","_pathRegExp","_isValid","_updateValues","_segments","_setObjectProperty","_observePath","_observeIndex","PathObserver","computeValue","_isPathValid","_updateObservedValues","_changeRecordMatches","_preventFlashOfUnstyledContent","style","head","_veilElements","Polymer","_ready","_waitSuper","w","_getPublishedProperties","meta","_hasSetter","getter","platform","shadowCss","sheet","jsSheet","_sheetLog","_typesByName","_waitType","waiting","_forNodeTree","child","attr","originalPrepareBinding","_shadowHost","_findMethod","receiverMirror","scope","_requestAnimationFrame","_getCoreType","dirtyCheckZoneSpec","dirtyCheckZone","_initPolymerOptimized","_registerCustomElement","_loadLibraries","customElementsReady","_loadLibrary","_discoverScripts","scripts","_rootUri","reference","_removeDotSegments","_merge","uriPath","_loaderLog","lib","_maybeInvoke","PolymerDeclaration","_super","templateBind","nodeBindFallback","waitingForType","waitingForExtendee","_supertype","_declarations","publishAttributes","_publish","_publishLC","_lowerCaseMap","inferObservers","accumulateInstanceAttributes","addAttributeDelegates","_eventDelegates","cacheSheets","cacheStyles","installLocalSheets","cssTextToScopeStyle","cssTextForScope","_shimShadowDomStyling","templateContent","registered","registerType","_notifySuper","extendee","decl","superDecl","attrs","_getProperty","_instanceAttributes","findNodes","_sheets","_styles","_cssTextFromSheet","content","sheets","styles","StyleElement","_observe","properties","registerWhenReady","blackList","delegates","matcher","MirrorSystem","_eventTranslations","prepareElement","localName","_declaration","observeProperties","copyInstanceAttributes","takeAttributes","addHostListeners","_preparingElements","parseDeclarations","cancelUnbindAll","asyncUnbindAll","declaration","parseDeclaration","elementElement","lightFromTemplate","shadowFromTemplate","_shadowRoots","syntax","append","marshalNodeReferences","createShadowRoot","applyAuthorStyles","$","attributeToProperty","propertyForAttribute","_inferPropertyType","publishLC","serializeValue","NodeBinding","_bindLog","inA","reflectPropertyToAttribute","bindings","_unbound","_unbindLog","_unbindAllJob","unbindAll","job","_timer","complete","_propertyObserver","unregisterObservers","_unbindNodeTree","observe","observeArrayValue","changes","notifyPropertyChanges","valuePairs","_observeLog","unregisterObserver","_eventsLog","addNodeListeners","hostEventListener","_reverseEventTranslations","dispatchMethod","_invokeMethod","nodeBind","publish","pair","_findController","ctrlr","p","isOptional","_node","_sub","_lastValue","_property","_observer","_PolymerBinding","_propertyValueChanged","PolymerElement","polymerCreated","stop","_callback","_typeHandlers","handler","JSON","def","prepareBinding","_tokenizer","_tokens","_advance","_parseExpression","isSemanticTemplate","prepareInstanceModel","globals","_converter","assign","_scope","_Binding","expr","vars","StreamBinding","op","filters","ident","notAssignable","l","eval","__modelMirror","model","_variables","getMemberMirror","_modelMirror","memberMirror","_updateSelf","_invalidate","_parent","visitExpression","visitInExpression","visitEmptyExpression","visitParenthesizedExpression","visitGetter","g","visitIndex","i","arg","visitInvoke","visitLiteral","visitMapLiteral","visitMapLiteralEntry","visitIdentifier","visitBinaryOperator","visitUnaryOperator","invoke","accept","entries","_UNARY_OPERATORS","_BINARY_OPERATORS","receiverValue","identifier","call","EvalException","_JenkinsSmiHash","Index","Invoke","_listEquals","_hashList","entryValue","item","_token","Expression","_astFactory","_parseUnary","_parsePrecedence","_parseArguments","_parseIndex","_makeInvokeOrGetter","_parseBinary","_parsePrimary","_parseInvokeOrIdentifier","_parseString","_parseInteger","_parseDecimal","_parseMapLiteral","MapLiteral","Literal","IndexedValue","Mirror","classMirror","kind","tokenizeString","tokenizeIdentifierOrKeyword","tokenizeNumber","tokenizeFraction","_OPERATORS","_TWO_CHAR_OPS","_PRECEDENCE","_GROUPERS","_sb","_KEYWORDS","ParseException","ResponseViewerElement","__$line","ScriptRefElement","Script","__$script","__$showCoverage","script","showCoverageChanged","line","ScriptViewElement","_upgradeObservableMap","_upgradeObservableList","ServiceObjectOwner","VM","_serviceType","__$name","__$vmName","_loaded","reload","immutable","vm","update","_isolateCache","__$version","__$architecture","__$uptime","_currentObjectMatcher","_currentIsolateMatcher","_parseIsolateId","_parseObjectId","_getIsolate","_cache","getAsMap","getString","_updateIsolates","isolateMap","oldIsolateCache","newIsolateCache","__$pausedOnStart","__$pausedOnExit","__$running","__$idle","codeTable","codeRegion","_resetProfileData","_updateProfileData","profileTrieRoot","_processProfileTrie","_processCoverage","coverageList","coverage","__$rootLib","ObservableMap","__$topFrame","__$mainPort","__$entry","__$newHeapUsed","__$oldHeapUsed","__$newHeapCapacity","__$oldHeapCapacity","__$fileAndLine","_upgradeCollection","timers","timerMap","CodeTrieNode","_trieDataCursor","_trieData","_readTrieNode","__$totalSamplesInProfile","exclusiveTicks","inclusiveTicks","__$formattedInclusiveTicks","__$formattedExclusiveTicks","callers","callees","addressTicks","scriptCoverage","timer","canCache","__$kind","__$message","_url","_shortUrl","_processSource","load","hits","scriptHits","sourceLines","lines","address","tick","CodeKind","__$objectPool","calls","codes","profileData","_resolveCalls","_processTicks","vmName","startAddress","endAddress","_processDisassembly","instructions","__$hasDisassembly","disassembly","profileTicks","_sumCallCount","_callCount","caller","count","_isServiceMap","HttpRequest","HttpVM","_outstandingRequests","_requestSerial","DartiumVM","messageEvent","_messageHandler","__$object","objectChanged","_constructElementForObject","ServiceObjectViewElement","__$internal","url","hoverText","ServiceRefElement","__$checked","__$checkedText","__$uncheckedText","input","SlidingCheckboxElement","__$frame","StackFrameElement","__$trace","trace","StackTraceElement","_checkboxEventType","_InstanceBindingMap","_getBindings","_SEMANTIC_TEMPLATE_TAGS","_createInstanceBindingMap","templateBindFallback","_processBindings","_addMapBindings","_getTreeScope","_parseAttributeBindings","_parseMustaches","tokens","delegateFn","bound","_MustacheTokens","delegate","NodeBindExtension","_expando","_eventSub","_getStreamForInputType","nodeValueChanged","conditional","select","selectBinding","div","checkbox","fired","InputElement","_getAssociatedRadioButtons","checkedBinding","treeScope","radios","SelectElement","_cancelMutationObserver","_tryUpdateValue","_onMutation","_toInt","_bindings","binding","TemplateBindExtension","_scheduleIterator","_stagingDocument","_ownerStagingDocument","_deepCloneIgnoreTemplateContent","_addTemplateInstanceRecord","BindingDelegate","_bindingDelegate","_decorate","_templateInstanceRef","_content","_templateIsDecorated","_injectStylesheet","_extractTemplateFromAttributeTemplate","templateElementExt","doc","_getOrCreateTemplateContentsOwner","_liftNonNativeChildrenIntoContent","bootstrap","stagingDocument","clone","template","_contentsOwner","d","_bootstrap","descendents","_initStyles","_ext","_model","_combinator","_singleCombinator","_listCombinator","resolve","depsChanging","_valueSub","hasRepeat","hasBind","_valueChanged","repeatModel","bindModel","repeatPath","bindPath","hasIf","ifModel","ifPath","valueObserver","iteratedValue","unobserve","_listSub","_handleSplices","_templateExt","terminators","subIter","getTerminatorAt","instanceNodes","_templateElement","previousTerminator","_BoundNodes","closed","_initPrepareFunctions","_instanceModelFn","_instancePositionChangedFn","instanceCache","extractInstanceAt","insertInstanceAt","closeInstanceBindings","valueFn","r","unbind","TextAreaElement","_pathSub","valueChanged","VMRefElement","__$vm","ServiceError","VMViewElement","globalThis","globalWindow","globalWorker","globalPostMessageDefined","thisScript","computeThisScript","noSuchMethodPattern","extractPattern","provokeCallErrorOn","notClosurePattern","nullCallPattern","nullLiteralCallPattern","undefinedCallPattern","undefinedLiteralCallPattern","nullPropertyPattern","provokePropertyErrorOn","nullLiteralPropertyPattern","undefinedPropertyPattern","undefinedLiteralPropertyPattern","validationPattern","_dynamicType","_voidType","computeLibrariesByName","computeMangledNames","computeReflectiveNames","_safeConsole","_DART_OBJECT_PROPERTY_NAME","_DART_CLOSURE_PROPERTY_NAME","_freeColor","_pageSeparationColor","objectType","_spacesRegExp","_objectType","bindPattern","_polymerSyntax","veiledElements","_libs","_allTemplatesSelectors"],
-  "mappings": "A;A,a,kB;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,C,I,C,Y,C,C,G,C,a,C,G,C,oB,C,G,C,Y,C,G,C,Q,C,G,C,iB,C,G,C,Q,C,G,C,c,C,G,C,gB,C,G,C,kB,C,G,C,a,C,G,C,iB,C,E,C,M,C,G,C,iB,C,G,C,iB,C,G,C,M,C,G,C,U,C,G,C,S,C,G,C,O,C,G,C,gB,C,G,C,c,C,G,C,S,C,G,C,U,C,G,C,G,C,G,C,S,C,G,C,qB,C,G,C,O,C,G,C,Q,C,G,C,gB,C,G,C,a,C,G,C,gB,C,G,C,Y,C,G,C,Y,C,G,C,kB,C,G,C,Q,C,G,C,kB,C,G,C,Y,C,E,C,O,C,G,C,W,C,G,C,a,C,G,C,Y,C,G,C,U,C,G,C,kB,C,G,C,M,C,G,C,W,C,G,C,M,C,G,C,O,C,G,C,gB,C,G,C,Y,C,G,C,W,C,G,C,W,C,G,C,S,C,G,C,U,C,G,C,M,C,G,C,Q,C,G,C,kB,C,G,C,a,C,G,C,e,C,G,C,S,C,G,C,iB,C,G,C,a,C,E,C,G,C,G,C,M,C,E,C,G,C,G,C,oB,C,G,C,a,C,G,C,gB,C,G,C,S,C,G,C,S,C,G,C,gB,C,G,C,S,C,G,C,sB,C,G,C,S,C,G,C,kB,C,G,C,Y,C,G,C,a,C,G,C,Y,C,G,C,Q,C,G,C,Q,C,G,C,gB,C,G,C,Q,C,G,C,U,C,G,C,c,C,G,C,S,C,G,C,W,C,G,C,a,C,G,C,S,C,G,C,Y,C,G,C,Y,C,G,C,Y,C,G,C,K,C,G,C,c,C,G,C,iB,C,G,C,a,C,G,C,M,C,G,C,Q,C,G,C,M,C,G,C,O,C,G,C,c,C,G,C,c,C,G,C,gB,C,G,C,U,C,G,C,U,C,G,C,Y,C,G,C,c,C,G,C,O,C,G,C,I,C,G,C,a,C,G,C,c,C,G,C,oB,C,G,C,S,C,C,I,C,kB,C,C,E,C,yB,C,E,C,qB,C,E,C,iB,C,E,C,kB,C,G,C,yB,C,E,C,c,C,G,C,oB,C,E,C,gB,C,G,C,0B,C,E,C,kB,C,E,C,yB,C,E,C,sB,C,E,C,Y,C,E,C,qB,C,E,C,a,C,E,C,oB,C,E,C,e,C,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A,E,mB,uB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,O,C,C,A,E,iB,qB,A,A,C,C,C,C;A,G,C,E,C;A,C,C,CAuDAA,YAOE,cACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAUAC,kBAiCE,+BAEF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAWAC;;0BAKMC;kCAKO;UAEW;UACD;;SAGjB;gBASM,KAAA,+CAIQC;WAEhB,WAGF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CA2BAC;;WACqD;GAEnD;MAAwBC,sBAAF,AAAJ;GACP,MAAGA,MACV,SAEJ,AACA,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC;EACcC;WACO;;;EAEF;8BAAjB;MAAOF,MACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQAG;EACcD;WACO;;;EAEY;8BAE/B;MAFqBF,SAGvB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CA2DEI,cAAwB,aAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEjDL,YAAiB,MAAGM,SAA+B,A,C;A,E,C,CAEnDC,YAAkB,MAAGD,SAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEpDE,mBACQ,KAAA,OAEFC,QACAA,QACAA,eACN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAC,YAAqB,gBChEPC,cDgE8B,A,C;A,K,C,I,C;A,G,C,4I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAU5CJ,YAAkB,iBAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAIrDP,YAAiB,uBAA2C,A,C;A,G,CAE5DU,YAAqB,YAAO,A,C;A,O,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CAa5BL,cAAwB,eAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGjDE,YAAkB,aAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAE3BP,YAAiB,SAAI,A,C;A,G,CAErBU,YAAqB,YAAO,A,C,C;A,E,C,C;A,G,C,K,C;A,G,CAwC5BV,YAAiB,SAAI,A,C;A,G,CAErBU,YAAqB,YAAW,A,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,K,C,C;A,C,C,C;A,G,C,U,C;A,C,C,CEnRhC,uCAJU;UAOV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAWA,mBAEY,KAAa,EAAEE;yBApBjB;gBAyBV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA,yCA3BU,iBA6BRC;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAaAR;yBA3CU,cA6CR;QAAkB,EAAE,gBACN,KAAR,sBAEF;SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYAS,cACE,kCACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMA,mBACE;MAAA,QAAA,OACE,SADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,YACEF,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,cACE,MAAOC,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC,cACE,uCACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAP;EACsB;;mBACpB;QAAkB,EAAE,oBACL;uBAAbQ;OACF,AACA,iBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAUAD,cACE,MC6xBO,qBD5xBT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA0BAE,uDACE;MAAO,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC;GAGY,KAAa,EAAEL,cACjB,KAAA,SAA+BA;aAG/BA;;GAGE,KAAe,EAAEA,cACjB,KAAA,SAAiCA,oBAGzB,2BAClB;sCAEF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAE,gBC0xBEI,WDzxBA;MC2xBO,kBD1xBT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CAEAF,eACa,AAAPJ,WAAY,MAAO;mCAEzB,A,C;A,G,CAEAI,kBACMJ;GAAO,IAAK,MAAO,GAAY;mCAErC,A,C;A,E,C,CAQA;yBAlLU;EAoLa;;GACX,UAAa,cACf,KAAA;;GAEA,UAAe,cACf,KAAA;oCAERO;aAI0B;oCAC1B;UAA6B,GAAO,MACtC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,+CAzMU,iBA2MRN;gBACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAYAR,cAA4B,MAAGQ,WAAoC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMnE,yCA9NU,YE9CRO;SAAuB,AAATC,cF+QhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAMArB,gBACE,MCosBOmB,YAAoCJ,UDnsB7C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAf,gBACE,MCqsBOmB,UADgC,AAAZJ,YDnsB7B,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAV,mBACE;QAAkB,EAAEO,gBACN,KAAR,QAAkB,QACxB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAP,YAAiB,MAAGO,cAAW,A,C;A,G,CAE/BP,YAAoB,MAAG,AAFHO,cAEW,A,C;A,E,C,CAE/BL,YAAkB,MAAGM,iBAAwD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAE7EI;KAEI;;mBAEA;UAEJ,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,CAIAK,YAAyB,uBCjCaC,8BDiCe,A,C;A,G,CAErDvB,YAAiB,MAAGM,SAA+B,A,C;A,E,CAEnDN,YAAe,gBAAoC,A,C;A,E,CAEnD;GAEgB;yBAxQN;WA2QV,A,C;A,C,C,CAEAgB;GAEY,GAAGJ,UAAgB,SAAW,KAAA,OACxC;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,2CAzRU;;GA4RE,GAAGA,UAAgB;OAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,O,C,I,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAvVAY;2CAGkC,SACxB,KAAA;;mBAER;SACF,A,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C,C;A,C,C,C;A,G,C,S,C;A,E,C,CGVAxB;;GAEW,IACP;QACc,IACd;2BAGqByB;GACfC,gBAA2B;GAC3BA,YAAY,QAChB;SAEF,8BAEID,YACF,QAEF;cAEA,SAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEApB,YAAoB,aAA4B,AAAR,MAAmB,IAAG,A,C;A,G,CAE9DA,YAAe,gBAAgC,A,C;A,G,CAO/CA,YAAkB,mBAAmC,A,C;A,E,C,CAErDsB,cAGE,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASA3B;GACW,gBAAsB,cAC7B;kBA0B8B,8BAvB9B;gBAGI,KAAA,WACR,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKAA,YAAY,MAAG4B,SAAAA,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMtCC,eACW,IACP;KAEA,qBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAmBAtB;GAG2C,UACjC,KAAA;;UAGSmB,YAAY,WAC7B;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA8BAnB,iBAEY,KAAa,UAAY,KAAA,QACnC;qBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAA,4BAEI;KAEA,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAP,YAAiB,oBAAoC,A,C;A,C,C,CAErD2B,YAAiB,SAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE1CA,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA;;;SAImB;GACN,IAAK;GACU,IACxB,MAAc;KAEd,MAAc,KAElB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAIAA,uCAE6C,OAAe,OACxD;6CAEA;MAYK,eAVT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA,cACE,sBAEM,aACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAYAA,iBAE4B,0BAC1B;uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA,cAGE,uBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA;GAG4B;GAKE;OAMwB;WAVpD,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA;GAC8B;OAMwB;WANpD,SAOF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAmBAA,2DAEE;gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAOAA,0CAC2B,KAAA,OACzB;gBACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAtB,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,M,C,I,C;A,M,C,C,G,C,S,C,C,C;A,E,C,C;A,G,C,Q,C;A,G,CA4EAK,YAAqB,YAAM,A,C;A,S,C,I,C;A,M,C,I,C;A,M,C,I,C,C;A,E,C,C;A,G,C,W,C;A,G,CAO3BA,YAAqB,YAAS,A,C;A,S,C,I,C;A,M,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,K,C,C;A,C,C,C;A,G,C,Y,C;A,C,C,CC1X9BV,6DAC2B,KAAA;GACf,SAAW,KAAA;GACX,GAAGY,cAAc,KAAA,OAC3B;uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAE,cAEE,MAAOgB,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC;GACY,KAAa,EAAEC,cACjB,KAAA,SAA+BA;EAE3B;EAAcA;GAAF,AAAd,MAA+B,MAEzC;QAAkB,WACY;GAjBpB,SAAW;GACX,UAAiB;;GAAjB,UAAiB;GAgBQ,oBAC/B,OAEJ,AACA,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,C,C,CAEAzB,0CAC8B,KAAA,OAC5B;WACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAF;EAEoB4B;EACArB;GAAF,IAAU,QAC1B;WAAgBsB,UAAiB,KACnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA3B,gBAEE,MAAO4B,aACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAiBAlB,cAGI,kBAOJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAZ;GAEyB,EAAE,cACjB,KAAA,SAA+B;0BAKhB,EADH4B;GAEL,EAAErB,SAAQ,QACvB;4BAEF,MAA0C,AAAnCwB,mBACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA7B;+CC27BQ;aDz7B2BK;+CCy7B3B;;GDv7BS,cAAY,KAAA;GACZ,cAAkB,KAAA;GACpB,OAAEA,eAAc,KAAA,OAC7B;wBACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAL,YACE,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAmEAA,yBAKE;MAAoB,aAAF,SAtKR,UAAiB;;mBA0KrB8B;WAKN,SAC+B,QAK/B;kBAC0C;GAvLhC,SAAW;GACX,UAAiB;;mBAyLrBA,oBAKN,gBACgD,QAChD;wBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMArC;;GAGY,KAAa,EAAE,cACjB,KAAA,SAA+B;uBAGrC;;+CEjBGsC,SFsBH;kBE5EkCC,WF8EpC,MAAyB,aAAH,YACe,AAA/BH,kBAAwC,QAC9C,AACA;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEApC;EAGYY;0BAQIqB;;EAAe;GAAF,AAAf,QACY,GAEtB;;GAEF;;KAAsB;GACe,AAA/BG,kBAAwC,aAC9C,AACA,SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/B;GAEmC,EAAE,cAC3B,KAAA,SAAoC,UAE5C;MAAOmC,aACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,E,C,C,C,C,C;A,G,CAEAnC,YAAiB,MAAGO,cAAW,A,C;A,G,CAE/BP,YAAoB,MAAG,AAFHO,cAEW,A,C;A,E,C,CAE/BZ;;;eAEE;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAO,YAAkB,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAQzBP,qBAIE;MAAoBY,iBAAF,WACE,UAAQ;EACR,UAAQ,GAAuB,AAAA,CAAR;QAE3C,EACkB,UAAQ,GAAuB,AAAA,CAAR;QAEzC;MAAkB,WAAQ,GAAuB,AAAA,CAAR,kBAC3C,A,C;A,G,CAEAF,YAAqB,YAAS,A,C;A,E,CAE9BV,YAAe,gBAA+B,A,C;A,C,C,CAE9CO;GAEY,GAAGK,UAAgB,SAAW,KAAA,OACxC;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,S,C,I,C;A,M,C,C,E,C,CA/KA6B,eAGe,iFAUP;QAEA,mNAuBF;QAEA,UAEN,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C,A,E,mB,uB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CGnJFC,oBACeC,SACbC,AAAAA;wBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAcA;;;;GAIMA,yBAAuB;;EA8KZA,IAAAA;KAA0B;EAGE;EAGhB;;2BAQQ,aAML,0BAiF5BC;QACAC;SAlRFF;qBAMAA;;;EAEIG;KACFC;OACSD;KACTC;KAEAA,UAEFJ,AAAAA,yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6ZEH;GAEoB,QAChB;mEAEmB,MAAOQ;yDACF,qBAC1B;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAMAR;;;gBAa6B,KAAA;GAaf,QAAS;;GAOT,QAAS;KAEf,KAAA,0CACR,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAaAA;EACYS;;OACFC,8BAEJP,oBAAgCO;EACVA;UAEhBP;EAEKO;EACGD,KAAoBC;EACjBA;EACHD,KAAoBC;;EA5UzBP,IAAAA;KAA0B;EAGE;EAGhB;;2BAQQ,aAML,0BAiF5BC;QACAC;SC0NwBM,AD/LxBC,AA6MIT;2EASAA;qBACAA,AAAAA;;;qBAGaO;EAAqBA;EACrBA;EAAaA;EACbA;EAAmBA;;;;;EAqLrBP,IAAAA;KAA0B,GAEzCU;eACAV,AAAAA;;cACuCW,KFm6BlCC,yCE55BUD,uBAEJA,yCF05BwB;;iBEvlCtB,AAFOJ,oBAGdA,KAAAA,cAAiBA,aAEnBP,AAAAA;;;YAGAA,AAAAA,yBAA6BU;aAE7BV,AAAAA;;;UAGAa,KAAKN;;eAGDP,4BACFA;EACIW,KFukCLC,iCAA8B,gCExkC7BZ;;yBAGAc,KAAMP;;iBAIFA,KAAAA;UAEZ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGAV;GACMG,4BACFA;EACIW,KFyjCDC,+BAA8B,gCE1jCjCZ;;4DAGA;;KAGQ,KAAA,UAGZ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA0VFW;GA9yByBI,kDAk0BKC;mBAlB1B;MAAO,oCA8CeA;mBA5CtB;MAAO,UAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAV,eAvzByBS,yBAyzBrB,MAAO;KAGP,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAkMElB,YACE,+EACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6FAA,YACE,+EACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAxrCmB,WAAKM,kBAAW,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEhB,WAAKA,uBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,4C,C;A,E,CA8GzCc;;;gBAeEC;;QAFoC,SAIgB;SADpDH;SAEAI;WAAsC,EAhBtCC;iBA4KkC,kBA3KlCC;QAAW,8BACXC;QAAW;GACPJ,0BACFK;;;;yCAGJ,A,C,C;A,E,C,C;A,G,C,mC,C;A,E,C,CAoEA,iBACsB,CAAA,AAAhBC,eAAqC;GACrCC,AAAAA,gBAA2B,CAACC,QAC9BA,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;GACM,CAACA,QAAU;EACfD,OAAAA;;GEunCkBE,UFrnChB,MAAMC,UP+DU5D,SAEG,sBOjEb4D;EACkBA;EA+F1BnB,AA9FIT;EC4RK6B;EAAcC;EAAAA;EAAH,CAAA,AAAL,IAAsB,QAArCD;;mBAAuBC,SACvBA;;OACaC,KAAOC,MACpBC;KAAkB,AAAlBA,OD9RE,AACAP,YAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA9D;EACYoC,mBACVA;;EAauBkC;;MATZC,mBAETnC;GACQ,UAMakC,QAJvB,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMA;OACUE,sBAEJC,QAASD,SAAYA;;aAGrBE,QAAYF;;QAGZtB,iCAEN,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAyB,YAAsC,MAAGC,AAAAA,gBAAa,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEtD,oBACMA;GAAAA,aACI,KAAA,sDAERA;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBAC,iBAE0BC;GADY,AAAnB,AE8LDf,AF9LZa,WE+iCYb,AF/iCG1B,aACjBD,AAAAA;KAEAA,AAAAA,4BAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CAyBA2C;EACMlC;EC8CcoB;OAASE,KD9CP,MCkMpBE;KAAkB,AAAlBA;EACWH;;cAAAA;EAAAA,IACXA;SACAD;KAAoB,CAAA,AAAL,IAAsB,QDpMrC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAmBApE;EACgBmF;eAjBe,AAAzB5C,2BACGA,AAAAA,uBAAkCA,AAAAA,yBAClCA,0BEyJW2B,AFxJX3B,AAAAA,mCAQC;;GApKJkB,WEoTcS,AFnTXN,aACAD,AAAAA,eACLG;EAAwBZ,KFi8CrBC,yBAA8B,gCEj8CjCW;;oBA2KA,SAEFsB,MACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMA,cACmB,aAMfC;KAGA,KAAOC,YAAiB,CAE5B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKA;GACM,AAAC/C,yBACHgD;SAGEA,qBADF;;;EAGEhD;EAAqCW,KFovCpCC,kDAA8B,gCEpvC/BZ;;qBAIN,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAzBI,cACM,CAAC+C,YAAgB,MGnUzB;gBHqUE,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,C,CAiCJ,cACMhD,AAAAA,eACFA,AAAAA,AAAAA,wBACA;OAEFA,KAAAA,QAAakD,SACf,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,M,C,CAoHiD;;;;EAzgBdjD;EA6qBJkD,IF/Q7BC;KAAwB,YACxBC;KAAsB,YEgRtBC;gCACcH,KAmMqBlD,AAAAA,wBAlMrBkD;GACV,YACFI;;EACSA;KACTA;OACSA;KACTA;KAEAA,aA9KE,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,E,C,CAmPN;;EAEwCC;EAAtBvD,AAAAA;WACK;EACjBwD;GAAAA,QAAwB;EASwB,AAA5BxD,2BACc,AAA/BA,AAAAA;;SAGCW;GAEJZ,aACFA,SACA;SAEFC;mBC1RwBQ,AD/LxBC;4CAieF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEAhD;;QAA4B;iDACV,KAAb+F,QAAgBnE,MAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAExCjC,YAAiB,MAAGoG,MAAAA,SAAgB,A,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAbS;EACpCA;GAAD,CAACA;IAEKlD,UAERkD,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,C,CAkBF;EACwB7C,KFq0BjBC,+CAA8B;GEh0B/BZ,0BAGFA,AAAAA;2BAG2BA,AAAAA,wBAAsByD;GACrC,0BAIhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEAhG;;QACE;iDACe,KAAVgG,QAAapE,OACF,KAAXkE,QAAclE,OACC,KAAfqE,QAAkBrE,MACzB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAEoB,KAAVqG;EAA+B,KAAXF;EAAmBG;6BAAAA,OAA/C;MAA6C,CAAA,AAApB,WAC3B,A,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA2BA;GACMC,QAAW,MACfA;UACAC;;EACA5D;EAAuC6D,OA5jBvCrB,AAAAA;YACAvC,AAAAA;YACAwC;OA2jBF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,iBACMkB,QAAW,MACfC;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAmEAE,yBAC8B,kBAaR9D,oBAChB+D,KAAiBA,KAAAA;aAbK,kBAiBNA,KAAgBA,KAAiBA;6CAfvD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,yBAEI,oBAAsBC;kDAG1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAiBAH,yBAC8B,gBAaCC,KAAmBA;aAZtB,gBAiBtBA,KAAiCA,KAAjBA;6CAftB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,yBAEI,gBAAoCC;kDAGxC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAcAC;;EACkB/F;EACAA;EACIA;GAGN,OAAG6B,wBACDA,AAAAA;WACO;EACHD;WACO,MACzB;0BAEA,uBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAoE,YACE,gBAAoChG,WACtC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,C,C,CAOAiG,cACE,6CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAGA,gBACEC,AAAAA;wCAEF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,YAEEA,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA,oBACE;MAAyBA,AAAAA,mBAAiB,WACrBA;qBAAAA,SAAAA;8CACrB,AACAA,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CAoCAD,cAAuB,OAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAC9B,iBAAyC,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEzC,aAAe,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CACf,WAAA,OAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAWjBE;GACMC,QAAgB,MAAOC,WAC3BxD,AAAAA;;;MAGWyD,mBAETzD,AAAAA,aAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAyD;2EAGsB,MAAOD;;uEACZ,MAAOE;4CACR,MAAOC;4CACF,MAAOb;4CACL,MAAOE,WAG5B;MAAOY,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQAA,gFAGA,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAWAJ,YAAkB,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEtBnG;EACc2C,AAAAA;GACH,QAAS;;EAER7C;6BAAAA;;mBAIV6C,AAAAA;gBACA;mBAAkB,WACNyD,QAAUtG;uBAApB0G;OACF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC;;EACa9D,AAAAA;;GACF,QAAS;EAGX;KACPA,AAAAA;gBACA3D;wBAGA;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAyG,YAA0B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3DE,YAA8B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CARjD,0BACVa;cAAKJ,QAAkBA,SACzB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAaFD,YAAkB,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEtBE;EACe1D,AAAAA;GACF,QAAS;EAEX+D,OAAAA;QAAc,GACvB/D,AAAAA;gBAGA;gBAFcgE,YAGhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAL;EACe3D,AAAAA;GACF,QAAS;EAEX+D,OAAAA;QAAc,GACvB/D,AAAAA;gBAIA;eAHWgE,QAAe3H,KAAAA,WACb2H,QAAe3H,KAAAA,YAG9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA2H;;EACY7G;IAGG;;6BAHHA;GAIV;KAAkB,WACJsG,QAAUtG;8BAAtB8G;OACF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAnB,YAA0B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3DE,YAA8B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAa/DkB,eACMX,QAAgB,QAEpBY;QAAgB,8BAChB;MAAOC,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAA;2EACsB;;OAEZnB,sBAWCA,QAVK;MAWDkB,AAAAA;WAVE,MAAOE;UACR,MAAOC;eACF,MAAOC;iBACL,MAAOC;QACjB,MAAOC,aAEpB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CASApH;;EACW4F;EAEOA,QAChBkB,AAAAA;;;EACUO;6BAAAA;GACV;KAAkB,QAChBA,QAAcN,QAAmBM,UACnC,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAZ;EACe;;EACJb,QACTkB,AAAAA;;EACYlB;EACEA;;EACJ0B;6BAAAA;;GAEV;KAAkB,QAGhBV,MAFUG,QAAmBO,UACjBP,QAAmBQ,UAEjC,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAMAH,sDAGA,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CA8DA;;GAqBoD,uBAnB5CI,aACI,KAAA;EAEJC;WAAiB;EACrB9F,mBAAAA;KAA0C,AAA1CA;GACI+F;uBAKJD;uBAEM,KAAA,2BAEV,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAtEAE;oCAE2ChG;;MASvC8F;EAQA9F;EACIA,mBCjzBkBQ,AD/LxBC;+CAi/BEoF;;GAsDgD,sBA7ChD7F,mBAAAA;KAA0C,AAA1CA,MACA8F;qBAEaG,sCAIP,KAAA,+BAEV,A,C;A,M,C,C,E,CAvCAD;;SAuCA,A,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAnCI,WACEF,cACAI;gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAiBA,WACEJ;MACA9F,mBAAAA;KAA0C,AAA1CA,MACAkG;gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CA+DJ9I;EAIayG;;EACE;EAAc;6BAAA;EAAR;EACW,AAAhB,CAAN,AAAA,SAAc,AAAA;EAEJ,AAAL,CADR,CAAA,EAAQ;EAGQ,AAAR,CADR,CAAA,EAAQ,2BAGb;MADK,CAAA,EAAQ,YAEf,A,C;A,C,C,CAEApG;;YAC8B;;+CAEToG;EAAKxE,IAAtB;6BAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C,A,E,c,kB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CF33CF5B;GACa;GAEE,QAAS,iBAEtB;gDACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,C,C,CAEAE;uBACuB;2BAET,MAER,0BAGF;eAEA;gBAEA;EAEQwI;4BACgB,KAAA,OAC1B;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAoBA,iBACQ,KAAA,sGAER,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAqWEtG;;kBAME,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAIAA,iBACQ,KAAA,SACR,A,C,Q,C,I,C,C,C,C,C,E,C,E,C,C,C,C,C;A,E,C,CAEAA;;;;eAec;;GACY,AAAhBuG,WAEF;;GAEsB,AAApBA,WAEF,qBAEF;MAAOC;GAIC,KAAa,UACf,KAAA;GAEE;EAC+B,AAApBD;KAEjB;KAEQ;EAAQA;QAMN,MAImB,AAAR,OAOa,AAAL,AAAR;;EAEDA;;GACpB;YAAoBE;6BAAAA;KAAF,UACIA;;GACS,AAAzBA,WACF,MAAOD,iBAEX,cAIa,MAAOA,YAC1B;qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAxG;;;GASM,kFAIF,MAAOwG;;eAIOE;qCAEZ,QAEF;MAAOF,aAET,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAxG;OACwC9C;;;GAWxByJ,gBACLA;EAEeC,OAAxB;cAnBoBC,eAoBtB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA7G,YAEE,sBADc8G,YAEhB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAwDA9G;EAGY+G,QACV;MAEU,gBAFQ;OAMK;EAAY;oDAInC,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA/G;;;aJ3WsClB;8BI6WpC;KAAA,UJ3WekI;+CI4WQ,KAAA;GACf,SACJpI;QACW,YACXA,OAAa,OAA0B,AAAP,QAAX,kBACrBA;OAAa,OAAK,mBAEZ,KAAA,QAEV,AACA,MAAOqI,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAjH,mBACE;sBJ5XoClB,8BI4XpC,UJ1XekI;+CI2XQ,KAAA;GACf,SAAW,KAAA;GACX,QAAU,MAAOE,SACzB,AACA,MAAOD,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6CAjH;;;;;;;EAWsB;;aAUV,qBACA;;GAGA,UAAc;;qBAAO;mBAC/B,SACF,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAaAA,+CAGOmH,KAEL;cACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA+DAnH,+GAIE;YACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;OAKA,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;;;;;GAO0B,aACR,EAAGoH,QACjBC;;GAIiB,SAAW,CAACC,SAC7BA,uBAUF;MAAOC,mDAOT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAvH;;GAGqB,SAAW,CAACsH,YAGXpK;WAIhB,MAAOsK;EAGa;YACF,CAACC,KACnB,MAAOD;EAKe;EAKpBC;GAA4B,IAAGL,SACjC,MAAOI;EAGc,8BACvB;MAAoBC,OA9gB4BC,SA8gB9B,WACyB,GAGzCC;8CADgBF,YAElB,MAEAH;;OASE,MAAOE,YAGTJ;OAA2BO,SAC3B;;EAOc,EAAGP,QACjBC;;;WAUA,MACIG,YAKN;oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAxH,2BAG8C;YACH;eACG;YACH;aACC;aACA;aACA,WAC1C;0BACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAgBAA;UAOE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,C,C,CAcF4H,iBACQ,KAAA,QACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CASAC,yBACwBV;0CACHS;KACb,KAAA,QACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,C,C,CA6CAE;;;;;8BAoBE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAC,WAGE,MAAOC,0BACT,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAQAC;;;;;;QAEA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAgZAC;;WAgBkB;uBAC6B;wBAG3C,MAAOC;QACE,kBACT;;;EAgByB;IACa,AAAP,4CAO3B,MAAOA,UACH;4CAGJ;MAAOA;;;;;;;;;;;EAiCEC;GAA8B,QACzC,MAAOD,UAAe;OACJE;GAAoC,wBAMtD;MAAOF,UAAe,kBACJG;cACAC;cACAC;cACAC;cACAC;cACAH;cACAI;cACAC;EAA8C;6BAChE;MAAOT,qDAMT;MAAOA,2EM9kDyC,6BNolD9C,iBAMF;MAAOA,2IAQL,iBAOJ;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAwBA5K,2CAEI,MAAOsL;KAEP,MAAOhL,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAUAkD;UAKE;QAAa,WAC4B;EACE,GACzCqE;iBACF,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA0D;GAOwB,SACpB,MAAOC;QACoB,SAC3B,MAAOA;QACoB,SAC3B,MAAOA;QACoB,SAC3B,MAAOA;QACoB,SAC3B,MAAOA;UAED,KAAA,6DAGV,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMA3C;WACuB;;OAEa;wJElqDCjG;aFqrDnC;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA+CEH;;;;;EAmBqByH,AAFG;;;;;eA0CTuB;KAAe;;;;EAUxB;;EAKWC;;;;;;MA6Bf;MAAoBC,aAAF,WACLA;;GAEM,eAEMD;QAEzB,YAIA;SACF,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAjJ;iBAII;OAQA;OAQA;OAQA;OAQA;OAQA;QAQA,iFAQJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAIAA;KACqB,MAAOmJ;;uCAGxB,MAAOC;;cAgNcC,YAArBC;;MA1M6DN;KAAe,SAJ5E;iDAOW,MAAkB;;;cAuMRK,YAArBC;;MA7LSN;KAAe,SALxB;8CASA,MAAOI,WAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApJ;;;sBAOU,KAAA;OAEN;OAQA;OAQA;OAQA;OAQA;OAQA;QAQA,mIAUJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;;;uCAKI,MAAOuJ;oCAGkBC,2BACHA;MACTR;KAAe,SAH5B;sCAIW,KAAiB,wDAIlB;4CAKWQ,2BACHA;MACTR;KAAe,SANxB;yCASA,MAAOO,aAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAMFE;mBAME;MAAOC,qBAOT,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAoRA;KAIQ,KAAA,KAFc7L,QACE8L,SAAsBA,WAE9C,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA0CAC;kCAGgC1M;;KAC5B,QAEF2M;UACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA+LA,iBACQ,KAAA,kDAER,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6KAC,gBAGE,4BAKF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAC;YL19EsB5L,aK69ElB,kBAEF;0BACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAUA4L,WAAoC,YAA6B,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CNlwFjE9L,YAAoC,wBAAqB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6CzD+L,iBAGa,4BACX;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMApD,uBACsB,MACpB;0BACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAKAqD,cAGE,MAAOC,sBAAyBtD,SAClC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOAuD,sBACkBF,SAChB;yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGAG,oBACYxD,OACV;yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAmCA9I,yBAEI;6DAGA,wBAjBQ+I;6BAoBR;0DAGE,MAAOwD;KAEP,MAAOC;KAIT,OAEJ,A,C,uB,C,I,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOAxM;WAEqB;EAIG,QACtB;kBAAmC;KamEjCyM,KAA6CA;;Gb5DhC;EAGAC;8BayDbD;KAA6CA,ObxD/C,AACA,2BACF,A,C,uB,C,I,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAKAzM,8EA3EoDZ,8BA8ElD;SAAoB2J,gCACtB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAaAqD;gCA+YuCO;;+BAAAA,eA/XrC,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAcA7M;WACsB;EACJgJ;EAKE1J;cAGM,QAGxB;MAoDOwN,MAAYR,gBAnDrB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAiEAtM;oBAE8B;UAO5B;QAAkB,WACZ,CAAC+M,gBACH,QAEJ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMAC,gBAEE,MAAOH,UADaR,WAEtB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAmBArM;WACiB;WACA;EAGLgJ;EACN1J;;wBAeJ;MAAOyN,WACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAgCA/M;SAEyB;oBAEK;mBAiOM,2CA5NE;;WAEK;kBAGvC,MAAOiN,gDAKP;;;;;EAOSL;aA2MuB,qBAtMD;cACUA;GAOtC,aAA0C,GAC7C;;mBAGF;MA1JOE,MAAYR,aA2JrB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CASAtM;oBAE8B;WAEb;WAEA;;;SAQD,IAAW,iBAEX,MAAY,QAG1B;QAAkB;;GACZ,EA1BC+M,WAAmBA,WA2BtB,SAEJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA/M;WACiB;WACA;;;GAOf;MAAoBkN,aAAF,WACLA;oCAET;;;GAIE,EAjDCH,WAAmBA,WAiDS,SACnC,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA/M;GAgIoC,eA9Hc;mBA8Hd,2BA1H9B,iBA0H8B;;GArH5B,EAjEC+M,WAAmBA,WAiEqB;;;;;;;;GAsB5B,IAEjB;GAE0C,AAAzB,IACA,IAEjB;aAII,CAACI,aAAwD;GACzD,CAACA,aAEH,cAMF,QAAW;;GACL,EA5GDJ,WAAmBA,WA8GpB,SAEJ,AAKA,YAAY;;GACN,EAtHDA,WAAmBA,WAwHpB,SAEJ,AAIA,QAAY;;GACN,EA/HDA,WAAmBA,WAiIpB,SAEJ,CAOF,MAAOK,uBACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAhB,gBAGE,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CY3jBAlM,sBAOE;uDACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,C,CAEAP,YAAoC,MAAGM,SAAiC,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAKxE,+GAOA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA2EAP;EAEe2N;;GAKF,+HAAS;;GAEJ,QAAS;;cAMjBC;GACE;GAGK,+HAAS;;GAEJ,QAAS;wCAc3B;;;cAQSC;;sHAET;gCAKA;uBAIuBA;6IAAvB;sBAIA,MAAOC;gBAKD,KAAA;8BAMiBD;6IAAvB;gBAEA,MAAOC,WAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAYAA;;EAEejO;sHAEb;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C,C,C,C;A,E,C,CAGAgO,YAGE,MAAOhO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEAkO;2BAII,MAPKlO;KASL,MAAOA,qBAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,E,C,CAiBA,wBACsC,MACpCmO;OACAC;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAEA,4BAEEC;wBACAC;wBAEAC;;;;qCAUE;QAAkB,EAAEC,gBACRA;EACEC;GACF,WAEKP;GACF,gIAIf,CAKF,QAAkB,EAAEM;;EAIsB;EACP;EACJ;EACI;EACK,UAExC,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAsCA;;EAoBUE,UAJAA,UAFAA,UADAA,UADAA,UADAA,UAHAA;;;wBA0BJ,QAAkB;kCAKlB;;mBAQJZ;gBACAC;gBAEAU;iBAEF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAEAC,cAEE,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CE7YArN;;EAIesN;EACOC,QAEpB;eACiBD;eAIf1G;;EACwB;;aAItB,MAIJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEArF;uBAEI,MAA2C,AAApCoH;;+CAEeA;EP+BU6E,IO/BhC;sBAGA,MAAOxM,MAAAA,OADM2H,gBAGjB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAzH;2CAKQ;OAEsB;EACTyH,QACb/B;OACA;QAAkB,WACH+B;ED2K0BoD,MAA7CA;MAAAA;SCzKI,AACA,MDmLqBA,WC7KvB;;+CPlFe0B;aOsFjB;;wDAMJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,G,C,C;A,G,C,I,C;A,G,CCtGErO,YAAiB,MAAU,MAAPO,iBAAW,A,C;A,G,CAE/BP,YAAoB,MAAG,CAFI,KAAPO,iBAEW,A,C;A,E,C,CAE/BL,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAE3CC,gBACQ,KAAA,uCACR,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CACA,gBAAgC,MAAGA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEvDC,cAAgB,MAAGD,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CACvC,YAAa,MAAGA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CACpC,cAA6B,MAAGA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,c,C;A,E,C,CAepDvO,YACE,MAAOmI,AAAAA,uCACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAnI,mCACsB;mBACI,QACxB;MAAwByO,2BAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEAD,qCACsB;GAChB,CAACE,WAAkB,MACvB;MAAwBD,YAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cACEE,KAAAA,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAlO,YACE,2CACF,A,C;A,G,CAEAA,YACE,MAAO,MAAyBkO,kDAClC,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAzBoB,YAAU,MAAS,gBAAGR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,K,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAgB1B,YAAM,MAAGS,iBAAO,eAAS,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAQA,YAAM,MAAG,eAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CA4B1D3N,YAAyB,MAAG4N,MAAAA,AAAAA,YAAmB,A,C,C;A,E,C,C;A,G,C,qB,C;A,G,CTmC/CC;EACMC;;4CAAuB;EAEJC;GACL,WACTC;qBAAAA;EAAAA,kBAETF;SACA;SACF,A,C;A,G,CAGA/O,WAAkB,MAAGkP,aAAe,A,C;A,G,CACpClP,WAAkB,MAAGkP,aAAe,A,C;A,G,CAGpCtO;GAJqBsO,YAKL;EAEVC;EAAkB,AAAlBA,SAAoBC,AAAAA;SACA;IAExB;QAA2B,8BAHvBD,SAIFzO;OAASyO,MACX;iBACA;SACF,A,C;A,G,CAEA9H;GAd6B,AAAN6H,YAgBL,YA8/CX/L,QAA8B;EA7/CViM;EAAAA;EACMD;EAAkB,AAAlBA;SACF,YA2/CxBhM,QAA8B;EA1/CzB,8BACV;QAAkB,8BAJOiM;EAKgBA;EACC;0BALXD,SAI7BvP;kBACIuP,MACN,AACA,SACF,A,C;A,E,C,CAEAE;EACoB/P;EAEPgQ;EAO2C;;;;;2BUlHhBC,KV8HSC;;cAG7BlQ;;GAEH;;4BAUT,uBACFmQ,KU9IkCF,KV8IqBC;KAGvD,gBAsEO;KAnEP,8BAMF,mBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,M,C,C,G,C,U,C,C,C;A,E,C,C;A,G,C,iB,C;A,G,CAoCAxP,WAAwB,SAAQ,A,C;A,E,C,CAIhC6M;GAEM,CAAC6C,mEACoC;cAE3B;;EACRC;EAAkB;IAExB,MAAkCC,oBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAaA/C;EAIMhD;EAAAA;EAA4B,EAAEA;GAC9B,CAAC6F,oEAEuBjG;GAGE,MACZ,sBAGF;EACYA,uBAGd;;EACRkG;EAAkB;EACmB,AAAjBlG;OAEtBI,MACuB,SACnB,KAAA,wCACiCA,kBAC1BJ;QACkB,SACzB,KAAA,wCACiCI;QAER,SACzB,KAAA,wCACiCA,8CAGzC;QAAsC,QACpCJ,uBAA0BI,WAC5B,AACA;MAAkC+F,oBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,G,CAUA5P,WAAwB,SAAO,A,C;A,E,C,CAE/B6M,oBACkBgD,OAChB;MAAOtG,qBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CAwEA5J,oBACkBmQ;GAAF,IAA0B,MACxC;MAAiChG,gBAEnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAiG;EACyCC;sBACrC;uCAGAC;eAEA;wCAGM,KAAA,kCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA/P,WAA0B,MAAsC0P,yBAAW,A,C;A,M,C,C,G,C,a,C,E,CArD3EzO;;WAEoB;;;;;MAclB;qBAR0C,iBAKgB,eAM5D,A,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAge2B;kBAErB+O;cACAzG;;IACa,MACf,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmDuB;GACjBM,QACFA;iBAKJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,qB,C;A,E,C,CAgTJoG;aAE+BC;WACV;;EAEfjB;GAAW;EAGXkB;GAAe;EAGfC;GAAM;EAGNC;GAAQ;EAGRC;GAAU,wBAId;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,M,C,C,G,C,+B,C,E,C,CAsBApO;;;;;;;;6BA4CE;+OAMF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAMAA,YAmDE;;;;;;;KACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAkCAA,YASE;;;;;;KACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAsCAlC,kBACMqQ;WAAiB,wBAAoBE,QACzC;sDACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CAaAvQ;EACMqQ;WAAiB,gCAA4BE;EAC7CD;WACF,uDAAoDC,YAEtD;oEACOA,aACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAZAC;;;;uBAGuE,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAiBvExQ,kBAAqBuQ,OAAH;MAAGA,iCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAepElG;6FAOE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CAuIArK;EACMyQ;GAAO,QAAS;EAGoBC;;cAGjCD;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAwCqC,WAAG,MAAGE,iBAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEd,WAAG,MAAGA,uBAAY,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAElB,WAAG,MAAGA,8BAAkB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,M,C,CAExB,WAAG,MAAGA,yCAAwB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,M,C,CAE9B,WAAG,MAAGA,iDAA8B,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAuYzE3Q,YAAkB,gBAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,C,C,C;A,G,C,mB,C;A,C,C,CA0C9BF;;YAC8B;;0CACA,QAC5B;MACI8Q,WAAOlP,MACPmP,UAASnP,MACT4O,UAAW5O,KACjB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAEM6Q;aAGiBvQ,KAA0B6Q;OACA,oBAG1BN,QAIAvQ,OAErB;MAAwB,QAAEA,KAA0B8Q,UACtD,A,C;A,I,C,I,C;A,M,C,C,G,C,O,C,E,C,CAGA3O,YAAoC,MAAGyO,SAAa,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAKpDzO,YAAwC,MAAGyO,MAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAM5DzO;cAEyBqJ,YAArBC;OAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,E,C,CAIAtJ;cAE6BqJ,gBAAzBuF;OAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,E,C,CAGA5O;;;;GAIE;MAAoB8K,aAAF,WACLA;YAET,SAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C,C;A,E,C,C;A,G,C,M,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CA0YAhN,YAAkB,MAAGyE,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CAJ5BsM,qGAEkD,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAiDlD/Q,YAAkB,2BAAmByE,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAD7CuM,+BAA0B,A,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CA4B1BlR,kBAC2BmR,UACzB;kBAEMlE,OAAsCmE,WAC9C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAwCAD,kBACoB7R,MAClB;4CAGF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA8R;;EAzDmBC;;;sDAgEVA;EAGHC;GAAe,SAAW,AL13EZ/Q,oBK43EbgR;EAGDC;GAAuB,SAAW,AL/3EpBjR,mBKi4EbgR;EAGDE;GAAgB;EAEPC,OACX;MAAoBxJ,aAAF,WACLA;KACDkC,UAEZ,UAKF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAWAlK;EAGMoR;GAAe,QACjB,MAAoBA,wBAAF,gBACGA;;UAIrB;OAEEE;GAAuB,SAAW,ALv6EpBjR,gBK06ET,GAFgB,aAGvB;MAAoBiR,kBAAF,gBACGA;;UAIrB,cAESC;GAAgB,WAGlB,GAFgB;EAGZC,OACX;MAAoBxJ,kBAAF,gBACLA;;OAEDkC,iBAGZ,QAKF,MADO,gBAAUiH,UAEnB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,I,C,E,C,CAhDAjP;;IAGE;MAAoB1B,aAAF,eACYA,AAAAA,UAC9B,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA2EAR,YAAkB,gBAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAE9BkR,WAAQ,OAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAoEfA;EACyCrI;;2CAEvC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA7I,YAAkB,MAAG6I,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,e,C;A,E,C,CAUzBqI;EACMO;GAAI,QAAS;EAC4C5I;;;GACzDvB,gDAGJ;MAA6BiC,0BJllFOvI,8BIklFpC,cAC8B0Q,AJjlFfxI,UIklFf,AACOuI;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAzR,YAAkB,MAAK6I,aAAOU,KAAAA,kBAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAyFrDvJ,YAAkB,gCAA4BuQ,QAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAFvDoB,+BAA6C,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CN96F7C3R;EACM4R;GAAe,QAAS;EACgCC;;aAGrDD;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAGAnS,YAAiB,MAAGoS,MAAAA,SAAkB,A,C;A,C,C,CAEtC/R;;QACE;iDAAyC,KAAV+R,QAAanQ,MAC9C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CYqWiB,YAAI,iBAAsC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEvD,cAAgB,mBAAqD,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAErE,YAAa,iBAAsC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,G,CLvYvDoQ,iBACMC;GAAoB,QAAS;EAoBc7D;EAnBlB8D,2CAAtBD;SAAP;SAIF,A,C;A,G,CAEAD,iBACMG;GAAsB,QAAS;EAYY/D;EANhB8D,iDAAxBC;SAAP;SAIF,A,C;A,E,C,CA+BAzQ;;EAGsB0M;WAEL,MACf;MAAO,cACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEApO,oDACE;MAAgCoO,iBAClC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQA3N,cAEE,wBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAiB;EACkB0Q;;;WAGG,MACnB;MAAO,cACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA1Q;EACkB2Q;;;WAGG;EAGT1J;EAAa;;GAAK,AAAxBA,WAAiC,MACrCA;SACA;MAAO,cACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjH,mBACY,KAAa,EAAEC,aACjB,KAAA,SAA+BA,SAEvC;MAAO2Q,cACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,C,CA1EAlQ;;;;;uBAiBiD;;KAIzC,KAAA,2CAER,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,C,C,CA0EAlC,oBAD2BgC;gCAAAA,SACG;MADHA,MACkB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAV7CqQ,eAGA,A,C;A,K,C,I,C;A,M,C,C,E,CAHAA;;SAGA,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAyBAtR,YAA6B,gBAA2BuR,QAAKC,cAAQ,A,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,CAUrE/Q,WAAkB,MAAG0H,SAAQ,A,C;A,C,C,CAE7BpJ;GACMyS,cAAiB;EAEjBrJ;GAAS,WArCuBlH;;qBAAAA;EACfA,KAAAA;6BAAAA;EAAF;GADiBA,AAuC9BkH;EAIKsJ,AAAAA,WAAoBD,UAA/BrJ;;YAEEqJ,YACA;SAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,W,C;A,C,C,CO9LAvS,iBAIa,CAAA,eACH,OALe;MAOhB6B,SAP2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C,A,E,O,+B,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CGgBpCK,iBACEuQ,AC4NwB;;ED3NjBlN,KAAAA,sCAAPmN;MAEA;SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,C;A,G,C,C,mC,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CEnByBC,YAAoB,MAAGC,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,QCiEnHE,eDjE+JF,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAGjKG,YAA2B,MAAGC,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAA0CH,cAAoCG,QC8DzIF,eD9DuLE,WAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAG1LhT,WAAgB,MAAGiT,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BJ,YAAyBI,QC2DpGH,eD3D0IG,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAGlK,iBAGEC,OAAAA;WACAA;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAQAC,WAGEC,UACF,A,C;A,E,CAVAD,WAGEC,UACF,A,C,C;A,E,C,C;A,G,C,O,C;A,G,CFQA3T,WAAgB,MAAG0E,AAAAA,kCAAuC,A,C;A,G,CAE1D1E,YAAa,MAAG0E,AAAAA,+BAAoC,A,C;A,E,C,CAIpD,cACEA,AAAAA,8BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmBA,iBAzBgBA,OAqBdA;qBArBcA,0BA2BhB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAIA,sBIyRoB;+CJxRlBA,AAAAA;gDACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAgBA;EACckP,AAAAA;GACD,SAA6B,CAAA,KAAhBC,wBAEtBC;SAAAA;mBAAwBD,gBACxBC;sBAA2BD,qBAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA,kBACkB,KAAmBC,QACnCF,AAAAA;mBAA2BG,YAC7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,iB,C;A,G,C,CK7FyBxT,WAAuB,MAAGyT,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2CZ,YAAgCY,QFkErIX,eElEyLW,WAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,E,C,CAExN,iBC+q4BkCC,eA2/GhCC;gBA/EI,KAAc,KA8EcC,qBA9EW;GDjl/BvC,CAACC,UAEHC,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAIAhU,iBACgBiU,KAAAA;EF6CTjB,eElEyLW,UAApDA;;GAsB1H,YAAqB,KAtBYA,cAuB/CM,KAAAA,wBACA;SAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA;EACgBA,KAAAA;EFmCTjB,eElEyLW,UAApDA;;EAkC9HO,AAAAA;;cAAAA;EAEa,IAAMC;GACd,IACfxB,AJsMsB,qDI5OyBgB,SAwCjDS,AAAAA,AAAAA,AAAAA;cAAYF,KAxCqCP,iCA4CnD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,K,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAzC6B;GACrBI,OAEF,MAGFC;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CA8B2C;;EACvCI,IHrC0IlB;KC8DzIF,YD9DuLE;EGsCxLkB,IHnCqGjB;KC2DpGH,YD3D0IG,aGoC7I,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,gC,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,C;A,G,CEvCJnT,YAAkB,MAAGqU,SAAS,A,C;A,G,CAC9BtB,oBACgBsB,OACdA;;GADwB,WAKpBC;KAEAC,UAGN,A,C;A,E,C,CAEAvU,WACEwU,WAAW,CAfQH,QAgBnB;MAhBmBA,SAiBrB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,kB,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,C;A,E,C,CAgBA;EACEI;SAAAA;OACAC;OACAD;OAAYC,MACd,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA;EAGYD;;EAAAA;GACNE,OAYJF,OAAqB,AALSA,YAKJE;KATxBC,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAUA;;EACmBD,KAAAA;GACF,UACb;6BAFeA;GAIjB;KAAkB,WAEZA,KAAAA,KAAAA,kBACFC,QAAUD,KAAAA,YAEd,AAEAA;;EApB8BF;;EAuBP,AAvBOA,WAuB9BA;SAAsC,KACxC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C,A,E,iB,+G,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCjDF,WC0BEI,+6DACAC;ODcAC;OACF,A,C,Q,C,I,C,C,C,C,C,G,C,C,E,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CExE0BC,YAAmB,MAAGC,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAkClC,cAA4BkC,KAASC,eAA2BD,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAItK,cACEnS,AAAAA,KAL4CmS,YAM9C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAE;;ECyFqB;;;gBC5CI;;;;;;SF7CwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CGJjDC;;EF6FqB;;;gBC5CI;;;;;;;SCjDkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCEnBJ,YAAmB,MAAGK,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAkCtC,cAA4BsC,KAASH,eAA2BG,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAGtKC,cACE,MAAOC,AAAAA,MAJqCF,SAKjC,KAAPE,KALwCF,oBCukCrCG,uBDjkCT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,cACED,AAAAA,KAT4CF,YAU9C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CATAI;;EH0FqB;;;gBC5CI;;;;;;SE9CmB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CEH5CC;;EL6FqB;;;gBC5CI;;;;;;;SIjDiB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCClBC,YAAc,MAAGC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA6B7C,cAAuB6C,KAAUV,eAA4BU,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAG3J;;EAHyCA;WAMrC,MAEFlR;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,cACEA,AAAAA,KAZuCkR,YAazC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,CAEA1V,YACE,4BACF,A,C,I,C,I,C,C,C,C,C,G,C,e,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAhBA2V;;EN2FqB;;;gBC5CI;;;;;;SK/CkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,+B,4D,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCGlB3V,YAAqB,MAAG4V,MAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAAqD/C,cAA8B+C,KAAeZ,eAAiCY,QAAsB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,W,C,G,C,C;A,G,C,CAC7L5V,YAAwB,MAAG6V,MAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAAgDhD,cAAiCgD,KAAkBb,eAAoCa,QAAyB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,c,C,G,C,C;A,G,C,CAGnO/V,YAAmB,MAAGgW,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAChCjD,cACEiD,MACAC;WACF,A,C,I,C,I,C,C,C,C,C,G,C,G,C,C,C,C,W,C,C;A,E,C,CAIA,0CAEEA;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,kBAXED,KAYY,AAdQA,SAGpBC;UAYAA;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,e,C,C;A,E,C,CAIA;EACMD;EAzB0LF;WAAhDA,KAAeZ,oDACXa;KAAkBb,eAAoCa,kBAD1DD,KAAeZ,kDACXa;KAAkBb,eAAoCa,eA+B1M,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,iB,C,E,C,CAtBAG;;EP8EqB;;;gBC5CI;;;;;;;;;SMlC4B,A,C,I,C,I,C,C,C,C,C,G,C,uC,C,C,C,C;A,4B,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,mE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCd5BlW,YAAkB,MAAGmW,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyCpD,cAA2BoD,KAAcjB,eAAgCiB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACvKnW,YAAc,MAAGoW,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCrD,cAAuBqD,KAAUlB,eAA4BkB,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC5IjW,YAAqB,MAAGkW,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C,C,C,C;A,G,C,CAA2CtD,cAA8BsD,KAAcnB,eAAgCmB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAEvM,kBAJ8CF,IAA+EA;KAAcjB,iBAK9H,OAJgGkB;KAAUlB,eAA4BkB,SAMnJ,A,C,Q,C,K,C,C,C,C,C,G,C,c,C,C;A,E,C,CAEA,wBAR0CA;UAUtC;GAEW,AAXiCC,YAD6DD,KAAUlB,oBAcnHzM;UAAS,AAfiC0N,UAetBG,oBAfsBH,IAA+EA;KAAcjB,iBAiB5H,SAEf,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,c,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CArBAqB;;ER8FqB;;;gBC5CI;;;;;;;;;SOlDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,2B,uC,A,A,C,C,C,C;A,G,C,E,C;A,E,CCqB/CvW;;WAE0B;EAEHwW;WAInB,mCAGF;MAA+B,MAAxBC,oBACT,A,C;A,E,C,C;A,G,C,S,C;A,M,C,CAxB6B,cACvBC,OAAU,MCoJL;6DD/IT;MAAOC,UACT,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C,A,E,kB,iB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CnCutBEvU,mBACE;sBA/boClB,8BA+bpC,OACE0N,SA9baxF,KA+bf,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAhH,mBACE;sBArcoClB,8BAqcpC,UACM0N,SApcSxF,WAocH,QACZ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoBAhH,qBAGE;sBAheoClB,8BAgepC,SACiB0V,WA/dFxN,KAgef,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoJAhH,2BAEE;iBAAkB,EAAEyU,gBACJA;;yBACZ,2BAEJ,EAEsB;IAEpBA,cACArP;OACAA;YACAA;;8BAGAqP;QAEF,MW3qByBlK,SX4qB3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoEAvK;GACY,UAAa,MAAE1B,eACjB,KAAA,SAA+BA;;GAE/B,UAAe,MAAEA,eACjB,KAAA,SAAiCA,WAE3C,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQA0B,+BAEEvB;;EACiB;GACN,UAAM;GAEH;;;WASAiW,AAAAA;OAGU,KAAT,UAAWC,mDAG1BjW;gBACF,A,C,Q,C,K,C,E,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoCAsB;;GACY,UAAa,MAAE1B,eACjB,KAAA,SAA+BA;;6CAG1BQ;;EAESA;EACtBR;6BADsBQ,OACtBR;UAAY;EACQ;EAAmBA;2BDtgC/B,iBA2MRF;eC4zBA;MAAA,QAAA,aAAA;EACY,SAAVE;cACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA0B;GACY,KAAa,EAAE1B,cACjB,KAAA,SAA+BA,UAEvC;MAAA,QAAA,aACY,GAAVA;WADF,QAEA,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CqC1lCA0B;;GAEe,SACX,MAA8B,KAAR,cAAkC,KAAR,iCACzC,WAAc,WAAK,UACxB4U,WAASC,SACX;KAEA,gCAAuC,MAAW,YAAU,WAAK,UAC/DD,WAASC,SACX,CAEJ,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmBA7U;GAIiB,GAAGpB,SAChB,QAKF;QAA2B;GAChB,KAALA,QACF,SAEJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAOAoB;;GACiB,IACb;EAEgBpB;GAAH,OACS,GAExB;QAA2B;GAChB,KAALA,QACF,SAEJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CpCpBAoB,qBACqB,KAAR,cACT8U;KAEAC,cAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/U,iCACE;MAAkB,8BAAO,WAAW,YACzBpB;GAET;;KAAU,UAAkC,KAAtBoW,SAAQpW,MAAI,sBAChCA;QAAOA,MAAI;EACV,SACH,AACAA,WACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAoB;;EAMiC,KAAL,KAAP;;EACD;EACC;EACS,KAAT;;EACC;EACA;;EAEVpB;EACAA;EACAA;EACAA;EACAA;GAGY,KAAlBoW;;OACkB,KAAlBA;;OACkB,KAAlBA;;OACkB,KAAlBA;;OACkB,KAAlBA;;OACkB,KAAlBA;;OACkB,KAAlBA;;OACkB,KAAlBA;;OACkB,KAAlBA;;IAOJpW,UACAA;UACAA;UAEAA;QAAYA,SACZA;QAAYA;EAEI;EACE;GAE+B,KAAxBoW,mBAiBvB,kBAAqB,WAAW,YACrBpW;EACEoW;;GACF;GACA,aACD,CAAA,UACJpW,QAAOA,SACPA;aAEE,eAWJ,YACSoW,UAAQpW;;GACN,YACF;;GAIS,UAEdA,QAAOA;EACD,SAANA;QAAYA;EACL,QAAPA;;;;WAIAA,QAAOA;EACA,QAAPA;;;QAKJ,CAEJ,UAmBA,kBAAqB,WAAW,YACrBA;GAEO,KADEoW,sBAEV,CAAA,UACJpW,QAAOA,SACPA;aAEE,kBAGY,KADEoW,kBAEhB,YAEW,KADEA,UAAQpW,kBAEZ;GACK;;GAOD,KADFoW,UAAQpW,gBAGbA,QAAOA;EACD,SAANA;QAAYA;EACL,QAAPA;;;SAGAA,QAAOA;EACA,QAAPA;;UAIN,CAGN,cAQFA;QAAUA,MAAO,UACjBA;MAAO;SACPA;SAAWA,MAAQ,UACnBA;MAAQ,WAQRD;SAAsB,YACtBA;OAAiB;KAKf;GAOO,UAAkB,UACzB,KAAgC,KAAzBqW,UAAQpW,kBAA6B,SAAI,AAChD;KAAiC,KAA1BoW,UAAQpW,kBAA+B,SAAI,AAkBlD;kBAAqB,WAAW,YACrBA;GAEO,KADEoW,sBAEV,CAAA,UACJpW,QAAOA,SACPA;aAEE,kBAGY,KADEoW,kBAEhB,YAEW,KADEA,UAAQpW,kBAEZ;GACK;;GAOD,KADFoW,UAAQpW,gBAGbA,QAAOA;EACD,SAANA;QAAYA;EACL,QAAPA;;;SAGAA,QAAOA;EACA,QAAPA;;UAIN,CAGN,AAOAD,oBAOAA,eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,CDrTAE,YAAyB,0BAkRaC,2CAlRe,A,C;A,E,C,CAErD;EACe;6BAAA;GACb;KAAkB,SAChBmW,SAAOC;GACI,IAAG,mBACN,KAAA,YAEV,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAtX,YAAiB,MAAU,MAAPO,iBAAW,A,C;A,G,CAO/BI,eACa,KAAPJ,mDACJ;MAAO+W,WAAiB,KAAP/W,kBACnB,A,C;A,E,C,CAQAP;EACe;6BAAA;GACb;KAAkB,YACC,KAAbsX,gBAAyB;GAClB,IAAG,mBACN,KAAA,YAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAaAtX;EACe;6BAAA;GACb;KAAkB,YACZuX,SAAKD,mBAAe;GACb,IAAG,mBACN,KAAA,YAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAiDApX;EACe;GACT,AG0HcK;GHzHL,SAAM;MACC+W;GACP,CAAA,MAAG,oBACN,KAAA;EAEc;6BAPX;GAQX;KAAkB,SW+GpB3K,KAA6CA;EX7G5B2K;8BW6GjB3K;KAA6CA;GX5G9B,IAAG,mBACN,KAAA,YAEV,AACA,MWmHuBA,aXjHD;6BAjBX;GAkBX;KAAkB,WACH2K;8BWoGjB3K;KAA6CA;GXnG9B,IAAG,mBACN,KAAA,YAEV,AACA,MW0GuBA,OXxG3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEAlM,cAAwC,2CAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE5DA,cAA2B,0CAAkC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAW7D+W;EAEe;6BAAA;;GACb;KAAkB,WACRZ,WAAeU;GACZ,IAAG,mBACN,KAAA,YAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA7W,cAA4B,MAAG,wBAAsC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQrEG;oCAGa;UAAwBL,sBAEZA;6BAAAA;;;iCAEvB;YAAoBA;6BAAAA;KAAF;EACJ+W;8BAAZ9P;WACF,AACA,SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,CA+BA7H;EACe8X,KAAAA;EACTC;YAAqC,UAAU,QACnD;SACF,A,C;A,G,CAEA/X;EACe8X,KAAAA;EACTE;GAAO,UAAU,QACrB;SACF,A,C;A,E,CAEAhY;EACe8X,KAAAA;EACTE;GAAO,UAAW;EAClBD;YAAqC,UACvC,MAAc,UAEhB;MAAoB,WACtB,A,C;A,E,C,CAEA/W,oBAC8B,KAAZiX;GACN,WAAiB,OAAGC,iBACtB,KAAA,SAA+BtX,eAEvC;MAAOkX,MAAAA,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAhX,iBACY,8CACV;MAAO,MAAoBgX,QAAkB,KAAPE,WAAgBD,cACxD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAjX;GACY;EACNiX;EAGWC;WAFb,MAAO,MAAoBF,UAA0B;OAEjC;GACH,UAAU,WAC3B;MAAO,MAAoBA,mBAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAzDAK;EACMH;;GAAO;EAGPD;GAAa,YACE;GAGN,cACH,KAAA,cAGZ,A,C;A,M,C,C,E,CAZAI;;SAYA,A,C,C,C;A,E,C,C;A,G,C,e,C;A,E,CAgEAnX,WAAc,MAAGyI,SAAQ,A,C;A,C,C,CAEzBpJ;EACeyX;;EAAAA;GACD,CAAA,KAARvT,gBACI,KAAA;EAEJ6T;6BAJSN;GAIF,MACTrO,YACA;SAEFA,QAAWqO,SACXM;QAAM,AAANA,SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CAkBA9W,gCAAqDwW,KAAAA,SAAoBO;wCAAhD;SAAmD,A,C;A,E,CAG5ErY,YAAe,MAAG8X,MAAAA,SAAgB,A,C;A,G,CAClCzX,YAAiB,MAAGyX,MAAAA,SAAiB,A,C;A,G,CAIrCQ,YAAW,MAAGD,SAAGP,KAAAA,UAAe,A,C;A,E,C,CAEhCQ,cAAuB,MAAGD,SAAGP,KAAAA,YAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,M,C,C,E,CAnBxDtW;4CAEI,gCAEF;iCACF,A,C,C,C;A,E,C,C;A,G,C,U,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CA8BAnB,iBACMkY;GAAAA,OACF9O,QAAW4O,QAAGE,OACd;SAEF9O,YACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEA6O,WAAc,MAAG7O,SAAQ,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CAezBzJ,YAAe,MAAGwY,MAAAA,SAAc,A,C;A,E,C,CAChCF,cAAuB,MAAGD,SAAGG,KAAAA,YAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,CAYtDlX,2BAAiDwW,KAAAA,SAAoBO;wCAA5C;SAA+C,A,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CASxEhY,WACE,UAAOkY,QAAAA,UACDF,QAAGE,aACL,QAEJ,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEAvX,WAAc,MAAGuX,AAAAA,cAAiB,A,C,C;A,E,C,C;A,G,C,U,C;A,E,CAWlCjX,2BAAqDwW,KAAAA,SAAoBO;wCAAhD;SAAmD,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,e,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CAiB5EC,WAAc,MAAG7O,SAAQ,A,C;A,C,C,CAEzBpJ;EACMoY;WAA2B,QAC/B;MAM2BF,QANpB,CAACE,QACNhP;GACI8O,OAGFE;EACoBJ,KAAAA,QAAGE,QAAvBE;eAEA,SAEJ,AACAhP,QAAWgP,AAAAA,YACX;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAmBAnX,kBAC6BwW;WAAAA,QAAoBY;wCAA/C;SACF,A,C;A,M,C,C,E,CAdAlX,2DACqC;aAIjC,8BAEF;+BACF,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAcAxB;EACuB8X;EAAAA;EACAY;GAAF,UAAc,QACjC;SACF,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CAYArY,iBACY,KAAVsY,UAAAA;;GACe,UACb,MAAOJ,AAAAA,YAETI;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEA3X,cACiB,KAAX2X,WAAgB,MACpB;MAAOJ,AAAAA,cACT,A,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAqDAzX,yDACqB,wCAGnB;MAAO,MAAoBgX,QAAsB,KAAXc,yBACxC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAEAtX,kBAC6BwW;WAAAA,QAAoBc;wCAA/C;SACF,A,C;A,E,CAfAC,sBACMD;2CAAiC,eAC7B,KAAA,SAEV,A,C;A,M,C,C,E,CAXApX;;WAEI;SAEF,MAAO,aACT,A,C,E,CAEAqX;;SAIA,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAmBA7Y;EACe8X;EAAiB,KAAjBA,QAAmBc;GACrB,UAAM,QACjB;SACF,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CAWAvY;EACuCkY;GAArC;YAAoBK;6BAAAA;KAAF,UAAmBL;UAAoB,AACzDK,SACA;MAAOL,OACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEAvX,WAAc,MAAGuX,AAAAA,cAAiB,A,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CAiHlClY,WAAgB,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CACxBW,WAAc,OAAO,A,C,C;A,G,C,C;A,G,C,I,C;A,E,CsC5sBrB,mBACQ,KAAA,wDAER,A,C;A,C,C,CAGA,mBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,mBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAX,mBACQ,KAAA,+CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeA,iBACQ,KAAA,yCAER,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAeA,qBACQ,KAAA,+CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CAmBA,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAGA,mBACQ,KAAA,yDAER,A,C;A,E,C,CAGA,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAGA,mBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAW,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,mBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAX,mBACQ,KAAA,gDAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeA,mBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CASA,iBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAeA,yBACQ,KAAA,2CAER,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,gDAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAuGAL,YAAe,MAAGwY,MAAAA,SAAc,A,C;A,E,C,CAEhCxX;EAA0BwX;SAAH;MAAGA,QAAqC,KAAJ,KAAfA,eAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,C,C,CxB5PvEnY;;QAAwB;iDAA4B,KAANyY,QAAS7W,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAElEjC,kBAEwC8Y,KAAAA;6BAAAA,OAAtC;MAAkB,WAAkB,SACtC,A,C;A,E,C,CAEAC,YAAW,sBAAaD,eAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,G,C,I,C,E,C,CAKhCrW;GACM2G,cAAc;GACdA;ET4B4BqF;;GSzB5B,wFAIJ;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C,A,E,oB,mB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CyBsaFU,uBACoB,MAClB;mBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAA,YAAmC,MAAG6J,UzBvbIpJ,WyBubc,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIxDqJ;4CAEI;KAEA,qBAEJ,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAMAC;EACyBC;;GACP,iBAAc;GACd,cAAW,aAE3B;MAAOC,MAAmBJ,qBAC5B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIAE;;EACuBG;GACF,OAGHA,OAAqC;;cAEZC,MAAfC;;GAEf,QAAS;;EAEDF;GACF,UACqBG,AAAAA,KAChCH;aAEAA,OAAmC,IAAwB,KAAnBA,6EA2lBlCI;SAzlBV;WAGEnZ;;GAGQ,6BAyvDVoZ;;SAtvDE;cAII,KAAA,kCzBhfgC9J;;;;;;0EyB+fnB+J,AAAAA,SAAmBA;EAC3BA;8BASQA;qBAAAA;EACRC,KADQD;GAEH,AAAdE,YAAqBV,sBACdW;wBAo3BiBR;;YA92BGS;KAI3B,MAAoBA,yBAAF,qBAElB;gFAoiBQN,gBA9hBZ;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/R;EACe,8BACb;sBvC/SsCnG,8BuC+StC,UvC7SiBkI;GuC8SX,CAACuQ,SAAwB,CAACA,SAAmB,CAACA,QAChDnS,MAAOmS,WAEX,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAtS;EACe,8BACb;sBvCzTsCnG,8BuCyTtC,UvCvTiBkI;GuCwTXuQ,QACFnS,MAAOmS,WAEX,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAkCAtS;EC5kBW,8BAAA;SD+kBT;sBvCpWsCnG,8BuCoWtC,UvClWiBkI;GuCmWXuQ,WzBzlBkCpK,AyB0lBpBoK;;EAGZnS,MAAOmR,KAFJ5P,SAA8B,KAAZA;;wDAKvB4Q,gBAEJnS;KAAmBmS,qBACrB,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIAC;IAGE;sBvCxXsC1Y,8BuCwXtC,OACEsY,OAAWL,KvCvXI/P,MuCwXjB;kBvC1XsClI,6BuC4XtC2Y;;EvC1XiBzQ,IuC4XjB;KAAOyQ,oBvC5XUzQ,euC6YLuP,QAfZ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA4xDAhZ;;GACE;YAAoB+Z;6BAAAA;KAAF;GACgB,KAA5BA,AAAAA,eAA+Bf,SACjC,aAEJ,0DAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAE;;QAOE;QAAe;;;EAOHpT,QACZ,WAIE;;aAEiBmH;QACRkN;EAKkCA,OAEzC;MAAOJ,QADKK,OAAqCC,iBAKhCpN;;0BAaSqN;;4CAExB,WAqBArN,wBAEa,QACjB,MAAOuM,QAGT;MAAOe,YACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApL,yBACqB,QAEnB;MAAO6J,UzB5+EiCpJ,AyB2+EnB4K,oBzB3+EmB5K,OyB6+E1C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3O;;GAGuB,QAAS;wBACoB;;mBAEhD;MAAOwZ;EAMGtR,mBlCzhFFoJ;UkC0hFO,eAGjB;MAAOpJ,6BAAAA,AAAAA,YADQA,kFAGjB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAlI;;0EAQayZ,KAAYC;EACJA,qCAERD;OAKX,sBvC/xEsCnZ,gCuCiyEjB,YAFrB,UvC7xEiBkI;QuCgyEwB;;EAA1BmR;;EAEA;GACF,QACT/S,UAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA5G;GACMe,cAAgB,qBACpB;MAAOA,WACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA3B,oMAsBI;QAEA,UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAIAA;;GACU,YACA,uCACN;EAEiBwa;QACnB;MAAiB,aAAoB,WACvC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,G,CA1jFEnT;EACMoT;GAAiB,QAAS;EACG,8BACjC;eAAiCC,8BvCmQkBjD,KAAAA,MAAoBO,6BuCnQvE,OACE,MAAA,KvCqSa5O,MuCrSb,UAAA,MACE5B;MAAOmT,WACT,AACF,+BACOF;SAAP;SAEF,A,C;A,M,C,C,G,C,U,C,E,C,CAMArY;EAEe;;WAEY,QACzB;sBvC+MoClB,8BuC/MpC,UvCiNekI;;EuChNCU;EACMA;ETkBQ,KAAmB8Q;ESjBxB9Q;EACEA;EACFA;EACVA;EACCA;EACKA;kBAInB+Q;KADgBrT,4FAGRmR,UAEV,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAP6C,WAAG,uBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAenEzY,YAAkB,MAAG4a,YAAW,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKhCC,iBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,mBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CAeA7a,WAAuB,gBAAY,A,C;A,G,CAUnC8a,iBAkiF0B7C,AAjiFjB8C,eAAP;MAAOA,AAiiFiB9C,2BA/hF1B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CADM,YAA0B,MAAGwC,SAAQO,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,G,CAU3CpM,WAAyB,MAAGqM,MAAqBhB,WAAOiB,YAAW,A,C;A,G,CAEnEpb,WAAmB,MAAGqb,MzBjHkB9L,AyBiHhB6L,mBAA2B,A,C;A,E,C,CAKnDlb,YAAkB,MAAK4a,wBzBtHiBvL,AyBsHG6L,mBAAc,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMzDE,mBACQ,KAAA,iCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,C,C,CAiBAtb;;QACE;iDACe,KAAXob,QAAcxZ,OACR,AAANuY,YAASvY,MACf,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EzCvJoBoS,KAAAA;6BAAAA;EyC0JLoI,OACb;MADK,CAAA,AADA,AADiB,aACX,GAAEiB,KAAAA,SACF,GAAEjB,cAEf,A,C;A,G,CAEAja,WAAuB,2BAAuB,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CAoB9CA,WAAuB,mBAAe,A,C;A,G,CAEtCqb,WAA4B,OAAO,A,C;A,G,CAMnC3a,WAAkC,YAAS,YAAwB,A,C;A,G,CAGnEP,gBACQ,KAAA,iDACR,A,C;A,G,CAEAO,WAA2C,YAA+B,A,C;A,G,CAC1EA,WAAmC,YAAuB,A,C;A,G,CAE1DZ,WAA+B,SAAO,A,C;A,G,CACtC6Y,WAAmC,YAAO,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,6D,C;A,G,CA0C1C3Y,WAAuB,sBAAkB,A,C;A,G,CAEzC4O,WAAyB,MAAGsM,SAAU,A,C;A,G,CAEtCxa,WAAkC,MAAG4a,YAAgB,A,C;A,G,CAErDnU;EACMoU;GAAe,QAAS;EACf,8BACb;MAAA,KAAyBC,SAAzB,UACYvC,KADZ;;+CAGU5D;cAEJ/N,MAAO+N,OACPA;YAGN,+BACOkG;SAAP;SAEF,A,C;A,E,C,CAEA7C;EzBpQwCrJ;GyBsQlCxG;EACS4S;EAAYhD;EAo3EHR,AAAAA;aAAAA,AAAAA,AAn3EOyD;gBAGrB,KAAA,UAA4BC,uBAEpCC;YACA;MAAOC,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAnD,kBA02EwBT,AAAAA,AAz2EJ6D;gBAGV,KAAA,0BAER;MAAOD,MAAQD,YACjB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAlD;EAi2EwBT,AAAAA,AA31EO6D;gBAGrB,KAAA;;6CAGwB,oBA8vDFC,MA7vD5BxM,KzBvSoCF,SyByStC;MAAOwM,MAAQD,WACjB,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAmBAlb;EACMsb;GAAuB,QAAS;;EAEhBC;;EAEcC;GAFlC;YAAoBD;6BAAAA;KAAF;OACFA;;EAESrD;;EAOF7J;QAIHA;EpCtVbnN,kBoCyVD,SANY,KAQhB0F;SACAsU;cACF,AACOI,SAAP;SACF,A,C;A,G,CAEAtb;EACMyb;GAAc,QAAS;iBAE3BC;UACUC,aACHF;SAAP;SACF,A,C;A,G,CAEAhV;EACMmV;GAAiB,QAAS;EACjB,8BACb;MAA8BhB,6BvChHMta,8BuCgHpC,UvC9GekI;GuC+GT,CAAC0S,QAAsBtU,MAAOsU,WACpC,+BACOU;SAAP;SAEF,A,C;A,G,CAEAnV,iBACMoV;GAAe,QAAS;gBACf,4CAENA;SAAP;SAEF,A,C;A,G,CAEApV,iBACMqV;GAAe,QAAS;gBACf,4CAENA;SAAP;SAEF,A,C;A,G,CAEArV;EACMsV;GAAiB,QAAS;EACjB,8BACb;MAAgCC,6BvC1II1b,8BuC0IpC,UvCxIekI,IuCyIb5B;MAAOsU,WACT,+BACOa;SAAP;SAEF,A,C;A,G,CAEAtV;EACMwV;GAAe,QAAU;EACaC;EC9XnC,8BAAA;;aDwnF+B3E,AAAAA,AAtvEtCwD;qBAsvEsCxD,AAAAA,AArvEtC4E;qBAqvEsC5E,AAAAA,AApvEtC6E;qBAovEsC7E,AAAAA,AAnvEtCyD;;+BACOiB;SAAP;SACF,A,C;A,G,CAEAxV;EACM4V;GAAoB,QAAS;EACpB,8BA6uEyB9E,AAAAA,AAzuEtC6D;;+BACOiB;SAAP;SAEF,A,C;A,G,CAEArc,iBACMsc;GAAgB,QAAS;gBAGgBC,KAAAA,wBADtCD;SAAP;SAEF,A,C;A,G,CAGA3B,WAA4B,OAAO,A,C;A,C,C,CAOnC6B,cACI,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CArCnCC,cACE7V,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAWA6V,cACE7V,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA2MsC,WAAG,cAAGmS,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,G,CAmC9CzZ,WAAuB,oBAAgB,A,C;A,G,CAEvC4O;EACMwO;GAAkB,QAAS;EzBxoBO/N,AyByoBjBgO,AAAAA;EAEIC;EADGC,sBACtB9E,qBzB3oBgCpJ,AyB2oBbiO,aACnB7E,yBzB5oBgCpJ,AyB4oBTiO,YAFtBF;SAAP;SAGF,A,C;A,G,CAEAxO,WAAyB,MAAGsM,YAAU,A,C;A,G,CAetC/T,WAAgD,MAAGmW,AAAAA,eAAkB,A,C;A,E,C,CAkBrE5E,qBAKQ,KAAA,uBAER,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA,iBAEQ,KAAA,6BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAA,mBAEQ,KAAA,UAA4BiD,wBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,G,CAEAjb,WAAsC,OAAI4c,SAAM,A,C;A,G,CAYhDxd,WAA+B,SAAO,A,C;A,G,CAEtC4Z,WAAoC,YAAO,A,C;A,G,CAG3ChZ,gBACQ,KAAA,YACR,A,C;A,G,CAEAA,WAAmC,YAAuB,A,C;A,C,C,CAG1Dwc,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,G,CAmBnExD,YAAqB,MA1SdT,MzCjb4B1M,AyC2tBCiR,KAAAA,aAAsB,A,C;A,E,C,CAE1D9E,sBzBhvBwCrJ,OyBwyBtC;MAAO+L,mBAJwC9R,iBAMjD,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAMAwI;;EAEqB0L;aAAqBpe;;cAG9B2Z;mBAGV,SACF,A,C;A,E,C,CAKAL;EAIc+E;;cAMWC;QAKHC,AvCgFb,KuChFaA;;EnCpqBbzd,KmC8qBkDsd;;GAGrDI,iCAEqBF,0BAMvB;MAAO7B,MAAQ+B,KAAoBJ,iBAEnC,MAAO3B,MAAQ+B,KAAoBJ,YAEvC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA9E,wBzBx2BwCrJ,ayB02BtC+L;QACI3C,gBACJ;MAAOoD,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CA0BAnD;WAKgBmF;;;;IAOuBL;WAMjC;OAEa3B;;KAGb;UAGJ,MAAOiC,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEApF;EzBp6BwCrJ;EyBw6BzB+L;EACkBqC;GAC3BG,QACF;EAIUC;yBAEU,SAAfA;;GAAwB,CAAA,UAAM;MAC3BA;;iCAMIE;EAKIH;EACJA,QACRI,aACAC;;SASN;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAF,mBASI;KAEA,yDAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAE,iBACM,GAAU,0DAUd;iDAFsDT,mEAGxD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKAQ,oBAKoB5e,IAJLoe;GAKT,GAAU,+DAGd;mHACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,C,C,CASA/W;;;+CAEmB+W;EAAW9b;;aAD5B;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC,YAGE,MAAmC,M5B7iCMye,K4B6iCjBV,oBAC1B,A,C;A,E,C,CAEAxd,YAAkB,+BAAwBme,KAAmBX,UAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAMzEN,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA7PxC;EzBnxBa7N;;GyBqxB9BxF,QACFA;UAIM,KAAA,oEAGV,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oD,C;A,G,CAiSJ7J,WAAuB,oBAAgB,A,C;A,G,CACvCA,WACE,UAAgCoe,aAAhC,QAAA,UACmB,CAAA,KvC30BJlV,auC40BX,WAAUmV,AAAAA,mBAAsBC,WAEpC,AAGA;MAAOD,AAAAA,eACT,A,C;A,G,CAEA3d,WAA2C,MAAG2d,AAAAA,eAAoB,A,C;A,G,CAElE3d;EACM6d;GAAqB,QAAS;;;EAgB9BD;GAAAA,oBxCr/BGhe,KwCs/BLge;KAKA,MAAoBA,sBAAF,WACAA;;uEAUJ;KAGRE;eAMN,AACAA,sCAEKD;SAAP;SACF,A,C;A,G,CAEA7d,iBACM+d;GAAe,QAAS;EACLJ,AAAAA,gBAAhBI;SAAP;SACF,A,C;A,G,CAQAtX,iBACMuX;GAAoB,QAAS;gBAGzBC,KAAmBC,yBAFpBF;SAAP;SAGF,A,C;A,G,CAcAvX;EACMsV;GAAiB,QAAS;EACjB,8BACb;MAAiC4B,AAAAA,mCvC16BGrd,8BuC06BpC,UvCx6BekI,IuCy6Bb5B;MAAOsU,WACT,+BACOa;SAAP;SAEF,A,C;A,G,CAEAtV,iBACMwV;GAAe,QAAS;gBAExBkC,KAAcD,WAAUlD,yBADrBiB;SAAP;SAEF,A,C;A,G,CAEAxV;EACM4V;GAAoB,QAAS;EAE7B,8BACJzV;OAAcwU,WACdxU;OAAcwX,WACdtF;KAvG4C6E,AAAAA;+BAwGrCtB;SAAP;SAEF,A,C;A,E,C,CAoDArE,cACE,MAAO2F,AAAAA,iBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3F,YAA0C,MAAG2F,AAAAA,eAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAiBvEU,WAA0B,MAAGV,AAAAA,eAAY,A,C;A,G,CAEzC3d,WAAkC,MAAG2d,AAAAA,eAAe,A,C;A,G,CAEpD3E,iBACMsF;GAAY,QAAS;EAMJC,wBADEC,0BAFwBb,AAAAA,mBAGxCW;SAAP;SACF,A,C;A,E,C,CAEAtG,gBAGE,MAAO2F,AAAAA,mBACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAEAve,WAA+B,SAAQ,A,C;A,G,CAEvC4Z,WAAoC,MAAG2E,SAAM,A,C;A,G,CAE7C3d,iBACMye;GAAuB,QAAS;EACJd,AAAAA,gBAAzBc;SAAP;SACF,A,C;A,G,CAEArf,WAAmB,MAzqCGqb,MzBjHkB9L,AyBiHhB6L,AAyqCFmD,sBAAgB,A,C;A,G,CAYtCzP,WAAyB,MAAGyP,AAAAA,eAAoB,A,C;A,G,CAIhDle,WAAuB,gBAAqBif,iBAAa,A,C;A,G,CAEzDxQ,WAAsB,MAAGyP,AAAAA,eAAiB,A,C;A,C,C,CAM1CnB,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAlOjEsB;E5B1iCOze;;G4B4iCW,WACduH,OAAW2R,KAA0BoG;uBAMrC/X;gBAHmB0S,KAAaF,kBAz8B1BrB,KAAEqB,YA88BZ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAVqD,YAAI,SAAI,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAazB,YAAI,MAAG0E,kBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAmFtC,YAAQlX,WAAOgY,UAAV;SAA2BA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2E,C;A,G,CA2OxDtf,WAAuB,oBAAgB,A,C;A,G,CAEvC8R;EACMyN;;4CACF;KAEA,SAEJ,A,C;A,G,CAEApY,iBACMuX;GAAoB,QAAS;gBAGzBC,KAAmBC,yBAFpBF;SAAP;SAGF,A,C;A,E,C,CAWAhe;EACwC8e;EAClBhO;iBAEpB;sBvCtsCoCxQ,8BuCssCpC,UvCpsCekI;GuCqsCTuW;EACgB3Q;;;;EAShB,eAEJxH;SACAsU;OACF,EAEOpK,kBAAsC4N,SAC7C;sBvCxtCoCpe,8BuCwtCpC,UvCttCekI;GuCutCTuW;EAE4BxF,AAAAA;;;EAOdyF;QAEGA;EpCh+ChB9d;EoCw+CD,SAFY,KAIhB0F;SACAsU;OACF,AAEA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAlb,iBACM+d;GAAe,QAAS;EACJkB,aAAjBlB;SAAP;SACF,A,C;A,E,C,CAEA/d;;EAGkCkf,AAAAA;qBAAAA;EAAAA;EAC5BC;GAAgB,cAEd;aAENzD;eAGiDgD;GAC5B,QACnBhD,mBAMF;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA1b,iBACMyb;GAAc,QAAS;EACJ2D,aAAhB3D;SAAP;SACF,A,C;A,G,CAEAhV,iBACM4Y;GAAkB,QAAS;gBAEmBC,KAAcpB,yBADzDmB;SAAP;SAEF,A,C;A,G,CAcA5Y;EACMsV;GAAiB,QAAS;EACjB,8BACb;MAAgCC,6BvC1yCI1b,8BuC0yCpC,UvCxyCekI,IuCyyCb5B;MAAOsU,WACT,+BACOa;SAAP;SAEF,A,C;A,G,CAEAtV,iBACMwV;GAAe,QAAS;gBAExBkC,KAAcD,WAAUlD,yBADrBiB;SAAP;SAEF,A,C;A,G,CAEAxV;EACM4V;GAAoB,QAAS;EACpB;aAolCyB9E,AAAAA,AAhlCtC6D;qBAglCsC7D,AAAAA,AA/kCtC6G;qBACAtF;KAAAA;+BACOuD;SAAP;SAEF,A,C;A,E,C,CAoDArE;EAihCwBT,AAAAA,AAhhCIyD;GACf,SAAWE,SAAmB,AAACA,gBAGxBA;GACZ,eACI,KAAA;MAGR;MAAOC,cAGH,KAAA,UAA4BF,wBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjD;EAigCwBT,AAAAA,AAhgCIyD;GACf,SAAWE,WACJA;GAGZ,eACI,KAAA;oBAIN,MAAOC;KAEP,MAAOA,iBAIL,KAAA,6BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CA+BAkD;EACMkB;cACEV;;4CACFU,QAASC,AA1uCRjH,KzCjb4B1M;;EyC6pDZ4T;gBvC15C8B5I,KAAAA,MAAoBO;wCuC05CnE;KAAA,OACE,MAAA,KvCx3CS5O,MuCw3CT,OAIEuR,AAJF,YAKA,AACF,GAEEwF;6CzBzrDgC5Q,AyB0rDD6L,gCAGrC,SACF,A,C;A,G,CAEAxa,iBACMsc;GAAgB,QAAS;EACzBC;cACUmD,KAAsCZ,qBAAlDvC;0BAG2CA,uBADtCD;SAAP;SAEF,A,C;A,G,CAEAtD;EACMsF;mCAE6CI;GAC3B,WAEJH,wBADSC,WACvBF;iBAEqBY;EAAAA;qBAAAA;EAAAA;;EAERvG;EACTC;GAAc,QACE,WACV,KAAA;EAEML,KAA0BK,KAAxC0F;iBAI8B,eACjB/F,OADb+F;YAKN,MAAmB,mBAAiBA,QACtC,A,C;A,E,C,CAEAtG,sBAu5BwBT,AAAAA,AA94BEoI;YACF,CAACzE,aAEf,KAAA;GAGJ,CAACA,OACHrM,KzBpvDoCF,SyBsvDtC;MAAOwM,MAAQD,WACjB,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAEA9b,WAA+B,SAAO,A,C;A,G,CAEtC4Z,WAAoC,YAAO,A,C;A,E,C,CAE3ChZ;uBAEiD0e;EAE3B,QAOTF,cAAAA,8CAGX;gCACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAxe,iBACMye;GAAuB,QAAS;EACJmB,aAAzBnB;SAAP;SACF,A,C;A,G,CAEAze;EACK6f;GAAqB,QAAS;;EAGqBf;WAC3B,QAC3B;QAAkB,EAAEhG,gBACsBA;kBACxClS;8BA9oDQmR,KAAEqB,WAgpDZ,0BACOyG;SAAP;SACF,A,C;A,G,CAEA7f,WAAmC,YAAuB,A,C;A,G,CAI1DP,cACM,CAH4C,KAArBqZ,KAAAA,oBAInB,KAAA,uDAGR;gBAAyB4F,cAC3B,A,C;A,C,C,CAMAlC,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAnQjEC,cACE7V,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAGsB,YAAQA,WAAOgY,UAAV;SAA2BA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA+MpD5F,YAEE,MAAOuF,+BACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gC,C;A,G,CA8HJjf,WAAuB,uBAAmB,A,C;A,G,CAE1C2Y,YACE,MAAOsG,MAGsBgB,sBAHqCO,UACpE,A,C;A,G,CAEAnF,WAA4B,MAAG4E,SAAM,A,C;A,G,CAErCvf,iBAEMuc;cACWwD;kBAAbxD;UAGF,MAAOA,AAAAA,sBACT,A,C;A,E,C,CASApC,YAA6B,SAAuB6F,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE5D,iBACMC,aACI,KAAA,UAA4BhF,KAAaT;EAE5BwF,WACvB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAtFAzf;EAIkC2f;EAC5BC;SAGF;cAJ8BD;EAOjBC;;EACFC;;EACFC,KAAUD,MAAwB;SAE9B;EAEQ;EAIQA,SAFzB;EAGQA;GACF,OACKE;EACNF,OAAwB;IAIjBlI,cAGA9J;;QAKC2J;EACawB;avC9nDIjZ;8BuC8nDlC;UAAA,UACwB,KAAlByY,AvC7nDOvQ;MuCioDb,sBAvC8B0X,SA0ChC;0B5Bp1DO7gB,K4Bm1Dc8gB,qBACOpI,SAO9B,A,C,E,C,CAmBAvW,eACW,OAAc,MAAO,MAAY;GACjC,QAAe,OAAQ,MAAY;GACnC,OAAc,MAAO,MAAY,KAC1C;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,G,CAmBA+e;;EAgB+DzD;;;;;;;;gBAErD,KAAA;EAEuB0D;qBAAAA;E5B15DxBnhB,K4B05DwBmhB;;8CnCyIQvQ,OmCtI1BjF;;EACAoD,WnC0IwB6B;WmCxIjCpB;EAEe,0EAMbkJ;kBAIN;SACF,A,C;A,E,C,CAQAzY,YAAkB,+BAAwBme,KAAmBX,cAAa,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAW1EN,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,4C,C;A,G,CAqDnEld,WAAuB,qBAAiB,A,C;A,G,CAExCU,iBACMygB;GAAY,QAAS,QACzBC;UACA;MAAOD,SACT,A,C;A,E,C,CAEArhB,WACE,wBAA8Bic,QAChC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAV,WAA4B,MAAG4E,SAAM,A,C;A,G,CAErCtH,WACEyI,UACA;MAAOC,SACT,A,C;A,G,CAEA3gB;EACMuc;cACwBlB;EAAhBqE;EACakB;6BAAAA;;EACD;GACb,WAGY3X;qDAGeA;OAt8DjBsQ;GAAM;;;aAy8DWtQ,0BArBTsW,kBA0BnBtW,KAAwBiQ,AAFD2H,AAxBJtB,oCAAAA,YA8BrBuB,QACFH,QA/BuBpB;KAiCvBoB,QAAc9U;EAGD5C,IACf;MAAoC4C,UAApC,qBnC5vDAkV,OAKkC7X,SmCuvDlC,avCt1DWV;;;;GuC01DH,EAAES,qBACgC+X,sBA8GpCjJ;OA3GiB9O;gBAEH+X,kBAyGdjJ,WAtGK;uBAATkJ;OACF,CAEFR;gBACqCS,uBAArC3E;UAEF,SACF,A,C;A,E,C,CAYA7B,iBAIM,CAACyG,SAAY,CAACL,aACV,KAAA;IAEY,KAAhBF,QAAmBhY,WAA8ByS,mBAE7C,KAAA,KACF9B,WAAOiB,kBAMb;MAAgCa,iBACtB,gBACZ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAlB,eACMiH,QACF,MAAO1G;UAGD,KAAA,6BAEV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA2G,iBACMC,QACF,MAAO5G;UAED,KAAA,UAA4BO,KAAaT,wBAEnD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,G,CASApb,WAAyB,MAAG,CAACgiB,SAAY,CAACE,SAAY,CAACR,QAAa,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAxJpEvgB;EAIsB4H;qBAAAA;EACbc;EACWsY;EACF,IAAepZ;EAI3Bc;;;4BAPgBd;E5B99Db9I,K4B6+D8B4J;qBAfjBd;E5B99Db9I,K4B8+D8B4J;OAGjC8O,OADJ;kBACgD,2CAElD,A,C,C,C;A,E,C,C;A,G,C,4B,C;A,G,CAwKAzY,WAAuB,wBAAoB,A,C;A,G,CAE3C2Y,YACE,MAAOsG,MAAwChF,QAAOuG,SACxD,A,C;A,G,CAGA1gB,WAAkB,SAAQ,A,C;A,G,CAG1BA,YAAiB,SAAQ,A,C;A,G,CAWzBY,WAEE,MAAOwhB,AAAAA,MAAAA,0BACT,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAD0B,YAAQ,MAAGrG,wBAAsB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,CAa3DsG,YAA+B,MAAGhJ,SAAQ,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,G,CAE1CnZ,WAAuB,sBAAkB,A,C;A,G,CAYzC2Y,WAAmC,YAAS,YAAwB,A,C;A,G,CAGpE0C,WAA4B,YAAS,YAAwB,A,C;A,G,CAG7D3a,WAAkC,YAAS,YAAwB,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,G,CASnEP,WAAuB,YAAS,YAAwB,A,C;A,G,CACxDuZ,WAA2B,YAAS,YAAwB,A,C;A,G,CAC5DhZ,WAAsC,YAAS,YAAwB,A,C;A,G,CACvEyG,WACI,YAAS,YAAwB,A,C;A,C,C,CASrC+V,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CACnExE,gBAGI,YAAS,YAAwB,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CACrCA,YAA0C,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAC3EA,cACI,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CACrChY,WAA2C,YAAS,YAAwB,A,C;A,G,CAC5EA,WAAmC,YAAS,YAAwB,A,C;A,G,CACpEiY,WAAmC,YAAS,YAAwB,A,C;A,G,CACpE/J,WAAsB,YAAS,YAAwB,A,C;A,G,CACvDA,WAAyB,YAAS,YAAwB,A,C;A,G,CAC1D9O,WAAmB,YAAS,YAAwB,A,C;A,G,CAGpDY,WAAkC,YAAS,YAAwB,A,C,C;A,E,C,C;A,G,C,oB,C;A,G,CA0BnEZ,WAA+B,SAAO,A,C;A,G,CAItC6Y,iBACMyJ;GAAkB,QAAS;EAfUC;qBAgBrBD;SAAP;YACT,uBAAwBA;SAAP;WAEjBnD,KAAwChF,cADrCmI;SAAP;SAEF,A,C;A,G,CAEA1hB;EACM4hB;GAAkB,QAAS;;EArBmBD;eAyBhD,+BvCtlEkCrhB,kCuCslElC,aAEqD,GADnDsG;qBvCrlEW4B,qBuCy8DLuP,qBA8IR;cAGA,8BvC5lEkCzX,8BuC4lElC,aAEqD,GADnDsG;qBvC3lEW4B,qBuCy8DLuP,qBAoJR,gBAGA,MAAiBjH,gCvClmEiBxQ,8BuCkmElC,UvChmEakI,IuCkmEX5B;gDAzJMmR,UA0JR,0BAEK6J;SAAP;SAEF,A,C;A,E,C,CAEAtiB;EACMuiB;GAAgB,QAAS;EA/CqBF;eAmDhD,+BvChnEkCrhB,gEuCgnElC,gBvC9mEakI;EuCgnET,OADA,IACGwD,cAEP;4BAKA;8BvCznEkC1L,mCuCynElC,gBvCvnEakI;EuCynET,OADA,IACGwD,cAEP,gCAMA;MAAiB8E,gCvCnoEiBxQ,mCuCmoElC,gBvCjoEakI;EuCooET,OADA,AADA,kBAEGwD,uBAEP;;kBAOE,SAAGA,kBAEH;OAEG6V;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAOAtB,WAA4B,YAAS,YAAwB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAgD3DtI;;;EAGMkB,KAAsBD,UAA0BE,QACpD;MAAOF,MAAAA,aACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASA5Z;EACqB+Z;;4CAEjB,WAAUsF;2FAIO,cACf;QACsB,cACtB;KAGA,eAGJ;MAAOA,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA0BS,YAAQ,wBAAgB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAQ/B,YAAQ,wBAAgB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,E,CAqH5B5f,YAAe,M/B5qEGuE,A+B4qEAiU,YAAc,A,C;A,G,CAEhCnY,YAAiB,M/B7qEGkE,A+B6qEAiU,gBAAe,A,C;A,G,CAEnCnY,YAAoB,M/B9qEG,AADHkE,A+B+qEGiU,gBAAkB,A,C;A,C,C,CAEzC3J,cAAqB,MAAG2J,AAAAA,gBAAY,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEpCnY,YAAwB,MAAGmY,AAAAA,eAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEnDnY,YAA4B,MAAGmY,AAAAA,eAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3D,cAAqC,MAAGA,AAAAA,iBAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAE1D1X,kBAAwB0X,OAAH;qCAAe,A,C;A,G,CAEpC1X,kBAA0B0X,OAAH;MAAGA,UAAc,A,C;A,C,C,CAGxC,gBAAkC,MAAGuK,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAI7C,cAA6B,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAExClU,cAAkBkU,OAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE5B,YAAa,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,C,CA/BxBtgB,gBACQ,KAAA,0CACR,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,G,C,M,C,A,E,kB,iB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CEvoFFiF;EAEaqK;OrC4mDJvO,QAA8B,0CqCvmDrC;sBzCiQsCjC,gCyC9PhC,GAHN,UzCmQiBkI;MyCjQf5B;;;GAEMgT,YACFhT,UAAuBgT,kBAG7B,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAnT,uBrC2lDSlE,QAA8B,0CqCxlDrCvD;mBAGA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAgB;;;;;;;mBASE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAjBc,cACV4G,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,c,a,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCpDF4V;EACMuF;KACF,MAAOC;KAEP,MAAOA,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CNiFEzhB,oBACmB,O3BzBjB;wB2BiCA;SACF,A,C;A,E,C,CO/FF,qBAIE;KAAa,UACXuB;EACwBA,OAAhBmgB;OACV,AAEAC,UACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAEA;IAEIC,gBADF,OCJEC;iBDQAH;KAAgBA;SAGpB,A,C,Q,C,I,C,C,C,C,C,G,C,C;A,E,C,CAEA;;8BAIoBC;MAAhBD;MCjBAG;yCDoBgBF;MAAhBA;QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA2BA;GACmB,iBAGfG,UACA;aAEFA;KACIA,YACN,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CEyCE9hB;qDCfU+hB;MAARC;2DAAQD;MAARC;ODkBA,SAGF,A,C;A,E,C,CAodF7N;WACmC;MAElB8N;;;4CACS,QACtB;kBAHF;;kBAKEH;cAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CEhDA,aAAkC,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAGlC,cACEA,aACF,A,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,I,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,WAAA,OAAyB,A,C,Q,C,I,C,C,C,C,C,G,C,C;A,E,C,CCjjBzBI;IAIIC,SAAUC,uBADZ;;kBAGEC;eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIA,kBAIqBC,MAIjBC;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAC,cAAwE,qBAEzB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAI/C,gBACqBF,MAIjBC;QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,CvCAEviB;GACmB,gBAGf,MAAO8hB;MAET;MAAOA,QACOA,YAChB,A,C;A,E,C,CmC3CIW,oBKsLgC,QAAVC,ULnL1B;MAAO,MADU,WAEnB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CMyXEzhB,sBAIEgH;MACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAoSF,oBAEE0a,oBAWF,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3jB;GACoB,aAAS,MAAOyO;EAEvBqU;MAEFrU,UAAP;iBA/SAqU,QAmTJ,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA9iB;GACoB,aAAS,MAAOyO;EAEvBqU;MAEFrU,WAAP;iBA1TAqU,QA8TJ,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA9iB;GAEoB,aAAS,MAAOyO;EAEvBqU;MAEFrU,aAAP;iBAtUAqU,QA0UJ,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAc,kBAEE,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC,kBAEE,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC,kBAEE,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,kBAIEC,KAHc,SACRtB,WAGR,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAgB,oBAKE,MAAOZ,QAHO,SACDJ,WAGf,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAWA,kBC7vBEuB,QD+vBF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,YACElB,aACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEAA,yBAMEmB;;EAQiC,8BASjC;uBACF,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,wC,C;A,G,CJrwBEC,WAA2C,eAAoB,A,C;A,E,C,CAE/DrkB,kBACKskB;mCAD2B;OACf,SAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAG9C,iBACEA;mCAAAA;QAAY,IACd,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAtkB,iBAAuBskB;mCAAJ;MAAiC,CAAjB,SAAqB,A,C;A,E,C,CAExDtkB,iBAEEskB;mCAAAA;QAAY,IACd,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAtkB,iBACKskB;mCADuB;MACmB,CAA9B,SAAkC,A,C;A,E,C,CAInD,WAAA,OAAkB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAIlB,WAAA,OAAmB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,M,C,C,G,C,W,C,C,C;A,E,C,C;A,G,C,W,C;A,G,CAiEnBtkB,WAAkB,SAAQ,A,C;A,G,CAgB1BA,WAAmB,MAA4B,CAAjB,AAAPukB,eAA4B,A,C;A,E,C,CAMnDC,iBACMC;GAAY,QAAS;EACJ,UAAdA;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAiBA;EAGwChB;EACJA,OAClCiB;QACArf;QACqBoe;QAArBA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAkBAnO,eAEgBmO,YAAmC;GAE7CA,QACFA;KAGAkB;IA5D0B,AAAPJ,gBAaQpB,eAmDzByB,WAGN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOAvG,cAlG8C,CAAjB,AAAPkG,eAoGlB,4DAGF;kEACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA,iBACM,AA/EoBA,gBA+ECM,KAAAA,UACzBC;WACF,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,G,C,C,C,C,C;A,G,C,CAEA,iBACM,AApFoBP,gBAoFCM,KAAAA,UACzBE;aACF,A,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzP;EApHsBiP;GAAwB,CAAjB,SAuHzB,MAAOE;GAEL,UAAqBI,KAAAA,UACzBN;QAAO;EACaS,SACpBC;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAYA,cACEH,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,cAEEC,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,iBAE6BG,OAC3BA;YACAX;QAAO,AAAPA,kBACAY;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA;EApIuBZ;GAAwB,CAAjB;EAaCpB;YA6Hf;EAGG,GAOjBoB;QAAO,GAEP;KAAO,aAEDd,WACFA;mCAAAA;MAAyB,IACzBpM;WACAoM;;EACOA;GACHA,QACFkB;EAEFlB;mCAAAA;MAAyB;WAElBA,OAEX,AACAc;QAAO,AAAPA;GAxJ6BpB,eA2J3ByB,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,cApM8C,CAAjB,AAAPL,gBMvCGA,AN6OPE,eAEdA,AAAAA,gBAEFW;KAAYC,SACd,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CASA,kBA/K+BlC;YAgLf;GAjMGA,gBAmMfoB,QAAO,AAAPA,SAEAd,AADsCN;eAEtCoB;QAAO,AAAPA;GArL2BpB,eAuLzByB,SAEF;OAEFU,0BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBAhM+BnC,eAiMf,MACdmC;4BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cACM,AAxMyBnC,eAyM3BmC;KAMAb,AAAAA,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAtBmB,YACfhB,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKiB,YACfA,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAKmB,YACfA,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CAeJ,mBACE;MAAuCN,QAClC,WACOoC;yBAEV9B;QACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAuCN,QAClC,WACOoC,QAEV9B,wBACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,iBA5O+BN;GA6OzB,SACF,KACK,WACOoC,QAEV9B,UACF;KAIAgB,AAAAA,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CV7SY;IAENjd,UAAiBge,4BADnB;;kBAGEhe;gBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CgBnFF,oBACOkc;GAAD,AAoDmBa,cApDS,KAAA,gCAChCb;QACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,E,C,C,C,C,C;A,E,C,CAEA;;EAEOA;GAAD,AA8CmBa,wDA7CvBb;UACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,6B,C;A,G,CA8CA1jB,WAAqB,MAAU,AAAPukB,YAAgB,A,C;A,G,CAExCvkB,WAAmB,MAAGukB,aAAgB,A,C;A,G,CAEtCxR,iBAGIwR;KAGAA,UAEJ,A,C;A,G,CAyCAkB,WAA4B,MAtDLlB,kBAsD4BmB,QAAgB,A,C;A,G,CACnEC,WAAgC,MAvDTpB,kBAuDgCqB,QAAkB,A,C;A,G,CACzExI,WAAsB,MAxDCmH,kBAwDsBsB,QAAgB,A,C;A,G,CAC7DC,WACI,MA1DmBvB,kBA0DIwB,QAA2B,A,C;A,E,C,CA6CtDzQ;;8BArByB2N,aACA+C,0BAuBvBC;UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,gB,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3Q;;EArBuB0Q;mCAEf/C,0BAqBNgD;UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,a,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3Q;;wCAlBU2N;wCAoBRgD;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CASAhO,WAEE,MAAOiO,SACT,A,C;A,G,CAEAC,WAEE,MAAOD,SACT,A,C;A,E,C,CAEA,YAEE3B,SACA2B;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cAEE3B,SACA2B;sBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,eAtJ+B,AAAP3B,WA0JpB6B,AAAAA;KAIAC,MAAyBH,QACzBA;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA1B;EAIoB0B,OAClBA;YAEA;WAAe,mBACEI,OACfA;SAGF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA8BA;;6CAQIC,YACA;SAEkBC,SACpBC;UACAC;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,oBAOsBF,SACpBG;YACAD;aACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;;;sDAyB4B,AApQJnC;;MAyQpBqC,UACA;UA9IE,AA9HmBrC,iBA8HE,gCACzBA;SAiJA6B,AAAAA;6BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,iBAvJM,AA9HmB7B,sDA+HvBA;SA8JA6B,AAAAA;+BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CA7NA5B,cAIEqC,WACF,A,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,G,C,mB,C,E,CAXArC,4EAGiE,A,C,E,CAGjEA;;SAKA,A,C,E,C,CA6GApiB,mBAIE0kB;;;+CAvL6B,AAAPvC,QA2LlBmC;KAEAK;KAGFje,8BAaJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C,E,C,CAyFA1G,mBAGE;KAEcikB,OACZA;WACAK;;GACiB;6BAAQ,CAC7B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C,E,C,CAUAtkB;;KACE;;GACM,CAAC0G,QAAoB;EACTA;iBAEWA,SACzBA,AAAAA;aACIke,QAAkBA,QACtB;kBAEqB;GAEI,AAAvBX,eAGFY,WACA;SAEUZ;MACI,CAACvd,AAAAA,mBAEUA,SACzBA,AAAAA;aACIke,QAAkBA,QACtB;;GAGE,sBF3BN5d;;;;;GE4HM,MACoB,AAAlBid,kBACiBa;SAEIpe;YAIzBF;GAE+B,AAA7Byd,cACFc;GAGU,QF/HdlE;OEgI4B;;;;;;;;6CApcC,AAAPsB,SA4chB8B;;;SAKFE,SACA;eAIYF,MACZA;iBAEYA;KAEZA;KAAmBW,QAAkBA;;IAIzC,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAtU4B,WACtBN,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAoCY,YAERI,aACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKS,cAEPA,eACF,A,C,Q,C,C,C,C,M,C,I,C,M,C,C,C,I,C,C,C,Q,C,Q,C,I,C,I,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmEoB,WACtBF,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAWwB,WACtBQ,yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAqEEpnB;aAE2B4iB,UAAcyD,aACAvd,eACrC;oBAHF;;;sBAME;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,iB,C;A,M,C,CAEA;EAC2BA;;EACDud;;GAEf,cAESzD,aAAoBoE,oBADpC;;;EAImCA;;;;;MAGjC;SAGqBX;WACQ;;EAEzBgB;;;SACqBzE,OACeoE,QACAA;SAEfpE,OACcoE,oBAPzC;;;EAUmCA;;;;;MAGjC;;;QAQN,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,qB,C;A,M,C,CAEA;;;QAGqBpE,WAASyD,0BAD5B;;;cAG4Bvd,KAAAA;;;;;SACDA;;;;sDAOzBud;;WAEAiB;0CAeJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAfwB,YAGlBZ,uBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAAY;;;;8CAKS;KACjBY;UAEFZ,kBACF,A,C,Q,C,C,C,C,M,C,I,C,M,C,C,C,I,C,C,C,Q,C,Q,C,I,C,I,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CC/ORa,cACE,uDACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA+JAjS;;EACyB;;IAER,4CAYFoO,QAKb;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASApO;;EACmB;;IAEF,4CAQFoO,QAKb;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA6CApO;;EACyB;;IAER,4CAYFoO,QAKb;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAIApO;;EACwB;KAEtB;qCAEWoO,QAKX;SACF,A,C;A,G,CAWApO;;EACyB;;IAER,qCAIJoO,QAKX;SACF,A,C;A,E,C,CAGApO;;EAE4B,6BAC1B;0CAIWoO,QAKX;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAkDA6D;iBACE;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA2BAA;iBACE;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAiDAjS;;EACsB;;IAEL,0CAIJoO,QAKX;SACF,A,C;A,G,CAWApO;;EACsB;;MAIL;0CAKJoO,QASX;SACF,A,C;A,E,C,CA2LApO;;;2CAC6B;EACP;;IAEL,4CAQJoO,QAKX;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CA/hBM;;QACEL;sCAOEM,aAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CARI,WAAG,MAAY,qBAAS,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CACxB,sBAEI6D,0BAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAKI,WACN9D,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAgBA,YACEL,mCAGEM,uBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAJI,WAAG,MAAGtM,uBAAc,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACpB,aAAK,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAKD,WACNqM,iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAoDA;;QACEL;sCAOEM,aAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CARI,WAAG,MAAGpM,uBAAY,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAClB,sBAEIiQ,0BAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAKI,WACN9D,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAWF;IAAW,MAAI,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEP,WACNA,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkBA,YACE8D,yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEQ,WACN9D,cACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAUA,YACElc,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEQ,WACNkc,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAyIA,YACE8D,wBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEQ,WACN9D,mCACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAoBA;;MAGA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEQ;QAEJA,cACA;OAEFA,mCACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAmMA;GACY,aACR8D,kBACA;WAEI,YACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEQ,WACN9D,4CACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CR9WJ+D;EACEC;GCjf4C,CAAjB,AAAPnD;;;2EAtFZrB;MAARC;;EAiIyBD,IAAzBO;MACAA;MACA;QACA;MACAA;KAAmC,AAAPc;GAsBdpB,SAEZiC,KAAYuC,KDya8C;SACvB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAMvChoB,YAAiB,MAAwB,CAAA,AlCjlBfM,KkCilBNynB,wBAAiC,A,C;A,C,C,CAErD1nB;;YAC8B;;2CACK,QAEjC;MAAiB4nB,QAAyB,QAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CASAtS,WACE,MAAOoS,AAAAA,qBACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,WACEA,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,WACEA,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,0B,C;A,E,C,CExfA,YAEEG,QAAUzB,AAAAA,cACZ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iCAEE0B;QAAW9B,OAAmCI,SAChD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,+BAEE2B;QAAU3B,AAAAA,cACZ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EAuDyB7B;GAA0B,CAAnB,SAtDb;EAIsB,CAAA,AAAtB,YAAjBA;;GAEI,OAAuB,AAATyD,iBAAkBA;GAyddzD,SA2BLA,WAtcgB,WAIH,UAjDO0D,QAAeC,YACtD,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAEA,kBA4CyB3D;GAA0B,CAAnB,SA3Cb;GA+CU,cAmC3BA;;GA/EM,SA2C8C,CAAtB,WA1CP,AA4fL4D,AA5fMH,iBAElBA,AAAAA;OAGO,CAAA,iBAAPzD;;IAoCwB,UAnCN0D,QAAeG,cAIzC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA9S,iBAIS,CAAA,AAAPiP,uBAAAA;;GAuBiD,CAAnB,SAtBb,MAAO8D,QACxBC;SACA;MAAOD,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CA6BAroB,WAAkB,MANW,AAAPukB,cAMQ,A,C;A,E,C,CAE9B;EACS,CAAA,AAAPA,cAAAA;;GAVoD,CAAtB,aAY5ByD;GA0ZoBzD,SA2BLA,WAlca,UAeZyD,YAClBK;QAAgBhD,UAClB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAyBA,oBA5CyBd;GAA0B,CAAnB,SA8Cb;GAzCS,KA2CxBO;KAEAyD,uCAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,oBAtDyBhE;GAA0B,CAAnB,SAuDb;GAlDS,KAoDxBQ;KAEAwD,4BAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,iBA/DyBhE;GAA0B,CAAnB,SAiEb;EACV,CAAA,QAAPA;;GA7D0B,KA+DxBU;KAEAsD,cAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMA,YAEA,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,YAEA,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEAjT,YAEA,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUA;EAC8B0S;mCACIA;UAChCQ;EAlGuBjE;IAAO,aAoGrB,CAAA,SAAPA;;GACI,MACFyD,AAAAA,kBAGN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIA,kBAlH4BzD,OAuH1BA;QAAO,CAAA,SACP6B,AAAAA;WAAsByB,UACtBtD;QAAO,CAAA,AAAPA,uBACAkE;QA1HwD,CAAvB,UA2HnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EA7H4BlE;;GAUiC,CAA1B,UA0I/BA,QAAO,CAAA,SACP+D;SAIEI;gBAGFA,UAEAD;QA9JsD,CAAvB,WAgKnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,WAcEH,SACA/D;QAAO,CAAA,AAAPA,eAIEoE;wBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CASA,kBAhM4BpE,OAmM1BA;QAAO,CAAA,SACP9b;UACA8b;QAAO,CAAA,AAAPA,uBACAkE;QAtMwD,CAAvB,UAuMnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYA;EA9MyBlE;GAA6B,CAAtB,WAkdZ4D,AAlQCH,oBACV,CAAA,iBAAPzD;;GAtNsD,CAAvB,YAS/B,SAAeyD;WA8cCG;;QA/PP,CAAA,iBAAP5D;WAKJ,gBA3NiD,CAAnB,UA6N1ByD,YACA;SAhOoD,CAAvB;cAoO/BzD;QAAO,CAAA;KAEL2D;KAEAE;EAEK,CAAA,AAAP7D,uBAAAA;UAEF,GAvOoD,CAAtB,WAwOX,MACjByD,AAAAA,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,6B,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CA7GE;;EAjIuBzD;GAA0B,CAAnB,WACI,UAmIK,MACrCA;KAAO,CAAA;EACF6B;GAAD,CAACA,WAEHnD;OACS6E;;EAAAA;;KACT1B;KAEAA,UAEF7B,KAAO,CAAA,AAAPA,qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAsBA;;EApK2BA;IAAO,UAuKV,MACtBA;KAAO,CAAA,SACP6B,AAAAA;QAAiB2B,KACjBxD;KAAO,CAAA,AAAPA,qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA4EFkD,wBAKoCmB,eAClCnF;OACAA;SACAA;OAEA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIAoF;;;;wCACE;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,G,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,W,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CAwGA,YACEC,KAAmBpgB,QACrB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CASA,YACEogB,KAAoBC,QAAOC,SAC7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAMA,YACEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAG,WAAuB,OAAO,A,C;A,G,CAE9B,2DAEA,A,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAsCA,kBATwB1E;SAUL;GATgB,MAa/BA,SACA;OAEF2E,sBAMA3E;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAPoB;;EACDA,IACfA;;SACiC,MACjC4E;aACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,CAsBFnpB,YAAiB,MAAGmoB,eAAwB,A,C;A,C,C,CAE5C,oBACMA;YACkBA,SAApBiB;eAEmBjB,QAAnBA;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EAEwBiB;EACFhkB,OAApBgkB;;WAEEjB,YAEF/iB;QACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,eAhEwBmf,YA2BLA,SAuCG4D;YAApBiB;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,G,C,C;A,G,C,c,C;A,M,C,CCzqB4B,WAAG,MAAG1F,0BAAuC,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQxE,cAA+B,MAAG2F,yBACQ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAOf,WAAG,MAAG3F,mBAAsB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAuBxD+D;;;;;;;gBAMEjgB;OACAA;SACAA;OACA;SACF,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQA,cAEE8hB,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,+B,C;A,E,C,CA+BA,iBDiG+C,CAAjB,AAAP/E,eChGN;oCAEjB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBD4F+C,CAAjB,AAAPA,eC3FN;iCAEjB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIA,iBACMgF;WAAuB,MAC3BA;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,iBACMA;WAAuB,MAC3BA;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEAjU,iBACMiU;GAAc,SAEhBA,YACA9F;OAEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAIA,YACE+F,AAAAA,mBACF,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cAjEEF,aAmEF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,WAjEEA,UAmEF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,CAtDAG;EAEyCC;EACSC,UADhDJ;QAAgBC,AAAAA,AAAAA,gBAE+BI,cACjD,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAgEA;;MAGgBC,sBADd;;kBAGEP;SACA;iBAGAA,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAeA;;MAGkBQ,sBADhB;;kBAGER;SACA;OAEFA,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CA+EA;GACiB,KAAXhR,YACFgR;EACW,KAAXhR,UAAAA;;GACe,UAGbgR,QAGN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CAjBAS,iFAKA,A,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAkDA,iBACiB,KAAXzR,YACFA,QAAU,KAAVA,UACA;OAEFgR,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CAbAU,2DAI6B,2BAC7B,A,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,kD,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,oB,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,M,C;A,G,CEuFA/G,WAAe,MAAGgH,SAAiB,A,C;A,E,C,CAInC9pB;EACqB8pB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,iBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/pB;EACqB8pB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/pB;EACqB8pB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,iBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/pB;EACqB8pB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,mBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAnG;EACqBkG,OACnB;OAAOC,AAAAA,yBACIA,QACX,AACA;MAAO,qBACuBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAlG;EACqBiG,OACnB;OAAOC,AAAAA,yBACIA,QACX,AACA;MAAO,qBACuBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjG;EACqBgG,OACnB;OAAOC,AAAAA,yBACIA,QACX,AACA;MAAO,qBACuBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EACqBD,OACnB;OAAOC,QAAAA,iBACIA,QACX;EAC8CA,QAE9ChB,AAD6BgB;kCAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAtG;EACqBqG,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,iBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAWA;EACqBD,OACnB;OAAOC,QAAAA,kBACIA,QACX,AACA,AAACA;2BAC6BA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjH;EAEqBgH,OACnB;OAAOC,QAAAA,iBACIA,QACX;EAC8CA,QAC9C;MAAO,AAACA,qCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAsBAlqB,YAAqC,MAAGmqB,cAAcC,QAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1EjqB;MAEWkqB,UAAP;oBADF;;kBAGE;MAAOC,eAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAnqB;MAEWoqB,YAAP;oBADF;;kBAGE;MAAOD,eAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAnqB;MAEWqqB,cAAP;oBADF;;kBAGE;MAAOF,eAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAvG,oBAC4B0G;KAExB;KAEA,wBAEJ,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzG,oBACiC0G;KAE7B;KAEA,wBAEJ,A,C,mB,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzG,oBAEkC0G;KAE9B;KAEA,wBAEJ,A,C,mB,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAvBW,WAAG,MAAG,mBAA0B,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEhC,WAAG,MAAG,mBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAOzB,YAAM,MAAG,qBAAoC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAE7C,YAAM,MAAG,qBAA6B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQtC,cAAa,MAAG,uBAA4C,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAE5D,cAAa,MAAG,uBAAqC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,G,CAkBhE1H,WAEE,MAAOiH,AAAAA,eACT,A,C;A,C,C,CAEAvjB;EACekI;EAAAA;YACSA,QAAuB,QAEzB;MAAOqb,AAAAA,gBAG7B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAIA/pB,cACE,MAAO,6BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA8iB,cACE,MAAO,6BACT,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,iC,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA9iB,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA,cACE,MAAO,6BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAA,gBACE,MAAO,+BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA4jB,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,YACE,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAL,cACE,MAAO,6BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAMA,cACE,4BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAKS,WACPM,8BASF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CATyB;QACrB7gB;;;;;OAE6C0lB;GACnC,QACR1lB;aAGJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAqGmB,8EAIjBunB;gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,G,CAQFC,WAAmD,cACvB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CAC5BC,WAAmB,cAAW,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CAC9BC,WAA6B,cAAgB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CAC7CC,WAA+B,cAAiB,A,C;A,E,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C,C,C;A,G,CAChDC,WAA6C,cAAwB,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CACrEC,WAAuD,cACzB,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CAC9BC,WAAyD,cAC1B,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CAC/BC,WAA+C,cAAyB,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CACxEC,WAAmC,cAAmB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CAGtDC,YAAuB,cAAa,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,I,C,C,M,C,C,C,C,C;A,G,CACpCC,WAAqB,cAAY,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,oB,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,G,CAMjCtI,YAAgB,OAAO,A,C;A,G,CACvBuI,WAAqC,YAAiC,A,C;A,G,CACtEvI,WAAoB,YAAO,A,C;A,E,C,CAE3BjjB,YAAqC,MAAGoqB,gBAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEpEzjB,cAAwB,OAAO,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAI/BxG,cAA0D,MACtDsrB,0BAA6D,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEjExI,cAA6D,MACzDyI,0BAAsD,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,iC,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAE1DvrB,YAAiB,MAAGwrB,wBAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEjDxrB,cAA8B,MAAGyrB,0BAAuC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAExEzrB,gBAA6C,MACzC0rB,4BAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEnD9H,YAAmC,SACW,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE9CC,YAAgD,SACG,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEnDC,YAAyD,SACL,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEpD,YACE6H,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAlI,cAA+C,MAC3CmI,0BAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKnD,cCj2BA5H,ODi2BwB;OAAqC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C,A,E,mB,kB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CIt2B/DnkB,cAA0B,MAAK,WAAI,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEnCL,YAAwB,MAAGqB,SAAU,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C9CD7BG;;wBAME;iBAoBN;MAAO,iBACT,A,C;A,E,CAEMA,cAA2B,mDAAwB,A,C;A,E,CAq4BnDA,YAA2B,iDAAqB,A,C;A,E,C,C+CrhBxDjB;GACM8rB,eAAsC,aAC1CA;;;IAGEC,kBAEAD,iBAEM,SAAA;YAAA;SAAR;M5C5I2Brf,M4C6I7B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA;EAiBgBzL;;GAGd;eAAc,MAAwB;GAChC,CAAC2Y,MAAe;MACHA,OACjB1F;;GACsB,AAAZ9O,eAEZ,GASI,CAACwU,UACO,KAA4B;;EACrB1F;;EACGA,eAEN0F;GAEV,CAACA,UACO,MACR1F,cACA;;;EAGkBA;GACY,AAAtB+X,kBAECrS,UAIX;KAAOA,iBAEMA;GAED,OAQR,eAAc,MACD;;EACyB,KAA1B1F,KAAAA;6BAA0B;SAEtC,AACAA,aACA;QAEJ;;GAIqD,AAA3B,AAAtB+X,SAAwBC,eAOtB,EAAe,AAAbhY;mBAQZ;eAAc,MAA+B,AAAbA;;EACM,KAA1BA,KAAAA;6BAA0B;;;SAKtC,GACY,QACVA,SAEFA;SACAA;UACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C/ChEQhT,2CAME;wCAMA;oBAcN,MAAO,iBACT,A,C;A,E,CA20BMA,kBAME,wDAqBR,A,C;A,E,C,CgD5vCAiB;IACE;iBAAkB,EAAEyU,gBACJA;;yBAAwB,cACxC,EAEa;IAEXA,cACArP;;MAEA4kB;qBASA5kB;;8BAGAqP;QAGF,M7CwKyBlK,S6CvK3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,kB,C;A,E,ChD3CAhN,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,G,CAE/BzD,YACE,2CACF,A,C;A,G,CAEAA,YACE,MAAO,oFACT,A,C;A,E,C,CAEAT;wBA8L8B,mBA5LZqsB,OACd;kBAiNW,6DA/MAC,OACX;kBA8MW,kBA5MAC;WACO,QAElB;MAAqC,AAA9BC,WAsOEC,mBApOb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAzsB,kBACS0sB,SAAAA;UAAP;MT0M6BlsB,0BSzM/B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cACEoB,uBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEA4M;wBAqK8B,mBAnKZ6d;;;eACd,2DAEWC;;;eACX,gBAEWC;WACO;IA+MTE;EA7MGD,YACZ;MAAc,YAA8C,MAEhE,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;wBAqJ8B,mBAnJZH;cAC4BM,MAArBN;UACrBO,iEAEWN;cACsBK,MAAfL;UAClBM,sBAEWL;cACsBI,MAAfJ;YACPE;;YAGTI,eACA3oB;QAAO,AAAPA,SACAyK;oBAEY6d;GACF,OAC6B;gBAGrCtoB;QAAO,AAAPA,SACAyK;gBAIR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CASAH;wBA+G8B,gBA7G1B,MAAOse,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IA2JTE;EAzJGD;GACF,IAAK,MAGftoB;QAAO,AAAPA,SACAyK;YAGA;yBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,eACc,AAARzK,WACyByK,YAAR4d;YAARD;YAAXD;YACAnoB;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;EACcwoB,SACZ;MAAyBxkB,aAAe,eAEtCmP;WAAY;OACoB1I,aACxB,KAAA,YAEV,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/N;EACM+N;GAAM,QAAS;QACIzK;;EAITmoB;GACF;UAGV;YAAkB,uBAIlB;EAISC;GACF;UAGP;QAAkB,wBAMlB,GAISC;GACF;UAGP;QAAkB;UAIhB;QAAkB,wBAIlB,CACF,CAGK5d,SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,+BAEIzK,QAAO,AAAPA,SACAyK;aAEFke,YACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAre;GACY,SAkCG,cAjCDue;WAEV7oB;QAAO,AAAPA,SACAyK;YACA;cAEA,OAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAaAhP,YAIE,MAAkC6a,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAwCA7a;WACsB;UAEpB;QAAkB,YACiB,aAAQ,QAC3C,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,C,CArCAyC,wBAIE;oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,E,C,CAEAA;YAYA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C,E,C,CAoBAA,oCAQEyqB;;gCAEA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA5QwC,YAAO,MAAG,eAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmB/B,YAAO,MAAc,MAAX,sBAAcnkB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAIpC,cACZ,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CAuPF/I,YAIE,MGpUyCye,mBHqU3C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAze;WACsB;UAEpB;QAAkB;yBACkC,SACpD,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,4B,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CAUA6O,iBACM,AAACwe,gBAAgB,MACrB;0CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAhtB,eACM,AAACgtB,gBAAgB,QACrB;sCACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAxe,iBACM,AAACwe,gBAAgB,MACrB;2CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEArtB,YAIE,MAAkCstB,sBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAttB;WACsB;UAEpB;QAAkB,YACZutB,qBAA4C,QAClD,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAhtB,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAlC3C6e;yDACiE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAd,gCAAI;SAAQC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAyC/DztB,YAAe,MAAGkP,AAAAA,YAAY,A,C;A,G,CAC9B7O,YAAiB,MAAG6O,AAAAA,gBAAiB,A,C;A,E,CAErC5N,kBACmC4N;aAAMA;wCAAvC;SACF,A,C;A,E,C,CAEA7O,cACE,MAAO6O,AAAAA,eACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EACcA;EAAAA,MACZ;mBAAwD,SACtDD;OACgCC,UACxB,KAAA,SAEV,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CAWAlO,WAAc,MAAGyI,SAAQ,A,C;A,C,C,CAEzBpJ;EACa2O;EACE0e;EACmBxe;OAAAA,UACxB,KAAA;QACU,aAChBzF,YACA;cAEAA,YAIAikB;WACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,wB,C;A,E,CAgEA1tB,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,G,CAE/BzD,YACE,2CACF,A,C;A,G,CAEAA,YACE,MAAO,oFACT,A,C;A,E,C,CAEAT;wBA8L8B,mBA5LZqsB;WACO,QAErB;MAAY,8DAEDC;WACO,QAElB;MAAY,mBAEDC;WACO,QAElB;MAAqC,AAA9BC,WA8MEC,mBA5Mb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAzsB,YACE,MAAOkI,4DACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cACEtG,uBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEA4M;wBAiK8B,mBA/JZ6d;WACO;MAErB;oBAA+BiB,0DAEpBhB;WACO;MAElB;oBAA+BgB,eAEpBf;WACO;IAmLTE;EAjLGD;GACF,IAAK,MAEf;MAAOc,aAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;wBA2I8B,mBAzIZjB;cAC4BM,MAArBN;UACrBO,iEAEWN;cACsBK,MAAfL;UAClBM,sBAEWL;cACsBI,MAAfJ;YACPE;;iBAGgBc;OAGbf;GACF,KAERc;YAEyBC,gBAKjC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA/e;GACME,WAAkB,MAAO;EACnB8e,UACV;aACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAhf;wBAsG8B,gBApG1B,MAAOse,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IA8HTE;EA5HGD;GACF,IAAK;kBAIfiB;UAGA;MAAOH,UAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,eACc,AAARppB,WACkCwpB,YAATC;YAARpB;YAARD;YAAXD;YACAnoB;SAuCF0pB;QAAsC,AAAL,AAAfA,oBApCpB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;EAC2BD;EACLC,OACpB;KAAY,UACVvW,SAAOiW,QAAWA;GACA,IAAGM,aACb,KAAA;EAEDN,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;gBAG+BC;KAE3BD,SAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA9e;WACqB;;WAED,MAClBif;;WAEA;MAAOH,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAUAO;;GAEMF,eACOD,SAATC;iBAEyBD,OACzBJ;MACQQ;QAARJ;UAEFxpB,QAAO,AAAPA,SAbA0pB;QAAsC,AAAL,AAAfA,kBAelB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA;EAC+BN;EACJA;WAGvBK;KAEAjJ;WAIAgJ;KAEAroB,QAEFnB;QAAO,AAAPA,SAlCA0pB;QAAsC,AAAL,AAAfA,mBAoCpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAaAjuB,YAIE,MAAkC6a,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAoBA7a;WACsB;UAEpB;QAAkB,WAEF,KAAV2tB,cAAkB,QACxB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAeAptB,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,C,CAb3ClM;;gCAUE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAzPwC,YAAO,MAAG,eAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAuBzC,YAAO,MAAc,MAAX,sBAAcsG,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAI1B,cACZ,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CAkOF/I,YAIE,MG3vByCye,mBH4vB3C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAze;WACsB;UAEpB;QAAkB,WAEF2tB;yBAAiB,SACjC,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,kC,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CAWA9e,iBACM,AAACwe,gBAAgB,MACrB;0CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAhtB,eACM,AAACgtB,gBAAgB,QACrB;sCACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAxe,iBACM,AAACwe,gBAAgB,MACrB;2CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEArtB,YAIE,MAAkCstB,sBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAttB;WACsB;UAEpB;QAAkB,WAEZutB,QAAQI,mBAAiB,QAC/B,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,M,C,C,E,CAlCAS;gEAEiE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAd,gCAAI;SAAQX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,O,C;A,E,CAkD/DztB,YAAe,MAAGkP,AAAAA,YAAY,A,C;A,G,CAC9B7O,YAAiB,MAAG6O,AAAAA,gBAAiB,A,C;A,E,CAErC5N;EACyC4N;aAAMA;wCA2B7Cmf;KAAQnf,IA3BR;SACF,A,C;A,E,C,CAEA7O,cACE,MAAO6O,AAAAA,eACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EAC2BA;EAAAA;EACLA,IACpB;KAAY,UACVD,SAAE0e;GACgB,IAAGze,UACb,KAAA;EAEDye,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CAaA3sB,WAAc,MAAGyI,SAAQ,A,C;A,C,C,CAEzBpJ,iBACwB6O;GAAH,AAAf+e,UAAkB/e,UACd,KAAA;OACGmf;YACT5kB,YACA;cAEAA,QAAW4kB,OACXA;QAAQA,AAAAA,aACR;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,K,C;A,E,CA+DA/sB,gCACsCgtB;wCAApC;SACF,A,C;A,E,CAEAtuB,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,E,C,CAE/BlE;wBAkLsC,mBAhLpBqsB,OACd;kBAuMW,6DArMAC,OACX;kBAoMW,kBAlMAC;WACO,QAElB;MAAwC,AAAjCC,WA4MEC,mBA1Mb,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA9rB;0BAmKsC;;KAjKlC,MAAO;EAEE4rB;WACO;IAmMPE;EAjMCD;GACF,IAAK,MACf;MAAO0B,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAGAluB;wBAsJsC,mBApJpBqsB;;;gCACOA;;IACrB,MAAOO,gEAEIN;;;gCACOA;;IAClB,MAAOM,qBAEIL;;;gCACOA;;MACPE;;;QAMC,AADED,gBACI;UAGlBtoB,QAAO,AAAPA,SACAiqB;YACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAA,QAAA,OACEC,SADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEApuB;wBAqHsC,gBAnHlC,MAAO8sB,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IAmJTE;EAjJGD;GACF,IAAK,QAGftoB;QAAO,AAAPA,SACAiqB;;aAIA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAoBA,eACc,AAARjqB,WACyBiqB,YAAR5B;YAARD;YAAXD;YACAnoB;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAtD;EACMutB;GAAU,QAAS;QACAjqB;;EAITmoB;GACF;UAGV;YAAkB,uBAIlB;EAISC;GACF;UAGP;QAAkB,wBAMlB,GAISC;GACF;UAGP;QAAkB;UAIhB;QAAkB,uBAGlB,CACF,CAGK4B,SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAnuB,iBA4Ce,WA3CuB;MAEpCkE;QAAO,AAAPA,SACAiqB;YACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAnuB,iBACY,SAmCG,uBAjCXkE;QAAO,AAAPA,SACAiqB;YACA;cAEA,SAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAcAxuB,YAKE,MAAkC0uB,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAwBA1uB;WACsB;UAEpB;QAAkB,WACiB,aAAY,QAC/C,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CAmBAA,YAIE,MGhrCyCye,mBHirC3C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAze;WACsB;UAEpB;QAAkB;yBACsC,SACxD,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,e,C;A,E,CAyEAgB,WAAc,MAAGyI,SAAQ,A,C;A,C,C,CAEzBpJ;EACiBmuB;EACFd;EACuBiB;OAAAA,UAC5B,KAAA;QACU,aAChBllB,YACA;cAEAA,YAIAikB;WACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAuEApsB,qCACyC2sB,0BAyXvCI;KAAQM,AAAAA,OAzXR;SACF,A,C;A,E,CAEA3uB,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,E,C,CAE/BlE;wBA+MsC,mBA7MpBqsB;WACO,QAErB;MAAY,8DAEDC;WACO,QAElB;MAAY,mBAEDC;WACO,QAElB;MAAwC,AAAjCC,WAiOEC,mBA/Nb,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA9rB;0BA4LsC;;KA1LlC,MAAO;OAEI4rB;WACO;IAwNTE;EAtNGD;GACF,IAAK,MACf;MAAO0B,AAAAA,kBAEX,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA;EAC2BP;EACLC,OACpB;KAAY,UACVvW,SAAOiW;GACW,IAAGM,aACb,KAAA;EAEDN,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAOA3sB,kBACM+sB;6CACJ;MAAOA,SACT,A,C;A,C,C,CAGA1tB;wBAwJsC,mBAtJpBqsB;;;gCACOA;;IACrB,MAAOO,gEAEIN;;;gCACOA;;IAClB,MAAOM,qBAEIL;;;gCACOA;;MACPE;;iBAGgBc;QAIf,AADEf,gBACI;OACSe,YAG3B,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAA,QAAA,OACEa,SADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEApuB;wBAuHsC,gBArHlC,MAAO8sB,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IAiJTE;EA/IGD;GACF,IAAK,QAIfiB;yBACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAmCA,eACc,AAARvpB,WACkCwpB,YAATC;YAARpB;YAARD;YAAXD;YACAnoB;SAyBF0pB;QAAsC,AAAL,AAAfA,oBAtBpB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA5tB,iBAEW,WAAS;KACautB,UAC/B;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAvtB;WACqB;;WAED,QAClBytB;;WAEA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUAc;;GAEMZ,eACOD,SAATC;iBAEyBD,OACzBJ;MACQQ;QAARJ;UAEFxpB,QAAO,AAAPA,SAbA0pB;QAAsC,AAAL,AAAfA,kBAelB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA;EAC+BN;EACJA;WAGvBK;KAEAjJ;WAIAgJ;KAEAroB,QAEFnB;QAAO,AAAPA,SAlCA0pB;QAAsC,AAAL,AAAfA,mBAoCpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAcAjuB,YAKE,MAAkC0uB,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAoBA1uB;WACsB;UAEpB;QAAkB,WAEE,KAAd2tB,cAA0B,QAChC,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C,C;A,E,C,C;A,G,C,e,C;A,E,CAyHA3sB,WAAc,MAAGyI,SAAQ,A,C;A,C,C,CAEzBpJ,iBACwBsuB;GAAH,AAAfV,UAAkBU,UACd,KAAA;OACGN;YACT5kB,YACA;cAEAA,QAAW4kB,OACXA;QAAQA,AAAAA,aACR;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,CiD/uDAruB,YAAe,MAAGwY,MAAAA,SAAc,A,C;A,C,C,CAChCxX,cAAwB,MAAGwX,MAAAA,WAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CCmCnDvX;+BAC+B;UAAwB,4BACb;;yBAExC,MAAA,kBAAA,aAAA;EAAgC;8BAAR4G;OAAqB,AAC7C,SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAIAtH,YAAkB,MAAGM,oBAAwD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CHgJ7EC,cAA2B,MAAG,qCAAuC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAErEA,cAAqC,kDAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKrET,mBACE;MAAA,cAAA,UACQ,KADR,UACoB,QACpB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAA,cAAA,OAAwB4O,SAAxB,OAAkC,CACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA4BA1O;EACyB;GACnB,CAACsuB,MAAqB;EACJ;UAEpB,SACkBA,O5COpB7hB;KAA6CA,a4CNlC6hB,MAAoB;KAE7BC,SAAgBD,QAChB;KAAOA,Q5CGT7hB,KAA6CA;M4CDzB6hB,O5CCpB7hB;KAA6CA,O4CA3C,CAEF,M5CSyBA,M4CR3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEA3M,mBACE;MAAA,cAAA,UACM4O,SADN,aACkB,QAClB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAhO,cAAwC,MACpC,+BAA0C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,CAI9CjB;EAGgB6uB,aACd;QAAO3U,UAEP,AACA;SACF,A,C;A,G,CAEA7Z,YAAiB,MAAG,CAACwuB,AAAAA,kBAAmB,A,C;A,G,CAExCxuB,YAAoB,MAAG,AAAC0uB,qBAAO,A,C;A,E,C,CAE/BjuB,cACE,MAAO,gCACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMAA,cACE,MAAO,gCACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAcAE;EACgB6tB;GACV,CAAC3U,wCAIL;KACWA;MACHA,MAAc,AACtB;SACF,A,C;A,E,C,CAUA1Z,uBACE;MAAA,cAAA,UAAA;GACMoX,iBAAe,SACrB,2CAGF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,e,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAgCA5W;2CAC6B,SAAW,KAAA,OAEtC;MAAA,kBAAA,UAAA;;GACgB,SAAM;EACX,SACX,KACM,KAAA,QACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAkBAT,YAAkB,MAAGyuB,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,CInW5C1tB,YAAyB,uB3DoQaC,qC2DpQe,A,C;A,E,C,CAErDP,cAAuB,MAAG,aAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAErC;EACe;6BAAA;GACb;KAAkB,SAChB0W,SAAO;GACI,IAAG,gBACN,KAAA,SAEV,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEArX,YAAiB,MAAU,MAAPO,cAAW,A,C;A,G,CAE/BP,YAAoB,MAAG,CAAC0uB,YAAO,A,C;A,G,CAO/B/tB,eACa,KAAPJ,gDACJ;MAAO,UAAY,KAAPA,eACd,A,C;A,E,C,CAQAP;EACe;;GACb;YAAoB;6BAAA;KAAF;GACJ,KAAR,eAAoB;GACb,CAAA,MAAG,iBACN,KAAA,aAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAaAA;EACe;6BAAA;GACb;KAAkB,YACZuX,SAAK,kBAAU;GACR,IAAG,gBACN,KAAA,SAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAiDArX;GACa,KAAPK,cAAa;EACK,QAAA;SACtB;MhD8GyBoM,MgD7G3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEAlM,cAAwC,4CAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE3EA,cAA2B,uCAAkC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA0B7DA,cAA4B,MAAG,qBAAsC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYrEG;iCAGa;UAAwBL,mBAEZA;6BAAAA;;;8BAEvB;YAAoBA;6BAAAA;KAAF;EACJ;8BAAZiH;WACF,AACA,SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,C,C,CAWA,oBACO,UAAA;UAAW,UAAhB;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,uBACE;MAAA,QAAA,UAAA;EACO,UAAA;UAAW,UAAhB;cACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAxH;GACE;YAAoB;6BAAA;KAAF;GACJ,KAAR,gBACF,YAA6B,KAAZ,gBAAyB,IAC1C;UAAY,KAAZ,cACA;aAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA8BA,YAAe,aAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAahC,c1DnQEe,SAAuB,KAATC,iB0DyQhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAkBA;GACY,UAAa,MAAE,iBACjB,KAAA,SAA+B;;GAE/B,UAAe,MAAE,iBACjB,KAAA,SAAiC,aAE3C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAJ;EACyB,UACvBC;;EACiB;2BACA;;6BADA;GAEjB;KAAkB,WACJ,SAAW;8BAAvB2G;OACF,AACA,SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/G,gBACEI,cACA;MAAO,kBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACEA;;EACiB,GACjB+tB;YAA4B,KAAZ,kBAChB;UAAY,KAAZ,eACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA;;GAtCY,UAAa,MAAE,iBACjB,SAA+B;;GAE/B,UAAe,MAAE,iBACjB,SAAiC;EAoCxB;GACN,UAAM;GAEH;;;WASA1tB,AAAAA;iCAZG;;EAeS6V;6BAAAA;GAAF,AAAT;;GAGA,IAEb,MAAoB,IAAO,SACzB,SAAW,IAAOA,MAAqB,KACzC;KAEA,QAAkB,QAChB,SAAW,IAAOA,MAAqB,KACzC,CAEJ,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA4BApX;EACoB;6BAAA;GAAH,KACb;GAKF;YAA6B;6BAAA;KAAF;GACb,KAAR,eACF,aAEJ,AACA,SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOAA;EAE6B,KAAZ,aASf;kBAA2B,WAAO,YACpB,KAAR,eACF,QAEJ,AACA;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA,sBAC2BY;6BAAAA;EAAF;UACf,KAAA,SAA+BA;OAE1B,YACX6tB,WACA;OAMF,UAAW,KAAX,cACAQ;UAAe,IAAK,eACpB;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA;WAC2BruB;6BAAAA;EAAF;UACf,KAAA,SAA+BA;;8CAG1BW;EAESA,OAItB;UAAY,KAAZ;6BAJsBA,OAKtB0tB;UAAe,IAAmB,eAClCC;eACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;;0EAE4B3tB;6BAAAA,OAAxB0tB;YAAsB,YAEtB,MAAA,QAAA,aACY,GAAV;WADF,QAEA,CAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIA1uB;GACM8rB,eACF;EAGW;IAEXA,aACAxkB;SACAA;YACAA;kBAECwkB,eAGH,MhDpPyBrf,SgDqP3B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CH5ac;GACL,KACDnF;;QAGFA;OACAA;UACAA;QACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,CjD0SJvG,gCAiTa6tB,QACcA,QACTA;wCAnTO;SAAkC,A,C;A,E,C,CAE3D;EAC0BtqB,OACxB;MAAaJ,QAAS,IAAGE,UAAmB,CAAA,AAAL,IAAsB,AAAdD,AAAAA,yBACtCA;0BAAAA,SAAPgT;SAAOhT;GAqMqB,IAAGG,aACzB,YApMR,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAxE,YAAiB,MAAGoE,WAASE,QAAK,A,C;A,E,CAElC3E,YAAe,MAAmB,MAAT,KAAN2E,QAAQF,SAAwB,AAAdC,AAAAA,kBAAkB,A,C;A,G,CAOvD1D;EACMyD;EAASE;;EACND;EAAmB,KAAL,UAAsB,AAAdA,AAAAA;qBAAtBA,SAAP;MAAOA,MACT,A,C;A,E,C,CAQA1D;;GACY,UAAa,MAAEJ,oBACjB,KAAA,SAA+BA;EAEhC8D;EAAQD;;EAAkBC;EAAH,CAAA,AAAT,IAA0B;mBAAxCA,SAAP;MAAOA,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAzD;+BAGW;UAAwBL,4BAEZA;;yBAErBwuB,UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,C,C,CAIA,cACEhsB,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;;0EAGmBrC;EACF;6BADEA;EAEJ;EAAc2D;EAAAA;GAAH,QAgON2qB;6BAAAA;;;wBAElB1qB;QAAQyqB,UACR1qB;SACAD;SRnZA5D;eQmLI8D;QAAM,KAANA,kBAG+BA;6BAAAA;EAAF;GAChB,KRvLjB9D,SQwLmC,QAC7B8D;QAAM,KAANA,kBAEwB,GR3L9B9D;SQ4LmC;EAC7B6D,OR7LN7D;eQ8LM8D;WAGJE,QAAkB,AAAlBA,eAEA,MAAA,QAAA,OAA4BzB,UAA5B,OAAyC,CAE7C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/C,qBACE;MAAaoE,QAAS,IAAGE,UAAmB,CAAA,AAAL,IAAsB,AAAdD,AAAAA,yBACjCA;0BAAAA;GACA,KADAA,SAEV4qB,UACAzqB;QAAkB,AAAlBA,SACA;UAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAuCA;EACMJ;EAASE;GAAH,OACR,MAA+CD,UAAAA,WAAc,IAAvC,QAAsB,CAAA,AAAL,+BAAQA,SAC7CA;UACF,AACQC,SAARF;SACAI;QAAkB,AAAlBA,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGAtE,YAAkB,MAAGM,oBAAwD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAiE7E;EACE6D;EAAOC;gCAAPD,SAAAA;;EACoB,CAAA,AAAL,IAAsB,AAAdA,AAAAA,qBAAvBC;;GACIF,YAAgBG,SACpBC;QAAkB,AAAlBA,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYA7E;EAC2B,AAAd0E,AAAAA;GAGO,AAFmB,CAAA,AAAT,EAAED,eACK,KAAV,KAANE,eAIjB,MAAYF,UAEVC,uBAFO,aACkB,CAAA,AAAL;mBACpBA;EAAYA;mBAAZA,SAAAA;OAEF,cAFEA,SAGFA;SACAD;QAAoB,CAAA,AAAL,UACf;MAAoB,CAAA,AAAL,kBAEK,KAAL,KAANE,aAATA;SAEA;MAEED,uBAFO,aACkB,CAAA,AAAL;mBACpBA;EAAYA;mBAAZA,SAAAA;OAEF,cAFEA,SAGFA;SACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA;QAC+C,AAAdA,AAAAA;;;EACnBA;EAAgBD;EAAF,AAAdC,URtXZ7D;;EQwXiC4D;EAAOC,ORxXxC7D;SQwX+B,QAC/B4D;SACAE;QAAQD,AAAAA,cACRA;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA1E;EAEMyE;EAASE;6BAAAA;GAAH,QACW;EACQD;EAAQD,ORlYrC5D;eQmYE;gBAEoB6D;EAAc,AAAdA,URrYtB7D;;EQuYiD8D;6BAAAA;EAAOD,ORvYxD7D;SQuY+C,QAC7C;MAAa,MAAN8D,YAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAnTA4qB;;;mBAOE7qB;oBACF,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,G,C,I,C,E,CARA6qB;;SAQA,A,C,E,C,CAmNA9sB;;EAEyB,CAAN,AAAA,WACjB;eAC0B,CAAA,EAAU;SACb,SAEvB,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,kB,C;A,E,CA+GAzB,WAAc,MAAGyI,SAAQ,A,C;A,C,C,CAEzBpJ;EACEmvB;GA9G8B,AA8GJ3qB,UA9GOA,UACzB;EA8GJ4qB;OAAaC,SACfjmB,YACA;WAES+lB;;cAAAA,SAAX/lB;QAAW+lB,IACXC;QAA4B,CAAA,AAAL,IAA6B,QACpD;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,e,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CqD/nBAzvB;EACM2vB;WAAe;EAMMC,OAIzB;0BACSC,QAASlJ;;GACP,YACHA;;EACGkJ,QAASlJ;GACP,aAEiBA,IACxBA;KAAemJ,IACfA;;GAEInJ;UAGNoJ;EAEUpJ;;YACI,YACVA;;EACGkJ,QAASlJ;GACP,aAEiBA,IACxBA;KAAgBmJ,IAChBA;;GAEInJ;UAGNqJ;EAEUrJ;;KAId,AAEAqJ,KAAarJ,IACboJ;KAAapJ,IACbA;KAAeiJ,IACfjJ;KAAgBiJ,IAChBD;SAEAC;SACAA;SACAK;QAAW,AAAXA,SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAsBAC,mBAEE;UAAOvJ,KAAc,aAEnBA,KAAgBoJ,IAChBA;OAEF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAG;GACMP,cAAe;GAEV,CAAA,KADEQ,cACI;EACSR,OACxBS;QAAM,AAANA;EAEIT;EACMA;WAARA;OAIQU,UAARV;SAGAA;OAEF9qB,QAAkB,AAAlBA,SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQA,qBACEurB;QAAM,AAANA,SACAvrB;QAAkB,AAAlBA;GACI8qB,eACFA,SACA;SAGO;EACKA;MAAZW,MACAA;KAAaX,IACbA;eAEAW,MACAA;KAAYX,IACZA;UAEFA,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAmGA3vB,cAA6B,MAAGuwB,cAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAIvD1hB;GAEM,AAACwe,gBAAgB;GACX,AAANsC,iBAEO,KADEQ,cAGT,MAAOK,AADqBb,UAIhC;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA9gB;GACM,AAACwe,gBAAgB;EACOiC;GAChB,QAAS,MAAOkB,IAC5B;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;;EAIaL;GACF,WAEPK,AAD4Bb,WAE5B;OAEFc,qDACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAyBA,cACExuB,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA5B,YACE,MAAQsvB,eACV,A,C;A,G,CAEAtvB,YAAoB,MAAG,AAHbsvB,eAGqB,A,C;A,E,C,CAE/B;;qCAsI2Be,QACPA;mBApIlB;KAAOC,UAC0BA;SAC/B1hB;SAAEqhB,SAAUA,SACd,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAEAtwB,YACE,MAAOowB,SACT,A,C;A,E,C,CAEA,YAvKET,YACAS;SACAvrB;QAAkB,AAAlBA,UAuKF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAxE,YACE,MAAOgtB,kBAA8B,KAAZ8C,cAC3B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA9vB,YAcE,MAAOuwB,iBAZiBX,gBAYXN,SACf,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEA7uB,YAAqB,2CAAqC,A,C;A,G,CAE1DA;wCAAuB;SAA0C,A,C;A,E,C,CAEjEP,YACE,MAAOoO,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CArKAkiB;;;+EAEqE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAd,gCAAI;SAAQpD,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CA8GnD,cAAmB,gBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAiCpDptB,uBACE;+BAAY,aACK,KAAXiwB,OAAqB;GACH,IAAGL,UACjB,KAAA;EAEJK;GAAW,SAAWM,oBAAmB;EACtCN,KACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,E,CAsHFhY,iBACMwY;WAAsB,MAC1B;MAAOC,YACT,A,C;A,E,C,CAEA,iBACE;MACEC,QADU,UACVA;EACOV,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAsBAjwB;EAC4B4wB;GAAH,AAAnBpsB,UAAsBosB,UAClB,KAAA;EAOJD;G7D5PcpwB,c6D6PhBkwB,YACA;YAEoB,AAAlBG,OAAqBhB,SAA4B,AAAba,iBACrBA,O7DlanBlwB;;W6D4YEswB,QAAwBD;KAExBA,KAAaE,QACbD;QAAwBD,AAAAA,+BActBD;EAOWA,OAAfF;SACAI;QAAwBJ,QACxB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAvEAM,cAIEF,QAAwBR,MAC1B,A,C,C;A,E,C,C;A,G,C,O,C;A,E,CA2EA1wB,YAAe,MAAGixB,AAAAA,YAAY,A,C;A,G,CAC9B5wB,YAAiB,MAAG4wB,AAAAA,gBAAiB,A,C;A,E,CACrC3vB;EAAyD2vB;6BAhF9BP,KACPA;;oBA+EK;SAAsC,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAO/D1wB,YAAe,MAAGkP,AAAAA,YAAW,A,C;A,G,CAC7B7O,YAAiB,MAAG6O,AAAAA,gBAAgB,A,C;A,E,CACpC5N;EAA8D4N;6BAzFnCwhB,KACPA;;oBAwFK;SAA0C,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CAKnEjD,YAAiC,MAAG6C,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CAK5CzhB,YAAoC,MAAGyhB,SAAU,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,M,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CAQjDJ,YAAiD,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,M,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C,C,A,E,gB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCnkB1DmB,8BA+CE;MAAOC,eAAaC,uBACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CApEMC;;;;+BAIJ;;KAKQ,KAAA,iBAGR,MAAOH,WACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CCmSA5kB,YAAmC,MAAGnB,QAAe,A,C,Q,C,I,C,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CD1RpB,cAAa,SAAGvC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAE/CwoB;+BAGI;kDASA;iBAAkB,EAAExwB,kBAOQuwB,WAAUC,kBACtC,AACA;;EzDmlDG/tB,QAA8B,+ByD7kDnC;iBAAkB,EAAE+E,gBACLA,IACbtI;QAAWqxB,WAAYC,oBACzB;gDAQEtxB,kBAAmBqxB,qBAAoBC,gBAEzC;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,K,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CClEAhxB,eACY,AAANkxB,cACF;KAEA,8DAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CARAC,mCAAkE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAqBlEnxB,YAAkB,uCAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CADrDoxB,oCAA6C,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CA0E7CnxB,cAEuB,MAmKUgxB,QAAkBI,AAnKrBC,eAE9B,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,gB,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAaAtxB,cAE2B,MAgEvBuxB,QAA8BC,AAhEAC,eAElC,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,oB,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,G,CAEAC,WAC4B,YAE5B,A,C;A,G,CAEAC,WACwB,YAExB,A,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA+QA,kBACMC;GAAAA,eACI,KAAA,QAERA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA;GAIM,CAACC;EAVDD;GAAAA,eACI,QAERA;;MAUqBE;GACb,CAACD,cACG;KAAA,QAERD,qBALF;;KAOQ,KAAA,aAGZ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAQA9xB;;2BAEQ,CAACiL,YAAiB,QACtBqe,AAAAA;WApFK9iB,WAqFL;yBAEA8iB,AAAAA,kBACA;yBAEAA,AAAAA,mBACC;0BAEDA,AAAAA,kBACA;wCAEAA,OAAAA;UACA2I;SACA3I;UACA;;wEAEA4I;EAEA5I,OAAAA;;GACa,KAATtoB,YACFmxB,QAAenxB;GACf;YAAoBA;6BAAAA;KAAF,UnDnNtB2L;KAA6CA,QmDqNvCwlB;QAAenxB,cACjB,CAEFsoB,SACAwI,AAAAA;eACA;2DAEAI;EAEA5I,OAAAA;;MAEA8C;wBAWA9C;SACAwI,AAAAA;eACA;cAEA,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,M,C,C,G,C,2C,C,E,C,CAtJA1vB;;EAEwB,QAEtBgwB;aANgB,iBAOhB;MnDrFyBzlB,MmDsF3B,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,C,E,C,CAcAvK;;EACqBuW;;6BAAAA;;GAGnB;KAAkB,WACDA;GACF,MAEX0Z;iBAGEA;;OAGAA;;QAGAA;;QAGAA;;QAGAA;;QAGAA;EACwC,AAAP,SAAjCA;OA7BwB,KAAU,KAAS;EA8BJ,AAAN,QAAjCA;OA9BwB,KAAU,KAAS;EA+BJ,AAAN,QAAjCA;OA/BwB,KAAU,KAAS;EAgCX,IAAhCA;OAhCwB,KAAU,KAAS;mCAqC7CA,UACAA;;UAEAA,UAEJ,AACAC,OAAuB,WACzB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAuEc;;;GACJ,QACFhJ,IAAAA;mBAEAA,IAAAA;WAEF2I,SACA3I;WACA6I;;OAEF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CClcJjyB,YAAgB,cAAU,A,C;A,G,CAqB1BqyB,WAAyC,kBAAoB,A,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAkB7D3xB;;EAGuE,KAAde;6BAAc;;;GAGrD,AAFEgwB,SAA+BhwB,WAE9BA,QAKEgwB,KAJAhwB,MAAgC,KAAdA,cAOvC;MAAOgwB,aAA2BA,MACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CAqDA3xB;EAOIwyB;EAAQC;IA8MA,oBAGF,AADA,OAAkC,AAAA,CAAzB,iBACD;EAjNM,GAAZA;;;cAARD,SAAAA;KAA+B,CAAA,IAAQ;EACnB,GAAZC;;cADRD,SACAA;KAA+B,IAAgB,AAAP;EACpB,GAAZC;;cAFRD,SAEAA;KAA+B,IAAe,AAAN,QAChCC;QAAY;cAHpBD,SAGAA;KAA+B,IAAQ,IACvC;gBAOoB,GAAZC;;;cAXRD,SAWAA;KAA+B,IAAoB;EAC/B,GAAZC;;cAZRD,SAYAA;KAA+B,IAA2B,AAAN,QAC5CC;QAAY;cAbpBD,SAaAA;KAA+B,IAAoB,IACnD;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAWA7yB;GACY,QAgLA,AAhL2B+yB,OAAmB,4BAGnD;;EAyBCF;;;GAtBN;KAAsC,WACrBE;GAEF,UACPD;GAAa,UACTA;QAAY,GAApBD;gBAqKM,qBAnKe,AAAJ,AAAbC;EAG0C;GAC3BE,UADAD,sBAKV,WACHD;EAAa;GAAI,UACbA;;cAKRD,SALAA;KAA+B,IAAQ,KAC/BC;QAAY,GAApBD;KAA+B,IAAQ,YAGnCC;GAAiB,AAAJ;EACG,GAAZA;;cAARD,SAAAA;KAA+B,IAAQ;EACnB,GAAZC;;cADRD,SACAA;KAA+B,IAAe,AAAN,QAChCC;QAAY;cAFpBD,SAEAA;KAA+B,IAAQ,MAG7C,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,M,C,C,G,C,I,C,C,C,A,E,a,Y,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CpD1KApwB,YAE8B,OAM9B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CqD8BAA,cAA+C,MAAGpB,WAAc,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CChBhEoB;sDAEI,MAAO6I;sCtD+KP0B;SsDlKA;MAAoBhL,oBAAF,WACDA;GACF,mBtD0K4BgL,UAA7CA;yBAA6CA,UAA7CA;wBAA6CA,UAA7CA;cAA6CA,UAA7CA;;GsDhKqB,KtDgKrBA;KAAAA;QsDzJsC,KAAkB,KACM;ECWxC;EvDgGf1M;EA6CsC0M,MAA7CA;yBAA6CA,WAA7CA;yBAA6CA,WAA7CA;cuD7IsB;EvDgGf1M;EA6CsC0M,MAA7CA;QsD/IE,QtD+IFA;MsD7IE;SAEF,sB7DsdczD,Y6DrdhB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,CEzGA/H,YAAiC,mBAAwC,A,C;A,E,C,CxDgOrEnB,cACJ,6BACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA7NML,YAAoC,MAAGye,SAAsB,A,C,Q,C,I,C,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,CAyE3Dhc,gBAGJ,MAAOnC,aACT,A,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,I,C,C,C,I,C,sB,C,Q,C,gB,C,I,C,C,C,C,C,G,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,CAmGMkB;EACU;GACH,OAAa,QACtB,MAAoBqG,aAAF,QAChBA,MACF,AAEF;SACF,A,C;A,C,CyDrHArG;cAEE;MAAA,QAAA,OACET,OADF,OAEA;KACc;EACDA;;;aAEb;8BAAkB;EACDA;uBAAfkyB;OACF,AACA,SACF,A,C;A,E,C,CCjGF;;;WlBKEzO;KkBAEC,YAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C1DwMQjjB,YAIJ,MAAOlB,SACT,A,C;A,E,CuDlGAkB,YAEE,MAAO,MADe,gBAExB,A,C;A,E,C,C;A,G,C,U,C;A,M,C,CvDlEyB,cACrBqG,WGIoC+H,YHHtC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAsO0B;GAChB,MACJ+iB,YAEFA;OGvOkC/iB,QHwOlC+iB;YACAA;OAASjU;IACR,MACH,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,E,C,C2DnOJne,YAAkB,6CAAyC2yB,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CChCnE3yB,YACE,2BACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,O,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CCoQAF;;;GACM,wCAAsB,QAC1B;MAAQ8yB,WAA0BlxB,MAC1BmxB,UAASnxB,KACnB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAyDAjC,cACI,MAAGmzB,SAAAA,QAAiClxB,SAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAErEjC,YAAiB,MAAGmzB,SAAsB,A,C;A,E,C,CA2C1C5yB;;EpE+XUqJ;IACmCypB,8BACHA;EoE5W7BC;EACAC,WpEgX2BF,2BACHA;EoEhXxBE,WpEqX4BF,0BACHA;EoErXzBE,WpE0X6BF,2BACHA;EoE1XxBE,WpE+X6BF,6BACHA;EoE/X1BE,WpEoY6BF,6BACHA;IAKQA,kCACHA;EoE1YhCG;KAEV;KAEA,gFAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CASAC,cAEE,MAAO,MACA,AAFEN,QAEAO,QAAgCN,SAC3C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C7DzTMK,WAGJnzB,WACF,A,C;A,E,C6DuIAmzB,iBAImC,oDAInC,A,C;A,K,C,I,C;A,M,C,C,G,C,0E,C,E,C,CAjFAhxB;EAuBgBkxB,SnErMNphB;GmEsME;EnE3EehQ;qBAAAA;EMvDlBjC,KNuDkBiC;qBAAAA;EMvDlBjC,KNuDkBiC;qBAAAA;EMvDlBjC,KNuDkBiC;qBAAAA;EmEyFZqxB,SnEzFYrxB;qBAAAA;EmE0FVqxB,SnE1FUrxB;qBAAAA;EmE2FVqxB,SnE3FUrxB;qBAAAA;EmE6FL,KAA6B,KAA5BsxB,kBnE7FItxB;;;qBAAAA;EmEkGA,AnElGAA;EMNlBjC,qB6D+GL;MAAO,QADsC,mBAIvC,KAAA,SAEV,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,CAcAmzB;;SAQA,A,C,E,C7DnJMA;;SAIN,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,C6DuFIzzB,uBACuB,QACrB;M7DrIGM,mB6DsIL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAuB,uBACuB,QACrB;M7D9HGvB,c6D+HL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyKFC;;EAEkB;GACP,QAAS;GACT,OAAQ;GACR,MAAO,oBAChB;sBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA,eACQ,OAAQ;GACR,MAAO,WACb;aACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA,eACQ,MAAO,UACb;YACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,C,C,CvBtUFuzB,cACE,MAAO,UAAqC,AAAV5P,QAAYjiB,eAChD,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMA6xB,cACE,MAAO,UAAqC,AAAV5P,QAAYjiB,eAChD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CASA6xB,kDACE;MAAO,U/CzCMlyB,QAAAA,Q+CyCgC,AAAVsiB,mBACrC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAQA4P,iBAGe,eAAY,KAAA;oCACzB;MAAO,UAAqC,OAAV5P,kBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMA7jB,cAAgC,MAAkB,AAAf,SAAiB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMnE5B,cAAgC,MAAkB,AAAf,SAAiB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMnE5B,cAAiC,MAAkB,AAAf,UAAkB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMrE5B,cAAiC,MAAkB,AAAf,UAAkB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAiCrEjC,WAAuB,MAAa,SAAVkkB,cAAkD,A,C;A,C,C,CAU5E7jB;;;2CAC0B,QACxB;MAAO6jB,WAAajiB,KACtB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC,YAAiB,MAAGkkB,oBAAkB,A,C;A,E,C,CAUtClkB,cAA8B,MAAGkkB,SAAAA,QAAoBjiB,SAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAErE1B;;EAtB0B2jB;GAoCL,IAGjB,cADI,SAA2B;EAGRqP,SAAUQ,QA5DN;EA6DJR,SAAUS,QAtDN;EAwDzBC,kBAAUC,mBACd;WAvE2B,wDAwE7B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,G,C,qD,C,E,CA/JA,sCAU8D,AADV,AADA,AADJ,AADF,AAAvB,cACC,aACE,WACA,UACK,UACD,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA6H5B3zB,eACQ,UAAW;GACX,SAAU;GACV,QAAS;GACT,OAAQ;GACR,MAAO,mBACb;qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACAA,eACQ,MAAO,aACb;iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,G,CtC7GI4zB,WAA0B,0CAAqC,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CsDgCrE5zB,YAAkB,uBAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAYrCA,kBACMyE;GAAQ,QACV,oCAEF;4BACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,C,CAPAovB,+BAA6B,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAgC7B7zB,YAAkB,yBAAiByE,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAb3CqvB,+BAAwC,A,C,C,CAGxCA,6CAAmD,A,C,E,CAOnDA,qFACqD,A,C,C,C;A,E,C,C;A,G,C,K,C;A,M,C,C,E,CAerDC,6BAAkB,A,C,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CtDqEZ/zB;;IACc;;EAEdiP;GAAW,QACb,UAAWA,SAAF,MAAsB,oBACvB,UApBVxC;KAA6CA;aAkBzCwC;EAKSkP,KAAmBlP;8BAvBhCxC;KAA6CA,OAwB3C,EAEEunB;GAAgB,QAClBA,mBAWA;oDAAgDnlB,6BAC/BsP,KAAmB7N,wCAkBxC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CsDjEA2jB,+CASoD,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAepDj0B,YAAkB,gCAA4ByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,C,CADtDyvB,+BAA8B,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAkB9Bl0B,kBAAsB,OAAJ;MAAiB,4DAEU,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CAH7Cm0B,+BAAyC,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAgBzCn0B,YAAkB,oBAAgByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,C,CAD1C2vB,+BAAwB,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAkBxBp0B,kBACMq0B;WACF,iDAEF;uDACUlW,aACZ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CARAmW,+BAAkD,A,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAsBlDt0B,YAAkB,uBAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAErC4zB,WAA0B,OAAO,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAajC5zB,YAAkB,kCAEeu0B,sCAAwC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAHzEC,+BAA8C,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CE5U9Cx0B,kBACMyE;WAAiB,iBACrB;2BACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAmBAzE,YAAkB,8BAAsByE,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAFhD,+BAA0C,A,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAO1CzE,YAAkB,uCAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CADrD,6BAAsC,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CM5BtCA,YAAkB,iBAAa6I,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,C9DyC9BkP,oBACShY,wBACb;oBAAiCA,OAA+B00B,WAClE,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAEM,sBACS10B;uBAGXA;2BAEFA,OAA+B00B,aACjC,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAz0B;EACeD;kBAEY20B;KAAS;kBAChC30B;2BAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,W,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,C+DvEAC,YAAkB,aAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,C,C,C;A,G,C,G,C;A,C,C,CCuC3BF,cAAwB,gBAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,ChE7B3CL,YAAiB,MAAGM,YAA+B,A,C;A,E,C,CAGnDC,YAAkB,MAAGD,YAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEpDE,mBACE,KAAA,UAEFC,QACAA,QACAA,eACN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEMC,YAAqB,gBbmLbC,iBanLoC,A,C;A,I,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CuD4jBlDX,WAAgB,MAAGk1B,SAAiB,A,C;A,C,C,CAuBpC70B;EACc80B,OAAZ1F;;EACiBztB;;OAAAA,SACfkzB,YACA;WAEalzB,MAAkBytB;EACJ,AAAVA;IAxIkB,oBAyIYztB;6BAAAA;EAAF;QAC1BA;IAvIiB,kBAyIlCmzB,QAA6B,GAC7BD;QAtImC,AAA1B,OAAmB,AAAA,CAAT,kBAAuB,OAuI1C;UAGJC,SACAD;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,CvD7YMl1B,YAAe,MAAGgN,AAAAA,gBAAgB,A,C;A,G,CiE1OxC3M,YAAiB,MjE0OO2M,AAAAA,oBiE1OO,A,C;A,G,CAM/B3M,YAAoB,MAAG,AjEoOC2M,AAAAA,oBiEpOO,A,C;A,E,C,CjEsOzB,8CAEJA;QAA6CA,UAC/C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CiEjOA;EACsBooB;GAChB,CAACvG,MAAqB;GzEkORjuB,ayEhOhB,KACQiuB;8BjE2NV7hB;QAA6CA,gBiE1NlC6hB,MAAoB;KAE7BwG,QAAMxG,OACN;KAAOA,QjEuNT7hB,QAA6CA;EiErNnC6hB;8BjEqNV7hB;QAA6CA,UiEpN3C,EAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CjEyNM,YACJA,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEMzM,YAAkB,MAAGyM,SAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAvB9BsoB,mCAEFtoB;KAEAqoB,WAEJ,A,C;A,M,C,C,E,CANMC;;SAMN,A,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,8B,C;A,G,CmB5NA/0B,cAm1B8B,KAALg1B,mBAl1BJ;MACV,QACTC;UACA;MnByOyBxoB,MmBxO3B,A,C;A,G,CAmBAzM;EACMk1B;GAAM,SAAWA,sBACnB;MAAOA,UAAgC,KAAbA,YAE5B,SACF,A,C;A,G,CAOAz1B;GACY,KAAN01B,cACEC;;GAAO,cAAW;GACX,eAAY,WAEzB,MAAOD,SACT,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA6eAn1B;;SAC4C;EACjC;UAKEq1B,QAEAC,AAAAA;IAmTiB,KAALN,oBAjTM,KAAPI;EAClB9tB,UAAqB,CAACA;KACxB,gBAEF;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA8LAtH;GACW,UAAO,gBAChB;MAAUu1B,UAAwC,KAAtBA,uBAC9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAz1B;GACkB,KAAZ01B,YAAmBA,cAA8B,QAErD;MAAa,AADDA,mBAEd,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAx1B;GACM,CAACy1B,WAAuB;IAG5B;MAAuBD,8B9Bteax0B,mC8BsepC,U9BpeekI;G8BseD,gB/BvdI7I;G+BwdV;EACoC,CAAA,KAAVq1B;;oCAAmBA;;KAKjDA;MAEJ,KACiBA,UACjB;MAAOA,gBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAqOA,kBACqBC;GA4CZ,QACLvD,OACAA;YA7CO8C,OAATU;;GACU,CAAA,KAANT,YACFS,SACAA;KAAST,KAAAA,WAEb,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAn1B;EACoB;EACCo1B;GAkCZ,QACLhD,OACAA;cAnM0B,KAAL4C,oBAgKK,gBAC1B5C,UACA6C;WAEF7C,KAn8BiByD;EAo8BEC;GA4BZ,QACL1D,SACAA;UA7BiB2D;GA2BZ,QACL3D,SACAA;QA5BF,MnB7wByB3lB,MmB8wB3B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA3M;;;2CACqB,QAEnB;MAAc,MAAPs1B,QAAUY,OACJ,KAATL,QAAYK,OACP,KAALhB,eAAQgB,WACH,KAAL5vB,eAAQ4vB,WACH,KAh9BQH,QAAAA,OAi9BP,KAANC,QAASE,OACA,KAATD,QAAYC,MAClB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAv2B,4BAKE;MAAOiX,UAAQ0e,QAAQ1e,SAAQif,QAAUjf,SAAQse,eAAMte,SAAQtQ,eAC3DsQ,SA39Bamf,QA29BCnf,SAAQof,QAAOpf,SAAQqf,iBAC3C,A,C;A,E,CAn4BAE;GAca,eAAkB,WAC3Bd;QACgB,gBAAmB,YACnCA;KAEAA,SAGFU;QAAQK,aACV,A,C;A,K,C,I,C;A,M,C,C,G,C,+H,C,E,CA/EAD;EzBkC2Bj0B;qBAAAA;EAAAA;EyBjCZm0B,KAslB+B;;czBrjBnBn0B;EAAAA;EyBqjBmB;czBrjBnBA;EAAAA;cAAAA;EyB/Bdo0B,OzB+Bcp0B;cAAAA;EyB7Bdq0B,KzB6Bcr0B;;cAAAA;EAAAA;EyBqjBmB;czBrjBnBA;EAAAA;EyBqjBmB;czBrjBnBA;EAAAA;EyBqjBmB;EAthBjCm0B;WACDG,sBACAC,aACGC;;SA5DuC,A,C,E,CAgDtDP,kCASaE;WACDG,sBACAC,UACGC;;SAWf,A,C,E,C,CAkUAt0B;YACsB8yB,aAAc;;GAC9BA,kBACmC,AAAjCA,MAA4B,KAAZA,sBACZ,KAAA,6CAERyB;KAAiBzB,SAA8B,KAAZA,YACnC;YAEF;YAAoBA;6BAAAA;KAAF;GACZA,eACFyB,OACA;yBAEJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEAv0B;;;WAUsB;;EAEPkzB;6BAAAA;;GACb;KAAkB,WACDA;eAm7BJ,OAA6B,UAC7B,OAA6B;;EAn7B1B;;GAIV,AAACsB,qBACCC;MAMR,AAEA,WAA+BvB,QACjC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAoBAlzB;;;SACgD;EACpC;WAGS,MAAOmzB;EAEb;MAEbuB;wBAWA;MnBhVyBnqB,MmBiV3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CAEAvK,uBACwB,QACtB;MAAOmzB,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEAnzB;;;;;;;;EAiDe20B;;;;6BAAAA;GAcb;KAAa,QAIPA;GACS,EAAQ;EAKHA,MAA2B;EAC3BA,MAA2B;EACrBC,SAAyB;GAC3CC,kBACAA,kBACA,AAACC,oBACG;;SAENC;EACID;;WACF1vB;EoCnkBc;EvDgGfvH,OA6CP0M;KAA6CA,YmBwbrCnF,UnBxbRmF;KAA6CA;EmBybhByqB,SAAwB,MAA7C5vB;;EoCtkBc;EvDgGfvH,OA6CP0M;KAA6CA;;EmB0bhByqB,SAAwB,MAA7C5vB;;EoCvkBc;EvDgGfvH,OA6CP0M;KAA6CA,SmB4bjC;;;YAIH;;IAET,GACW,WAAqB,QAAUwqB;;WAGtB,QACpB;MAAO3vB,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAIApF,eACU,SAAe,CAAA,WACrB,MnBhnBKnC;KmBknBL,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEAmC,iBACW,QAAS;GACT,QAAS,QAClB;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CA+fAA;;EAIc8yB;GACK,AAAbmC,aACFtO,uDAGF;MAAOsO,iDAST,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAgBAj1B;;;GAoBkB,KAAZ8yB,WAAiBnM;;;;GAKrB;YAAoBmM;6BAAAA;KAAF;GACZA;GAIuB,AAAnBA,eACFnM;mBAOAA,6CAGF5U;;UAGAA,OAAUmjB;EAEE,QAElB,GACInjB,YAAmB4U;EACA,OAAGmM;EACO,KAAX/gB;MACT,GACX4U;GAEE,OAEA5U,OAAUmjB,WAAoBpC,mBADhC;MAKqBqC,KAAiBrC;EAChB,KAARpH;EAAeA;6BAAAA,OAAzB3Z;OAAuB,CAAA;EACL,KAAR2Z;EAAeA;6BAAAA,OAAzB3Z;OAAuB,CAAA,mBAHzB,OAKE4U;mDAKa,AAAb5U,UACF4U,2EAEoB,AAAb5U,YACT4U;;8BAGF;MyBzjCE,0BzBkkCJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAgCA3mB;;EAYwB;E+C72CHuvB,AAAAA,a/C+2CnB;QAAkB,EAAE0F,gBACPA;;GACF,cACiB;;EAA8B,AAAxB,KAA1BG,KAA+B,UAAS;QoC7wC1B;EvDgGfv3B,OA6CP0M;KAA6CA,kBmBkoCZ,aoC/wCX;EvDgGf1M,OA6CP0M;KAA6CA,cuD7IvB;EvDgGf1M,OA6CP0M;KAA6CA,MmBsoCzC8qB;eAEJ,AACA,MnB9nCyB9qB,MmB+nC3B,A,C,6B,C,I,C,C,C,C,C,I,C,G,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAn3BE3M;GACY,SACoB;;EAA4B,AAAtB,KAA3B03B,QAAgC,UAAO,oBADhD;SAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEA13B;GACY,SAA2B;;EAA4B,AAAtB,KAAtB23B,QAA2B,UAAO,oBAAvD;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgC4B,YAAI,MAAGniB,sBAA4B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkBvC;GAClB,KACFhO;;QAGFA;KA8hBKgO,qBA7hBiB9M;QACpBlB;SACAA;KA2hBGgO,sBAzhBP,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAUAxV;KACgB,OAAkB,SACb,OAAkB;SADrC;SAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA,YACE,MAAqB,QAAkB,OACzC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA;GACY,SACmB;;EAA4B,AAAtB,KAA1B43B,QAA+B,UAAO,oBAD/C;SAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAEAj4B;;EACiBo3B;GACXc,sBACF,MAAgB;QACP,AAACZ;KAGV,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEAt3B,yBAEE;+BAAkB,WACDo3B,MAA2B;GAChC,OAAwB,QACJ,AAAX,AAAL;;GAIM,OACL,SACiC,AAAhB,AAAX,AAAL;gFAMlB,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CASA;;;;;;eAGa,KAAiBA;KAE1BvvB,KAAauvB,aAEjB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAwYAp3B,oBAEyBm4B;6BAAAA,OAAvB;MAAsC,AAAjB,AAAL,mBAClB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA6KA,iBACQ,KAAA,kCACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAOS;EnBnoCF73B;;GmBqoCQ,UAAY,WACnB8oB,2DAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyBJ,iBACQ,KAAA,kCACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CACAppB;GACkB,KAAR,aACNopB;EnBvqCG9oB,KmByqCiBi1B;;GACZ,UAAa,aACrBnM,gEAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA2DY;GACI,UACR,MAAO,MAAmC,CAAhB,EAAE5U;KAE5B,OAAqB,AAAN,aAAoB,YAEvC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAsCJsjB,2BnB/mCAzC;KAAM,KmBinCiB+C,0BAAoB,WnBjnC3C/C;KAAM,KmBknCiB+C,0BAAoB,aAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,iB,Y,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CTqxQF31B,eAEM41B,YACF;QACSA,YACT,sBAEF;sBACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAo1DA51B,cAUE,iCACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CA0wFAA,gBAEE,MAAO61B,AAAAA,qDAET,A,C,mC,C,I,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmEA71B;;gB+B7zc0B;sB/Bu0cxB81B;;EAulBkCC,UA6whBlCtkB;gBA/EI,KAAc,KA8EcC,oBA9EW;EApshBRskB,UAmxhBnCvkB;gBA/EI,KAAc,KA8EcC,KAj0iBbukB,SAmviBwB,uBA9uiBzCH;QAGF;MAAOG,MACT,A,C,wF,C,I,C,C,C,E,C,I,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CA2yBAl3B;EAtiPSm3B;GAwiPE,YAGLC,mBAFF,QAKF,SACF,A,C;A,E,C,CAisXAn2B;;QAII;yDADF,OAGE;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAg9EAA,gBACoB,UAAQ;EACR,UAAQ,GAAuB,AAAA,CAAR,kBACzC;MAAY,GAAQ,MACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAi/JFo2B,uBACmB,MACjB;MAAOC,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC;WAEI;yBAMaD;;4CAGX,QAEF;YAGA,SACJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,YAII,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC;4CAEI,QAEF;MyDlxkCOC,YzDmxkCT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAMAC,cACE,qBASF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C,C,C,C;A,E,C,CAEAC,YACE,MAAOvvB,SACT,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEAwvB,YACE,MAAOxvB,SACT,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CACCyvB,kBACC,MAAOzvB,eACT,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAsBA;EAgByB1J;;;EAOLE;6EAOlBP;KAxwyBIy5B;;;;SAgxyBgB,CAAA,2BACV,KAAA,sFAIJ,gDAEI,KAAA;;;;;;;aA1DNzwB,KAoEwBqwB;;;;;aApExBrwB;;;;;aAAAA;;;;;aAUAA;;EX7nkCuB+E;;;GWsskCR;uBAKrB,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAscAuG,eAEmB,gBAAc;WACT,MACtB;MAAOmP,eACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAiW,eACmB,gBAAc,QAE/B;MAAOjW,eACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,G,C,u0B,C,C;A,E,C,C;A,G,C,K,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,kD,C;A,E,C,CAtolCE/iB,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,yC,C;A,E,C,CA+SxBA,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,uB,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,Y,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,O,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,wC,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,wB,C;A,G,CA8mBxBi5B,YAAuC,0BAC+B,A,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,K,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAuctE;GAMwC;;MAEpCC,eADkBC,oBAElB;oEAGJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,0B,C,C;A,E,C,C;A,G,C,uB,C;A,K,C,I,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,G,CAwiJArnB,kBACMsnB;GAAY,QACd,QAEF;MyDvnMKV,MzD+nM0D,aAPjE,A,C;A,K,C,I,C;A,G,C,a,C,C;A,G,C,C;A,G,C,gB,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA87BAW,8CAAgD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA0DhDC,yCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAsB/CC,yCAA8C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CA+H9ClS,YAA2B,MAAGiS,YAAmC,A,C;A,G,CAKjEjS,YAA+B,MAAGiS,YAAkC,A,C;A,G,CAsEpEjS,YAA0B,MAAGiS,YAAkC,A,C;A,E,C,CAmM/DE,cACE,MAAO,MAA6BC,4BACtC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASAH,cAAwC,MAAGI,oBAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAS3EF,cAA+C,MAnBtC,MAA6BC,4BAoBC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,mC,C,C;A,E,C,C;A,G,C,K,C;A,G,CAuDvC/4B,eACMi5B,qBACFA,mDAEF;MAAOA,gBACT,A,C;A,G,CAEA;EAEc;EACG;SACfC;OACAA;UACF,A,C;A,E,C,CAaAJ,cAA+C,MAC7C,MAA6BC,4BAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA8C5DH,cACE,MAAOI,oBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASAF,cACE,MA1DA,MAA6BC,4BA2D/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,yB,C;A,G,C,W,C,C;A,E,C,C;A,G,C,gB,C;A,G,CAgGAz5B;GAIM83B,gCAAgD;GAGhDA,8BAA8C,mBAClD;SACF,A,C;A,E,C,CAUA93B,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,yB,C;A,G,CA+8CxBmH,YAAmC,mBAAiC,A,C;A,G,CAsBpEzG,YAA2B,kBAxxCNytB,YAwxC6C,A,C;A,G,CAElE;EAEc;EACG,WACfyL;OACAA;UACF,A,C;A,E,C,CAcAJ,cAA+C,MAC7C,MAA6BC,4BAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAS5DH,cAAwC,MAAGI,oBAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAS3EF,cAA+C,MAlB7C,MAA6BC,4BAmBQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAYvCI,YAAwB,mBAAgC,A,C;A,G,CA+ExDC,YAAqB,qBAAiBC,aAAYC,YAAWC,cACzDC,wBAAa,A,C;A,G,CAKjBJ,YAAqB,qBAAiBK,aAAYC,YAAWC,cACzDC,wBAAa,A,C;A,E,C,CAgCjB,aAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAOpB,aAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKjB,mBAAsE,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CA6BtEt6B,YAAqB,MAAGu6B,aAAU,A,C;A,E,C,CAoBlCv6B,YAAkB,MApBMu6B,aAoBM,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAsL9Bz6B,6BAEI;kCAEA;+BAEA;8BAEA;6BAEA;UAEM,KAAA,uCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIAA,qBAEE;MACM06B,UAAyB;EACtBA,sBACI,QAAQ,AACrB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAgBAC,YACE,6DAGF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAgBAA,YAA0B,wCACiD,A,C;A,E,CAqP3EC,YAAqB,qBAA0B,A,C;A,E,C,CAmzB/C16B,uCAAuC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAsBvC85B,6CAAwC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAoRxCa,YAAkC,MAAGC,YAA4B,A,C;A,G,CAKjED,YAAsC,MAAGE,YAA2B,A,C;A,G,CAoKpEF,YAAiC,MAAGG,YAA2B,A,C;A,G,CA+C/DH,YAA0C,MAAGI,YAA+B,A,C;A,E,CAptE5EzB,aAIA,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,G,C,U,C,C;A,E,C,C;A,G,C,kD,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,0B,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,uC,C;A,E,CAwwFAd,YAAuB,MAAGwC,MAAiC,UAAiB,A,C;A,E,C,CAuB5E,sCAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,ie,C,C;A,E,C,C;A,G,C,K,C;A,E,CAuN5BC,YAAc,mBAAmB,A,C;A,E,C,CAMjC,2DAAoF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQpF,8DAAuF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,+B,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,M,C,C;A,E,C,C;A,G,C,a,C;A,G,C,W,C,C;A,E,C,C;A,G,C,4C,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,K,C;A,E,CAipDvFx7B,YAAe,gBAA8B,A,C;A,C,C,CAE7C85B,oBAEoBl5B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAk5B,kBACY;GACF,IACN,SAAoC;mCAGxC,A,C;A,E,C,CAWAA,uDAA0B;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,iE,C,C;A,E,C,C;A,G,C,gC,C;A,G,CAwwBxCt5B,YAAqB,MAAGw4B,MAAkC,YAAmB,A,C;A,E,C,CAiK7E,+CAAuF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,I,C,C,C,C,C,C,C,C,C,I,C,4B,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAgCvF,+BAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,G,C,4B,C,C;A,E,C,C;A,G,C,yC,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,iC,C;A,K,C,I,C;A,G,C,W,C,C;A,E,C,C;A,G,C,gC,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,Q,C,M,C,C,C,C,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,yF,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,M,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,+B,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,e,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,sB,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,+B,C;A,E,C,CAysDxB,8BAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAQpBz4B,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,U,C,C;A,E,C,C;A,G,C,a,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,CA2lBxB,4BAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,C,mC,C,C;A,E,C,C;A,G,C,a,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,a,C;A,G,C,e,C,C;A,E,C,C;A,G,C,gB,C;A,G,C,e,C,C;A,E,C,C;A,G,C,gB,C;A,G,C,sB,C,C;A,E,C,C;A,G,C,qB,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+6BlBC,YAAiB,MyDx6jBVy4B,MzDw6jBuD,WAAe,A,C;A,K,C,I,C;A,G,C,c,C,C;A,G,C,C;A,G,C,yB,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA+W7E,mCAAiD,A,C,Q,C,C,C,C,C,C,M,C,C,C,I,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,yC,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA4RjD,0CAEEwC,6CADsBC,QAEtB;OACF,A,C,S,C,K,C,E,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CASAC,YAAiB,qBAAaC,UAAUC,mBAAS,A,C;A,G,CAgBjDF;eAII;OAxwNsBJ,KAAiC;;GA2wNnD,6CACI,KAAA;EA5wNcA,KAAiC;EAgxN9B,cA5BCK,UAAUC,uBA4BT1U,KAAAA,SAC3B;qBAAiB2U,KAAAA,KAAiBA,KAAAA,eAEtC,A,C;A,K,C,I,C;A,G,C,8F,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAkEA;;aAiBEC;uBACAA;wBACAA;2BACAA;qBACAA;+BACAA;mCAKAC;eACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,2G,C,I,C,K,C,C,C,E,C,I,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,yC,C,C;A,E,C,C;A,G,C,oC,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,W,C,C;A,E,C,C;A,G,C,yB,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,sG,C;A,G,CA8nBA/6B,YACE,mBACF,A,C;A,E,C,CAgBA,kBAGM;GAAgB,QAElBg7B,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMAnC;MAEwB,YACpBvP;qBAFF,QAMA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASAuP;;+CAGkB1iB;+BAKd;MA9Ec8kB,AAAAA,wBA8E4B,QACxC,eAAkB9kB,eACpB,MAEA,MAAA,QAAA,OACE,eADF,SAEA,CAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKA7W,kBAAqB47B,WAAH;gDAAmD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA0QrErC,sCAAiC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA6BjCz5B,mCAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA0BhCy5B,2CAAsD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUtDA,2CAAuD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,sB,C,C;A,E,C,C;A,G,C,M,C;A,E,CAmHvD95B,YAAe,gBAA8B,A,C;A,C,C,CAE7C85B,oBAEoBl5B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAk5B,kBACY;GACF,IACN,SAAoC;mCAGxC,A,C;A,E,C,CAWAA,uDAA0B;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,4D,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,c,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,0C,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,wC,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,yB,C;A,G,C,e,C,C;A,E,C,C;A,G,C,c,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,2C,C,C;A,E,C,C;A,G,C,Y,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,qB,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,oE,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,CAitFxC74B,kBAtxaE,KAA6B+4B;EAuxaf,kBAEd;qBkC73sBE,kClC83sBJ,A,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,mC,C;A,E,C,CAuQAH,yCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,qB,C;A,G,C,mB,C,C;A,G,C,C;A,G,C,gB,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,0B,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,gB,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,0B,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,sB,C,C;A,G,C,C;A,G,C,8C,C;A,G,C,c,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,G,CAu+C/C54B,YAA+B,qBACOm7B,gBAAM,A,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,G,CA8L5Cn7B,YAA+B,qBACKm7B,gBAAM,A,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,gB,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,iD,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,W,C,C;A,E,C,C;A,G,C,+B,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,uC,C,C;A,E,C,C;A,G,C,K,C;A,G,C,0D,C,C;A,E,C,C;A,G,C,wB,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,wB,C;A,G,CAixE1CC;GAIMC,aAAyB;SACjBC,oBACVA,+BAEF;MAAOA,qBACT,A,C;A,E,C,CAyEAv8B,wDAAyE,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKzEw8B,mEAGI;;;;;;;;;;;;;;;;QAqBJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CA4iBA3D,YAAsB,MAAG4D,MAA4B,UAAiB,A,C;A,E,C,CAyRtE,6BAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA0GnB,kBAOEC,cyDxy3BKC,UzDyy3BL;OACF,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmHAp8B,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAoIxBqnB,YAA2B,MAAGiS,YAAmC,A,C;A,G,CAKjEjS,YAA+B,MAAGiS,YAAkC,A,C;A,G,CA+EpEjS,YAA0B,MAAGiS,YAAkC,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,M,C,C;A,E,C,C;A,G,C,8D,C;A,E,C,CAmgC9Dt5B,YACC,wBAAoByvB,iBAAO4M,gBAAMC,mBAASC,UAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEAz8B;;;2CAC2B;EAClB2vB;EAAQ/tB;4BAAc26B;EAAO36B;4BAAa46B;EAAS56B;4BACtD66B;EAAU76B;qDADd;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAA0CgwB,KAAAA;EAAe4M,KAAAA;EACrDC,KAAAA;EAAgBC,KAAAA;EA2IT7lB,KAAQA,KAAQA,KAAQA;EARf,UAAQ,GAAuB,AAAA,CAAR;GACrB,MArIL;MAsIG,WAAQ,GAAuB,AAAA,CAAR,kBArIP,A,C;A,G,CAsEpC0kB,YAAkB,qBAAa,OAAW,eAAS,A,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,I,C,C,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,M,C;A,E,CAgrBnD37B,YAAe,gBAA8B,A,C;A,C,C,CAE7C85B,oBAEoBl5B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAk5B,kBACY;GACF,IACN,SAAoC;mCAGxC,A,C;A,E,C,CAWAA,uDAA0B;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,8B,C,C;A,E,C,C;A,G,C,M,C;A,E,CAyJxC95B,YAAe,gBAA8B,A,C;A,C,C,CAE7C+8B,oBAEoBn8B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAm8B,kBACY;GACF,IACN,SAAiD;mCAGrD,A,C;A,E,C,CAWAA,uDAAuC;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,M,C;A,E,CAsBrD/8B,YAAe,gBAA8B,A,C;A,C,C,CAE7Cg9B,oBAEoBp8B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAo8B,kBACY;GACF,IACN,SAAuD;mCAG3D,A,C;A,E,C,CAWAA,uDAA6C;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,6B,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CA7g4B3D,YAAuB,yDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAe9C,cAAuB,yDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAe9C,YAAsB,wDACuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAW7C,cAA2B,2DACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAWlD,YAAwB,wDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAW/C,cAAuB,yDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,M,C,C,G,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CA6xL9C38B,cAA8B,MAAG48B,MAAAA,WAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAGjE58B,YACE,MAAO68B,AAAAA,iCACT,A,C;A,E,CAEAl9B,YACE,MAAOi9B,AAAAA,gBACT,A,C;A,C,C,CAEApD,oBACSoD;gCAAAA,SAAP;MAAOA,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACgCA;gCAAAA,SAA9BC,AAAAA;uBAA8BD,MAChC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA,mBAEQ,KAAA,oCACR,A,C;A,C,C,CAEApD,cACEqD,AAAAA,sBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAEA57B,kBAAkC67B,aAAH;uBrBtzPO57B,8BqBszPa,A,C;A,E,C,CAEnD;QAKE;MAAA,8CAHa,oBAIX27B,QADF,OACEA,cADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACQ,KAAA,kCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAwBA,yBAEQ,KAAA,YACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUA78B,cAQE,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA;GACyB,EApFhB48B,AAAAA,oBAqFC,KAAA,SArFDA,AAAAA;EAAAA;EAAAA;EAwFLC;SAAAA;mBAxFKD,SA0FLC;iBAtFKD,OAwFT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,YAEEC,KAAAA,YACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAyBArD,kBACmBqD,AAAAA;6CAEjB;SACF,A,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAueAl9B,YAAe,MAAGo9B,AAAAA,gBAAgB,A,C;A,C,C,CAElCvD,oBAAkCuD;gCAAAA,SAAH;MAAGA,MAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAElD,qBACQ,KAAA,2BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA,mBACQ,KAAA,2BACR,A,C;A,E,C,CAEA,mBACQ,KAAA,yBACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,G,CAQAvD,YAAiB,MAAGuD,UAAAA,SAAc,A,C;A,G,CAIlChD,YAAwB,MAAG,MAA6BiD,SAAa,A,C;A,G,CAgDrEnC,YAAkC,MAAGrB,eAAyC,A,C;A,G,CAK9EqB,YAAsC,MAAGrB,eAAwC,A,C;A,G,CAoKjFqB,YAAiC,MAAGrB,eAAwC,A,C;A,E,CAvP5EyD,oBACiBF,QAAAA,mBAAfC;QkCt6QE,yBlCu6QJ,A,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAFAC;;SAEA,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CADiC,wBAAI;gDAAQzD,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,O,C;A,C,C,CA85G7CjS,cACE,qBAAwB2V,yBAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,c,C;A,C,C,CAyBA3V;;;GbjxWS1Y,AAAAA,AakxWHsuB,eAA2B1wB,YACzBurB,YACF,qBACIkF,QAAMC,MAAa1wB,oBAG3B;qBAAmCywB,sBACrC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,M,C,C,G,C,I,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA4oEmC,YAAM,MAAGhF,SAAIkF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA6FrB,cACrBlF,6BACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAOgB;;EAEXA;;EAAW,QAAqB;;Q+Bn1clCxU;GAAD,AAoDmBa,mDAnDvBb;a/Bs1cI2U,QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA64IAqD,iBACY,oBACZ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CAgfFjC,kBAC+CoC;6CAE7C;SACF,A,C;A,C,C,CAQA,cACEA,AAAAA,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;;+CAGmB9kB;EAAiB8kB;GAA5B,MAEF,MAgHYA,AAAAA,wBAhH8B,QACxCA,cAAa9kB,aACf,AAEF;OAEF,MAAA,UACE8kB,QADF,OACEA,cADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;GACyB,EAoGPA,AAAAA,AAAAA,+BAnGR,KAAA,SAmGQA,AAAAA,AAAAA;EAAAA;EAAAA;EAAAA;SAhGdA;mBAgGcA,SA9FdA;iBAqG0BA,OAnG9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EAiG8BA;EAAAA;0BAAAA,SA/F5BA;SA+F4BA,MA9F9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,mCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBA77B,cACuB,SAKvB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAwBA,YACE67B,KAAAA,YACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA;EACEA;EAqC4BA;gCAAAA,SArC5BA;iBAqC4BA,MApC9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA56B,YAA4B,MAAG46B,SAAAA,AAAAA,oBAAyB,A,C;A,E,C,CAMxD,mBACQ,KAAA,8BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAOA,yBAEQ,KAAA,qCACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CASAl8B,YAAe,MAAGk8B,AAAAA,AAAAA,2BAAuB,A,C;A,E,CAEzC,mBACQ,KAAA,6CAER,A,C;A,C,C,CAEApC,oBAA8BoC,AAAAA;gCAAAA,SAAH;MAAGA,MAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgxG/C,wBAAI;gDAAQwB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAs4PlB,cACEz7B,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA5B,iBACE;MAAc,iCrBxu8BsBkB,8BqBwu8BpC,QAIA,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CASA,iBACE;MAAgBgH,iCrBxv8BoBhH,8BqBwv8BpC,OACEo8B,UrBvv8Bal0B,KqBwv8Bf,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,qBACE;MAAgBlB,iCrB9v8BoBhH,8BqB8v8BpC,UrB5v8BekI,IqB8v8BbwF;WADY,aAEd,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAnO;EAEmBo8B,AAAAA;gBAEjB;MAAsBU,aAAqB,8BAF1BV;GAGXW,QAASD,4BAHEV,SAIb30B;OAASq1B,KAAAA,QAEb,AACA,SACF,A,C;A,G,CAEA98B;EAEmBo8B,AAAAA;gBAEjB;MAAsBU,aAAqB,8BAF1BV;GAGXW,QAASD,4BAHEV,SAIb10B;OAAWo1B,KAAAA,QAEf,AACA,SACF,A,C;A,G,CAKAv9B,YACE,MAAOO,mBACT,A,C;A,G,CAKAP,YAAoB,MAAG,AANdO,mBAMsB,A,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAlEf,cAAS,gBAAa,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAiFtCP,YACE,MAAO68B,AAAAA,yBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA38B,cACE,MAAO28B,AAAAA,yBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,gBACEA,AAAAA,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA38B;EACiB28B;EAAAA,iBACfA;oBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAKAl9B,YACE,MAAOuI,AAAAA,uBACT,A,C;A,E,C,CAEAlI,YAAyB,MAAGiwB,sBAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAwbtDwN,iBACU,wBACRC,AAAAA;yBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;EACgB,QAAA,mBACd;MAAkBC,0BrB9w9BkBz8B,8BqB8w9BpC,OACEq3B,KrB7w9BanvB,OqB8w9Bf,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAWAw0B,YACEF,AAAAA,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMA19B,cAA4C,MACxC69B,wBAAyD,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAS7D79B,cAA0B,MAAG69B,sBAA8C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3E79B,YAA+B,MAAG09B,AAAAA,8BACyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAhD3DI,YACEJ,sBAA8B,IAAcC,0CAE9C,A,C;A,M,C,C,E,CAHAG;;SAGA,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CADM,YAAI,mBAA4B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKA,YAAI,MAAGnlB,aAAS4f,QAAe,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAqB/B,YAAI,MAAGA,cAAU,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQ5B,YAAI,MAAGA,qBAAyB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASP,YAAI,MAAGA,gBAAc,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAG9D,cAAqB,MAAG3pB,+BAAcmvB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CASjDN;EACU,wBAGR;MAAoBO,AAFJnB,KAAAA,sCrB5z9BoB37B,8BqB8z9BpC,UACmB6H,KrB7z9BJK;GqB8z9BT,AlBx29BY7I,akBy29BdoY,SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YACc,cACZkkB;KAAAA,QAAqBlkB,aACvB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,E,C,CAiYA4O,cAA6D,uBACvC0W,mBAAuB,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAuB7CpD,cACE,uBAAsCoD,mBACxC,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAgBApD,cACE,yBAA0CoD,iBAC5C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CA0DAxW,mCAMM,QAAc,QA8Ec3T,QA9EW;wCA+E3CD;MAhFA;SAEF,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CAYA0T,wEAAmC;2DAI7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHF,YAAQ,MAAGniB,MAAAA,gBAA0C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAO,YAC1DmzB,cACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CAoBJhR,wEAAmC;2DAI7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGNE;qBAwKqB;UAnKnB;MAAmByW,UAAnB,UACoCD,UAAYE,QADhD,mBrBt2+Be/0B;yBqBu2+Bbg1B;SACF,EAkLsB1W,IAAAA;UAjLtB;MAAO0W,2CAET,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAhBI,YAAQ,MAAGh5B,MAAAA,gBAA0C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAO,YAC1DmzB,cACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CAyCJjjB,cAUsBvE,cATL,MAEfstB;SAEAttB;YACA8W;YACA;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAqBA,iBAnBsB9W,cAoBL,MACf;QAAA,AAAA,SACAstB;UAKF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,G,CAEAr+B,WAAkB,MAAe,AAAZs+B,WAAe,A,C;A,E,C,CAEpC,eA/BsBvtB,eAgCH,AAHEutB,WAGS,MAC5B;QAAA,AAAA,SACAzqB;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,iBACMgU;GAAQ,SAAW,AATJyW,WAUjBvtB,KAAAA,QAAyBktB,UAAqBE,SAElD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,iBACMtW;GAAQ,QACV9W,KAAAA,QAA4BktB,UAAqBE,SAErD,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,S,C;A,C,C,CAmGA;EACMI;GAAAA,QAAoC;EACD7W,OAAvC6W;QAAyBC,KAAc9W,0BAC1BA,AAAAA,gBAEf,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA,oBACqB6W,AAAAA;GACF,QAAS9a,OAC5B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA,mBACE;MAAyB8a,UAAAA,8BrBlh/B0B9mB,KAAAA,MAAoBO,6BqBkh/BvE,OACEyL,ArBh/+Bara,SqBi/+Bf,AACAm1B;OACA7W,AAAAA;cACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,CArCA+W,YACE/W,QAAc,KACAgX,0BAChB,A,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkBc,WAAG,MAAGpB,qBAAa,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA6BjC/V,cACE,uBAA2BoX,sBAC7B,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,CA0dA19B,YAIE,uBAo7DckI,sCAn7DhB,A,C;A,C,C,CAGA,mBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,mBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA,mBACQ,KAAA,oCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAMA,qBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,yCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUAnJ,mBACQ,KAAA,2CACR,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAUA,yBACQ,KAAA,2CACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,8CACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAkxDAiB,YAAyB,qBAAwB29B,KAAAA,kBAAe,A,C;A,E,CAEhEj/B,YAAe,MAAGi/B,AAAAA,gBAAY,A,C;A,C,C,CAI9B,cAAsBA,KAAAA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1C5+B,cAA4B,MAAG4+B,MAAAA,WAAqB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEpD,YAAeA,KAAAA,SAAe,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAI9Bj+B,oBAA4Bi+B;gCAAAA,SAAH;MAAGA,MAAY,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAExC,sBAAwCA;gCAAAA,SAAAA;OAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAE9D,cAAiCA,KAAAA,WAA0B,A,C;A,E,C,CAE3D,cAAqCA,KAAAA,WAAqB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAE1Dj/B,gBAA6C,MAAGi/B,MAAAA,aAA6B,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAE7Ej/B,gBAA6C,MAAGi/B,MAAAA,aAAiC,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEjF,gBAAkC,MAAGA,MAAAA,aAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIjE,oBACEA,KAAAA,iBACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,gBAAuCA,KAAAA,aAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,C,C,CAqBtE5+B,WACE,MAAOkY,AAAAA,aACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEAvX,WAAc,MA0DGyI,AA1DA8O,YAAiB,A,C,C;A,E,C,C;A,G,C,e,C;A,C,C,CA8ClClY;EAC+B,AAAVovB;EACAlrB;GAAF,KACfkF,QAAWy1B,KAAAA,UACXzP;SACA;SAEFhmB,YACAgmB;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEAnX,WAAc,MAAG7O,SAAQ,A,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmFlB,kBXtlkCoBmE;;qCW6lkCzB;iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,G,CA2IAirB,YAAsB,MAAGsG,MAAyCC,gBAAS,A,C;A,E,C,CAK3E,YAAa,MAA2BA,iBAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEhD,kBAEqCA,yBAIrC,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CAeA5D,YAAc,YAAS,YAAwB,A,C;A,E,C,CAE/C,kBACI,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIrC,kBACuB,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,C,CAlBxD/4B,0BAEI;KAGA,mBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,G,CAmTAlC,YAAgB,MAAQg9B,cAAa,A,C;A,G,CACrC,cACOA,eACP,A,C;A,G,CAGAh9B,YAAgB,MAAQg9B,cAAa,A,C;A,G,CAYrCh9B,YAAgB,MAAQg9B,cAAa,A,C;A,E,C,CAuCrC,YAAc,MAA4BA,kBAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAI/Ch9B,YAAkB,MAAgCg9B,oBAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C,A,E,uB,kB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,a,C,C,A,E,gB,W,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,uB,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,+H,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,kD,C;A,K,C,I,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,+B,C,C;A,E,C,C;A,G,C,2C,C;A,K,C,I,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,4B,C,C;A,G,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,6B,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,6B,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,0B,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,2C,C;A,K,C,I,C;A,G,C,wB,C,C;A,G,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,U,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,8B,C,C;A,E,C,C;A,G,C,U,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,iB,C,C;A,G,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,sB,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,K,C;A,G,C0Dpi7BvDnD,eACMiF,qBACFA,0BAEF;MAAOA,gBACT,A,C;A,G,CAEAp+B,YAA2B,4CAAyC,A,C;A,G,CAEpE,wD1Dw+bEi7B;KAAAA,A2DzvmBAoD,WDoxKAnF;UACF,A,C;A,G,CA4YAe,YAAkC,MAAGC,YAA4B,A,C;A,G,CAKjED,YAAsC,MAAGE,YAA2B,A,C;A,G,CA2EpEF,YAAiC,MAAGG,YAA2B,A,C;A,G,CAuD/DH,YAA0C,MAAGI,YAA+B,A,C;A,K,C,I,C;A,K,C,I,C;A,G,C,0d,C,C;A,E,C,C;A,G,C,8B,C;A,E,C,CAwP5EzB,yCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,G,C,e,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,G,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,wB,C,C;A,G,C,C;A,G,C,yB,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,W,C;A,G,C,0D,C,C;A,G,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,e,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,sE,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAx0B/CiE;E1DuzyBSZ,A0DtzyBSA;EAEA;WAEd,QAEF;MAAoBmB,+B/E1gKgB98B,8B+E0gKpC,UACmB6H,K/EzgKJK;G+E0gKT,A5EpjKY7I,a4EqjKdoY,SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,Y1D2yyBEkkB,A0D1yyBAA,6BAA+BlkB,aACjC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C,A,E,oB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,yB,C;A,G,C,U,C,C,A,E,gB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,M,C,C,E,CE7wKMxX,WAAqB,gB7Eq7Fb,gCAAS,4C6Er7FoB,A,C,C,C,A,E,W,U,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C9D0C7C+9B,cACE,qJAOF,A,C,oB,C,I,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC;gBAEgB;;IAGd,MAAOC,MRlEEn/B,OQiEM,IAAcwJ,wBRhEQ41B,aQkEvC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CA0VAr/B;sEAIM;kBAFF,QAQF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAoM,2DAEI,WAEF;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAIAjM;WAEI;;;;;KAIA;;4CAEA,MAAOF;iDAEP,MAAOq/B;iDAEP,MAAOC;KAOP,MAAOA,wCAGX,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEAnzB,sBACgBozB;cAEFC,WACVC;YAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIAtzB;wEAKI;;;KAKA;0BAGA,MAAO;mCAEP;KAEA,MAAOuzB,UAEX,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEAC,oCAEI,MAAOC;2BAGP,MAAOA;KAGP,MAAOA,2BAGX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAzzB,sBACkBozB;YAQS,0BACXC,WACZC;YAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,C,C,CAnVEv/B,gHAIE;MAAO2/B,MAA8BrxB,YACvC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAQA9H,kHAImB8H;WAAqB2wB,QACxC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAEAz/B,YAAiB,SAAI,A,C;A,C,C,CAErBK;;QAAuB;iDACGyO,UAAW7M,KAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQrD5B,YAIE,YAAsCyO,QACxC,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA0BAvO;aAEqCuO,QAAjC;kBADF,OAGE;yCAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAQAtO;EAImDsO;eAEvB,IAAcsxB,uBAFxC;MAAOD,uBAGT,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,CA9KA3+B;EACei+B;WAEX,MAAOO;QASiBl2B;UAAf;;;SAQX;MAAOk2B,eACT,A,C,E,CA8BAx+B,YAIE,MAAOw+B,MAAYK,SACrB,A,C,E,C,CAEA59B,YAwBE,MAAO69B,UAvBiB,2BAwB1B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAtBEA;;GACMC,QACF,MAAOA;;iDAIPA;UACA;MAAA,KAAgBZ,UAAhB,UAAA;KAC6CW,YAASX,UACtD,AACA,wFAGAY;UACAC;UAAqBb,aACrB;cAEA,MAAOF,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CA0JFgB;GACY,UAAa,sDACf,KAAA;;GAEA,UAAe,sDACf,KAAA,qDAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAIAz/B;4BAG+B0/B,2DAzBF;;EAAa;;UAChC,qDA2BR,0CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;4BAG+BA,2DAlCF;;EAAa;;UAChC,0FAqCV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA1gC,YAAe,iDAAkB,A,C;A,E,CAEjC,0DAAwD,A,C;A,C,C,CAKxD,cACE2gC,oBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cAIEA,oCADM,gBAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,sBApDoD;6BAAA;EAAV;UAChC,oDAqDRA;0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAYA,gBACEF,YACAE;oBAAiC,MACnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;;GAlEY,UAAa,sDACf;;GAEA,UAAe,sDACf;EAgES;GACN,UAAM;GACH;OACH;UAAwBp/B,AAAAA,kBACnCo/B;oBACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cACEA,oBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA+CoD,kBAC/BpB,UAEjBQ;gBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAGI,YAAI,yBAAgC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAuCpC,YAAI,mBAA2B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAG/B,YAAI,gCAAwB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAG5B,YAAI,mBAAyB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,a,Y,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C+D9gBnCt9B,gBACoB,UAAQ;EACR,UAAQ,GAAuB,AAAA,CAAR,kBACzC;MAAY,GAAQ,MACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA,cACoB,UAAQ,GAAuB,AAAA,CAAR;GACrB,MACpB;MAAkB,WAAQ,GAAuB,AAAA,CAAR,kBAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CC+BFd;;GAOQ,IAAK;GACL,IAAK;wDASL,MAAmB,AAAJ,CAAL;UAIAF,aAAgBA,YAAS,QACvC;SAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAUAE;;GAOQ,IAAK;GACL,IAAK;wDASL,MAAS;GAITF,YAAS,QACb;mBAGYJ,YAAc,QAC5B;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CCxEErB,eACU,MAAY,kBACZ,KAAA,yDAER;2BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CAmHA;EAE2B4gC;EAAF;EACH,CAAA;EAED;EACC,CAAA;EAGU,AAAV,IAAYC;EACpB,CAAA,iBAAZD;SAEAC;QAAkD,CAAA,AAAb,QAAX,AAAV,AALI,KAHA,MAOA,iCAItB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA7gC;GACU,MAAY,kBACZ,KAAA;EAEQ;IAAP,UAEP8gC,SACA;MAAW,CAAA,AAAJF,eAKT,GACEE;EACQF;YAEsB,AAAP,AAAT,kBAA4B,AAC5C;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAjHAG;EAEW,cAGT;;EACiB;EACK,KAAP;;EACG;EACK,KAAR;EASa,CAAX,CAAA,AAAL,qBAFO,AAAA;EAGJ,CAAA;EAC8C,AAAnC,AAAV,CAAN,AAAA,SAHmB,CAAA,AAAP,MAAc,aAGQ,QAAP;EAOtB,CAHT,CAAA,GADiB,AAAP,OAAe;EAKhB,CAAA;EACuC,AAAjC,AAAN,CAJR,CAAA,EAHU,iBAOqB,QAAP;EAOhB,CAHT,CAAA,GADiB,AAAP,OAAe;EAKhB,CAAA;EACsC,AAAjC,AAAL,CAJR,CAAA,EAHU,gBAOoB,QAAP;EAIxB,CAAA,GADiB,AAAP,OAAe;EAExB,CAAA,EAHU;EAOR,CAFM,AAAA;EAGA,CAAA;EAC2B,QAAP;EAIpB,AAAJH;EACI,CAAA,iBAAbA;;EACmD,CAAA,AAAjC,AAAP,AAAJC,aAA4B,QAAP,+BAA5BA;SACAD;QAAI,CAAA,QACJC;QAAI,CAAA,EARoD,AAAjC,AAAV,GAHU,CAAA,AAAP,MAAc,oCAYlB,CAAA,UAAc;GAExBA,aAAYD,YACdA,aAEFE;SACAA;SACAA;SACAA;UACF,A,C;A,M,C,C,G,C,U,C,E,CAnEAC;;SAmEA,A,C,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CCtJAxgC,YAAkB,mBAAWsG,iBAAIm6B,YAAG,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CASpC3gC;;;2CACuB;EACdwG;EAAK5E,GAAZ;+BAAyB,KAAF++B,OAAK/+B,KAC9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAA0C6G,KAAAA;EAAYm6B,KAAAA,OAArC;MHQSC,MAAOhqB,KAAQA,cGRwB,A,C;A,C,C,CAOjE0kB;EACsB90B;;EAAI5E;;6BAAAA;WAAF,IAAa,KAAF++B,OAAI/+B;wCAArC;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAOA05B;EACsB90B;;EAAI5E;;6BAAAA;WAAF,IAAa,KAAF++B,OAAI/+B;wCAArC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAWA05B,oBACsB90B;;;WAAE,IAAY,KAAFm6B;wCAAhC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,G,CC/BA1oB;EAAe0X;EAAO6M;;6BAAAA,OAAV;MAAQ,KAAO,A,C;A,G,CAE3BvkB;EAAgBskB;EAAME;;6BAAAA,OAAT;MAAO,KAAQ,A,C;A,E,C,CAE5Bv8B,YACE,wBAAoByvB,yBAAO4M,kBAAMC,kBAASC,SAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEAz8B;;;2CAC2B;EAClB2vB;EAAQ/tB;4BAAc26B;EAAO36B;4BAVvB+tB;EAAO6M;;6BAAAA;GAAF,MAUwC56B,YARtC66B;;6BAAAA;EAAF,MASJ76B,sCADd;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAA0CgwB,KAAAA;EAAe4M;EAAAA;EAd1C5M;EAAO6M;;6BAAAA;EAAF;EAEEC;;6BAAAA;EAAF,cAYH;MJHbmE,MAAOhqB,KAAQA,KAAQA,KAAQA,oBIIC,A,C;A,G,CAsEpC0kB,2BAAqC,eAAW;wCAA3B;SAAoC,A,C,C;A,E,C,C;A,G,C,oB,C;A,K,C,I,C;A,K,C,I,C,C,A,E,gB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CC7FrD1hB;;4CACoB;EAGRwG;;iGAIhB;MAAO,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEMvH,eACI,cACCgoB,eAAP;cAEF,MhDgeO1nB,MzCjb4B1M,SyF9CrC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C,C,A,E,gC,mC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCqLErK,gBACQ,KAAA,0CACR,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,S,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,C,C,CAMA,gBAAkC,MAAGsgB,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAY7C,cAA6B,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMxClU,cAAkBkU,OAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAM5B,YAAa,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CCiDxBlU,cAA0B,MAAGsyB,AAAAA,gBAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEvC,gBACEA,AAAAA,iBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA,cACEA,AAAAA,gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,YACEA,AAAAA,cACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA9gC,YAA6B,MAAG8gC,AAAAA,eAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEtD9gC,YAAiC,MAAG8gC,AAAAA,eAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE9D,cACEA,AAAAA,gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA9gC,YAAiB,MjFyMGkE,AiFzMA48B,gBAAa,A,C;A,G,CAEjC9gC,YAAoB,MjFwMG,AADHkE,AiFvMG48B,gBAAgB,A,C;A,G,CAEvCrgC,kBAAwBqgC,OAAH;qCAAa,A,C;A,E,CAElCnhC,YAAe,MjFkMGuE,AiFlMA48B,YAAY,A,C;A,E,C,CAI9BtyB,cAAqB,MAAGsyB,AAAAA,iBAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEzCrgC,kBAA0BqgC,OAAH;MAAGA,UAAY,A,C;A,K,C,I,C,C,A,E,kC,0B,A,A,C,C,C,C;A,G,C,E,C;A,E,CCkJxCC;SAAAA,A,C;A,E,CA6BAA;SAAAA,A,C;A,E,CAgBAA;SAAAA,A,C;A,E,C,C;A,G,C,K,C;A,G,CAleE1gC,YAAqB,YAAa,A,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA+BlC;GACY,UAAa,cACf,KAAA;uDAIV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,6BAC0D,UACtD2gC,eAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEArhC,kBAKEshC,YAA0B,IACT;SAInB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,G,C,wC,C,C;A,E,C,C;A,G,C,K,C;A,G,CAoEA5gC,YAAqB,YAAW,A,C;A,K,C,I,C;A,G,C,U,C,C;A,E,C,C;A,G,C,K,C;A,G,CAyYhCA,YAAqB,YAAc,A,C;A,C,C,CAEnCiB,oBACqBf;aA/dqC,UACtDygC,cA+dF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aApeqC,UACtDygC;OAqeJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,qCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAF,YAAqB,YAAc,A,C;A,C,C,CAEnCiB,oBACqBf;aA9gBqC,UACtDygC,cA8gBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aAnhBqC,UACtDygC;OAohBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,qCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAF,YAAqB,YAAY,A,C;A,C,C,CAEjCV,oBACqBY;aA7jBqC,UACtDygC,cA6jBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aAlkBqC,UACtDygC;OAmkBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,mCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAF,YAAqB,YAAY,A,C;A,C,C,CAEjCV,oBACqBY;aA5mBqC,UACtDygC,cA4mBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aAjnBqC,UACtDygC;OAknBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,mCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAF,YAAqB,YAAW,A,C;A,C,C,CAEhCV,oBACqBY;aA3pBqC,UACtDygC,cA2pBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aAhqBqC,UACtDygC;OAiqBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,kCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,W,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAF,YAAqB,YAAa,A,C;A,C,C,CAElCV,oBACqBY;aA1sBqC,UACtDygC,cA0sBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aA/sBqC,UACtDygC;OAgtBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,oCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAF,YAAqB,YAAa,A,C;A,C,C,CAElCV,oBACqBY;aAzvBqC,UACtDygC,cAyvBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aA9vBqC,UACtDygC;OA+vBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,oCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAF,YAAqB,YAAmB,A,C;A,E,CAExCV,YAAe,gBAAmC,A,C;A,C,C,CAElDA,oBACqBY;aA1yBqC,UACtDygC,cA0yBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aA/yBqC,UACtDygC;OAgzBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAIE,0CAHMsgC,cAAmC3gC,YAI3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,oC,C,C;A,E,C,C;A,G,C,K,C;A,G,CAoCAF,YAAqB,YAAY,A,C;A,E,CAEjCV,YAAe,gBAAmC,A,C;A,C,C,CAElDA,oBACqBY;aAj2BqC,UACtDygC,cAi2BF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqBzgC;aAt2BqC,UACtDygC;OAu2BJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApgC,gBAGE,mCAFMsgC,cAAmC3gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,a,C,C;A,G,C,C;A,G,C,K,C;A,E,CA/dAZ,YAAe,gBAAmC,A,C;A,E,C,CAElDK;EAGkC,AADb,UACnBihC;cACAA;;GACU,eAAa,KAAA;EACP;GAEF;EAEKn4B;6BAJH;GAKa,AAAZ;UAIkB,qBAGA;WAGrC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CASA;6CAGIq4B,kBACA;8CAGJ,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CASA;6CAGIA,kBACA;8CAGJ,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C,C,A,E,0B,sB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCngBF,yDAII;kFAOA;kCAKA;qCAMA;qDAOJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCpC0BluB,YAAwB,MAAGmuB,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAuCruB,cAAiCquB,KAAWlsB,eAA6BksB,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAE7LC;;ElEyFqB;;;gBC5CI;;;;;;SiE7CmB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6E,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCEnBnhC,YAAgB,MAAGohC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BvuB,cAAyBuuB,KAAUpsB,eAA4BosB,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzIphC,YAAoB,MAAGqhC,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAA8CxuB,cAA6BwuB,KAAcrsB,eAAgCqsB,QAAqB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAEjLC,YAAsB,MAAGnrB,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C,C;A,G,C,CAAqCtD,cAA+BsD,KAAcnB,eAAgCmB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAC1KorB,YAA2B,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAA6D3uB,cAAoC2uB,KAAaxsB,eAA+BwsB,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAElO,wBACa,KAACnJ;EANsIrjB,eAAgCqsB,OAA9CA;;GAOvH,oBACJI,KATiCL,cAA+DA;KAAUpsB,eAA4BosB,SAWjJ,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,gB,C,C;A,E,C,CAEA,2BAEE/I;;EAf0C+I,IAA+DA;KAAUpsB;GAsBtG,AAnBkCmB,czFqoD1ClT,QAA8B;E0F/nD5By+B,ODeLhiC;gBACAiiC;KArBmDH,SAsBnDj5B,AAAAA;8BAIJ,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,E,C,CAEA,oBAGSq5B,KADiBvJ,eAlCiF+I;KAAUpsB,eAA4BosB,QAoCjJ,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Y,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEAS;EC7BSH;;EpE8EY;;;gBC5CI;;;;;;;;SkELiB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAZlB,YAChBhiC,uBACJ,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,8B,C,C,G,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CElCJoiC;;ErE6FqB;;;gBC5CI;;;;;;;SoEjDkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCCnBhtB,YAAqB,MAAGitB,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAoClvB,cAA8BkvB,KAAW/sB,eAA6B+sB,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAGpL,cACEjhB,AAAAA,KAJ8CihB,YAKhD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAC;;EtE2FqB;;;gBC5CI;;;;;;SqE/CmB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,wF,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCDpBliC,YAAmB,MAAGmiC,MAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAAyCpvB,cAA4BovB,KAAejtB,eAAiCitB,QAAsB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,W,C,G,C,C;A,E,C,CAErM;gCAEEjtB;mBACAA;;ECL+CktB;EDO3B;KAA4B,AAAjBC,sBAOgGC;KAAeptB,eAAiCotB;;EALnJ,AAAhBD,sBACwB,AAAxBA,KAAAA,8BACwB,CAAA,KAAxBA,KAAAA,sCAI+GE;KAAcrtB,eAAgCqtB,QAH3K,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,G,C,CAEyBviC,YAAmB,MAAGsiC,MAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAA0CvvB,cAA4BuvB,KAAeptB,eAAiCotB,QAAsB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,W,C,G,C,C;A,G,C,CAC9KtiC,YAAkB,MAAGuiC,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyCxvB,cAA2BwvB,KAAcrtB,eAAgCqtB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CAEhMC;;EvE2EqB;;;gBC5CI;;;;;;;;;;SsE/BqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,yB,sD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CEhBtBxtB,YAAwB,MAAGytB,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAuC1vB,cAAiC0vB,KAAcvtB,eAAgCutB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAGzM,cACE94B,AAAAA,KAJiD84B,YAKnD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAC;;EzE0FqB;;;gBC5CI;;;;;;SwE9CsB,A,C,I,C,I,C,C,C,C,C,G,C,iC,C,C,C,C;A,sB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,S,C;A,E,C,CCyB/CC,WAAsB,gBAClBC,QAAkB,KAAXC,YAAkC,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,G,CAG7CljC,YAAc,MAAc,MAAXkjC,WAAkC,A,C;A,M,C,C,G,C,K,C,E,CAtBnDF;kBAEoD,KAAX,KAAb,KAARlH,QAAU3xB,SAAa2xB,aAA+B,A,C,C,C;A,G,C,C;A,G,C,C,uG,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAoCjDv7B,YAAkB,MAAG4iC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiC/vB,cAA2B+vB,KAAY5tB,eAA8B4tB,QAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACxJ9tB,YAA6B,MAAG+tB,MAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAA4ChwB,cAAsCgwB,KAAmB7tB,eAAqC6tB,QAA0B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAK5O;;EAEyBC,kEAAvBC;MACAA,AAAAA;WAAwCC,aAC1C,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAGAvjC,uBAEE;MAAA,YAAA,UAAA;6BAAA;EACwB,AAAN,QAClB,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEA,kBACEwjC,KAAAA,SACAC;KAAAA,SACAC;KAAAA,KAAgBC,gBAClB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,W,C,C;A,E,C,CAEA,+BACE;MAAA,KAAmBC,mBAAnB,UAAA;;GACqB,CAAA,KAAfC,yBACF7wB,ApFgKoB;WLpJjB1S,KyFTmBujC,SAAAA,KAAAA;ehB5Ca;GgBuD/BC,UAAkBA,UAAkBA;EATvBD,kBAbrBL;KAAAA,SACAC;KAAAA,SACAC;KAAAA,KAAgBC,gBAYhB,AACAI,0BACAA;uBACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,kB,C,C;A,E,C,CAEAjjC,iChBpDyC,OgBuDvC;OAAQgjC,UAAkBA,UAAkBA,eAC9C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,gB,C,C;A,E,C,CAEAvjC;EACc,KAAmByjC;EAvETd;EAApBD,KAAAA,KAAAA,QAA2C,UAwE7C;MAAOO,MAAAA,KAAeE,KAAAA,KAAgBC,eACxC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,c,C,C;A,E,C,CAGA3jC;EAC+B,KAAZikC,KAAcD,KAAAA;EAtEL,KAAXd,AAuEH,KAAmBc;;EACT;EACC;EACXE,KAzD0Cd;6BAuDhC;GAGhB,QAA4Be;6BAAAA;EAAF;QzFjBzB7jC,KyFkBY6jC,KAAAA;EACCD,KA5DkCd;6BA4DlCc,OADlB;MAAmD,QACnC,UAEhB,SAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEA;;SAC6BE,KAAAA,UAAW3+B;EACTA;EArBjB,KAAmBu+B;EAvETd;EAApBD,KAAAA,KAAAA,QAA2C;EAwEtCO,KAAAA,KAAeE,KAAAA,KAAgBC;EAqBlB,2BAtE6FR;KAAY5tB,eAA8B4tB,QAuE7J,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,kB,C,C;A,E,C,CAEA;EAxEwDC;YAyEzBE,WAC3B,MAEFe;UACIH,qBAA6BA,KA7EqBd;EA8E1Cc,KA9E0Cd;EA+E1CE,KAAAA,KAAAA;EAAAA;EAGyB,KADA,KAAjCY,KAjFkDd,wBAkFlDc,KAlFkDd;6BAkFjB;EAFC,GAAtCa;;EAG2BE;6BAAAA;E/E05CpBG,KAA8BC,A+Ex5CjCjB,KAAAA,wBAFqB,KACzBU;MAEAV;KAAAA,KAA6BU,QAC7BV;KAAAA,KAA8BU,KAAAA,MAC9BQ;aACF,A,C,Q,C,K,C,C,C,C,C,G,C,0B,C,C;A,E,C,CAIA;EACcN,KA9F0Cd;;8BA+FrBe,iBAhGgFhB;KAAY5tB,eAA8B4tB;;GAiG7I,MAAGgB,SACf;EAEqB,MAAEF;EACb,KAAmBD;EACjBG,KAAAA;;GACd;YAAoB/O;6BAAAA;KAAF;EACJA;EACEA,MAAU;EACZqO,KAAAA,OACZ;iBAAY,SAAG,gBAvIjBR;EACIC;SADJD;KAAAA,UAC2B;aAQP,UAiIlB,KACF,EACkB,OAAEgB,KACpB;YAjIef;;EAfKD;;EAAF,KAeQ,SAfNA;EAAmB,KAeb,SAfgBA;;IAgJrB;QA7IrBA;KAAAA,WAC2B;aAQP,UAuIpB,EACAK,KAAAA;EACIU,IADJV;iBACyCU,UAEzC;yBAGF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,c,C,C;A,E,C,CAEA,oBA5HwDZ;WA8HpD,MAEFc,AAAAA,AAAAA,AAAAA,AAAAA;2DAMF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,cAEE,uBAGF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,sB,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,uB,C,E,C,CA3IAO;EhG2lDOjhC,QAA8B;EAA9BA,QAA8B;EAA9BA,QAA8B;;EsBjjDhB;;;gBC5CI;;;;;;;;;SyEGzB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,M,C,CAoHa,WACTghC,YAAuB,gBACzB,A,C,Q,C,I,C,C,C,C,C,G,C,M,C,C;A,K,C,I,C,C;A,sC,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAO0C;;SAhI8GpB;QAAmB7tB,YAAqC6tB,aAmIhN,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,iC,C,C,G,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAc,cACZpwB,ApFyDsB,+BoFxDxB,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,iC,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAKW,WACT0xB,aACF,A,C,Q,C,I,C,C,C,C,C,G,C,M,C,C;A,K,C,I,C,C;A,8C,C,C,G,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qH,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CC9JsBrvB,YAAuB,MAAGsvB,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCvxB,cAAgCuxB,KAAapvB,eAA+BovB,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CA6BlM;;EAGMtB;gBtFQc,+BAKlBzvB;KAAS,KAAagxB,uBsFdtBC;MAEAA,AAAAA;wBACAA;KAAAA,KAAAA,qBACAA;KAAAA,KAAAA;EAEIxB;gBtFGc,+BAKlBzvB;KAAS,KAAagxB,0BsFTtBE;MAEAA,AAAAA;;EAEIzB;gBtFAc,+BAKlBzvB;KAAS,KAAagxB,0BsFNtBG;MAEAA,AAAAA;;EAEI1B;gBtFHc,+BAKlBzvB;KAAS,KAAagxB,uBsFHtBI;MAEAA,AAAAA;wBACAA;KAAAA,KAAAA,qBACAA;KAAAA,KAAAA,yBACAC;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAIA;EApDkDN;cAqDtBO;;oEACK,KAA1BA,KAAAA,KAtD2CP;KAuD9C,MAIFQ,AAAAA;SACAC,AAAAA;SACA;MAAA,KAAuBF,KA7DyBP,iBA6DhD,UAAA;GACMU;;EAIUzvB,KAAAA;EACJA,AAAAA,oBACVuvB;KAAAA,oDAEOG,uBACHA,eACAA,eACAA,eACAA,eACAA,eACAA,eACAA,eACAA,gBACJF;KAAAA,oDAEQG,uBACHA,eACAA,eACAA,eACAA,eACAA,eACAA,iBACP,AACAC,AAAAA;EACWN,KAAAA,KA1FqCP;SA2FhDa;KAAAA,aAAiCC,eACjCD;KAAAA,aAAkD,KAAjBC,kBAAmBA,gBACpDD;KAAAA,iBAAqCC,mBACrCC,AAAAA;;EACOR,KAAAA,KA/FyCP;SAgGhDe;KAAAA,aAAiCD,eACjCC;KAAAA,aAAkD,KAAjBD,kBAAmBA,gBACpDC;KAAAA,iBAAqCD,mBACrCR;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,kB,C,C;A,E,C,CAEA,eACOJ,YAAwBG,WAC3B,MAEFA,AAAAA;SACAA,AAAAA;QAAoBI,KACpBP,AAAAA;SACAA,AAAAA;QAAgBM,KAChBL,AAAAA;QAAkBU,KAClBT,AAAAA;QAAkBW,MACpB,A,C,Q,C,K,C,C,C,C,C,G,C,O,C,C;A,E,C,CAEArlC;;EACiBslC;EACAA,YACf;MAAA,QAAA,UACiB,CAAA,KADjB,UAEI,QAEJ,AACA;MAAA,QAAA,UACiB,CAAA,KADjB,UAEI,QAEJ,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,wB,C,C;A,E,C,CAEAnlC;iBAKM,MAAOmlC,MAAAA;gBAEP;MAAoC,MAA7BA,KAAAA,gBAA+BA,KAAAA;OAEtC,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;gBAEP;MAAoC,MAA7BA,KAAAA,gBAA+BA,KAAAA;OAEtC,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;cAEL,KAAA,QACR,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,uB,C,C;A,E,C,CAEAnlC;iBAKM,MAAOmlC,MAAAA;gBAEP;MAAkC,MAA3BA,KAAAA,gBACAA,KAAAA;gBAEP;MAA6B,MAAtBA,KAAAA,gBACAA,KAAAA;gBAEP;MAEoC,MADK,KADL,KAA7BA,KAAAA,gBACAA,KAAAA,iBACAA,KAAAA,iBACAA,KAAAA;gBAEP;MAAyC,MAAlCA,KAAAA,gBACAA,KAAAA;gBAEP;MAA0C,MAAnCA,KAAAA,gBACAA,KAAAA;gBAEP;MAAoC,MAA7BA,KAAAA,gBAA+BA,KAAAA;cAEpC,KAAA,QACR,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,2B,C,C;A,E,C,CAEA,oBAzLkDhB;WA2L9C,MAEFO,AAAAA,AAAAA,AAAAA,AAAAA;sEAMF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,wBArMkDP;WAuM9C,MAEFO,AAAAA,AAAAA,AAAAA;sEAMF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,kB,C,C;A,E,C,CAEA,cACEU,UACArwB;kBAA4CswB,YAC5CtwB;kBACqBuwB,YACrBvwB;kBAAgDwwB,aAClD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,gB,C,C;A,E,C,CAEYxlC;EAzNsCokC;WA2N9C;;EAGSO,KAAAA;SAEX;MADQ,SAAyB,KAAV,KAAbO,oBAAyBA,+BAErC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,kB,C,G,C,C;A,E,C,CAEYllC;EAnOsCokC;WAqO9C;oBAIF;WAAUc,KADCP,KAAAA,mCAEb,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,sB,C,G,C,C;A,E,C,CAEY3kC;EA5OsCokC;WA8O9C;oBAIF;MC7LO99B,MD6LiB4+B,KADbP,KAAAA,sCAEb,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,8B,C,G,C,C;A,E,C,CAjPAc,2BtFPe,KAAapB,6BsFQ1BO;MACAA;sBACAA,AAAAA;iCACAA,AAAAA;4CACAA,AAAAA;yCACAA,AAAAA;mCACAA,AAAAA;iCACAA,AAAAA;4CACAA,AAAAA;yCACAA,AAAAA;;WtFjBa,KAAaP,6BsFkB1BY;MACAA;qBACAA,AAAAA;;WtFpBa,KAAaZ,6BsFqB1Bc;MACAA;qBACAA,AAAAA;;WtFvBa,KAAad,6BsFwB1BQ;MACAA;sBACAA,AAAAA;+BACAA,AAAAA;yCACAA,AAAAA;2BACAA,AAAAA;sCACAA,AAAAA;mCACAA,AAAAA;uCACF,A,C,I,C,I,C,C,C,C,C,G,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,2D,C,E,C,CAzBAY;;E3E4DqB;;;gBC5CI;;;;;;;;S0ESzB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAkKiD;;SA7LiFrB;QAAapvB,YAA+BovB,aAgM5K,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,qC,C,C,G,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAc,cACZ3xB,ArFcsB,+BqFbxB,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,qC,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAOqD;;SAzM2E2xB;QAAapvB,YAA+BovB,aA4M5K,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,8C,C,C,G,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAc,cACZ3xB,ArFEsB,+BqFDxB,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,8C,C,C,G,C,C,A,E,e,mB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CvBhJJ2pB;;EA8FapL,0DACX0U;mBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAoBAhN,sBAwEE;MADW1H,8DAEb,A,C,iB,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkDA2U;;+CAeeC;;sBASX,SAMF,yCAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIAzM;4CAEI,aACI0M,cAAgBA,aAAkBA,IAExC;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CyBzWE3jC;cAEe4jC,KAPgB/xB,AAAAA,qCAO3BgyB;OAEF,SACF,A,C;A,E,CAyBA7jC;cAEgB,AAAC8jC,aAAWF,KArCG/xB,AAAAA,sCAqC3BkyB;OAEF,SACF,A,C;A,E,C,C;A,G,C,Y,C;A,M,C,CzBgDAxmC;;EACewI,QACb;QAAkB,WACFA,SAAmB,QACnC,AACAA;SACAi+B;iBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CACAC;8BAAgB;MAAGD,MAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAC5BE;8BAAsBF;OAAe,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACrCR,YAAgB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAGhB1U;;WACiB;wBACA;uBACD;uBACG;;4CAEf,gBA5DyBqV;iDAgEnB,KAAA;4CAUO;4CACA;4CAIK;4CACO;4CAED;+CAGbC;EACAH;;GACF,QAAS;;KAElBC;mBACA/N;wBAGA;qFAQaA;EACFiO;EACAH;GACF,kCAGLC;oBAEF,uBAQFA;;6BAhBa/N;GAkBb;KAAU,WACErH,YAAKqH;8BAAfnxB;OACF,AACA,cAGI,KAAA,wCACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CApCc,0BAC4B8pB,kBACpC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkENvxB;;EACewI,QACb;QAAkB,WACFA;yBAAmB,SACnC,AACAA,SACAi+B;iBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CACAC;8BAAgB;MAAGD,MAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAC5BE;8BAAsBF;OAAe,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,M,C,CAErClV;WACiB;wBACA;uBACD;uBACG;qBAGf,MArLG;4BA0LG,KAAA;kDAMKsV;EACAH;GACF,QAAS;E1Eq5CfljC,QAA8B,+B0El5CjCmjC;mBACA;uC9E2CkCplC,8B8E3ClC,U9E6CakI,I8E5CXhC;QAAY8pB,mBACd,AACA,kCAIWsV;EACAH;GACF,QAAS;;EAEL9N;uBAIb+N;;6BAJa/N;;GAMb;KAAkB,QAChBnxB,QAAU8pB,YAAKqH,UACjB,AACA;SAKF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,C0B1RAr4B,YACE,MAAOumC,AAAAA,qBACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CASAzmC;EACkBymC;GAEmB,CAAC9tB,gBAElCA;UAGAA;KAEF+tB,UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,CASAzlC,kBAAiCwlC;kBhG80CQ7Y,uBAyXvCI;KAAQM,AAAAA,OgGvsDoB;SAAyB,A,C;A,E,C,CAIvD,cACEmY,AAAAA,kBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAvmC,cAAqC,MAAGumC,AAAAA,mBAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAErEhmC,oBAAmCgmC,SAAH;MjD4JF,+BiD5JyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEvDhmC,oBAAkDgmC,SAAH;4CAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMxEzmC,cAAiC,MAAGymC,AAAAA,mBAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAExDzmC,YAAiB,MhG8zCGkE,AgG9zCAuiC,kBAAqB,A,C;A,G,CAEzCzmC,YAAoB,MhG6zCG,AADHkE,AgG5zCGuiC,kBAAwB,A,C;A,E,CAE/C9mC,YAAe,MhGyzCGuE,AgGzzCAuiC,cAAoB,A,C;A,E,C,CAmBtCzmC,cAA4B,MAAGymC,AAAAA,mBAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAG5DvmC,YAA4B,MAHGumC,AAAAA,0BAG8B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAQ7DzmC,cAGE,MAAO49B,sBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CASA59B;EAEkBymC;EACF9tB,SACd+tB;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQA,cAEE9I,qBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAmDA19B,kBhGgwCMwtB,AgGhwCa+Y;wCAAH;MhGiwCP/Y,SgGjwC4B,A,C;A,E,C,CAErC9sB,cAA6C,MACzC6lC,AAAAA,mBAAwC,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAK5ChmC,oBAAgCgmC,SAAH;MjDwHpB,0BiDxH4C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASrDvmC,cAA4B,MAAGumC,AAAAA,mBAA8B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE7D,YACE7I,oBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAYAA;EACkB6I;EACN73B,WACV83B;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CApHgB,YAAI,MAAG/tB,eAAW,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA0BzB,YAAI,MAAGA,gBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAwExB,YAAI,MAAGA,SAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,G,CxBrKxB/X,iBACyBq+B,OADG;MAC1B,KAAuBA,4BAAuC,A,C;A,E,C,CAEhE,cjFsISz+B,KiFrIPmmC,cACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEA,sBA+FkCA;gCAAAA,SA9FhC;KA8FgCA,QA7FlC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA;EA0FkBA,AAAAA;;GAxFF,SACZ;QACmB,mDAIrBC;eACF,A,C;A,C,C,CAEA,c3D6smBE/K,AAAAA,A2D5smBAoD,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,qBACE;MAAA,U3DwsmBApD,A2D5smBAoD,WAIA,O3DwsmBApD,c2DxsmBA,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA77B,cAC0B,SAG1B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIA,mBACQ,KAAA,kCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAEA,yBAEQ,KAAA,yCACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUA,gBjFgFSQ,KiF/EPmmC,QAAAA,4BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,Y3D4vmBE9K,KAAAA,A2DzvmBAoD,eACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUA,gBACEA,AAAAA,kBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA;E3DmxmB8BpD,A2DlxmB5BoD;E3DkxmB4BpD;0BAAAA,SA/F5BA;SA+F4BA,M2DjxmB9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQA77B,cAC2B,SAS3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAEAL,YAAe,MAAGgnC,AAAAA,mBAAgB,A,C;A,C,C,CAClCnN,oBAAkCmN;gCAAAA,SAAH;MAAGA,MAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAClD1lC,kBAAkC0lC,UAAH;uBhF8KOzlC,8BgF9Kc,A,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAtGT,wBAAI;gDAAQs4B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyDf,YAAK,MAAGqN,SAAU,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CyB1E1D3mC,kBPFiDkiC;GOGvC,WACc,KAAhB0E,mBACS,KAAPA,KPLuC1E,+BOMzC;QACgB,KAAP0E,KPPgC1E,2BOQzC;QACgB,KAAP0E,KPTgC1E,yBOUzC;QACgB,KAAP0E,KPXgC1E,iCOYzC;QACgB,KAAP0E,KPbgC1E,mCOczC,mDAIN;uCACF,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,E,C,CAGAjiC,YACE,MAAO4mC,aACT,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,E,C,CAEA;EP1BiD3E;UO6B7C0E,AAAAA,AAAAA;cAUAzE;oBACAA;sBACA2E;YAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,a,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CA3CAC;;E/E4FqB;;;gBC5CI;;;;;;;S8EhDqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CA6BxB;;GACM,AAAlBz/B,wBACFA,QAAcA,iBACdA;MAAgBA;SPhCmG46B;QAASltB,YAA2BktB,YOmCzJltB;iBACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,yC,C,C,G,C,C,A,E,yB,sD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCnCoBF,YAAwB,MAAGkyB,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAuCn0B,cAAiCm0B,KAAchyB,eAAgCgyB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAIzM5xB,cACE,MAAO6xB,AAAAA,MAL0CD,SAMjC,KAAZC,KAN6CD,oB5EukC1C1xB,uB4EhkCT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,cACE2xB,AAAAA,KAViDD,YAWnD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CATAE;;EhFyFqB;;;gBC5CI;;;;;;S+E7CsB,A,C,I,C,I,C,C,C,C,C,G,C,iC,C,C,C,C;A,sB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,wD,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,C;A,G,C,CCElCzxB,YAAc,MAAGsa,MAAAA,QAAS,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,C;A,E,C,CA2BvC;EACkB4U;EAAAA;EACZ/K;;GAAgB,KAAhBA,WAEF,MAEF;MAAsB7J,SAAtB,KAAsBA,WAI8Bvb,QAJpD,UAAA;EAVyB,KAAhB2yB,QAAkBpX;6BAKX4U;GAMV,EAXiC,KACe,AAAd,KAA9BwC,AAAAA,cAAgC3yB,oBAcxColB;MADU,kBAEZ,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,WAAA,OACA,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CApCAwN;EAKqB5yB;EAAAA;EAGjB6yB;EAA0BtX;WAA1BsX,OAAYC,KAAcvX,QAAYvb;KAEtC6yB,OAAYC,KAAcvX,QAAY/F,AAAAA,WAExCqd;OAAYC,KAAcvX,AAAAA,kBAC5B,A,C;A,M,C,C,E,C,CAlBA7tB,cAEE,MAAUqlC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,CAEAH;;ErFVmB,QAAsB,KAAZpd;;;SqFuB7B,A,C,C,C;A,E,C,C;A,G,C,C,iD,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,C;A,E,C,CA8DA;EACkB2a;;EAAAA;EACGA;EACf/K;;GAAgB,KAAhBA,WAEF,MAEF;MAAuBp1B,UAAvB,KAAuBA,SAAvB,UAAA;;EAbsD,KAAlCA,KAAkB2iC,UAClB3iC;6BAMJmgC;GAOV,EAZgB,KACkC,AAAhB,KAA9BwC,AAAAA,6BAeRvN;MADU,OAAkC4N,gBAE9C,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,WAAA,OACA,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CA5CAC;EAIqB9C;;EAAAA;EAI4BngC;EAE7C6iC;cAHW1C,AAAAA,aAGX0C;OAAYC,KAFe9yB,QACJA,gBAGIwV,IAE3Bqd;OAAYC,KAFetd,QACJA,SAGzBqd,OAAYC,KAAc9iC,YAC5B,A,C;A,M,C,C,E,C,CAtBAtC,cAEE,MAAUqlC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,CAEAE;;ErF1DmB,QAAsB,KAAZzd;;;SqF2E7B,A,C,C,C;A,G,C,C;A,G,C,C,mI,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAkCwBlV,YAAuB,MAAGsvB,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCvxB,cAAgCuxB,KAAapvB,eAA+BovB,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CACzKtkC,YAA0B,MAAG4nC,MAAmB,A,C,I,C,I,C,C,C,C,C,G,C,kB,C,G,C,G,C,C;A,G,C,CAAyC70B,cAAmC60B,KAAsB1yB,eAAwC0yB,QAA6B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,kB,C,G,C,C;A,G,C,CACvN5nC,YAAyB,MAAG6nC,MAAkB,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,G,C,G,C,C;A,G,C,CAAwC90B,cAAkC80B,KAAqB3yB,eAAuC2yB,QAA4B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,iB,C,G,C,C;A,G,C,CAChN3nC,YAAuB,MAAG4nC,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2C/0B,cAAgC+0B,KAAiB5yB,eAAmC4yB,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CAC/L5nC,YAAuB,MAAG6nC,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2Ch1B,cAAgCg1B,KAAiB7yB,eAAmC6yB,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,I,C,CAC/L7nC,YAAsB,MAAG8nC,MAAa,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,G,C,C;A,I,C,CAA0Cj1B,cAA+Bi1B,KAAgB9yB,eAAkC8yB,QAAuB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Y,C,G,C,C;A,G,C,CACxL9nC,YAAuB,MAAG+nC,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2Cl1B,cAAgCk1B,KAAiB/yB,eAAmC+yB,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CAC/L/nC,YAAyB,MAAGgoC,MAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAA6Cn1B,cAAkCm1B,KAAmBhzB,eAAqCgzB,QAA0B,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAQtO;EAfkD5D;WAiB9C;EAEiBO;EnC6CW;EmC3ChBsD,OAlB4HL;KAAiB5yB,eAAmC4yB;EAmBhLM,OAlB4HL;KAAiB7yB,eAAmC6yB;EAmBhLlD,KAAAA,KAvBkCP,cAM0F2D;KAAiB/yB,eAAmC+yB;EAkBjLpD,KAxBmCP;6BAwBnCO;EACA,QAAyB,YApBgGmD;KAAgB9yB,eAAkC8yB;EAqBrK,KAAkB,KAAjBK,cAnB8HH;KAAmBhzB,eAAqCgzB,OAoB1MrD,AAAAA;KA3BgDP,SAAAA,KA4BhDO;KA5BgDP,iBA4BzB+D,KACvBC;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,gB,C,C;A,E,C,CAEA,cACEA,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,yB,C,C;A,E,C,CAGA,kBbtIS1G,QauIPvR;0BACAiY;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,cACEC,gBACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,wB,C,C;A,E,C,CAEA;EA5CqDV;EA8C9B,gBACX,gCAEVhD,AAAAA,AAAAA,AAAAA;KAnDgDP,kCAwDlD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA;GA1DkDA,WA4D9C;EA3DkDsD;GA8F7B,gBACrBY;KAEAC,WAnCJ,A,C,Q,C,K,C,C,C,C,C,G,C,S,C,C;A,E,C,CAEA;EAEa5D,AAAAA,KAnEqCP;WAqE9C3xB,A3FyDsB;I2FtDtB0d,AAAAA,QAAgB,KAxE8BiU,yBAuEhD;;kBAGE3xB,A3FoDsB;qC2FjDxBuC,oBAAkCmb,MACpC,A,C,Q,C,K,C,C,C,C,C,G,C,mB,C,C;A,E,C,CAEA;EACawU,AAAAA,KAjFqCP;WAmF9C3xB,A3F2CsB;I2FxCtB0d,AAAAA,QACI,KAvF0CiU,2BAqFhD;;kBAIE3xB,A3FqCsB;mC2FnCxBuC,oBAAkCmb,MACpC,A,C,Q,C,K,C,C,C,C,C,G,C,iB,C,C;A,E,C,CAEA,kBA7FsDuX;GA8F7B,gBACrBY;KAEAC,WAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,Y,C,C;A,E,C,CAEYvoC,cACV,2BAAkC,KAAVyU,mBAC1B,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,G,C,C;A,E,C,CAEYzU,oBAEY,KAAVyU;qCACZ;MAAO+zB,SACT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,U,C,G,C,C;A,E,C,CAEY;EACA5hB;;+CAGRuJ;EAAY1b;mCAAZ0b;KAAyB,MAE7B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,gB,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,Q,C,E,C,CAvHAsY;;EjFlBqB;;;gBC5CI;;;;;;;;;;;;;SgF8DwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAoDb;;SAnD8FrE;QAAapvB,YAA+BovB,aAuD5K,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,wC,C,C,G,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,CCvKFsE;;ElF6FqB;;;gBC5CI;;;;;;;SiFjDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C,A,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCErB/1B,YAAoB,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,KAAaoC,eAA+BpC,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CADzL+1B;;EnF4FqB;;;gBC5CI;;;;;;SkFhDwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCCzBh2B,YAAoB,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,KAAaoC,eAA+BpC,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAGzLwC,oBAH+CxC,IAI7C;MAAOxQ,MACgB,KAAnBA,KAAAA,uBhFkkCGkT,uBgFjkCT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,cACElT,AAAAA,KAT6CwQ,YAU/C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,kBACExQ,AAAAA,AAb6CwQ,kCAmB/C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,Q,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAlBAg2B;;EpF0FqB;;;gBC5CI;;;;;;SmF9CqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAYjB,YAIvBxmC,KAjByCwQ,cAkB3C,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,oC,C,C,G,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,2D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCpBoB3S,YAAiB,MAAG4oC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAuCh2B,cAA0Bg2B,KAAU7zB,eAA4B6zB,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAK3K,0CAEEhZ;OACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,cACE7a,wBACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,a,C,C;A,G,C,CAEAhV,YACE,MAAO8oC,MAfmCD,MAgB5C,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,C;A,G,C,CAEA7oC;EAlB4C6oC;;4CAoBxC;4EAEA,YAEF;kBACF,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAEAppC,kBACSowB,IAAAA;KAAM,SAAb;SACF,A,C,I,C,I,C,C,C,C,C,G,C,S,C,C;A,G,C,CAEAnvB;EA/B4CmoC;;uEAiCxC,QAEF;SACF,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,G,C,CAEAnoC;EAtC4CmoC;;4CAwCxC,MAAOC,MAAAA,SAET;SACF,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,E,C,CAEA7oC,cACE,MAAO6oC,MA9CmCD,QA+C5C,A,C,Q,C,I,C,C,C,C,C,E,C,E,C,C,C,C,O,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CA5CAE;;ErF0FqB;;;gBC5CI;;;;;;;;SoF9CkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CCH3CC;;EtF6FqB;;;gBC5CI;;;;;;;SqFjDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCGrBl0B,YAAuB,MAAGm0B,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCp2B,cAAgCo2B,KAAaj0B,eAA+Bi0B,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAIlM7zB,cACE,MAAOqF,AAAAA,MALyCwuB,SAMjC,KAAXxuB,KAN4CwuB,oBnFskCzC3zB,uBmF/jCT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,cACEmF,AAAAA,KAVgDwuB,YAWlD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CATAC;;EvFwFqB;;;gBC5CI;;;;;;SsF5CqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,W,+B,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,yB,C;A,G,CjG6D9ClpC;EACKgqB;WAA8B,KAAZA;EAAqBnhB,OADxB;WACkCmhB,cAAuB,A,C;A,G,CAoD7Emf,0BAEQC;GAAO,QAAS;EAChBpf;GAAO,QAAS,MAAOA,SAE7B,YACF,A,C;A,G,CAGA,qBAC2C,AAAPA,cAChCof;QAEW,AAAPpf,mBACI,KAAA,+GAIRqf;QAEJ,A,C;A,G,CAOAhiB,WAA+B,MAAGiiB,WAAY,A,C;A,E,C,CAc9CxpC,YAA6B,MAqJU,AAAN0I,MAAS9G,AArJA6nC,aAAM,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAUhD;GA2IuC,AAAN/gC,KAAS9G,AArJA6nC,gBAaQC;EwDGlB;MxDwKTC;KAAqB;;QAtKtC,WAAc,mBACZ7iB;;EACSA,SACX,KAEApS,KAuDoB,aApD1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAOA,gBAAkE,MAC9Dk1B,qBAA4C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGhD,gBAAiE,MAC7DA,qBAA2C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAO/C,gBAAiE,MAC7DA,qBAA2C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAG/C,gBAAoE,MAChEA,qBAA8C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGlD,gBAAmE,MAC/DA,qBAA6C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAMjDriB,oBACoC2C,qBAC5BxC;cACY,uBAAdA;UAEKA,UAAP;0CAEA,MAAOhT,AAWe,eAT1B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,oBACMgT;GAAY,Y8BjBZ,AA/EoBnD,aA+ECM,OACzBC;S9BmBF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CA9HAnS,sBAGMuX;GAAO,QAASA,AAAAA,YAAiBnhB,cACvC,A,C;A,K,C,I,C;A,M,C,C,G,C,I,C,E,CA1BA5H,YACE,MAAO0oC,0BACT,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CADoC;;GAI9B9gC;EAIMA;YAIC,OAAgB;OAGhB,KAAWA;EACTA,UAAmB,OAEc;;WAlBT;SAAyB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,C,C,CAyNhE/I;;QAA+B;iDAAqB0I,SAAS9G,IAAW,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACxE5B,oBAAwC4B;6BAAAA,OAAX;MAAS,AAAN8G,UAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACnD1I,oBAA0C4B;6BAAAA,OAAZ;MAAS,AAAN8G,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACrD1I,oBAAwC4B;6BAAAA,OAAX;MAAS,AAAN8G,UAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACnD1I,oBAA0C4B;6BAAAA,OAAZ;MAAS,AAAN8G,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CACrD/I,oBAAsCiC;6BAAAA,OAAX;MAAS,AAAN8G,UAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CACjD/I,YAAiB,MAAG+I,QAAK,A,C;A,E,C,CACzBxI,YAAkB,MAAG6I,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,G,C,uC,C,C,C;A,E,C,C;A,G,C,6B,C;A,E,C,CAkCzB7I,YAAkB,UAAOupC,AAAAA,gBAAcK,aAAanlC,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,G,C,I,C,C,C,A,E,I,sF,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CkG7V9DolC,WACEp3B,AlGgP0B,kBkG/O1BA,AAAAA,AlG+O0B;6BkG5O1BA,AlG4O0B;;oBoC3OA,mBrCKxBA,ACsOwB;wCDrOxBlN,AAAAA;qDAC2B,KXooDtBtC,2Dep1CQ+7B,KJ9S6B8K,eXkoDP,kC8G3oDrCzF,AnGWSyF,AAAAA;+BmGNX,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAT8B,YAC1B3mC,KAAS4mC,AAAAA,oBAAmBA,kBAAaA,UAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAE4B,YAE1Bt3B,AlGyOwB,mCkGxOxBu3B;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,Y,0E,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,S,C;A,M,C,C,G,C,kB,C,C,C;A,G,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,I,C,C;A,G,C,C;A,G,C,I,C,C,A,E,mB,gD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,sC,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CCJAC;;EzF0FqB;;;gBC5CI;;;;;;SwF9CgB,A,C,I,C,I,C,C,C,C,C,G,C,2B,C,C,C,C;A,gB,C,C,G,C,C;A,E,C,C;A,G,C,C,qE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKjBjqC,YAAgB,MAAGkqC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCr3B,cAAyBq3B,KAAUl1B,eAA4Bk1B,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC/IlqC,YAAkB,MAAGmqC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAyCt3B,cAA2Bs3B,KAAYn1B,eAA8Bm1B,QAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CAC/JrqC,YAAc,MAAGsqC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCv3B,cAAuBu3B,KAAUp1B,eAA4Bo1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKC;;EzFiFqB;;;gBC5CI;;;;;;;;;SwFrCiB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKlBrqC,YAAgB,MAAGkqC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCr3B,cAAyBq3B,KAAUl1B,eAA4Bk1B,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC/IlqC,YAAkB,MAAGmqC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAyCt3B,cAA2Bs3B,KAAYn1B,eAA8Bm1B,QAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEvLG;;EzFyEqB;;;gBC5CI;;;;;;;;SwF7BqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,oE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKtBrqC,YAAqB,MAAGkW,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C,C;A,G,C,CAAoCtD,cAA8BsD,KAAcnB,eAAgCmB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACxKrW,YAAgB,MAAGyqC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAuC13B,cAAyB03B,KAAYv1B,eAA8Bu1B,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACzJvqC,YAAiB,MAAGwqC,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAA4C33B,cAA0B23B,KAAWx1B,eAA6Bw1B,QAAkB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAIpL,wBAL2CD;UAOvC,MAPgHA;KAAYv1B;GAUjH,AAXiCmB,WAY5C5N,UAASkiC,aAEb,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,a,C,C;A,E,C,CAEA,YAfoHF,KAAYv1B,eAA8Bu1B,SAiB9J,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAdAG;;EzFgEqB;;;gBC5CI;;;;;;;;SwFpBoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAmBrB5qC,YAAc,MAAGsqC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCv3B,cAAuBu3B,KAAUp1B,eAA4Bo1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKO;;EzF2CqB;;;gBC5CI;;;;;;;SwFCoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKrB7qC,YAAc,MAAGsqC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCv3B,cAAuBu3B,KAAUp1B,eAA4Bo1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC3Iz3B,YAAoB,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,KAAaoC,eAA+BpC,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CAEzLg4B;;EzFmCqB;;;gBC5CI;;;;;;;SwFSwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKzB91B,YAAuB,MAAGm0B,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCp2B,cAAgCo2B,KAAaj0B,eAA+Bi0B,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC1KnpC,YAAc,MAAGsqC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCv3B,cAAuBu3B,KAAUp1B,eAA4Bo1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKS;;EzF2BqB;;;gBC5CI;;;;;;;SwFiBwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKzB/1B,YAAmB,MAAGK,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAkCtC,cAA4BsC,KAASH,eAA2BG,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CAC9IrV,YAAc,MAAGsqC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCv3B,cAAuBu3B,KAAUp1B,eAA4Bo1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKU;;EzFmBqB;;;gBC5CI;;;;;;;SwFyBsB,A,C,I,C,I,C,C,C,C,C,G,C,iC,C,C,C,C;A,sB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,mC,gE,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCtEvBhrC,YAAkB,MAAGirC,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyCl4B,cAA2Bk4B,KAAc/1B,eAAgC+1B,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACtK53B,YAA+B,MAAG63B,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAA8Cn4B,cAAwCm4B,KAASh2B,eAA2Bg2B,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAE3MC;GAH6CF,sBCoCZ,uDC2IE,8BACC;;;;MF/KmHC;KAASh2B,eAA2Bg2B,mDE8KxJ,8BACC;;;;MF/KmHA;KAASh2B,eAA2Bg2B,SAQ3L,A,C,I,C,I,C,C,C,C,C,G,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CANAC;;E1FsFqB;;;gBC5CI;;;;;;;;SyFpCzB,A,C,I,C,I,C,C,C,C,C,G,C,2C,C,C,C,C;A,gC,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,4D,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,sC,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,CdVA,2CAEA,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,2CAEA,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,E,C,CAEA,uDAEA,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,kB,C,C;A,G,C,CAEAnrC,YAA2B,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,mB,C,C;A,E,C,CAclCE;WAEI;EAMW,KAAM;EAEA;EACH;EAEK;EACL;EAEK;EACL,cAEhB;MAAWkrC,eACCA,cACAA,cACAA,UAEd,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,mB,C,C;A,E,C,CAEAlrC;WAEI;EAMW,KAAM;EAEA;EACH;EAEK;EAGA,QAFL,qBAIG;;GACT,MACR;GAEU,MACV,qBAEF;eACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEAA,cACE,MAAOsG,WACT,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,e,C,C;A,E,C,CAGAtG;GAMY,YACR;QACe,eACf,SpG5BWqB,QAAAA,QoG4BM;QACF,kBACf,SpG9BWA,QAAAA,QoG8BM;QACF,qBACf,SpGhCWA,QAAAA,QoGgCM;KAEjB,SpGlCWA,QAAAA,QoGkCM,4BAErB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEArB;;EACamrC,KAAAA;SAEX;MADgBC,QAAqC,KAAtBA,wBACRD,eACzB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,a,C,C;A,E,C,CAEArrC,cACE,MAAY,gBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,C;A,E,C,CAEAA,cACE,MAAY,iBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,S,C,C;A,E,C,CAEAA,0BACE;MAAa,eACA,eACA,gBACf,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,O,C,C;A,E,C,CAEAA,cACE,MAAY,gBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,C;A,E,C,CAEAA,cACE,MAAY,kBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,U,C,C;A,E,C,CAEAA,cACE,MAAY,oBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Y,C,C;A,E,C,CAEAA,cACE,MAAY,mBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,W,C,C;A,E,C,CAEAA,cACE,MAAY,kBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,U,C,C;A,E,C,CAEAA,0BACE;MAAa,+BACA,eACf,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,C;A,E,C,CAEAA,cACE,MAAQ,CAAC,+HAYX,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,c,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CApKAurC;;E5E4FqB;;;gBC5CI;;;;;;S2EhDqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,E,C,CAgB9CnpC,yBAEE;6BAAW,aACe;;GACd;EAGP,SACL,AACA,gBACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,U,C,C,C,C;A,qB,C,C,G,C,C,A,E,+B,2C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,G,CpFfAmlB,kBACMikB;cAEYC;EADH,KACuBC,sBADlCF;OAGKA,UAAP;qCACF,A,C;A,E,C,CAOA,aAAiB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAMjB,YAEEA,UACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEAxrC;EACgB2rC,IACdA;;GACIC,aAAwB,WAC1BJ;;G4B+KE,AA/EoBjnB,aA+ECM,OACzBC;O5B/KE;SAEF,SACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,G,CAMA9kB;EAAyBwrC;GAAS,W4B+FHroB;EA1BP,+B5BrEF;SAA2C,A,C;A,E,C,CAiBjEjO,kBACI,MAAGlC,eAA2D,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAElE,iBACM,CAAC44B,YAAc;GAEfD,YACFA,OACAziB;KAAkB2iB,aAEpBF,AAAAA,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CqG5DAzrC,YAAkB,oCACW6I,uBAAY+iC,qBAAcC,aAAU,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C,A,E,sC,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,4B,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CCuBjEpsC,YAAe,MAAGqsC,AAAAA,gBAAiB,A,C;A,E,C,CAEtBh6B,YAAU,MAAGi6B,SAAM,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAUhC;GACMC,QAAU,MACdA;;EAEwBC,UACxB;MAAqBH,0BxH6Oe9qC,gCwH5OlCkrC,QADF,UzE6YkCxjB,AyE5YtByjB,KxH8OGjjC;E+CnKLgd,IAAVyB;KAAUzB,OAKV0B;KAAW9B,cAKX+B;KAAU3B,YyErFRgmB;UACF,AACAE,UACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAKA,eACMC,QAAY,MAChBA;UACArjB;KAAkBojB,YACpB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEA,kBACEC;;EACIP;GzH6OczrC,ayH7OM;EACTyrC;GACG,AAAdQ,gBAAkCA,UACtCP;QtGXKj5B,esGWiCi5B,WACxC,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAQA;EACMD;GzHgOczrC,ayHhOM;GAEpB2rC,QACF,MAA+BE,0BxH4MGlrC,8BwH5MlC,OACEurC,AxH6MWrjC,SwH5Mb,AzH0DF7I;YAAAA;QyHvDA6rC,UACAH;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAR,YAAW,MAAGiB,YAAO,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CACrBhB,YAAa,MAAGhN,YAAO,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAzBS,YAAI,MAAGY,SAAE52B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,2B,uC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CC/C3C;QACmB;cACY,MAE7BikC;;;MAKA;;;;;yBAOEC;MAGA;MAKoB,iBALF,EAAEC,gBACDA;;GACbR,aACEA,cAEqBS;KAEzBF,cAEJ,OACc,UAAuC;iBAGrDG;iEAEA;sBzHwOoC7rC,8ByHxOpC,UzH0OekI;SyHzOb2jC;0DACOljC,2BAAoBA,eAC7B,CAGFmjC,KAAuBJ,WACvBD;QACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAeAnhB;;aAgCE;2FAGF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAhCEyhB;OAEe;MAGb/iB;oBAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAJiC,sBC7DLgjB;ODgE1B,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAGFC,6BAEiB,QACf;8BAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAJS,WACLF,4BACA;MAAOr+B,iBACT,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAGFw+B,6BAEiB,QACf;+BAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,M,C,CAJS,YACLH,+BACA;MAAOr+B,mBACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,yB,qC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CEhDJhO;EAGmC,KAAX;EACsB,KAAf;6BADI;UAKjC;mBAAkB,sCAJ0B;;;uBAK1CysC;;mCACAA;OACF,6BAP4C;GAU5C;KAAkB,gCAChBA;KAAAA,UACF,AAEA,sCAAkB,QAChB,MAI4B,MAHL,AAAJ,UADD,WACU,KAAtBC,SAAyBhnB,MAAyB,KAAJ;EAItB;EADd+mB;;EAFZA;uBAAAA;SAAkBA;EAEc,KAApBA;;EACmB,KAApBA,KAAAA,UACXA;KAAAA,OAAkBE,WAEtB,AACF,AAEA,SACF,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUA3sC;EACUysC;EAAiB;;EACG,KAApBA,KAAAA;;EACMA,KAAAA;IAEd;eAAS,KAAS;eAEdG;EACC;;GAGG,UACJA;YAI0B;;EAAZH,KAAAA,KAAmB;EACxBA,KAAAA;;EACCA,KAAAA,KAAe;EAEjBE,IAASA;aAGH,UACZC;KAEAA;MAID;mBAEDA;;SAIAA;EACC;MAGL,AAEA,MAAOA,gCACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA7tC,yBACE;4BAAkB,WACJ,CAAA,KAAR8tC,SAAWC,UACb,QAEJ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/tC;;EACe8tC;;EACAC;GAEb;aAAa,OAAuB;EAALD;EAAuB;EAAR,OAAGC;gBAEjD,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAYA9sC;;;EAMkB2sC,IAAoB,SAAuB;;EAC1C,gBACDI;EAGD,MAAGrnB,UAAyB,MAAGgnB,SAC9BM,SAAsC;EAGzC;;EAEF;EACJ;;GAEuB,KAAf,aAAyC,KAAX,aAC3C;GAGe;;;;6BANV;SAQL;KAAgB,WACkB,GAAhCC;KAAAA,KAAoBP,UACtB,AAEA,2BAG2B;;;yBAD3B;8BAGQQ,KACNC;;yBAOJ;iCAAkB,EAAEC,oBACXA,gBAEQ,SACTC;SAIG;;;;;sBAMLJ,KAAkB,KAAlBA;EACK,SAELA;KAAAA,KAAoBP;;;;;sBAMpBO,KAAkB,KAAlBA;EACK;;;;;sBAKLA,KAAAA,KAAoBP;;SAI1B,GAEW,QAASW,SACpB;SACF,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKA;;EACoCC;EAAeA;EACpCA,KAAAA;EAAsCA;;;;qBASnD;mBAAoBD,SAAF;EACAA,IAChB3nB;MAAe,KAAfA;;EAhRevO;EAqRgB,OlEzRfI,KAAAA,AkEOEg2B;;EAmRd7nB;EArBiB,AAArBinB,MAqBiC,KAAdjnB,SAAgBA,UArBZinB;GAuBJ,S5H7MI,GAAGhtC;;E4HmNc,KAAnB+lB,QlElSLnO,KAAAA,AkEkS0BmO;6BAAF;IAEtCunB;KAAmB,KAAnBA,KAAyC,KAAnBvnB;EAEmB,KADD,KlErS1BnO,KAAAA,AkEOEg2B,SlEPFh2B,KAAAA,AkEsSImO;GAEI,KAvRJ8nB,SAuRwB;OAI1B9nB;GAEG,KA1SNvO,KA0SQuO,aAvSL6nB;EA0SRN,SAAyC,KAAdvnB,SA7StBvO,MA4STs2B;;wD5H5OE,iBA6BR7tC;e4HmN6C,KAAxB,KAhTNuX,KlEJCI,KAAAA,AkEOEg2B,UA8SI,KAAd7nB,SAAgBA,aA9SN6nB,IAgTZE;OAAeR,OACwB,KAArB,KAAdvnB,SAAgBA,SApTXvO,MlEJCI,KAAAA,AkEOEg2B,WAqTdN,MACAA;KAA8BvnB;GACZ,KAAdA,SA1TOvO,MA2TT81B,KAAgBvnB;cAGE,KA9TTvO,KA8TWuO,WAKxB2nB;EAG+B,KAzTbG,KlEjBJj2B,KAAAA,AkEOEg2B,SAoUhB7nB;MAAe,KAAfA;6BAD+B;;eAInC,GAEI,GAAW2nB,UACjB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEArtC;iBAIE;sB3HpDsCM,8B2HoDtC,OACEotC,O3HnDellC,K2HoDjB,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBAxI;GAEM2tC,aAAqB;IAGzB;MAAmBC,4B3H/EmBttC,gC4HlNG09B,KDiSzC,U3H7EiBx1B;G2H8EO,KAAlBykC,YAAgD,KlEnXpC11B,KAAAA,AkEmXc01B,kBlElXL11B,KAAAA,AkEmXnB01B;EAA0BA;gCCnSOjP;GDmSf,CAAA,OCnSeA,MDmSQqP;kBAI/CA;UAAeQ,OAAkBZ,SAChB,KAAbA,SAAeA,SAAmBA,UlEzXtB11B,KAAAA,AkE0XZ01B,cACN,AAEA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,sB,C;A,G,CA1XEluC,YAAc,MAAGoY,SAAM,A,C;A,G,CAGvBnX,WAAiB,MAAGutC,SAAoB,A,C;A,G,CAUxCxuC,WAAmB,MAAGyuC,SAAW,A,C;A,E,C,CAoBjCpuC,kBAjCiB+X;6BAAAA;EAmCQ;KAAS;GAGjB,CAAA,KAzBKq2B,QlEjBJj2B,KAAAA,AkEOEg2B,aAmCgB;EAGf,KAzCJp2B,QAaKq2B;6BA4BD,OAAnB;MAAW,KACb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAluC,YAAkB,uCA5CD6X,2BAGGo2B,8BAUEC,aAgC2B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CArBjDjtC;;;;yBAKE;2BACF,A,C,C,C,A,E,wB,oC,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,I,C,C;A,G,C,C;A,G,C,I,C,C,A,E,0B,sC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CDkJF6R;GAGM07B,UAA6B,CAAA,UAC/BA,sCAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAzDoB;;EACCC,AAAAA,AAAAA;GACF,CAAA;;;;YAEXJ;sCACAK,AAAAA;eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,8B,0C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,a,C;A,E,C,CGpIW32B,YAAY,MAAGg0B,SAAM,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,G,C,C,C,C,C,I,C,S,C,I,C,C,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAErB,cACXA,Q3GuDKj5B,e2GvDiCi5B,WACxC,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,K,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,G,C,C,C,C,O,C,G,C,C;A,E,C,CAEA/rC,YAAkB,wB/HkMJI,iC+HxMc2rC,aAMwB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,A,E,+B,2C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,mB,C;A,G,CDsCpD1kB,iBACMsnB;cAEa,iCAAfA;UAGKA,UAAP;qCACF,A,C;A,E,C,CAKalvC,YAAe,MAAGi/B,AAAAA,gBAAY,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,C;A,E,C,CAE9B7rB;EACD6rB;EAAAA;SACQ,MA2KlB1pB;;;QACAA;oBAAuD,SACvDA;kBAA2C,GAAe,CAAA;EAnLxD25B;GAAa,W9EiFc1rB;EA1BP;Q8E5CV,a5H66BF,UAAa,MAAEziB,eACjB,SAA+BA;;GAE/B,KAAe,EAAEA,cACjB,SAAiCA;;;GA7xB9B;GAIQ;GAGN,SACH;E4H1JOk+B;;yBADbkQ;uCAGgE;;;yBAAhEA;gCAIJlQ,aACF,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,C,C,CAEaj+B,oBAA4Bi+B;gCAAAA,SAAH;MAAGA,MAAY,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,G,C,C,C,I,C,C,C,C,E,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,I,C,G,C,C;A,C,C,CAExC;EACIA;gCAAAA;EAAAA;EAzBbiQ;GAAa,W9EiFc1rB;EA1BP;;;yB8E5BpB2rB;qDAFalQ,SAKfA;OACF,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CAGa5+B,YAAiB,0CAAgB,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CACjCA,YAAoB,0CAAmB,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,C;A,E,C,CASpD;;mHAEekB;EAEHA;EAhDR2tC;GAAa,W9EiFc1rB;EA1BP;M8ENO,aAEdyb,O5H84Bf/9B;W4H/4BEiuC;QAAc,cACDlQ,A5Hg5BR,yBDx5BPp+B,K6HUAo+B,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,C,C,CAEA;EACYA;EAAAA,QACVmQ;UAA6B;EA1D3BF;GAAa,W9EiFc1rB;EA1BP;K8EKpB2rB,QAAc,oBAGhBlQ;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;EACYA;EAAAA,QACVA;YAEAmQ;UAAyBnQ;EAEA,AAAbA;EAxEViQ;GAAa,W9EiFc1rB;EA1BP;M8EkBS,IAC7B2rB,QAAc,qBAElB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA9uC,qBACE;MA7E6B4+B,YA6EX,EA7EWA,gBA8Ef,KA1DyBA,SA2DnCgI,YAAiB,IACjB;SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;;OAsEyB,EA5JMhI,AAAAA,oBA6JrB,SA7JqBA,AAAAA;IA+JrB;OAAe,EA/JMA,AAAAA,oBAgKrB,SAhKqBA,AAAAA;EAwFP;EACZA;EAAAA;EAEmB,GAoF7B1pB;;;OACAA;sBACAA;kBAA2C,GAAe;EAnLxD25B;GAAa,W9EiFc1rB;EA1BP;M8EuCe,Y5H01Bd,EAAEziB,cACjB,SAA+BA;OAEhB,EAAEA,cACjB,SAAiCA;;;GA7xB9B;GAIQ;GAGN,SACH;E4HvEKk+B;;yBADbkQ;gCAIFlQ,eACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;GACY,KAAa,EArGMA,AAAAA,oBAsGrB,KAAA,SAtGqBA,AAAAA;;mHA0GhB19B;EAESA;EAIZ09B;EAAAA;6BAJY19B,OAKtB09B;UAAa;EAjHgBA,Q7H4M7Bp+B;O6HzFqB,a7H1ErBA;W6H6EAuuC;UAAyBnQ;EAxHvBiQ;GAAa,W9EiFc1rB;EA1BP;M8EmEmB,IACvC2rB,QAAc,qBAGlB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;GACyB,EA/HMlQ,AAAAA,oBAgIrB,KAAA,SAhIqBA,AAAAA;EAAAA;EAAAA;UAmI3BxQ,WACA;OAMFwQ,UAAY;EA1IiBA,Q7H4M7Bp+B;O6HjEqB;EAEDo+B,QAApBmQ;QAAiC;EA/I/BF;GAAa,W9EiFc1rB;EA1BP;K8E0FpB2rB,QAAc;qBA/IalQ,SAiJ7BA;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBA;EAtKIiQ;GAAa,W9EiFc1rB;EA1BP;G8EgHlB,GAAoB;GAEpB6rB,eACFA,UACA9lB;KAAkB+lB,YAEpBD,AAAAA,gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,qBACE95B;;;QACAA;oBAAuD,SACvDA;kBAA2C,GAAe,CAAA,UAC5D,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAlV;EACMgvC;WAAsB;EACZE,YACdF;;EAzLEH;GAAa,W9EiFc1rB;EA1BP;;GAgGlB,AA/EoBoB,aA+ECM,OACzBC;O8EqCE;SAEF,SACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,K,C,I,C;A,M,C,C,E,CA1OA2c;iDAC0D,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAmCxC,WAAKoN,eAAqB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C,A,E,8B,0C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,sB,C;A,E,C,CjGxB5C3uC;GACaivC;OAAsBC,sBACjC;qCAAiC50B,uBAAWsxB,qBAAcC,aAC5D,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,C,CA8CatrC,kBAAwBoO,OAAH;MAAGA,UAAS,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,M,C,G,C,C;A,G,C,CAEjCpO,kBAA0BoO,OAAH;MAAGA,UAAW,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,Q,C,G,C,C;A,E,C,CAErClP,kBAAiBkP,OAAF;MAAEA,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,C;A,G,C,CAE5B7O,kBAFiB6O,OAEA;MAFAA,aAEc,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CAE/B7O,kBAJiB6O,OAIG;MAAG,AAJNA,aAIc,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,C;A,E,C,CAE/B7O,YAAiC,MAAG6O,AAAAA,eAAyB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAE7D7O,YAA6B,MAAG6O,AAAAA,eAAqB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,a,C,G,C,C;A,C,C,CAErDL,cAA0B,MAAGK,AAAAA,gBAAS,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,G,C,C,C,I,C,C,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,I,C,G,C,C;A,C,C,CAEtC;EACDA;EAAAA;EACGA,QACbA;;ETpDuB28B;GAAS,W4B+FHroB;EA1BP;QnBfTtU;GAAH,OTpCLmE,mBSsCDq8B;iEACkB,CAAA,UAClBA,uDAGN,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAEA,cACEztC,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYA4M;EACYK;EAAAA;EACEA;ET/EW28B;GAAS,W4B+FHroB;EA1BP;MnBWE,IAAGtU,SACzBwgC,wDT/DGr8B;iBSgEgCnE,SAErC,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;EACYA;EAAAA;ETxFa28B;GAAS,W4B+FHroB;EA1BP;MnBoBE,KACtBtU,sBTxEGmE;oBS6ELnE,QACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,cAAqC,MAAGA,AAAAA,iBAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEvD3O,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CApF3CnN,sBACS,WAAA;SAAP;SACF,A,C,E,CAGAA;;4DAhBgC;8DAHA,yDAHP,0CA+BvB;SACF,A,C,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAiCgB,cAAmB,gBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA0BrC,0BACXkuC;mDACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CmGgENrvC;4CAEI,MAA6C,MAAtC;;8ChH5J+BuP,QgHgKtC;MAAuC,MAAhC,QAET,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA+/B;WACsB;;;;wEAGa,WAAiB,OAAErkC,SAChD,MAAOA;;+CvCvNqCuL;EhDifzC2C,KzCjb4B1M,AyC2tBCiR,KAAAA;OuF9jB5B6xB,aACKzzB,AAAAA,aAAP;YAKE0zB,gBACKvkC,OhHvL2BsE,QgHuLlC;qBARJ;;gDAaM,CAACigC;GAILzC,WACFA,uCAEF;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA/sC;WACsB;;;;wEAGa,WAAiB,OAAEiL,UAChDA,WACA;;;+CvCzP4CuL;EhDifzC2C,KzCjb4B1M,AyC2tBCiR,KAAAA;OuF5hB5B+xB,WACF3zB,SACA;YAGE0zB,cACFvkC,OhHxNkCsE,UgHyNlC;qBARJ;;gDAWM,CAACigC;GAILzC,WACFA,uCAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA/sC,mBACE;KAAY,CAAA,mBvFs5EemY,AuFr5ET1L;GvFq5ES0L,QuFp5EM;GvFo5ENA,WuFn5Ee;EACjCu3B,QACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOA1vC;WhHjQqB2vC,SAYqBpgC,egHuPxC;KAAY,CAAA,mBvFo4EY4I,AuFn4EN1L;EvFm4EM0L;;4CuFl4Ee;GvFo4EZA,QuFn4EY;GvFm4EZA,WuFl4Ee;EACjCu3B,QACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMA1vC,qBACE;KAAY,CAAA,mBvFq3EYmY,AAAAA,AuFp3EP1L;;6CACe+2B,QAAwB;EAC/CkM,QACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA91B;MAEWnN,OAAP;kBADF,OAQE;eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAgBAzM,cACM2Y;UAES;qBAFTA;GAGAA,WAAa,QACjB;MAAOi3B,cACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,4B,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,G,CApRE59B,kBAAc48B;qBAAAA,SAAH;MAAGA,MAAU,A,C;A,E,C,CAGX58B;GACP,CAAC69B,QAAU;E5GjCQrE;GAAS,W4B+FHroB;EA1BP;GgFnClB,GAAe2sB,SACnB;MAAOlB,UAAAA,SACT,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAGa;EACDmB;EAAAA;SAII;E5G5CSvE;GAAS,W4B+FHroB;EA1BP;GgFxBlB,GAAe2sB,QAAuB;EAEnBlB;EAAY;0BAAZA;EAAAA;qBAPbmB;GAONC,OAAqCD,WAIvCnB;qBAAAA,SAAAA;QAEJ,A,C,I,C,I,C,C,C,C,C,G,C,G,C,C,C,C,O,C,G,C,C;A,E,C,CAaA,6CAEEkB;SACAG;UACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,mBACE;UAAoB7D,QAAF,EAAEA,gBACdA;GAAS,SACXA;EACAA;qBAAAA,SAAAA;WAEJ,kCAEF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAGA;aACyB2D,AAAAA;EACZA;EAAiB,AAAjBA;;EAGsB,AAAdvD;GAFnB;KAAkB,QACkBoC;qBAAAA;EAAAA;qBAFzBmB;EAEMT,OAA+BS;cAEjCvD;EAEboC;qBAAAA,SAAAA;OACF,CACF,A,C,Q,C,C,C,M,C,I,C,E,C,I,C,C,C,I,C,Y,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAEA,iCAEE;MAA2BmB,UAAiB,AAAjBA,aAGM,AAAdvD,gCAHgC,YACtCoC;EAAU;;cAAVA;EAAAA;cAAAA;EACmBA;qBAFLmB;EAEdT,OAA+BS;cAE7BvD;0BAGXyD,YACA;SAEFrB;qBAAAA,SAAAA;OACF,AAEAqB;GJ4BEvB,gBAA6B,CAAA;yBAC/BA;iBI3BF,A,C,c,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEA;aACyBqB,AAAAA;;GAEvB;KAAsB,WAChB3D;qBAAAA;EAAAA;GAAS,QAASA,MACtB8D;WACF,CACF,A,C,Q,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EACiBtB;qBAAAA;EAAAA;EACCmB;qBAAAA;EAAAA;;+CAGZ3D;E/EsR8BxjB,A+EtRnB3d;E/E3CLmb,IAAVyB;KAAUzB,wBAKV0B;KAAW9B,cAKX+B;KAAU3B;qB+EiCNgmB,SAAAA;;+CAgBFA;E/EsQgCxjB,A+EtQrB3d;E/E3DHmb,IAAVyB;KAAUzB,wBAKV0B;KAAW9B,cAKX+B;KAAU3B;qB+EiDRgmB,SAAAA;SASJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA3JA+D;GAMMN,QACF,MAAoBna,AAAAA,qC9HiPcx0B,gC8H9OhC6uC,QAHF,U9HmPa3mC;G8HlPC;EnHkCTnJ,qBmHhCH8vC;OAAoB,mBhHlBPJ,UgHmBf,EAMyBI,OAA3BnB;mBAA4C,AAAjBmB;G/HwPTxvC,c+HnPoB,UAC3B6vC;EAGXxB;qBAAAA,SAAAA;MACAxC;mBAAqC2D,kBACvC,A,C;A,K,C,I,C;A,M,C,C,E,CA5BAI,iCAGiBE;;SAyBjB,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAnByD,YAAI,OAAG,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAyHrB,mBACnC;MAAA,iBAAA,UACMnC,AADN,cAEIoC,iBACA;OAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAS+B,mBAC/B;MAAA,iBAAA,UACMC,KADN,WAEID,iBACA;OAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAwIc,WAOlB,gBzHlUUp+B,mJyHmUZ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,ChCjUA0vB;;4CAC2B;+CAEV,iBACbl5B;mBAGA;iFAG+BA;E8BJ7B,eAAA;S9BIF;SAEF,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CATkB,cACZlB,WAAOo6B,QAAwBA,SACjC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,W,+B,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CiCjCJ4O;E1G6nPWlY,oC0G1nPTmY;;EASW95B,8BACX+5B;iBAAyBA,aAEzBC;MAGAC,ArGqD6BC;yBqGlD/B,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAQAF,oBACE;sDAAA,U/H+QiBvnC,I+H9Qf;M1GikPO,KAA6BuwB,qC0GjkPpC,QAAA,OACE1J,AAAAA,K/H6Qa7mB,2B+H5Qf,CACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CCsbA;EACgB0nC;GACF,QACV,MAAA,QAAA,OACEC,KADF,OAEA,CAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAWA1pC;GACU,eAAgB;EAChB2pC,KAAwBz7B,UAChC;MzF8sE0B4C,AyF9sEP5C,azF8sEO4C,8BvC/2E2BV,KAAAA,MAAoBO,6BgIiKzE,UhI9HiB5O;GgI+HXo6B,SAAmBA;;+CAES,CAACA,sDACAA;;KAE/B,MAAA,KAAiBA,SAAjB,UACMyN,AhIxMO7nC;;yFgI2MsB8nC,wB5HypChC/tC,QAA8B,+B4HvpC3BqQ;MAAMgwB,kBAIZ,CAEJ,AAEA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjoB,qBACE;KzF4qEwBpD,AAAAA,AyF3qET5C;;6CACiBuG,SAAmBo1B,oDAE/C;EAEI37B,cAWK,CAAA,eAAe,AAC5B;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAvV;ElHhfqB2vC,SAYqBpgC,AkHqeY4hC;EzFspE5Bh5B,AAAAA,AyFrpEX5C;QACb;iDAAiCuG,QACnC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAcA;;oBAE8C;GACxC,CAACtF,0BAA6C;EAEnCA;WACO;EACN46B;WACO,MACvBC;4BACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CASAnxC;WACqB;;EAGRoxC;GACF,a3Ggi8BAzU,AAAAA,A2Ghi8BcyU;;GAER,SAAW96B;EAET+6B,K7GhaR5R,KAAYP;G6GiaN,QAAS,QACtBoS;8DACA;mCAQQ;qBAAA;;EAAD,cAAP;oBADF;;;kBAMEA;gGAEA;uBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CtG3iBEpvC;iBAIEqvC;;EsG4ZYC;GACF,QAASC,QtG1ZrB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA8aAvvC,YACEwvC,mBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAxvC;WACoB,MAElBqG;WACA;MAAiBwnB,aAAuB,UAAiB4hB,cACvDD,SACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmPAxvC,qBAIM,CsGnM6B0vC,ctGmML,MAAOC,gBAGnC;qBA6BF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIA3vC,iBACE;eAAuB,AAAhB6tB,kBACEA,QACT,AACA;MAAO+hB,eACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOA5vC;E6D/wBgDoU;E7DoxBjCy7B,KanSR94B,KzCjb4B1M,AyC2tBCiR,KAAAA;GbNvB,WAKK/D;EAAAA,kBAAdomB;UAAcpmB,SAEhB,MAAOu4B,AAAAA,cACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA9vC,qBACE;Kaw4DsB+V,AAAAA,Abv4DP1L;;4CACe;EACrBA,cACK,QAAQ,CACxB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAiIArK;WACqB;EL4sNZk2B,oCKrsNK;OAA2BmY;EL6q7BhC5T;GK1q7BE,QL8q7BTA,2BK1q7BAsV;iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA/vC,uBLg8zBE+5B;UACOiW;UAAuBt+B,kBKl7zBhC,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAsDF+E;;2CAHU,SACA;GAIe,KAAnBpM,eACmB,KAAnBA,iBAEQ,WACC4lC;GACH,QAAS,MAAOn4B,QACtB;Ma3hBGf,MzCjb4B1M,AyC2tBCiR,KAAAA,AgD3xBYlH,gB7D+gChD,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAnW;WACqB;0CACD;uBAEA;wBACC;uBACE;;4CACE,WACvB;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CF3gCA4iB,0BiG2GyBA,QAAiCqvB,OjGzG/CC;YAAP;SAGFC,MACA;YACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CASA,yBH2jcIC;0CGxjcFC;MAGAlC;MAEAmC;sBACF,A,C,Q,C,I,C,C,C,C,C,G,C,C;A,E,C,CA0BA,4BACE;+BxB6NsCzxC,8BwB7NtC,UxB+NiBkI;IwB7NbwpC,mBADF;;;;;;;;G4BrDI,AA8CmBruB,mDA7CvBb;W5B2DF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CASA9iB;aAE2B;;;;W2B9FzBujB;KkBAEC,W7CkGA;YAEE0N,UAAoB,QACxBA;QAGA;MHo/OS,KAA6B6H,0DGp/OtC,aAAA,UxBiMiBvwB;;4CwB/LbypC,KAAiB5iB,SAAaA;kDACIA,+BAC9B,MACQA,QACV6iB;;;;W2B9GN3uB;KkBAEC,a7CqHF,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA8BA;QACY2uB;;;EM1CsB,KAAmBn4B;EAgtB7Co4B;GAAiB,CAAA,cAEFA;EACJA;EACAA;EACAC,KApvBEld;EAqvBDid,aA0CY,CAAA,KAAL9d,gBAvCF8d;EACJA;EACAA;EACAC,KA3vBAld;EA4vBCid,aAEK,KA9vBNjd,YAAAA;EAgwBPid;EAAgB,CAAA,aAGJ,YAGZA,KAtwBOjd;EAAAA;IAuwBIkd,QAEAA,KAAmBC,KAzwBvBnd;EA2wBGid,OAEC;EACJ;EACA,WAEA,OAEV,KAMkBA;ESw0DH76B;EAAAA;ETjmFL4d;GNuDD,KAAXG,KAAc6c,SAEjB7c,UAAiB6c;GACjBI,kBACCA,2BAAkCA;;;QM3DpBpd;;ESimFK5d,MTlkFQ,KAAmByC,gBNoD/Bsb,OACoB,KAAlCA;GAEa,wBAMjBkd,sCACA;Se8gFwBj7B,Af1gFZk7B;Ee0gFYl7B;;;;EvChzEuBV;;8BwB1NjD;KAAA,OACE67B,OxB2Oep7B,OwB1OjB;EewgF0BC,AftgFZk7B;EesgFYl7B;;;;EvChzEuBV;;8BwBtNjD;KAAA,UxBwOiBS,MwBtOf;MAAA,KAAc8xB,SAAd,UACa5d,AxBoHEhjB;;+CwBlHM6nC;EAAcjH,OErInCyH;;EsG4ZYC;GACF,QAASC,SxGtRnB,CAQF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,uBAEE;MAAA,KAAiBh4B,cAAjB,UACgBs3B,AxBkGC7nC;MwB9FjB,GACI,GAAkB;GAClB,CAACuQ,6EAEKA;;W2B/MVwK;KkBAEC,W7CgNA;SAEGzK;EAAAA;G+BoEgB6U,AAAAA,yF/BlED7U;;W2BpNpBwK;KkBAEC,W7CqNA;OAEFsqB,KAAW/0B,cACb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CuG1MuB,YACnBi3B,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,6C,C;A,G,CCGAvwC,YAAc,MAAGqgB,MAAK,A,C;A,G,CAUtB6yB,YAAwC,MAAGC,MAAM,A,C;A,G,CAGjDtzC,YAAgB,MAAGuY,MAAK,A,C;A,G,CAyBxB8gB;EACmB;GACD;EAAUka,gDCmBcC;eDnBxC;SACF,A,C;A,E,C,CAiBA;GAEMC,UA/Cal7B,MAgDf;E3Gih9BKokB;G2G7g9BH+W,aAEF;EAtDen7B;QAuIjBiI;KAiSoC+wB;EAAAA,QA9RpCoC;;GACe,QAASL,KAuTuBM;EArTrC55B,KAAawG,KAGvBqzB;YAAuBP;EAyQnBQ;GAAS,QAASC,KAAaC,YArQnCC;YAlCAL;eA+CAM;UAwGAC;UAAsBC,KA0BtBC;UACAC;UACAC;UA2DA7D;KAqBO8D,UADOC,8B3G8gbQvwC,c2GntbtBwwC;KAAsBC;EAEZ36B,KA9LKwG;EzF2pFOvI,AAAAA,AyF19EL5C;GACF;4CAEXu/B,SACAA;KACFv/B,cAlEFw/B;YA/CAC;KAxEiBv8B,MAiEnB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUAzY,iBAC+B,AA4VOyxC,oBA5VE,QAGtCC;;G3G8+8BO7U,gC2Gl+8BL+T,YAEF;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA5wC,iBAEe,SAAiC,AAAtBi1C,kBAElB,CA6VyBnB,cA5V3BhD,KAAAA,0BACA;SAGJ,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAmFA,yBAGE;eAAY;E3Gi48BLjU,AAAAA,A2Gh48BKqY;EACHA,SACT;EAhNex0B,I3G8kcf+xB;qB2G53bF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;GAEgB,SAA8B,AAAnB0C,iBAICA;ExFjLnB,8BAAA;SwFiLLnB;OAGFA,KAAWhD,OAA6BgD;E3Gi38BjCnX;G2G728BG,WAGSuY,QAAYA;kBhIgDKl0C,6BgIhDlC;KAAA,UAES4wC,KhIgDI1oC;GgI7CF,UAAS4qC;EAAS,SAAWA;;WlHrNzBrE;EkH0NA0F;;;0DAjOA58B,kBAmOXxE;;;WAIE+/B;c5Hs4CH7wC,QAA8B,+B4Ht4CT6wC;OACtBA,WACF,EAMJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EAEwB,4BAAtBsB;;EACI9B;GAAO,QAAS8B,OAA2B9B,QAG/CjW;8BAKF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAgBA,cACEA,8BAUF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAkBA,kBACYgY,6BAAVC;MACA;sBhIpCoCt0C,8BgIoCpC,OAAsByX,KhIlCPvP,KgIkCiB,CAClC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,kBACYmsC,iCAAVE;MACA;sBhIzCoCv0C,8BgIyCpC,OAAsByX,KhIvCPvP,KgIuCiB,CAClC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUA;EAvS4BosC,IAwSb;;;EAECX;GACF,WACI,QACd;oBhIuC6Cp9B,KAAAA,MAAoBO,qBAkBpDE,KgIzDb,UACiBw9B,KhIwDJx9B;;EW/J8BvL,MAA7CA;MAAAA;YqHwGE,GACmB,ArH7GCA,AAAAA,iBUk4Of2rB,oC2GnxOC;;SADJqd;SAEIA,YAGV,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA/0C;E3GggSE,KAA6B+4B;E2G//RjB;EACEkb;GACF,QACFvkB,UAAcqlB,UAGxB;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAeAz1C;EACgB;mCAKd;MArV0Bs1C,KAqVRI,wDhID6Bn+B,KAAAA,MAAoBO,qBAkBpDE,KgIjBf,UACiBw9B,KhIgBFx9B;;EW/J8BvL,MAA7CA;MAAAA;cqHgJA,AAEA,MAtV0B8oC,KAsVRI,wDhIL6Bp+B,KAAAA,MAAoBO,qBAkBpDE,KgIbf,UACiBu4B,AhIYFv4B;EW/J8BvL,MAA7CA;MAAAA;cqHoJA,AACA,MrH1IyBA,MqH2I3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOAmpC;UACqB;E3GguOZxd,oC2G9tOA;S3G0s8BPuE;yB2Grk9BiBpkB,WA2XjB;SAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA;GACU,eAAgB,MACxB07B;UAAe5+B,QACf;MzF8wEwB4C,AyF9wEL5C,azF8wEK4C,8BvC/2E2BV,KAAAA,MAAoBO,6BgIiGvE,UhI9De5O;;4CgI+DkBuQ,SACxB,CAACA;ElHzX4BpK,AkH2XDoK;;GAC/B5Q,mBAAuC,CAAA,8BACrCgtC,WAAkBA,KAAW;EAC1BhtC,SAA8B,KAAZA,WACzBgtC,AAAAA;kBlH3YapG,SkH2YgBh2B,UAEjC,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOAtS,oBACc,6BACZ2uC;mBAGA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA5XAzC,YAEE96B,K3Gyh9BOokB,sB2Gvh9BPoZ;WACF,A,C;A,K,C,I,C;A,M,C,C,G,C,K,C,E,CALA1C,iB5HukDOpwC,QAA8B;;;S4HlkDrC,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA0DuC,WAAG,SAAI,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAkJzB,iBAaZ,AAAC+yC,iBAA+B,CAACntC,cAXpCusC,AAAAA,mBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAkBmB;;GAqPcxD,iBAnPjBppC;EACFA;GACA,MAAY,KACpBytC,WAkPgCptC,UAjP5BL,QAAAA,UAAsB,UAGhC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAuCI,YAAI,MAAG,A3Ggw8BJm0B,AAAAA,A2Ghw8BKlkB,+CAAoC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA0ChDy9B,YAAW,MAAGz9B,gBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAuDd,cACjB/Y,WAAIy2C,KlH5YgC9mC,YkH6YtC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CAwL8B,iBACpB,4BACZ+mC;uBAGA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,U,C;A,M,C,CAJ6B,cACzB12C,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,c,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,CtG1iBAI,YAA2B,SAAQ,A,C;A,E,C,CAyCnC,eLo3NyBo8B,KAA4B,AKn3N/C,gCACmB,OACrBma,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAQA;ELy98BS1Z,AAAAA,AK798BMU;kBAC6BiZ,aAK1CC;KsGwV+C3C,atGtV/C4C;UAEAC;UAEAC;UAEAC;UAGAC;KAAkB,MAElBC;UAAkBN,KAElBK;KAAkB,OAGpB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKA,eAjF6BL,WAmFzBF,UAEFS;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YACuBC,WACvB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA,iBACkB,SACdF,UAAkBG,QAClBC;cAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA;;EAwBIC;GApBW,WLk68BNva,AAAAA,AKj68BD4Z,KAAAA,wCACFY;cAEOC;;;2CAKc;EL658BlBza,AAAAA,AK358BIua;WACO,MAClBG,AAAAA;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAWA9d;WACwB;;6CuGvIkBia;EvG2UtCD,OAA4C+D,KA7L9CC;YAiDAC;YA7CA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeA/c;WACwB,MAEN;;EAELgd,UAIX3F;eAGAt9B;oBAAyBkjC,WACzBljC;;;6CuG/KwCg/B,OvGsLxCh/B;cAqJE++B,OAA4C+D,MA5I9CE;YALA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAWA,yBAEE;MAAc,iBAAd,UACEG,eADF,U1BmBezuC,I0BlBbyuC;MAAEx8B,WACJ,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;GACW,CAAA,gBAAmB,CAAA,eAC1By8B,eAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBA,YACErB,AAAAA,KAAAA,wBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,eACMA,KAAAA,YAAiC,MACrClZ,AAAAA;iBAAmBua,aACrB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMA;EAGiBC;WACO;YAKDrvC,oBAAqC;E6DnUZ8N;E7DuUzBsN,AAAAA,KAAc/X;EA6BjCtE,SAzBEuwC;GAGA,sBAEFl0B,KAAc/X,WAElB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAIAwP,oBACoBk7B,KAAAA;WACK,MAEvB;MAAOwB,UACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAWA/3C,yBACqB;wBAGjB;yFAEA,aAEF;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;EAKoB4jB,AAAAA,A6DtX4BtN;E7DuXtB0hC;GAEJ,QLsu8BpBrb,AAAAA,AKru8BEU,4BZ7UoChuB;6BYoVpCguB,AAAAA,iBZpVoChuB,SYsVxC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAkBA4oC;GA3U6B1B,WA8UJF;EAERwB;WAGb,MAAOrE,MAAAA;KAoBiBA,KAAAA;EAfI3nC;;GAoN1BqsC,WACFA,uDACQC;EAWC;GACP3iB,cACFA,OAAa3Z,AAAAA,A6DroB+BvF;EAAAA;EzE6CRjH;EoHdtB;;;axGyYd+oC;UAA2BvsC,QACpBwsC;KAI8B7E,KAAAA,aAJrC;UAEJ,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CAEArsC,YAAsC,MAAGqsC,MAAAA,SAA+B,A,C;A,E,C,CAIxE,cAAyB,MAAGA,MAAAA,WAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE/D;GACM8E,UAAkB,MACtBC;cAAmBjC;EACKkC;EAAeC;GyGxbjC,QACNC;0BAeA;MACAC;KAAS,UAAgBC,SzGuazBJ;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;GACMF,UAAkB;EAuIlBO;GAAkB,SACpBA,MACAA;UAEFC,UAxIAtF;KAAAA;EAEW1Q,WACX;KAAY,UACViW;EACOvkC,kBACT,AACA8jC,QACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA;GACMA,WACFC,cACOjC,yDACP;OAEFiC,cAAmBjC;EACfkC;GAAc,SAChBA,OACAA;oBAK0B,MAC5B9G;KAAa5O,wBAKf,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,uB,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAgBA;EAIkByT,KAAAA;EACAA,KAAAA;;GAEJ,GACV,IAAiByC,6ClByVoBrqC,uBAAMA,6BA2B7Cmf,KAAQnf,AAAAA,QkBpXN,UlBuXazF,IkBtXX+vC;YAAwBp9B,A6DpfkBvF,oB7Dqf5C,OAE6B,QAG7BuiC,KAAoBK,AAAAA,eAAeC,aAEvC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKA;EACkB5C,KAAAA;EACAA,KAAAA;EAGG,8BACnB;MAAA,QAAA,UAAA;;mDAGE6C;KAAAA,KAAuBtP,kBACPA,MAClB,AAEAsP,0BAgBF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEA;EACkB7C,KAAAA;WACK;EAGFyC;WACO;;;GAIpBK,WACFA,SAAoB/C,+DAItBgD;cZlgBoCjqC;;GYsgBhCgqC,WACFA,SAAoB/C;EqBnHU5tB,ArBsHtBlgB;EqBvbF0d,IAAVyB;KAAUzB,qBAKV0B;KAAW9B,cAKX+B;KAAU3B;MjC7F4B7W;EY6hBlCy8B;cACW,6BAAbA;OAEFA,YAjBF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoBAhsC,oBACYgsC,AAAAA;WACO,QACjBS;MACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,kBACMT;WAAoB,MACxB;MAAgBA,8B1BtRmCv0B,KAAAA,MAAoBO,6B0BsRvE,OAAmCy0B,A1BnPpBrjC,S0BmPgC,AAC/C4iC,AAAAA;UACAA;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA+CA;EACeyK,KAAAA;GACTzzC,SAAgB;;GAEhBy2C,WACFA,SAAmBjD,0CAErBkD;YAAuB12C,SAAa22C,aACtC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,mCAGE;MlBoLuC9qC,uBAAMA,6BA2B7Cmf,KAAQnf,AAAAA,kBkB/MR,UlBkNezF;EkB5Mf6mB,AAAAA;EL079BkB;EAAyB;aAAvC,OA8E4Bnc;;EAoD5B+T;GAAQ,SAAW,AATJyW,QAUjBvtB,KAAAA,YKjk+BF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAMA;;GAGM,AAAC3L,cAAe;;EAETq0C;KAETA,aAAuBjD,wCAAgCpxC;EAkBvDqxC,KAAAA;EAAgDrxC;EsG5DrCw0C;EtG4DXnD,MsG3DU;GtG6CN,cACKgD,SAAmBjD,gDAI5BqD;0DAFI,uBAMJJ,aAAuBjD,wCAAgCpxC,eAE3D,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CASA;;EACaq0C;KACFA,aAAuBjD;;4CflqBzBv2C,SAC4Bo/B;4BesqBjCya,gBZtqBenK;KYwqBf8J;KAGOA,aAAuBjD,mCAClC,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAja2C,oBACvCjZ;GLqu8BE,AAAC7uB,aACH,QAAY8e,qBAEP;SKvu8BP,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAD+B,WAAG,cAAG9kB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyKZ;4CAErB,QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAImB,wBAAO;MAAGqxC,iDuGtZWrG,SvGsZc,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA4CrB,WAAG,gBAAsB1J,gBAAU,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAIjD;;GACL,SAAWgQ,QACrB1B;;WAEmB;EAERY;GACF;SAETC;SAAwBc,SAAeA,SAqPzCH;UAjPwBG,SAAeA,mBAEzC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CA0BqC,YAqNnCH,6BAnNA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAyKK;;GACDL,WACFA;EsGtMkC1wC;EtG0MnButC;GACM;EAIvBrmB,AAAAA,cL079BFpc;gBA/EI,KAAc,KA8EcC,2BA9EW,uBK319BzC;6CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAjB4B;;EACZomC;;2CACW;;;GAGnBxkB;EAEO,OAAwBA;EAAxB;SAIXykB;uDADI,kBAEN,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAiCsC,YAAI,MAAG,CAACC,QAAEC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAsKrB;ELspNtB,KAA6B1gB,kDKppNlC;MAAA,QAAA,UACG1J,K1BhqBU7mB,K0BgqBX;uBAAA;yBACF,GAEIknB,YLk52BuCkJ,eKj52BzCvlB,AAAAA;0BAMJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CANsC,iBAChC;eAAA,QAAA,OACEgc,AAAAA,K1BtqBO7mB,4B0BuqBT,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kC,C;A,E,C,CA0BN,ewGh9BmBkxC,cxGi9BL,MACZC,AAAAA;;kCAEF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YACEC,SACAzpC,AAAAA;WAAiB0pC,WACnB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,C,CAEA,yBACE;MAAA,UACuDA,QADvD,UAAA;;6CACoD,KAAZvM,WACnBn9B,AAAAA,AAAAA;EACFypC;GAAX,sBwGz9BRE,KAAAA,UxG49BI;QAEJ,CACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,CA7BAC,kBAKEJ,QAAOtqB,AAAAA,WAAoB2qB,YAC7B,A,C,C;A,E,C,C;A,G,C,C,sC,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,CAyEAC,YACEC,WACF,A,C;A,M,C,C,E,CAFAD;;EAt9BqB;;;gBC5CI;;;;;;SDogCzB,A,C,C,C;A,G,C,C;A,G,C,C,kB,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,S,C;A,E,C,Q,C,C,C,M,C,I,C,E,C,M,C,C,C,C;A,E,C,CyG5hCA,kBACMhC;GAAO,SACTA,MACAA;cAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,eACa,AAAPA,eACFkC,UACAC;WAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,C,C;A,E,C,C;A,G,C,M,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,C3GUyB,kB4B9BlBt3B;GAAD,AAoDmBa,mDAnDvBb;U5B6B2B;OAA2B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgIZ,wBAAI;gDAAQvC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAIZ,wBAAI;gDAAQvH,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgC3B,YAAI,MAAG,CAACwgC,QAAEC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C,A,E,uB,mC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C4G5LzCjuC;EACgB6uC,YAAcxuC;GAChB,QAAS,MAAOyuC;MAMnBC,QAAYzyC,iBAAnB;kBAJF,OAUE;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAzCsB,iBAEZ,8BACR0jB;sBACAA;sBACAA;sBASAA;sBACAA;sBAEAA;uBAEA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAjByB,cAAO,SAAG5lB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACZ,cAAO,SAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACN;MAId4sB,OAAP;kBADF,OAGE;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACqB,cAAO,MAAK,CAAA,gBAAG,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEhC,cAAS,MzH4EJnzB,0ByH5EuC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAV,YAAI,cAAGm7C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CAEzC,cAAS,MzHsFJn7C,qByHtFiC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAV,YAAI,cAAGm7C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,uB,uD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCiBzChvC;8CACiBk5B,AAAAA,KAAAA;yEACKA,aAFa;SAG9B,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAELl5B;8CACiBk5B,AAAAA,KAAAA;yEACKA,aAFa;SAG9B,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAPyB,YAAI,MAAQ,MAALA,kBAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKjB,YAAI,uBAAUA,eAAK,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAmB7C+V;WACoB;2BCqFK;;;EClIbC,MAAVC;MACArjC;qBvIyRoChX,6BuIxRpCs6C;;EACOC;GFkDHC;GAAkC,eAAkB;;KAEtD,MAGF;0BAYF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC,YAAuC,sBACiC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAf/D;8CAEwCC;kBG+E9B,apIq/CZz4C,QAA8B;;MiIlkDL,qBAC1B,MAAO;MAEmB,qBAC1B,MAAO,sBAET;MAAO,qBACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAGwC;;OACsBy4C;kBGkE7C,apIq/CZz4C,QAA8B,mDiIxjDa,SACqB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAuBvEsjB;EACiBwlB;;+CAIJ3G,AAAAA,KAAAA,+BAAT2G;iBAOU4P,gBAA0BA,UAApC5P;UnHtDGj5B,oBmHyDP,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEahB,YAAU,MAAGi6B,SAAM,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAEnBl5B;IAET+oC,KAAOxrC,UAAUyrC,oBADnB;;gDAGEhP;8CAA+Cz8B,eAAUioB,uBAE7D,A,C,I,C,I,C,C,C,C,C,G,C,G,C,C,C,C,O,C,G,C,C;A,E,CAvCAyjB;EAGE1rC,OAAAA,AAAAA,AAAAA;WAAsBmW;IIrGD9N,gBJyGLojC,SGvCXE;OHwCHx1B;QAAUnW,oBAFZ;;gDAIEy8B;uDAAyDxU,uBAE7D,A,C;A,M,C,C,E,CAZAyjB,iCIlGuBrjC,kBDoSD;;SHtLtB,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAT2C,YACvCo0B,8CAA+Cz8B,qBAAUioB,UAC3D,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAc0B,kBACX,8BACX2jB;MAAK5W,YAEL;gBADqCyW,eGmCxB,wBHjCf,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,gB,C;A,E,CKvHJI,cACE3d,AAAAA,6BACF,A,C;A,K,C,Q,C,C,C,C,M,C,I,C,C,C;A,M,C,C,E,CAFA2d;;SAEA,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CADgB,wBbWdlQ;K3GuDKj5B,Y2GvDiCi5B,QaXL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C,A,E,4B,wC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CFuCrC7/B,oBC3CyBuM,kBDoSD,iBCpSCA;mBD8CvB;MAAO0zB,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA8BA;;;;iBAUE;mEAEkB,CAAA,KAAZ+P,mBAGJC;OAAYD;IACLA,SACT;;+CAKaE;;yDAEPL;;2CAA2BM;EAClBN;EAEFO,KADCP;yDAICA;EACFA,8DAEEA;GACG,AAAZA,oBACiB,AAAfA,gBAAwBM;EACjBN,eAEXM;aAGFA;;YAIF,sBxIgLsCr7C,8BwIhLtC,UxIkLiBkI;EyI5SMuP,kBDoSD,iBCpSCA;mBD8ChB0zB;;KA+EG,KAAA,oDAGV,EAEQoQ;gBACa,KAAA;KAEnBnd;KAEAvjB,AjD9H8CvF,oBzEiC7Bm5B,Y0H+FrB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAwFAvjC;4CACmB,MAAO,aACxB;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAvNQ,cAAO,MAAK,WAAEhL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,MAAK,CAAA,UAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,sBAAQA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,sBAAQA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACf;EAEAwN;KAAa,MAAOA;KAClB,KAAA,kDACR,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAIK,YAAI,SAAG5N,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACP,YAAI,MAAG,SAACA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACR,YAAI,MAAG,QAACA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA4Cbu7C,WAAgB,YACN,sDAAwD,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,G,CA6ElE3jC,iBACM8jC;GAAc,QAAS;EjDrJmBlmC,KiDsJtBmmC,QAAxBD;SACA;SACF,A,C;A,C,C,CAEAtwC;GACW,eACP,MAAOuwC;O7GpEkC9tC,A6GqEhC+tC;G7GrEgC/tC,Q6GsEzC,MAAOoxB,M7GpE+BpxB;Q6GqEvB,AAAN8tC,0B1H9HMhN;E0HiIIkN,KjG+UhB1jC,KzCjb4B1M,AyC2tBCiR,KAAAA,AiG1nBdo/B;;uFAKmBC;;KACnC,MAAO9c,MAAS6c,AAAAA,AAAAA;iDAEhB,gBAAkBA,iBAGlB5yB;GAAO,QACT,MAAO+V,MAAS/V;UAEV,KAAA,yCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA9d;GACW,eAIP;OACSwwC;G7GjGgC/tC,AAAAA,W6GkGzC;O1HzJe8gC;G0H6J0B,AAArCkN,KjGmTD1jC,KzCjb4B1M,AyC2tBCiR,KAAAA,AiG9lBdo/B,sCAEhB,MAAOH,YAGPzyB;GAAO,QACT,MAAOA,SAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAlqB;G7G/G6C6O,AAAAA,A6GgHvC+tC,iBACF;O1HxKejN;G0H4K0B,AAArCkN,KjGoSD1jC,KzCjb4B1M,AyC2tBCiR,KAAAA,AiG/kBdo/B,sCAEhB,WAGA5yB;GAAO,QACT,MAAOA,UAET;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,G,CAgBA3C,iBAAuBG,OAAH;qCAAqB,A,C;A,G,CAIzCtb,WAAwB,MAAG6/B,SAAM,A,C;A,E,C,CAIjC+Q,aAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1BC,iBACElH;;EACImH;GAAQ,QACVA,QAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAnH;EAEMxsB;GAAc,SAChBA,MACAA;eAGc0iB,OAGhB+Q;;EAEe/Q;GAAX,yBACFvkB;G1FnDE,AA/EoBnD,aA+ECM,OACzBC;S0FoDF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA5kB,YAAkB,MAAGoQ,AAAAA,eAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAQrC6sC,YACE5kB,OAAW4Z,SACb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAiL,YC5RuBzkC,KD6RfqxB,cAJNzR;OAAW4Z,SAMb,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,W,C;A,E,C,CASAkL,YAAwC,iCA3DT,yBA2DgC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE/DC,YAAwD,MC1SjC3kC,AD0S0C4f,iBAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEzEglB;EC5SuB5kC,KD6SA6kC;8BAhEQ,wBAkE7Bj0C;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAk0C;ECnTuB9kC,KDoTA+kC;ECpTA/kC,KDqTL+kC;gCAxEa,wBA0E7Bn0C;QACAo0C;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC;EC5TuBjlC,KD6TA+kC;EACTA;;OAEUntB,UAAhBmtB;;EAAAA,yEAnFuB,wBAqF7Bn0C;;GACS,SAASw2B,UzIrKXv/B;oByIsKP,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAq9C,YAAwB,iCA1FO,yBA0FkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEjDC;EACgBtB,cAAAA,SAAcjsB;8BA7FC,wBzI/EtB/vB;mByI+KP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAu9C;EChVuBplC,KDiVL4f;ECjVK5f,KDkVH4f;gCArGW,wBAuG7B/d;QACA9R;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAs1C,YAA8B,iCA5GC,yBA4G2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1DC;EC3VuBtlC,KD4VJ2mB;EC5VI3mB,KD6VH2mB;gCAhHW,wBAkH7B3P;QACAD;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAwuB;ECpWuBvlC,KDqWJ2mB;8BAxHY,wBA0H7B2c;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAmB;EC3WuBzkC,KD8WJ+kC;EC9WI/kC,KD+WH+kC;gCAlIW,wBAoI7BhuB;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAhDiC,wBAAO1uB;QAAH;SAAem9C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASlC,wBAAO5lB;QAAH;SAAe34B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CA+CrCo9C,YACE/Q,QAASkG,KAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAiM,cAAkB,MAAG9Y,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,CAOjDnlC,kBAAqBmQ,OAAH;MAAGA,SAAW,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAEhC0sC,kBACW1sC,OAAT27B;QAAS37B,QACX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA8tC,cAAkB,MAAG9Y,YAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,I,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,E,C,CAUzC0X,YACE/Q,QzItNOzrC,KyIsNE69C,QAAa,2CAExB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAD,cAAkB,MAAG9Y,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAHtC,cAAUlZ,OAAImM,AAAAA,cAAgBA,AAAAA,cAAvB;SAAoC0T,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,E,C,CAejDmS,cAAkB,MAAG9Y,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,CAQjDplC,kBAAoBoQ,OAAH;MAAGA,SAAW,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAE/B0sC;EAFoB1sC,OAGlB27B;QAASkG,MAHS7hC;EAKN6hC,KALM7hC;;+C1HtYDq/B,K0HsYCr/B,QAQhBiZ;QAAgB,AAAA,2CAOpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA60B,cAAkB,MAAG9Y,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CATa,eAC/C8T,8BAEF6D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHM,wBAAI;iDAAuC,KAAPjT,aAAUz6B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,G,CA8BxDrP,kBAAuBoQ,OAAH;MAAGA,UAAc,A,C;A,E,C,CAErC0sC;EAC2B1sC;EAAjBguC,WAAiBhuC;GACZ,KAJQA,iBAKAuhC,AAAAA,aAAnB5F;QAASr9B,8BAECijC,OAAV5F;QAAU4F,mBAA+BjjC,SAAEijC,UAE/C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAuM,cAAkB,MAAG9Y,YAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,G,CAY/CplC,kBAAuBoQ,OAAH;MAAGA,UAAc,A,C;A,E,C,CAErC0sC;EAFuB1sC;EAGbiuC,WAHajuC;GAIR,KAJQA,gBAIY,KAJZA,kBAKAqf,AAAAA;;EAAsBD,AAAAA,aAAzCuc;QAASr9B,iCACS,KANC0B,gBAMmB,KANnBA,eAOnB27B,QAASr9B,SAAE+gB,AAAAA,cAAaD,AAAAA;OACfC;GAAAA,eAAuBD,AAAAA,oBAChCuc;QAEa,KAXM37B,iBAWIqf;;;;KACrBpG,QAAgB,AAAA,KAACoG,2CAGnBsc;QAASr9B,SAAE+gB,QAAaD,AAAAA,iBAE5B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA0uB,cAAkB,MAAG9Y,YAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAN9B,YAAI,MAAG2X,mBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,G,CAe1C/8C,kBAAmBoQ,OAAH;MAAGA,UAAU,A,C;A,E,C,CAE7B0sC;EACsBzzC,AAAAA;YAElB0iC,YACA;SAGsB37B;W1H1ePq/B,K0H0eOr/B,UACxB27B;QAASnwB,AAAAA,AjD5gBqCtF;;4CiD+gB5C+S,QAAgB,AAAA,gCAMpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA60B,cAAkB,MAAG9Y,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CARyB,eACvD8T,8BACF6D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHkB,wBAAI;iDAAuC,KAAPjT,aAAUz6B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,E,C,CAgBpEytC;EACsBzzC,AAAAA;YAElB0iC,YACA;SAEQr6B,AAAAA;SACVq6B;QAASuS;4CAGPj1B,QAAgB,AAAA,gCAMpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA60B,cAAkB,MAAG9Y,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAR0B,eACvD8T,8BACF6D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHkB,wBAAI;iDAAiC,KAANjT,aAASxvB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,G,CAmB9Dta,kBAAqBoQ,OAAH;MAAGA,UAAY,A,C;A,E,C,CAEjC0sC;EACavzC,OAAAA;;EAAAA;EACSF,AAAAA;YAElB0iC,YACA;SAEE37B;GAAAA,wBAMF27B;QA4DGhM,8CAJItmB,AAAAA,AAAAA,QAAqBA,gB7HrmBvB1Z,SAC4Bo/B,6BGAlBsQ,K0H+iBSr/B,UACxB27B;QAASnwB,AAAAA,AjDjlBmCtF;;4CiDolB1C+S,QAAgB,AAAA,iCAStB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA60B,cAAkB,MAAG9Y,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA9Bb,YAAI,MAAGtkC,SAAEirC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAoB1B,eACMmN,8BAEF6D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHM,wBAAI;iDAAuC,KAAPjT,aAAUz6B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,E,C,CAkB9DytC;EAC0BrtB;EACTD,AAAAA;;qEAEuB,aAC9B,KAAA;4CAINnG,QAAgBroB,AAAAA;EAISu9C;EAgCF,cAhCzBxS;sBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAmS,cAAkB,MAAG9Y,YAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAPE,YAAI,MAAG2X,mBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAkDxEyB,YAAW,MAAG5iC,AAAAA,AAAAA,YAAcvM,qBAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAM3DrP,YAAkB,wBAAoByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CAD9Cg6C,+BAA2B,A,C,C,C,A,E,kC,8C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CGzb7B3+C;;GACQ,SAAM;oBACgB;GACf,CAAA,KAATgB,QAAYI,UAAU;GAC1B;YAAoBJ;6BAAAA;KAAF;EACZA;;GAAK,CAAA,OAAGI,MAAM,aACpB,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzB,YACa68C,UAEX;MAAOoC,M5IpEEp+C,sB4IqEX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKE4B,oBAC4B;6BAAA;EAAR;EACA,UAAQ,GAAuB,AAAA,CAAR,kBACzC;MAAY,GAAQ,MACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;EACoB,UAAQ,GAAuB,AAAA,CAAR;EAC7B,CAAA,EAAQ,WACpB;MAAkB,WAAQ,GAAuB,AAAA,CAAR,kBAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CA7OAy8C,gBAAwC,qBAAkB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAE1DC,gBAA0D,uBACnC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAavBV,cAAkB,MAAG9Y,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CAQjD8Y,cAAkB,MAAG9Y,YAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEzCplC,kBAAsBwI,MAAJ;mDAA4C,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE9D1I;;EAAuBs/B,sCAAH;UAA8B,KAARA,QAAW52B,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE1D/I,YAAiB,MAAG+I,MAAAA,QAAc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAQlC01C,cAAkB,MAAG9Y,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE5CplC,YAAkB,cAAMm+C,aAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEjCr+C;;SAAoB;iDAAsB++C,KAAYzf,SAAW+e,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEzE1+C,YAAiB,MAAGq/C,MAAUX,SAAQ,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CAStCD,cAAkB,MAAG9Y,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEjDplC,YAAkB,WAAKsa,kBAAMykC,SAAW,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAExCj/C;;SAAoB;iDAAiC,KAANs/B,SAAS9kB,UACpC,KAAb8kB,QAAgB2f,SAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEjCt/C;EA9BoB+I,KAAAA,AA8BsB8R;EAAcykC,KAAAA,QAAvC;MAmLiBre,MAAOhqB,KAAQA,cAnL2B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAQ5EwnC,cAAkB,MAAG9Y,YAAoC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEzDplC,YAAkB,cAAM2xC,aAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE/B7xC;;QAAoB;iDAA2C,KAARs/B,KAAWuS,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEvElyC,YAAiB,MAAGkyC,MAAAA,SAAc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CAQlCuM,cAAkB,MAAG9Y,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE5CplC,YAAkB,MAAGwI,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE1B1I;;SAAoB;iDAA8B,KAARs/B,QAAW52B,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE1D/I,YAAiB,MAAG+I,MAAAA,QAAc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CASlC01C,cAAkB,MAAG9Y,YAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE/CplC,YAAkB,WAAKyG,iBAAUkrC,SAAM,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEvC7xC;;SAAoB;iDAAoC,KAAXs/B,SAAc34B,UAC5C,KAAR24B,QAAWuS,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEvBlyC;EAA0CgH,KAAAA;EAAmBkrC,KAAAA,QAA5C;MAuIiBjR,MAAOhqB,KAAQA,cAvI2B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CAU5EwnC,cAAkB,MAAG9Y,YAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEhDplC,YAAkB,cAAMyvB,iBAAMhpB,iBAAU+oB,aAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE/C1vB;;SAAoB;iDAAqC,KAAXs/B,SAAc34B,UAC9C,KAAP24B,SAAU3P,UAAgB,KAAR2P,SAAW5P,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEzC/vB;EAA0CgH,KAAAA;EAAmBgpB,KAAAA;EACzDD,KAAAA,QADa;MAyHbkR,MAAOhqB,KAAQA,KAAQA,iBAxHR,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CASnBwnC,cAAkB,MAAG9Y,YAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE9CplC,YAAkB,cAAMyvB,oBAASD,aAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAExC1vB;;SAAoB;iDAA+B,KAAPs/B,SAAU3P,UACvC,KAAR2P,SAAW5P,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEvB/vB;EAA0CgwB;EAAAA;EAAeD,KAAAA,QAAxC;MAqGiBkR,MAAOhqB,KAAQA,cArGuB,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CASxEwnC,cAAkB,MAAG9Y,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEvCplC,YAAkB,WAAKqJ,iBAAUqI,aAAU,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE3C5R;;QAAoB;iDAEF,KAAXs/B,QAAc/1B,UACH,KAAX+1B,QAAc1tB,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE7BjS;EAC0B4J,KAAAA;EAAmBqI,KAAAA,QAD5B;MAmFiBgvB,MAAOhqB,KAAQA,cAlFc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CAS/DwnC,cAAkB,MAAG9Y,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAExCplC,YAAkB,WAAKqJ,iBAAUR,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEtC/I;;SAAoB;iDAEF,KAAXs/B,QAAc/1B,UACP,KAAP+1B,SAAUv2B,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAErBpJ;EAA0C4J,KAAAA;EAAmBR,KAAAA,QAA5C;MAgEiB63B,MAAOhqB,KAAQA,cAhE0B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CAmB3EwnC,cAAkB,MAAG9Y,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAExCplC,YAAkB,WAAKqJ,iBAAUoQ,iBAAQlQ,aAAW,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEpDzJ;;SAAoB;iDAEF,KAAXs/B,QAAc/1B,UACL,KAAT+1B,SAAY3lB,UACZolC,KAAYzf,QAAa71B,SAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE1C9J;EAA0C4J,KAAAA;EAAmBoQ,KAAAA;EACzDqlC,KAAUv1C,QADG;MAsCbm3B,MAAOhqB,KAAQA,KAAQA,iBArCF,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAerB,cAAU,MAAGgoC,QAA2BM,SAAa,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,8B,0C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,e,C;A,E,C,CJ/OzD1D;KACY,SAAuB,CAAA,KAAZ2D,KvIqRN/1C,AuInSG8O,kBAeJ,SAAwB,CAAA,KAAbinC,KvIoRV/1C,AuInSG8O;;UAgBV,KAAA,4BvImRO9O,AuInSG8O,aAkBlBA,AAAAA;YACF,A,C,Q,C,C,C,M,C,I,C,E,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAknC,cvI8QiBh2C,AuInSG8O,kBAsBSmnC,AAAAA,gBAAP;kBACTC,SACX;oBAA+BC,aACjC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKAH,2BAEE;MAyIOC,UvI0HQj2C,AuInSG8O,WAgCJ,YACI,KAAZinC,cACe,KAAbA,KvIiQO/1C,AuInSG8O,oBAmCDsnC,SAEJH;;6BACe,KAAbF,KvI6PA/1C,AuInSG8O,oBAuCIunC,SACTJ;;;QAIY,KAAZF,KvIuPE/1C,AuInSG8O,gBA6CdsjC;EAEOkE,UADKJ,mBAES,KAAZH,KvImPE/1C,AuInSG8O,iBAgDwC,KAAbinC,KvImP9B/1C,AuInSG8O;gDAoKV,uDAGRsjC;;EACYC,SACL4D;;wBAvHkB,KAAZF,KvIiPE/1C,AuInSG8O,gBAmDS,KAAlBinC,AvIgPM/1C,AuInSG8O,sBAoDPynC;UAIX,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAP;+CAEoC1vB,OAAzB2vB,AAAAA;gBAAP;yEAC4B3vB;;;;QAEI/V,KADZ+V;EAC0BA,OAAvC2vB,AAAAA;gBAAP;iCAEM,KAAA,uCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAD;EvI2NiBh2C,AuInSG8O,UA0ElBsjC;;EACY8D,SACZ;YvIuNel2C,AuInSG8O;GA4EJ,WACM,KAAZinC,YACW,KAAZA,KvIqNQ/1C,AuInSG8O,gBA+EC,KAAZinC,KvIoNQ/1C,AuInSG8O,iBAgFO,KAAlBinC,AvImNQ/1C,AuInSG8O,iBAgFSkkC;;;EACjBmD,UAAwBJ,AvIkNnB/1C,AuInSG8O,kBAkFlB,EACgCkkC,OAAzBiD,AAAAA;gBAAP;uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAD;GACkB,KAAZD,KvI4MW/1C,AuInSG8O,kBAwFJinC,KvI2MC/1C,AuInSG8O;;GAyFN,YAAgB,YACxBsjC;GACgB,KAAZ2D,KvIwMO/1C,AuInSG8O,kB5HmFXjY,gB4HiK6Ck/C,KvI+CrC/1C,AuInSG8O,uBAoPNmnC,AAAAA;;;yBACZ7D;SAzJM;gBA8JM6D;GA7Je,KAAZF,KvIsMA/1C,AuInSG8O,kB5H+FXjY,gB4H2JgDk/C,KvIyCxC/1C,AuInSG8O,kBA0PNmnC;;;yBACZ7D;SA7JM;gBAEW+D,QAAiBK,aACrBP;UAAP;+BAEa,YACf7D;EACW+D,QAAiBK,aACrBP,AAAAA;gBAAP;sBAGJ,MAAOO,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAR;OACaD,KvIsLI/1C,AuInSG8O,uBAgHAinC,KvImLH/1C,AuInSG8O;;GAiHF,eACVsjC,SAEO6D,AAAAA;gBAAP;gCACiB,YACjB;;OAIF,MAAOQ;OAEP,MAAOC;OAEP,MAAOC;OAEP,MAAOC;UAEU,KAAbb,KvIiKO/1C,AuInSG8O,kBAuOlBsjC;EACWC,SACXD;cACO6D,AAAAA;gBAvGD;2BACsB,KAAbF,KvI+JA/1C,AuInSG8O,iBAqIZ,MAAO+nC,UAET;;QAEA,QAEN,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAC;;EAiBSb,OAfP;GACE7D;GACgB,KAAZ2D,KvIkJS/1C,AuInSG8O,gBAiJiC,KAAbinC,KvIkJvB/1C,AuInSG8O;EA8OcinC,KvIqDjB/1C,AuInSG8O,WA8ONmnC;;;yBACZ7D;SAnFAA;cARE6C;kBASU5C;EvIsIGryC,AuInSG8O,iBAqJH,SAAwB,KAAbinC,aAAoB,AAC9C3D;cACA;mBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAoBA4D;GACmB,KAAbD,KvIsHW/1C,AuInSG8O,qBA8KhBsjC,SACO6D,AAAAA;gBAAP;oCAEe,KAAbF,KvIkHW/1C,AuInSG8O,sBAkLhBsjC,SACO6D,AAAAA;gBAAP;oCAEe,KAAbF,KvI8GW/1C,AuInSG8O,qBAsLhBsjC,SACO6D,AAAAA;gBAAP;sCAYc,CAAA,KAAZF,KvIgGW/1C,AuInSG8O,oBAoMV,iCvI+FO9O,AuInSG8O;EAsMNinC,KvI6FG/1C,AuInSG8O,WAuMlBsjC;SACO6D,AAAAA;;;EAdIG;WAET;KAEA,0BAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAWA5+C;EvIwFiBwI,AuInSG8O;GA4MP,SAAuB,KAAZinC,YAA6C,KAAbA,KvIuFvC/1C,AuInSG8O,sBA8MhB;GACEsjC;GACgB,KAAZ2D,KvImFO/1C,AuInSG8O,gBAgNmC,KAAbinC,KvImFzB/1C,AuInSG8O,sBAoNd6nB;OADW0b;EvIgFAryC,AuInSG8O,iBAqND,SAAwB,KAAbinC,aAAoB,AAC9C3D;cACA;SAEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA4D;EvIuEiBh2C,AuInSG8O;GA6NP,SAAuB,KAAZinC,YAA6C,KAAbA,KvIsEvC/1C,AuInSG8O,kBA8NhBsjC;EACWC,SACXD;cACA;SAEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CASA2E;EACkChB,KvIqDjB/1C,AuInSG8O,WA8ONmnC,AAAAA;;0BACZ7D;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA2E;E5HhKSlgD,gB4HiK6Ck/C,KvI+CrC/1C,AuInSG8O,uBAoPNmnC,AAAAA;;0BACZ7D;SACA;SACF,A,C,Q,C,C,C,M,C,I,C,E,C,E,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEA2E;E5H1JSlgD,gB4H2JgDk/C,KvIyCxC/1C,AuInSG8O,kBA0PNmnC,AAAAA;;0BACZ7D;SACA;SACF,A,C,Q,C,C,C,M,C,I,C,E,C,E,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C,C,A,E,mC,+C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CK5PF/6C,YAAoD,gCACjB,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,C;A,G,C,kB,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,C,C,CAMjCkG;;QAAc;iDAAgC,KAAR24B,KAAWe,UAAiB,KAARf,IAAW52B,QAAK,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,I,C,C;A,G,C,CAC1E/I,YAAiB,MAAG+I,MAAAA,QAAc,A,C,I,C,I,C,C,C,C,C,G,C,U,C,C;A,E,C,CAClCxI,YAAkB,cAAMmgC,kBAAQ33B,YAAO,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,K,C,I,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,I,C,C,C,C,C;A,M,C,C,E,C,CAEvC03C,+CAAoC,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,E,C,C,C,C,kB,C,C,C,C;A,e,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,E,CAapCn/C,2BAC6BwW,KAAAA;wCADU;SACS,A,C;A,E,CAGhD9X,YAAe,MAAG8X,MAAAA,SAAgB,A,C;A,G,CAClCzX,YAAiB,MAAGyX,MAAAA,SAAiB,A,C;A,G,CAIrC2oC;EALkB3oC;;WAKqC,KALrCA,WAK0CA;wCAAnC;SAAkD,A,C;A,E,C,CAE3E2oC,+BAC+B3oC,KAAAA;wCADM;SACqB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,CAW1D2oC,WAA4B,MAAGh3C,SAAQ,A,C;A,C,C,CAEvCpJ;EACMkY;GAAAA,SAC0BH,OAAAA;QAAM,GAAlC3O;wBAAsC8O,eACtC;SAEF9O,YACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C,C,A,E,mC,+C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCxDFi3C;GtGyqF6BloC,AAAAA,AsGxqFvBmoC,iBACF,MtGqqFsBnoC,AAAAA,AsGrqFfmoC;EAqBQA;GACE,SACW,CAAA,KAAzB/iC,iBApBUs/B,KAAgByD;GAClB,QACT,SAGJ,MAAA,KAAyBA,SAAzB,UACezD,K7IuREzzC;G6ItRJ,QACT,SAEJ,AACA,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,A,E,iC,6C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CPgGAzJ,+BAEa;SACA;SACA;SACA;SACA;QACA,UAEb,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,c,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CASEO,YAAkB,UAAMqgD,cAAQ73C,YAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,C,CAgBxC9H;EAHUsX,OAARiL;QAAQjL,MpEmcS2c,SoE9bjB;MA0HA0mB,UA1HMp4B,QAAM,mCALZA,QAAQjL,MpEmcS2c;uBoE1bb2rB;kCAJEr9B;KAnDuC,OAAgB,UACzD,OAAgB,uBAA4C;;KAwD5Ds9B;QAhDsB,OAAgB,MAkDtCC;kBAbIxoC,MpEmcS2c,SoEncjB1R;;;GArC0B,OAAgB,MAqHxCw9B;KAEApF,2CAlFFp4B,QAAQjL,MpEmcS2c,SoE3WjB0mB;0CAxFAp4B,QAAQjL,MpEmcS2c,SoEtWjB0mB;kCAhIyBqF,mBA8ITz9B;EA3GRjL,MpEmcS2c,SoEncjB1R;;GAnCyBy9B,mBAmJwBz9B;E3HzD1CljB;G2H0DD4gD,iBAjHN19B,QAAQjL,MpEmcS2c;WA5eK;EvDgGf50B,gBuDhGe;EvDgGfA,Q2HmEPs7C,oBAA0CuF,sBA3JlBC,aAuDD59B,YpE/DD,OoEuKcA;E3HvE7BljB,O2HwEPs7C;oBAA4CuF,aA/H5C39B;QAAQjL,MpEmcS2c,eoEncjB1R,QAAQjL,MpEmcS2c,UoExajB,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA2rB;EACkBr9B;EAhCRjL;EAAAA,MpEmcS2c,SoEncjB1R;SAkCA;MAOI69B,QAPS,wCACc,KAAA;aAnCnB9oC,MpEmcS2c,SoEncjB1R;;gBAsC6B,KAAA;EpE/EP,OoEgFA8O;E3HgBfhyB,OA6CP0M;KAA6CA,cuD7IvB;EvDgGf1M,OA6CP0M;KAA6CA,S2HpGrCuL,MpEmcS2c,SoEncjB1R;UA4CA,AACAo4B,AAAAA,wB3HkEyB5uC,QAHzBA;O2H5GAwW;QAAQjL,MpEmcS2c,UoEnZnB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA4rB;EAlDUvoC;EAoDN8oC,OADF;YAAO79B;GAAM,sCAANA;KA9FwB,OAAgB,aAC3C,OAAgB,SAAc,OAAgB,uBAChB;;;;EpEAZ;EvDgGfljB,OA6CP0M;KAA6CA,M2HpG7CwW;QAAQjL,MpEmcS2c,UoE7YjB,E3HyDyBloB;E2HtDvB4uC;GADE0F,gBACF1F;KAEAA,uB3HiDF5uC;Q2H9CF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA+zC;EAhEUxoC;EAkEN8oC,OADF;YAAO79B;GAAM,sCAANA;EAtGmB,OAAgB;;EpEJpB;EvDgGfljB,OA6CP0M;KAA6CA,M2HpG7CwW;QAAQjL,MpEmcS2c,UoE/XjB,aApEQ3c,MpEmcS2c,SoEncjB1R;;;GArC0B,OAAgB,MAqHxCw9B;KAEApF,AAAAA,sCAVAA,AAAAA,wB3HuCuB5uC,QAHzBA;S2HjCF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAqBAg0C;EACEK,O3HOAhsB;KAAM;E2HxGE9c,OAkGR;YAAOiL;GAAM,sCAANA;EAvImB,OAAgB;;EpEJpB;EvDgGfljB,OA6CP0M;KAA6CA,M2HpG7CwW;QAAQjL,MpEmcS2c,UoE9VjB,AACA0mB,AAAAA,wB3HSyB5uC,QAHzBA;Q2HJF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CA+BAzM,YAAkB,yBAAqByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAD/Cu8C,+BAA4B,A,C,C,C,A,E,+B,2C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,E,C,CGhS5B3wB,YAAoB,MAAG5X,cAAc,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C,C;A,G,C,C;A,G,C,K,C;A,E,C,CAkBrC0kC,YAAwC,MAAGF,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE7DG,YApBuB3kC,AAqBf4f,eACN4kB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAI,YAzBuB5kC,KA0Bf+kC,aACNP;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAM,YA9BuB9kC,KA+Bf+kC,aA/Be/kC;KAgCf+kC,aACNP;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAS,iBApCuBjlC;KAqCf+kC;EACFA;GAAY,QACd,sBzImQkCx8C,8ByInQlC,OAvCmByX,KzI4SNvP,UyInQb,AAEF+zC;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAU,YAAwB,MAAGV,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE7CW,iBACE;MAActB,2BzIyPsBt7C,8ByIzPpC,OAjDqByX,KzI4SNvP,UyIzPf,AACA+zC;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAY,YAvDuBplC,KAwDf4f,cAxDe5f;KAyDf4f,aACN4kB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAa,YAA8B,MAAGb,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEnDc,YA/DuBtlC,KAgEf2mB,cAhEe3mB;KAiEf2mB,cACN6d;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAe,YArEuBvlC,KAsEf2mB,aACN6d;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,YA1EuBzkC,KA2EfqxB,cA3EerxB;KA4EfqxB,cACNmT;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C,A,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CK3EwB9pC,YAA+B,MAAG63B,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAA8Cn4B,cAAwCm4B,KAASh2B,eAA2Bg2B,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAC1MiW;;EpH2FqB;;;gBC5CI;;;;;;SmH/CwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,C,wE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCFzBxhD,YAAa,MAAGyhD,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAiCruC,cAAsBquC,KAAUlsC,eAA4BksC,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAE7JlhD;G7CDiDkiC,W6CG7C;EAEO,KAN6Bgf;E7CCShf;K6CM7C,MAAO0E;KAEP,WAAUA,iBAT0Bsa,MAWxC,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAEAlhD;G7CZiDkiC,W6Cc7C;EAEO,KAjB6Bgf;E7CCShf;K6CiB7C,MAAO0E;KAEP,WAAUA,iBApB0Bsa,MAsBxC,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEAC;;ErHqEqB;;;gBC5CI;;;;;;;;SoHzBmB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCtBpBC,YAAkB,MAAGC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCxuC,cAA2BwuC,KAAYrsC,eAA8BqsC,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACvJvhD,YAAsB,MAAGwhD,MAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAA6CzuC,cAA+ByuC,KAAkBtsC,eAAoCssC,QAAyB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,c,C,G,C,C;A,E,C,CAI3N;;EAL6CD;WAQzC,MAEFE;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,YACEvsC,oBACF,A,C,Q,C,K,C,C,C,C,C,G,C,oB,C,C;A,E,C,CAEAwsC,cAHExsC,oBAKF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,qB,C,C;A,E,C,CAMYhV;EAzBiCqhD;YA0BnB,AAzBuBC,UA0B7C;EAEQC,KAAAA,QAAYE;WAEpB;GAEM,UACN,2CAGF;8CACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,W,C,G,C,C;A,E,C,CAEA,cACEF,AAAAA,KAzC2CF,YA0C7C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,cACEE,AAAAA,KAAAA,KA7C2CF,yBAiD7C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,iB,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,sB,C,E,C,CA9CAK;;EtHwFqB;;;gBC5CI;;;;;;;SqH5CoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,M,C,CA0CL,YA/BtC1sC,qBAiCE8xB;gBACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,4C,C,C,G,C,C,A,E,W,mC,A,A,C,C,C,C;A,G,C,E,C;A,E,C1BRF7lC;GAu4BU;EAAqB,AAARirB,mBAA+B,AAAVA;GAr4BtC,GACFzZ,AtGiMsB;EsG9LH/S;;OAo4BI6M,YACqBA;;;;;;;;;;;W3Fp4BvB;;;;;;gB2FwQU;EAiHlB;ExB3ZRm1B;;;;;;;;;;WnEkCgB;;;;mBAAA;;iD2FkBvB8M,OACA;SACF,A,C;A,E,C,CA22BF1uC;GACY;EAAqB,AAARosB,mBAA+B,AAAVA,6BAA5C;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQA;4CAEI;4CAGAy1B;iDAEAC,UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cACEliD,sBASF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,2BACE;MMh5B+Bg/B,SNg5Bb,EMh5BaA,gBAoBUA;;;MN21BV,AAARxS,mBAA+B,AAAVA,oBAoCxC1rB,QAAUyZ;iDAEV2nC;UAEAD,UAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,G,C,CA59BeE,WAA6B,MAAG5hC,SAAM,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,G,C,CAItC6hC,kBAAa7hC,OAAH;MAAGA,UAAS,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CAGtBtN,kBAAuBsN,OAAH;MAAGA,UAAc,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CAGrCjgB,YAAc,MAAGkG,SAAG,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CAIpBlG,WAAuB,MAAG+hD,SAAY,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,C;A,G,C,CAItC/hD;EAAmBoC;EAAqB8D,OAAxB;WARCA,iBAQ2B,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,C;A,G,C,CAG5ClG,WAAoB,eAAQqlB,gBAAM,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,C;A,G,CAS/CvlB,WAAkB,SAAQ,A,C;A,G,CAG1BA,WAAmB,SAAQ,A,C;A,G,C,CAEFE,YAAgB,MAAGgiD,YAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BnvC,cAAyBmvC,SAAUhtC,kBAA4BgtC,eAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzIhiD,WAAkB,MAAGiiD,YAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCpvC,YAA2BovC,SAAYjtC,kBAA8BitC,eAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,E,C,CAqChL7sC,eAhDmB8sC,QAkDf,MlFkFK,gBkF/EP;MAAOC,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAIA/sC,eACS,KA1EqBlP,YA6E1B,MlFsEK;GkFpIUg8C,SAgEHE,WACZ,MlFmEK,gBkFjEP;MAAOC,AAAAA,AAAAA,mBAAYh9B,mCAWrB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA;;EA00B2B9Y,KAr0BF7M;EACCA;;GAo0BC6M,cACqBA;EAl0B1CrG;GAAI,SAAe,CAAA,OAAGxG,cAI1BwG,QAAMxG,WAENqiD;SACA3Z;eACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA/BgC;EACF1oC;;GAu1BH6M,cACqBA;;GAv1B9B,CAAA,OAAGw1C,MAIb,MAAO,MAlG8B9hC,OAoGvCqiC;OACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,M,C;A,G,C,CAuCSR,YAAU,YAAO,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CACjBnvC,YAAoB,OAAO,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CAE3BpS,iBAAkCgiD,OAAH;MAAGA,UAAoB,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,C;A,G,C,CAEtDviD,YAAgB,WAxICkG,SAwIO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,C;A,G,C,CAEZlG,YAAmB,MAAGwiD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAA8C3vC,cAA4B2vC,QpGhF5H1vC,eoGgFwK0vC,WAAoB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC1KxiD,WAAwB,MAAGyiD,SAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAAmD5vC,YAAiC4vC,QpGjFhJ3vC,eoGiFsM2vC,WAAyB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,c,C,G,C,C;A,G,C,CAC7MnhD,WAAkB,MAAGohD,SAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAuC7vC,YAA2B6vC,QpGlFlH5vC,eoGkF4J4vC,WAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,E,C,CAatL1iD;EACY2iD;WAER;EjHzBwC3gD;;;qBAAAA;EAErBA,KAAAA;6BAAAA,OiHyBrB;MAAOkqB,WjHzBY,KiH0BrB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAlsB;EACY4iD;WAER;EjHhCkC5gD;;qBAAAA;EACfA,KAAAA;6BAAAA,OiHiCrB;MAAO+C,UjHjCY,KiHkCrB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKAgO,iBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAqC;UAEI,MlF/BK;EkFiCWmtC,AAAAA;GACN,QACV,MlFnCK,akFuCP;MAAOJ,AAAAA,iCAOT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/sC;GAEMrQ,uBACiB89C;EACDC,UAClB;MAAOC,AAAAA,mCAeCC,AAAAA;GACF,QACN,MAAOxU,QAGT;MAAOyU,AAAAA,iCAOT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA7tC,YACE,MAAO8tC,AAAAA,AAAAA,4CAoBT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA;KAEI,MAEFhB;;;EACUxiD,gBA3HuH8iD;QpGhF5H1vC,eoGgFwK0vC;EA4H9J9iD,qBA3HsI+iD;QpGjFhJ3vC,eoGiFsM2vC;EA4HlM/iD,eA3H8GgjD;QpGlFlH5vC,eoGkF4J4vC,UA4HjKS;QAAgBzjD,mBAClB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EACwB6iD;EACA,6BACtB;MAAA,QAAA,UAAA;EACkBa;EACFC;GACF,QACVC;OAEU,YACVA;UACA7wC,AtGlDoB;gCsGpOIvM,YAwR5B,AAEAo9C,kBAIAf;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAjJAT,WArH2GE,QAAUhtC,kBAA4BgtC,aAC9BC;QAAYjtC,kBAA8BitC,aAuH3Je,AAAAA;;MlHm/CK//C,8BAA8B,+BkHl/CnCq/C;QxB7IO5gB,SwB8IT,A,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAuCuB;2CAEf,MAGF;MAAO6gB,AAAAA,uBACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQmC;WAK7B;;WAGA,MAAOngD;KAEP,MAAOA,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQqB;;EACX;GACNosC,QACFwU,AAAAA,2BAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAH2B,WAAG,cAAGxU,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAQT;MAEZyM;ExBpOPvZ,OwBqOH;oBAFF;;ElH45CGz+B,oEAA8B;E0F/nD5By+B,OwBuOH;UAOJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAc,kBlHi5CTz+B,mEAA8B,+BkHh5CjC;MxB/OKy+B,SwBqPP,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgCwB,cACtBt/B,QACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,iH,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CAQW0/C,YAAU,MA9SsB7hC,SA8Sd,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CAClBtN,YAAoB,YAAO,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,CAExC3S,YAAgB,MAAGkG,SAAG,A,C;A,G,CACtBlG,WAAoB,eAAOkG,SAAI,A,C;A,G,C,CAENpG,WAAuB,MAAGyjD,SAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAA8C1wC,YAAgC0wC,QpGhP1IzwC,eoGgPkMywC,WAA0B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,e,C,G,C,C;A,G,C,CAC1MzjD,WAAsB,MAAG0jD,SAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAA6C3wC,YAA+B2wC,QpGjPtI1wC,eoGiP4L0wC,WAAyB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,c,C,G,C,C;A,G,C,CACnM1jD,WAAiB,MAAG2jD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAwC5wC,YAA0B4wC,QpGlPlH3wC,eoGkP8J2wC,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAChK3jD,WAAc,MAAG4jD,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqC7wC,YAAuB6wC,QpGnPtG5wC,eoGmP4I4wC,WAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAOvJ1jD,YAA+B,WApTdkG,oBAoTiC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,c,C,G,C,C;A,E,C,CAElDlG,YAAmC,gBAtTlBkG,qBAsT4C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,kB,C,G,C,C;A,E,C,CAK1EuP,WAEE,MAAOutC,AAAAA,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;;SAIE;MAAA,KADkBre,gBAClB,OAGEgf,OAFYC,KADd,eAIA,AACAC;SACAC;;EACoBnf;GACF,QAChBof,QAAkBC,aAEtB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBACEhB,OAAAA,AAAAA;0BAMF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;;EACoBre;EACAA,gBAClB;MAAA,QAAA,UAAA,MAEEngC,AADYo/C;yBAEd,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAxuC,YACE,MAAOtD,AAAAA,wBAAqBmyC,YAC9B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YAIEC,KAFmBC,mCAKrB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CASApxC;WAEI;EAEUrT;EACFsjD;EAAAA;GACF,QACN;EAGI;GACFxU,QACFwU,UAEF;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA5tC,kBACY4tC,AAAAA;GACF,QACN,MAAOxU,QAGT;MAAO6T,AAAAA,AAxZoCpiC,gBAUf/Z,0CAqZ9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,C,CAEyB4O,WAAuB,MAAGsvC,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCvxC,YAAgCuxC,QpG7V5HtxC,eoG6VwKsxC,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC1KC,WAA2B,MAAGC,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAA0CzxC,YAAoCyxC,QpG9VzIxxC,eoG8VuLwxC,WAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAE1LtkD,YAAgB,MAAGgiD,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BnvC,cAAyBmvC,QpGhWpGlvC,eoGgW0IkvC,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzIhiD,WAAkB,MAAGiiD,SAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCpvC,YAA2BovC,QpGjW5GnvC,eoGiWsJmvC,WAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACvJjiD,WAAoB,MAAGukD,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAmC1xC,YAA6B0xC,QpGlWpHzxC,eoGkWkKyxC,WAAqB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACrKp9C,WAAc,MAAGq9C,SAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAA6B3xC,YAAuB2xC,QpGnW/F1xC,eoGmWuI0xC,WAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,G,C,CAKvI/kD,WAAoB,MAAGglD,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAAuC5xC,YAA6B4xC,QpGxW3H3xC,eoGwW+K2xC,WAAwB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CACrLhlD,WAAoB,MAAGilD,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAAuC7xC,YAA6B6xC,QpGzW3H5xC,eoGyW+K4xC,WAAwB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CACrLjlD,WAAwB,MAAGklD,SAAkB,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,G,C,G,C,C;A,G,C,CAA2C9xC,YAAiC8xC,QpG1W3I7xC,eoG0WuM6xC,WAA4B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,iB,C,G,C,C;A,G,C,CACjNllD,WAAwB,MAAGmlD,SAAkB,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,G,C,G,C,C;A,G,C,CAA2C/xC,YAAiC+xC,QpG3W3I9xC,eoG2WuM8xC,WAA4B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,iB,C,G,C,C;A,G,C,CAEjN5kD,YAAuB,MAAG6kD,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,I,C,C,M,C,C,C,C,C;A,G,C,CAAsChyC,cAAgCgyC,QpG7WhI/xC,eoG6WoL+xC,WAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,E,C,CAEnN;;EACanlD,iBAd8G6kD;QpGlWpHzxC,eoGkWkKyxC;EAehK7kD,aAjBkGsiD;QpGhWpGlvC,eoGgW0IkvC;EAkBtItiD,aAjBwGuiD;QpGjW5GnvC,eoGiWsJmvC;KAmBzJ,MAEFC;UACA4C;;GACIplD,wBACAA,uBACAA,qBACF+S,AtGjNsB,oDsGkNtB;SAEQ/S,gBAjCuH0kD;QpG7V5HtxC,eoG6VwKsxC;GAkC5J,AAAb1kD,wBACMA,cA7B0F8kD;QpGnW/F1xC,eoGmWuI0xC,cA+BxH,AAAhB9kD,2BACSA,iBArCiI4kD;QpG9VzIxxC,eoG8VuLwxC,gBAA9CA,QpG9VzIxxC,eoG8VuLwxC;ElH4uCvLrhD,QAA8B,+BkHjsCnCvD;KAAAA;EAGAqlD;SAAAA;cAAkBC,4BAClBD;gBAAoBC,0BACpBD;aACAA;aAE0D,KADL,KADH,KAAhCC,6BACAA,iCACAA,sCACAA,yBAClBD;aAAiBC;EAEHtlD,KAAAA,wBA7CkH+kD;QpGxW3H3xC,eoGwW+K2xC;EA8CtK/kD,KAAAA,wBA7CkHglD;QpGzW3H5xC,eoGyW+K4xC;EA8ClKhlD,KAAAA,4BA7C8HilD;QpG1W3I7xC,eoG0WuM6xC;EA8C1LjlD,KAAAA,4BA7C8HklD;QpG3W3I9xC,eoG2WuM8xC;EAgD5LllD,sBA3K+H6jD;QpGhP1IzwC,eoGgPkMywC;EA4KxL7jD,qBA3K4H8jD;QpGjPtI1wC,eoGiP4L0wC;EA4KvL9jD;EpG7ZLoT,eoGkP8J2wC,QA2KzI,QA3K6FA;;EA4KhH,AA9K0CF,cA8KxB,AA7KuBC,cA6KN,MA3KiEE;QpGnPtG5wC,eoGmP4I4wC,WA4KnJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAWAuB,cAEEC,SACAC;;WAEE;GAEmB,KAAjBA,WAEF,MAGF;MAAOC,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAH;EAEcE;EAAUD;mCAAAA;QAAe;EAAzBC;;EAEDxB;EAECwB;EAAUD;mCAAAA;QAAe;EAAzBC;;;;EAIGA;EAAUD;mCAAAA;QAAe;EAAzBC;6BAAAA;GAEf;KAAkB,WACJC,UACZr1B;;EACAA;EAAyB4hB;6BAAAA,OAAzB5hB;KAAsB,IACxB,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,I,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CApLwB;6CAyakJs1B,KpGjsBnKvyC,YoGisB2OuyC,OAwBhPC;MACAC;MAhB0LC;KpG1sBrL1yC,YoG0sBiQ0yC,QAC5EC;KpG3sBrL3yC,YoG2sBiQ2yC,QAkBtQC;KAAAA,KACAC;KAAAA,KACAC;KAAAA,OAlcE,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAoBmB,yBASrBrE,AADgBsE;mBACIA,eAPpB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAiC0C;;EAC5B;GACNrX,QACFwU,AAAAA,2BAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAH2B,WAAG,cAAGxU,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAkDb,yBAClBwW;WAASc,cAAiBA,eAC5B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,+B,C;A,G,CAwEJhmD,WACE,MAAqB,MAAbiiD,kBACa,KAAbA,qBACa,KAAbA,mBACV,A,C;A,G,CACAjiD,WAAmB,MAAGimD,YAAQ,A,C;A,E,C,CAI9B/lD,YAAkB,M3F1YGoO,M2F0YAO,SAAe,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAOpC,yBACEuzC;QAAU;EAKVvzC,OAAAA;OACAA;;E3F7cwCA;EAAAA,kB2F9DiEqzC;QAAUhtC,eAA4BgtC;E3F8DvGrzC,a2F7DyEszC;QAAYjtC,kBAA8BitC,UAggB3J6C;OApiB2C7kC,SAmjB7C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,cAAuB,MAAGtR,AAAAA,iBAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAC5C,YAAa,MAAGA,AAAAA,eAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAC5B7O,YAAsB,M3F3d2B6O,AAAAA,A2F2dxBA,kBAAqB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAC9C7O,YAAoB,M3F1dyB6O,AAAAA,A2F0dtBA,kBAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAC1C,cAAyB,M3FtaeA,AAAAA,A2FsaZA,oBAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE3C,cAAiB,MAAGA,AAAAA,iBAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACpClI,cAAe,M3F5d2BkI,AAAAA,A2F4dxBA,mBAAO,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACzBlI,gBAAsBkI,AAAAA,gBAAH;SAAc,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CACjC7O,kB3Fxe8B6O,A2FweVA,UAAH;M3FxeaA,a2FweE,A,C;A,G,CAChC7O,kB3Fze8B6O,A2FyePA,UAAH;M3FregB,AAJNA,a2FyeQ,A,C;A,G,CACtCpO,kB3F9eqCoO,A2F8ehBA,UAAH;M3F9emBA,U2F8eP,A,C;A,G,CAC9BpO,kB3F7euCoO,A2F6ehBA,UAAH;M3F7emBA,U2F6eL,A,C;A,E,CAClClP,kB3F5e8BkP,A2F4eZA,UAAH;M3F5eeA,S2F4eD,A,C;A,E,C,CAG7B7O,kBAAyB6O,OAAH;MAAGA,SAAqB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAC9C,oBAA0CA,OAAH;MAAGA,WAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CACnEqG,kBAAqE,MpGpgB9DlC,MoGqgBHnE,eAAoD,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CACxD,YAAgB,OAAkB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAClC,YpG1iBE28B,AoG0iBmB38B,eAAH;OAAoB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,G,CACtC0Y,kBAA0C1Y,OAAH;MAAGA,UAAY,A,C;A,G,CACtD7O;EpG3hByBwrC,AoG2hBA38B;GpG3hBS,W4B+FHsU;EA1BP,+BwEsdF;SAAoB,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,I,C,I,C,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,I,C,I,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,yC,C;A,G,C,CAMjBjjB,YAAgB,MAAGgmD,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BnzC,cAAyBmzC,QpG/gBpGlzC,eoG+gB0IkzC,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzIhmD,YAAmB,MAAGimD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAkCpzC,cAA4BozC,QpGhhBhHnzC,eoGghB4JmzC,WAAoB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAEvL,uBACE/D;;;EACOxiD,aALkGsmD;QpG/gBpGlzC,eoG+gB0IkzC;EAMrItmD,gBAL2GumD;QpGhhBhHnzC,eoGghB4JmzC;sBADvHD;EAhjByEhxC,kBAA4BgtC,UAAtCA;SACQC;QAAYjtC,kBAA8BitC,WAwjB7J,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,mB,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CAcyBlvC,YAA0B,MAAGk2B,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAyCp2B,cAAmCo2B,QpGtiBrIn2B,eoGsiBiLm2B,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CACnLjpC,YAAgB,MAAGgmD,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BnzC,cAAyBmzC,QpGviBpGlzC,eoGuiB0IkzC,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,CAElKlmD,WAAkB,SAAO,A,C;A,G,CACzBA,WAAmB,SAAO,A,C;A,E,C,CAO1B;;EACSJ,aAXkGsmD;QpGviBpGlzC,eoGuiB0IkzC;EAYxItmD,aAAPwmD;;;EACYA,OAAqC,KAAtBA,eAA3BC;SArlByGnE;QAAUhtC,kBAA4BgtC;EAulBtIkE,OAtlBwGjE;QAAYjtC,kBAA8BitC,UAulB3JmE;QAAe1mD,iBACjB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;GACM,CAACwiD,QAEHmE;;EAOAC;;GAJF;YAAoBC;6BAAAA;KAAF,UAIhBD;MAHWC,SACDA,MAAa;KAGzB,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,yBAEErE;;WAEE;EAEgBt5C;GACd49C,aACF,MAGFtE;;EACAuE;SAAAA;OACAh0C,AtG3awB;sBsG2aG+zC,kCAAuCN,SAClE;QAAkB,EAAEM,gBACS,GAA3BC;iBAAgCD,OAClC,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,kC,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,C;A,E,C,CAyBaxmD;EACP0mD;;GAAQ,SACV,QAEF;WAAYA,WACd,A,C,Q,C,K,C,C,C,C,C,G,C,kB,C,G,C,C;A,E,C,CAEa1mD;WAET;EAESwE,KAAAA,QAAkBkiD;WAE3B;GAGsB,KAApBC,QAAuBA,SACzB,QAGF;MADYrf,MAAcqf,QAAqBniD,kBAC7BmiD,aACpB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,oB,C,G,C,C;A,E,C,CAEa3mD;WAET;EAESwE,KAAAA,QAAkBkiD;WAE3B,QAGF;MADYpf,MAAcqf,QAAqBniD,kBAC7BmiD,aACpB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,oB,C,G,C,C;A,K,C,I,C;A,M,C,C,E,C,CAxCAzkD,cAEE,MAAUqlC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,G,C,C;A,G,C,M,C;A,E,C,CA2CAvnC,YAAkB,MAAK+rC,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,mB,C,E,C,CAE9B7pC;GACQ,gBACJ;QACW,cACX;QACW,mBACX;QACW,gBACX;QACW,aACX,WAEFuQ,AtG7fwB;;KsG8flB,KAAA,QACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,4H,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CAuByBm0C,YAAkB,MAAGZ,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAiCnzC,cAA2BmzC,QpGhsB1GlzC,eoGgsBgJkzC,WAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC/IvmD,WAA8B,MAAG4lD,SAAwB,A,C,I,C,I,C,C,C,C,C,G,C,uB,C,G,C,G,C,C;A,G,C,CAAiDxyC,YAAuCwyC,QpGjsBnKvyC,eoGisB2OuyC,WAAkC,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,uB,C,G,C,C;A,G,C,CAS3PrlD,WAAmC,MAAGwlD,SAA0B,A,C,I,C,I,C,C,C,C,C,G,C,yB,C,G,C,G,C,C;A,G,C,CAAuD3yC,YAA4C2yC,QpG1sBrL1yC,eoG0sBiQ0yC,WAAoC,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,yB,C,G,C,C;A,G,C,CACnRxlD,WAAmC,MAAGylD,SAA0B,A,C,I,C,I,C,C,C,C,C,G,C,yB,C,G,C,G,C,C;A,G,C,CAAuD5yC,YAA4C4yC,QpG3sBrL3yC,eoG2sBiQ2yC,WAAoC,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,yB,C,G,C,C;A,I,C,CACnR3wC,WAA0B,MAAG+xC,SAAa,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,G,C,C;A,I,C,CAAyCh0C,YAAmCg0C,QpG5sBxI/zC,eoG4sB0L+zC,WAAuB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Y,C,G,C,C;A,G,C,CAC/L/xC,YAAwB,MAAGytB,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAuC1vB,cAAiC0vB,QpG7sBhIzvB,eoG6sB8KyvB,WAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,CAI1MziC,WAAkB,SAAO,A,C;A,G,CACzBA,WAAmB,SAAO,A,C;A,E,C,CAkB1BsV,eAEW,KAtCmC4wC,cAwC1C,wCAEF;MlFjpBO,iBkFkpBT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;;;GAIE;YAAoBp8C;6BAAAA;KAAF;E3G3tBX7J,K2G4tBiB6J;E3G5tBjB7J,K2G6tBiB6J,MAAO;yCAG7Bk9C;eAA4BC;KAC9B,AAEAD,mBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQA,uBAjE0KzB;QpGjsBnKvyC,eoGisB2OuyC;SAyEhPE;Q3GpvBOxlD,K2GovBoBinD,mCAC3B1B;Q3GrvBOvlD,K2GqvBoBinD,mCAC3BC;QAAcvB,QAASsB,mBACvBC;QAActB,QAASqB;EACXA;GACF,QACRE;EAGK5f,KAAcie,QAlFmCF,kBAmFjDE,YA1EmLC;QpG1sBrL1yC,eoG0sBiQ0yC;EA4E/Ple,KAAcge,QArFmCD,kBAsFjDC,YA5EmLG;QpG3sBrL3yC,eoG2sBiQ2yC,WA6ExQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;SACE58C;QAAOqjB,kBACPi7B;QAASj7B;EACF06B,KAAoB16B,cA7FoF85B;QpGhsB1GlzC,eoGgsBgJkzC,UA8FrJoB;Q3GxwBOrnD,K2GwwBkBmsB,uBACzBm7B;Q3GzwBOtnD,K2GywBgBmsB;EA51BWjM;EAAAA;EA61BvB7d,KAAmB8pB,kBAnFuGqW;QpG7sBhIzvB,eoG6sB8KyvB;EAoFtKngC,KAAmB8pB,qBArF6G26B;QpG5sBxI/zC,eoG4sB0L+zC;EAsF7K36B;GACF,QACdo7B;EAGSC;SAAXrF;SAA+B,KAApBqF,YAAmC,CAAA,KAvGFvB;EAwGN,CAAA,KAApBuB,YAAmC,KAxGTvB,aA2GuGwB;QpG3yB9I10C,eoG2yBwM00C,WAF/M,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,CAEyB1nD,WAAwB,MAAG0nD,SAAiB,A,C,I,C,I,C,C,C,C,C,G,C,gB,C,G,C,G,C,C;A,G,C,CAA+C30C,YAAiC20C,QpG3yB9I10C,eoG2yBwM00C,WAA2B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,gB,C,G,C,C;A,E,C,CAE1O;EAEED;SAAAA;;;GAEA;YAAoBE;6BAAAA;KAAF;EAEFA,MAAc;EAChBA,MAAc;EACP,CAAA,KAAfA,a3G/xBC1nD,K2GiyBiB0nD,qBAGtBF;;KACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;;EAQI3B;;GALF;YAAoB8B;6BAAAA;KAAF;E3G3yBX3nD,K2G4yBmB2nD,iBAIxB9B;mB3GhzBK7lD,K2G6yBqB2nD,MAAe,gB3G7yBpC3nD,K2G8yBqB2nD,MAAe;KAG3C,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA5nD,cACkB,OAAGsnD,QAAnB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA3nD,WAAsB,MAAGkoD,SAAcjC,SAAQ,A,C,Q,C,M,C,C,C,C,C,I,C,C;A,E,C,CAE/CjmD,YAA4B,MAAGmoD,SAAWlC,WAAc,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMxDjmD,qBAEE;MAAA,YAAA,UACSooD,AADT;6BACSA;KACT,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEApoD,qBACE;MAAA,QAAA,UAAA;GACkB,KAAZooD,WACF,MAAOA,SAEX,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,C,CA1GA3lD,cAEE,MAAUqlC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAPa,cAAO,MAAW,MAARrmC,QAAUJ,SAAEgnD,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAyIvB;;;MACkBC,QAC1BroD,aAASua;iDAET2nC;UAEAD,eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,gB,wC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,qD,C;A,E,C,CDx7BAvsC,cACE3C,ArGuNwB,wCqGvNauiB,QACrC;MAAOgzB,AAAAA,MAA2B,KAALhzB,qCAY/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA1BAizB,WAIIjzB,sBAAiBjhB,KAAAA,uBAMrB,A,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAIqD,YAEjDtB,ArGoNsB,4CqGnNtB;MAAOwoC,SjHmnDJh4C,2LAA8B,iCiH3mDnC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uD,C;A,E,C,CAaF;;EACWL,KAAAA;EACEA,KAAAA;EACAA,KAAAA;GACF,CAAA,0BACP;EAEcslD;EAAAA,QAEhBA;SACA/vB;UACF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEA/iB;KACmB+yC;EjHglDZllD,QAA8B,+BiH9kDnCwB;aACAA;kCACAA;yBACA0jD;QAAc,AAAdA;gBjEhEwB,mBiEkExBD,AAAAA;gBACAn0C;KhG252BuBmoB,KAA4B,egG352BzB+e,eAC1B;MAAO9iB,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA7BAiwB,iBhG2q4BsCC,eAw9GpC10C;gBA/EI,KAAc,KA8EcC,KgGjo/BR00C,YhGmj/BmB,uBgGlj/B3C71C,ArGiMwB;sCqGhM1B,A,C,C,A,E,+B,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C4B1CwBM,YAAyB,MAAGw1C,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAwC11C,cAAkC01C,KAAYvzC,eAA8BuzC,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,E,C,CAIpMld;OACatgC,AALuCw9C,sC5H+pShDxvB,yB4HtpSE5K;OAT8Co6B,KAU9C;;uB5HqpSFxvB,4B4HlpSE5K;OAb8Co6B,KAc9C;;c5HipSFxvB,uB4H9oSE5K;OAjB8Co6B,KAkB9C;;a5H6oSFxvB,sB4H1oSE5K;OArB8Co6B,KAsB9C;;c5HyoSFxvB,uB4HtoSE5K;OAzB8Co6B,KA0B9C;;c5HqoSFxvB,uB4HloSE5K;OA7B8Co6B,KA8B9C;;iB5HioSFxvB,0B4H9nSE5K;OAjC8Co6B,KAkC9C;;gB5H6nSFxvB,qB4H1nSE5K;OArC8Co6B,KAsC9C;;oH5HynSFxvB,0B4H/mSE5K;OAhD8Co6B,KAiD9C;;gB5H8mSFxvB,yB4H3mSE5K;OApD8Co6B,KAqD9C;;gB5H0mSFxvB,yB4HvmSE5K;OAxD8Co6B,KAyD9C;;gB5HsmSFxvB,4B4HnmSE5K;OA5D8Co6B,KA6D9C;;e5HkmSFxvB,wB4H/lSE5K;OAhE8Co6B,KAiE9C;;mB5H8lSFxvB,wB4H3lSE5K;OApE8Co6B,KAqE9C;;W5H0lSFxvB,oB4HvlSE5K;OAxE8Co6B,KAyE9C;;QAEA,QAEN,A,C,Q,C,K,C,C,C,C,C,G,C,4B,C,C;A,E,C,CAEAC,uB5H0lQE7rB;;E4HzqQkD4rB;YAmFhD91C,AjIuJsB,mCiItJtB;SAES1H;EACG09C;YAEZh2C,AjIiJsB,6DiIhJtB;O5H4/PFkqB,gB4Hz/PAlqB,AjI6IwB;8CiI5I1B,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,e,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CA5FAi2C;;EvHuFqB;;;gBC5CI;;;;;;SsH3C2B,A,C,I,C,I,C,C,C,C,C,G,C,sC,C,C,C,C;A,2B,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,4D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C/CL5B31C,YAAsB,MAAGmvB,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAqCrvB,cAA+BqvB,KAASltB,eAA2BktB,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CACvJpiC,YAAkB,MAAG6oD,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyC91C,cAA2B81C,KAAc3zC,eAAgC2zC,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAG/L,cACE3zC,kBAA+B4zC,YAC/B5zC;kBAAgCnM,YAChCmM;kBAAqC6zC,aACvC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,G,C,CAEA7oD,kBAViDkiC;WAY7C,gBAEF;MAAO0E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,K,C,C;A,G,C,CAEA5mC,kBAjBiDkiC;WAmB7C,gBAEF;MAAO0E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAEA5mC,kBAxBiDkiC;WA0B7C,gBAEF;MAAO0E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAEA5mC,kBA/BiDkiC;WAiC7C,gBAEF;MAAO0E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAlCAkiB;;ExE0FqB;;;gBC5CI;;;;;;;SuE9CoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,4B,yD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CgDFrBhpD,YAAiB,MAAGipD,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAgCl2C,cAA0Bk2C,KAAa/zC,eAA+B+zC,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CACxJ/oD,YAAuB,MAAGgpD,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAAsCn2C,cAAgCm2C,KAAiBh0C,eAAmCg0C,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CAC1LhpD,YAAyB,MAAGipD,MAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAAwCp2C,cAAkCo2C,KAAmBj0C,eAAqCi0C,QAA0B,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAEhO,wBAEYC,KADmBpmB,kEALiFimB;KAAa/zC,eAA+B+zC,QAO5J,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,Q,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CARAI;;ExH6FqB;;;gBC5CI;;;;;;SuHjDyB,A,C,I,C,I,C,C,C,C,C,G,C,oC,C,C,C,C;A,yB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCA1B9E,YAAwB,MAAG+E,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAuCv2C,cAAiCu2C,KAAWp0C,eAA6Bo0C,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAC7LC;;EzH4FqB;;;gBC5CI;;;;;;SwHhDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCArBv0C,YAAqB,MAAGw0C,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAoCz2C,cAA8By2C,KAAWt0C,eAA6Bs0C,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAIpL,cACEC,AAAAA,KAL8CD,YAMhD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAE;;E1H0FqB;;;gBC5CI;;;;;;SyH9CoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CC4B7CtnD;4CACgC,MhI8wWI44B;OgI7wW1B3M,yBAEJ,MAAOs7B;mDAIP,MAAOt7B;QAEP,MAAOA,WAEb,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CCnCFu7B;EAGiBC;;+CrB8HZxuC,wB5Gq98BMwhB,AAAAA,A4Gl+8B6BxhB,2CACpCyuC,QAAoCzuC;;;UqB3GtC;MAAa4U,oBAAmB,UAAa+Z,qBAC5B+f;;aAGkB,8BACjCjwB;WACF,6BAEiE,MAEjE;yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;WAEmB;GAEG,AAAhBl6B,iBACmCA,OCwKnCoqD,AtBrIFtW;;GqBlCa,QACXsW,ArBiCFtW;GqB7Be,AAAb9zC,eACFqqD,KAAiBrqD;GAGfA,eAAsB;EAQF,AAAhBA,QjIwzmBUi8B,AAAAA,mBiIvzmBlB;MAAa5L,aAAmB,UAAa+Z,sBACrC,YACNkgB;OAAmBtqD,KAAAA,mBACrB,CACF,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CC+WAuqD,iBACE;eAAuB,AAAhBl6B,kBACEA,QACT;gIAKE,QAEF;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CC7aArvB;;4CAEI,MAAOwpD;+CAIMC,KAAgBp6B;GAClB,QAAS,iBAGtB,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAcArvB;;;;MAMEytB;gCAFqBqtB;QA8BN;;;IAEbnD,cAAAA;OACU8R,yBAGZ,WACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,yDAGE;gBA2CY,gEA3CM,EAAE9R,gBACPA;EACEA,MAAW;EAEN+R;qBAAAA;EAAAA;GACdA,WACeA;qBAAAA;EAAAA;GACF,WACSC;GACF;;GAMlB,CAACD,WACY,SACGA;;qBAIkCA,wBACtD;QAAkB,EAAEA,AAAAA,uBAEJA;qBAAAA;EAAAA;EACGA;EAAgB;qBAAhBA;EAAAA;EACgB,QAC7BC;GAEgB;;GhC7DpBre,0DAIJF;OAAe,gBgC+Db,AAEAK;;YAKY0N,SvB1C0BrG;KuB2CrB8W,UACrB,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAOAC;ErJ6HsBlqD;SqJ3HL,MAKf;mCAAiB,QACFoY;EACS,OAAWA,eAA2B;GAE/C,gBACS,MAEpB2xC;OAAW3xC;qBAKb2xC;OAAW3xC;EACMA,QAAAA,UAAuB,OACxC2xC;;;KAEII;E9Hq6BF9Z,uC8Hp6BF0Z;EAEqB,IACvB,SAEyBA;;OAEzB;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAyCA;EACMr0B;WACF;aAIuBA,cAGzB;KAAY,UACVyd,AAAAA;EACOzjB,cACT,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CvBzHA06B;QACkBC;;EtHtCD3qD;eACoBA,OAA+B00B;GsHsCpD,QAAS;;;;;qDAuCpBtZ,wB5Gq98BMwhB,AAAAA,A4Gl+8B6BxhB,2CACpCyuC,QAAoCzuC;;sLANtCuvC;UACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeA5qD;+CACKqb,wB5Gq98BMwhB,AAAAA,A4Gl+8B6BxhB,2CACpCyuC,QAAoCzuC;;SAWR;SAC0B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CwB1IxD88B,+BACErnC;KAAAA;EAGIwpC;;4CAA+B;EAGhCA;qBAAD;UAAA;;EACkCA;EvB+BpB;;mBmBvChBuQ;KAAYC,AAAAA,WAAoCC;EIuB7BhiD;MAEjBknB,AAAAA;EACOlnB,SAA8B,KAAZA;EvBaX;;cuB3BTwvC,AAAAA,uBAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAkBA/e,WAAiB,oCAAa,A,C;A,E,C,CAE9B;GACMwxB,WD3BuB,SAAkB;EC6BzBj/C;KpImk9BpB8wB,AAAAA,AoInk9BI5M;KAEAA,AAAAA,kDAKFA;mBpI4j9BF4M,AAAAA;kBoI5j9BkB9wB,YAEpB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAMAsxB,WAAuB,oCAAa,A,C;A,E,C,CAEpC;EAGepN;;+CAEQ8pB,KAAAA,KxBsBmBrG;;+CwBnBzBuX;;;;GAMG,SAAW,AvBtCZ3Q,euBuCA,CAAA,KAAb2Q,WACFC,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CJhEA,enBsBmB5Q,cmBrBL,MACZuQ,AAAAA;;kCAEF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEuD;EAItCM,AhI0mPR7yB,+CgI1mPmB;SAC1B8yB;;;EAEAA,QhI2p/BAv3C;gBA/EI,KAAc,KA8EcC,mBA9EW;EgIzk/B3Cs3C,QhIwp/BAv3C;gBA/EI,KAAc,KA8EcC,mBA9EW;;EA/ja/B6C,kCACZvR;oDgIxglBAgmD;kBAGA;MAAOC,mBAA0CA,YACnD,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,U,C;A,M,C,CAV0B,YACtBA,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,U,C;A,M,C,CACyB,YACvBA,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAyBFr5C,WAAS,oCAAa,A,C;A,E,C,CAEtB,kBAEEie,SAAAA;0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,kBACUA,KAAAA,UnBvBRyqB;KAAAA,URA0BxN;O2ByB5B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAMAoe,WAAsB,oCAAa,A,C;A,E,C,CAEnC,8CACEr7B;OG9D2B,SAAkB,QH+D/C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EACUA,kCnBtCRyqB;KAAAA;;;6CmB2CsC,KAAVzqB,4CAC1B,MAAA,KAAcs7B,oCAAd,UAAA;;EACuBxR,KAAAA,gDpBAerG;GoBCjB,QAEjB8X,WAEJ,A3BlDwBte,O2BsD5B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,M,C,C,E,C,CAWA9qC;;GACmB,AAAbisB,kBACKA,QAAAA;;aAAP;MAAOA,4BAOS87B;WACO;EAEVsB,2CACoBp9B,gBACjC;MAAOq9B,sBAEX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAdoC;;;GACpB,CAAA,wDAEN7kB,oBACAA;EAAWxY;;;SAHf;SAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAOoB,wBAAK;MAAM,CAAA,eAAcwY,eAAW,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,4B,C;A,E,CAW5D8kB,WAAuB,oCAAa,A,C;A,E,C,CAEpC,iBACEC;;GAEIC,gBAA2B;2FhIgqlB3BrjD,KAAuB0wB,wBgIpplBb;6CAAd4yB;UAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA9rD;EACM+L;;GAAS,0BACIggD,OACf97B;;EACOA,kCAAP;qCACkB,8CAClBA;yBACA;MAAkB,MAAXA,uCAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBACM67B;GAAY,SACdA,cACAA;cAEJ,A,C,Q,C,M,C,C,C,C,C,I,C,C;A,E,C,CAEA,mBACEF;;EAEI7/C;;GAAS,0BACHkkB,kCnBtIVyqB;KAAAA,mBmBuIoB,kBACVzqB,kCnBxIVyqB;KAAAA,YmB0IF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,C,CAMAt4C,mCACuB,M1IzFdnC,wB0I0FP;kDACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAxCqC;GAC7B4rD,KnB/GKnR,KAAAA,YmB+GmBkR,OAC9B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAoCsD,YAAI,SAAG,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,CKpL/DN,WAAuB,eAAc,A,C;A,E,C,CAErCnT;;GACW,CAAA,gBAAmB,CAAA,iBAC1B;ECqC2BmC;QDlC7BxpC;uDACAwpC,AAAAA;;EACO/B;GAAsB;ExB8Bb;;mBmBvChBsS;KAAYC,AAAAA,WAAoCC;;EnBuChC;;qBmBvChBF;KAAYC,AAAAA,WAAoCC;IKSzCxS,UAAP;SAGF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,c,C;A,E,C,CCJAJ;;;0EACElkC;;gDAEF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA;GACM+3C,cAAmB;EACTzT,AAAAA;GACF,QAAS0T,QACvB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGA;GACMD,cAAmB,MACvB;MAAoBzT,iBAAAA,WpGmPlB,2CvD+BkCr3C,8B2JlRpC,U3JoRekI;G2JnRD,QAAS6iD,QACvB,AACAD,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAIA3kD,kBACM2kD;cAA+B,6BAAZA;UACvB,SACF,A,C;A,G,CAOArB;EAA+BrQ;QAAH;uDAA4C,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,a,C;A,G,CCzCxEqR,WAAwB,eAAc,A,C;A,E,C,CAEtCxT;GACW;;GACA,CAAA,wBAA2B,CAAA,eAClC;EDoC2BmC;QCjC7BxpC;uDACAwpC,AAAAA;;EACO/B;;E1B6BS;;amBvChBsS;KAAYC,AAAAA,WAAoCC,QOUzCxS;UAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,8C,C;A,G,CLIA/e,WAAkB,eAAc,A,C;A,G,CAEhC0yB;;QAAgC;6DACd,A,C;A,E,C,CAElB/T;EACc;EAERjgC;wGAGFA;+BAOEA,OAAAA;MAAAA;MAGAi0C;;sBACO5T,AAAAA;uBAAP;;aAEArgC,OAAAA;MAAAA;MAGAi0C;;sBACO5T,AAAAA;uBAAP;;SAEArgC,OAAAA;MAAAA;MAGAi0C;;sBACO5T,AAAAA;uBAAP;;QAEA,gDAEN,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;uBAGUrgC;WAAmB,MACvBA;OAAAA;SAAAA;SAGAi0C;SACA5T,AAAAA;sBACA;;eAEIrgC;WAAmB,MACvBA;OAAAA;SAAAA;SAGAi0C;SACA5T,AAAAA;sBACA;;WAEIrgC;WAAmB,MACvBA;OAAAA;SAAAA;SAGAi0C;SACA5T,AAAAA;sBACA;;2CAGA;QAEN,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,iBACOrgC;GAAD,CAACA,MACHA,OACAgR;KAAkBhR,UAEtB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMAqhB;EAEyB;;6CtBpBiBma;EsBqB1B5M;EAGJA;cAIFijB,SACNjjB;WAoKEslB;cACU9R;;EACF+R;cAEFlyC,AAAAA,uCACNkyC;WAEFD;MAvKaE,SAEfpC;eAIAqC;SACA;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CAwBAC,WAAoC,MAAGC,SAAgB,A,C;A,G,CAoBvDjzB,yBACEkzB;;ElI678BO7vB,AAAAA,AkI178BKyd;GACF,WACQ6P;EACF,QACHsB;cAKFkB;WACW;EAGRlZ,gDtBtG0BC,QsBuGxC;MAAe,aACjB,A,C;A,G,CAKAna,iBACEmzB;;EACOE,OAAP;MAAgB,WAAqB,8BACvC,A,C;A,E,C,CAeA5sD;GAEM6sD,aAA8B,QAElCC;MAGAD;;;;;EAGmB;;;ElIs48BZhwB,AAAAA,A4Gl+8B6BxhB,2CACpCyuC,QAAoCzuC;SsB+FlB;EAMZ0xC;;6CtBnJkCrZ,OsBoJtCsZ;;EACWA;;;;QAIT,GAEFA,MAA8BC,KADpBC,KAAkCF;GAI9B,QAGdA;UAEAG;KAEAC,KAAUJ,QAGZ;SACF,A,C,Q,C,C,C,M,C,I,C,E,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,a,C,E,C,CAtHA5qD;EACcirD;;+CtBMXhyC,wB5Gq98BMwhB,AAAAA,A4Gl+8B6BxhB,2CACpCyuC,QAAoCzuC;;;KsBOL,QAE/B;MAAa4U,QAAmB,UAAa+Z,cAC3CsjB,cAAahB,UACf,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CAoHAlqD;EACYmrD;GlIivNanxB,KAA4B,qBkIhvN3B;EAEhBoxB;cAIFP,AAAAA,uCACJ;OAAOQ,YAAY,YlIkpmBjB;GAAgB,QAElB7xB,iBkIlpmBA,AACA4xB,gBAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CA4BAprD;;ElIi1OSk2B,AkIh1OQuO,uCACfA,AAAAA;0BAEA;MAAiBA,WAAAA,QAAAA,4BvJLmB3lC,8BuJKpC,UvJHekI;2BqBg08BAyzB,AkI1z8BTgK,WlI0z8BShK;iBACfA;;;kCkItz8BM0wB;ElIqz8BS1wB,AkIrz8BmBgK;ElIqz8BnBhK,iBACfA;oBALAA;;;UkI9y8BA,AAEA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEAz6B;EAGgBmrD;MAEZ5X,SACA;OAIF,0BAAgB9O,SAAe,SAC7B8O,SACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CAUAvzC;;EAWM;GACAs5C,QACFgS,WAGFC;UACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAUAvrD,wBAC2B,MACzBwrD;;MlIywOOt1B,oCkIvwOK;oCAEZ3hB,AlI8ibsBvS;6BkI7ibxB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAjCE;GACM,CA1IJ4lD,AtBrIFtW,0BsBgRI0Z;KAAU3Z,gDtBxQ0BC,WsB0QxC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgBmC,YAAI,2BAAM,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CA0B/Cja,iBAAiBo0B,OAAAA;UAAH;YAAa,A,C;A,E,CAM3B77C,YAAU,MAAG0oC,MAAAA,YAAe,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,CAE5B3nC,cACE2nC,KAAAA,cACF,A,C;A,G,CAGA1oC;EACO87C;;yFACI,KAALp4B,iBACF,MAAOo4B,QAET;MAAO,MAAiBA,QAAQp4B,cAClC,A,C;A,E,C,CAQA,kBAvBmBm4B;WAwBL,MAIZA;OAAY9hD,QAEZ+hD;YACAD;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CChY2B,yBAMzB;eAAe,KAAR9kD,iBACEA,SACT;aAGW;2BAGO,eAAkB;qBAMvBshD;GACF;;;;YAET9R;SAAAA;WAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,G,CAsGAv4C,WAAoB,MAAGsqD,AAAAA,oBAAkB,A,C;A,G,CACzCtqD;EADuBsqD;EAAAA;wBAAAA;GAC0B,KAAVA,+BADhBA;EAC6C,KAAVA,4BAApC;SAAmD,A,C;A,G,CASzEltC,WAAwB,MAAG2wC,SAAW,A,C;A,E,C,CAWtC7tD;;EAEYoqD;qBAAAA;MAAAA;qBAAAA,SAAV;aAA4BA,MAC9B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEApqD;EACkCoqD;qBAAAA;EAAjB,KAAiBA,KAChC;kBAAkB,EAAEA,iBACNniD,MAAe,QAAL;GACZ,uC7IwDZwE;KAA6CA,S6IvDnB;qBAJM29C;EAIfA;8B7IuDjB39C;KAA6CA,O6ItD7C,AAEA,M7I+DyBA,M6I9D3B,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,CAvBA89C,YAIEsD,QAhBqBzD,AAAAA,mBAgBM0D,WAAoBC,WACjD,A,C,C;A,E,C,C;A,G,C,4D,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA8DAC,0BACEC;;EAEIC;GAAU,SACZA,MACAA;eAGGC;GAAD,IAAc,CAACC,SACjBC,aACA;WAGwBC,QAAcC;IACfC,QAAaC;GAGlC,CAACC,UACa;;iDhCpNlB5iB;OAAe;EgCqOC6iB;EAASC,OhCrOzB9iB;OAAe,egCmOG;QAMlBoiB,QAAYW,AAAAA,2BAEZR;QAAcQ,SAChB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA;EACiBC,OACfC;;;wEAGED;iFAKgB,OAAhBA;eAEAA;UAGgB,kDAChBE,QAAWnjB,AAAAA,WAA4BojB;EAI5B;EACTH;EAAc;E5BpChBvgB,SAAyB1C,YAA8BD;G7HyCpC,AAFHvrC,ayJDM4uD,WAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA11B;;GACY,UAAO,MAzEa21B;EA0EbC;EAAkB;gCAAlBA;EAAAA;GACZ3T,WA3EyB0T;;KA6E5B;EAGYpF,AvB5PdtW;WuB6PqB,QAErB;MAAO4b,MAAwD,AAAL,QAA3BA,AAAAA,kBACjC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAIA;;EAG2BC,QAAsB;EAElC;OACEt5B;OACU,SAAWu5B,QACrBA;;EAIa,QzJjP5BhvD;KyJiPA6uD;EACaI,KArGiBL;EAsGPM;KAGrBxlC;QACuB,QACvB,MAAA,QAAA,OACEA,eADF,SAEA,CAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAylC;;;;EAE2BJ,QAAsB;EAC9BA;EACLF;EAAsB,KAAJ;gCAAlBA;EAAAA,IACZA;UAA8B,SAAe,KAAJ,YAE5BI;KAxHiBL,WAyH9B;cAAkB,CAAA,cACLM;;EnI4imBT;GAAgB,QAElB9zB,gBmI3imBA4zB;UACF,AACA,qBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;GACMI,QAAQ;EAnIkBR;;;;EAsIbA;;GAEb7B,gBnIqnNmBnxB,KAA4B,AmIrnNhBmxB,6BACjC7uB,UACA;UAKE,CAACmxB,SACHA;GACa,SACXC,QAAmBpF,OACnBqF;gBAKgB,+BAEpB;gBAAA,YAAA,UAAA,MACE;MAAkBliB,UAAlB,kBAAA,OACEmiB,MxJrGW5mD,KwJqGY6mD,QAA+B,KAAbpiB,aAC3C;EAEeA;6BAAAA;KACjB,AAEA,MAAA,QAAA,UAAA,MACE;gBAAoBA,mBACP,MAAe,KAAbA,SAAeA,YAClB,YAEEmhB,KAAAA;EAEGgB;GAGF,SAAW7oB,KAAAA;EACdA;EACQA;;GAGK,AAAjB2oB,gBACMA;EAEA,QACGV;OAIfc,iBACF,CACF,AAEA,MAAqBF,8BxJtG8Bv4C,KAAAA,MAAoBO,6BwJsGvE,OACEm4C,QAAsBhpB,KxJpET/9B,MwJqEf,CAGF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CA+CA,iBACE;MAAA,QAAA,OAA2B6iD,KAA3B,OAA0C,CAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBACMiD;WAAkB,MACtBA;MACAA;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;GACMU,QAAQ,MAEZX;SACA;MAAoBI,YAAF,EAAEA,cAClBc,QAAsBd,KACxB,AzJ5VA9uD;;EyJ+VI6tD;GAAU,SACZA,MACAA;aAEFgB,AAAAA,eACAQ;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CArPyC,YAAI,UAAK,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAO9CQ;;EACmBjoD;EACHA;GACV,EA5QmB,SAAkB,QA4Qf,MAC1B;oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASE,YAAI,MAAGomD,WAAc8B,KAAAA,UAAe,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CK9R1ClY;GAEW,CAAA,eACP,8CAEFmY;;EACO/X;EAAkC+B;E3BiCzB;;kB2BjCT/B;UAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,CAMA,kB3BUiB+B,O2BTfrqB;0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,G,CCfAsgC,WAA0B,eAAc,A,C;A,E,C,CAExCpY;GACW,CAAA,gBAAY;EHsCQmC;QGpC7BxpC;uDACAwpC,AAAAA;;EACO/B;;E5BgCS;;mBmBvChBsS;KAAYC,AAAAA,WAAoCC,QSOzCxS;UAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C,A,E,yC,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C,C,A,E,qC,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,O,C;A,E,C5BeA9e,WAAc,MAAG6gB,SAAK,A,C;A,E,CAStBtoC,YAAU,MAAG0oC,MAAAA,SAAe,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,CAE5B3nC,cACE2nC,KAAAA,WACF,A,C;A,E,C,CAoCA;GA3CmBJ,cA4CL;EAERkW;GAAS,QAASA,MACtBA;YACA9V;YACAJ;YACAwT;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CA1CA3V;EAZa2V;;wFAiBF;EAjBEA;MAmBTpT;WAGY,OAAwB,aAApCA;UAGF8V,QAAW9V,AAAAA,0BACX+V;QApBW/V,KAAAA,UAqBb,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAFsC,wBAAI;MAAG+V,MAnBhC/V,KAAAA,OAmBkD,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,kB,+C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,C6BlD/DgW;;ErI6FqB;;;gBC5CI;;;;;;;SoIjDe,A,C,I,C,I,C,C,C,C,C,G,C,0B,C,C,C,C;A,e,C,C,G,C,C,A,E,mB,gD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCEhB1O,YAAU,MAAG2O,MAAK,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,G,C,C;A,G,C,CAAyB59C,cAAmB49C,KAAQz7C,eAA0By7C,QAAe,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,I,C,G,C,C;A,G,C,CAC/GC,YAAuB,MAAGxvB,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAsCruB,cAAgCquB,KAAWlsB,eAA6BksB,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAI1L,cACEmhB,AAAAA,KANmCoO,YAOrC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAE;;EtIwFqB;;;gBC5CI;;;;;;SqI5CgB,A,C,I,C,I,C,C,C,C,C,G,C,2B,C,C,C,C;A,gB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E;A;A;A;A;A,U,C,C,C,C,C;A;A;A,U,C,C,C,C,C;A;A;A;A,W,C,C,C,C,C;A;A,W,C,C,C,C,C;A;A,W,C,C,C,C,C;A;A;A;A,W,C,C,C,C,C;A;A,W,C,C,C,C,C;A;A;A;A;A;A;A;A;A,W,C,C,C,E,C;A;A;A;A,W,C,C,C,E,C;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,W,C,I,C,I,C;A;A,W,C,I,C,I,C;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,W,C,I,C;A;A;A;A;A;A;A;A;A;A,gB,C,I,C,I,C,I,C,C,I,C,I,C,C;A,gB,C,I,C,I,C,G,C,C,C,C,C,I,C,C,C,C,C,C,C;A,gB,C,I,C,I,C,I,C,C,I,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,C,C,U,C,C,C,C,C,C,M,C,C,C,E,C,S;A,M,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,C,E,I,C,M,C,C;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,W,E,K,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,C,C,U,C,C,C,C,C,C,M,C,C,C,E,C,S;A,M,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,C,C,U,C,C,C,C,C,C,M,C,C,C,E,C,S;A,M,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,C,E,I,C,M,C,C;A,E,C,C,C,W,E,K,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,C,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,C,E,C,I,C,K,C,C,C,E,C,C,M,C,C,C,E,C,S;A,M,C,C,C,E,C,S,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C,C,E,C,S;A,E,C,M,C,C,E,S,C,M,C,C,C,E,C,S;A,E,C,C,C,W,E,K,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,C,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,E,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,E,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C,C,G,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,C,C,W,E,K,E,M,C,C,E,Q,E,I,C,C,C,C,C,yB,C,C,C,E,C,C,G,C,G,C,E,C,C,C,C,M,C,M,C,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,C,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,C,E,I,C,M,C,C,E,I;A,E,C,M,C,C,E,Q,C,M,C,C,E,I,E,C,G,C;A,M,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,E,C,C,C,C,W,E,K,E,I,C,C,C,C,C,yB,C,C,C,E,C,C,C,c,E,C,G,C,G,C,E,C,C,C,C,M,C,M,C,C,C,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C,C,G,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,C,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,G,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,G,C,C;A,C,C,E,C,I,G,C,C;A,C,C,G,C,I,K,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,K,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,K,C,W,C;A,C,C,E,C,I,K,C,M,C;A,C,C,E,C,I,K,C,Q,C;A,C,C,E,C,I,K,C,Q,C;A,C,C,E,C,I,K,C,K,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,qB,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,G,C,I,I,C,c,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,S,C;A,C,C,G,C,I,I,C,c,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,qB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,yB,C;A,C,C,E,C,I,I,C,U,C;A,C,C,G,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,a,C;A,C,C,G,C,I,I,C,c,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,S,C;A,C,C,G,C,I,I,C,a,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,C,C,E,C,I,I,C,Q,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,O,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,O,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,Y,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,O,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,M,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,S,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,W,C,C,M,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,G,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,G,C,S;A,C,C,E,C,G,C,S;A,C,C,E,C;;;C;A,C,C,E,C;A;A,C,C,E,C;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;;;C;A,C,C,E,C,I,I,C,I,C,I,C;A,C,C,E,C,I,I,C,I,C;A,C,C,E,C,I,I,C,I,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,O,C,G,C;A,C,C,E,C,I,I,C,M,C,G,C;A,C,C,E,C,I,I,C,M,C,G,C;A,C,C,E,C,I,I,C,Q,C,I,C;A,C,C,E,C,I,I,C,S,C,G,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C;;;;;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,C,C,C,C,K,C,I,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,K,C,I,C,K,C,I,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,K,C,K,C,K,C,K,C,C;A,C,C,E,C,C,C,gB,C,C,Q,C,S,C,S,C,Q,C,M,C,C;A,C,C,E,C,C,C,gB,C,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,G,C,C;A,C,C,E,C,C,C,gB,C,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,gB,C,C,C,C;A,C,C,E,C,C,C,gB,C,C,I,C,M,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,K,C,K,C,K,C,K,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,K,C,K,C,K,C,K,C,K,C,C;A,C,C,E,C,C,C,gB,C,C,E,C,E,C,E,C,E,C,G,C,G,C,C;A,C,C,E,C,C,C,gB,C,C,S,C,K,C,U,C,Q,C,U,C,O,C,I,C,O,C,I,C,O,C,I,C,C;A,C,C,E,C,I,K,C,E,C,C,O,C,I,C,G,C,I,C,Q,C,I,C,M,C,I,C,Q,C,I,C,K,C,I,C,E,C,I,C,K,C,I,C,E,C,I,C,K,C,I,C,E,C,I,C,C,C,C,E,C;A,C,C,E,C,C,C,gB,C,C,sB,C,oB,C,qB,C,a,C,Y,C,c,C,oB,C,gB,C,a,C,kB,C,iB,C,U,C,U,C,Y,C,S,C,c,C,C;A,C,C,E,C,I,K,C,E,C,C,oB,C,sB,C,kB,C,oB,C,mB,C,qB,C,W,C,a,C,U,C,Y,C,Y,C,oB,C,kB,C,0B,C,c,C,sB,C,W,C,U,C,gB,C,wB,C,e,C,uB,C,Q,C,gB,C,Q,C,gB,C,U,C,kB,C,O,C,e,C,Y,C,oB,C,C,C,C,E,C;A,C,C,E,C,C,C,gB,C,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,I,C,I,C,G,C,G,C,G,C,I,C,I,C,I,C,G,C,I,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,C;A,C,C,E,C,I,K,C,E,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,I,C,C,C,I,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,I,C,C,C,I,C,C,C,I,C,C,C,G,C,C,C,I,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,C,C,C,E,C;A,C,C,G,C,C,C,gB,C,C,M,C,S,C,a,C,U,C,Y,C,C;A,C,C,E,C,I,K,C,C,C,C,I,C,C,C,O,C,C,C,W,C,C,C,Q,C,C,C,U,C,C,C,C,C,C,G,C;A,C,C,G,C,C,C,gB,C,C,W,C,C;A,C,C,E,C,I,K,C,C,C,C,S,C,M,C,C,C,C,G,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,oB,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,I,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,sB,C;A,C,C,E,C,I,I,C,yB,C;A,C,C,E,C,I,I,C,yB,C;A,C,C,E,C,I,I,C,8B,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,uB,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,I,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,C,S;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,G,C,G,C,C,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,G,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,Q,C;A,C,C,E,C,C,C,E,C,K,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,Q,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,K,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,M,C;A,C,C,E,C,C,C,E,C,M,C;A,C,C,E,C,C,C,E,C,S,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,C,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,C,C,E,C,I,I,C,M,C,C,M,C;A,uB;A,C,C,E,C,iB;A,C,C,E,C,mB;A,C,C,E,C,C;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,C,C;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,C,C,E;A,C,C,E,C,C;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,C,C;A,C,C,E,C,C,C,E;A,C,C,E,C,C;A,C,C,E,C,C;A,C,C,E,C,I;A,C,C,E,C,C,C;A,C,C,E,C,C;A,C,C,E,C,C,C;A,C,C,E,C,I;A,C,C,E,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,M,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,G,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,M,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,G,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C;A,C,C,E,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,E,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,K,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,E,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,E,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,G,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,C1J4bvCC,sCAA0C,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CAC1CC,sBAA4C,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CAC5CC,sBAA4C,A,C;A,C,C,K,C,C,C,0B,C,I,C,I,C,Q,C,CAC3CC,oCAC8C,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAQnCC,OAAaC,QAAkB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAGnBluD,oCAA6B,A,C;A,C,C,K,C,C,C,qB,C,I,C,I,C,Q,C,CFmrBzBmuD,OAC1BC,MAAeC,yDAA2C,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CAIhCC,OAC1BF,MAAeC,yEAAyD,A,C;A,C,C,K,C,C,C,iB,C,I,C,I,C,Q,C,CAI9CE,OAC1BH,MAAeC,YAAkC,A,C;A,C,C,K,C,C,C,wB,C,I,C,I,C,Q,C,CAIvBG,OAC1BJ;;;;;;;KAAuC,A,C;A,C,C,K,C,C,C,sB,C,I,C,I,C,Q,C,CAIbK,OAC1BL,MAAeC,cAAoC,A,C;A,C,C,K,C,C,C,6B,C,I,C,I,C,Q,C,CAIzBK,OAC1BN;;;;;;;KAA4C,A,C;A,C,C,K,C,C,C,qB,C,I,C,I,C,Q,C,CAIlBO,OAC1BP,MAAeQ,YAAsC,A,C;A,C,C,K,C,C,C,4B,C,I,C,I,C,Q,C,CAI3BC,OAC1BT;;;;;;KAA2C,A,C;A,C,C,K,C,C,C,0B,C,I,C,I,C,Q,C,CAIjBU,OAC1BV,MAAeQ,cAAwC,A,C;A,C,C,K,C,C,C,iC,C,I,C,I,C,Q,C,CAI7BG,OAC1BX;;;;;;KAAgD,A,C;A,C,C,K,C,C,C,qB,C,I,C,I,C,Q,C,C+BzqC/C1e,OAAsB,qBAO3B,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CnC8sBY97B,UAAyB,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CcvtBjBo7C,iBTgBV//C,iKSMU,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CyBiCMggD,uBACkB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAClBC,uBAAiD,A,C;A,C,C,K,C,C,C,iB,C,I,C,I,C,Q,C,CAE7Bz3C,OAC1C03C,QAAuB,A,C;A,C,C,K,C,C,C,uB,C,I,C,I,C,Q,C,CA2aRn3C,+BjCndgB1Y,sBiCmd2B,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CEjetCyM,OACtBqjD,4BAA6D,A,C;A,C,C,K,C,C,C,iB,C,I,C,I,C,Q,C,CAIvCz0C,OACtB00C,cAAmC,A,C;A,C,C,K,C,C,C,oB,C,I,C,I,C,Q,C,CAIbx5C,OACtBu5C,kCAAkE,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CkB3BlErmC,OAAoB,YAAqB,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CHwD/BnV,UAAyB,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,C1BmqBjB+D,iBzBjsBV1I,gLyBytBF,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CT+9COqgD,mBAAiC,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CAu4TnCp1B,OjBv8UNh6B,4iBAA8B,gCiBs9UrC,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,CF5gYasC,OAAUk6B,qCAA0C,A,C;A,C,C,K,C,C,C,4B,C,I,C,I,C,Q,C,CAmWtD6yB,gDACiC,A,C;A,C,C,K,C,C,C,6B,C,I,C,I,C,Q,C,CACjCC,iDACkC,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CiFlZhCC,yBAAgC,A,C;A,C,C,K,C,C,C,sB,C,I,C,I,C,Q,C,CAChCC,mBAAoC,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CpFoMhB9oB,aZ65C1B1mC,QAA8B,4CY75CwB,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,CyGjKlD4pC,OAAU,+BAAkC,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CCmHnD6lB,OAAa14C,YAAmB,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CI8IhC01B,OAAc,qBAQlB,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CAEIijB,iBzHrUM3gD,gCyHqU0B,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,CAUzB66B,OAAU,8BAAiC,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CEkG9C0E,OAAe,+BAAsB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAKrCC,OAAY,+BAAoC,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAQhDZ,OAAa,qCAA0C,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CAYvDgD,OAAgB,+BAAoC,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CAKxDgf,OAAc54C,YAAmB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAuH1Bs3B,OAAY,4BAA+B,A,C;A,C,C,K,C,C,C,2B,C,I,C,I,C,Q,C,CA6BlDoI,OAA4B,sBAMhC,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CtG7lBamZ,iBrBZH7gD,6CqBY6C,A,C;A,C,C,K,C,C,C,gB,C,I,C,I,C,Q,C,CAuB1B8gD,OcIpB,4BAAA;;mBdHoC,A,C;A,C,C,K,C,C,C,Q,C,I,C,I,C,Q,C,CAItBniB,sB0B3DG,oB1B2DoB,A,C;A,C,C,K,C,C,C,gB,C,I,C,I,C,Q,C,CAq4BzBoiB,gBAAwB,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CAiGlC1Z,OAAc,yBAA4B,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAC1CE,OAAa,wBAA2B,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CACxChB,OAAa,wBAA2B,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CACxCL,OAAW,sBAAyB,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CAEnCpG,oCAAmC,A,C;A,C,C,K,C,C,C,kB,C,I,C,I,C,Q,C,CFn+BpCn9B,OACTg+B,eAA2B5+B,KAAAA,6BAAoB,A,C;A,C,C,K,C,C,C,O,C,I,C,I,C,Q,C,CAoD7Ci/C,OAAQryB,cAAsBhmB,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CAI9Bk4B,OAAWlS,AAAAA,AAAAA,uBAA0C3K,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAE9Ckd,OAAa,wBAA2B,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,C4GnI/C6H,OAAgB,qBAoBpB,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,CCYWlO,OAAU,6BAAgC,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CGpBjDwR,OpIooDGp7C,0NAA8B,gCoIlnDvC,A,C;A,C,C,K,C,C,C,kB,C,I,C,I,C,Q,C,CAEMm7C,OpIgnDGn7C,qDAA8B,gCoI5mDvC,A,C;A,C,C,K,C,C,C,wB,C,I,C,I,C,Q,C,ClB6HsB2/C,iBjHzIV5wC,0CiHyI6D,A,C;A,C,C,K,C,C,C,uB,C,I,C,I,C,Q,C,CACnD2wC,iBjH1IV3wC,+CiH0IiE,A,C;A,C,C,K,C,C,C,oB,C,I,C,I,C,Q,C,C+BpJzCy3C,OAAqB,qBAiBrD,A,C;A,C,C,K,C,C,C,gB,C,I,C,I,C,Q,C,CE6NW6D,oCAA6B,A,C;A,C,C,K,C,C,C,uB,C,I,C,I,C,Q,C,CAC7BnB,oCAAoC,A,C;A,C,C,K,C,C,C,wB,C,I,C,I,C,Q,C,CA4G7B8G,OACH,aACbrJ,AAAAA,KAAAA,sCAAiE,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CtBpMzDc,kDAAyC,A,C;A;A,I,C,e,C,C,C;e,G,C,I,C,I,C,I,C,I,C,I,C,Q,C,a,C,O,C,W,C,c,C,M,C,M,C,U,C,S,C,U,C,O,C,Q,C,G,C,K,C,S,C,G,C,Q,C,O,C,Y,C,sB,C,Q,C,Q,C,O,C,a,C,O,C,Y,C,W,C,O,C,O,C,K,C,O,C,S,C,S,C,c,C,O,C,U,C,K,C,qB,C,gB,C,W,C,U,C,O,C,I,C,Y,C,e,C,Q,C,S,C,mB,C,M,C,M,C,M,C,M,C,O,C,W,C,gB,C,U,C,a,C,c,C,e,C,W,C,U,C,Y,C,M,C,Y,C,gB,C,wB,C,K,C,e,C,Q,C,U,C,kB,C,C,gB,C,O,C,Y,C,c,C,W,C,S,C,Q,C,S,C,G,C,G,C,W,C,S,C,a,C,G,C,c,C,K,C,K,C,kB,C,a,C,O,C,S,C,W,C,e,C,Q,C,Q,C,U,C,O,C,M,C,I,C,uB,C,G,C,qB,C,W,C,U,C,G,C,c,C,S,C,e,C,gB,C,O,C,K,C,W,C,K,C,U,C,K,C,U,C,O,C,G,C,S,C,U,C,M,C,O,C,S,C,Q,C,+B,C,W,C,a,C,S,C,W,C,Y,C,M,C,e,C,O,C,Y,C,Q,C,oB,C,gB,C,U,C,K,C,c,C,M,C,W,C,U,C,qB,C,iC,C,4C,C,O,C,Y,C,U,C,W,C,S,C,c,C,Q,C,U,C,qD,C,M,C,Q,C,6C,C,8D,C,K,C,wE,C,6D,C,qF,C,+F,C,uD,C,qE,C,+C,C,M,C,gC,C,gE,C,e,C,Y,C,O,C,qC,C,G,C,gC,C,O,C,G,C,Q,C,M,C,S,C,+B,C,a,C,I,C,qC,C,iB,C,mC,C,+B,C,0F,C,M,C,Q,C,O,C,iB,C,U,C,W,C,K,C,M,C,M,C,I,C,E,C,gB,C,M,C,U,C,a,C,+B,C,e,C,K,C,Y,C,iB,C,Q,C,U,C,gB,C,c,C,U,C,O,C,M,C,K,C,a,C,sC,C,U,C,U,C,U,C,gB,C,G,C,a,C,M,C,a,C,U,C,iB,C,W,C,O,C,oC,C,K,C,S,C,c,C,Y,C,K,C,U,C,Q,C,W,C,M,C,M,C,c,C,S,C,S,C,O,C,K,C,O,C,Q,C,U,C,U,C,O,C,M,C,M,C,wB,C,Y,C,M,C,O,C,O,C,K,C,S,C,M,C,S,C,W,C,c,C,G,C,M,C,G,C,uC,C,a,C,G,C,Y,C,U,C,O,C,O,C,iB,C,I,C,S,C,S,C,U,C,G,C,W,C,I,C,I,C,Q,C,Q,C,Y,C,a,C,W,C,M,C,W,C,mB,C,U,C,Y,C,O,C,U,C,M,C,W,C,W,C,Y,C,M,C,Q,C,S,C,S,C,S,C,S,C,S,C,Q,C,U,C,S,C,Q,C,e,C,iB,C,mB,C,Y,C,e,C,uB,C,W,C,S,C,W,C,U,C,U,C,U,C,U,C,c,C,c,C,Q,C,Y,C,E,C,W,C,C,C,E,C,U,C,gB,C,K,C,kB,C,Q,C,Q,C,M,C,W,C,M,C,4B,C,W,C,e,C,2B,C,2B,C,G,C,I,C,I,C,oB,C,I,C,K,C,uB,C,oB,C,uB,C,mB,C,O,C,K,C,O,C,I,C,U,C,S,C,M,C,U,C,I,C,e,C,oB,C,I,C,uB,C,M,C,I,C,I,C,I,C,I,C,sC,C,K,C,I,C,oB,C,uB,C,K,C,G,C,oB,C,uB,C,G,C,2C,C,K,C,2C,C,I,C,Q,C,M,C,I,C,S,C,uB,C,4B,C,gB,C,I,C,S,C,4B,C,c,C,I,C,a,C,Y,C,G,C,gC,C,uB,C,gC,C,+B,C,0B,C,S,C,2C,C,gC,C,kC,C,S,C,S,C,S,C,e,C,Y,C,Y,C,c,C,gB,C,Q,C,Q,C,U,C,4B,C,M,C,sC,C,Y,C,W,C,Y,C,Q,C,M,C,U,C,M,C,S,C,Q,C,G,C,U,C,Q,C,M,C,M,C,M,C,gC,C,0B,C,kB,C,c,C,S,C,+B,C,+B,C,Q,C,U,C,c,C,M,C,W,C,I,C,I,C,gC,C,O,C,gC,C,M,C,qC,C,Y,C,qC,C,M,C,Q,C,gC,C,O,C,K,C,Q,C,W,C,W,C,U,C,Q,C,K,C,K,C,sC,C,I,C,sD,C,yD,C,oB,C,uB,C,iC,C,K,C,I,C,K,C,I,C,K,C,oB,C,uC,C,O,C,iD,C,S,C,sC,C,W,C,a,C,uC,C,sC,C,O,C,uC,C,iC,C,W,C,K,C,U,C,I,C,gC,C,4B,C,+B,C,U,C,K,C,4B,C,sC,C,Q,C,I,C,I,C,I,C,I,C,+B,C,2C,C,I,C,I,C,I,C,K,C,oB,C,mB,C,K,C,K,C,U,C,K,C,uB,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,oB,C,uB,C,K,C,0C,C,+B,C,M,C,O,C,+B,C,O,C,+B,C,I,C,4B,C,yD,C,+B,C,6B,C,6B,C,W,C,W,C,S,C,iB,C,S,C,Y,C,Q,C,W,C,a,C,gB,C,oC,C,gB,C,wC,C,S,C,Q,C,iC,C,kB,C,M,C,G,C,uC,C,G,C,K,C,gC,C,M,C,qC,C,G,C,M,C,M,C,Y,C,Q,C,C,C,uB,C,K,C,I,C,I,C,oB,C,uB,C,+B,C,K,C,oB,C,oB,C,uB,C,4B,C,oB,C,uB,C,W,C,U,C,a,C,e,C,8B,C,S,C,W,C,iC,C,U,C,oB,C,oB,C,uB,C,gB,C,O,C,Y,C,+B,C,qB,C,wB,C,O,C,O,C,a,C,a,C,a,C,c,C,S,C,oB,C,K,C,I,C,S,C,I,C,I,C,K,C,K,C,G,C,a,C,8B,C,oC,C,Q,C,e,C,uC,C,sB,C,I,C,wB,C,oB,C,uB,C,K,C,E;A;A;A;;;;A;;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,C,Q,C,C,C,Q,C,M,C,C,C,C,I,C,C,C,C;A,C,C,C,C,C,C;A,M,C,M,C,I,C,mB,C,C,C,C,C,C,C,C,I,C,a,C,Q,C,C,C,C,M,C,M,C,U,C,C,C,I,C,U,C,C;A,I,C,C,uB;A,I,C,C,M,C,C,C,E,C,M,C,C,C,C,M,C,M,C,I,C,C;A,I,C,C,Q;A,G,C,I,C,C,C,C,C,C,E,C,C,Q,C,M,C,C,C,G,C,C,C,G,C;A,E,C,C,C,Q,C,E,C,C,C,C,C,C,C,Q,C,C,C;A,I,C,U,C,Q;A,K,C,C,C,C,C;A,I,C,oB,C,I,C,a,C,iB,C;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gB;A"
+  "sources": ["file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/interceptors.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_rti.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_array.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/iterable.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/sort.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_number.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_string.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/regexp_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/isolate_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/queue.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/collection_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/timer.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/native_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/core_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/string_helper.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/constant_map.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/symbol.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/chart.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/logging/logging.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/application.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/change_notifier.dart","file:///Users/turnidge/dart/dart-sdk/lib/js/dart2js/js_dart2js.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/location_manager.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/dart2js/html_dart2js.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/app/view_model.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/index_devtools.html_bootstrap.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/loader.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/breakpoint_list.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/instance.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable_map.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/class_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/class_view.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/uri.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/code_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/code_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/collapsible_content.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/curly_block.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/custom_element/polyfill.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/future.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/lists.dart","file:///Users/turnidge/dart/dart-sdk/lib/internal/list.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_mirrors.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/linked_hash_map.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_names.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/async_error.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/schedule_microtask.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/async_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream_controller.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/broadcast_stream_controller.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream_impl.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream_pipe.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/zone.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/internal_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/future_impl.dart","file:///Users/turnidge/dart/dart-sdk/lib/async/stream.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/hash_map.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/iterable.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/maps.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/collections.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/hash_set.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/list.dart","file:///Users/turnidge/dart/dart-sdk/lib/collection/splay_tree.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/convert_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/convert/json.dart","file:///Users/turnidge/dart/dart-sdk/lib/convert/utf.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/comparable.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/errors.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/string.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/exceptions.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/list.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/print.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/annotations.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/bool.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/date_time.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/duration.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/expando.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/null.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/object.dart","file:///Users/turnidge/dart/dart-sdk/lib/core/string_buffer.dart","file:///Users/turnidge/dart/dart-sdk/lib/convert/codec.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/conversions.dart","file:///Users/turnidge/dart/dart-sdk/lib/svg/dart2js/svg_dart2js.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/filtered_element_list.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/isolate_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/jenkins_smi_hash.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/math.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/math_patch.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/point.dart","file:///Users/turnidge/dart/dart-sdk/lib/math/rectangle.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/mirrors_patch.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/collection/src/unmodifiable_wrappers.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/collection/wrappers.dart","file:///Users/turnidge/dart/dart-sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart","file:///Users/turnidge/dart/dart-sdk/lib/_internal/lib/js_primitives.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/error_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/eval_box.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/to_observable.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/eval_link.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/field_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/field_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/function_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/service_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/function_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/heap_map.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/heap_profile.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/observatory_element.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/device.dart","file:///Users/turnidge/dart/dart-sdk/lib/html/html_common/css_class_set.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/instance_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/instance_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_profile.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_summary.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/isolate_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/json_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/library_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/library_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/nav_bar.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/observatory_application.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/service_html.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/service/object.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/change_record.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/compound_path_observer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/dirty_check.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/list_diff.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable_list.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/observable_box.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observe/src/path_observer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/boot.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/declaration.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/template_binding.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/node_binding.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/src/job.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer/deserialize.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/polymer_expressions.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/tokenizer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/parser.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/eval.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/visitor.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/async.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/expression.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/src/globals.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/polymer_expressions/src/mirrors.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/response_viewer.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/script_inset.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/script_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/script_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/service_error_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/service_exception_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/service_view.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/sliding_checkbox.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/stack_frame.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/stack_trace.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/input_bindings.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/instance_binding_map.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/template.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/template_iterator.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/input_element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/node.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/select_element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/text.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/template_binding/src/text_area_element.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/vm_ref.dart","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/packages/observatory/src/elements/vm_view.dart"],
+  "names": ["getInterceptor","makeDispatchRecord","getNativeInterceptor","initNativeDispatch","lookupAndCacheInterceptor","int","map","findInterceptorConstructorForType","findIndexForNativeSubclassType","findConstructorForNativeSubclassType","bool","Primitives","String","dynamic","invocation","Type","getRuntimeTypeString","E","length","IterableMixinWorkaround","Iterable","list","List","_rangeCheck","Lists","_doSort","a","Iterator","iterable","factory","b","isNegative","num","roundToDouble","double","allMatchesInStringUnchecked","Match","string","other","substring","stringReplaceAllUnchecked","pattern","_isWhitespace","regExp","_match","stringContainsUnchecked","static","_callInIsolate","isolate","_globalState","weakPorts","_addRegistration","entry","rootContext","computeThisScriptD8","_deserializeMessage","msg","_add","events","workerIds","_serializeMessage","fillLiteralMap","_log","print","supportsWorkers","_visited","_Manager","isWorker","fromCommandLine","topEventLoop","isolates","managers","mainManager","pauseCapability","pauseTokens","isPaused","_length","delayedEvents","_head","_table","_tail","_grow","_modificationCount","isolateStatics","code","message","addPause","removePause","RawReceivePortImpl","ports","_updateGlobalState","id","_IsolateEvent","dequeue","event","next","runIteration","_runHelper","fn","context","mirrorFunctionCacheName","mirrorInvokeCacheName","replyTo","topLevel","_isolateId","_receivePort","_workerId","_receivePortId","_isClosed","_handler","_id","visitSendPort","port","visitCapability","x","SendPort","Capability","operator","tagged","traverse","isPrimitive","visitPrimitive","_dispatch","visitList","visitMap","visitObject","copy","Map","_nextFreeRefId","_serializeList","result","deserialize","_deserialized","_deserializeHelper","_deserializeList","_deserializeMap","deserializeSendPort","deserializeCapability","deserializeObject","dartList","keys","values","_inEventLoop","_handle","_once","TimerImpl","convertDartClosureToJS","callback","value","match","handleError","digitsPart","source","name","getRuntimeTypeInfo","joinArguments","objectTypeName","array","_current","_fromCharCodeApply","stringFromCodePoints","receiver","positionalArguments","arguments","namedArguments","function","functionNoSuchMethod","info","data","defaultArguments","iae","ioore","wrapException","toStringWrapper","JS","throwExpression","unwrapException","saveStackTrace","nsme","notClosure","nullCall","nullLiteralCall","undefCall","undefLiteralCall","nullProperty","undefProperty","undefLiteralProperty","object","invokeClosure","JS_CALL_IN_ISOLATE","functionCounter","forwardCallTo","functions","forwardInterceptedCallTo","cspForwardCall","computeFieldNamed","selfFieldNameCache","cspForwardInterceptedCall","BoundClosure","closureFromTearOff","Closure","property","interceptedTypeCast","propertyTypeCastError","RuntimeFunctionType","RuntimeType","Object","getRuntimeTypeArguments","substitute","getRuntimeTypeArgument","getTypeArgumentByIndex","type","onTypeVariable","_contents","runtimeTypeToString","invokeOn","areSubtypes","isSubtype","computeSignature","isFunctionSubtype","names","areAssignable","areAssignableMaps","getTagFunction","alternateTagFunction","makeLeafDispatchRecord","patchInteriorProto","makeDefaultDispatchRecord","initNativeDispatchFlag","initNativeDispatchContinue","dispatchRecordsForInstanceTags","interceptorsForUncacheableTags","initHooks","tags","prototypeForTagFunction","applyHooksTransformer","haystack","needle","_nativeRegExp","regexp","Maps","_throwUnmodifiable","V","_jsObject","containsKey","_keys","f","_map","Symbol","_memberName","mangledNames","unmangledName","_kind","_arguments","_namedArgumentNames","_getCachedInvocation","_internalName","symbol","memberName","throwInvalidReflectionError","isIntercepted","cachedInterceptor","jsFunction","interceptor","requiredParameterCount","computeFunctionRti","functionType","setRuntimeTypeInfo","namedArgumentList","matchTypeError","_pattern","_argumentsExpr","_expr","_method","_receiver","_message","JsNoSuchMethodError","_trace","_exception","closure","_self","_target","receiverFieldNameCache","CastErrorImplementation","RuntimeError","_extractFunctionTypeObjectFrom","toRti","returnType","parameterTypes","listToRti","optionalParameterTypes","namedParameters","extractKeys","rti","argument","UnimplementedNoSuchMethodError","_unmangledName","_typeName","get","_nativeGlobalRegExp","makeNative","_nativeAnchoredRegExp","_nativeGlobalVersion","_nativeAnchoredVersion","_execAnchored","_MatchImplementation","_re","_string","_regExp","Logger","_api","Isolate","__$isolate","set","notifyPropertyChangeHelper","ServiceObject","__$response","__$args","locationManager","vm","_onError","_onException","ObservatoryApplication","_initOnce","_chart","props","options","table","__$currentHash","hashChangeEvent","_tryResume","_wrapZone","window","requestCurrentHash","currentHash","parts","_app","_expanded","onShow","onHide","expanded","rows","root","row","_collapse","_librariesToLoad","_useDirtyChecking","i41","ServiceMap","__$msg","notifyPropertyChange","BreakpointListElement","ClassRefElement","__$cls","Future","cls","_uriEncode","ClassViewElement","CodeRefElement","Code","__$code","CodeViewElement","__$iconClass","__$displayValue","_collapsed","_refresh","CollapsibleContentElement","__$expanded","__$busy","__$callback","doneCallback","CurlyBlockElement","js","customElements","_isReady","document","combine","_toStringList","from","otherList","dst","src","_insertionSort","_dualPivotQuicksort","compare","action","elementAt","test","fold","_iterable","_endOrLength","_start","_startIndex","_endIndex","SubListIterable","_index","_f","T","_iterator","_source","_currentExpansion","_takeCount","_remaining","_skipCount","SkipIterable","_name","toString","s","InstanceMirror","TypeMirror","mangledGlobalNames","reflectClassByName","mangledName","JsCache","classMirrors","reflectClassByMangledName","originalDeclaration","referent","fields","superclassName","mixins","reflectMixinApplication","typeVariables","method","ClassMirror","it","ownerClass","findTypeVariableIndex","typeVariable","getTypeArgument","reflectClass","owner","JSArray","splitFields","fieldSpecification","fieldsMetadata","key","_cachedLibraries","librariesByName","library","_splitRe","libraries","_prettyName","_getField","LibraryMirror","currentJsMirrorSystem","_isRoot","computeQualifiedName","simpleName","n","_invoke","DeclarationMirror","_functionMirrors","_cachedClasses","_classes","__functions","__variables","setterSymbol","mirror","reflect","__members","_jsFunction","_cachedFunctionMirrors","_functions","_globalObject","_cachedFields","parseCompactFieldSpecification","_compactFieldSpecification","_cachedFunctions","_cachedGetters","_cachedSetters","_cachedVariables","_fields","_cachedMembers","__classes","__getters","__setters","_cachedDeclarations","_cachedMetadata","_metadata","Function","addToResult","_cachedSimpleName","superclass","mixin","superName","reflectee","_classInvocationCache","reflectiveNames","reflectiveName","cacheEntry","_getterCache","_getFieldSlow","_newProbeFn","_newInterceptedGetterFn","_newGetterFn","objectHashCode","Error","typeArguments","_class","_typeArguments","_cachedTypeArguments","addTypeArgument","_cachedMethods","_cachedConstructors","filterConstructors","_methods","filterMembers","__constructors","JsLibraryMirror","_superclass","typeMirrorFromRuntimeTypeRepresentation","typeInformation","_cachedSuperinterfaces","_mangledName","typeArgument","tv","_jsConstructorOrInterceptor","_jsConstructor","isReflectiveDataInPrototype","reflectionName","_getMethodsWithOwner","_fieldsDescriptor","_fieldsMetadata","_getFieldsWithOwner","_cachedMethodsMap","filterMethods","_owner","reflectType","JsMirrorSystem","extractMetadata","__methods","_getSuperinterfacesWithOwner","_cachedTypeVariables","_type","_metadataFunction","_jsName","isFinal","descriptor","fieldInformation","field","fieldCode","accessorName","MethodMirror","callName","_parameters","metadata","_returnType","_parameterCount","ownerType","isConstructor","optionalParameterCount","parameter","formals","raw","isStatic","isGetter","_setField","isSetter","isOperatorName","metadataList","JsFunctionTypeMirror","_cachedReturnType","_typeData","_cachedParameters","_cachedToString","_throw","errorHandler","zone","_nextCallback","_lastCallback","_asyncRunCallbackLoop","_createTimer","Zone","_previous","_next","notificationHandler","_runUserCode","onSuccess","userCode","onError","subscription","future","_cancelAndErrorClosure","Timer","duration","self","ZoneCallback","ZoneUnaryCallback","ZoneBinaryCallback","_scheduleAsyncCallback","printString","printToZone","_BroadcastStreamController","_eventState","_state","_Future","_doneFuture","previous","_removeListener","_callOnCancel","_addEventError","_sendData","_sendError","_ensureDoneFuture","_sendDone","_addStreamState","addState","_runGuarded","_onCancel","_forEachListener","link","computation","_FutureOnValue","_onValueCallback","_FutureErrorTest","_errorTestCallback","_onErrorCallback","_FutureAction","_whenCompleteActionCallback","_registerErrorHandler","_addListener","_resultOrListeners","_AsyncError","_zone","listener","current","_chainFutures","_removeListeners","_setValue","_propagateToListeners","_setError","_complete","_asyncCompleteError","_asyncComplete","target","internalFuture","asyncError","_propagateMultipleListeners","handleValueCallback","handleWhenCompleteCallback","_completeError","errorCallback","completeResult","Stream","_cancelAndValue","StreamSubscription","_controller","_onListen","otherStream","_onData","_onDone","_pending","_guardCallback","_onPause","lastPendingEvent","_onResume","_cancelFuture","_cancel","_addPending","pending","_checkState","sendError","sendDone","_createSubscription","_BufferingStreamSubscription","dispatch","error","stackTrace","_DelayedEvent","scheduleMicrotask","handleNext","firstPendingEvent","_cancelAndError","sink","_subscription","_stream","_ForwardingStreamSubscription","_handleData","_handleError","_handleDone","_test","_transform","_TakeStream","_SkipStream","_degelationTarget","parent","_errorZone","otherZone","run","handleUncaughtError","runUnary","runBinary","registerCallback","registerUnaryCallback","registerBinaryCallback","copiedMap","HandleUncaughtErrorHandler","RunHandler","RunUnaryHandler","RunBinaryHandler","RegisterCallbackHandler","RegisterUnaryCallbackHandler","RegisterBinaryCallbackHandler","ScheduleMicrotaskHandler","CreateTimerHandler","PrintHandler","ForkHandler","ZoneSpecification","_rootHandleUncaughtError","_rootFork","_rootRun","_rootRunUnary","_rootRunBinary","_rootScheduleMicrotask","_rootCreateTimer","_toStringVisiting","_iterablePartsToStrings","ultimateString","penultimateString","m","_strings","_nums","_rest","_findBucketIndex","_computeHashCode","_computeKeys","_newHashTable","_addHashTableEntry","_setTableEntry","_removeHashTableEntry","_getTableEntry","_validKey","_hashCode","_equals","_CustomHashMap","K","_offset","cell","_newLinkedCell","ifAbsent","_unlinkCell","_last","_first","_modifications","LinkedHashMapCell","last","_LinkedCustomHashMap","_cell","_computeElements","bucket","_elements","add","element","_set","LinkedHashSetCell","iterator","buffer","isEmpty","_iterableToString","setRange","setAll","queue","_writeToList","_nextPowerOf2","_remove","ListQueue","_queue","_position","_end","_root","_dummy","_compare","tmp","right","left","_splayCount","_SplayTreeNode","_splay","_count","_splayMax","node","_comparator","mapRoot","_addNewRoot","tree","nodes","visit","SplayTreeMap","_currentNode","_getValue","_workList","_tree","_findLeftMostDescendent","currentNode","_SplayTreeIterator","_convertJsonToDart","revive","walk","_parseJson","cause","JsonUnsupportedObjectError","JsonCyclicError","_reviver","decoder","_JsonStringifier","_toEncodableFunction","encoder","JsonEncoder","JsonDecoder","seen","stringifyJsonValue","toEncodable","escape","checkCycle","stringifyValue","stringifier","charCodes","sb","Converter","_buffer","_bufferIndex","str","_writeSurrogate","fixedList","expires","millisecondsSinceEpoch","isUtc","lazyAsJsDate","fourDigits","twoDigits","threeDigits","DateTime","re","parseIntOrZero","parseDoubleOrZero","Duration","_duration","inMinutes","inSeconds","sixDigits","inMicroseconds","StackTrace","ArgumentError","RangeError","FallThroughError","_namedArguments","NoSuchMethodError","UnsupportedError","UnimplementedError","StateError","modifiedObject","ConcurrentModificationError","variableName","CyclicInitializationError","_getKey","_keyCount","_currentCodePoint","_nextPosition","objects","write","StringBuffer","host","_writeAuthority","_host","_port","scheme","_normalize","pathSegments","base","path","_hasDotSegments","output","userInfo","ss","_path","query","fragment","uri","Uri","_makePath","_makeScheme","_eitherOf","_parseIntOrZero","_makeHost","_makeQuery","_makeFragment","parseIPv6Address","isSchemeLowerCharacter","isSchemeCharacter","queryParameters","component","decodeHexDigitPair","isNormalizedHexDigit","isUnreserved","fillResult","normalizeHexDigit","bytes","parseHex","parseIPv4Address","canonicalTable","byteToHex","_schemeLowerTable","_schemeTable","_unreservedTable","isLowerCaseHexDigit","part","hex","Device","request","xhr","loadEvent","errorEvent","completer","_createElement","e","WindowBase","_DOMWindowCrossFrame","EventTarget","_convertNativeToDart_XHR_Response","convertNativeToDart_AcceptStructuredClone","_callConstructor","_callEnteredView","_callLeftView","_callAttributeChanged","_ElementFactoryProvider","_wrapBinaryZone","CanvasRenderingContext2D","_putImageData_2","convertDartToNative_ImageData","_dartDetail","DocumentFragment","Element","Node","ElementList","_querySelectorAll","querySelector","_docChildren","children","CssClassSet","Rectangle","clientLeft","clientTop","clientWidth","clientHeight","offsetLeft","offsetTop","offsetWidth","offsetHeight","_localName","elem","ShadowRoot","ElementEvents","ElementStream","changeEvent","clickEvent","inputEvent","mouseMoveEvent","_convertNativeToDart_EventTarget","Events","_initMouseEvent_1","_convertDartToNative_EventTarget","Point","_clientX","_clientY","point","override","_call","parentNode","_this","nodeValue","_rows","Location","_isDartLocation","_location_wrapper","_ensureRequestAnimationFrame","_convertNativeToDart_Window","_postMessage_2","_convertDartToNative_PrepareForStructuredClone","top","width","height","SpeechInputResult","SpeechRecognitionResult","_childElements","_element","toList","_nodeList","_elementList","_FrozenElementList","_ptr","webkitEvents","responseText","OptionElement","remove","attributes","_matches","Set","_elementCssClassSetIterable","_elementIterable","modify","_modifyWithReturnValue","_MultiElementCssClassSet","prevValue","classname","_eventType","_targetList","_useCapture","pool","_unlisten","_pauseCount","_subscriptions","stream","_StreamPool","close","_eventTypeGetter","_list","_array","_createSafe","_window","_cssClassSet","_childNodes","_convertDartFunction","_callDartFunction","_convertToJS","_toMangledNames","o","_getJsProxy","_getOwnProperty","createProxy","_defineProperty","_wrapToDart","JsObject","_getDartProxy","_convertToDart","args","_convertDataTree","_convert","_convertedObjects","convertedList","_checkRange","index","callMethod","_lo","_hi","_nextState","_Random","y","finish","currentMirrorSystem","_base","abstract","_invalidIndex","_checkIndex","_checkSublistArguments","_setRangeFast","__$error","ErrorViewElement","__$text","__$lineMode","evalType","ObservableList","__$results","text","_toObservableDeep","results","targetElement","EvalBoxElement","__$expr","__$result","EvalLinkElement","FieldRefElement","__$field","FieldViewElement","__$qualified","__$ref","refMap","__$hasParent","__$hasClass","FunctionRefElement","__$function","__$qualifiedName","__$kind","_getQualifiedName","FunctionViewElement","PixelReference","_data","_dataIndex","__$status","__$fragmentation","shadowRoot","_fragmentationCanvas","_handleMouseMove","_classIdToName","_classIdToColor","_colorToClassId","_packColor","classList","member","rng","_addClass","_fragmentationData","_pageHeight","fragmentation","pages","_addressAt","_updateClassList","convertNativeToDart_ImageData","_createImageData_1","_renderPages","HeapMapElement","_updateFragmentationData","__$profile","GoogleChart","_fullChart","_newPieChart","_oldPieChart","_combinedChart","_draw","profile","_fullDataTable","_combinedDataTable","_classHasNoAllocations","_fullTableColumnValue","_combinedTableColumnValue","_newPieDataTable","heap","_oldPieDataTable","v","_updateChartData","formattedAverage","formattedTotalCollectionTime","formattedCollections","HeapProfileElement","cleanupSlots","ImageData","nativeImageData","imageData","userAgent","_isOpera","isOpera","_isWebKit","copies","readSlot","writeSlot","date","findSlot","readClasses","writeClasses","_filtered","removeRange","el","ref","expandEvent","done","InstanceRefElement","__$instance","instance","InstanceViewElement","childNode","ProfileCodeTrieNodeTreeRow","columns","formatPercent","percent","codeCaller","ProfileCallerTreeRow","__$callGraphChecked","__$hideTagsChecked","__$sampleCount","__$refreshTime","__$sampleRate","__$sampleDepth","__$displayCutoff","totalSamples","now","displayThreshold","_update","refresh","_buildCallersTree","_buildStackTree","colors","IsolateProfileElement","IsolateRefElement","IsolateSummaryElement","tagProfile","percentage","_updateTimer","_updateTagProfile","tagProfileChart","IsolateViewElement","__$json","json","JsonViewElement","LibraryRefElement","__$library","LibraryViewElement","Level","_level","_rootLevel","_getStream","level","fullName","LogRecord","log","_loggers","loggerName","main","c","rec","initPolymer","NavBarElement","__$link","__$anchor","__$last","NavMenuElement","NavMenuItemElement","__$active","__$label","refreshDone","NavRefreshElement","TopNavMenuElement","IsolateNavMenuElement","LibraryNavMenuElement","ClassNavMenuElement","__$devtools","__$app","ObservatoryApplicationElement","_zeroPad","frame","file","ObservatoryElement","_changes","observed","unobserved","_records","hasObservers","deliverChanges","oldValue","newValue","_observers","_value","_started","_scheduleResolve","_subs","observer","_resolve","_scheduled","_computeValue","sub","start","_delivering","_allObservables","toCheck","debugLoop","_logger","_allObservablesCount","enqueueDirtyCheck","dirtyCheckObservables","wrapCallback","wrapUnaryCallback","distances","old","math","edits","arr1","arr2","_sharedPrefix","_sharedSuffix","splice","_spliceOperationsFromEditDistances","_calcEditDistances","ops","splices","record","_unmodifiableRemoved","_addedCount","removed","_mergeSplice","records","_createInitialSplices","calcSplices","obj","_mirror","_values","_listChanges","_recordChange","_notifyChangeLength","_listRecords","deliverListChanges","projectListSplices","isInsert","isRemove","notifyChange","_getObjectProperty","_maybeHasGetter","_hasMethod","_maybeHasSetter","_safeSuperclass","validate","_pathRegExp","_isValid","_updateValues","_segments","_setObjectProperty","_observePath","_observeIndex","PathObserver","computeValue","_isPathValid","_updateObservedValues","_changeRecordMatches","_preventFlashOfUnstyledContent","style","head","_veilElements","Polymer","_ready","_waitSuper","w","_getPublishedProperties","meta","_hasSetter","getter","platform","shadowCss","sheet","jsSheet","_sheetLog","_typesByName","_waitType","waiting","_forNodeTree","child","attr","originalPrepareBinding","_shadowHost","_findMethod","receiverMirror","scope","_requestAnimationFrame","_getCoreType","dirtyCheckZoneSpec","dirtyCheckZone","_initPolymerOptimized","_registerCustomElement","_loadLibraries","customElementsReady","_loadLibrary","_discoverScripts","scripts","_rootUri","reference","_removeDotSegments","_merge","uriPath","_loaderLog","lib","_maybeInvoke","PolymerDeclaration","_super","templateBind","nodeBindFallback","waitingForType","waitingForExtendee","_supertype","_declarations","publishAttributes","_publish","_publishLC","_lowerCaseMap","inferObservers","accumulateInstanceAttributes","addAttributeDelegates","_eventDelegates","cacheSheets","cacheStyles","installLocalSheets","cssTextToScopeStyle","cssTextForScope","_shimShadowDomStyling","templateContent","registered","registerType","_notifySuper","extendee","decl","superDecl","attrs","_getProperty","_instanceAttributes","findNodes","_sheets","_styles","_cssTextFromSheet","content","sheets","styles","StyleElement","_observe","properties","registerWhenReady","blackList","delegates","matcher","MirrorSystem","_eventTranslations","prepareElement","localName","_declaration","observeProperties","copyInstanceAttributes","takeAttributes","addHostListeners","_preparingElements","parseDeclarations","cancelUnbindAll","asyncUnbindAll","declaration","parseDeclaration","elementElement","lightFromTemplate","shadowFromTemplate","_shadowRoots","syntax","append","marshalNodeReferences","createShadowRoot","applyAuthorStyles","$","attributeToProperty","propertyForAttribute","_inferPropertyType","publishLC","serializeValue","NodeBinding","_bindLog","inA","reflectPropertyToAttribute","bindings","_unbound","_unbindLog","_unbindAllJob","unbindAll","job","_timer","complete","_propertyObserver","unregisterObservers","_unbindNodeTree","observe","observeArrayValue","changes","notifyPropertyChanges","valuePairs","_observeLog","unregisterObserver","_eventsLog","addNodeListeners","hostEventListener","_reverseEventTranslations","dispatchMethod","_invokeMethod","nodeBind","publish","pair","_findController","ctrlr","p","isOptional","_node","_sub","_lastValue","_property","_observer","_PolymerBinding","_propertyValueChanged","PolymerElement","polymerCreated","stop","_callback","_typeHandlers","handler","JSON","def","prepareBinding","_tokenizer","_tokens","_advance","_parseExpression","isSemanticTemplate","prepareInstanceModel","globals","_converter","assign","_scope","_Binding","expr","vars","StreamBinding","op","filters","ident","notAssignable","l","eval","__modelMirror","model","_variables","getMemberMirror","_modelMirror","memberMirror","update","_updateSelf","_invalidate","_parent","visitExpression","visitInExpression","visitEmptyExpression","visitParenthesizedExpression","visitGetter","g","visitIndex","i","arg","visitInvoke","visitLiteral","visitMapLiteral","visitMapLiteralEntry","visitIdentifier","visitBinaryOperator","visitUnaryOperator","invoke","accept","entries","_UNARY_OPERATORS","_BINARY_OPERATORS","receiverValue","identifier","call","EvalException","_JenkinsSmiHash","Index","Invoke","_listEquals","_hashList","entryValue","item","_token","Expression","_astFactory","_parseUnary","_parsePrecedence","_parseArguments","_parseIndex","_makeInvokeOrGetter","_parseBinary","_parsePrimary","_parseInvokeOrIdentifier","_parseString","_parseInteger","_parseDecimal","_parseMapLiteral","MapLiteral","Literal","IndexedValue","Mirror","classMirror","kind","tokenizeString","tokenizeIdentifierOrKeyword","tokenizeNumber","tokenizeFraction","_OPERATORS","_TWO_CHAR_OPS","_PRECEDENCE","_GROUPERS","_sb","_KEYWORDS","ParseException","ResponseViewerElement","Script","__$script","__$pos","__$lines","_updateProperties","script","lines","ScriptInsetElement","ScriptRefElement","__$showCoverage","showCoverageChanged","line","ScriptViewElement","_upgradeObservableMap","_upgradeObservableList","ServiceObjectOwner","VM","_serviceType","_loaded","__$name","__$vmName","reload","immutable","_inProgressReload","_isolateCache","__$version","__$architecture","__$uptime","_currentObjectMatcher","_currentIsolateMatcher","_parseIsolateId","_parseObjectId","_getIsolate","_cache","getAsMap","getString","_updateIsolates","isolateMap","oldIsolateCache","newIsolateCache","_isServiceMap","errors","ServiceError","exceptions","ServiceException","_sum","counters","old_counters","_seconds","_countersLength","_historySize","snapshots","snapshot","_maxSnapshot","__$pausedOnStart","__$pausedOnExit","__$running","__$idle","codeTable","codeRegion","_resetProfileData","_updateProfileData","profileTrieRoot","_processProfileTrie","_processCoverage","coverageList","coverage","__$rootLib","ObservableMap","__$topFrame","__$mainPort","__$entry","__$newHeapUsed","__$oldHeapUsed","__$newHeapCapacity","__$oldHeapCapacity","__$fileAndLine","DartError","_upgradeCollection","timers","timerMap","CodeTrieNode","_trieDataCursor","_trieData","_readTrieNode","__$totalSamplesInProfile","exclusiveTicks","inclusiveTicks","__$formattedInclusiveTicks","__$formattedExclusiveTicks","callers","callees","addressTicks","scriptCoverage","timer","canCache","__$message","__$exception","__$stacktrace","_tokenToLine","_url","_shortUrl","_processSource","_parseTokenPosTable","_tokenToCol","load","hits","scriptHits","sourceLines","address","tick","CodeKind","__$objectPool","calls","codes","profileData","_resolveCalls","_processTicks","vmName","startAddress","endAddress","_processDisassembly","instructions","__$hasDisassembly","disassembly","profileTicks","_sumCallCount","_callCount","caller","count","ServiceErrorViewElement","ServiceExceptionViewElement","HttpRequest","HttpVM","_outstandingRequests","_requestSerial","DartiumVM","messageEvent","_messageHandler","__$object","objectChanged","_constructElementForObject","ServiceObjectViewElement","__$internal","url","hoverText","ServiceRefElement","__$checked","__$checkedText","__$uncheckedText","input","SlidingCheckboxElement","__$frame","StackFrameElement","__$trace","trace","StackTraceElement","_checkboxEventType","_InstanceBindingMap","_getBindings","_SEMANTIC_TEMPLATE_TAGS","_createInstanceBindingMap","templateBindFallback","_processBindings","_addMapBindings","_getTreeScope","_parseAttributeBindings","_parseMustaches","tokens","delegateFn","bound","_MustacheTokens","delegate","NodeBindExtension","_expando","_eventSub","_getStreamForInputType","nodeValueChanged","conditional","select","selectBinding","div","checkbox","fired","InputElement","_getAssociatedRadioButtons","checkedBinding","treeScope","radios","SelectElement","_cancelMutationObserver","_tryUpdateValue","_onMutation","_toInt","_bindings","binding","TemplateBindExtension","_scheduleIterator","_stagingDocument","_ownerStagingDocument","_deepCloneIgnoreTemplateContent","_addTemplateInstanceRecord","_model","BindingDelegate","_bindingDelegate","_decorate","_templateInstanceRef","_content","_templateIsDecorated","_injectStylesheet","_extractTemplateFromAttributeTemplate","templateElementExt","doc","_getOrCreateTemplateContentsOwner","_liftNonNativeChildrenIntoContent","bootstrap","stagingDocument","clone","template","_contentsOwner","d","_bootstrap","descendents","_initStyles","_ext","_combinator","_singleCombinator","_listCombinator","resolve","depsChanging","_valueSub","hasRepeat","hasBind","_valueChanged","repeatModel","bindModel","repeatPath","bindPath","hasIf","ifModel","ifPath","valueObserver","iteratedValue","unobserve","_listSub","_handleSplices","_templateExt","terminators","subIter","getTerminatorAt","instanceNodes","_templateElement","previousTerminator","_BoundNodes","closed","_initPrepareFunctions","_instanceModelFn","_instancePositionChangedFn","instanceCache","extractInstanceAt","insertInstanceAt","closeInstanceBindings","valueFn","r","unbind","TextAreaElement","_pathSub","valueChanged","VMRefElement","__$vm","VMViewElement","globalThis","globalWindow","globalWorker","globalPostMessageDefined","thisScript","computeThisScript","noSuchMethodPattern","extractPattern","provokeCallErrorOn","notClosurePattern","nullCallPattern","nullLiteralCallPattern","undefinedCallPattern","undefinedLiteralCallPattern","nullPropertyPattern","provokePropertyErrorOn","nullLiteralPropertyPattern","undefinedPropertyPattern","undefinedLiteralPropertyPattern","validationPattern","_dynamicType","_voidType","computeLibrariesByName","computeMangledNames","computeReflectiveNames","_safeConsole","_DART_OBJECT_PROPERTY_NAME","_DART_CLOSURE_PROPERTY_NAME","_freeColor","_pageSeparationColor","objectType","_spacesRegExp","_objectType","bindPattern","_polymerSyntax","veiledElements","_libs","_allTemplatesSelectors"],
+  "mappings": "A;A,a,kB;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,C,I,C,Y,C,C,G,C,a,C,G,C,oB,C,G,C,Y,C,G,C,Q,C,G,C,iB,C,G,C,Q,C,G,C,U,C,G,C,c,C,G,C,a,C,G,C,gB,C,G,C,S,C,G,C,kB,C,G,C,a,C,G,C,iB,C,E,C,M,C,G,C,iB,C,G,C,iB,C,G,C,M,C,G,C,U,C,G,C,S,C,G,C,O,C,G,C,gB,C,G,C,kB,C,G,C,c,C,G,C,S,C,G,C,G,C,G,C,S,C,G,C,qB,C,G,C,O,C,G,C,Q,C,G,C,gB,C,G,C,a,C,G,C,gB,C,G,C,Y,C,G,C,Y,C,G,C,gB,C,G,C,kB,C,G,C,Q,C,G,C,kB,C,G,C,Y,C,G,C,c,C,E,C,O,C,G,C,W,C,G,C,a,C,G,C,Y,C,G,C,U,C,G,C,W,C,G,C,kB,C,G,C,M,C,G,C,S,C,G,C,W,C,G,C,M,C,G,C,O,C,G,C,S,C,G,C,gB,C,G,C,U,C,G,C,Y,C,G,C,W,C,G,C,W,C,G,C,S,C,G,C,U,C,G,C,M,C,G,C,Q,C,G,C,kB,C,G,C,c,C,G,C,a,C,G,C,e,C,G,C,S,C,G,C,iB,C,E,C,G,C,G,C,S,C,G,C,M,C,E,C,G,C,G,C,oB,C,G,C,a,C,G,C,S,C,G,C,a,C,G,C,iB,C,G,C,gB,C,G,C,S,C,G,C,S,C,G,C,gB,C,G,C,sB,C,G,C,kB,C,G,C,Y,C,G,C,U,C,G,C,Q,C,G,C,S,C,G,C,a,C,G,C,Y,C,G,C,Q,C,G,C,Q,C,G,C,gB,C,G,C,Q,C,G,C,U,C,G,C,c,C,G,C,W,C,G,C,a,C,G,C,S,C,G,C,Y,C,G,C,W,C,G,C,Y,C,G,C,Y,C,G,C,K,C,G,C,c,C,G,C,iB,C,G,C,a,C,G,C,Q,C,G,C,M,C,G,C,Q,C,G,C,c,C,G,C,M,C,G,C,O,C,G,C,c,C,G,C,c,C,G,C,U,C,G,C,U,C,G,C,Y,C,G,C,O,C,G,C,I,C,G,C,a,C,G,C,c,C,G,C,oB,C,C,I,C,kB,C,C,E,C,yB,C,E,C,qB,C,E,C,iB,C,E,C,kB,C,G,C,yB,C,E,C,c,C,G,C,oB,C,E,C,gB,C,G,C,0B,C,E,C,kB,C,E,C,yB,C,E,C,sB,C,E,C,Y,C,E,C,qB,C,E,C,a,C,E,C,oB,C,E,C,e,C,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A,E,mB,uB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,O,C,C,A,E,iB,qB,A,A,C,C,C,C;A,G,C,E,C;A,C,C,CAuDAA,YAOE,cACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAUAC,kBAiCE,+BAEF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAWAC;;0BAKMC;kCAKO;UAEW;UACD;;SAGjB;gBASM,KAAA,+CAIQC;WAEhB,WAGF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CA2BAC;;WACqD;GAEnD;MAAwBC,sBAAF,AAAJ;GACP,MAAGA,MACV,SAEJ,AACA,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC;EACcC;WACO;;;EAEF;8BAAjB;MAAOF,MACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQAG;EACcD;WACO;;;EAEY;8BAE/B;MAFqBF,SAGvB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CA2DEI,cAAwB,aAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEjDL,YAAiB,MAAGM,SAA+B,A,C;A,E,C,CAEnDC,YAAkB,MAAGD,SAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEpDE,mBACQ,KAAA,OAEFC,QACAA,QACAA,eACN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAC,YAAqB,gBChEPC,cDgE8B,A,C;A,K,C,I,C;A,G,C,4I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAU5CJ,YAAkB,iBAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAIrDP,YAAiB,uBAA2C,A,C;A,G,CAE5DU,YAAqB,YAAO,A,C;A,O,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CAa5BL,cAAwB,eAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGjDE,YAAkB,aAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAE3BP,YAAiB,SAAI,A,C;A,G,CAErBU,YAAqB,YAAO,A,C,C;A,G,C,C;A,G,C,K,C;A,G,CAwC5BV,YAAiB,SAAI,A,C;A,G,CAErBU,YAAqB,YAAW,A,C,C;A,E,C,C;A,G,C,M,C,C;A,E,C,C;A,G,C,M,C,C;A,C,C,C;A,G,C,U,C;A,C,C,CEnRhC,uCAJU;UAOV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAE,iBAEY,KAAa,GAAGC;yBAXlB,gBAeR;wBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,mBAEY,KAAa,EAAEA;yBApBjB;gBAyBV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA,yCA3BU,iBA6BRC;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAaAT;yBA3CU,cA6CR;QAAkB,EAAE,gBACN,KAAR,sBAEF;SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYAU,cACE,kCACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMA,mBACE;MAAA,QAAA,OACE,SADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,YACEF,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,cACE,MAAOC,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC,cACE,uCACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAR;EACsB;;mBACpB;QAAkB,EAAE,oBACL;uBAAbS;OACF,AACA,iBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAUAD,cACE,MC6xBO,qBD5xBT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA0BAH,uDACE;MAAO,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAK;GAGY,KAAa,EAAEJ,cACjB,KAAA,SAA+BA;aAG/BA;;GAGE,KAAe,EAAEA,cACjB,KAAA,SAAiCA,oBAGzB,2BAClB;sCAEF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAE,gBC0xBEG,WDzxBA;MC2xBO,kBD1xBT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CAEAN,eACa,AAAPC,WAAY,MAAO;mCAEzB,A,C;A,G,CAEAD,kBACMC;GAAO,IAAK,MAAO,GAAY;mCAErC,A,C;A,E,C,CAQA;yBAlLU;EAoLa;;GACX,UAAa,cACf,KAAA;;GAEA,UAAe,cACf,KAAA;oCAERM;aAI0B;oCAC1B;UAA6B,GAAO,MACtC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,+CAzMU,iBA2MRL;gBACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAYAT,cAA4B,MAAGS,WAAoC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMnE,yCA9NU,YE9CRM;SAAuB,AAATC,cF+QhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAMArB,gBACE,MCosBOmB,YAAoCH,UDnsB7C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAhB,gBACE,MCqsBOmB,UADgC,AAAZH,YDnsB7B,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAX,mBACE;QAAkB,EAAEQ,gBACN,KAAR,QAAkB,QACxB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAR,YAAiB,MAAGQ,cAAW,A,C;A,G,CAE/BR,YAAoB,MAAG,AAFHQ,cAEW,A,C;A,E,C,CAE/BN,YAAkB,MAAGO,iBAAwD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAE7EG;KAEI;;mBAEA;UAEJ,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,CAIAK,YAAyB,uBCjCaC,8BDiCe,A,C;A,G,CAErDvB,YAAiB,MAAGM,SAA+B,A,C;A,E,CAEnDN,YAAe,gBAAoC,A,C;A,E,CAEnD;GAEgB;yBAxQN;WA2QV,A,C;A,C,C,CAEAY;GAEY,GAAGC,UAAgB,SAAW,KAAA,OACxC;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,2CAzRU;;GA4RE,GAAGA,UAAgB;OAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,O,C,I,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAvVAW;2CAGkC,SACxB,KAAA;;mBAER;SACF,A,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C,C;A,C,C,C;A,G,C,S,C;A,E,C,CGVAxB;;GAEW,IACP;QACc,IACd;2BAGqByB;GACfC,gBAA2B;GAC3BA,YAAY,QAChB;SAEF,8BAEID,YACF,QAEF;cAEA,SAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEApB,YAAoB,aAA4B,AAAR,MAAmB,IAAG,A,C;A,G,CAE9DA,YAAe,gBAAgC,A,C;A,G,CAO/CA,YAAkB,mBAAmC,A,C;A,E,C,CAErDsB,cAGE,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASA3B;GACW,gBAAsB,cAC7B;kBA0B8B,8BAvB9B;gBAGI,KAAA,WACR,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKAA,YAAY,MAAG4B,SAAAA,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMtCC,eACW,IACP;KAEA,qBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAmBAtB;GAG2C,UACjC,KAAA;;UAGSmB,YAAY,WAC7B;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA8BAnB,iBAEY,KAAa,UAAY,KAAA,QACnC;qBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAA,4BAEI;KAEA,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAP,YAAiB,oBAAoC,A,C;A,C,C,CAErD2B,YAAiB,SAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE1CA,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA;;;SAImB;GACN,IAAK;GACU,IACxB,MAAc;KAEd,MAAc,KAElB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAIAA,uCAE6C,OAAe,OACxD;6CAEA;MAYK,eAVT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA,cACE,sBAEM,aACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAYAA,iBAE4B,0BAC1B;uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA,cAGE,uBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA;GAG4B;GAKE;OAMwB;WAVpD,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA;GAC8B;OAMwB;WANpD,SAOF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAmBAA,2DAEE;gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAOAA,0CAC2B,KAAA,OACzB;gBACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAtB,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,0CAC2B,KAAA,OACzB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEAA,2DAEE;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,M,C,I,C;A,M,C,C,G,C,S,C,C,C;A,E,C,C;A,G,C,Q,C;A,G,CA4EAK,YAAqB,YAAM,A,C;A,S,C,I,C;A,M,C,I,C;A,M,C,I,C,C;A,E,C,C;A,G,C,W,C;A,G,CAO3BA,YAAqB,YAAS,A,C;A,S,C,I,C;A,M,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,K,C,C;A,C,C,C;A,G,C,Y,C;A,C,C,CC1X9BV,6DAC2B,KAAA;GACf,SAAW,KAAA;GACX,GAAGa,cAAc,KAAA,OAC3B;uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAE,cAEE,MAAOe,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC;GACY,KAAa,EAAEC,cACjB,KAAA,SAA+BA;EAE3B;EAAcA;GAAF,AAAd,MAA+B,MAEzC;QAAkB,WACY;GAjBpB,SAAW;GACX,UAAiB;;GAAjB,UAAiB;GAgBQ,oBAC/B,OAEJ,AACA,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,C,C,CAEAzB,0CAC8B,KAAA,OAC5B;WACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAF;EAEoB4B;EACApB;GAAF,IAAU,QAC1B;WAAgBqB,UAAiB,KACnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA3B,gBAEE,MAAO4B,aACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAiBAlB,cAGI,kBAOJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAZ;GAEyB,EAAE,cACjB,KAAA,SAA+B;0BAKhB,EADH4B;GAEL,EAAEpB,SAAQ,QACvB;4BAEF,MAA0C,AAAnCuB,mBACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA7B;+CC27BQ;aDz7B2BM;+CCy7B3B;;GDv7BS,cAAY,KAAA;GACZ,cAAkB,KAAA;GACpB,OAAEA,eAAc,KAAA,OAC7B;wBACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAN,YACE,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAmEAA,yBAKE;MAAoB,aAAF,SAtKR;;mBA0KJ8B;WAKN,SAC+B,QAK/B;kBAC0C;GAvLhC;GACA;;mBAyLJA,oBAKN,gBACgD,QAChD;wBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMArC;;GAGY,KAAa,EAAE,cACjB,KAAA,SAA+B;uBAGrC;;+CEjBGsC,SFsBH;kBE5EkCC,WF8EpC,MAAyB,aAAH,YACe,AAA/BH,kBAAwC,QAC9C,AACA;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEApC;EAGYa;0BAQIoB;;EAAe;GAAF,AAAf,QACY,GAEtB;;GAEF;;KAAsB;GACe,AAA/BG,kBAAwC,aAC9C,AACA,SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA/B;GAEmC,EAAE,cAC3B,KAAA,SAAoC,UAE5C;MAAOmC,aACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,E,C,C,C,C,C;A,G,CAEAnC,YAAiB,MAAGQ,cAAW,A,C;A,G,CAE/BR,YAAoB,MAAG,AAFHQ,cAEW,A,C;A,E,C,CAE/Bb;;;eAEE;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAO,YAAkB,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAQzBP,qBAIE;MAAoBa,iBAAF,WACE,UAAQ;EACR,UAAQ,GAAuB,AAAA,CAAR;QAE3C,EACkB,UAAQ,GAAuB,AAAA,CAAR;QAEzC;MAAkB,WAAQ,GAAuB,AAAA,CAAR,kBAC3C,A,C;A,G,CAEAH,YAAqB,YAAS,A,C;A,E,CAE9BV,YAAe,gBAA+B,A,C;A,C,C,CAE9CO;GAEY,GAAGM,UAAgB,SAAW,KAAA,OACxC;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,S,C,I,C;A,M,C,C,E,C,CA/KA4B,eAGe,iFAUP;QAEA,mNAuBF;QAEA,UAEN,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C,A,E,mB,uB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CGnJFC,oBACeC,SACbC,AAAAA;wBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAcA;;;;GAIMA,yBAAuB;;EA8KZA,IAAAA;KAA0B;EAGE;EAGhB;;2BAQQ,aAML,0BAiF5BC;QACAC;SAlRFF;qBAMAA;;;EAEIG;KACFC;OACSD;KACTC;KAEAA,UAEFJ,AAAAA,yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6ZEH;GAEoB,QAChB;mEAEmB,MAAOQ;yDACF,qBAC1B;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAMAR;;;gBAa6B,KAAA;GAaf,QAAS;;GAOT,QAAS;KAEf,KAAA,0CACR,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAaAA;EACYS;;OACFC,8BAEJP,oBAAgCO;EACVA;UAEhBP;EAEKO;EACGD,KAAoBC;EACjBA;EACHD,KAAoBC;;EA5UzBP,IAAAA;KAA0B;EAGE;EAGhB;;2BAQQ,aAML,0BAiF5BC;QACAC;SC0NwBM,AD/LxBC,AA6MIT;2EASAA;qBACAA,AAAAA;;;qBAGaO;EAAqBA;EACrBA;EAAaA;EACbA;EAAmBA;;;;;EAqLrBP,IAAAA;KAA0B,GAEzCU;eACAV,AAAAA;;cACuCW,KFm6BlCC,yCE55BUD,uBAEJA,yCF05BwB;;iBEvlCtB,AAFOJ,oBAGdA,KAAAA,cAAiBA,aAEnBP,AAAAA;;;YAGAA,AAAAA,yBAA6BU;aAE7BV,AAAAA;;;UAGAa,KAAKN;;eAGDP,4BACFA;EACIW,KFukCLC,iCAA8B,gCExkC7BZ;;yBAGAc,KAAMP;;iBAIFA,KAAAA;UAEZ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGAV;GACMG,4BACFA;EACIW,KFyjCDC,+BAA8B,gCE1jCjCZ;;4DAGA;;KAGQ,KAAA,UAGZ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA0VFW;GA9yByBI,kDAk0BKC;mBAlB1B;MAAO,oCA8CeA;mBA5CtB;MAAO,UAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAV,eAvzByBS,yBAyzBrB,MAAO;KAGP,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAkMElB,YACE,+EACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6FAA,YACE,+EACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAxrCmB,WAAKM,kBAAW,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEhB,WAAKA,uBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,4C,C;A,E,CA8GzCc;;;gBAeEC;;QAFoC,SAIgB;SADpDH;SAEAI;WAAsC,EAhBtCC;iBA4KkC,kBA3KlCC;QAAW,8BACXC;QAAW;GACPJ,0BACFK;;;;yCAGJ,A,C,C;A,E,C,C;A,G,C,mC,C;A,E,C,CAoEA,iBACsB,CAAA,AAAhBC,eAAqC;GACrCC,AAAAA,gBAA2B,CAACC,QAC9BA,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;GACM,CAACA,QAAU;EACfD,OAAAA;;GEunCkBE,UFrnChB,MAAMC,UP+DU3D,SAEG,sBOjEb2D;EACkBA;EA+F1BnB,AA9FIT;EC4RK6B;EAAcC;EAAAA;EAAH,CAAA,AAAL,IAAsB,QAArCD;;mBAAuBC,SACvBA;;OACaC,KAAOC,MACpBC;KAAkB,AAAlBA,OD9RE,AACAP,YAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA9D;EACYoC,mBACVA;;EAauBkC;;MATZC,mBAETnC;GACQ,UAMakC,QAJvB,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMA;OACUE,sBAEJC,QAASD,SAAYA;;aAGrBE,QAAYF;;QAGZtB,iCAEN,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAyB,YAAsC,MAAGC,AAAAA,gBAAa,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEtD,oBACMA;GAAAA,aACI,KAAA,sDAERA;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBAC,iBAE0BC;GADY,AAAnB,AE8LDf,AF9LZa,WE+iCYb,AF/iCG1B,aACjBD,AAAAA;KAEAA,AAAAA,4BAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CAyBA2C;EACMlC;EC8CcoB;OAASE,KD9CP,MCkMpBE;KAAkB,AAAlBA;EACWH;;cAAAA;EAAAA,IACXA;SACAD;KAAoB,CAAA,AAAL,IAAsB,QDpMrC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAmBApE;EACgBmF;eAjBe,AAAzB5C,2BACGA,AAAAA,uBAAkCA,AAAAA,yBAClCA,0BEyJW2B,AFxJX3B,AAAAA,mCAQC;;GApKJkB,WEoTcS,AFnTXN,aACAD,AAAAA,eACLG;EAAwBZ,KFi8CrBC,yBAA8B,gCEj8CjCW;;oBA2KA,SAEFsB,MACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMA,cACmB,aAMfC;KAGA,KAAOC,YAAiB,CAE5B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKA;GACM,AAAC/C,yBACHgD;SAGEA,qBADF;;;EAGEhD;EAAqCW,KFovCpCC,kDAA8B,gCEpvC/BZ;;qBAIN,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAzBI,cACM,CAAC+C,YAAgB,MGnUzB;gBHqUE,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,C,CAiCJ,cACMhD,AAAAA,eACFA,AAAAA,AAAAA,wBACA;OAEFA,KAAAA,QAAakD,SACf,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,M,C,CAoHiD;;;;EAzgBdjD;EA6qBJkD,IF/Q7BC;KAAwB,YACxBC;KAAsB,YEgRtBC;gCACcH,KAmMqBlD,AAAAA,wBAlMrBkD;GACV,YACFI;;EACSA;KACTA;OACSA;KACTA;KAEAA,aA9KE,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,E,C,CAmPN;;EAEwCC;EAAtBvD,AAAAA;WACK;EACjBwD;GAAAA,QAAwB;EASwB,AAA5BxD,2BACc,AAA/BA,AAAAA;;SAGCW;GAEJZ,aACFA,SACA;SAEFC;mBC1RwBQ,AD/LxBC;4CAieF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEAhD;;QAA4B;iDACV,KAAb+F,QAAgBnE,MAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAExCjC,YAAiB,MAAGoG,MAAAA,SAAgB,A,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAbS;EACpCA;GAAD,CAACA;IAEKlD,UAERkD,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,C,CAkBF;EACwB7C,KFq0BjBC,+CAA8B;GEh0B/BZ,0BAGFA,AAAAA;2BAG2BA,AAAAA,wBAAsByD;GACrC,0BAIhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEAhG;;QACE;iDACe,KAAVgG,QAAapE,OACF,KAAXkE,QAAclE,OACC,KAAfqE,QAAkBrE,MACzB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAEoB,KAAVqG;EAA+B,KAAXF;EAAmBG;6BAAAA,OAA/C;MAA6C,CAAA,AAApB,WAC3B,A,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA2BA;GACMC,QAAW,MACfA;UACAC;;EACA5D;EAAuC6D,OA5jBvCrB,AAAAA;YACAvC,AAAAA;YACAwC;OA2jBF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,iBACMkB,QAAW,MACfC;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAmEAE,yBAC8B,kBAaR9D,oBAChB+D,KAAiBA,KAAAA;aAbK,kBAiBNA,KAAgBA,KAAiBA;6CAfvD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,yBAEI,oBAAsBC;kDAG1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAiBAH,yBAC8B,gBAaCC,KAAmBA;aAZtB,gBAiBtBA,KAAiCA,KAAjBA;6CAftB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,yBAEI,gBAAoCC;kDAGxC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAcAC;;EACkB9F;EACAA;EACIA;GAGN,OAAG4B,wBACDA,AAAAA;WACO;EACHD;WACO,MACzB;0BAEA,uBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAoE,YACE,gBAAoC/F,WACtC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,C,C,CAOAgG,cACE,6CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAGA,gBACEC,AAAAA;wCAEF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,YAEEA,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA,oBACE;MAAyBA,AAAAA,mBAAiB,WACrBA;qBAAAA,SAAAA;8CACrB,AACAA,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CAoCAD,cAAuB,OAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAC9B,iBAAyC,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEzC,aAAe,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CACf,WAAA,OAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAWjBE;GACMC,QAAgB,MAAOC,WAC3BxD,AAAAA;;;MAGWyD,mBAETzD,AAAAA,aAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAyD;2EAGsB,MAAOD;;uEACZ,MAAOE;4CACR,MAAOC;4CACF,MAAOb;4CACL,MAAOE,WAG5B;MAAOY,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQAA,gFAGA,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAWAJ,YAAkB,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEtBnG;EACc2C,AAAAA;GACH,QAAS;;EAER5C;6BAAAA;;mBAIV4C,AAAAA;gBACA;mBAAkB,WACNyD,QAAUrG;uBAApByG;OACF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC;;EACa9D,AAAAA;;GACF,QAAS;EAGX;KACPA,AAAAA;gBACA3D;wBAGA;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAyG,YAA0B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3DE,YAA8B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CARjD,0BACVa;cAAKJ,QAAkBA,SACzB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAaFD,YAAkB,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEtBE;EACe1D,AAAAA;GACF,QAAS;EAEX+D,OAAAA;QAAc,GACvB/D,AAAAA;gBAGA;gBAFcgE,YAGhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAL;EACe3D,AAAAA;GACF,QAAS;EAEX+D,OAAAA;QAAc,GACvB/D,AAAAA;gBAIA;eAHWgE,QAAe3H,KAAAA,WACb2H,QAAe3H,KAAAA,YAG9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA2H;;EACY5G;IAGG;;6BAHHA;GAIV;KAAkB,WACJqG,QAAUrG;8BAAtB6G;OACF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAnB,YAA0B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3DE,YAA8B,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAa/DkB,eACMX,QAAgB,QAEpBY;QAAgB,8BAChB;MAAOC,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAA;2EACsB;;OAEZnB,sBAWCA,QAVK;MAWDkB,AAAAA;WAVE,MAAOE;UACR,MAAOC;eACF,MAAOC;iBACL,MAAOC;QACjB,MAAOC,aAEpB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CASApH;;EACW4F;EAEOA,QAChBkB,AAAAA;;;EACUO;6BAAAA;GACV;KAAkB,QAChBA,QAAcN,QAAmBM,UACnC,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAZ;EACe;;EACJb,QACTkB,AAAAA;;EACYlB;EACEA;;EACJ0B;6BAAAA;;GAEV;KAAkB,QAGhBV,MAFUG,QAAmBO,UACjBP,QAAmBQ,UAEjC,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAMAH,sDAGA,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CA8DA;;GAqBoD,uBAnB5CI,aACI,KAAA;EAEJC;WAAiB;EACrB9F,mBAAAA;KAA0C,AAA1CA;GACI+F;uBAKJD;uBAEM,KAAA,2BAEV,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAtEAE;oCAE2ChG;;MASvC8F;EAQA9F;EACIA,mBCjzBkBQ,AD/LxBC;+CAi/BEoF;;GAsDgD,sBA7ChD7F,mBAAAA;KAA0C,AAA1CA,MACA8F;qBAEaG,sCAIP,KAAA,+BAEV,A,C;A,M,C,C,E,CAvCAD;;SAuCA,A,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAnCI,WACEF,cACAI;gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAiBA,WACEJ;MACA9F,mBAAAA;KAA0C,AAA1CA,MACAkG;gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CA+DJ9I;EAIayG;;EACE;EAAc;6BAAA;EAAR;EACW,AAAhB,CAAN,AAAA,SAAc,AAAA;EAEJ,AAAL,CADR,CAAA,EAAQ;EAGQ,AAAR,CADR,CAAA,EAAQ,2BAGb;MADK,CAAA,EAAQ,YAEf,A,C;A,C,C,CAEApG;;YAC8B;;+CAEToG;EAAKxE,IAAtB;6BAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C,A,E,c,kB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CF33CF5B;GACa;GAEE,QAAS,iBAEtB;gDACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,C,C,CAEAE;uBACuB;2BAET,MAER,0BAGF;eAEA;gBAEA;EAEQwI;4BACgB,KAAA,OAC1B;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAoBA,iBACQ,KAAA,sGAER,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAqWEtG;;kBAME,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAIAA,iBACQ,KAAA,SACR,A,C,Q,C,I,C,C,C,C,C,E,C,E,C,C,C,C,C;A,E,C,CAEAA;;;;eAec;;GACY,AAAhBuG,WAEF;;GAEsB,AAApBA,WAEF,qBAEF;MAAOC;GAIC,KAAa,UACf,KAAA;GAEE;EAC+B,AAApBD;KAEjB;KAEQ;EAAQA;QAMN,MAImB,AAAR,OAOa,AAAL,AAAR;;EAEDA;;GACpB;YAAoBE;6BAAAA;KAAF,UACIA;;GACS,AAAzBA,WACF,MAAOD,iBAEX,cAIa,MAAOA,YAC1B;qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAxG;;;GASM,kFAIF,MAAOwG;;eAIOE;qCAEZ,QAEF;MAAOF,aAET,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAxG;OACwC9C;;;GAWxByJ,gBACLA;EAEeC,OAAxB;cAnBoBC,eAoBtB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA7G,YAEE,sBADc8G,YAEhB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAwDA9G;EAGY+G,QACV;MAEU,gBAFQ;OAMK;EAAY;oDAInC,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA/G;;;aJ3WsClB;8BI6WpC;KAAA,UJ3WekI;+CI4WQ,KAAA;GACf,SACJpI;QACW,YACXA,OAAa,OAA0B,AAAP,QAAX,kBACrBA;OAAa,OAAK,mBAEZ,KAAA,QAEV,AACA,MAAOqI,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAjH,mBACE;sBJ5XoClB,8BI4XpC,UJ1XekI;+CI2XQ,KAAA;GACf,SAAW,KAAA;GACX,QAAU,MAAOE,SACzB,AACA,MAAOD,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6CAjH;;;;;;;EAWsB;;aAUV,qBACA;;GAGA,UAAc;;qBAAO;mBAC/B,SACF,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAaAA,+CAGOmH,KAEL;cACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA+DAnH,+GAIE;YACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;OAKA,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;;;;;GAO0B,aACR,EAAGoH,QACjBC;;GAIiB,SAAW,CAACC,SAC7BA,uBAUF;MAAOC,mDAOT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAvH;;GAGqB,SAAW,CAACsH,YAGXpK;WAIhB,MAAOsK;EAGa;YACF,CAACC,KACnB,MAAOD;EAKe;EAKpBC;GAA4B,IAAGL,SACjC,MAAOI;EAGc,8BACvB;MAAoBC,OA9gB4BC,SA8gB9B,WACyB,GAGzCC;8CADgBF,YAElB,MAEAH;;OASE,MAAOE,YAGTJ;OAA2BO,SAC3B;;EAOc,EAAGP,QACjBC;;;WAUA,MACIG,YAKN;oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAxH,2BAG8C;YACH;eACG;YACH;aACC;aACA;aACA,WAC1C;0BACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAgBAA;UAOE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,C,C,CAcF4H,iBACQ,KAAA,QACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CASAC,yBACwBV;0CACHS;KACb,KAAA,QACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,C,C,CA6CAE;;;;;8BAoBE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAC,WAGE,MAAOC,0BACT,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAQAC;;;;;;QAEA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAgZAC;;WAgBkB;uBAC6B;wBAG3C,MAAOC;QACE,kBACT;;;EAgByB;IACa,AAAP,4CAO3B,MAAOA,UACH;4CAGJ;MAAOA;;;;;;;;;;;EAiCEC;GAA8B,QACzC,MAAOD,UAAe;OACJE;GAAoC,wBAMtD;MAAOF,UAAe,kBACJG;cACAC;cACAC;cACAC;cACAC;cACAH;cACAI;cACAC;EAA8C;6BAChE;MAAOT,qDAMT;MAAOA,2EM9kDyC,6BNolD9C,iBAMF;MAAOA,2IAQL,iBAOJ;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAwBA5K,2CAEI,MAAOsL;KAEP,MAAOhL,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAUAkD;UAKE;QAAa,WAC4B;EACE,GACzCqE;iBACF,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA0D;GAOwB,SACpB,MAAOC;QACoB,SAC3B,MAAOA;QACoB,SAC3B,MAAOA;QACoB,SAC3B,MAAOA;QACoB,SAC3B,MAAOA;UAED,KAAA,6DAGV,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMA3C;WACuB;;OAEa;wJElqDCjG;aFqrDnC;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA+CEH;;;;;EAmBqByH,AAFG;;;;;eA0CTuB;KAAe;;;;EAUxB;;EAKWC;;;;;;MA6Bf;MAAoBC,aAAF,WACLA;;GAEM,eAEMD;QAEzB,YAIA;SACF,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAjJ;iBAII;OAQA;OAQA;OAQA;OAQA;OAQA;QAQA,iFAQJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAIAA;KACqB,MAAOmJ;;uCAGxB,MAAOC;;cAgNcC,YAArBC;;MA1M6DN;KAAe,SAJ5E;iDAOW,MAAkB;;;cAuMRK,YAArBC;;MA7LSN;KAAe,SALxB;8CASA,MAAOI,WAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEApJ;;;sBAOU,KAAA;OAEN;OAQA;OAQA;OAQA;OAQA;OAQA;QAQA,mIAUJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;;;uCAKI,MAAOuJ;oCAGkBC,2BACHA;MACTR;KAAe,SAH5B;sCAIW,KAAiB,wDAIlB;4CAKWQ,2BACHA;MACTR;KAAe,SANxB;yCASA,MAAOO,aAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAMFE;mBAME;MAAOC,qBAOT,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAoRA;KAIQ,KAAA,KAFc7L,QACE8L,SAAsBA,WAE9C,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA0CAC;kCAGgC1M;;KAC5B,QAEF2M;UACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA+LA,iBACQ,KAAA,kDAER,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6KAC,gBAGE,4BAKF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAC;YL19EsB3L,aK69ElB,kBAEF;0BACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAUA2L,WAAoC,YAA6B,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CNlwFjE9L,YAAoC,wBAAqB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA6CzD+L,iBAGa,4BACX;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMApD,uBACsB,MACpB;0BACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAKAqD,cAGE,MAAOC,sBAAyBtD,SAClC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOAuD,sBACkBF,SAChB;yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGAG,oBACYxD,OACV;yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAmCA9I,yBAEI;6DAGA,wBAjBQ+I;6BAoBR;0DAGE,MAAOwD;KAEP,MAAOC;KAIT,OAEJ,A,C,uB,C,I,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOAxM;WAEqB;EAIG,QACtB;kBAAmC;KamEjCyM,KAA6CA;;Gb5DhC;EAGAC;8BayDbD;KAA6CA,ObxD/C,AACA,2BACF,A,C,uB,C,I,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAKAzM,8EA3EoDZ,8BA8ElD;SAAoB2J,gCACtB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAaAqD;gCA+YuCO;;+BAAAA,eA/XrC,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAcA7M;WACsB;EACJgJ;EAKE1J;cAGM,QAGxB;MAoDOwN,MAAYR,gBAnDrB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAiEAtM;oBAE8B;UAO5B;QAAkB,WACZ,CAAC+M,gBACH,QAEJ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMAC,gBAEE,MAAOH,UADaR,WAEtB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAmBArM;WACiB;WACA;EAGLgJ;EACN1J;;wBAeJ;MAAOyN,WACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAgCA/M;SAEyB;oBAEK;mBAiOM,2CA5NE;;WAEK;kBAGvC,MAAOiN,gDAKP;;;;;EAOSL;aA2MuB,qBAtMD;cACUA;GAOtC,aAA0C,GAC7C;;mBAGF;MA1JOE,MAAYR,aA2JrB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CASAtM;oBAE8B;WAEb;WAEA;;;SAQD,IAAW,iBAEX,MAAY,QAG1B;QAAkB;;GACZ,EA1BC+M,WAAmBA,WA2BtB,SAEJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA/M;WACiB;WACA;;;GAOf;MAAoBkN,aAAF,WACLA;oCAET;;;GAIE,EAjDCH,WAAmBA,WAiDS,SACnC,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA/M;GAgIoC,eA9Hc;mBA8Hd,2BA1H9B,iBA0H8B;;GArH5B,EAjEC+M,WAAmBA,WAiEqB;;;;;;;;GAsB5B,IAEjB;GAE0C,AAAzB,IACA,IAEjB;aAII,CAACI,aAAwD;GACzD,CAACA,aAEH,cAMF,QAAW;;GACL,EA5GDJ,WAAmBA,WA8GpB,SAEJ,AAKA,YAAY;;GACN,EAtHDA,WAAmBA,WAwHpB,SAEJ,AAIA,QAAY;;GACN,EA/HDA,WAAmBA,WAiIpB,SAEJ,CAOF,MAAOK,uBACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAhB,gBAGE,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CY3jBAlM,sBAOE;uDACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,C,CAEAP,YAAoC,MAAGM,SAAiC,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAKxE,+GAOA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA2EAP;EAEe2N;;GAKF,+HAAS;;GAEJ,QAAS;;cAMjBC;GACE;GAGK,+HAAS;;GAEJ,QAAS;wCAc3B;;;cAQSC;;sHAET;gCAKA;uBAIuBA;6IAAvB;sBAIA,MAAOC;gBAKD,KAAA;8BAMiBD;6IAAvB;gBAEA,MAAOC,WAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAYAA;;EAEejO;sHAEb;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C,C,C,C;A,E,C,CAGAgO,YAGE,MAAOhO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEAkO;2BAII,MAPKlO;KASL,MAAOA,qBAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,E,C,CAiBA,wBACsC,MACpCmO;OACAC;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAEA,4BAEEC;wBACAC;wBAEAC;;;;qCAUE;QAAkB,EAAEC,gBACRA;EACEC;GACF,WAEKP;GACF,gIAIf,CAKF,QAAkB,EAAEM;;EAIsB;EACP;EACJ;EACI;EACK,UAExC,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAsCA;;EAoBUE,UAJAA,UAFAA,UADAA,UADAA,UADAA,UAHAA;;;wBA0BJ,QAAkB;kCAKlB;;mBAQJZ;gBACAC;gBAEAU;iBAEF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAEAC,cAEE,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CE7YArN;;EAIesN;EACOC,QAEpB;eACiBD;eAIf1G;;EACwB;;aAItB,MAIJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEArF;uBAEI,MAA2C,AAApCoH;;+CAEeA;EP+BU6E,IO/BhC;sBAGA,MAAOxM,MAAAA,OADM2H,gBAGjB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAYAzH;2CAKQ;OAEsB;EACTyH,QACb/B;OACA;QAAkB,WACH+B;ED2K0BoD,MAA7CA;MAAAA;SCzKI,AACA,MDmLqBA,WC7KvB;;+CPlFe0B;aOsFjB;;wDAMJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,G,C,C;A,G,C,I,C;A,G,CCtGErO,YAAiB,MAAU,MAAPQ,iBAAW,A,C;A,G,CAE/BR,YAAoB,MAAG,CAFI,KAAPQ,iBAEW,A,C;A,E,C,CAE/BN,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAE3CC,gBACQ,KAAA,uCACR,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CACA,gBAAgC,MAAGA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEvDC,cAAgB,MAAGD,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CACvC,YAAa,MAAGA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CACpC,cAA6B,MAAGA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,c,C;A,E,C,CAepDvO,YACE,MAAOmI,AAAAA,uCACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAnI,mCACsB;mBACI,QACxB;MAAwByO,2BAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEAD,qCACsB;GAChB,CAACE,WAAkB,MACvB;MAAwBD,YAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cACEE,KAAAA,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjO,YACE,2CACF,A,C;A,G,CAEAA,YACE,MAAO,MAAyBiO,kDAClC,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAzBoB,YAAU,MAAS,gBAAGR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,K,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAgB1B,YAAM,MAAGS,iBAAO,eAAS,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAQA,YAAM,MAAG,eAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CA4B1D3N,YAAyB,MAAG4N,MAAAA,AAAAA,YAAmB,A,C,C;A,E,C,C;A,G,C,qB,C;A,G,CTmC/CC;EACMC;;4CAAuB;EAEJC;GACL,WACTC;qBAAAA;EAAAA,kBAETF;SACA;SACF,A,C;A,G,CAGA/O,WAAkB,MAAGkP,aAAe,A,C;A,G,CACpClP,WAAkB,MAAGkP,aAAe,A,C;A,G,CAGpCtO;GAJqBsO,YAKL;EAEVC;EAAkB,AAAlBA,SAAoBC,AAAAA;SACA;IAExB;QAA2B,8BAHvBD,SAIFxO;OAASwO,MACX;iBACA;SACF,A,C;A,G,CAEA9H;GAd6B,AAAN6H,YAgBL,YA8/CX/L,QAA8B;EA7/CViM;EAAAA;EACMD;EAAkB,AAAlBA;SACF,YA2/CxBhM,QAA8B;EA1/CzB,8BACV;QAAkB,8BAJOiM;EAKgBA;EACC;0BALXD,SAI7BvP;kBACIuP,MACN,AACA,SACF,A,C;A,E,C,CAEAE;EACoB/P;EAEPgQ;EAO2C;;;;;2BUlHhBC,KV8HSC;;cAG7BlQ;;GAEH;;4BAUT,uBACFmQ,KU9IkCF,KV8IqBC;KAGvD,gBAsEO;KAnEP,8BAMF,mBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,M,C,C,G,C,U,C,C,C;A,E,C,C;A,G,C,iB,C;A,G,CAoCAxP,WAAwB,SAAQ,A,C;A,E,C,CAIhC6M;GAEM,CAAC6C,mEACoC;cAE3B;;EACRC;EAAkB;IAExB,MAAkCC,oBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAaA/C;EAIMhD;EAAAA;EAA4B,EAAEA;GAC9B,CAAC6F,oEAEuBjG;GAGE,MACZ,sBAGF;EACYA,uBAGd;;EACRkG;EAAkB;EACmB,AAAjBlG;OAEtBI,MACuB,SACnB,KAAA,wCACiCA,kBAC1BJ;QACkB,SACzB,KAAA,wCACiCI;QAER,SACzB,KAAA,wCACiCA,8CAGzC;QAAsC,QACpCJ,uBAA0BI,WAC5B,AACA;MAAkC+F,oBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,G,CAUA5P,WAAwB,SAAO,A,C;A,E,C,CAE/B6M,oBACkBgD,OAChB;MAAOtG,qBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CAwEA5J,oBACkBmQ;GAAF,IAA0B,MACxC;MAAiChG,gBAEnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAiG;EACyCC;sBACrC;uCAGAC;eAEA;wCAGM,KAAA,kCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA/P,WAA0B,MAAsC0P,yBAAW,A,C;A,M,C,C,G,C,a,C,E,CArD3EzO;;WAEoB;;;;;MAclB;qBAR0C,iBAKgB,eAM5D,A,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAge2B;kBAErB+O;cACAzG;;IACa,MACf,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmDuB;GACjBM,QACFA;iBAKJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,qB,C;A,E,C,CAgTJoG;aAE+BC;WACV;;EAEfjB;GAAW;EAGXkB;GAAe;EAGfC;GAAM;EAGNC;GAAQ;EAGRC;GAAU,wBAId;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,M,C,C,G,C,+B,C,E,C,CAsBApO;;;;;;;;6BA4CE;+OAMF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAMAA,YAmDE;;;;;;;KACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAkCAA,YASE;;;;;;KACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAsCAlC,kBACMqQ;WAAiB,wBAAoBE,QACzC;sDACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CAaAvQ;EACMqQ;WAAiB,gCAA4BE;EAC7CD;WACF,uDAAoDC,YAEtD;oEACOA,aACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAZAC;;;;uBAGuE,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAiBvExQ,kBAAqBuQ,OAAH;MAAGA,iCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAepElG;6FAOE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CAuIArK;EACMyQ;GAAO,QAAS;EAGoBC;;cAGjCD;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAwCqC,WAAG,MAAGE,iBAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEd,WAAG,MAAGA,uBAAY,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAElB,WAAG,MAAGA,8BAAkB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,M,C,CAExB,WAAG,MAAGA,yCAAwB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,M,C,CAE9B,WAAG,MAAGA,iDAA8B,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAuYzE3Q,YAAkB,gBAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,C,C,C;A,G,C,mB,C;A,C,C,CA0C9BF;;YAC8B;;0CACA,QAC5B;MACI8Q,WAAOlP,MACPmP,UAASnP,MACT4O,UAAW5O,KACjB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAEM6Q;aAGiBvQ,KAA0B6Q;OACA,oBAG1BN,QAIAvQ,OAErB;MAAwB,QAAEA,KAA0B8Q,UACtD,A,C;A,I,C,I,C;A,M,C,C,G,C,O,C,E,C,CAGA3O,YAAoC,MAAGyO,SAAa,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAKpDzO,YAAwC,MAAGyO,MAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,E,C,CAM5DzO;cAEyBqJ,YAArBC;OAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,E,C,CAIAtJ;cAE6BqJ,gBAAzBuF;OAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,E,C,CAGA5O;;;;GAIE;MAAoB8K,aAAF,WACLA;YAET,SAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C,C;A,E,C,C;A,G,C,M,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CA0YAhN,YAAkB,MAAGyE,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CAJ5BsM,qGAEkD,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAiDlD/Q,YAAkB,2BAAmByE,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAD7CuM,+BAA0B,A,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CA4B1BlR,kBAC2BmR,UACzB;kBAEMlE,OAAsCmE,WAC9C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAwCAD,kBACoB7R,MAClB;4CAGF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA8R;;EAzDmBC;;;sDAgEVA;EAGHC;GAAe,SAAW,AL13EZ9Q,oBK43Eb+Q;EAGDC;GAAuB,SAAW,AL/3EpBhR,mBKi4Eb+Q;EAGDE;GAAgB;EAEPC,OACX;MAAoBxJ,aAAF,WACLA;KACDkC,UAEZ,UAKF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAWAlK;EAGMoR;GAAe,QACjB,MAAoBA,wBAAF,gBACGA;;UAIrB;OAEEE;GAAuB,SAAW,ALv6EpBhR,gBK06ET,GAFgB,aAGvB;MAAoBgR,kBAAF,gBACGA;;UAIrB,cAESC;GAAgB,WAGlB,GAFgB;EAGZC,OACX;MAAoBxJ,kBAAF,gBACLA;;OAEDkC,iBAGZ,QAKF,MADO,gBAAUiH,UAEnB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,I,C,E,C,CAhDAjP;;IAGE;MAAoBzB,aAAF,eACYA,AAAAA,UAC9B,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA2EAT,YAAkB,gBAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAE9BkR,WAAQ,OAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAoEfA;EACyCrI;;2CAEvC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA7I,YAAkB,MAAG6I,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,e,C;A,E,C,CAUzBqI;EACMO;GAAI,QAAS;EAC4C5I;;;GACzDvB,gDAGJ;MAA6BiC,0BJllFOvI,8BIklFpC,cAC8B0Q,AJjlFfxI,UIklFf,AACOuI;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAzR,YAAkB,MAAK6I,aAAOU,KAAAA,kBAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAyFrDvJ,YAAkB,gCAA4BuQ,QAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAFvDoB,+BAA6C,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CN96F7C3R;EACM4R;GAAe,QAAS;EACgCC;;aAGrDD;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAGAnS,YAAiB,MAAGoS,MAAAA,SAAkB,A,C;A,C,C,CAEtC/R;;QACE;iDAAyC,KAAV+R,QAAanQ,MAC9C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CYqWiB,YAAI,iBAAsC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEvD,cAAgB,mBAAqD,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAErE,YAAa,iBAAsC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,G,CLvYvDoQ,iBACMC;GAAoB,QAAS;EAoBc7D;EAnBlB8D,2CAAtBD;SAAP;SAIF,A,C;A,G,CAEAD,iBACMG;GAAsB,QAAS;EAYY/D;EANhB8D,iDAAxBC;SAAP;SAIF,A,C;A,E,C,CA+BAzQ;;EAGsB0M;WAEL,MACf;MAAO,cACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEApO,oDACE;MAAgCoO,iBAClC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQA1N,cAEE,wBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAgB;EACkB0Q;;;WAGG,MACnB;MAAO,cACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA1Q;EACkB2Q;;;WAGG;EAGT1J;EAAa;;GAAK,AAAxBA,WAAiC,MACrCA;SACA;MAAO,cACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjH,mBACY,KAAa,EAAEC,aACjB,KAAA,SAA+BA,SAEvC;MAAO2Q,cACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,C,CA1EAlQ;;;;;uBAiBiD;;KAIzC,KAAA,2CAER,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,C,C,CA0EAlC,oBAD2BgC;gCAAAA,SACG;MADHA,MACkB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAV7CqQ,eAGA,A,C;A,K,C,I,C;A,M,C,C,E,CAHAA;;SAGA,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAyBAtR,YAA6B,gBAA2BuR,QAAKC,cAAQ,A,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,CAUrE/Q,WAAkB,MAAG0H,SAAQ,A,C;A,C,C,CAE7BpJ;GACMyS,cAAiB;EAEjBrJ;GAAS,WArCuBlH;;qBAAAA;EACfA,KAAAA;6BAAAA;EAAF;GADiBA,AAuC9BkH;EAIKsJ,AAAAA,WAAoBD,UAA/BrJ;;YAEEqJ,YACA;SAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,W,C;A,C,C,CO9LAvS,iBAIa,CAAA,eACH,OALe;MAOhB6B,SAP2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C,A,E,O,+B,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CGgBpCK,iBACEuQ,AC4NwB;;ED3NjBlN,KAAAA,sCAAPmN;MAEA;SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,C;A,G,C,C,mC,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CEnByBC,YAAoB,MAAGC,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,QCiEnHE,eDjE+JF,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAGjKG,YAA2B,MAAGC,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAA0CH,cAAoCG,QC8DzIF,eD9DuLE,WAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAG1LhT,WAAgB,MAAGiT,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BJ,YAAyBI,QC2DpGH,eD3D0IG,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAGlK;EAGEC,OAAAA;WACAA;;EACAC;EAAAA,OAAAA;iCAAwBC;EACxBD,OAAAA;iCAA4BE,YAC9B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YAfgJL,QC8DzIF,eD9DuLE,UAkB5LE,AAAAA;aACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEA,YArBgJF,QC8DzIF,eD9DuLE,UAwB5LE,AAAAA;aACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,CAQAI,WAGEC,UACF,A,C;A,E,CAVAD,WAGEC,UACF,A,C,C;A,E,C,C;A,G,C,O,C;A,G,CFNA9T,WAAgB,MAAG0E,AAAAA,kCAAuC,A,C;A,G,CAE1D1E,YAAa,MAAG0E,AAAAA,+BAAoC,A,C;A,E,C,CAIpD,cACEA,AAAAA,8BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmBA,iBAzBgBA,OAqBdA;qBArBcA,0BA2BhB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAIA,sBIyRoB;+CJxRlBA,AAAAA;gDACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAgBA;EACcqP,AAAAA;GACD,SAA6B,CAAA,KAAhBC,wBAEtBC;SAAAA;mBAAwBD,gBACxBC;sBAA2BD,qBAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA,kBACkB,KAAmBC,QACnCF,AAAAA;mBAA2BG,YAC7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,iB,C;A,G,C,CK7FyB3T,WAAuB,MAAG4T,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2Cf,YAAgCe,QFkErId,eElEyLc,WAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,E,C,CAExN,iBC+q4BkCC,eA2/GhCC;gBA/EI,KAAc,KA8EcC,qBA9EW;GDrl/BlB,KAArBC,KAAAA,sBAEFA,KAAAA;KAGAC,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA,WACED,KAAAA,qBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA;EACgBA,KAAAA;EF0CTlB,eElEyLc,UAApDA;;GAyBtI,CAACM,aACH;EAEUA,AAAAA,KA5BqCN;;cA4BrCM;EAEa,IAAMC;GACd,IACf1B,AJ4MsB,qDI5OyBmB,SAkCjDQ,AAAAA,AAAAA,AAAAA;cAAYF,KAlCqCN,iCAsCnD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,K,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAnC6B,YAEzBK,YACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CA4B2C;;EACvCG,IH/B0IpB;KC8DzIF,YD9DuLE;EGgCxLoB,IH7BqGnB;KC2DpGH,YD3D0IG,aG8B7I,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,gC,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,C;A,G,CEjCJnT,YAAkB,MAAGuU,SAAS,A,C;A,G,CAC9BxB,oBACgBwB,OACdA;;GADwB,WAKpBC;KAEAC,UAGN,A,C;A,E,C,CAEAzU,WACE0U,WAAW,CAfQH,QAgBnB;MAhBmBA,SAiBrB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,kB,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,C;A,E,C,CAgBA;EACEI;SAAAA;OACAC;OACAD;OAAYC,MACd,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA;EAGYD;;EAAAA;GACNE,OAYJF,OAAqB,AALSA,YAKJE;KATxBC,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAUA;;EACmBD,KAAAA;GACF,UACb;6BAFeA;GAIjB;KAAkB,WAEZA,KAAAA,KAAAA,kBACFC,QAAUD,KAAAA,YAEd,AAEAA;;EApB8BF;;EAuBP,AAvBOA,WAuB9BA;SAAsC,KACxC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C,A,E,iB,+G,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CC7CF,WCsBEI,gpEACAC;ODsBAC;OACF,A,C,Q,C,I,C,C,C,C,C,G,C,C,E,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CEhF0BC,YAAmB,MAAGC,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAkCpC,cAA4BoC,KAASC,eAA2BD,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAItK,cACErS,AAAAA,KAL4CqS,YAM9C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAE;;ECyFqB;;;gBC5CI;;;;;;SF7CwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CGJjDC;;EF6FqB;;;gBC5CI;;;;;;;SCjDkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCEnBJ,YAAmB,MAAGK,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAkCxC,cAA4BwC,KAASH,eAA2BG,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAGtKC,cACE,MAAOC,AAAAA,MAJqCF,SAKjC,KAAPE,KALwCF,oBCukCrCG,uBDjkCT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,cACED,AAAAA,KAT4CF,YAU9C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CATAI;;EH0FqB;;;gBC5CI;;;;;;SE9CmB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CEH5CC;;EL6FqB;;;gBC5CI;;;;;;;SIjDiB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCClBC,YAAc,MAAGC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA6B/C,cAAuB+C,KAAUV,eAA4BU,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAG3J;;EAHyCA;WAMrC,MAEFpR;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,cACEA,AAAAA,KAZuCoR,YAazC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,CAEA5V,YACE,4BACF,A,C,I,C,I,C,C,C,C,C,G,C,e,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAhBA6V;;EN2FqB;;;gBC5CI;;;;;;SK/CkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,+B,4D,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCGlB7V,YAAqB,MAAG8V,MAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAAqDjD,cAA8BiD,KAAeZ,eAAiCY,QAAsB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,W,C,G,C,C;A,G,C,CAC7L9V,YAAwB,MAAG+V,MAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAAgDlD,cAAiCkD,KAAkBb,eAAoCa,QAAyB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,c,C,G,C,C;A,G,C,CAGnOjW,YAAmB,MAAGkW,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAChCnD,cACEmD,MACAC;WACF,A,C,I,C,I,C,C,C,C,C,G,C,G,C,C,C,C,W,C,C;A,E,C,CAIA,0CAEEA;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,kBAXED,KAYY,AAdQA,SAGpBC;UAYAA;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,e,C,C;A,E,C,CAIA;EACMD;EAzB0LF;WAAhDA,KAAeZ,oDACXa;KAAkBb,eAAoCa,kBAD1DD,KAAeZ,kDACXa;KAAkBb,eAAoCa,eA+B1M,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,iB,C,E,C,CAtBAG;;EP8EqB;;;gBC5CI;;;;;;;;;SMlC4B,A,C,I,C,I,C,C,C,C,C,G,C,uC,C,C,C,C;A,4B,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,mE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCd5BpW,YAAkB,MAAGqW,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyCtD,cAA2BsD,KAAcjB,eAAgCiB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACvKrW,YAAc,MAAGsW,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCvD,cAAuBuD,KAAUlB,eAA4BkB,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC5InW,YAAqB,MAAGoW,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C,C,C,C;A,G,C,CAA2CxD,cAA8BwD,KAAcnB,eAAgCmB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAEvM,kBAJ8CF,IAA+EA;KAAcjB,iBAK9H,OAJgGkB;KAAUlB,eAA4BkB,SAMnJ,A,C,Q,C,K,C,C,C,C,C,G,C,c,C,C;A,E,C,CAEA,wBAR0CA;UAUtC;GAEW,AAXiCC,YAD6DD,KAAUlB,oBAcnH3M;UAAS,AAfiC4N,UAetBG,oBAfsBH,IAA+EA;KAAcjB,iBAiB5H,SAEf,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,c,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CArBAqB;;ER8FqB;;;gBC5CI;;;;;;;;;SOlDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,2B,uC,A,A,C,C,C,C;A,G,C,E,C;A,E,CCqB/CzW;;WAE0B;EAEH0W;WAInB,mCAGF;MAA+B,MAAxBC,oBACT,A,C;A,E,C,C;A,G,C,S,C;A,M,C,CAxB6B,cACvBC,OAAU,MCoJL;6DD/IT;MAAOC,UACT,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C,A,E,kB,iB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CnCutBEzU,mBACE;sBA/boClB,8BA+bpC,OACE0N,SA9baxF,KA+bf,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAhH,mBACE;sBArcoClB,8BAqcpC,UACM0N,SApcSxF,WAocH,QACZ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoBAhH,qBAGE;sBAheoClB,8BAgepC,SACiB4V,WA/dF1N,KAgef,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoJAhH,2BAEE;iBAAkB,EAAE2U,gBACJA;;yBACZ,2BAEJ,EAEsB;IAEpBA,cACAvP;OACAA;YACAA;;8BAGAuP;QAEF,MW3qByBpK,SX4qB3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoEAvK;GACY,UAAa,MAAEzB,eACjB,KAAA,SAA+BA;;GAE/B,UAAe,MAAEA,eACjB,KAAA,SAAiCA,WAE3C,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQAyB,+BAEEvB;;EACiB;GACN,UAAM;GAEH;;;WASAmW,AAAAA;OAGU,KAAT,UAAWC,mDAG1BnW;gBACF,A,C,Q,C,K,C,E,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoCAsB;;GACY,UAAa,MAAEzB,eACjB,KAAA,SAA+BA;;6CAG1BO;;EAESA;EACtBP;6BADsBO,OACtBP;UAAY;EACQ;EAAmBA;2BDtgC/B,iBA2MRF;eC4zBA;MAAA,QAAA,aAAA;EACY,SAAVE;cACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAyB;GACY,KAAa,EAAEzB,cACjB,KAAA,SAA+BA,UAEvC;MAAA,QAAA,aACY,GAAVA;WADF,QAEA,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CqC1lCAyB;;GAEe,SACX,MAA8B,KAAR,cAAkC,KAAR,iCACzC,WAAc,WAAK,UACxB8U,WAASC,SACX;KAEA,gCAAuC,MAAW,YAAU,WAAK,UAC/DD,WAASC,SACX,CAEJ,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmBA/U;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7K;KAA6CA;GX5G9B,IAAG,mBACN,KAAA,YAEV,AACA,MWmHuBA,aXjHD;6BAjBX;GAkBX;KAAkB,WACH6K;8BWoGjB7K;KAA6CA;GXnG9B,IAAG,mBACN,KAAA,YAEV,AACA,MW0GuBA,OXxG3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEAjM,cAAwC,2CAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE5DA,cAA2B,0CAAkC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAW7DgX;EAEe;6BAAA;;GACb;KAAkB,WACRZ,WAAeU;GACZ,IAAG,mBACN,KAAA,YAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA9W,cAA4B,MAAG,wBAAsC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQrEE;oCAGa;UAAwBJ,sBAEZA;6BAAAA;;;iCAEvB;YAAoBA;6BAAAA;KAAF;EACJgX;8BAAZhQ;WACF,AACA,SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,CA+BA7H;EACegY,KAAAA;EACTC;YAAqC,UAAU,QACnD;SACF,A,C;A,G,CAEAjY;EACegY,KAAAA;EACTE;GAAO,UAAU,QACrB;SACF,A,C;A,E,CAEAlY;EACegY,KAAAA;EACTE;GAAO,UAAW;EAClBD;YAAqC,UACvC,MAAc,UAEhB;MAAoB,WACtB,A,C;A,E,C,CAEArX,oBAC8B,KAAZuX;GACN,WAAiB,OAAGC,iBACtB,KAAA,SAA+BvX,eAEvC;MAAOmX,MAAAA,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAjX,iBACY,8CACV;MAAO,MAAoBiX,QAAkB,KAAPE,WAAgBD,cACxD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAlX;GACY;EACNkX;EAGWC;WAFb,MAAO,MAAoBF,UAA0B;OAEjC;GACH,UAAU,WAC3B;MAAO,MAAoBA,mBAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAzDAK;EACMH;;GAAO;EAGPD;GAAa,YACE;GAGN,cACH,KAAA,cAGZ,A,C;A,M,C,C,E,CAZAI;;SAYA,A,C,C,C;A,E,C,C;A,G,C,e,C;A,E,CAgEAzX,WAAc,MAAG6I,SAAQ,A,C;A,C,C,CAEzBpJ;EACe2X;;EAAAA;GACD,CAAA,KAARzT,gBACI,KAAA;EAEJ+T;6BAJSN;GAIF,MACTvO,YACA;SAEFA,QAAWuO,SACXM;QAAM,AAANA,SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CAkBAhX,gCAAqD0W,KAAAA,SAAoBO;wCAAhD;SAAmD,A,C;A,E,CAG5EvY,YAAe,MAAGgY,MAAAA,SAAgB,A,C;A,G,CAClC3X,YAAiB,MAAG2X,MAAAA,SAAiB,A,C;A,G,CAIrCQ,YAAW,MAAGD,SAAGP,KAAAA,UAAe,A,C;A,E,C,CAEhCQ,cAAuB,MAAGD,SAAGP,KAAAA,YAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,M,C,C,E,CAnBxDxW;4CAEI,gCAEF;iCACF,A,C,C,C;A,E,C,C;A,G,C,U,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CA8BAnB,iBACMoY;GAAAA,OACFhP,QAAW8O,QAAGE,OACd;SAEFhP,YACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEA+O,WAAc,MAAG/O,SAAQ,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CAezBzJ,YAAe,MAAG0Y,MAAAA,SAAc,A,C;A,E,C,CAChCF,cAAuB,MAAGD,SAAGG,KAAAA,YAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,CAYtDpX,2BAAiD0W,KAAAA,SAAoBO;wCAA5C;SAA+C,A,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CASxElY,WACE,UAAOoY,QAAAA,UACDF,QAAGE,aACL,QAEJ,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEA7X,WAAc,MAAG6X,AAAAA,cAAiB,A,C,C;A,E,C,C;A,G,C,U,C;A,E,CAWlCnX,2BAAqD0W,KAAAA,SAAoBO;wCAAhD;SAAmD,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,e,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CAiB5EC,WAAc,MAAG/O,SAAQ,A,C;A,C,C,CAEzBpJ;EACMsY;WAA2B,QAC/B;MAM2BF,QANpB,CAACE,QACNlP;GACIgP,OAGFE;EACoBJ,KAAAA,QAAGE,QAAvBE;eAEA,SAEJ,AACAlP,QAAWkP,AAAAA,YACX;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAmBArX,kBAC6B0W;WAAAA,QAAoBY;wCAA/C;SACF,A,C;A,M,C,C,E,CAdApX,2DACqC;aAIjC,8BAEF;+BACF,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAcAxB;EACuBgY;EAAAA;EACAY;GAAF,UAAc,QACjC;SACF,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CAYAvY,iBACY,KAAVwY,UAAAA;;GACe,UACb,MAAOJ,AAAAA,YAETI;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEAjY,cACiB,KAAXiY,WAAgB,MACpB;MAAOJ,AAAAA,cACT,A,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAqDA1X,yDACqB,wCAGnB;MAAO,MAAoBiX,QAAsB,KAAXc,yBACxC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAEAxX,kBAC6B0W;WAAAA,QAAoBc;wCAA/C;SACF,A,C;A,E,CAfAC,sBACMD;2CAAiC,eAC7B,KAAA,SAEV,A,C;A,M,C,C,E,CAXAtX;;WAEI;SAEF,MAAO,aACT,A,C,E,CAEAuX;;SAIA,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAmBA/Y;EACegY;EAAiB,KAAjBA,QAAmBc;GACrB,UAAM,QACjB;SACF,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CAWAzY;EACuCoY;GAArC;YAAoBK;6BAAAA;KAAF,UAAmBL;UAAoB,AACzDK,SACA;MAAOL,OACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEA7X,WAAc,MAAG6X,AAAAA,cAAiB,A,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CAiHlCpY,WAAgB,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CACxBO,WAAc,OAAO,A,C,C;A,G,C,C;A,G,C,I,C;A,E,CsC5sBrB,mBACQ,KAAA,wDAER,A,C;A,C,C,CAGA,mBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,mBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAP,mBACQ,KAAA,+CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeA,iBACQ,KAAA,yCAER,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAeA,qBACQ,KAAA,+CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CAmBA,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAGA,mBACQ,KAAA,yDAER,A,C;A,E,C,CAGA,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAGA,mBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGAO,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,mBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAP,mBACQ,KAAA,gDAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeA,mBACQ,KAAA,2CAER,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CASA,iBACQ,KAAA,0CAER,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAeA,yBACQ,KAAA,2CAER,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,qBACQ,KAAA,gDAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAuGAL,YAAe,MAAG0Y,MAAAA,SAAc,A,C;A,E,C,CAEhC9X;EAA0B8X;SAAH;MAAGA,QAAqC,KAAJ,KAAfA,eAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,C,C,CxB5PvErY;;QAAwB;iDAA4B,KAAN2Y,QAAS/W,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAElEjC,kBAEwCgZ,KAAAA;6BAAAA,OAAtC;MAAkB,WAAkB,SACtC,A,C;A,E,C,CAEAC,YAAW,sBAAaD,eAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,G,C,I,C,E,C,CAKhCvW;GACM2G,cAAc;GACdA;ET4B4BqF;;GSzB5B,wFAIJ;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C,A,E,oB,mB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CyBsaFU,uBACoB,MAClB;mBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAA,YAAmC,MAAG+J,UzBvbItJ,WyBubc,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIxDuJ;4CAEI;KAEA,qBAEJ,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAMAC;EACyBC;;GACP,iBAAc;GACd,cAAW,aAE3B;MAAOC,MAAmBJ,qBAC5B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIAE;;EACuBG;GACF,OAGHA,OAAqC;;cAEZC,MAAfC;;GAEf,QAAS;;EAEDF;GACF,UACqBG,AAAAA,KAChCH;aAEAA,OAAmC,IAAwB,KAAnBA,6EA2lBlCI;SAzlBV;WAGErZ;;GAGQ,6BAyvDVsZ;;SAtvDE;cAII,KAAA,kCzBhfgChK;;;;;;0EyB+fnBiK,AAAAA,SAAmBA;EAC3BA;8BASQA;qBAAAA;EACRC,KADQD;GAEH,AAAdE,YAAqBV,sBACdW;wBAo3BiBR;;YA92BGS;KAI3B,MAAoBA,yBAAF,qBAElB;gFAoiBQN,gBA9hBZ;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjS;EACe,8BACb;sBvC/SsCnG,8BuC+StC,UvC7SiBkI;GuC8SX,CAACyQ,SAAwB,CAACA,SAAmB,CAACA,QAChDrS,MAAOqS,WAEX,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAxS;EACe,8BACb;sBvCzTsCnG,8BuCyTtC,UvCvTiBkI;GuCwTXyQ,QACFrS,MAAOqS,WAEX,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAkCAxS;EC5kBW,8BAAA;SD+kBT;sBvCpWsCnG,8BuCoWtC,UvClWiBkI;GuCmWXyQ,WzBzlBkCtK,AyB0lBpBsK;;EAGZrS,MAAOqR,KAFJ9P,SAA8B,KAAZA;;wDAKvB8Q,gBAEJrS;KAAmBqS,qBACrB,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIAC;IAGE;sBvCxXsC5Y,8BuCwXtC,OACEwY,OAAWL,KvCvXIjQ,MuCwXjB;kBvC1XsClI,6BuC4XtC6Y;;EvC1XiB3Q,IuC4XjB;KAAO2Q,oBvC5XU3Q,euC6YLyP,QAfZ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA4xDAlZ;;GACE;YAAoBia;6BAAAA;KAAF;GACgB,KAA5BA,AAAAA,eAA+Bf,SACjC,aAEJ,0DAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAE;;QAOE;QAAe;;;EAOHtT,QACZ,WAIE;;aAEiBmH;QACRoN;EAKkCA,OAEzC;MAAOJ,QADKK,OAAqCC,iBAKhCtN;;0BAaSuN;;4CAExB,WAqBAvN,wBAEa,QACjB,MAAOyM,QAGT;MAAOe,YACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtL,yBACqB,QAEnB;MAAO+J,UzB5+EiCtJ,KyB2+EnB8K,kBzB3+EmB9K,OyB6+E1C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3O;;GAGuB,QAAS;wBACoB;;mBAEhD;MAAO0Z;EAMGxR,mBlCzhFFoJ;UkC0hFO,eAGjB;MAAOpJ,6BAAAA,AAAAA,YADQA,kFAGjB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAlI;;0EAQa2Z,KAAYC;EACJA,qCAERD;OAKX,sBvC/xEsCrZ,gCuCiyEjB,YAFrB,UvC7xEiBkI;QuCgyEwB;;EAA1BqR;;EAEA;GACF,QACTjT,UAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA5G;GACMe,cAAgB,qBACpB;MAAOA,WACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA3B,oMAsBI;QAEA,UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAIAA;;GACU,YACA,uCACN;EAEiB0a;QACnB;MAAiB,aAAoB,WACvC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,G,CA1jFErT;EACMsT;GAAiB,QAAS;EACG,8BACjC;eAAiCC,8BvCmQkBjD,KAAAA,MAAoBO,6BuCnQvE,OACE,MAAA,KvCqSa9O,MuCrSb,UAAA,MACE5B;MAAOqT,WACT,AACF,+BACOF;SAAP;SAEF,A,C;A,M,C,C,G,C,U,C,E,C,CAMAvY;EAEe;;WAEY,QACzB;sBvC+MoClB,8BuC/MpC,UvCiNekI;;EuChNCU;EACMA;ETkBQ,KAAmBgR;ESjBxBhR;EACEA;EACFA;EACVA;EACCA;EACKA;kBAInBiR;KADgBvT,4FAGRqR,UAEV,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAP6C,WAAG,uBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAenE3Y,YAAkB,MAAG8a,YAAW,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKhCC,iBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,mBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CAeA/a,WAAuB,gBAAY,A,C;A,G,CAUnCgb,iBAkiF0B7C,AAjiFjB8C,eAAP;MAAOA,AAiiFiB9C,2BA/hF1B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CADM,YAA0B,MAAGwC,SAAQO,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,G,CAU3CtM,YAAyB,MAAGuM,MAAqBhB,WAAOiB,YAAW,A,C;A,G,CAEnEtb,WAAmB,MAAGub,MzBjHkBhM,AyBiHhB+L,mBAA2B,A,C;A,E,C,CAKnDpb,YAAkB,MAAK8a,wBzBtHiBzL,AyBsHG+L,mBAAc,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMzDE,mBACQ,KAAA,iCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,C,C,CAiBAxb;;QACE;iDACe,KAAXsb,QAAc1Z,OACR,AAANyY,YAASzY,MACf,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EzCvJoBoS,KAAAA;6BAAAA;EyC0JLsI,OACb;MADK,CAAA,AADA,AADiB,aACX,GAAEiB,KAAAA,SACF,GAAEjB,cAEf,A,C;A,G,CAEAna,WAAuB,2BAAuB,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CAoB9CA,WAAuB,mBAAe,A,C;A,G,CAEtCub,WAA4B,OAAO,A,C;A,G,CAMnC7a,WAAkC,YAAS,YAAwB,A,C;A,G,CAGnEP,gBACQ,KAAA,iDACR,A,C;A,G,CAEAO,WAA2C,YAA+B,A,C;A,G,CAC1EA,WAAmC,YAAuB,A,C;A,G,CAE1DZ,WAA+B,SAAO,A,C;A,G,CACtC+Y,WAAmC,YAAO,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,6D,C;A,G,CA0C1C7Y,WAAuB,sBAAkB,A,C;A,G,CAEzC4O,YAAyB,MAAGwM,SAAU,A,C;A,G,CAEtC1a,WAAkC,MAAG8a,YAAgB,A,C;A,G,CAErDrU;EACMsU;GAAe,QAAS;EACf,8BACb;MAAA,KAAyBC,SAAzB,UACYvC,KADZ;;+CAGU5D;cAEJjO,MAAOiO,OACPA;YAGN,+BACOkG;SAAP;SAEF,A,C;A,E,C,CAEA7C;EzBpQwCvJ;GyBsQlCxG;EACS8S;EAAYhD;EAo3EHR,AAAAA;aAAAA,AAAAA,AAn3EOyD;gBAGrB,KAAA,UAA4BC,uBAEpCC;YACA;MAAOC,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAnD,kBA02EwBT,AAAAA,AAz2EJ6D;gBAGV,KAAA,0BAER;MAAOD,MAAQD,YACjB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAlD;EAi2EwBT,AAAAA,AA31EO6D;gBAGrB,KAAA;;6CAGwB,oBA8vDFC,MA7vD5B1M,KzBvSoCF,SyByStC;MAAO0M,MAAQD,WACjB,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAmBApb;EACMwb;GAAuB,QAAS;;EAEhBC;;EAEcC;GAFlC;YAAoBD;6BAAAA;KAAF;OACFA;;EAESrD;;EAOF/J;QAIHA;EpCtVbnN,kBoCyVD,SANY,KAQhB0F;SACAwU;cACF,AACOI,SAAP;SACF,A,C;A,G,CAEAxb;EACM2b;GAAc,QAAS;iBAE3BC;UACUC,aACHF;SAAP;SACF,A,C;A,G,CAEAlV;EACMqV;GAAiB,QAAS;EACjB,8BACb;MAA8BhB,6BvChHMxa,8BuCgHpC,UvC9GekI;GuC+GT,CAAC4S,QAAsBxU,MAAOwU,WACpC,+BACOU;SAAP;SAEF,A,C;A,G,CAEArV,iBACMsV;GAAe,QAAS;gBACf,4CAENA;SAAP;SAEF,A,C;A,G,CAEAtV,iBACMuV;GAAe,QAAS;gBACf,4CAENA;SAAP;SAEF,A,C;A,G,CAEAvV;EACMwV;GAAiB,QAAS;EACjB,8BACb;MAAgCC,6BvC1II5b,8BuC0IpC,UvCxIekI,IuCyIb5B;MAAOwU,WACT,+BACOa;SAAP;SAEF,A,C;A,G,CAEAxV;EACM0V;GAAe,QAAU;EACaC;EC9XnC,8BAAA;;aDwnF+B3E,AAAAA,AAtvEtCwD;qBAsvEsCxD,AAAAA,AArvEtC4E;qBAqvEsC5E,AAAAA,AApvEtC6E;qBAovEsC7E,AAAAA,AAnvEtCyD;;+BACOiB;SAAP;SACF,A,C;A,G,CAEA1V;EACM8V;GAAoB,QAAS;EACpB,8BA6uEyB9E,AAAAA,AAzuEtC6D;;+BACOiB;SAAP;SAEF,A,C;A,G,CAEAvc,iBACMwc;GAAgB,QAAS;gBAGgBC,KAAAA,wBADtCD;SAAP;SAEF,A,C;A,G,CAGA3B,WAA4B,OAAO,A,C;A,C,C,CAOnC6B,cACI,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CArCnCC,cACE/V,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAWA+V,cACE/V,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA2MsC,WAAG,cAAGqS,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,G,CAmC9C3Z,WAAuB,oBAAgB,A,C;A,G,CAEvC4O;EACM0O;GAAkB,QAAS;EzBxoBOjO,KyByoBjBkO,KAAAA;EAEIC;EADGC,sBACtB9E,qBzB3oBgCtJ,KyB2oBbmO,WACnB7E,yBzB5oBgCtJ,KyB4oBTmO,UAFtBF;SAAP;SAGF,A,C;A,G,CAEA1O,YAAyB,MAAGwM,YAAU,A,C;A,G,CAetCjU,WAAgD,MAAGqW,AAAAA,eAAkB,A,C;A,E,C,CAkBrE5E,qBAKQ,KAAA,uBAER,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA,iBAEQ,KAAA,6BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAA,mBAEQ,KAAA,UAA4BiD,wBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,G,CAEAnb,WAAsC,OAAI8c,SAAM,A,C;A,G,CAYhD1d,WAA+B,SAAO,A,C;A,G,CAEtC8Z,WAAoC,YAAO,A,C;A,G,CAG3ClZ,gBACQ,KAAA,YACR,A,C;A,G,CAEAA,WAAmC,YAAuB,A,C;A,C,C,CAG1D0c,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,G,CAmBnExD,YAAqB,MA1SdT,MzCjb4B5M,AyC2tBCmR,KAAAA,aAAsB,A,C;A,E,C,CAE1D9E,sBzBhvBwCvJ,OyBwyBtC;MAAOiM,mBAJwChS,iBAMjD,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAMAwI;;EAEqB4L;aAAqBte;;cAG9B6Z;mBAGV,SACF,A,C;A,E,C,CAKAL;EAIc+E;;cAMWC;QAKHC,AvCgFb,KuChFaA;;EnCpqBb3d,KmC8qBkDwd;;GAGrDI,iCAEqBF,0BAMvB;MAAO7B,MAAQ+B,KAAoBJ,iBAEnC,MAAO3B,MAAQ+B,KAAoBJ,YAEvC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA9E,wBzBx2BwCvJ,ayB02BtCiM;QACI3C,gBACJ;MAAOoD,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CA0BAnD;WAKgBmF;;;;IAOuBL;WAMjC;OAEa3B;;KAGb;UAGJ,MAAOiC,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEApF;EzBp6BwCvJ;EyBw6BzBiM;EACkBqC;GAC3BG,QACF;EAIUC;yBAEU,SAAfA;;GAAwB,CAAA,UAAM;MAC3BA;;iCAMIE;EAKIH;EACJA,QACRI,aACAC;;SASN;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAF,mBASI;KAEA,yDAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAE,iBACM,GAAU,0DAUd;iDAFsDT,mEAGxD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKAQ,oBAKoB9e,IAJLse;GAKT,GAAU,+DAGd;mHACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,C,C,CASAjX;;;+CAEmBiX;EAAWhc;;aAD5B;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC,YAGE,MAAmC,M5B7iCM2e,K4B6iCjBV,oBAC1B,A,C;A,E,C,CAEA1d,YAAkB,+BAAwBqe,KAAmBX,UAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAMzEN,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA7PxC;EzBnxBa/N;;GyBqxB9BxF,QACFA;UAIM,KAAA,oEAGV,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oD,C;A,G,CAiSJ7J,WAAuB,oBAAgB,A,C;A,G,CACvCA,WACE,UAAgCse,aAAhC,QAAA,UACmB,CAAA,KvC30BJpV,auC40BX,WAAUqV,AAAAA,mBAAsBC,WAEpC,AAGA;MAAOD,AAAAA,eACT,A,C;A,G,CAEA7d,WAA2C,MAAG6d,AAAAA,eAAoB,A,C;A,G,CAElE7d;EACM+d;GAAqB,QAAS;;;EAgB9BD;GAAAA,oBxCr/BGje,KwCs/BLie;KAKA,MAAoBA,sBAAF,WACAA;;uEAUJ;KAGRE;eAMN,AACAA,sCAEKD;SAAP;SACF,A,C;A,G,CAEA/d,iBACMie;GAAe,QAAS;EACLJ,AAAAA,gBAAhBI;SAAP;SACF,A,C;A,G,CAQAxX,iBACMyX;GAAoB,QAAS;gBAGzBC,KAAmBC,yBAFpBF;SAAP;SAGF,A,C;A,G,CAcAzX;EACMwV;GAAiB,QAAS;EACjB,8BACb;MAAiC4B,AAAAA,mCvC16BGvd,8BuC06BpC,UvCx6BekI,IuCy6Bb5B;MAAOwU,WACT,+BACOa;SAAP;SAEF,A,C;A,G,CAEAxV,iBACM0V;GAAe,QAAS;gBAExBkC,KAAcD,WAAUlD,yBADrBiB;SAAP;SAEF,A,C;A,G,CAEA1V;EACM8V;GAAoB,QAAS;EAE7B,8BACJ3V;OAAc0U,WACd1U;OAAc0X,WACdtF;KAvG4C6E,AAAAA;+BAwGrCtB;SAAP;SAEF,A,C;A,E,C,CAoDArE,cACE,MAAO2F,AAAAA,iBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3F,YAA0C,MAAG2F,AAAAA,eAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAiBvEU,WAA0B,MAAGV,AAAAA,eAAY,A,C;A,G,CAEzC7d,WAAkC,MAAG6d,AAAAA,eAAe,A,C;A,G,CAEpD3E,iBACMsF;GAAY,QAAS;EAMJC,wBADEC,0BAFwBb,AAAAA,mBAGxCW;SAAP;SACF,A,C;A,E,C,CAEAtG,gBAGE,MAAO2F,AAAAA,mBACT,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAEAze,WAA+B,SAAQ,A,C;A,G,CAEvC8Z,WAAoC,MAAG2E,SAAM,A,C;A,G,CAE7C7d,iBACM2e;GAAuB,QAAS;EACJd,AAAAA,gBAAzBc;SAAP;SACF,A,C;A,G,CAEAvf,WAAmB,MAzqCGub,MzBjHkBhM,AyBiHhB+L,AAyqCFmD,sBAAgB,A,C;A,G,CAYtC3P,kBAA4B2P,OAAH;MAAGA,UAAoB,A,C;A,G,CAIhDpe,WAAuB,gBAAqBmf,iBAAa,A,C;A,G,CAEzD1Q,WAAsB,MAAG2P,AAAAA,eAAiB,A,C;A,C,C,CAM1CnB,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAlOjEsB;E5B1iCO3e;;G4B4iCW,WACduH,OAAW6R,KAA0BoG;uBAMrCjY;gBAHmB4S,KAAaF,kBAz8B1BrB,KAAEqB,YA88BZ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAVqD,YAAI,SAAI,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAazB,YAAI,MAAG0E,kBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAmFtC,YAAQpX,WAAOkY,UAAV;SAA2BA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2E,C;A,G,CA2OxDxf,WAAuB,oBAAgB,A,C;A,G,CAEvC8R;EACM2N;;4CACF;KAEA,SAEJ,A,C;A,G,CAEAtY,iBACMyX;GAAoB,QAAS;gBAGzBC,KAAmBC,yBAFpBF;SAAP;SAGF,A,C;A,E,C,CAWAle;EACwCgf;EAClBlO;iBAEpB;sBvCtsCoCxQ,8BuCssCpC,UvCpsCekI;GuCqsCTyW;EACgB7Q;;;;EAShB,eAEJxH;SACAwU;OACF,EAEOtK,kBAAsC8N,SAC7C;sBvCxtCoCte,8BuCwtCpC,UvCttCekI;GuCutCTyW;EAE4BxF,AAAAA;;;EAOdyF;QAEGA;EpCh+ChBhe;EoCw+CD,SAFY,KAIhB0F;SACAwU;OACF,AAEA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEApb,iBACMie;GAAe,QAAS;EACJkB,aAAjBlB;SAAP;SACF,A,C;A,E,C,CAEAje;;EAGkCof,AAAAA;qBAAAA;EAAAA;EAC5BC;GAAgB,cAEd;aAENzD;eAGiDgD;GAC5B,QACnBhD,mBAMF;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA5b,iBACM2b;GAAc,QAAS;EACJ2D,aAAhB3D;SAAP;SACF,A,C;A,G,CAEAlV,iBACM8Y;GAAkB,QAAS;gBAEmBC,KAAcpB,yBADzDmB;SAAP;SAEF,A,C;A,G,CAcA9Y;EACMwV;GAAiB,QAAS;EACjB,8BACb;MAAgCC,6BvC1yCI5b,8BuC0yCpC,UvCxyCekI,IuCyyCb5B;MAAOwU,WACT,+BACOa;SAAP;SAEF,A,C;A,G,CAEAxV,iBACM0V;GAAe,QAAS;gBAExBkC,KAAcD,WAAUlD,yBADrBiB;SAAP;SAEF,A,C;A,G,CAEA1V;EACM8V;GAAoB,QAAS;EACpB;aAolCyB9E,AAAAA,AAhlCtC6D;qBAglCsC7D,AAAAA,AA/kCtC6G;qBACAtF;KAAAA;+BACOuD;SAAP;SAEF,A,C;A,E,C,CAoDArE;EAihCwBT,AAAAA,AAhhCIyD;GACf,SAAWE,SAAmB,AAACA,gBAGxBA;GACZ,eACI,KAAA;MAGR;MAAOC,cAGH,KAAA,UAA4BF,wBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjD;EAigCwBT,AAAAA,AAhgCIyD;GACf,SAAWE,WACJA;GAGZ,eACI,KAAA;oBAIN,MAAOC;KAEP,MAAOA,iBAIL,KAAA,6BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CA+BAkD;EACMkB;cACEV;;4CACFU,QAASC,AA1uCRjH,KzCjb4B5M;;EyC6pDZ8T;gBvC15C8B5I,KAAAA,MAAoBO;wCuC05CnE;KAAA,OACE,MAAA,KvCx3CS9O,MuCw3CT,OAIEyR,AAJF,YAKA,AACF,GAEEwF;6CzBzrDgC9Q,AyB0rDD+L,gCAGrC,SACF,A,C;A,G,CAEA1a,iBACMwc;GAAgB,QAAS;EACzBC;cACUmD,KAAsCZ,qBAAlDvC;0BAG2CA,uBADtCD;SAAP;SAEF,A,C;A,G,CAEAtD;EACMsF;mCAE6CI;GAC3B,WAEJH,wBADSC,WACvBF;iBAEqBY;EAAAA;qBAAAA;EAAAA;;EAERvG;EACTC;GAAc,QACE,WACV,KAAA;EAEML,KAA0BK,KAAxC0F;iBAI8B,eACjB/F,OADb+F;YAKN,MAAmB,mBAAiBA,QACtC,A,C;A,E,C,CAEAtG,sBAu5BwBT,AAAAA,AA94BEoI;YACF,CAACzE,aAEf,KAAA;GAGJ,CAACA,OACHvM,KzBpvDoCF,SyBsvDtC;MAAO0M,MAAQD,WACjB,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAEAhc,WAA+B,SAAO,A,C;A,G,CAEtC8Z,WAAoC,YAAO,A,C;A,E,C,CAE3ClZ;uBAEiD4e;EAE3B,QAOTF,cAAAA,8CAGX;gCACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA1e,iBACM2e;GAAuB,QAAS;EACJmB,aAAzBnB;SAAP;SACF,A,C;A,G,CAEA3e;EACK+f;GAAqB,QAAS;;EAGqBf;WAC3B,QAC3B;QAAkB,EAAEhG,gBACsBA;kBACxCpS;8BA9oDQqR,KAAEqB,WAgpDZ,0BACOyG;SAAP;SACF,A,C;A,G,CAEA/f,WAAmC,YAAuB,A,C;A,G,CAI1DP,cACM,CAH4C,KAArBuZ,KAAAA,oBAInB,KAAA,uDAGR;gBAAyB4F,cAC3B,A,C;A,C,C,CAMAlC,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAnQjEC,cACE/V,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAGsB,YAAQA,WAAOkY,UAAV;SAA2BA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA+MpD5F,YAEE,MAAOuF,+BACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gC,C;A,G,CA8HJnf,WAAuB,uBAAmB,A,C;A,G,CAE1C6Y,YACE,MAAOsG,MAGsBgB,sBAHqCO,UACpE,A,C;A,G,CAEAnF,WAA4B,MAAG4E,SAAM,A,C;A,G,CAErCzf,iBAEMyc;cACWwD;kBAAbxD;UAGF,MAAOA,AAAAA,sBACT,A,C;A,E,C,CASApC,YAA6B,SAAuB6F,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE5D,iBACMC,aACI,KAAA,UAA4BhF,KAAaT;EAE5BwF,WACvB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAtFA3f;EAIkC6f;EAC5BC;SAGF;cAJ8BD;EAOjBC;;EACFC;;EACFC,KAAUD,MAAwB;SAE9B;EAEQ;EAIQA,SAFzB;EAGQA;GACF,OACKE;EACNF,OAAwB;IAIjBlI,cAGAhK;;QAKC6J;EACawB;avC9nDInZ;8BuC8nDlC;UAAA,UACwB,KAAlB2Y,AvC7nDOzQ;MuCioDb,sBAvC8B4X,SA0ChC;0B5Bp1DO/gB,K4Bm1DcghB,qBACOpI,SAO9B,A,C,E,C,CAmBAzW,eACW,OAAc,MAAO,MAAY;GACjC,QAAe,OAAQ,MAAY;GACnC,OAAc,MAAO,MAAY,KAC1C;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,G,CAmBAif;;EAgB+DzD;;;;;;;;gBAErD,KAAA;EAEuB0D;qBAAAA;E5B15DxBrhB,K4B05DwBqhB;;8CnCyIQzQ,OmCtI1BjF;;EACAoD,WnC0IwB6B;WmCxIjCpB;EAEe,0EAMboJ;kBAIN;SACF,A,C;A,E,C,CAQA3Y,YAAkB,+BAAwBqe,KAAmBX,cAAa,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAW1EN,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,4C,C;A,G,CAqDnEpd,WAAuB,qBAAiB,A,C;A,G,CAExCU,iBACM2gB;GAAY,QAAS,QACzBC;UACA;MAAOD,SACT,A,C;A,E,C,CAEAvhB,WACE,wBAA8Bmc,QAChC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAV,WAA4B,MAAG4E,SAAM,A,C;A,G,CAErCtH,WACEyI,UACA;MAAOC,SACT,A,C;A,G,CAEA7gB;EACMyc;cACwBlB;EAAhBqE;EACakB;6BAAAA;;EACD;GACb,WAGY7X;qDAGeA;OAt8DjBwQ;GAAM;;;aAy8DWxQ,0BArBTwW,kBA0BnBxW,KAAwBmQ,AAFD2H,AAxBJtB,oCAAAA,YA8BrBuB,QACFH,QA/BuBpB;KAiCvBoB,QAAchV;EAGD5C,IACf;MAAoC4C,UAApC,qBnC5vDAoV,OAKkC/X,SmCuvDlC,avCt1DWV;;;;GuC01DH,EAAES,qBACgCiY,sBA8GpCjJ;OA3GiBhP;gBAEHiY,kBAyGdjJ,WAtGK;uBAATkJ;OACF,CAEFR;gBACqCS,uBAArC3E;UAEF,SACF,A,C;A,E,C,CAYA7B,iBAIM,CAACyG,SAAY,CAACL,aACV,KAAA;IAEY,KAAhBF,QAAmBlY,WAA8B2S,mBAE7C,KAAA,KACF9B,WAAOiB,kBAMb;MAAgCa,iBACtB,gBACZ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAlB,eACMiH,QACF,MAAO1G;UAGD,KAAA,6BAEV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA2G,iBACMC,QACF,MAAO5G;UAED,KAAA,UAA4BO,KAAaT,wBAEnD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,G,CASAtb,WAAyB,MAAG,CAACkiB,SAAY,CAACE,SAAY,CAACR,QAAa,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAxJpEzgB;EAIsB4H;qBAAAA;EACbc;EACWwY;EACF,IAAetZ;EAI3Bc;;;4BAPgBd;E5B99Db9I,K4B6+D8B4J;qBAfjBd;E5B99Db9I,K4B8+D8B4J;OAGjCgP,OADJ;kBACgD,2CAElD,A,C,C,C;A,E,C,C;A,G,C,4B,C;A,G,CAwKA3Y,WAAuB,wBAAoB,A,C;A,G,CAE3C6Y,YACE,MAAOsG,MAAwChF,QAAOuG,SACxD,A,C;A,G,CAGA5gB,WAAkB,SAAQ,A,C;A,G,CAG1BA,YAAiB,SAAQ,A,C;A,G,CAWzBY,WAEE,MAAO0hB,AAAAA,MAAAA,0BACT,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAD0B,YAAQ,MAAGrG,wBAAsB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,E,CAa3DsG,YAA+B,MAAGhJ,SAAQ,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,G,CAE1CrZ,WAAuB,sBAAkB,A,C;A,G,CAYzC6Y,WAAmC,YAAS,YAAwB,A,C;A,G,CAGpE0C,WAA4B,YAAS,YAAwB,A,C;A,G,CAG7D7a,WAAkC,YAAS,YAAwB,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,G,CASnEP,WAAuB,YAAS,YAAwB,A,C;A,G,CACxDyZ,WAA2B,YAAS,YAAwB,A,C;A,G,CAC5DlZ,WAAsC,YAAS,YAAwB,A,C;A,G,CACvEyG,WACI,YAAS,YAAwB,A,C;A,C,C,CASrCiW,cAAkC,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CACnExE,gBAGI,YAAS,YAAwB,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CACrCA,YAA0C,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAC3EA,cACI,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CACrClY,WAA2C,YAAS,YAAwB,A,C;A,G,CAC5EA,WAAmC,YAAS,YAAwB,A,C;A,G,CACpEmY,WAAmC,YAAS,YAAwB,A,C;A,G,CACpEjK,WAAsB,YAAS,YAAwB,A,C;A,G,CACvDA,YAAyB,YAAS,YAAwB,A,C;A,G,CAC1D9O,WAAmB,YAAS,YAAwB,A,C;A,G,CAGpDY,WAAkC,YAAS,YAAwB,A,C,C;A,E,C,C;A,G,C,oB,C;A,G,CA0BnEZ,WAA+B,SAAO,A,C;A,G,CAItC+Y,iBACMyJ;GAAkB,QAAS;EAfUC;qBAgBrBD;SAAP;YACT,uBAAwBA;SAAP;WAEjBnD,KAAwChF,cADrCmI;SAAP;SAEF,A,C;A,G,CAEA5hB;EACM8hB;GAAkB,QAAS;;EArBmBD;eAyBhD,+BvCtlEkCvhB,kCuCslElC,aAEqD,GADnDsG;qBvCrlEW4B,qBuCy8DLyP,qBA8IR;cAGA,8BvC5lEkC3X,8BuC4lElC,aAEqD,GADnDsG;qBvC3lEW4B,qBuCy8DLyP,qBAoJR,gBAGA,MAAiBnH,gCvClmEiBxQ,8BuCkmElC,UvChmEakI,IuCkmEX5B;gDAzJMqR,UA0JR,0BAEK6J;SAAP;SAEF,A,C;A,E,C,CAEAxiB;EACMyiB;GAAgB,QAAS;EA/CqBF;eAmDhD,+BvChnEkCvhB,gEuCgnElC,gBvC9mEakI;EuCgnET,OADA,IACGwD,cAEP;4BAKA;8BvCznEkC1L,mCuCynElC,gBvCvnEakI;EuCynET,OADA,IACGwD,cAEP,gCAMA;MAAiB8E,gCvCnoEiBxQ,mCuCmoElC,gBvCjoEakI;EuCooET,OADA,AADA,kBAEGwD,uBAEP;;kBAOE,SAAGA,kBAEH;OAEG+V;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAOAtB,WAA4B,YAAS,YAAwB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAgD3DtI;;;EAGMkB,KAAsBD,UAA0BE,QACpD;MAAOF,MAAAA,aACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASA9Z;EACqBia;;4CAEjB,WAAUsF;2FAIO,cACf;QACsB,cACtB;KAGA,eAGJ;MAAOA,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA0BS,YAAQ,wBAAgB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAQ/B,YAAQ,wBAAgB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,E,CAqH5B9f,YAAe,M/B5qEGuE,A+B4qEAmU,YAAc,A,C;A,G,CAEhCrY,YAAiB,M/B7qEGkE,A+B6qEAmU,gBAAe,A,C;A,G,CAEnCrY,YAAoB,M/B9qEG,AADHkE,A+B+qEGmU,gBAAkB,A,C;A,C,C,CAEzC7J,cAAqB,MAAG6J,AAAAA,gBAAY,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEpCrY,YAAwB,MAAGqY,AAAAA,eAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEnDrY,YAA4B,MAAGqY,AAAAA,eAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3D,cAAqC,MAAGA,AAAAA,iBAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAE1D3X,kBAAwB2X,OAAH;qCAAe,A,C;A,G,CAEpC3X,kBAA0B2X,OAAH;MAAGA,UAAc,A,C;A,C,C,CAGxC,gBAAkC,MAAGuK,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAI7C,cAA6B,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAExCpU,cAAkBoU,OAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE5B,YAAa,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,C,CA/BxBxgB,gBACQ,KAAA,0CACR,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,G,C,M,C,A,E,kB,iB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CEvoFFiF;EAEaqK;OrC4mDJvO,QAA8B,0CqCvmDrC;sBzCiQsCjC,gCyC9PhC,GAHN,UzCmQiBkI;MyCjQf5B;;;GAEMkT,YACFlT,UAAuBkT,kBAG7B,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEArT,uBrC2lDSlE,QAA8B,0CqCxlDrCvD;mBAGA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGAgB;;;;;;;mBASE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAjBc,cACV4G,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,c,a,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCpDF8V;EACMuF;KACF,MAAOC;KAEP,MAAOA,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CNiFE3hB,oBACmB,O3BzBjB;wB2BiCA;SACF,A,C;A,E,C,CO/FF,qBAIE;KAAa,UACXuB;EACwBA,OAAhBqgB;OACV,AAEAC,UACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAEA;IAEIC,gBADF,OCJEC;iBDQAH;KAAgBA;SAGpB,A,C,Q,C,I,C,C,C,C,C,G,C,C;A,E,C,CAEA;;8BAIoBC;MAAhBD;MCjBAG;yCDoBgBF;MAAhBA;QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA2BA;GACmB,iBAGfG,UACA;aAEFA;KACIA,YACN,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CEyCEhiB;qDCfUiiB;MAARC;2DAAQD;MAARC;ODkBA,SAGF,A,C;A,E,C,CAodF7N;WACmC;MAElB8N;;;4CACS,QACtB;kBAHF;;kBAKEH;cAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CEhDA,aAAkC,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAGlC,cACEA,aACF,A,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,I,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,WAAA,OAAyB,A,C,Q,C,I,C,C,C,C,C,G,C,C;A,E,C,CCjjBzBI;IAIIC,SAAUC,uBADZ;;kBAGEC;eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIA,kBAIqBC,MAIjBC;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAC,cAAwE,qBAEzB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAI/C,gBACqBF,MAIjBC;QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,CvCAEziB;GACmB,gBAGf,MAAOgiB;MAET;MAAOA,QACOA,YAChB,A,C;A,E,C,CmC3CIW,oBACeC,OAEnB;MAAO,MADU,WAEnB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CKyXE3hB,sBAIEgH;MACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAoSF,oBAEE4a,oBAWF,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA7jB;GACoB,aAAS,MAAOyO;EAEvBuU;MAEFvU,UAAP;iBA/SAuU,QAmTJ,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAhjB;GACoB,aAAS,MAAOyO;EAEvBuU;MAEFvU,WAAP;iBA1TAuU,QA8TJ,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAhjB;GAEoB,aAAS,MAAOyO;EAEvBuU;MAEFvU,aAAP;iBAtUAuU,QA0UJ,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAc,kBAEE,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC,kBAEE,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC,kBAEE,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,kBAIEC,KAHc,SACRtB,WAGR,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAgB,oBAKE,MAAOZ,QAHO,SACDJ,WAGf,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAWA,kBC7vBEuB,QD+vBF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,YACElB,aACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEAA,yBAMEmB;;EAQiC,8BASjC;uBACF,A,C,Q,C,I,C,E,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,wC,C;A,G,CHrwBEC,WAA2C,eAAoB,A,C;A,E,C,CAE/DvkB,kBACKwkB;mCAD2B;OACf,SAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAG9C,iBACEA;mCAAAA;QAAY,IACd,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAxkB,iBAAuBwkB;mCAAJ;MAAiC,CAAjB,SAAqB,A,C;A,E,C,CAExDxkB,iBAEEwkB;mCAAAA;QAAY,IACd,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAEAxkB,iBACKwkB;mCADuB;MACmB,CAA9B,SAAkC,A,C;A,E,C,CAInD,WAAA,OAAkB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAIlB,WAAA,OAAmB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,M,C,C,G,C,W,C,C,C;A,E,C,C;A,G,C,W,C;A,G,CAiEnBxkB,WAAkB,SAAQ,A,C;A,G,CAgB1BA,WAAmB,MAA4B,CAAjB,AAAPykB,eAA4B,A,C;A,E,C,CAMnDC,iBACMC;GAAY,QAAS;EACJ,UAAdA;SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAiBA;EAGwChB;EACJA,OAClCiB;QACAvf;QACqBse;QAArBA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAkBAnO,eAEgBmO,YAAmC;GAE7CA,QACFA;KAGAkB;IA5D0B,AAAPJ,gBAaQpB,eAmDzByB,WAGN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOAvG,cAlG8C,CAAjB,AAAPkG,eAoGlB,4DAGF;kEACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA,iBACM,AA/EoBA,gBA+ECM,KAAAA,UACzBC;WACF,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,iBACM,AApFoBP,gBAoFCM,KAAAA,UACzBE;aACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzP;EApHsBiP;GAAwB,CAAjB,SAuHzB,MAAOE;GAEL,UAAqBI,KAAAA,UACzBN;QAAO;EACaS,SACpBC;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAYA,cACEH,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,cAEEC,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,iBAE6BG,OAC3BA;YACAX;QAAO,AAAPA,kBACAY;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA;EApIuBZ;GAAwB,CAAjB;EAaCpB;YA6Hf;EAGG,GAOjBoB;QAAO,GAEP;KAAO,aAEDd,WACFA;mCAAAA;MAAyB,IACzBpM;WACAoM;;EACOA;GACHA,QACFkB;EAEFlB;mCAAAA;MAAyB;WAElBA,OAEX,AACAc;QAAO,AAAPA;GAxJ6BpB,eA2J3ByB,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,cApM8C,CAAjB,AAAPL,gBKvCGA,AL6OPE,eAEdA,AAAAA,gBAEFW;KAAYC,SACd,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CASA,kBA/K+BlC;YAgLf;GAjMGA,gBAmMfoB,QAAO,AAAPA,SAEAd,AADsCN;eAEtCoB;QAAO,AAAPA;GArL2BpB,eAuLzByB,SAEF;OAEFU,0BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBAhM+BnC,eAiMf,MACdmC;4BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cACM,AAxMyBnC,eAyM3BmC;KAMAb,AAAAA,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAtBmB,YACfhB,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKiB,YACfA,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAKmB,YACfA,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CAeJ,mBACE;MAAuCN,QAClC,WACOoC;yBAEV9B;QACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAuCN,QAClC,WACOoC,QAEV9B,wBACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,iBA5O+BN;GA6OzB,SACF,KACK,WACOoC,QAEV9B,UACF;KAIAgB,AAAAA,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CV7SY;IAENnd,UAAiBke,4BADnB;;kBAGEle;gBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CenFF,oBACOoc;GAAD,AAoDmBa,cApDS,KAAA,gCAChCb;QACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,E,C,C,C,C,C;A,E,C,CAEA;;EAEOA;GAAD,AA8CmBa,wDA7CvBb;UACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,6B,C;A,G,CA8CA5jB,WAAqB,MAAU,AAAPykB,YAAgB,A,C;A,G,CAExCzkB,WAAmB,MAAGykB,aAAgB,A,C;A,G,CAEtC1R,iBAGI0R;KAGAA,UAEJ,A,C;A,G,CAyCAkB,WAA4B,MAtDLlB,kBAsD4BmB,QAAgB,A,C;A,G,CACnEC,WAAgC,MAvDTpB,kBAuDgCqB,QAAkB,A,C;A,G,CACzExI,WAAsB,MAxDCmH,kBAwDsBsB,QAAgB,A,C;A,G,CAC7DC,WACI,MA1DmBvB,kBA0DIwB,QAA2B,A,C;A,E,C,CA6CtDzQ;;8BArByB2N,aACA+C,0BAuBvBC;UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,gB,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3Q;;EArBuB0Q;mCAEf/C,0BAqBNgD;UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,a,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3Q;;wCAlBU2N;wCAoBRgD;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CASAhO,WAEE,MAAOiO,SACT,A,C;A,G,CAEAC,WAEE,MAAOD,SACT,A,C;A,E,C,CAEA,YAEE3B,SACA2B;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cAEE3B,SACA2B;sBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,eAtJ+B,AAAP3B,WA0JpB6B,AAAAA;KAIAC,MAAyBH,QACzBA;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA1B;EAIoB0B,OAClBA;YAEA;WAAe,mBACEI,OACfA;SAGF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA8BA;;6CAQIC,YACA;SAEkBC,SACpBC;UACAC;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,oBAOsBF,SACpBG;YACAD;aACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,Q,C,K,C,C,C,C,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;;;sDAyB4B,AApQJnC;;MAyQpBqC,UACA;UA9IE,AA9HmBrC,iBA8HE,gCACzBA;SAiJA6B,AAAAA;6BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,iBAvJM,AA9HmB7B,sDA+HvBA;SA8JA6B,AAAAA;+BAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CAtNA5B,gBAIEqC,aACF,A,C;A,E,CAZArC,cAIEsC,WACF,A,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,G,C,mB,C,E,CAXAtC,4EAGiE,A,C,E,CAGjEA;;SAKA,A,C,E,CAEAA;;SAKA,A,C,E,C,CAsGAtiB,mBAIE6kB;;;+CAvL6B,AAAPxC,QA2LlBmC;KAEAM;KAGFpe,8BAaJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C,E,C,CAyFA1G,mBAGE;KAEcmkB,OACZA;WACAK;;GACiB;6BAAQ,CAC7B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C,E,C,CAUAxkB;;KACE;;GACM,CAAC0G,QAAoB;EACTA;iBAEWA,SACzBA,AAAAA;aACIqe,QAAkBA,QACtB;kBAEqB;GAEI,AAAvBZ,eAGFa,WACA;SAEUb;MACI,CAACzd,AAAAA,mBAEUA,SACzBA,AAAAA;aACIqe,QAAkBA,QACtB;;GAGE,sBF3BN/d;;;;;GE4HM,MACoB,AAAlBmd,kBACiBc;SAEIve;YAIzBF;GAE+B,AAA7B2d,cACFe;GAGU,QF/HdnE;OEgI4B;;;;;;;;6CApcC,AAAPsB,SA4chB8B;;;SAKFE,SACA;eAIYF,MACZA;iBAEYA;KAEZA;KAAmBY,QAAkBA;;IAIzC,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAtU4B,WACtBP,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAoCY,YAERK,aACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKS,cAEPA,eACF,A,C,Q,C,C,C,C,M,C,I,C,M,C,C,C,I,C,C,C,Q,C,Q,C,I,C,I,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmEoB,WACtBH,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAWwB,WACtBS,yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAqEEvnB;aAE2B8iB,UAAcyD,aACAzd,eACrC;oBAHF;;;sBAME;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,iB,C;A,M,C,CAEA;EAC2BA;;EACDyd;;GAEf,cAESzD,aAAoBqE,oBADpC;;;EAImCA;;;;;MAGjC;SAGqBZ;WACQ;;EAEzBiB;;;SACqB1E,OACeqE,QACAA;SAEfrE,OACcqE,oBAPzC;;;EAUmCA;;;;;MAGjC;;;QAQN,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,qB,C;A,M,C,CAEA;;;QAGqBrE,WAASyD,0BAD5B;;;cAG4Bzd,KAAAA;;;;;SACDA;;;;sDAOzByd;;WAEAkB;0CAeJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAfwB,YAGlBb,uBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAAY;;;;8CAKS;KACjBa;UAEFb,kBACF,A,C,Q,C,C,C,C,M,C,I,C,M,C,C,C,I,C,C,C,Q,C,Q,C,I,C,I,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CC/ORc,cACE,uDACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA+JAlS;;EACyB;;IAER,4CAYFoO,QAKb;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASApO;;EACmB;;IAEF,4CAQFoO,QAKb;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA6CApO;;EACyB;;IAER,4CAYFoO,QAKb;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAIApO;;EACwB;KAEtB;qCAEWoO,QAKX;SACF,A,C;A,G,CAWApO;;EACyB;;IAER,qCAIJoO,QAKX;SACF,A,C;A,E,C,CAGApO;;EAE4B,6BAC1B;0CAIWoO,QAKX;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAkDA8D;iBACE;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA2BAA;iBACE;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAiDAlS;;EACsB;;IAEL,0CAIJoO,QAKX;SACF,A,C;A,G,CAWApO;;EACsB;;MAIL;0CAKJoO,QASX;SACF,A,C;A,E,C,CA2LApO;;;2CAC6B;EACP;;IAEL,4CAQJoO,QAKX;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CA/hBM;;QACEL;sCAOEM,aAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CARI,WAAG,MAAY,qBAAS,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CACxB,sBAEI8D,0BAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAKI,WACN/D,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAgBA,YACEL,mCAGEM,uBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAJI,WAAG,MAAGtM,uBAAc,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACpB,aAAK,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAKD,WACNqM,iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAoDA;;QACEL;sCAOEM,aAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CARI,WAAG,MAAGpM,uBAAY,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAClB,sBAEIkQ,0BAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAKI,WACN/D,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAWF;IAAW,MAAI,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEP,WACNA,oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkBA,YACE+D,yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEQ,WACN/D,cACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAUA,YACEpc,eACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEQ,WACNoc,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAyIA,YACE+D,wBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEQ,WACN/D,mCACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CAoBA;;MAGA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEQ;QAEJA,cACA;OAEFA,mCACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAmMA;GACY,aACR+D,kBACA;WAEI,YACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEQ,WACN/D,4CACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CP9WJgE;EACEC;GCjf4C,CAAjB,AAAPpD;;;2EAtFZrB;MAARC;;EAiIyBD,IAAzBO;MACAA;MACA;QACA;MACAA;KAAmC,AAAPc;GAsBdpB,SAEZiC,KAAYwC,KDya8C;SACvB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAMvCnoB,YAAiB,MAAwB,CAAA,AlCjlBfM,KkCilBN4nB,wBAAiC,A,C;A,C,C,CAErD7nB;;YAC8B;;2CACK,QAEjC;MAAiB+nB,QAAyB,QAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CASAvS,WACE,MAAOqS,AAAAA,qBACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,WACEA,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,WACEA,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,0B,C;A,E,C,CExfA,YAEEG,QAAU1B,AAAAA,cACZ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iCAEEhT;QAAW4S,OAAmCI,SAChD,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,+BAEE2B;QAAU3B,AAAAA,cACZ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EAuDyB7B;GAA0B,CAAnB,SAtDb;EAIsB,CAAA,AAAtB,YAAjBA;;GAEI,OAAuB,AAATyD,iBAAkBA;GAyddzD,SA2BLA,WAtcgB,WAIH,UAjDO0D,QAAeC,YACtD,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAEA,kBA4CyB3D;GAA0B,CAAnB,SA3Cb;GA+CU,cAmC3BA;;GA/EM,SA2C8C,CAAtB,WA1CP,AA4fL4D,AA5fMH,iBAElBA,AAAAA;OAGO,CAAA,iBAAPzD;;IAoCwB,UAnCN0D,QAAeG,cAIzC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA9S,iBAIS,CAAA,AAAPiP,uBAAAA;;GAuBiD,CAAnB,SAtBb,MAAO8D,QACxBC;SACA;MAAOD,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CA6BAvoB,WAAkB,MANW,AAAPykB,cAMQ,A,C;A,E,C,CAE9B;EACS,CAAA,AAAPA,cAAAA;;GAVoD,CAAtB,aAY5ByD;GA0ZoBzD,SA2BLA,WAlca,UAeZyD,YAClBK;QAAgBhD,UAClB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAyBA,oBA5CyBd;GAA0B,CAAnB,SA8Cb;GAzCS,KA2CxBO;KAEAyD,uCAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,oBAtDyBhE;GAA0B,CAAnB,SAuDb;GAlDS,KAoDxBQ;KAEAwD,4BAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,iBA/DyBhE;GAA0B,CAAnB,SAiEb;EACV,CAAA,QAAPA;;GA7D0B,KA+DxBU;KAEAsD,cAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMA,YAEA,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,YAEA,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEAjT,YAEA,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUA;EAC8B0S;mCACIA;UAChCQ;EAlGuBjE;IAAO,aAoGrB,CAAA,SAAPA;;GACI,MACFyD,AAAAA,kBAGN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIA,kBAlH4BzD,OAuH1BA;QAAO,CAAA,SACP6B,AAAAA;WAAsB0B,UACtBvD;QAAO,CAAA,AAAPA,uBACAkE;QA1HwD,CAAvB,UA2HnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EA7H4BlE;;GAUiC,CAA1B,UA0I/BA,QAAO,CAAA,SACP+D;SAIEI;gBAGFA,UAEAD;QA9JsD,CAAvB,WAgKnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,WAcEH,SACA/D;QAAO,CAAA,AAAPA,eAIEoE;wBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CASA,kBAhM4BpE,OAmM1BA;QAAO,CAAA,SACPhc;UACAgc;QAAO,CAAA,AAAPA,uBACAkE;QAtMwD,CAAvB,UAuMnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYA;EA9MyBlE;GAA6B,CAAtB,WAkdZ4D,AAlQCH,oBACV,CAAA,iBAAPzD;;GAtNsD,CAAvB,YAS/B,SAAeyD;WA8cCG;;QA/PP,CAAA,iBAAP5D;WAKJ,gBA3NiD,CAAnB,UA6N1ByD,YACA;SAhOoD,CAAvB;cAoO/BzD;QAAO,CAAA;KAEL2D;KAEAE;EAEK,CAAA,AAAP7D,uBAAAA;UAEF,GAvOoD,CAAtB,WAwOX,MACjByD,AAAAA,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,6B,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CA7GE;;EAjIuBzD;GAA0B,CAAnB,WACI,UAmIK,MACrCA;KAAO,CAAA;EACF6B;GAAD,CAACA,WAEHnD;OACS7P;;EAAAA;;KACTgT;KAEAA,UAEF7B,KAAO,CAAA,AAAPA,qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAsBA;;EApK2BA;IAAO,UAuKV,MACtBA;KAAO,CAAA,SACP6B,AAAAA;QAAiB2B,KACjBxD;KAAO,CAAA,AAAPA,qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA4EFmD,wBAKoCkB,eAClCnF;OACAA;SACAA;OAEA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIAoF;;;;wCACE;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,G,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,W,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CAwGA,YACEC,KAAmBtgB,QACrB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CASA,YACEsgB,KAAoBC,QAAOC,SAC7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAMA,YACEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAG,WAAuB,OAAO,A,C;A,G,CAE9B,2DAEA,A,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAsCA,kBATwB1E;SAUL;GATgB,MAa/BA,SACA;OAEF2E,sBAMA3E;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAPoB;;EACDA,IACfA;;SACiC,MACjC4E;aACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,CAsBFrpB,YAAiB,MAAGqoB,eAAwB,A,C;A,C,C,CAE5C,oBACMA;YACkBA,SAApBiB;eAEmBjB,QAAnBA;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EAEwBiB;EACFlkB,OAApBkkB;;WAEEjB,YAEFjjB;QACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,eAhEwBqf,YA2BLA,SAuCG4D;YAApBiB;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,G,C,C;A,G,C,c,C;A,M,C,CCzqB4B,WAAG,MAAG1F,0BAAuC,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQxE,cAA+B,MAAG2F,yBACQ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAOf,WAAG,MAAG3F,mBAAsB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAuBxDgE;;;;;;;gBAMEpgB;OACAA;SACAA;OACA;SACF,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQA,cAEEgiB,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,+B,C;A,E,C,CA+BA,iBDiG+C,CAAjB,AAAP/E,eChGN;oCAEjB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBD4F+C,CAAjB,AAAPA,eC3FN;iCAEjB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIA,iBACMgF;WAAuB,MAC3BA;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,iBACMA;WAAuB,MAC3BA;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEAjU,iBACMiU;GAAc,SAEhBA,YACA9F;OAEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAIA,YACE+F,AAAAA,mBACF,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cAjEEF,aAmEF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,WAjEEA,UAmEF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,CAtDAG;EAEyCC;EACSC,UADhDJ;QAAgBC,AAAAA,AAAAA,gBAE+BI,cACjD,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAgEA;;MAGgBC,sBADd;;kBAGEP;SACA;iBAGAA,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAeA;;MAGkBQ,sBADhB;;kBAGER;SACA;OAEFA,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CA+EA;GACiB,KAAXhR,YACFgR;EACW,KAAXhR,UAAAA;;GACe,UAGbgR,QAGN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CAjBAS,iFAKA,A,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAkDA,iBACiB,KAAXzR,YACFA,QAAU,KAAVA,UACA;OAEFgR,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CAbAU,2DAI6B,2BAC7B,A,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,kD,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,oB,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,M,C;A,G,CCuFA/G,WAAe,MAAGgH,SAAiB,A,C;A,E,C,CAInChqB;EACqBgqB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,iBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjqB;EACqBgqB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjqB;EACqBgqB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,iBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjqB;EACqBgqB,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,mBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAnG;EACqBkG,OACnB;OAAOC,AAAAA,yBACIA,QACX,AACA;MAAO,qBACuBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAlG;EACqBiG,OACnB;OAAOC,AAAAA,yBACIA,QACX,AACA;MAAO,qBACuBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjG;EACqBgG,OACnB;OAAOC,AAAAA,yBACIA,QACX,AACA;MAAO,qBACuBA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EACqBD,OACnB;OAAOC,QAAAA,iBACIA,QACX;EAC8CA,QAE9ChB,AAD6BgB;kCAE/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAtG;EACqBqG,OACnB;OAAOC,QAAAA,iBACIA,QACX,AACA;MAAO,AAACA,2BACsBA,iBAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAWA;EACqBD,OACnB;OAAOC,QAAAA,kBACIA,QACX,AACA,AAACA;2BAC6BA,eAChC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAjH;EAEqBgH,OACnB;OAAOC,QAAAA,iBACIA,QACX;EAC8CA,QAC9C;MAAO,AAACA,qCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAsBApqB,YAAqC,MAAGqqB,cAAcC,QAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1EnqB;MAEWoqB,UAAP;oBADF;;kBAGE;MAAOC,eAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEArqB;MAEWsqB,YAAP;oBADF;;kBAGE;MAAOD,eAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEArqB;MAEWuqB,cAAP;oBADF;;kBAGE;MAAOF,eAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAvG,oBAC4B0G;KAExB;KAEA,wBAEJ,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzG,oBACiC0G;KAE7B;KAEA,wBAEJ,A,C,mB,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzG,oBAEkC0G;KAE9B;KAEA,wBAEJ,A,C,mB,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAvBW,WAAG,MAAG,mBAA0B,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAEhC,WAAG,MAAG,mBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAOzB,YAAM,MAAG,qBAAoC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAE7C,YAAM,MAAG,qBAA6B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQtC,cAAa,MAAG,uBAA4C,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAE5D,cAAa,MAAG,uBAAqC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,G,CAkBhE1H,WAEE,MAAOiH,AAAAA,eACT,A,C;A,C,C,CAEAzjB;EACekI;EAAAA;YACSA,QAAuB,QAEzB;MAAOub,AAAAA,gBAG7B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAIAjqB,cACE,MAAO,6BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAgjB,cACE,MAAO,6BACT,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,iC,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAhjB,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAA,cACE,MAAO,6BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAA,gBACE,MAAO,+BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA8jB,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC,YACE,MAAO,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,YACE,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAL,cACE,MAAO,6BACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAMA,cACE,4BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAKS,WACPM,8BASF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CATyB;QACrB/gB;;;;;OAE6C4lB;GACnC,QACR5lB;aAGJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAqGmB,8EAIjBynB;gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,G,CAQFC,WAAmD,cACvB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CAC5BC,WAAmB,cAAW,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CAC9BC,WAA6B,cAAgB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CAC7CC,WAA+B,cAAiB,A,C;A,E,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C,C,C;A,G,CAChDC,WAA6C,cAAwB,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CACrEC,WAAuD,cACzB,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CAC9BC,WAAyD,cAC1B,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,G,CAC/BC,WAA+C,cAAyB,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CACxEC,WAAmC,cAAmB,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,M,C,C,C,C,C,C,C;A,G,CAGtDC,YAAuB,cAAa,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,I,C,C,M,C,C,C,C,C;A,G,CACpCC,WAAqB,cAAY,A,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,oB,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,G,CAMjCtI,YAAgB,OAAO,A,C;A,G,CACvBuI,WAAqC,YAAiC,A,C;A,G,CACtEvI,WAAoB,YAAO,A,C;A,E,C,CAE3BnjB,YAAqC,MAAGsqB,gBAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEpE3jB,cAAwB,OAAO,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAI/BxG,cAA0D,MACtDwrB,0BAA6D,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEjExI,cAA6D,MACzDyI,0BAAsD,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,iC,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAE1DzrB,YAAiB,MAAG0rB,wBAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEjD1rB,cAA8B,MAAG2rB,0BAAuC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAExE3rB,gBAA6C,MACzC4rB,4BAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEnD9H,YAAmC,SACW,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE9CC,YAAgD,SACG,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEnDC,YAAyD,SACL,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEpD,YACE6H,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAlI,cAA+C,MAC3CmI,0BAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKnD,cCj2BA5H,ODi2BwB;OAAqC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C,A,E,mB,kB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CIt2B/DrkB,cAA0B,MAAK,WAAI,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEnCL,YAAwB,MAAGqB,SAAU,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C7CD7BG;;wBAME;iBAoBN;MAAO,iBACT,A,C;A,E,CAEMA,cAA2B,mDAAwB,A,C;A,E,CAq4BnDA,YAA2B,iDAAqB,A,C;A,E,C,C8CrhBxDjB;GACMgsB,eAAsC,aAC1CA;;;IAGEC,kBAEAD,iBAEM,SAAA;YAAA;SAAR;M3C5I2Bvf,M2C6I7B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA;EAiBgBzL;;GAGd;eAAc,MAAwB;GAChC,CAAC6Y,MAAe;MACHA,OACjB1F;;GACsB,AAAZhP,eAEZ,GASI,CAAC0U,UACO,KAA4B;;EACrB1F;;EACGA,eAEN0F;GAEV,CAACA,UACO,MACR1F,cACA;;;EAGkBA;GACY,AAAtB+X,kBAECrS,UAIX;KAAOA,iBAEMA;GAED,OAQR,eAAc,MACD;;EACyB,KAA1B1F,KAAAA;6BAA0B;SAEtC,AACAA,aACA;QAEJ;;GAIqD,AAA3B,AAAtB+X,SAAwBC,eAOtB,EAAe,AAAbhY;mBAQZ;eAAc,MAA+B,AAAbA;;EACM,KAA1BA,KAAAA;6BAA0B;;;SAKtC,GACY,QACVA,SAEFA;SACAA;UACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C9ChEQlT,2CAME;wCAMA;oBAcN,MAAO,iBACT,A,C;A,E,CA20BMA,kBAME,wDAqBR,A,C;A,E,C,C+C5vCAiB;IACE;iBAAkB,EAAE2U,gBACJA;;yBAAwB,cACxC,EAEa;IAEXA,cACAvP;;MAEA8kB;qBASA9kB;;8BAGAuP;QAGF,M5CwKyBpK,S4CvK3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,kB,C;A,E,C/C3CAhN,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,G,CAE/BxD,YACE,2CACF,A,C;A,G,CAEAA,YACE,MAAO,oFACT,A,C;A,E,C,CAEAV;wBA8L8B,mBA5LZusB,OACd;kBAiNW,6DA/MAC,OACX;kBA8MW,kBA5MAC;WACO,QAElB;MAAqC,AAA9BC,WAsOEC,mBApOb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA3sB,kBACS4sB,SAAAA;UAAP;MT0M6BnsB,0BSzM/B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cACEmB,uBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEA4M;wBAqK8B,mBAnKZ+d;;;eACd,2DAEWC;;;eACX,gBAEWC;WACO;IA+MTE;EA7MGD,YACZ;MAAc,YAA8C,MAEhE,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;wBAqJ8B,mBAnJZH;cAC4BM,MAArBN;UACrBO,iEAEWN;cACsBK,MAAfL;UAClBM,sBAEWL;cACsBI,MAAfJ;YACPE;;YAGTI,eACA7oB;QAAO,AAAPA,SACAyK;oBAEY+d;GACF,OAC6B;gBAGrCxoB;QAAO,AAAPA,SACAyK;gBAIR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CASAH;wBA+G8B,gBA7G1B,MAAOwe,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IA2JTE;EAzJGD;GACF,IAAK,MAGfxoB;QAAO,AAAPA,SACAyK;YAGA;yBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,eACc,AAARzK,WACyByK,YAAR8d;YAARD;YAAXD;YACAroB;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;EACc0oB,SACZ;MAAyB1kB,aAAe,eAEtCqP;WAAY;OACoB5I,aACxB,KAAA,YAEV,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/N;EACM+N;GAAM,QAAS;QACIzK;;EAITqoB;GACF;UAGV;YAAkB,uBAIlB;EAISC;GACF;UAGP;QAAkB,wBAMlB,GAISC;GACF;UAGP;QAAkB;UAIhB;QAAkB,wBAIlB,CACF,CAGK9d,SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,+BAEIzK,QAAO,AAAPA,SACAyK;aAEFoe,YACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAve;GACY,SAkCG,cAjCDye;WAEV/oB;QAAO,AAAPA,SACAyK;YACA;cAEA,OAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAaAhP,YAIE,MAAkC+a,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAwCA/a;WACsB;UAEpB;QAAkB,YACiB,aAAQ,QAC3C,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,C,CArCAyC,wBAIE;oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,E,C,CAEAA;YAYA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C,E,C,CAoBAA,oCAQE2qB;;gCAEA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA5QwC,YAAO,MAAG,eAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmB/B,YAAO,MAAc,MAAX,sBAAcrkB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAIpC,cACZ,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CAuPF/I,YAIE,MGpUyC2e,mBHqU3C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA3e;WACsB;UAEpB;QAAkB;yBACkC,SACpD,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,4B,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CAUA6O,iBACM,AAAC0e,gBAAgB,MACrB;0CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAltB,eACM,AAACktB,gBAAgB,QACrB;sCACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA1e,iBACM,AAAC0e,gBAAgB,MACrB;2CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAvtB,YAIE,MAAkCwtB,sBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAxtB;WACsB;UAEpB;QAAkB,YACZytB,qBAA4C,QAClD,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAltB,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAlC3C+e;yDACiE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAd,gCAAI;SAAQC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAyC/D3tB,YAAe,MAAGkP,AAAAA,YAAY,A,C;A,G,CAC9B7O,YAAiB,MAAG6O,AAAAA,gBAAiB,A,C;A,E,CAErC5N,kBACmC4N;aAAMA;wCAAvC;SACF,A,C;A,E,C,CAEA7O,cACE,MAAO6O,AAAAA,eACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EACcA;EAAAA,MACZ;mBAAwD,SACtDD;OACgCC,UACxB,KAAA,SAEV,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CAWAtO,WAAc,MAAG6I,SAAQ,A,C;A,C,C,CAEzBpJ;EACa2O;EACE4e;EACmB1e;OAAAA,UACxB,KAAA;QACU,aAChBzF,YACA;cAEAA,YAIAmkB;WACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,wB,C;A,E,CAgEA5tB,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,G,CAE/BxD,YACE,2CACF,A,C;A,G,CAEAA,YACE,MAAO,oFACT,A,C;A,E,C,CAEAV;wBA8L8B,mBA5LZusB;WACO,QAErB;MAAY,8DAEDC;WACO,QAElB;MAAY,mBAEDC;WACO,QAElB;MAAqC,AAA9BC,WA8MEC,mBA5Mb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA3sB,YACE,MAAOkI,4DACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cACEtG,uBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEA4M;wBAiK8B,mBA/JZ+d;WACO;MAErB;oBAA+BiB,0DAEpBhB;WACO;MAElB;oBAA+BgB,eAEpBf;WACO;IAmLTE;EAjLGD;GACF,IAAK,MAEf;MAAOc,aAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;wBA2I8B,mBAzIZjB;cAC4BM,MAArBN;UACrBO,iEAEWN;cACsBK,MAAfL;UAClBM,sBAEWL;cACsBI,MAAfJ;YACPE;;iBAGgBc;OAGbf;GACF,KAERc;YAEyBC,gBAKjC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAjf;GACME,WAAkB,MAAO;EACnBgf,UACV;aACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAlf;wBAsG8B,gBApG1B,MAAOwe,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IA8HTE;EA5HGD;GACF,IAAK;kBAIfiB;UAGA;MAAOH,UAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,eACc,AAARtpB,WACkC0pB,YAATC;YAARpB;YAARD;YAAXD;YACAroB;SAuCF4pB;QAAsC,AAAL,AAAfA,oBApCpB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;EAC2BD;EACLC,OACpB;KAAY,UACVvW,SAAOiW,QAAWA;GACA,IAAGM,aACb,KAAA;EAEDN,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;gBAG+BC;KAE3BD,SAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAhf;WACqB;;WAED,MAClBmf;;WAEA;MAAOH,SACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAUAO;;GAEMF,eACOD,SAATC;iBAEyBD,OACzBJ;MACQQ;QAARJ;UAEF1pB,QAAO,AAAPA,SAbA4pB;QAAsC,AAAL,AAAfA,kBAelB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAGA;EAC+BN;EACJA;WAGvBK;KAEAjJ;WAIAgJ;KAEAvoB,QAEFnB;QAAO,AAAPA,SAlCA4pB;QAAsC,AAAL,AAAfA,mBAoCpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAaAnuB,YAIE,MAAkC+a,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAoBA/a;WACsB;UAEpB;QAAkB,WAEF,KAAV6tB,cAAkB,QACxB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAeAttB,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,C,CAb3ClM;;gCAUE;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAzPwC,YAAO,MAAG,eAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAuBzC,YAAO,MAAc,MAAX,sBAAcsG,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAI1B,cACZ,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,CAkOF/I,YAIE,MG3vByC2e,mBH4vB3C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA3e;WACsB;UAEpB;QAAkB,WAEF6tB;yBAAiB,SACjC,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,kC,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,C,C,CAWAhf,iBACM,AAAC0e,gBAAgB,MACrB;0CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAltB,eACM,AAACktB,gBAAgB,QACrB;sCACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA1e,iBACM,AAAC0e,gBAAgB,MACrB;2CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAvtB,YAIE,MAAkCwtB,sBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAxtB;WACsB;UAEpB;QAAkB,WAEZytB,QAAQI,mBAAiB,QAC/B,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,M,C,C,E,CAlCAS;gEAEiE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAd,gCAAI;SAAQX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,O,C;A,E,CAkD/D3tB,YAAe,MAAGkP,AAAAA,YAAY,A,C;A,G,CAC9B7O,YAAiB,MAAG6O,AAAAA,gBAAiB,A,C;A,E,CAErC5N;EACyC4N;aAAMA;wCA2B7Cqf;KAAQrf,IA3BR;SACF,A,C;A,E,C,CAEA7O,cACE,MAAO6O,AAAAA,eACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EAC2BA;EAAAA;EACLA,IACpB;KAAY,UACVD,SAAE4e;GACgB,IAAG3e,UACb,KAAA;EAED2e,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CAaAjtB,WAAc,MAAG6I,SAAQ,A,C;A,C,C,CAEzBpJ,iBACwB6O;GAAH,AAAfif,UAAkBjf,UACd,KAAA;OACGqf;YACT9kB,YACA;cAEAA,QAAW8kB,OACXA;QAAQA,AAAAA,aACR;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,K,C;A,E,CA+DAjtB,gCACsCktB;wCAApC;SACF,A,C;A,E,CAEAxuB,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,E,C,CAE/BlE;wBAkLsC,mBAhLpBusB,OACd;kBAuMW,6DArMAC,OACX;kBAoMW,kBAlMAC;WACO,QAElB;MAAwC,AAAjCC,WA4MEC,mBA1Mb,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEApsB;0BAmKsC;;KAjKlC,MAAO;EAEEksB;WACO;IAmMPE;EAjMCD;GACF,IAAK,MACf;MAAO0B,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAGApuB;wBAsJsC,mBApJpBusB;;;gCACOA;;IACrB,MAAOO,gEAEIN;;;gCACOA;;IAClB,MAAOM,qBAEIL;;;gCACOA;;MACPE;;;QAMC,AADED,gBACI;UAGlBxoB,QAAO,AAAPA,SACAmqB;YACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAA,QAAA,OACEC,SADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAtuB;wBAqHsC,gBAnHlC,MAAOgtB,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IAmJTE;EAjJGD;GACF,IAAK,QAGfxoB;QAAO,AAAPA,SACAmqB;;aAIA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAoBA,eACc,AAARnqB,WACyBmqB,YAAR5B;YAARD;YAAXD;YACAroB;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAtD;EACMytB;GAAU,QAAS;QACAnqB;;EAITqoB;GACF;UAGV;YAAkB,uBAIlB;EAISC;GACF;UAGP;QAAkB,wBAMlB,GAISC;GACF;UAGP;QAAkB;UAIhB;QAAkB,uBAGlB,CACF,CAGK4B,SAAP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAruB,iBA4Ce,WA3CuB;MAEpCkE;QAAO,AAAPA,SACAmqB;YACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAruB,iBACY,SAmCG,uBAjCXkE;QAAO,AAAPA,SACAmqB;YACA;cAEA,SAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAcA1uB,YAKE,MAAkC4uB,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAwBA5uB;WACsB;UAEpB;QAAkB,WACiB,aAAY,QAC/C,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CAmBAA,YAIE,MGhrCyC2e,mBHirC3C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA3e;WACsB;UAEpB;QAAkB;yBACsC,SACxD,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,e,C;A,E,CAyEAY,WAAc,MAAG6I,SAAQ,A,C;A,C,C,CAEzBpJ;EACiBquB;EACFd;EACuBiB;OAAAA,UAC5B,KAAA;QACU,aAChBplB,YACA;cAEAA,YAIAmkB;WACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAuEAtsB,qCACyC6sB,0BAyXvCI;KAAQM,AAAAA,OAzXR;SACF,A,C;A,E,CAEA7uB,YAAe,MAAGuE,SAAO,A,C;A,G,CACzBlE,YAAiB,MAAGkE,aAAY,A,C;A,G,CAChClE,YAAoB,MAAG,AADHkE,aACW,A,C;A,E,C,CAE/BlE;wBA+MsC,mBA7MpBusB;WACO,QAErB;MAAY,8DAEDC;WACO,QAElB;MAAY,mBAEDC;WACO,QAElB;MAAwC,AAAjCC,WAiOEC,mBA/Nb,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEApsB;0BA4LsC;;KA1LlC,MAAO;OAEIksB;WACO;IAwNTE;EAtNGD;GACF,IAAK,MACf;MAAO0B,AAAAA,kBAEX,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA;EAC2BP;EACLC,OACpB;KAAY,UACVvW,SAAOiW;GACW,IAAGM,aACb,KAAA;EAEDN,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAOAjtB,kBACMqtB;6CACJ;MAAOA,SACT,A,C;A,C,C,CAGA5tB;wBAwJsC,mBAtJpBusB;;;gCACOA;;IACrB,MAAOO,gEAEIN;;;gCACOA;;IAClB,MAAOM,qBAEIL;;;gCACOA;;MACPE;;iBAGgBc;QAIf,AADEf,gBACI;OACSe,YAG3B,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAA,QAAA,OACEa,SADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAtuB;wBAuHsC,gBArHlC,MAAOgtB,SAAsBT;+CAE7B,MAAOS,SAAsBR;OAElBC;WACO;IAiJTE;EA/IGD;GACF,IAAK,QAIfiB;yBACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAmCA,eACc,AAARzpB,WACkC0pB,YAATC;YAARpB;YAARD;YAAXD;YACAroB;SAyBF4pB;QAAsC,AAAL,AAAfA,oBAtBpB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA9tB,iBAEW,WAAS;KACaytB,UAC/B;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAztB;WACqB;;WAED,QAClB2tB;;WAEA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUAc;;GAEMZ,eACOD,SAATC;iBAEyBD,OACzBJ;MACQQ;QAARJ;UAEF1pB,QAAO,AAAPA,SAbA4pB;QAAsC,AAAL,AAAfA,kBAelB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA;EAC+BN;EACJA;WAGvBK;KAEAjJ;WAIAgJ;KAEAvoB,QAEFnB;QAAO,AAAPA,SAlCA4pB;QAAsC,AAAL,AAAfA,mBAoCpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAcAnuB,YAKE,MAAkC4uB,mBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAoBA5uB;WACsB;UAEpB;QAAkB,WAEE,KAAd6tB,cAA0B,QAChC,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C,C;A,E,C,C;A,G,C,e,C;A,E,CAyHAjtB,WAAc,MAAG6I,SAAQ,A,C;A,C,C,CAEzBpJ,iBACwBwuB;GAAH,AAAfV,UAAkBU,UACd,KAAA;OACGN;YACT9kB,YACA;cAEAA,QAAW8kB,OACXA;QAAQA,AAAAA,aACR;WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,CgD/uDAvuB,YAAe,MAAG0Y,MAAAA,SAAc,A,C;A,C,C,CAChC9X,cAAwB,MAAG8X,MAAAA,WAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CCmCnDzX;+BAC+B;UAAwB,4BACb;;yBAExC,MAAA,kBAAA,aAAA;EAAgC;8BAAR4G;OAAqB,AAC7C,SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAIAtH,YAAkB,MAAGO,oBAAwD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CHgJ7EC,cAA2B,MAAG,qCAAuC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAErEA,cAAqC,kDAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKrEV,mBACE;MAAA,cAAA,UACQ,KADR,UACoB,QACpB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACE;MAAA,cAAA,OAAwB4O,SAAxB,OAAkC,CACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA4BA1O;EACyB;GACnB,CAACwuB,MAAqB;EACJ;UAEpB,SACkBA,O3COpB/hB;KAA6CA,a2CNlC+hB,MAAoB;KAE7BC,SAAgBD,QAChB;KAAOA,Q3CGT/hB,KAA6CA;M2CDzB+hB,O3CCpB/hB;KAA6CA,O2CA3C,CAEF,M3CSyBA,M2CR3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEA3M,mBACE;MAAA,cAAA,UACM4O,SADN,aACkB,QAClB,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAhO,cAAwC,MACpC,+BAA0C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,CAI9CjB;EAGgB+uB,aACd;QAAO3U,UAEP,AACA;SACF,A,C;A,G,CAEA/Z,YAAiB,MAAG,CAAC0uB,AAAAA,kBAAmB,A,C;A,G,CAExC1uB,YAAoB,MAAG,AAAC4uB,qBAAO,A,C;A,E,C,CAE/BluB,cACE,MAAO,gCACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMAA,cACE,MAAO,gCACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAcAH;EACgBmuB;GACV,CAAC3U,wCAIL;KACWA;MACHA,MAAc,AACtB;SACF,A,C;A,E,C,CAUA5Z,uBACE;MAAA,cAAA,UAAA;GACMsX,iBAAe,SACrB,2CAGF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,e,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAgCAlX;2CAC6B,SAAW,KAAA,OAEtC;MAAA,kBAAA,UAAA;;GACgB,SAAM;EACX,SACX,KACM,KAAA,QACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAkBAL,YAAkB,MAAG2uB,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,CInW5C5tB,YAAyB,uB1DoQaC,qC0DpQe,A,C;A,E,C,CAErDX,cAAuB,MAAG,aAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAErC;EACe;6BAAA;GACb;KAAkB,SAChBgX,SAAO;GACI,IAAG,gBACN,KAAA,SAEV,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAvX,YAAiB,MAAU,MAAPQ,cAAW,A,C;A,G,CAE/BR,YAAoB,MAAG,CAAC4uB,YAAO,A,C;A,G,CAO/BruB,eACa,KAAPC,gDACJ;MAAO,UAAY,KAAPA,eACd,A,C;A,E,C,CAQAR;EACe;;GACb;YAAoB;6BAAA;KAAF;GACJ,KAAR,eAAoB;GACb,CAAA,MAAG,iBACN,KAAA,aAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAaAA;EACe;6BAAA;GACb;KAAkB,YACZyX,SAAK,kBAAU;GACR,IAAG,gBACN,KAAA,SAEV,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAiDAvX;GACa,KAAPM,cAAa;EACK,QAAA;SACtB;M/C8GyBmM,M+C7G3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEAjM,cAAwC,4CAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE3EA,cAA2B,uCAAkC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA0B7DA,cAA4B,MAAG,qBAAsC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYrEE;iCAGa;UAAwBJ,mBAEZA;6BAAAA;;;8BAEvB;YAAoBA;6BAAAA;KAAF;EACJ;8BAAZgH;WACF,AACA,SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,C,C,CAWA,oBACO,UAAA;UAAW,UAAhB;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,uBACE;MAAA,QAAA,UAAA;EACO,UAAA;UAAW,UAAhB;cACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAxH;GACE;YAAoB;6BAAA;KAAF;GACJ,KAAR,gBACF,YAA6B,KAAZ,gBAAyB,IAC1C;UAAY,KAAZ,cACA;aAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA8BA,YAAe,aAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAahC,czDnQEe,SAAuB,KAATC,iByDyQhB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAkBA;GACY,UAAa,MAAE,iBACjB,KAAA,SAA+B;;GAE/B,UAAe,MAAE,iBACjB,KAAA,SAAiC,aAE3C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAJ;EACyB,UACvBC;;EACiB;2BACA;;6BADA;GAEjB;KAAkB,WACJ,SAAW;8BAAvB2G;OACF,AACA,SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA9G,gBACEG,cACA;MAAO,kBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACEA;;EACiB,GACjBiuB;YAA4B,KAAZ,kBAChB;UAAY,KAAZ,eACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA;;GAtCY,UAAa,MAAE,iBACjB,SAA+B;;GAE/B,UAAe,MAAE,iBACjB,SAAiC;EAoCxB;GACN,UAAM;GAEH;;;WASA5tB,AAAAA;iCAZG;;EAeS+V;6BAAAA;GAAF,AAAT;;GAGA,IAEb,MAAoB,IAAO,SACzB,SAAW,IAAOA,MAAqB,KACzC;KAEA,QAAkB,QAChB,SAAW,IAAOA,MAAqB,KACzC,CAEJ,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA4BAtX;EACoB;6BAAA;GAAH,KACb;GAKF;YAA6B;6BAAA;KAAF;GACb,KAAR,eACF,aAEJ,AACA,SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOAA;EAE6B,KAAZ,aASf;kBAA2B,WAAO,YACpB,KAAR,eACF,QAEJ,AACA;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA,sBAC2Ba;6BAAAA;EAAF;UACf,KAAA,SAA+BA;OAE1B,YACX8tB,WACA;OAMF,UAAW,KAAX,cACAQ;UAAe,IAAK,eACpB;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA;WAC2BtuB;6BAAAA;EAAF;UACf,KAAA,SAA+BA;;8CAG1BU;EAESA,OAItB;UAAY,KAAZ;6BAJsBA,OAKtB4tB;UAAe,IAAmB,eAClCC;eACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;;0EAE4B7tB;6BAAAA,OAAxB4tB;YAAsB,YAEtB,MAAA,QAAA,aACY,GAAV;WADF,QAEA,CAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIA5uB;GACMgsB,eACF;EAGW;IAEXA,aACA1kB;SACAA;YACAA;kBAEC0kB,eAGH,M/CpPyBvf,S+CqP3B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CH5ac;GACL,KACDnF;;QAGFA;OACAA;UACAA;QACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,ChD0SJvG,gCAiTa+tB,QACcA,QACTA;wCAnTO;SAAkC,A,C;A,E,C,CAE3D;EAC0BxqB,OACxB;MAAaJ,QAAS,IAAGE,UAAmB,CAAA,AAAL,IAAsB,AAAdD,AAAAA,yBACtCA;0BAAAA,SAAPkT;SAAOlT;GAqMqB,IAAGG,aACzB,YApMR,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAxE,YAAiB,MAAGoE,WAASE,QAAK,A,C;A,E,CAElC3E,YAAe,MAAmB,MAAT,KAAN2E,QAAQF,SAAwB,AAAdC,AAAAA,kBAAkB,A,C;A,G,CAOvD9D;EACM6D;EAASE;;EACND;EAAmB,KAAL,UAAsB,AAAdA,AAAAA;qBAAtBA,SAAP;MAAOA,MACT,A,C;A,E,C,CAQA9D;;GACY,UAAa,MAAEC,oBACjB,KAAA,SAA+BA;EAEhC6D;EAAQD;;EAAkBC;EAAH,CAAA,AAAT,IAA0B;mBAAxCA,SAAP;MAAOA,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAzD;+BAGW;UAAwBJ,4BAEZA;;yBAErByuB,UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,C,C,CAIA,cACElsB,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;;0EAGmBpC;EACF;6BADEA;EAEJ;EAAc0D;EAAAA;GAAH,QAgON6qB;6BAAAA;;;wBAElB5qB;QAAQ2qB,UACR5qB;SACAD;SRnZA3D;eQmLI6D;QAAM,KAANA,kBAG+BA;6BAAAA;EAAF;GAChB,KRvLjB7D,SQwLmC,QAC7B6D;QAAM,KAANA,kBAEwB,GR3L9B7D;SQ4LmC;EAC7B4D,OR7LN5D;eQ8LM6D;WAGJE,QAAkB,AAAlBA,eAEA,MAAA,QAAA,OAA4BzB,UAA5B,OAAyC,CAE7C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/C,qBACE;MAAaoE,QAAS,IAAGE,UAAmB,CAAA,AAAL,IAAsB,AAAdD,AAAAA,yBACjCA;0BAAAA;GACA,KADAA,SAEV8qB,UACA3qB;QAAkB,AAAlBA,SACA;UAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAuCA;EACMJ;EAASE;GAAH,OACR,MAA+CD,UAAAA,WAAc,IAAvC,QAAsB,CAAA,AAAL,+BAAQA,SAC7CA;UACF,AACQC,SAARF;SACAI;QAAkB,AAAlBA,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGAtE,YAAkB,MAAGO,oBAAwD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAiE7E;EACE4D;EAAOC;gCAAPD,SAAAA;;EACoB,CAAA,AAAL,IAAsB,AAAdA,AAAAA,qBAAvBC;;GACIF,YAAgBG,SACpBC;QAAkB,AAAlBA,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYA7E;EAC2B,AAAd0E,AAAAA;GAGO,AAFmB,CAAA,AAAT,EAAED,eACK,KAAV,KAANE,eAIjB,MAAYF,UAEVC,uBAFO,aACkB,CAAA,AAAL;mBACpBA;EAAYA;mBAAZA,SAAAA;OAEF,cAFEA,SAGFA;SACAD;QAAoB,CAAA,AAAL,UACf;MAAoB,CAAA,AAAL,kBAEK,KAAL,KAANE,aAATA;SAEA;MAEED,uBAFO,aACkB,CAAA,AAAL;mBACpBA;EAAYA;mBAAZA,SAAAA;OAEF,cAFEA,SAGFA;SACA;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA;QAC+C,AAAdA,AAAAA;;;EACnBA;EAAgBD;EAAF,AAAdC,URtXZ5D;;EQwXiC2D;EAAOC,ORxXxC5D;SQwX+B,QAC/B2D;SACAE;QAAQD,AAAAA,cACRA;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA1E;EAEMyE;EAASE;6BAAAA;GAAH,QACW;EACQD;EAAQD,ORlYrC3D;eQmYE;gBAEoB4D;EAAc,AAAdA,URrYtB5D;;EQuYiD6D;6BAAAA;EAAOD,ORvYxD5D;SQuY+C,QAC7C;MAAa,MAAN6D,YAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAnTA8qB;;;mBAOE/qB;oBACF,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,G,C,I,C,E,CARA+qB;;SAQA,A,C,E,C,CAmNAhtB;;EAEyB,CAAN,AAAA,WACjB;eAC0B,CAAA,EAAU;SACb,SAEvB,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,kB,C;A,E,CA+GA7B,WAAc,MAAG6I,SAAQ,A,C;A,C,C,CAEzBpJ;EACEqvB;GA9G8B,AA8GJ7qB,UA9GOA,UACzB;EA8GJ8qB;OAAaC,SACfnmB,YACA;WAESimB;;cAAAA,SAAXjmB;QAAWimB,IACXC;QAA4B,CAAA,AAAL,IAA6B,QACpD;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,e,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CoD/nBA3vB;EACM6vB;WAAe;EAMMC,OAIzB;0BACSC,QAASlJ;;GACP,YACHA;;EACGkJ,QAASlJ;GACP,aAEiBA,IACxBA;KAAemJ,IACfA;;GAEInJ;UAGNoJ;EAEUpJ;;YACI,YACVA;;EACGkJ,QAASlJ;GACP,aAEiBA,IACxBA;KAAgBmJ,IAChBA;;GAEInJ;UAGNqJ;EAEUrJ;;KAId,AAEAqJ,KAAarJ,IACboJ;KAAapJ,IACbA;KAAeiJ,IACfjJ;KAAgBiJ,IAChBD;SAEAC;SACAA;SACAK;QAAW,AAAXA,SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAsBAC,mBAEE;UAAOvJ,KAAc,aAEnBA,KAAgBoJ,IAChBA;OAEF,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAG;GACMP,cAAe;GAEV,CAAA,KADEQ,cACI;EACSR,OACxBS;QAAM,AAANA;EAEIT;EACMA;WAARA;OAIQU,UAARV;SAGAA;OAEFhrB,QAAkB,AAAlBA,SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQA,qBACEyrB;QAAM,AAANA,SACAzrB;QAAkB,AAAlBA;GACIgrB,eACFA,SACA;SAGO;EACKA;MAAZW,MACAA;KAAaX,IACbA;eAEAW,MACAA;KAAYX,IACZA;UAEFA,UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAmGA7vB,cAA6B,MAAGywB,cAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAIvD5hB;GAEM,AAAC0e,gBAAgB;GACX,AAANsC,iBAEO,KADEQ,cAGT,MAAOK,AADqBb,UAIhC;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAhhB;GACM,AAAC0e,gBAAgB;EACOiC;GAChB,QAAS,MAAOkB,IAC5B;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;;EAIaL;GACF,WAEPK,AAD4Bb,WAE5B;OAEFc,qDACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAyBA,cACE1uB,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEA5B,YACE,MAAQwvB,eACV,A,C;A,G,CAEAxvB,YAAoB,MAAG,AAHbwvB,eAGqB,A,C;A,E,C,CAE/B;;qCAsI2Be,QACPA;mBApIlB;KAAOC,UAC0BA;SAC/B5hB;SAAEuhB,SAAUA,SACd,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAEAxwB,YACE,MAAOswB,SACT,A,C;A,E,C,CAEA,YAvKET,YACAS;SACAzrB;QAAkB,AAAlBA,UAuKF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAxE,YACE,MAAOktB,kBAA8B,KAAZ8C,cAC3B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAhwB,YAcE,MAAOywB,iBAZiBX,gBAYXN,SACf,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEA9uB,YAAqB,2CAAqC,A,C;A,G,CAE1DA;wCAAuB;SAA0C,A,C;A,E,C,CAEjER,YACE,MAAOoO,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CArKAoiB;;;+EAEqE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAd,gCAAI;SAAQpD,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CA8GnD,cAAmB,gBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAiCpDttB,uBACE;+BAAY,aACK,KAAXmwB,OAAqB;GACH,IAAGL,UACjB,KAAA;EAEJK;GAAW,SAAWM,oBAAmB;EACtCN,KACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,E,CAsHFhY,iBACMwY;WAAsB,MAC1B;MAAOC,YACT,A,C;A,E,C,CAEA,iBACE;MACEC,QADU,UACVA;EACOV,QACT,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAsBAnwB;EAC4B8wB;GAAH,AAAnBtsB,UAAsBssB,UAClB,KAAA;EAOJD;G5D5PcrwB,c4D6PhBmwB,YACA;YAEoB,AAAlBG,OAAqBhB,SAA4B,AAAba,iBACrBA,O5DlanBnwB;;W4D4YEuwB,QAAwBD;KAExBA,KAAaE,QACbD;QAAwBD,AAAAA,+BActBD;EAOWA,OAAfF;SACAI;QAAwBJ,QACxB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAvEAM,cAIEF,QAAwBR,MAC1B,A,C,C;A,E,C,C;A,G,C,O,C;A,E,CA2EA5wB,YAAe,MAAGmxB,AAAAA,YAAY,A,C;A,G,CAC9B9wB,YAAiB,MAAG8wB,AAAAA,gBAAiB,A,C;A,E,CACrC7vB;EAAyD6vB;6BAhF9BP,KACPA;;oBA+EK;SAAsC,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAO/D5wB,YAAe,MAAGkP,AAAAA,YAAW,A,C;A,G,CAC7B7O,YAAiB,MAAG6O,AAAAA,gBAAgB,A,C;A,E,CACpC5N;EAA8D4N;6BAzFnC0hB,KACPA;;oBAwFK;SAA0C,A,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,Q,C,C,C,C,C,C,M,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CAKnEjD,YAAiC,MAAG6C,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CAK5C3hB,YAAoC,MAAG2hB,SAAU,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,M,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CAQjDJ,YAAiD,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,M,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C,C,A,E,gB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCnkB1DmB,8BA+CE;MAAOC,eAAaC,uBACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CApEMC;;;;+BAIJ;;KAKQ,KAAA,iBAGR,MAAOH,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CCmSA9kB,YAAmC,MAAGnB,QAAe,A,C,Q,C,I,C,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CD1RpB,cAAa,SAAGvC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAE/C0oB;+BAGI;kDASA;iBAAkB,EAAEzwB,kBAOQwwB,WAAUC,kBACtC,AACA;;ExDmlDGjuB,QAA8B,+BwD7kDnC;iBAAkB,EAAE+E,gBACLA,IACbtI;QAAWuxB,WAAYC,oBACzB;gDAQExxB,kBAAmBuxB,qBAAoBC,gBAEzC;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,K,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CClEAlxB,eACY,AAANoxB,cACF;KAEA,8DAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CARAC,mCAAkE,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAqBlErxB,YAAkB,uCAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CADrDsxB,oCAA6C,A,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CA0E7CrxB,cAEuB,MAmKUkxB,QAAkBI,AAnKrBC,eAE9B,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,gB,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAaAxxB,cAE2B,MAgEvByxB,QAA8BC,AAhEAC,eAElC,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,oB,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,G,CAEAC,WAC4B,YAE5B,A,C;A,G,CAEAC,WACwB,YAExB,A,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,G,C,C;A,G,C,O,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA+QA,kBACMC;GAAAA,eACI,KAAA,QAERA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA;GAIM,CAACC;EAVDD;GAAAA,eACI,QAERA;;MAUqBE;GACb,CAACD,cACG;KAAA,QAERD,qBALF;;KAOQ,KAAA,aAGZ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAQAhyB;;2BAEQ,CAACiL,YAAiB,QACtBue,AAAAA;WApFKhjB,WAqFL;yBAEAgjB,AAAAA,kBACA;yBAEAA,AAAAA,mBACC;0BAEDA,AAAAA,kBACA;wCAEAA,OAAAA;UACA2I;SACA3I;UACA;;wEAEA4I;EAEA5I,OAAAA;;GACa,KAATxoB,YACFqxB,QAAerxB;GACf;YAAoBA;6BAAAA;KAAF,UlDnNtB2L;KAA6CA,QkDqNvC0lB;QAAerxB,cACjB,CAEFwoB,SACAwI,AAAAA;eACA;2DAEAI;EAEA5I,OAAAA;;MAEA8C;wBAWA9C;SACAwI,AAAAA;eACA;cAEA,UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,M,C,C,G,C,2C,C,E,C,CAtJA5vB;;EAEwB,QAEtBkwB;aANgB,iBAOhB;MlDrFyB3lB,MkDsF3B,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,C,E,C,CAcAvK;;EACqByW;;6BAAAA;;GAGnB;KAAkB,WACDA;GACF,MAEX0Z;iBAGEA;;OAGAA;;QAGAA;;QAGAA;;QAGAA;;QAGAA;EACwC,AAAP,SAAjCA;OA7BwB,KAAU,KAAS;EA8BJ,AAAN,QAAjCA;OA9BwB,KAAU,KAAS;EA+BJ,AAAN,QAAjCA;OA/BwB,KAAU,KAAS;EAgCX,IAAhCA;OAhCwB,KAAU,KAAS;mCAqC7CA,UACAA;;UAEAA,UAEJ,AACAC,OAAuB,WACzB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAuEc;;;GACJ,QACFhJ,IAAAA;mBAEAA,IAAAA;WAEF2I,SACA3I;WACA6I;;OAEF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CClcJnyB,YAAgB,cAAU,A,C;A,G,CAqB1BuyB,WAAyC,kBAAoB,A,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAkB7D7xB;;EAGuE,KAAde;6BAAc;;;GAGrD,AAFEkwB,SAA+BlwB,WAE9BA,QAKEkwB,KAJAlwB,MAAgC,KAAdA,cAOvC;MAAOkwB,aAA2BA,MACpC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CAqDA7xB;EAOI0yB;EAAQC;IA8MA,oBAGF,AADA,OAAkC,AAAA,CAAzB,iBACD;EAjNM,GAAZA;;;cAARD,SAAAA;KAA+B,CAAA,IAAQ;EACnB,GAAZC;;cADRD,SACAA;KAA+B,IAAgB,AAAP;EACpB,GAAZC;;cAFRD,SAEAA;KAA+B,IAAe,AAAN,QAChCC;QAAY;cAHpBD,SAGAA;KAA+B,IAAQ,IACvC;gBAOoB,GAAZC;;;cAXRD,SAWAA;KAA+B,IAAoB;EAC/B,GAAZC;;cAZRD,SAYAA;KAA+B,IAA2B,AAAN,QAC5CC;QAAY;cAbpBD,SAaAA;KAA+B,IAAoB,IACnD;UAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAWA/yB;GACY,QAgLA,AAhL2BizB,OAAmB,4BAGnD;;EAyBCF;;;GAtBN;KAAsC,WACrBE;GAEF,UACPD;GAAa,UACTA;QAAY,GAApBD;gBAqKM,qBAnKe,AAAJ,AAAbC;EAG0C;GAC3BE,UADAD,sBAKV,WACHD;EAAa;GAAI,UACbA;;cAKRD,SALAA;KAA+B,IAAQ,KAC/BC;QAAY,GAApBD;KAA+B,IAAQ,YAGnCC;GAAiB,AAAJ;EACG,GAAZA;;cAARD,SAAAA;KAA+B,IAAQ;EACnB,GAAZC;;cADRD,SACAA;KAA+B,IAAe,AAAN,QAChCC;QAAY;cAFpBD,SAEAA;KAA+B,IAAQ,MAG7C,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,M,C,C,G,C,I,C,C,C,A,E,a,Y,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CnD1KAtwB,YAE8B,OAM9B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CoD8BAA,cAA+C,MAAGpB,WAAc,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CChBhEoB;sDAEI,MAAO6I;sCrD+KP0B;SqDlKA;MAAoBhL,oBAAF,WACDA;GACF,mBrD0K4BgL,UAA7CA;yBAA6CA,UAA7CA;wBAA6CA,UAA7CA;cAA6CA,UAA7CA;;GqDhKqB,KrDgKrBA;KAAAA;QqDzJsC,KAAkB,KACM;ECWxC;EtDgGf1M;EA6CsC0M,MAA7CA;yBAA6CA,WAA7CA;yBAA6CA,WAA7CA;csD7IsB;EtDgGf1M;EA6CsC0M,MAA7CA;QqD/IE,QrD+IFA;MqD7IE;SAEF,sB5DsdczD,Y4DrdhB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,CEzGA/H,YAAiC,mBAAwC,A,C;A,E,C,CvDgOrEnB,cACJ,6BACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA7NML,YAAoC,MAAG2e,SAAsB,A,C,Q,C,I,C,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,CAyE3Dlc,gBAGJ,MAAOnC,aACT,A,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,I,C,C,C,I,C,sB,C,Q,C,gB,C,I,C,C,C,C,C,G,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,CAmGMkB;EACU;GACH,OAAa,QACtB,MAAoBqG,aAAF,QAChBA,MACF,AAEF;SACF,A,C;A,C,CwDrHArG;cAEE;MAAA,QAAA,OACER,OADF,OAEA;KACc;EACDA;;;aAEb;8BAAkB;EACDA;uBAAfmyB;OACF,AACA,SACF,A,C;A,E,C,CCjGF;;;WlBKEzO;KkBAEC,YAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,CzDwMQnjB,YAIJ,MAAOlB,SACT,A,C;A,E,CsDlGAkB,YAEE,MAAO,MADe,gBAExB,A,C;A,E,C,C;A,G,C,U,C;A,M,C,CtDlEyB,cACrBqG,WGIoC+H,YHHtC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAsO0B;GAChB,MACJijB,YAEFA;OGvOkCjjB,QHwOlCijB;YACAA;OAASjU;IACR,MACH,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,E,C,C0DnOJre,YAAkB,6CAAyC6yB,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CChCnE7yB,YACE,2BACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,O,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,U,C;A,C,C,CCoQAF;;;GACM,wCAAsB,QAC1B;MAAQgzB,WAA0BpxB,MAC1BqxB,UAASrxB,KACnB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAyDAjC,cACI,MAAGqzB,SAAAA,QAAiCpxB,SAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAErEjC,YAAiB,MAAGqzB,SAAsB,A,C;A,E,C,CA2C1C9yB;;EnE+XUqJ;IACmC2pB,8BACHA;EmE5W7BC;EACAC,WnEgX2BF,2BACHA;EmEhXxBE,WnEqX4BF,0BACHA;EmErXzBE,WnE0X6BF,2BACHA;EmE1XxBE,WnE+X6BF,6BACHA;EmE/X1BE,WnEoY6BF,6BACHA;IAKQA,kCACHA;EmE1YhCG;KAEV;KAEA,gFAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CASAC,cAEE,MAAO,MACA,AAFEN,QAEAjP,QAAgCkP,SAC3C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C5DzTMK,WAGJrzB,WACF,A,C;A,E,C4DuIAqzB,iBAImC,oDAInC,A,C;A,K,C,I,C;A,M,C,C,G,C,yE,C,E,C,CAjFAlxB;EAuBgBmxB,SlErMNrhB;GkEsME;ElE3EehQ;qBAAAA;EMvDlBjC,KNuDkBiC;qBAAAA;EMvDlBjC,KNuDkBiC;qBAAAA;EMvDlBjC,KNuDkBiC;qBAAAA;EkEyFZsxB,SlEzFYtxB;qBAAAA;EkE0FVsxB,SlE1FUtxB;qBAAAA;EkE2FVsxB,SlE3FUtxB;qBAAAA;EkE6FL,KAA6B,KAA5BuxB,kBlE7FIvxB;;;qBAAAA;EkEkGA,AlElGAA;EMNlBjC,qB4D+GL;MAAO,QADsC,mBAIvC,KAAA,SAEV,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,CAcAqzB;;SAQA,A,C,E,C5DnJMA;;SAIN,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,C4DuFI3zB,uBACuB,QACrB;M5DrIGM,mB4DsIL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAuB,uBACuB,QACrB;M5D9HGvB,c4D+HL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyKFC;;EAEkB;GACP,QAAS;GACT,OAAQ;GACR,MAAO,oBAChB;sBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA,eACQ,OAAQ;GACR,MAAO,WACb;aACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA,eACQ,MAAO,UACb;YACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,C,C,CCtUFwzB,cACE,MAAO,UAAqC,AAAVC,QAAY/xB,eAChD,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMA8xB,cACE,MAAO,UAAqC,AAAVC,QAAY/xB,eAChD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CASA8xB,kDACE;MAAO,UtEzCMnyB,QAAAA,QsEyCgC,AAAVoyB,mBACrC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAQAD,iBAGe,eAAY,KAAA;oCACzB;MAAO,UAAqC,OAAVC,kBACpC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMA3zB,cAAgC,MAAkB,AAAf,SAAiB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMnE5B,cAAgC,MAAkB,AAAf,SAAiB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMnE5B,cAAiC,MAAkB,AAAf,UAAkB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAMrE5B,cAAiC,MAAkB,AAAf,UAAkB4B,QAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAiCrEjC,WAAuB,MAAa,SAAVg0B,cAAkD,A,C;A,C,C,CAU5E3zB;;;2CAC0B,QACxB;MAAO2zB,WAAa/xB,KACtB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC,YAAiB,MAAGg0B,oBAAkB,A,C;A,E,C,CAUtCh0B,cAA8B,MAAGg0B,SAAAA,QAAoB/xB,SAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAErE1B;;EAtB0ByzB;GAoCL,IAGjB,cADI,SAA2B;EAGRP,SAAUQ,QA5DN;EA6DJR,SAAUS,QAtDN;EAwDzBC,kBAAUC,mBACd;WAvE2B,wDAwE7B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,G,C,sD,C,E,CA/JA,sCAU8D,AADV,AADA,AADJ,AADF,AAAvB,cACC,aACE,WACA,UACK,UACD,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA6H5B7zB,eACQ,UAAW;GACX,SAAU;GACV,QAAS;GACT,OAAQ;GACR,MAAO,mBACb;qBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACAA,eACQ,MAAO,aACb;iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,G,C7D7GI8zB,WAA0B,0CAAqC,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CqDgCrE9zB,YAAkB,uBAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAYrCA,kBACMyE;GAAQ,QACV,oCAEF;4BACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,C,CAPAsvB,+BAA6B,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAgC7B/zB,YAAkB,yBAAiByE,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAb3CuvB,+BAAwC,A,C,C,CAGxCA,6CAAmD,A,C,E,CAOnDA,qFACqD,A,C,C,C;A,E,C,C;A,G,C,K,C;A,M,C,C,E,CAerDC,6BAAkB,A,C,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CrDqEZj0B;;IACc;;EAEdiP;GAAW,QACb,UAAWA,SAAF,MAAsB,oBACvB,UApBVxC;KAA6CA;aAkBzCwC;EAKSoP,KAAmBpP;8BAvBhCxC;KAA6CA,OAwB3C,EAEEynB;GAAgB,QAClBA,mBAWA;oDAAgDrlB,6BAC/BwP,KAAmB/N,wCAkBxC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CqDjEA6jB,+CASoD,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAepDn0B,YAAkB,gCAA4ByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,C,CADtD2vB,+BAA8B,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAkB9Bp0B,kBAAsB,OAAJ;MAAiB,4DAEU,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CAH7Cq0B,+BAAyC,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAgBzCr0B,YAAkB,oBAAgByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,C,CAD1C6vB,+BAAwB,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAkBxBt0B,kBACMu0B;WACF,iDAEF;uDACUlW,aACZ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CARAmW,+BAAkD,A,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAsBlDx0B,YAAkB,uBAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAErC8zB,WAA0B,OAAO,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAajC9zB,YAAkB,kCAEey0B,sCAAwC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAHzEC,+BAA8C,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CE5U9C10B,kBACMyE;WAAiB,iBACrB;2BACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAmBAzE,YAAkB,8BAAsByE,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAFhD,+BAA0C,A,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAO1CzE,YAAkB,uCAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CADrD,6BAAsC,A,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CO5BtCA,YAAkB,iBAAa6I,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,C9DyC9BoP,oBACSlY,wBACb;oBAAiCA,OAA+B40B,WAClE,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,C,C,CAEM,sBACS50B;uBAGXA;2BAEFA,OAA+B40B,aACjC,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA30B;EACeD;kBAEY60B;KAAS;kBAChC70B;2BAEF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,W,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,C+DvEAC,YAAkB,aAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,C,C,C;A,G,C,G,C;A,C,C,CCuC3BF,cAAwB,gBAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,ChE7B3CL,YAAiB,MAAGM,YAA+B,A,C;A,E,C,CAGnDC,YAAkB,MAAGD,YAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEpDE,mBACE,KAAA,UAEFC,QACAA,QACAA,eACN,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEMC,YAAqB,gBbmLbC,iBanLoC,A,C;A,I,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CsD4jBlDX,WAAgB,MAAGo1B,SAAiB,A,C;A,C,C,CAuBpC/0B;EACcg1B,OAAZ1F;;EACiB3tB;;OAAAA,SACfozB,YACA;WAEapzB,MAAkB2tB;EACJ,AAAVA;IAxIkB,oBAyIY3tB;6BAAAA;EAAF;QAC1BA;IAvIiB,kBAyIlCqzB,QAA6B,GAC7BD;QAtImC,AAA1B,OAAmB,AAAA,CAAT,kBAAuB,OAuI1C;UAGJC,SACAD;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,CtD7YMp1B,YAAe,MAAGgN,AAAAA,gBAAgB,A,C;A,G,CiE1OxC3M,YAAiB,MjE0OO2M,AAAAA,oBiE1OO,A,C;A,G,CAM/B3M,YAAoB,MAAG,AjEoOC2M,AAAAA,oBiEpOO,A,C;A,E,C,CjEsOzB,8CAEJA;QAA6CA,UAC/C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CiEjOA;EACsBsoB;GAChB,CAACvG,MAAqB;GzEkORluB,ayEhOhB,KACQkuB;8BjE2NV/hB;QAA6CA,gBiE1NlC+hB,MAAoB;KAE7BwG,QAAMxG,OACN;KAAOA,QjEuNT/hB,QAA6CA;EiErNnC+hB;8BjEqNV/hB;QAA6CA,UiEpN3C,EAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CjEyNM,YACJA,WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEMzM,YAAkB,MAAGyM,SAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAvB9BwoB,mCAEFxoB;KAEAuoB,WAEJ,A,C;A,M,C,C,E,CANMC;;SAMN,A,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,8B,C;A,G,CmB5NAj1B,cAm1B8B,KAALk1B,mBAl1BJ;MACV,QACTC;UACA;MnByOyB1oB,MmBxO3B,A,C;A,G,CAmBAzM;EACMo1B;GAAM,SAAWA,sBACnB;MAAOA,UAAgC,KAAbA,YAE5B,SACF,A,C;A,G,CAOA31B;GACY,KAAN41B,cACEC;;GAAO,cAAW;GACX,eAAY,WAEzB,MAAOD,SACT,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA6eAr1B;;SAC4C;EACjC;UAKEu1B,QAEAC,AAAAA;IAmTiB,KAALN,oBAjTM,KAAPI;EAClBhuB,UAAqB,CAACA;KACxB,gBAEF;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA8LAtH;GACW,UAAO,gBAChB;MAAUy1B,UAAwC,KAAtBA,uBAC9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA31B;GACkB,KAAZ41B,YAAmBA,cAA8B,QAErD;MAAa,AADDA,mBAEd,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA11B;GACM,CAAC21B,WAAuB;IAG5B;MAAuBD,8B9Btea10B,mC8BsepC,U9BpeekI;G8BseD,gB/BvdI5I;G+BwdV;EACoC,CAAA,KAAVs1B;;oCAAmBA;;KAKjDA;MAEJ,KACiBA,UACjB;MAAOA,gBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAqOA,kBACqBC;GA4CZ,QACLvD,OACAA;YA7CO8C,OAATU;;GACU,CAAA,KAANT,YACFS,SACAA;KAAST,KAAAA,WAEb,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAr1B;EACoB;EACCs1B;GAkCZ,QACLhD,OACAA;cAnM0B,KAAL4C,oBAgKK,gBAC1B5C,UACA6C;WAEF7C,KAn8BiByD;EAo8BEC;GA4BZ,QACL1D,SACAA;UA7BiB2D;GA2BZ,QACL3D,SACAA;QA5BF,MnB7wByB7lB,MmB8wB3B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA3M;;;2CACqB,QAEnB;MAAc,MAAPw1B,QAAUY,OACJ,KAATL,QAAYK,OACP,KAALhB,eAAQgB,WACH,KAAL9vB,eAAQ8vB,WACH,KAh9BQH,QAAAA,OAi9BP,KAANC,QAASE,OACA,KAATD,QAAYC,MAClB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAz2B,4BAKE;MAAOmX,UAAQ0e,QAAQ1e,SAAQif,QAAUjf,SAAQse,eAAMte,SAAQxQ,eAC3DwQ,SA39Bamf,QA29BCnf,SAAQof,QAAOpf,SAAQqf,iBAC3C,A,C;A,E,CAn4BAE;GAca,eAAkB,WAC3Bd;QACgB,gBAAmB,YACnCA;KAEAA,SAGFU;QAAQK,aACV,A,C;A,K,C,I,C;A,M,C,C,G,C,gI,C,E,CA/EAD;EzBkC2Bn0B;qBAAAA;EAAAA;EyBjCZq0B,KAslB+B;;czBrjBnBr0B;EAAAA;EyBqjBmB;czBrjBnBA;EAAAA;cAAAA;EyB/Bds0B,OzB+Bct0B;cAAAA;EyB7Bdu0B,KzB6Bcv0B;;cAAAA;EAAAA;EyBqjBmB;czBrjBnBA;EAAAA;EyBqjBmB;czBrjBnBA;EAAAA;EyBqjBmB;EAthBjCq0B;WACDG,sBACAC,aACGC;;SA5DuC,A,C,E,CAgDtDP,kCASaE;WACDG,sBACAC,UACGC;;SAWf,A,C,E,C,CAkUAx0B;YACsBgzB,aAAc;;GAC9BA,kBACmC,AAAjCA,MAA4B,KAAZA,sBACZ,KAAA,6CAERyB;KAAiBzB,SAA8B,KAAZA,YACnC;YAEF;YAAoBA;6BAAAA;KAAF;GACZA,eACFyB,OACA;yBAEJ,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEAz0B;;;WAUsB;;EAEPozB;6BAAAA;;GACb;KAAkB,WACDA;eAm7BJ,OAA6B,UAC7B,OAA6B;;EAn7B1B;;GAIV,AAACsB,qBACCC;MAMR,AAEA,WAA+BvB,QACjC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAoBApzB;;;SACgD;EACpC;WAGS,MAAOqzB;EAEb;MAEbuB;wBAWA;MnBhVyBrqB,MmBiV3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CAEAvK,uBACwB,QACtB;MAAOqzB,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEArzB;;;;;;;;EAiDe60B;;;;6BAAAA;GAcb;KAAa,QAIPA;GACS,EAAQ;EAKHA,MAA2B;EAC3BA,MAA2B;EACrBC,SAAyB;GAC3CC,kBACAA,kBACA,AAACC,oBACG;;SAENC;EACID;;WACF5vB;EmCnkBc;EtDgGfvH,OA6CP0M;KAA6CA,YmBwbrCnF,UnBxbRmF;KAA6CA;EmBybhB2qB,SAAwB,MAA7C9vB;;EmCtkBc;EtDgGfvH,OA6CP0M;KAA6CA;;EmB0bhB2qB,SAAwB,MAA7C9vB;;EmCvkBc;EtDgGfvH,OA6CP0M;KAA6CA,SmB4bjC;;;YAIH;;IAET,GACW,WAAqB,QAAU0qB;;WAGtB,QACpB;MAAO7vB,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAIApF,eACU,SAAe,CAAA,WACrB,MnBhnBKnC;KmBknBL,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEAmC,iBACW,QAAS;GACT,QAAS,QAClB;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CA+fAA;;EAIcgzB;GACK,AAAbmC,aACFtO,uDAGF;MAAOsO,iDAST,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAgBAn1B;;;GAoBkB,KAAZgzB,WAAiBnM;;;;GAKrB;YAAoBmM;6BAAAA;KAAF;GACZA;GAIuB,AAAnBA,eACFnM;mBAOAA,6CAGF5U;;UAGAA,OAAUmjB;EAEE,QAElB,GACInjB,YAAmB4U;EACA,OAAGmM;EACO,KAAX/gB;MACT,GACX4U;GAEE,OAEA5U,OAAUmjB,WAAoBpC,mBADhC;MAKqBqC,KAAiBrC;EAChB,KAARpH;EAAeA;6BAAAA,OAAzB3Z;OAAuB,CAAA;EACL,KAAR2Z;EAAeA;6BAAAA,OAAzB3Z;OAAuB,CAAA,mBAHzB,OAKE4U;mDAKa,AAAb5U,UACF4U,2EAEoB,AAAb5U,YACT4U;;8BAGF;MwBzjCE,0BxBkkCJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAgCA7mB;;EAYwB;E+C72CHyvB,AAAAA,a/C+2CnB;QAAkB,EAAE0F,gBACPA;;GACF,cACiB;;EAA8B,AAAxB,KAA1BG,KAA+B,UAAS;QmC7wC1B;EtDgGfz3B,OA6CP0M;KAA6CA,kBmBkoCZ,amC/wCX;EtDgGf1M,OA6CP0M;KAA6CA,csD7IvB;EtDgGf1M,OA6CP0M;KAA6CA,MmBsoCzCgrB;eAEJ,AACA,MnB9nCyBhrB,MmB+nC3B,A,C,6B,C,I,C,C,C,C,C,I,C,G,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAn3BE3M;GACY,SACoB;;EAA4B,AAAtB,KAA3B43B,QAAgC,UAAO,oBADhD;SAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEA53B;GACY,SAA2B;;EAA4B,AAAtB,KAAtB63B,QAA2B,UAAO,oBAAvD;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgC4B,YAAI,MAAGniB,sBAA4B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkBvC;GAClB,KACFlO;;QAGFA;KA8hBKkO,qBA7hBiBhN;QACpBlB;SACAA;KA2hBGkO,sBAzhBP,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAUA1V;KACgB,OAAkB,SACb,OAAkB;SADrC;SAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA,YACE,MAAqB,QAAkB,OACzC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEAA;GACY,SACmB;;EAA4B,AAAtB,KAA1B83B,QAA+B,UAAO,oBAD/C;SAEF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAEAn4B;;EACiBs3B;GACXc,sBACF,MAAgB;QACP,AAACZ;KAGV,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAEAx3B,yBAEE;+BAAkB,WACDs3B,MAA2B;GAChC,OAAwB,QACJ,AAAX,AAAL;;GAIM,OACL,SACiC,AAAhB,AAAX,AAAL;gFAMlB,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CASA;;;;;;eAGa,KAAiBA;KAE1BzvB,KAAayvB,aAEjB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAwYAt3B,oBAEyBq4B;6BAAAA,OAAvB;MAAsC,AAAjB,AAAL,mBAClB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA6KA,iBACQ,KAAA,kCACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAOS;EnBnoCF/3B;;GmBqoCQ,UAAY,WACnBgpB,2DAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyBJ,iBACQ,KAAA,kCACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CACAtpB;GACkB,KAAR,aACNspB;EnBvqCGhpB,KmByqCiBm1B;;GACZ,UAAa,aACrBnM,gEAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA2DY;GACI,UACR,MAAO,MAAmC,CAAhB,EAAE5U;KAE5B,OAAqB,AAAN,aAAoB,YAEvC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAsCJsjB,2BnB/mCAzC;KAAM,KmBinCiB+C,0BAAoB,WnBjnC3C/C;KAAM,KmBknCiB+C,0BAAoB,aAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,iB,Y,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CTqxQF71B,eAEM81B,YACF;QACSA,YACT,sBAEF;sBACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAo1DA91B,cAUE,iCACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CA0wFAA,gBAEE,MAAO+1B,AAAAA,qDAET,A,C,mC,C,I,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmEA/1B;;gB8B7zc0B;sB9Bu0cxBg2B;;EAulBkCC,UA6whBlCrkB;gBA/EI,KAAc,KA8EcC,oBA9EW;EApshBRqkB,UAmxhBnCtkB;gBA/EI,KAAc,KA8EcC,KAj0iBbskB,SAmviBwB,uBA9uiBzCH;QAGF;MAAOG,MACT,A,C,wF,C,I,C,C,C,E,C,I,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CA2yBAp3B;EAtiPSq3B;GAwiPE,YAGLC,mBAFF,QAKF,SACF,A,C;A,E,C,CAisXAr2B;;QAII;yDADF,OAGE;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAg9EAA,gBACoB,UAAQ;EACR,UAAQ,GAAuB,AAAA,CAAR,kBACzC;MAAY,GAAQ,MACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAi/JFs2B,uBACmB,MACjB;MAAOC,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC;WAEI;yBAMaD;;4CAGX,QAEF;YAGA,SACJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,YAII,SAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC;4CAEI,QAEF;MyDlxkCOC,YzDmxkCT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAMAC,cACE,qBASF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C,C,C,C;A,E,C,CAEAC,YACE,MAAOzvB,SACT,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEA0vB,YACE,MAAO1vB,SACT,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CACC2vB,kBACC,MAAO3vB,eACT,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAsBA;EAgByB1J;;;EAOLE;6EAOlBP;KAxwyBI25B;;;;SAgxyBgB,CAAA,2BACV,KAAA,sFAIJ,gDAEI,KAAA;;;;;;;aA1DN3wB,KAoEwBuwB;;;;;aApExBvwB;;;;;aAAAA;;;;;aAUAA;;EX7nkCuB+E;;;GWsskCR;uBAKrB,A,C,Q,C,I,C,E,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAscA0G,eAEmB,gBAAc;WACT,MACtB;MAAOkP,eACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAiW,eACmB,gBAAc,QAE/B;MAAOjW,eACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,G,C,m2B,C,C;A,E,C,C;A,G,C,K,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,kD,C;A,E,C,CAtolCEjjB,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,yC,C;A,E,C,CA+SxBA,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,uB,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,Y,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,O,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,wC,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,wB,C;A,G,CA8mBxBm5B,YAAuC,0BAC+B,A,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,K,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAuctE;GAMwC;;MAEpCC,eADkBC,oBAElB;oEAGJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,0B,C,C;A,E,C,C;A,G,C,uB,C;A,K,C,I,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,G,CAwiJAvnB,kBACMwnB;GAAY,QACd,QAEF;MyDvnMKV,MzD+nM0D,aAPjE,A,C;A,K,C,I,C;A,G,C,a,C,C;A,G,C,C;A,G,C,gB,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA87BAW,8CAAgD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA0DhDC,yCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAsB/CC,yCAA8C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CA+H9CjS,YAA2B,MAAGgS,YAAmC,A,C;A,G,CAKjEhS,YAA+B,MAAGgS,YAAkC,A,C;A,G,CAsEpEhS,YAA0B,MAAGgS,YAAkC,A,C;A,E,C,CAmM/DE,cACE,MAAO,MAA6BC,4BACtC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASAH,cAAwC,MAAGI,oBAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAS3EF,cAA+C,MAnBtC,MAA6BC,4BAoBC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,mC,C,C;A,E,C,C;A,G,C,K,C;A,G,CAuDvCj5B,eACMm5B,qBACFA,mDAEF;MAAOA,gBACT,A,C;A,G,CAEA;EAEc;EACG;SACfC;OACAA;UACF,A,C;A,E,C,CAaAJ,cAA+C,MAC7C,MAA6BC,4BAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA8C5DH,cACE,MAAOI,oBACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASAF,cACE,MA1DA,MAA6BC,4BA2D/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,yB,C;A,G,C,W,C,C;A,E,C,C;A,G,C,gB,C;A,G,CAgGA35B;GAIMg4B,gCAAgD;GAGhDA,8BAA8C,mBAClD;SACF,A,C;A,E,C,CAUAh4B,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,yB,C;A,G,CA+8CxBmH,YAAmC,mBAAiC,A,C;A,G,CAsBpEzG,YAA2B,kBAxxCN2tB,YAwxC6C,A,C;A,G,CAElE;EAEc;EACG,WACfyL;OACAA;UACF,A,C;A,E,C,CAcAJ,cAA+C,MAC7C,MAA6BC,4BAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAS5DH,cAAwC,MAAGI,oBAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAS3EF,cAA+C,MAlB7C,MAA6BC,4BAmBQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAYvCI,YAAwB,mBAAgC,A,C;A,G,CA+ExDC,YAAqB,qBAAiBC,aAAYC,YAAWC,cACzDC,wBAAa,A,C;A,G,CAKjBJ,YAAqB,qBAAiBK,aAAYC,YAAWC,cACzDC,wBAAa,A,C;A,E,C,CAgCjB,aAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAOpB,aAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKjB,mBAAsE,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CA6BtEx6B,YAAqB,MAAGy6B,aAAU,A,C;A,E,C,CAoBlCz6B,YAAkB,MApBMy6B,aAoBM,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAsL9B36B,6BAEI;kCAEA;+BAEA;8BAEA;6BAEA;UAEM,KAAA,uCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIAA,qBAEE;MACM46B,UAAyB;EACtBA,sBACI,QAAQ,AACrB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAgBAC,YACE,6DAGF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAgBAA,YAA0B,wCACiD,A,C;A,E,CAqP3EC,YAAqB,qBAA0B,A,C;A,E,C,CAmzB/C56B,uCAAuC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAsBvCg6B,6CAAwC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAoRxCa,YAAkC,MAAGC,YAA4B,A,C;A,G,CAKjED,YAAsC,MAAGE,YAA2B,A,C;A,G,CAoKpEF,YAAiC,MAAGG,YAA2B,A,C;A,G,CA+C/DH,YAA0C,MAAGI,YAA+B,A,C;A,E,CAptE5EzB,aAIA,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,G,C,U,C,C;A,E,C,C;A,G,C,kD,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,0B,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,uC,C;A,E,CAwwFAd,YAAuB,MAAGwC,MAAiC,UAAiB,A,C;A,E,C,CAuB5E,sCAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,ie,C,C;A,E,C,C;A,G,C,K,C;A,E,CAuN5BC,YAAc,mBAAmB,A,C;A,E,C,CAMjC,2DAAoF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQpF,8DAAuF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,+B,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,M,C,C;A,E,C,C;A,G,C,a,C;A,G,C,W,C,C;A,E,C,C;A,G,C,4C,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,K,C;A,E,CAipDvF17B,YAAe,gBAA8B,A,C;A,C,C,CAE7Cg6B,oBAEoBn5B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAm5B,kBACY;GACF,IACN,SAAoC;mCAGxC,A,C;A,E,C,CAWAA,uDAA0B;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,iE,C,C;A,E,C,C;A,G,C,gC,C;A,G,CAwwBxCx5B,YAAqB,MAAG04B,MAAkC,YAAmB,A,C;A,E,C,CAiK7E,+CAAuF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,I,C,C,C,C,C,C,C,C,C,I,C,4B,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAgCvF,+BAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,G,C,4B,C,C;A,E,C,C;A,G,C,yC,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,iC,C;A,K,C,I,C;A,G,C,W,C,C;A,E,C,C;A,G,C,gC,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,Q,C,M,C,C,C,C,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,yF,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,M,C,M,C,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,+B,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,e,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,sB,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,+B,C;A,E,C,CAysDxB,8BAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAQpB34B,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,G,C,U,C,C;A,E,C,C;A,G,C,a,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,CA2lBxB,4BAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,C,mC,C,C;A,E,C,C;A,G,C,a,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,a,C;A,G,C,e,C,C;A,E,C,C;A,G,C,gB,C;A,G,C,e,C,C;A,E,C,C;A,G,C,gB,C;A,G,C,sB,C,C;A,E,C,C;A,G,C,qB,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+6BlBC,YAAiB,MyDx6jBV24B,MzDw6jBuD,WAAe,A,C;A,K,C,I,C;A,G,C,c,C,C;A,G,C,C;A,G,C,yB,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA+W7E,mCAAiD,A,C,Q,C,C,C,C,C,C,M,C,C,C,I,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,yC,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA4RjD,0CAEEwC,6CADsBC,QAEtB;OACF,A,C,S,C,K,C,E,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CASAC,YAAiB,qBAAaC,UAAUC,mBAAS,A,C;A,G,CAgBjDF;eAII;OAxwNsBJ,KAAiC;;GA2wNnD,6CACI,KAAA;EA5wNcA,KAAiC;EAgxN9B,cA5BCK,UAAUC,uBA4BTzU,KAAAA,SAC3B;qBAAiB0U,KAAAA,KAAiBA,KAAAA,eAEtC,A,C;A,K,C,I,C;A,G,C,8F,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAkEA;;aAiBEC;uBACAA;wBACAA;2BACAA;qBACAA;+BACAA;mCAKAC;eACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,2G,C,I,C,K,C,C,C,E,C,I,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,yC,C,C;A,E,C,C;A,G,C,oC,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,W,C,C;A,E,C,C;A,G,C,yB,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,sG,C;A,G,CA8nBAj7B,YACE,mBACF,A,C;A,E,C,CAgBA,kBAGM;GAAgB,QAElBk7B,iBAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMAnC;MAEwB,YACpBvP;qBAFF,QAMA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASAuP;;+CAGkB1iB;+BAKd;MA9Ec8kB,AAAAA,wBA8E4B,QACxC,eAAkB9kB,eACpB,MAEA,MAAA,QAAA,OACE,eADF,SAEA,CAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKA/W,kBAAqB87B,WAAH;gDAAmD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA0QrErC,sCAAiC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA6BjC35B,mCAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CA0BhC25B,2CAAsD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUtDA,2CAAuD,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,sB,C,C;A,E,C,C;A,G,C,M,C;A,E,CAmHvDh6B,YAAe,gBAA8B,A,C;A,C,C,CAE7Cg6B,oBAEoBn5B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAm5B,kBACY;GACF,IACN,SAAoC;mCAGxC,A,C;A,E,C,CAWAA,uDAA0B;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,4D,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,c,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,0C,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,wC,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,yB,C;A,G,C,e,C,C;A,E,C,C;A,G,C,c,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,a,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,e,C;A,K,C,I,C;A,G,C,2C,C,C;A,E,C,C;A,G,C,Y,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,qB,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,oE,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,CAitFxC/4B,kBAtxaE,KAA6Bi5B;EAuxaf,kBAEd;qBiC73sBE,kCjC83sBJ,A,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,mC,C;A,E,C,CAuQAH,yCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,qB,C;A,G,C,mB,C,C;A,G,C,C;A,G,C,gB,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,0B,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,gB,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,0B,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,sB,C,C;A,G,C,C;A,G,C,8C,C;A,G,C,c,C,C;A,E,C,C;A,G,C,a,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,G,CAu+C/C94B,YAA+B,qBACOq7B,gBAAM,A,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,G,CA8L5Cr7B,YAA+B,qBACKq7B,gBAAM,A,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,gB,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,iD,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,W,C,C;A,E,C,C;A,G,C,+B,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,uC,C,C;A,E,C,C;A,G,C,K,C;A,G,C,0D,C,C;A,E,C,C;A,G,C,wB,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,wB,C;A,G,CAixE1CC;GAIMC,aAAyB;SACjBC,oBACVA,+BAEF;MAAOA,qBACT,A,C;A,E,C,CAyEAz8B,wDAAyE,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKzE08B,mEAGI;;;;;;;;;;;;;;;;QAqBJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CA4iBA3D,YAAsB,MAAG4D,MAA4B,UAAiB,A,C;A,E,C,CAyRtE,6BAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA0GnB,kBAOEC,cyDxy3BKC,UzDyy3BL;OACF,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmHAt8B,gCAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAoIxBwnB,YAA2B,MAAGgS,YAAmC,A,C;A,G,CAKjEhS,YAA+B,MAAGgS,YAAkC,A,C;A,G,CA+EpEhS,YAA0B,MAAGgS,YAAkC,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,Q,C,C,C,C,C,C,M,C,C,C,K,C,M,C,C,C,C,C;A,G,C,M,C,C;A,E,C,C;A,G,C,8D,C;A,E,C,CAmgC9Dx5B,YACC,wBAAoB2vB,iBAAO4M,gBAAMC,mBAASC,UAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA38B;;;2CAC2B;EAClB6vB;EAAQjuB;4BAAc66B;EAAO76B;4BAAa86B;EAAS96B;4BACtD+6B;EAAU/6B;qDADd;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAA0CkwB,KAAAA;EAAe4M,KAAAA;EACrDC,KAAAA;EAAgBC,KAAAA;EA2IT7lB,KAAQA,KAAQA,KAAQA;EARf,UAAQ,GAAuB,AAAA,CAAR;GACrB,MArIL;MAsIG,WAAQ,GAAuB,AAAA,CAAR,kBArIP,A,C;A,G,CAsEpC0kB,YAAkB,qBAAa,OAAW,eAAS,A,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,I,C,C,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,M,C;A,E,CAgrBnD77B,YAAe,gBAA8B,A,C;A,C,C,CAE7Cg6B,oBAEoBn5B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAm5B,kBACY;GACF,IACN,SAAoC;mCAGxC,A,C;A,E,C,CAWAA,uDAA0B;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,8B,C,C;A,E,C,C;A,G,C,M,C;A,E,CAyJxCh6B,YAAe,gBAA8B,A,C;A,C,C,CAE7Ci9B,oBAEoBp8B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAo8B,kBACY;GACF,IACN,SAAiD;mCAGrD,A,C;A,E,C,CAWAA,uDAAuC;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,M,C;A,E,CAsBrDj9B,YAAe,gBAA8B,A,C;A,C,C,CAE7Ck9B,oBAEoBr8B;wBACV,KAAA,YACR;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACA,qBACQ,KAAA,iDACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAKA,mBACQ,KAAA,sCACR,A,C;A,G,CASAq8B,kBACY;GACF,IACN,SAAuD;mCAG3D,A,C;A,E,C,CAWAA,uDAA6C;MAAG,MAAW,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,6B,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CA7g4B3D,YAAuB,yDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAe9C,cAAuB,yDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAe9C,YAAsB,wDACuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAW7C,cAA2B,2DACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAWlD,YAAwB,wDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAW/C,cAAuB,yDACuB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,M,C,C,G,C,I,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CA6xL9C78B,cAA8B,MAAG88B,MAAAA,WAAgC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAGjE98B,YACE,MAAO+8B,AAAAA,iCACT,A,C;A,E,CAEAp9B,YACE,MAAOm9B,AAAAA,gBACT,A,C;A,C,C,CAEApD,oBACSoD;gCAAAA,SAAP;MAAOA,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACgCA;gCAAAA,SAA9BC,AAAAA;uBAA8BD,MAChC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA,mBAEQ,KAAA,oCACR,A,C;A,C,C,CAEApD,cACEqD,AAAAA,sBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAEA97B,kBAAkC+7B,aAAH;uBrBtzPO97B,8BqBszPa,A,C;A,E,C,CAEnD;QAKE;MAAA,8CAHa,oBAIX67B,QADF,OACEA,cADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,mBACQ,KAAA,kCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAwBA,yBAEQ,KAAA,YACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUA/8B,cAQE,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAEA;GACyB,EApFhB88B,AAAAA,oBAqFC,KAAA,SArFDA,AAAAA;EAAAA;EAAAA;EAwFLC;SAAAA;mBAxFKD,SA0FLC;iBAtFKD,OAwFT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,YAEEC,KAAAA,YACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAyBArD,kBACmBqD,AAAAA;6CAEjB;SACF,A,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,CAueAp9B,YAAe,MAAGs9B,AAAAA,gBAAgB,A,C;A,C,C,CAElCvD,oBAAkCuD;gCAAAA,SAAH;MAAGA,MAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAElD,qBACQ,KAAA,2BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA,mBACQ,KAAA,2BACR,A,C;A,E,C,CAEA,mBACQ,KAAA,yBACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,G,CAQAvD,YAAiB,MAAGuD,UAAAA,SAAc,A,C;A,G,CAIlChD,YAAwB,MAAG,MAA6BiD,SAAa,A,C;A,G,CAgDrEnC,YAAkC,MAAGrB,eAAyC,A,C;A,G,CAK9EqB,YAAsC,MAAGrB,eAAwC,A,C;A,G,CAoKjFqB,YAAiC,MAAGrB,eAAwC,A,C;A,E,CAvP5EyD,oBACiBF,QAAAA,mBAAfC;QiCt6QE,yBjCu6QJ,A,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CAFAC;;SAEA,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CADiC,wBAAI;gDAAQzD,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,O,C;A,C,C,CA85G7ChS,cACE,qBAAwB0V,yBAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,c,C;A,C,C,CAyBA1V;;;GbjxWS7Y,AAAAA,AakxWHwuB,eAA2B5wB,YACzByrB,YACF,qBACIkF,QAAMC,MAAa5wB,oBAG3B;qBAAmC2wB,sBACrC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,M,C,C,G,C,I,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA4oEmC,YAAM,MAAGhF,SAAIkF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA6FrB,cACrBlF,6BACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAOgB;;EAEXA;;EAAW,QAAqB;;Q8Bn1clCxU;GAAD,AAoDmBa,mDAnDvBb;a9Bs1cI2U,QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA64IAqD,iBACY,oBACZ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,G,CAgfFjC,kBAC+CoC;6CAE7C;SACF,A,C;A,C,C,CAQA,cACEA,AAAAA,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;;+CAGmB9kB;EAAiB8kB;GAA5B,MAEF,MAgHYA,AAAAA,wBAhH8B,QACxCA,cAAa9kB,aACf,AAEF;OAEF,MAAA,UACE8kB,QADF,OACEA,cADF,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;GACyB,EAoGPA,AAAAA,AAAAA,+BAnGR,KAAA,SAmGQA,AAAAA,AAAAA;EAAAA;EAAAA;EAAAA;SAhGdA;mBAgGcA,SA9FdA;iBAqG0BA,OAnG9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EAiG8BA;EAAAA;0BAAAA,SA/F5BA;SA+F4BA,MA9F9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,mCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBA/7B,cACuB,SAKvB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAwBA,YACE+7B,KAAAA,YACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA;EACEA;EAqC4BA;gCAAAA,SArC5BA;iBAqC4BA,MApC9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA96B,YAA4B,MAAG86B,SAAAA,AAAAA,oBAAyB,A,C;A,E,C,CAMxD,mBACQ,KAAA,8BACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAOA,yBAEQ,KAAA,qCACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CASAp8B,YAAe,MAAGo8B,AAAAA,AAAAA,2BAAuB,A,C;A,E,CAEzC,mBACQ,KAAA,6CAER,A,C;A,C,C,CAEApC,oBAA8BoC,AAAAA;gCAAAA,SAAH;MAAGA,MAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgxG/C,wBAAI;gDAAQwB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CAs4PlB,cACE37B,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA5B,iBACE;MAAc,iCrBxu8BsBkB,8BqBwu8BpC,QAIA,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CASA,iBACE;MAAgBgH,iCrBxv8BoBhH,8BqBwv8BpC,OACEs8B,UrBvv8Bap0B,KqBwv8Bf,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,qBACE;MAAgBlB,iCrB9v8BoBhH,8BqB8v8BpC,UrB5v8BekI,IqB8v8BbwF;WADY,aAEd,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAlO;EAEmBq8B,AAAAA;gBAEjB;MAAsBU,aAAqB,8BAF1BV;GAGXW,QAASD,4BAHEV,SAIb70B;OAASu1B,KAAAA,QAEb,AACA,SACF,A,C;A,G,CAEA/8B;EAEmBq8B,AAAAA;gBAEjB;MAAsBU,aAAqB,8BAF1BV;GAGXW,QAASD,4BAHEV,SAIb50B;OAAWs1B,KAAAA,QAEf,AACA,SACF,A,C;A,G,CAKAz9B,YACE,MAAOQ,mBACT,A,C;A,G,CAKAR,YAAoB,MAAG,AANdQ,mBAMsB,A,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAlEf,cAAS,gBAAa,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAiFtCR,YACE,MAAO+8B,AAAAA,yBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA78B,cACE,MAAO68B,AAAAA,yBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,gBACEA,AAAAA,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA78B;EACiB68B;EAAAA,iBACfA;oBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAKAp9B,YACE,MAAOuI,AAAAA,uBACT,A,C;A,E,C,CAEAlI,YAAyB,MAAGmwB,sBAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,E,C,CAwbtDwN,iBACU,wBACRC,AAAAA;yBACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;EACgB,QAAA,mBACd;MAAkBC,0BrB9w9BkB38B,8BqB8w9BpC,OACEu3B,KrB7w9BarvB,OqB8w9Bf,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAWA00B,YACEF,AAAAA,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMA59B,cAA4C,MACxC+9B,wBAAyD,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAS7D/9B,cAA0B,MAAG+9B,sBAA8C,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE3E/9B,YAA+B,MAAG49B,AAAAA,8BACyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAhD3DI,YACEJ,sBAA8B,IAAcC,0CAE9C,A,C;A,M,C,C,E,CAHAG;;SAGA,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CADM,YAAI,mBAA4B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKA,YAAI,MAAGnlB,aAAS4f,QAAe,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAqB/B,YAAI,MAAGA,cAAU,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQ5B,YAAI,MAAGA,qBAAyB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASP,YAAI,MAAGA,gBAAc,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAG9D,cAAqB,MAAG7pB,+BAAcqvB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CASjDN;EACU,wBAGR;MAAoBO,AAFJnB,KAAAA,sCrB5z9BoB77B,8BqB8z9BpC,UACmB6H,KrB7z9BJK;GqB8z9BT,AlBx29BY5I,akBy29BdqY,SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YACc,cACZkkB;KAAAA,QAAqBlkB,aACvB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,E,C,CAiYA6O,cAA6D,uBACvCyW,mBAAuB,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAuB7CpD,cACE,uBAAsCoD,mBACxC,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAgBApD,cACE,yBAA0CoD,iBAC5C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CA0DAvW,mCAMM,QAAc,QA8Ec3T,QA9EW;wCA+E3CD;MAhFA;SAEF,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CAYA0T,wEAAmC;2DAI7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHF,YAAQ,MAAGtiB,MAAAA,gBAA0C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAO,YAC1DqzB,cACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CAoBJ/Q,wEAAmC;2DAI7B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGNE;qBAwKqB;UAnKnB;MAAmBwW,UAAnB,UACoCD,UAAYE,QADhD,mBrBt2+Bej1B;yBqBu2+Bbk1B;SACF,EAkLsBzW,IAAAA;UAjLtB;MAAOyW,2CAET,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,C,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,I,C,C,C,I,C,qC,C,I,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAhBI,YAAQ,MAAGl5B,MAAAA,gBAA0C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAO,YAC1DqzB,cACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CAyCJjjB,cAUsBzE,cATL,MAEfwtB;SAEAxtB;YACAiX;YACA;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAqBA,iBAnBsBjX,cAoBL,MACf;QAAA,AAAA,SACAwtB;UAKF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,G,CAEAv+B,WAAkB,MAAe,AAAZw+B,WAAe,A,C;A,E,C,CAEpC,eA/BsBztB,eAgCH,AAHEytB,WAGS,MAC5B;QAAA,AAAA,SACAxqB;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,iBACMgU;GAAQ,SAAW,AATJwW,WAUjBztB,KAAAA,QAAyBotB,UAAqBE,SAElD,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,iBACMrW;GAAQ,QACVjX,KAAAA,QAA4BotB,UAAqBE,SAErD,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,S,C;A,C,C,CAmGA;EACMI;GAAAA,QAAoC;EACD5W,OAAvC4W;QAAyBC,KAAc7W,0BAC1BA,AAAAA,gBAEf,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA,oBACqB4W,AAAAA;GACF,QAAS9a,OAC5B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA,mBACE;MAAyB8a,UAAAA,8BrBlh/B0B9mB,KAAAA,MAAoBO,6BqBkh/BvE,OACEyL,ArBh/+Bava,SqBi/+Bf,AACAq1B;OACA5W,AAAAA;cACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,CArCA8W,YACE9W,QAAc,KACA+W,0BAChB,A,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkBc,WAAG,MAAGpB,qBAAa,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA6BjC9V,cACE,uBAA2BmX,sBAC7B,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,mB,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,CA0dA59B,YAIE,uBAo7DckI,sCAn7DhB,A,C;A,C,C,CAGA,mBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,mBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA,mBACQ,KAAA,oCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAMA,qBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,sCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,yCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUAnJ,mBACQ,KAAA,2CACR,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,C;A,E,C,CAUA,yBACQ,KAAA,2CACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,qBACQ,KAAA,8CACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,CAkxDAiB,YAAyB,qBAAwB69B,KAAAA,kBAAe,A,C;A,E,CAEhEn/B,YAAe,MAAGm/B,AAAAA,gBAAY,A,C;A,C,C,CAI9B,cAAsBA,KAAAA,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1C9+B,cAA4B,MAAG8+B,MAAAA,WAAqB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEpD,YAAeA,KAAAA,SAAe,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAI9Bv+B,oBAA4Bu+B;gCAAAA,SAAH;MAAGA,MAAY,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAExC,sBAAwCA;gCAAAA,SAAAA;OAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAE9D,cAAiCA,KAAAA,WAA0B,A,C;A,E,C,CAE3D,cAAqCA,KAAAA,WAAqB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAE1Dn/B,gBAA6C,MAAGm/B,MAAAA,aAA6B,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAE7En/B,gBAA6C,MAAGm/B,MAAAA,aAAiC,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEjF,gBAAkC,MAAGA,MAAAA,aAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIjE,oBACEA,KAAAA,iBACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,gBAAuCA,KAAAA,aAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,C,C,CAqBtE9+B,WACE,MAAOoY,AAAAA,aACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEA7X,WAAc,MA0DG6I,AA1DAgP,YAAiB,A,C,C;A,E,C,C;A,G,C,e,C;A,C,C,CA8ClCpY;EAC+B,AAAVsvB;EACAprB;GAAF,KACfkF,QAAW21B,KAAAA,UACXzP;SACA;SAEFlmB,YACAkmB;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CAEAnX,WAAc,MAAG/O,SAAQ,A,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmFlB,kBXtlkCoBmE;;qCW6lkCzB;iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,G,CA2IAmrB,YAAsB,MAAGsG,MAAyCC,gBAAS,A,C;A,E,C,CAK3E,YAAa,MAA2BA,iBAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEhD,kBAEqCA,yBAIrC,A,C,Q,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,CAeA5D,YAAc,YAAS,YAAwB,A,C;A,E,C,CAE/C,kBACI,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIrC,kBACuB,YAAS,YAAwB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,C,CAlBxDj5B,0BAEI;KAGA,mBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,G,CAmTAlC,YAAgB,MAAQk9B,cAAa,A,C;A,G,CACrC,cACOA,eACP,A,C;A,G,CAGAl9B,YAAgB,MAAQk9B,cAAa,A,C;A,G,CAYrCl9B,YAAgB,MAAQk9B,cAAa,A,C;A,E,C,CAuCrC,YAAc,MAA4BA,kBAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAI/Cl9B,YAAkB,MAAgCk9B,oBAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C,C,A,E,uB,kB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,a,C,C,A,E,gB,W,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,uB,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,+H,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,6D,C;A,K,C,I,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,+B,C,C;A,E,C,C;A,G,C,sD,C;A,K,C,I,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,4B,C,C;A,G,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,6B,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,6B,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,0B,C,C;A,E,C,C;A,G,C,kD,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,sD,C;A,K,C,I,C;A,G,C,wB,C,C;A,G,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,U,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,8B,C,C;A,E,C,C;A,G,C,U,C;A,G,C,uB,C,C;A,E,C,C;A,G,C,yC,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,kD,C;A,K,C,I,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,yB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,qB,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,iB,C,C;A,G,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,8B,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,sB,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,a,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,K,C;A,G,C0Dpi7BvDnD,eACMiF,qBACFA,0BAEF;MAAOA,gBACT,A,C;A,G,CAEAt+B,YAA2B,4CAAyC,A,C;A,G,CAEpE,wD1Dw+bEm7B;KAAAA,A2DzvmBAoD,WDoxKAnF;UACF,A,C;A,G,CA4YAe,YAAkC,MAAGC,YAA4B,A,C;A,G,CAKjED,YAAsC,MAAGE,YAA2B,A,C;A,G,CA2EpEF,YAAiC,MAAGG,YAA2B,A,C;A,G,CAuD/DH,YAA0C,MAAGI,YAA+B,A,C;A,K,C,I,C;A,K,C,I,C;A,G,C,0d,C,C;A,E,C,C;A,G,C,8B,C;A,E,C,CAwP5EzB,yCAA+C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,G,C,e,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,G,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,wB,C,C;A,G,C,C;A,G,C,yB,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,W,C;A,G,C,0D,C,C;A,G,C,C;A,G,C,uC,C;A,K,C,I,C;A,G,C,e,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,gB,C,C;A,E,C,C;A,G,C,a,C;A,K,C,I,C;A,G,C,sE,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,kB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,wB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,oB,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C;A,G,C,iB,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAx0B/CiE;E1DuzyBSZ,A0DtzyBSA;EAEA;WAEd,QAEF;MAAoBmB,+B/E1gKgBh9B,8B+E0gKpC,UACmB6H,K/EzgKJK;G+E0gKT,A5EpjKY5I,a4EqjKdqY,SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,Y1D2yyBEkkB,A0D1yyBAA,6BAA+BlkB,aACjC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C,A,E,oB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,yB,C;A,G,C,U,C,C,A,E,gB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,M,C,C,E,CE7wKM1X,WAAqB,gB7Eq7Fb,gCAAS,4C6Er7FoB,A,C,C,C,A,E,W,U,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C9D0C7Ci+B,cACE,qJAOF,A,C,oB,C,I,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC;gBAEgB;;IAGd,MAAOC,MRlEEr/B,OQiEM,IAAcwJ,wBRhEQ81B,aQkEvC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CA0VAv/B;sEAIM;kBAFF,QAQF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAoM,2DAEI,WAEF;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAIAjM;WAEI;;;;;KAIA;;4CAEA,MAAOF;iDAEP,MAAOu/B;iDAEP,MAAOC;KAOP,MAAOA,wCAGX,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEArzB,sBACgBszB;cAEFC,WACVC;YAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIAxzB;wEAKI;;;KAKA;0BAGA,MAAO;mCAEP;KAEA,MAAOyzB,UAEX,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEAC,oCAEI,MAAOC;2BAGP,MAAOA;KAGP,MAAOA,2BAGX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA3zB,sBACkBszB;YAQS,0BACXC,WACZC;YAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,M,C;A,C,C,CAnVEz/B,gHAIE;MAAO6/B,MAA8BvxB,YACvC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAQA9H,kHAImB8H;WAAqB6wB,QACxC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,G,CAEA3/B,YAAiB,SAAI,A,C;A,C,C,CAErBK;;QAAuB;iDACGyO,UAAW7M,KAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQrD5B,YAIE,YAAsCyO,QACxC,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CA0BAvO;aAEqCuO,QAAjC;kBADF,OAGE;yCAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAQAtO;EAImDsO;eAEvB,IAAcwxB,uBAFxC;MAAOD,uBAGT,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,CA9KA7+B;EACem+B;WAEX,MAAOO;QASiBp2B;UAAf;;;SAQX;MAAOo2B,eACT,A,C,E,CA8BA1+B,YAIE,MAAO0+B,MAAYK,SACrB,A,C,E,C,CAEA99B,YAwBE,MAAO+9B,UAvBiB,2BAwB1B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAtBEA;;GACMC,QACF,MAAOA;;iDAIPA;UACA;MAAA,KAAgBZ,UAAhB,UAAA;KAC6CW,YAASX,UACtD,AACA,wFAGAY;UACAC;UAAqBb,aACrB;cAEA,MAAOF,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CA0JFgB;GACY,UAAa,sDACf,KAAA;;GAEA,UAAe,sDACf,KAAA,qDAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAIA//B;4BAG+BggC,2DAzBF;;EAAa;;UAChC,qDA2BR,0CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA;4BAG+BA,2DAlCF;;EAAa;;UAChC,0FAqCV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA5gC,YAAe,iDAAkB,A,C;A,E,CAEjC,0DAAwD,A,C;A,C,C,CAKxD,cACE6gC,oBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,cAIEA,oCADM,gBAER,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,sBApDoD;6BAAA;EAAV;UAChC,oDAqDRA;0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAYA,gBACEF,YACAE;oBAAiC,MACnC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;;GAlEY,UAAa,sDACf;;GAEA,UAAe,sDACf;EAgES;GACN,UAAM;GACH;OACH;UAAwBt/B,AAAAA,kBACnCs/B;oBACF,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cACEA,oBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,Q,C;A,O,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA+CoD,kBAC/BpB,UAEjBQ;gBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAGI,YAAI,yBAAgC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAuCpC,YAAI,mBAA2B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAG/B,YAAI,gCAAwB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAG5B,YAAI,mBAAyB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,a,Y,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C+D9gBnCx9B,gBACoB,UAAQ;EACR,UAAQ,GAAuB,AAAA,CAAR,kBACzC;MAAY,GAAQ,MACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA,cACoB,UAAQ,GAAuB,AAAA,CAAR;GACrB,MACpB;MAAkB,WAAQ,GAAuB,AAAA,CAAR,kBAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CC+BFd;;GAOQ,IAAK;GACL,IAAK;wDASL,MAAmB,AAAJ,CAAL;UAIAF,aAAgBA,YAAS,QACvC;SAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,C,C,CAUAE;;GAOQ,IAAK;GACL,IAAK;wDASL,MAAS;GAITF,YAAS,QACb;mBAGYJ,YAAc,QAC5B;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CCxEErB,eACU,MAAY,kBACZ,KAAA,yDAER;2BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CAmHA;EAE2B8gC;EAAF;EACH,CAAA;EAED;EACC,CAAA;EAGU,AAAV,IAAYC;EACpB,CAAA,iBAAZD;SAEAC;QAAkD,CAAA,AAAb,QAAX,AAAV,AALI,KAHA,MAOA,iCAItB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA/gC;GACU,MAAY,kBACZ,KAAA;EAEQ;IAAP,UAEPghC,SACA;MAAW,CAAA,AAAJF,eAKT,GACEE;EACQF;YAEsB,AAAP,AAAT,kBAA4B,AAC5C;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAjHAG;EAEW,cAGT;;EACiB;EACK,KAAP;;EACG;EACK,KAAR;EASa,CAAX,CAAA,AAAL,qBAFO,AAAA;EAGJ,CAAA;EAC8C,AAAnC,AAAV,CAAN,AAAA,SAHmB,CAAA,AAAP,MAAc,aAGQ,QAAP;EAOtB,CAHT,CAAA,GADiB,AAAP,OAAe;EAKhB,CAAA;EACuC,AAAjC,AAAN,CAJR,CAAA,EAHU,iBAOqB,QAAP;EAOhB,CAHT,CAAA,GADiB,AAAP,OAAe;EAKhB,CAAA;EACsC,AAAjC,AAAL,CAJR,CAAA,EAHU,gBAOoB,QAAP;EAIxB,CAAA,GADiB,AAAP,OAAe;EAExB,CAAA,EAHU;EAOR,CAFM,AAAA;EAGA,CAAA;EAC2B,QAAP;EAIpB,AAAJH;EACI,CAAA,iBAAbA;;EACmD,CAAA,AAAjC,AAAP,AAAJC,aAA4B,QAAP,+BAA5BA;SACAD;QAAI,CAAA,QACJC;QAAI,CAAA,EARoD,AAAjC,AAAV,GAHU,CAAA,AAAP,MAAc,oCAYlB,CAAA,UAAc;GAExBA,aAAYD,YACdA,aAEFE;SACAA;SACAA;SACAA;UACF,A,C;A,M,C,C,G,C,U,C,E,CAnEAC;;SAmEA,A,C,C,C;A,E,C,C;A,G,C,S,C;A,E,C,CCtJA1gC,YAAkB,mBAAWsG,iBAAIq6B,YAAG,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CASpC7gC;;;2CACuB;EACdwG;EAAK5E,GAAZ;+BAAyB,KAAFi/B,OAAKj/B,KAC9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAA0C6G,KAAAA;EAAYq6B,KAAAA,OAArC;MHQSC,MAAOhqB,KAAQA,cGRwB,A,C;A,C,C,CAOjE0kB;EACsBh1B;;EAAI5E;;6BAAAA;WAAF,IAAa,KAAFi/B,OAAIj/B;wCAArC;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAOA45B;EACsBh1B;;EAAI5E;;6BAAAA;WAAF,IAAa,KAAFi/B,OAAIj/B;wCAArC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAWA45B,oBACsBh1B;;;WAAE,IAAY,KAAFq6B;wCAAhC;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,G,CC/BA1oB;EAAe0X;EAAO6M;;6BAAAA,OAAV;MAAQ,KAAO,A,C;A,G,CAE3BvkB;EAAgBskB;EAAME;;6BAAAA,OAAT;MAAO,KAAQ,A,C;A,E,C,CAE5Bz8B,YACE,wBAAoB2vB,yBAAO4M,kBAAMC,kBAASC,SAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEA38B;;;2CAC2B;EAClB6vB;EAAQjuB;4BAAc66B;EAAO76B;4BAVvBiuB;EAAO6M;;6BAAAA;GAAF,MAUwC96B,YARtC+6B;;6BAAAA;EAAF,MASJ/6B,sCADd;SAEF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAjC;EAA0CkwB,KAAAA;EAAe4M;EAAAA;EAd1C5M;EAAO6M;;6BAAAA;EAAF;EAEEC;;6BAAAA;EAAF,cAYH;MJHbmE,MAAOhqB,KAAQA,KAAQA,KAAQA,oBIIC,A,C;A,G,CAsEpC0kB,2BAAqC,eAAW;wCAA3B;SAAoC,A,C,C;A,E,C,C;A,G,C,oB,C;A,K,C,I,C;A,K,C,I,C,C,A,E,gB,e,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CC7FrD1hB;;4CACoB;EAGRwG;;iGAIhB;MAAO,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEMvH,eACI,cACCgoB,eAAP;cAEF,MhDgeO1nB,MzCjb4B5M,SyF9CrC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C,C,A,E,gC,mC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCqLErK,gBACQ,KAAA,0CACR,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,S,C;A,K,C,I,C,C;A,G,C,C;A,G,C,I,C;A,C,C,CAMA,gBAAkC,MAAGwgB,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAY7C,cAA6B,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMxCpU,cAAkBoU,OAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAM5B,YAAa,MAAGA,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,C,C,CCiDxBpU,cAA0B,MAAGwyB,AAAAA,gBAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEvC,gBACEA,AAAAA,iBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA,cACEA,AAAAA,gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,YACEA,AAAAA,cACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAhhC,YAA6B,MAAGghC,AAAAA,eAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEtDhhC,YAAiC,MAAGghC,AAAAA,eAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE9D,cACEA,AAAAA,gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAEAhhC,YAAiB,MjFyMGkE,AiFzMA88B,gBAAa,A,C;A,G,CAEjChhC,YAAoB,MjFwMG,AADHkE,AiFvMG88B,gBAAgB,A,C;A,G,CAEvCtgC,kBAAwBsgC,OAAH;qCAAa,A,C;A,E,CAElCrhC,YAAe,MjFkMGuE,AiFlMA88B,YAAY,A,C;A,E,C,CAI9BxyB,cAAqB,MAAGwyB,AAAAA,iBAAiB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEzCtgC,kBAA0BsgC,OAAH;MAAGA,UAAY,A,C;A,K,C,I,C,C,A,E,kC,0B,A,A,C,C,C,C;A,G,C,E,C;A,E,CCkJxCC;SAAAA,A,C;A,E,CA6BAA;SAAAA,A,C;A,E,CAgBAA;SAAAA,A,C;A,E,C,C;A,G,C,K,C;A,G,CAleE5gC,YAAqB,YAAa,A,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CA+BlC;GACY,UAAa,cACf,KAAA;uDAIV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,6BAC0D,UACtD6gC,eAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAvhC,kBAKEwhC,YAA0B,IACT;SAInB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,G,C,wC,C,C;A,E,C,C;A,G,C,K,C;A,G,CAoEA9gC,YAAqB,YAAW,A,C;A,K,C,I,C;A,G,C,U,C,C;A,E,C,C;A,G,C,K,C;A,G,CAyYhCA,YAAqB,YAAc,A,C;A,C,C,CAEnCiB,oBACqBd;aA/dqC,UACtD0gC,cA+dF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aApeqC,UACtD0gC;OAqeJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,qCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAH,YAAqB,YAAc,A,C;A,C,C,CAEnCiB,oBACqBd;aA9gBqC,UACtD0gC,cA8gBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aAnhBqC,UACtD0gC;OAohBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,qCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,c,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAH,YAAqB,YAAY,A,C;A,C,C,CAEjCV,oBACqBa;aA7jBqC,UACtD0gC,cA6jBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aAlkBqC,UACtD0gC;OAmkBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,mCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAH,YAAqB,YAAY,A,C;A,C,C,CAEjCV,oBACqBa;aA5mBqC,UACtD0gC,cA4mBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aAjnBqC,UACtD0gC;OAknBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,mCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,Y,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAH,YAAqB,YAAW,A,C;A,C,C,CAEhCV,oBACqBa;aA3pBqC,UACtD0gC,cA2pBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aAhqBqC,UACtD0gC;OAiqBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,kCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,W,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAH,YAAqB,YAAa,A,C;A,C,C,CAElCV,oBACqBa;aA1sBqC,UACtD0gC,cA0sBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aA/sBqC,UACtD0gC;OAgtBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,oCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAH,YAAqB,YAAa,A,C;A,C,C,CAElCV,oBACqBa;aAzvBqC,UACtD0gC,cAyvBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aA9vBqC,UACtD0gC;OA+vBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,oCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,a,C,C;A,E,C,C;A,G,C,K,C;A,G,CA+BAH,YAAqB,YAAmB,A,C;A,E,CAExCV,YAAe,gBAAmC,A,C;A,C,C,CAElDA,oBACqBa;aA1yBqC,UACtD0gC,cA0yBF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aA/yBqC,UACtD0gC;OAgzBJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAIE,0CAHMwgC,cAAmC5gC,YAI3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,oC,C,C;A,E,C,C;A,G,C,K,C;A,G,CAoCAH,YAAqB,YAAY,A,C;A,E,CAEjCV,YAAe,gBAAmC,A,C;A,C,C,CAElDA,oBACqBa;aAj2BqC,UACtD0gC,cAi2BF;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAEA,sBACqB1gC;aAt2BqC,UACtD0gC;OAu2BJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAtgC,gBAGE,mCAFMwgC,cAAmC5gC,YAG3C,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,G,C,a,C,C;A,G,C,C;A,G,C,K,C;A,E,CA/dAb,YAAe,gBAAmC,A,C;A,E,C,CAElDK;EAGkC,AADb,UACnBmhC;cACAA;;GACU,eAAa,KAAA;EACP;GAEF;EAEKr4B;6BAJH;GAKa,AAAZ;UAIkB,qBAGA;WAGrC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CASA;6CAGIu4B,kBACA;8CAGJ,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CASA;6CAGIA,kBACA;8CAGJ,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C;A,O,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,C;A,G,C,S,C,C,A,E,0B,sB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCngBF,yDAII;kFAOA;kCAKA;qCAMA;qDAOJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCpC0BpuB,YAAwB,MAAGquB,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAuCvuB,cAAiCuuB,KAAWlsB,eAA6BksB,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAE7LC;;ElEyFqB;;;gBC5CI;;;;;;SiE7CmB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6E,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCEnBrhC,YAAgB,MAAGshC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BzuB,cAAyByuB,KAAUpsB,eAA4BosB,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzIthC,YAAoB,MAAGuhC,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAA8C1uB,cAA6B0uB,KAAcrsB,eAAgCqsB,QAAqB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAEjLC,YAAsB,MAAGnrB,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C,C;A,G,C,CAAqCxD,cAA+BwD,KAAcnB,eAAgCmB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAC1KorB,YAA2B,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAA6D7uB,cAAoC6uB,KAAaxsB,eAA+BwsB,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAElO,wBACa,KAACnJ;EANsIrjB,eAAgCqsB,OAA9CA;;GAOvH,oBACJI,KATiCL,cAA+DA;KAAUpsB,eAA4BosB,SAWjJ,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,gB,C,C;A,E,C,CAEA,2BAEE/I;;EAf0C+I,IAA+DA;KAAUpsB;GAsBtG,AAnBkCmB,czFqoD1CpT,QAA8B;E0F/nD5B2+B,ODeLliC;gBACAmiC;KArBmDH,SAsBnDn5B,AAAAA;8BAIJ,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,E,C,CAEA,oBAGSu5B,KADiBvJ,eAlCiF+I;KAAUpsB,eAA4BosB,QAoCjJ,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Y,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEAS;EC7BSH;;EpE8EY;;;gBC5CI;;;;;;;;SkELiB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAZlB,YAChBliC,uBACJ,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,8B,C,C,G,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,2E,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CEhCqBI,YAAc,MAAGsW,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCvD,cAAuBuD,KAAUlB,eAA4BkB,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC5InW,YAAqB,MAAGoW,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C,C;A,G,C,CAA2CxD,cAA8BwD,KAAcnB,eAAgCmB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAC/KrW,YAAgB,MAAGgiC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAoCnvB,cAAyBmvB,KAAU9sB,eAA4B8sB,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC9IjvB,YAAyB,MAAGkvB,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAA+CpvB,cAAkCovB,KAAY/sB,eAA8B+sB,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,E,C,CAE3M,wBAL0C7rB;UAOtC;GAEW,AARiCC,YAD6DD,KAAUlB,oBAGuB+sB;KAAY/sB,eAA8B+sB,UASpL15B,AAAAA,AAAAA;UAVuCy5B,uCAgB3C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CApBAE;;ErE6FqB;;;gBC5CI;;;;;;;;;;SoEjDkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAcnB;;SATsHD;QAAY/sB,YAA8B+sB,aAWlL,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,kC,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAAgB;;SAduF7rB;QAAUlB,YAA4BkB,cAgB7I,A,C,Q,C,I,C,C,C,C,C,G,C,M,C,C;A,K,C,I,C,C;A,kC,C,C,G,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CClBN+rB;;EtE6FqB;;;gBC5CI;;;;;;;SqEjDkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCCnBntB,YAAqB,MAAGotB,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAoCvvB,cAA8BuvB,KAAWltB,eAA6BktB,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAGpL,cACEphB,AAAAA,KAJ8CohB,YAKhD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAC;;EvE2FqB;;;gBC5CI;;;;;;SsE/CmB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,wF,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCDpBviC,YAAmB,MAAGwiC,MAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAAyCzvB,cAA4ByvB,KAAeptB,eAAiCotB,QAAsB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,W,C,G,C,C;A,E,C,CAErM;gCAEEptB;mBACAA;;ECL+CqtB;EDO3B;KAA4B,AAAjBC,sBAMgGC;KAAevtB,eAAiCutB;;EAJnJ,AAAhBD,sBAC4B,KAA5BA,AAAAA,uCAI+GE;KAAcxtB,eAAgCwtB,QAH3K,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,G,C,CAEyB5iC,YAAmB,MAAG2iC,MAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAA0C5vB,cAA4B4vB,KAAevtB,eAAiCutB,QAAsB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,W,C,G,C,C;A,G,C,CAC9K3iC,YAAkB,MAAG4iC,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyC7vB,cAA2B6vB,KAAcxtB,eAAgCwtB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CAEhMC;;ExE4EqB;;;gBC5CI;;;;;;;;;;SuEhCqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,yB,sD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CEftB3tB,YAAwB,MAAG4tB,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAuC/vB,cAAiC+vB,KAAc1tB,eAAgC0tB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAKjL5iC,YAAyB,MAAG6iC,MAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAAwChwB,cAAkCgwB,KAAmB3tB,eAAqC2tB,QAA0B,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,e,C,G,C,C;A,G,C,CACxM7iC,YAAgB,MAAG8iC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BjwB,cAAyBiwB,KAAU5tB,eAA4B4tB,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAEjK9iC;EACyB;KAA8B,AAAnByJ,uBAClBA;GACL,QACT,MAAUs5B,sBAA6Bt5B;;EAGZ,AAAlBA,sBAC8B,KAA9BA,AAAAA;IACEA;GACL,QACN,WAAU8L,6BAAoB9L,oBAEhC;WAAUA,qBACZ,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,mB,C,C;A,E,C,CAEA,qBACEyL;mBACAA;;EACgB6tB,UA3BiCH,KAK2FC;KAAmB3tB,eAAqC2tB;EAuB7Lp5B,KA5B0Cm5B;EAM6FE;iCAAtCA,KAAU5tB;;uBAAV4tB,KAAU5tB;;yBAAV4tB,KAAU5tB;;sBAAV4tB,KAAU5tB;;sBAAV4tB,KAAU5tB;;mBAAV4tB,KAAU5tB;;8BAAV4tB,KAAU5tB;;8BAAV4tB,KAAU5tB;;yBAAV4tB,KAAU5tB;;uBAAV4tB,KAAU5tB;;8BAAV4tB,KAAU5tB;;6BAAV4tB,KAAU5tB;;QAAV4tB,KAAU5tB;OA+DpH,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,iB,C,C;A,E,C,CAEA,cACEzL,AAAAA,KAxEiDm5B,YAyEnD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAxEAI;;E1E0FqB;;;gBC5CI;;;;;;SyE9CsB,A,C,I,C,I,C,C,C,C,C,G,C,iC,C,C,C,C;A,sB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,S,C;A,E,C,CCwB/CC,WAAsB,gBAClBC,QAAkB,KAAXC,YAAkC,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,G,CAG7C1jC,YAAc,MAAc,MAAX0jC,WAAkC,A,C;A,M,C,C,G,C,K,C,E,CAtBnDF;kBAEoD,KAAX,KAAb,KAARxH,QAAU7xB,SAAa6xB,aAA+B,A,C,C,C;A,G,C,C;A,G,C,C,uG,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAoCjDz7B,YAAkB,MAAGojC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCvwB,cAA2BuwB,KAAYluB,eAA8BkuB,QAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACxJpuB,YAA6B,MAAGquB,MAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAA4CxwB,cAAsCwwB,KAAmBnuB,eAAqCmuB,QAA0B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAK5O;;EAEyBC,kEAAvBC;MACAA,AAAAA;WAAwCC,aAC1C,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAGA/jC,uBAEE;MAAA,YAAA,UAAA;6BAAA;EACwB,AAAN,QAClB,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEA,kBACEgkC,KAAAA,SACAC;KAAAA,SACAC;KAAAA,KAAgBC,gBAClB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,W,C,C;A,E,C,CAEA,+BACE;MAAA,KAAmBC,mBAAnB,UAAA;;GACqB,CAAA,KAAfC,yBACFrxB,ArFiKoB;WLpJjB1S,K0FVmB+jC,SAAAA,KAAAA;ejB3Ca;GiBsD/BC,UAAkBA,UAAkBA;EATvBD,kBAbrBL;KAAAA,SACAC;KAAAA,SACAC;KAAAA,KAAgBC,gBAYhB,AACAI,0BACAA;uBACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,kB,C,C;A,E,C,CAEAxjC,iCjBnDyC,OiBsDvC;OAAQujC,UAAkBA,UAAkBA,eAC9C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,gB,C,C;A,E,C,CAEA/jC;EACc,KAAmBikC;EAvETd;EAApBD,KAAAA,KAAAA,QAA2C,UAwE7C;MAAOO,MAAAA,KAAeE,KAAAA,KAAgBC,eACxC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,c,C,C;A,E,C,CAGAnkC;EAC+B,KAAZykC,KAAcD,KAAAA;EAtEL,KAAXd,AAuEH,KAAmBc;;EACT;EACC;EACXE,KAzD0Cd;6BAuDhC;GAGhB,QAA4Be;6BAAAA;EAAF;Q1FhBzBrkC,K0FiBYqkC,KAAAA;EACCD,KA5DkCd;6BA4DlCc,OADlB;MAAmD,QACnC,UAEhB,SAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEA;;SAC6BE,KAAAA,UAAWn/B;EACTA;EArBjB,KAAmB++B;EAvETd;EAApBD,KAAAA,KAAAA,QAA2C;EAwEtCO,KAAAA,KAAeE,KAAAA,KAAgBC;EAqBlB,2BAtE6FR;KAAYluB,eAA8BkuB,QAuE7J,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,kB,C,C;A,E,C,CAEA;EAxEwDC;YAyEzBE,WAC3B,MAEFe;UACIH,qBAA6BA,KA7EqBd;EA8E1Cc,KA9E0Cd;EA+E1CE,KAAAA,KAAAA;EAAAA;EAGyB,KADA,KAAjCY,KAjFkDd,wBAkFlDc,KAlFkDd;6BAkFjB;EAFC,GAAtCa;;EAG2BE;6BAAAA;EhF25CpBG,KAA8BC,AgFz5CjCjB,KAAAA,wBAFqB,KACzBU;MAEAV;KAAAA,KAA6BU,QAC7BV;KAAAA,KAA8BU,KAAAA,MAC9BQ;aACF,A,C,Q,C,K,C,C,C,C,C,G,C,0B,C,C;A,E,C,CAIA;EACcN,KA9F0Cd;;8BA+FrBe,iBAhGgFhB;KAAYluB,eAA8BkuB;;GAiG7I,MAAGgB,SACf;EAEqB,MAAEF;EACb,KAAmBD;EACjBG,KAAAA;;GACd;YAAoBrP;6BAAAA;KAAF;EACJA;EACEA,MAAU;EACZ2O,KAAAA,OACZ;iBAAY,SAAG,gBAvIjBR;EACIC;SADJD;KAAAA,UAC2B;aAQP,UAiIlB,KACF,EACkB,OAAEgB,KACpB;YAjIef;;EAfKD;;EAAF,KAeQ,SAfNA;EAAmB,KAeb,SAfgBA;;IAgJrB;QA7IrBA;KAAAA,WAC2B;aAQP,UAuIpB,EACAK,KAAAA;EACIU,IADJV;iBACyCU,UAEzC;yBAGF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,c,C,C;A,E,C,CAEA,oBA5HwDZ;WA8HpD,MAEFc,AAAAA,AAAAA,AAAAA,AAAAA;2DAMF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,cAEE,uBAGF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,sB,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,uB,C,E,C,CA3IAO;EjG4lDOzhC,QAA8B;EAA9BA,QAA8B;EAA9BA,QAA8B;;EsBjjDhB;;;gBC5CI;;;;;;;;;S0EEzB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,M,C,CAoHa,WACTwhC,YAAuB,gBACzB,A,C,Q,C,I,C,C,C,C,C,G,C,M,C,C;A,K,C,I,C,C;A,sC,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAO0C;;SAhI8GpB;QAAmBnuB,YAAqCmuB,aAmIhN,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,iC,C,C,G,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAc,cACZ5wB,ArF0DsB,+BqFzDxB,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,iC,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAKW,WACTkyB,aACF,A,C,Q,C,I,C,C,C,C,C,G,C,M,C,C;A,K,C,I,C,C;A,8C,C,C,G,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qH,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CC7JsB3vB,YAAuB,MAAG4vB,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsC/xB,cAAgC+xB,KAAa1vB,eAA+B0vB,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CA6BlM;;EAGMtB;gBvFQc,+BAKlB9vB;KAAS,KAAaqxB,uBuFdtBC;MAEAA,AAAAA;wBACAA;KAAAA,KAAAA,qBACAA;KAAAA,KAAAA;EAEIxB;gBvFGc,+BAKlB9vB;KAAS,KAAaqxB,0BuFTtBE;MAEAA,AAAAA;;EAEIzB;gBvFAc,+BAKlB9vB;KAAS,KAAaqxB,0BuFNtBG;MAEAA,AAAAA;;EAEI1B;gBvFHc,+BAKlB9vB;KAAS,KAAaqxB,uBuFHtBI;MAEAA,AAAAA;wBACAA;KAAAA,KAAAA,qBACAA;KAAAA,KAAAA,yBACAC;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAIA;EApDkDN;cAqDtBO;;oEACK,KAA1BA,KAAAA,KAtD2CP;KAuD9C,MAIFQ,AAAAA;SACAC,AAAAA;SACA;MAAA,KAAuBF,KA7DyBP,iBA6DhD,UAAA;GACMU;;EAIU/vB,KAAAA;EACJA,AAAAA,oBACV6vB;KAAAA,oDAEOG,uBACHA,eACAA,eACAA,eACAA,eACAA,eACAA,eACAA,eACAA,gBACJF;KAAAA,oDAEQG,uBACHA,eACAA,eACAA,eACAA,eACAA,eACAA,iBACP,AACAC,AAAAA;EACWN,KAAAA,KA1FqCP;SA2FhDa;KAAAA,aAAiCC,eACjCD;KAAAA,aAAkD,KAAjBC,kBAAmBA,gBACpDD;KAAAA,iBAAqCC,mBACrCC,AAAAA;;EACOR,KAAAA,KA/FyCP;SAgGhDe;KAAAA,aAAiCD,eACjCC;KAAAA,aAAkD,KAAjBD,kBAAmBA,gBACpDC;KAAAA,iBAAqCD,mBACrCR;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,kB,C,C;A,E,C,CAEA,eACOJ,YAAwBG,WAC3B,MAEFA,AAAAA;SACAA,AAAAA;QAAoBI,KACpBP,AAAAA;SACAA,AAAAA;QAAgBM,KAChBL,AAAAA;QAAkBU,KAClBT,AAAAA;QAAkBW,MACpB,A,C,Q,C,K,C,C,C,C,C,G,C,O,C,C;A,E,C,CAEA7lC;;EACiB8lC;EACAA,YACf;MAAA,QAAA,UACiB,CAAA,KADjB,UAEI,QAEJ,AACA;MAAA,QAAA,UACiB,CAAA,KADjB,UAEI,QAEJ,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,wB,C,C;A,E,C,CAEA3lC;iBAKM,MAAO2lC,MAAAA;gBAEP;MAAoC,MAA7BA,KAAAA,gBAA+BA,KAAAA;OAEtC,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;gBAEP;MAAoC,MAA7BA,KAAAA,gBAA+BA,KAAAA;OAEtC,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;OAEP,MAAOA,MAAAA;cAEL,KAAA,QACR,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,uB,C,C;A,E,C,CAEA3lC;iBAKM,MAAO2lC,MAAAA;gBAEP;MAAkC,MAA3BA,KAAAA,gBACAA,KAAAA;gBAEP;MAA6B,MAAtBA,KAAAA,gBACAA,KAAAA;gBAEP;MAEoC,MADK,KADL,KAA7BA,KAAAA,gBACAA,KAAAA,iBACAA,KAAAA,iBACAA,KAAAA;gBAEP;MAAyC,MAAlCA,KAAAA,gBACAA,KAAAA;gBAEP;MAA0C,MAAnCA,KAAAA,gBACAA,KAAAA;gBAEP;MAAoC,MAA7BA,KAAAA,gBAA+BA,KAAAA;cAEpC,KAAA,QACR,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,2B,C,C;A,E,C,CAEA,oBAzLkDhB;WA2L9C,MAEFO,AAAAA,AAAAA,AAAAA,AAAAA;sEAMF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,wBArMkDP;WAuM9C,MAEFO,AAAAA,AAAAA,AAAAA;sEAMF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,kB,C,C;A,E,C,CAEA,cACEU,UACA3wB;kBAA4C4wB,YAC5C5wB;kBACqB6wB,YACrB7wB;kBAAgD8wB,aAClD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,gB,C,C;A,E,C,CAEYhmC;EAzNsC4kC;WA2N9C;;EAGSO,KAAAA;SAEX;MADQ,SAAyB,KAAV,KAAbO,oBAAyBA,+BAErC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,kB,C,G,C,C;A,E,C,CAEY1lC;EAnOsC4kC;WAqO9C;oBAIF;WAAUc,KADCP,KAAAA,mCAEb,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,sB,C,G,C,C;A,E,C,CAEYnlC;EA5OsC4kC;WA8O9C;oBAIF;MC7LOt+B,MD6LiBo/B,KADbP,KAAAA,sCAEb,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,8B,C,G,C,C;A,E,C,CAjPAc,2BvFPe,KAAapB,6BuFQ1BO;MACAA;sBACAA,AAAAA;iCACAA,AAAAA;4CACAA,AAAAA;yCACAA,AAAAA;mCACAA,AAAAA;iCACAA,AAAAA;4CACAA,AAAAA;yCACAA,AAAAA;;WvFjBa,KAAaP,6BuFkB1BY;MACAA;qBACAA,AAAAA;;WvFpBa,KAAaZ,6BuFqB1Bc;MACAA;qBACAA,AAAAA;;WvFvBa,KAAad,6BuFwB1BQ;MACAA;sBACAA,AAAAA;+BACAA,AAAAA;yCACAA,AAAAA;2BACAA,AAAAA;sCACAA,AAAAA;mCACAA,AAAAA;uCACF,A,C,I,C,I,C,C,C,C,C,G,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,2D,C,E,C,CAzBAY;;E5E4DqB;;;gBC5CI;;;;;;;;S2ESzB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAkKiD;;SA7LiFrB;QAAa1vB,YAA+B0vB,aAgM5K,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,qC,C,C,G,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAc,cACZnyB,AtFcsB,+BsFbxB,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,qC,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAOqD;;SAzM2EmyB;QAAa1vB,YAA+B0vB,aA4M5K,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,8C,C,C,G,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAc,cACZnyB,AtFEsB,+BsFDxB,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,8C,C,C,G,C,C,A,E,e,mB,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CxBhJJ6pB;;EA8FapL,0DACXgV;mBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAoBAtN,sBAwEE;MADW1H,8DAEb,A,C,iB,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkDAiV;;+CAeeC;;sBASX,SAMF,yCAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIA/M;4CAEI,aACIgN,cAAgBA,aAAkBA,IAExC;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C0BzWEnkC;cAEeokC,KAPgBtyB,AAAAA,qCAO3BuyB;OAEF,SACF,A,C;A,E,CAyBArkC;cAEgB,AAACskC,aAAWF,KArCGtyB,AAAAA,sCAqC3ByyB;OAEF,SACF,A,C;A,E,C,C;A,G,C,Y,C;A,M,C,C1BgDAhnC;;EACewI,QACb;QAAkB,WACFA,SAAmB,QACnC,AACAA;SACAy+B;iBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CACAC;8BAAgB;MAAGD,MAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAC5BE;8BAAsBF;OAAe,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACrCR,YAAgB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAGhBhV;;WACiB;wBACA;uBACD;uBACG;;4CAEf,gBA5DyB2V;iDAgEnB,KAAA;4CAUO;4CACA;4CAIK;4CACO;4CAED;+CAGbC;EACAH;;GACF,QAAS;;KAElBC;mBACArO;wBAGA;qFAQaA;EACFuO;EACAH;GACF,kCAGLC;oBAEF,uBAQFA;;6BAhBarO;GAkBb;KAAU,WACErH,YAAKqH;8BAAfrxB;OACF,AACA,cAGI,KAAA,wCACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CApCc,0BAC4BgqB,kBACpC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAkENzxB;;EACewI,QACb;QAAkB,WACFA;yBAAmB,SACnC,AACAA,SACAy+B;iBACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CACAC;8BAAgB;MAAGD,MAAS,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAC5BE;8BAAsBF;OAAe,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,M,C,CAErCxV;WACiB;wBACA;uBACD;uBACG;qBAGf,MArLG;4BA0LG,KAAA;kDAMK4V;EACAH;GACF,QAAS;E1Eq5Cf1jC,QAA8B,+B0El5CjC2jC;mBACA;uC9E2CkC5lC,8B8E3ClC,U9E6CakI,I8E5CXhC;QAAYgqB,mBACd,AACA,kCAIW4V;EACAH;GACF,QAAS;;EAELpO;uBAIbqO;;6BAJarO;;GAMb;KAAkB,QAChBrxB,QAAUgqB,YAAKqH,UACjB,AACA;SAKF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C;A,E,C,C2B1RAv4B,YACE,MAAO+mC,AAAAA,qBACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CASAjnC;EACkBinC;GAEmB,CAACpuB,gBAElCA;UAGAA;KAEFquB,UACA;SACF,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,C;A,E,CASAjmC,kBAAiCgmC;kBjG80CQnZ,uBAyXvCI;KAAQM,AAAAA,OiGvsDoB;SAAyB,A,C;A,E,C,CAIvD,cACEyY,AAAAA,kBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/mC,cAAqC,MAAG+mC,AAAAA,mBAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAErEvmC,oBAAmCumC,SAAH;MnD4JF,+BmD5JyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEvDvmC,oBAAkDumC,SAAH;4CAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMxEjnC,cAAiC,MAAGinC,AAAAA,mBAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAExDjnC,YAAiB,MjG8zCGkE,AiG9zCA+iC,kBAAqB,A,C;A,G,CAEzCjnC,YAAoB,MjG6zCG,AADHkE,AiG5zCG+iC,kBAAwB,A,C;A,E,CAE/CtnC,YAAe,MjGyzCGuE,AiGzzCA+iC,cAAoB,A,C;A,E,C,CAmBtCjnC,cAA4B,MAAGinC,AAAAA,mBAA6B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAG5D/mC,YAA4B,MAHG+mC,AAAAA,0BAG8B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CAQ7DjnC,cAGE,MAAO89B,sBACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CASA99B;EAEkBinC;EACFpuB,SACdquB;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAQA,cAEEpJ,qBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CAmDA59B,kBjGgwCM0tB,AiGhwCaqZ;wCAAH;MjGiwCPrZ,SiGjwC4B,A,C;A,E,C,CAErChtB,cAA6C,MACzCqmC,AAAAA,mBAAwC,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,I,C,iB,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAK5CvmC,oBAAgCumC,SAAH;MnDwHpB,0BmDxH4C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CASrD/mC,cAA4B,MAAG+mC,AAAAA,mBAA8B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE7D,YACEnJ,oBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAYAA;EACkBmJ;EACNr4B,WACVs4B;UACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CApHgB,YAAI,MAAGruB,eAAW,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA0BzB,YAAI,MAAGA,gBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAwExB,YAAI,MAAGA,SAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,G,CzBrKxBjY,iBACyBu+B,OADG;MAC1B,KAAuBA,4BAAuC,A,C;A,E,C,CAEhE,cjFsIS1+B,KiFrIP0mC,cACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CAEA,sBA+FkCA;gCAAAA,SA9FhC;KA8FgCA,QA7FlC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,CAEA;EA0FkBA,AAAAA;;GAxFF,SACZ;QACmB,mDAIrBC;eACF,A,C;A,C,C,CAEA,c3D6smBErL,AAAAA,A2D5smBAoD,0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,qBACE;MAAA,U3DwsmBApD,A2D5smBAoD,WAIA,O3DwsmBApD,c2DxsmBA,OAEA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/7B,cAC0B,SAG1B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIA,mBACQ,KAAA,kCACR,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAEA,yBAEQ,KAAA,yCACR,A,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUA,gBjFgFSS,KiF/EP0mC,QAAAA,4BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,Y3D4vmBEpL,KAAAA,A2DzvmBAoD,eACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUA,gBACEA,AAAAA,kBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA;E3DmxmB8BpD,A2DlxmB5BoD;E3DkxmB4BpD;0BAAAA,SA/F5BA;SA+F4BA,M2DjxmB9B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQA/7B,cAC2B,SAS3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAEAL,YAAe,MAAGwnC,AAAAA,mBAAgB,A,C;A,C,C,CAClCzN,oBAAkCyN;gCAAAA,SAAH;MAAGA,MAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CAClDlmC,kBAAkCkmC,UAAH;uBhF8KOjmC,8BgF9Kc,A,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAtGT,wBAAI;gDAAQw4B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyDf,YAAK,MAAG2N,SAAU,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C0B1E1DnnC,kBPFiDuiC;GOGvC,WACc,KAAhB6E,mBACS,KAAPA,KPLuC7E,+BOMzC;QACgB,KAAP6E,KPPgC7E,2BOQzC;QACgB,KAAP6E,KPTgC7E,yBOUzC;QACgB,KAAP6E,KPXgC7E,iCOYzC;QACgB,KAAP6E,KPbgC7E,mCOczC,mDAIN;uCACF,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,E,C,CAGAtiC,YACE,MAAOonC,aACT,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,E,C,CAEA;EP1BiD9E;UO6B7C6E,AAAAA,AAAAA;cAUA5E;oBACAA;sBACA8E;YAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,a,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CA3CAC;;EhF4FqB;;;gBC5CI;;;;;;;S+EhDqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CA6BxB;;GACY,AAAxBjgC,8BACFA,QAAcA,uBACdA;MAAgBA;SPhCmGi7B;QAASrtB,YAA2BqtB,YOmCzJrtB;iBACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,yC,C,C,G,C,C,A,E,yB,sD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCnCoBF,YAAwB,MAAGwyB,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAuC30B,cAAiC20B,KAActyB,eAAgCsyB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAIzMlyB,cACE,MAAOmyB,AAAAA,MAL0CD,SAMjC,KAAZC,KAN6CD,oB7EukC1ChyB,uB6EhkCT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,cACEiyB,AAAAA,KAViDD,YAWnD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CATAE;;EjFyFqB;;;gBC5CI;;;;;;SgF7CsB,A,C,I,C,I,C,C,C,C,C,G,C,iC,C,C,C,C;A,sB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,wD,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,C;A,G,C,CCElC/xB,YAAc,MAAGsa,MAAAA,QAAS,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,C;A,E,C,CA2BvC;EACkBkV;EAAAA;EACZrL;;GAAgB,KAAhBA,WAEF,MAEF;MAAsB7J,SAAtB,KAAsBA,WAI8Bvb,QAJpD,UAAA;EAVyB,KAAhBizB,QAAkB1X;6BAKXkV;GAMV,EAXiC,KACe,AAAd,KAA9BwC,AAAAA,cAAgCjzB,oBAcxColB;MADU,kBAEZ,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,WAAA,OACA,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CApCA8N;EAKqBlzB;EAAAA;EAGjBmzB;EAA0B5X;WAA1B4X,OAAYC,KAAc7X,QAAYvb;KAEtCmzB,OAAYC,KAAc7X,QAAY/F,AAAAA,WAExC2d;OAAYC,KAAc7X,AAAAA,kBAC5B,A,C;A,M,C,C,E,C,CAlBA/tB,cAEE,MAAU6lC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,CAEAH;;EtFVmB,QAAsB,KAAZ1d;;;SsFuB7B,A,C,C,C;A,E,C,C;A,G,C,C,iD,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,C;A,E,C,CA8DA;EACkBib;;EAAAA;EACGA;EACfrL;;GAAgB,KAAhBA,WAEF,MAEF;MAAuBt1B,UAAvB,KAAuBA,SAAvB,UAAA;;EAbsD,KAAlCA,KAAkBmjC,UAClBnjC;6BAMJ2gC;GAOV,EAZgB,KACkC,AAAhB,KAA9BwC,AAAAA,6BAeR7N;MADU,OAAkCkO,gBAE9C,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,WAAA,OACA,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CA5CAC;EAIqB9C;;EAAAA;EAI4B3gC;EAE7CqjC;cAHW1C,AAAAA,aAGX0C;OAAYC,KAFepzB,QACJA,gBAGIwV,IAE3B2d;OAAYC,KAFe5d,QACJA,SAGzB2d,OAAYC,KAActjC,YAC5B,A,C;A,M,C,C,E,C,CAtBAtC,cAEE,MAAU6lC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,CAEAE;;EtF1DmB,QAAsB,KAAZ/d;;;SsF2E7B,A,C,C,C;A,G,C,C;A,G,C,C,mI,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAkCwBlV,YAAuB,MAAG4vB,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsC/xB,cAAgC+xB,KAAa1vB,eAA+B0vB,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CACzK9kC,YAA0B,MAAGooC,MAAmB,A,C,I,C,I,C,C,C,C,C,G,C,kB,C,G,C,G,C,C;A,G,C,CAAyCr1B,cAAmCq1B,KAAsBhzB,eAAwCgzB,QAA6B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,kB,C,G,C,C;A,G,C,CACvNpoC,YAAyB,MAAGqoC,MAAkB,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,G,C,G,C,C;A,G,C,CAAwCt1B,cAAkCs1B,KAAqBjzB,eAAuCizB,QAA4B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,iB,C,G,C,C;A,G,C,CAChNnoC,YAAuB,MAAGooC,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2Cv1B,cAAgCu1B,KAAiBlzB,eAAmCkzB,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CAC/LpoC,YAAuB,MAAGqoC,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2Cx1B,cAAgCw1B,KAAiBnzB,eAAmCmzB,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,I,C,CAC/LroC,YAAsB,MAAGsoC,MAAa,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,G,C,C;A,I,C,CAA0Cz1B,cAA+By1B,KAAgBpzB,eAAkCozB,QAAuB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Y,C,G,C,C;A,G,C,CACxLtoC,YAAuB,MAAGuoC,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAA2C11B,cAAgC01B,KAAiBrzB,eAAmCqzB,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CAC/LvoC,YAAyB,MAAGwoC,MAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAA6C31B,cAAkC21B,KAAmBtzB,eAAqCszB,QAA0B,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAQtO;EAfkD5D;WAiB9C;EAEiBO;ErC6CW;EqC3ChBsD,OAlB4HL;KAAiBlzB,eAAmCkzB;EAmBhLM,OAlB4HL;KAAiBnzB,eAAmCmzB;EAmBhLlD,KAAAA,KAvBkCP,cAM0F2D;KAAiBrzB,eAAmCqzB;EAkBjLpD,KAxBmCP;6BAwBnCO;EACA,QAAyB,YApBgGmD;KAAgBpzB,eAAkCozB;EAqBrK,KAAkB,KAAjBK,cAnB8HH;KAAmBtzB,eAAqCszB,OAoB1MrD,AAAAA;KA3BgDP,SAAAA,KA4BhDO;KA5BgDP,iBA4BzB+D,KACvBC;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,gB,C,C;A,E,C,CAEA,cACEA,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,yB,C,C;A,E,C,CAGA,kBdtIShH,QcuIPvR;0BACAuY;WACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,cACEC,gBACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,wB,C,C;A,E,C,CAEA;EA5CqDV;EA8C9B,gBACX,gCAEVhD,AAAAA,AAAAA,AAAAA;KAnDgDP,kCAwDlD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA;GA1DkDA,WA4D9C;EA3DkDsD;GA8F7B,gBACrBY;KAEAC,WAnCJ,A,C,Q,C,K,C,C,C,C,C,G,C,S,C,C;A,E,C,CAEA;EAEa5D,AAAAA,KAnEqCP;WAqE9CnyB,A5FyDsB;I4FtDtB4d,AAAAA,QAAgB,KAxE8BuU,yBAuEhD;;kBAGEnyB,A5FoDsB;qC4FjDxByC,oBAAkCmb,MACpC,A,C,Q,C,K,C,C,C,C,C,G,C,mB,C,C;A,E,C,CAEA;EACa8U,AAAAA,KAjFqCP;WAmF9CnyB,A5F2CsB;I4FxCtB4d,AAAAA,QACI,KAvF0CuU,2BAqFhD;;kBAIEnyB,A5FqCsB;mC4FnCxByC,oBAAkCmb,MACpC,A,C,Q,C,K,C,C,C,C,C,G,C,iB,C,C;A,E,C,CAEA,kBA7FsD6X;GA8F7B,gBACrBY;KAEAC,WAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,Y,C,C;A,E,C,CAEY/oC,cACV,2BAAkC,KAAV2U,mBAC1B,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,G,C,C;A,E,C,CAEY3U,oBAEY,KAAV2U;qCACZ;MAAOq0B,SACT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,U,C,G,C,C;A,E,C,CAEY;EACAjiB;;+CAGRsJ;EAAY1b;mCAAZ0b;KAAyB,MAE7B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,gB,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,Q,C,E,C,CAvHA4Y;;ElFlBqB;;;gBC5CI;;;;;;;;;;;;;SiF8DwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAoDb;;SAnD8FrE;QAAa1vB,YAA+B0vB,aAuD5K,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,wC,C,C,G,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,CCvKFsE;;EnF6FqB;;;gBC5CI;;;;;;;SkFjDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C,A,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCErBv2B,YAAoB,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,KAAasC,eAA+BtC,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CADzLu2B;;EpF4FqB;;;gBC5CI;;;;;;SmFhDwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,S,C;A,E,C,CCIjD;EhG0BmBhlC,AgGzBbA;GAAe,KhGyBFA,+BAOjBA,mCgG7BE;MAAoBilC,0B/G+RcpoC,8B+G/RlC,U/GiSakI;G+GhSC,uBhG4BhB/E;+BgGvBE,ChGuCFA,qBArBcA;EgGfEilC;E/G69BTxoC,gBAAoCH;E+G39BnC2oC,OACR;QAAkB,EAAEA,AAAAA,sBACCA;qBAAAA;EAAAA,AAAAA;;GAEF,kCAJXA,OAKJz0B;YAAa,QAAc,aAE3BA;EAEQy0B;qBAAAA;EAAAA,AAAAA;aAER;YAAoBA;qBAAAA;KAAF,EAAEA,AAAAA,AAAAA;uBAKlBz0B;cACF,SAED;YAAoBy0B;qBAAAA;KAAF,EAAEA,AAAAA,AAAAA;;EAKDA;qBAAAA;EAAAA,AAAAA;qBAAAA,SACjBz0B;OAAQ00B,QADmD,AAAN,KAApCD,kBAEnB;;8B5F2Se;;;yBJxRlBjlC;mBgGhBA,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;GACMqP,iBhGkBc;kBAKlBA;KAAS,KAAaqxB,kCgGrBpBrxB;SACAA;qBACAA,AAAAA,AAAAA;iCACAA,AAAAA,AAAAA;uB3GolDGvQ,mCAA8B,iC2G/kDnCuQ,AAAAA,WAAYrP,SACd,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,G,C,C;A,G,C,C,qE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKwBwO,YAAoB,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,KAAasC,eAA+BtC,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAKzL0C,oBAL+C1C,IAM7C;MAAOxQ,MACgB,KAAnBA,KAAAA,uBjF6/BGoT,uBiF5/BT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,YACEpT,AAAAA,AAX6CwQ,0BAiB/C,A,C,Q,C,K,C,C,C,C,C,G,C,mB,C,C;A,E,C,CAEA,0CAGE02B;KAAe,KAAU,kBAA0BC,aACrD,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA;;EAEMD;GAAa,QACfA,OAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,E,C,CAEA,kBACgBhG;GACF,QACVkG,AAAAA,WAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,sB,C,C;A,E,C,CAEA,cACEpnC,AAAAA,KAxC6CwQ,YAyC/C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,kBACExQ,AAAAA,AA5C6CwQ,kCAkD/C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,Q,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CA/CA62B;EhG9Ce,KAAa5E;;EWmEP;;;gBC5CI;;;;;;;SoFuBqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAQZ;;SAC9B2E,AAAAA;;EAqBYlG;GACF,QACVkG,AAAAA,cApBAF;QAAe,KAAU,kBAA0BC,WACrD,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,+C,C,C,G,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CA4B2B,YAIzBnnC,KAhD2CwQ,cAiD7C,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,oC,C,C,G,C,C,A,E,qB,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,2D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCtHsB3S,YAAiB,MAAGypC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAuC72B,cAA0B62B,KAAUx0B,eAA4Bw0B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAK3K,0CAEE3Z;OACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,cACE7a,wBACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,a,C,C;A,G,C,CAEAlV,YACE,MAAO2pC,MAfmCD,MAgB5C,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,C;A,G,C,CAEA1pC;EAlB4C0pC;;4CAoBxC;4EAEA,YAEF;kBACF,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAEAjqC,kBACSswB,IAAAA;KAAM,SAAb;SACF,A,C,I,C,I,C,C,C,C,C,G,C,S,C,C;A,G,C,CAEArvB;EA/B4CgpC;;uEAiCxC,QAEF;SACF,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,G,C,CAEAhpC;EAtC4CgpC;;4CAwCxC,MAAOC,MAAAA,SAET;SACF,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,E,C,CAEA1pC,cACE,MAAO0pC,MA9CmCD,QA+C5C,A,C,Q,C,I,C,C,C,C,C,E,C,E,C,C,C,C,O,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CA5CAE;;EtF0FqB;;;gBC5CI;;;;;;;;SqF9CkB,A,C,I,C,I,C,C,C,C,C,G,C,6B,C,C,C,C;A,kB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CCH3CC;;EvF6FqB;;;gBC5CI;;;;;;;SsFjDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCGrB70B,YAAuB,MAAG80B,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCj3B,cAAgCi3B,KAAa50B,eAA+B40B,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAIlMx0B,cACE,MAAOqF,AAAAA,MALyCmvB,SAMjC,KAAXnvB,KAN4CmvB,oBpFskCzCt0B,uBoF/jCT,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,E,C,CAEA,cACEmF,AAAAA,KAVgDmvB,YAWlD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CATAC;;ExFwFqB;;;gBC5CI;;;;;;SuF5CqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,W,+B,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,yB,C;A,G,ClG6D9C/pC;EACKkqB;WAA8B,KAAZA;EAAqBrhB,OADxB;WACkCqhB,cAAuB,A,C;A,G,CAoD7E8f,0BAEQC;GAAO,QAAS;EAChB/f;GAAO,QAAS,MAAOA,SAE7B,YACF,A,C;A,G,CAGA,qBAC2C,AAAPA,cAChC+f;QAEW,AAAP/f,mBACI,KAAA,+GAIRggB;QAEJ,A,C;A,G,CAOA1iB,WAA+B,MAAG2iB,WAAY,A,C;A,E,C,CAc9CrqC,YAA6B,MAqJU,AAAN0I,MAAS9G,AArJA0oC,aAAM,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAUhD;GA2IuC,AAAN5hC,KAAS9G,AArJA0oC,gBAaQC;EuDGlB;MvDwKTC;KAAqB;;QAtKtC,WAAc,mBACZvjB;;EACSA,SACX,KAEArS,KAuDoB,aApD1B,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAOA,gBAAkE,MAC9D61B,qBAA4C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGhD,gBAAiE,MAC7DA,qBAA2C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAO/C,gBAAiE,MAC7DA,qBAA2C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAG/C,gBAAoE,MAChEA,qBAA8C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGlD,gBAAmE,MAC/DA,qBAA6C,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAMjD/iB,oBACoC0C,qBAC5BvC;cACY,uBAAdA;UAEKA,UAAP;0CAEA,MAAOjT,AAWe,eAT1B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,oBACMiT;GAAY,Y8BjBZ,AA/EoBpD,aA+ECM,OACzBC;S9BmBF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,CA9HArS,sBAGMyX;GAAO,QAASA,AAAAA,YAAiBrhB,cACvC,A,C;A,K,C,I,C;A,M,C,C,G,C,I,C,E,CA1BA5H,YACE,MAAOupC,0BACT,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CADoC;;GAI9B3hC;EAIMA;YAIC,OAAgB;OAGhB,KAAWA;EACTA,UAAmB,OAEc;;WAlBT;SAAyB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,C,C,CAyNhE/I;;QAA+B;iDAAqB0I,SAAS9G,IAAW,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACxE5B,oBAAwC4B;6BAAAA,OAAX;MAAS,AAAN8G,UAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACnD1I,oBAA0C4B;6BAAAA,OAAZ;MAAS,AAAN8G,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACrD1I,oBAAwC4B;6BAAAA,OAAX;MAAS,AAAN8G,UAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACnD1I,oBAA0C4B;6BAAAA,OAAZ;MAAS,AAAN8G,WAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CACrD/I,oBAAsCiC;6BAAAA,OAAX;MAAS,AAAN8G,UAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,CACjD/I,YAAiB,MAAG+I,QAAK,A,C;A,E,C,CACzBxI,YAAkB,MAAG6I,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,G,C,uC,C,C,C;A,E,C,C;A,G,C,6B,C;A,E,C,CAkCzB7I,YAAkB,UAAOoqC,AAAAA,gBAAcK,aAAahmC,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,G,C,I,C,C,C,A,E,I,sF,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CmG7V9DimC,WACEj4B,AnGgP0B,kBmG/O1BA,AAAAA,AnG+O0B;6BmG5O1BA,AnG4O0B;;oBmC3OA,mBpCKxBA,ACsOwB;wCDrOxBlN,AAAAA;qDAC2B,KXooDtBtC,2Dep1CQi8B,KJ9S6ByL,eXkoDP,kC+G3oDrC9F,ApGWS8F,AAAAA;+BoGNX,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAT8B,YAC1BxnC,KAASynC,AAAAA,oBAAmBA,kBAAaA,UAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAE4B,YAE1Bn4B,AnGyOwB,mCmGxOxBo4B;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,Y,0E,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,S,C;A,M,C,C,G,C,kB,C,C,C;A,G,C,C;A,G,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,I,C,C;A,G,C,C;A,G,C,I,C,C,A,E,mB,gD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,sC,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CCJAC;;E1F0FqB;;;gBC5CI;;;;;;SyF9CgB,A,C,I,C,I,C,C,C,C,C,G,C,2B,C,C,C,C;A,gB,C,C,G,C,C;A,E,C,C;A,G,C,C,qE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKjB9qC,YAAgB,MAAG+qC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCl4B,cAAyBk4B,KAAU71B,eAA4B61B,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC/I/qC,YAAkB,MAAGgrC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAyCn4B,cAA2Bm4B,KAAY91B,eAA8B81B,QAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CAC/JlrC,YAAc,MAAGmrC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCp4B,cAAuBo4B,KAAU/1B,eAA4B+1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKC;;E1FiFqB;;;gBC5CI;;;;;;;;;SyFrCiB,A,C,I,C,I,C,C,C,C,C,G,C,4B,C,C,C,C;A,iB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKlBlrC,YAAgB,MAAG+qC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCl4B,cAAyBk4B,KAAU71B,eAA4B61B,QAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC/I/qC,YAAkB,MAAGgrC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAyCn4B,cAA2Bm4B,KAAY91B,eAA8B81B,QAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEvLG;;E1FyEqB;;;gBC5CI;;;;;;;;SyF7BqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,oE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKtBlrC,YAAqB,MAAGoW,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,C,C,C,M,C,C,C,C,C;A,G,C,CAAoCxD,cAA8BwD,KAAcnB,eAAgCmB,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACxKvW,YAAgB,MAAGsrC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAuCv4B,cAAyBu4B,KAAYl2B,eAA8Bk2B,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACzJprC,YAAiB,MAAGqrC,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAA4Cx4B,cAA0Bw4B,KAAWn2B,eAA6Bm2B,QAAkB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAIpL,wBAL2CD;UAOvC,MAPgHA;KAAYl2B;GAUjH,AAXiCmB,WAY5C9N,UAAS+iC,aAEb,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,a,C,C;A,E,C,CAEA,YAfoHF,KAAYl2B,eAA8Bk2B,SAiB9J,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAdAG;;E1FgEqB;;;gBC5CI;;;;;;;;SyFpBoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAmBrBzrC,YAAc,MAAGmrC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCp4B,cAAuBo4B,KAAU/1B,eAA4B+1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKO;;E1F2CqB;;;gBC5CI;;;;;;;SyFCoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKrB1rC,YAAc,MAAGmrC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCp4B,cAAuBo4B,KAAU/1B,eAA4B+1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC3It4B,YAAoB,MAAGC,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAmCC,cAA6BD,KAAasC,eAA+BtC,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CAEzL64B;;E1FmCqB;;;gBC5CI;;;;;;;SyFSwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKzBz2B,YAAuB,MAAG80B,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCj3B,cAAgCi3B,KAAa50B,eAA+B40B,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC1KhqC,YAAc,MAAGmrC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCp4B,cAAuBo4B,KAAU/1B,eAA4B+1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKS;;E1F2BqB;;;gBC5CI;;;;;;;SyFiBwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CAKzB12B,YAAmB,MAAGK,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAkCxC,cAA4BwC,KAASH,eAA2BG,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CAC9IvV,YAAc,MAAGmrC,MAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqCp4B,cAAuBo4B,KAAU/1B,eAA4B+1B,QAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEnKU;;E1FmBqB;;;gBC5CI;;;;;;;SyFyBsB,A,C,I,C,I,C,C,C,C,C,G,C,iC,C,C,C,C;A,sB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,mC,gE,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCtEvB7rC,YAAkB,MAAG8rC,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyC/4B,cAA2B+4B,KAAc12B,eAAgC02B,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACtKt4B,YAA+B,MAAGu4B,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAA8Ch5B,cAAwCg5B,KAAS32B,eAA2B22B,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAE3MC;GAH6CF,sBCsCZ,uDCuI7B,wBAEA,wBAsB+B,8BACC;;;;MFrMmHC;KAAS32B,eAA2B22B,mDE4KvL,wBAEA,wBAsB+B,8BACC;;;;MFrMmHA;KAAS32B,eAA2B22B,SAQ3L,A,C,I,C,I,C,C,C,C,C,G,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CANAC;;E3FsFqB;;;gBC5CI;;;;;;;;S0FpCzB,A,C,I,C,I,C,C,C,C,C,G,C,2C,C,C,C,C;A,gC,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,4D,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,sC,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,C,CdVA,2CAEA,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,2CAEA,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,E,C,CAEA,uDAEA,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,kB,C,C;A,G,C,CAEAhsC,YAA2B,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,mB,C,C;A,E,C,CAclCE;WAEI;EAMW,KAAM;EAEA;EACH;EAEK;EACL;EAEK;EACL,cAEhB;MAAW+rC,eACCA,cACAA,cACAA,UAEd,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,mB,C,C;A,E,C,CAEA/rC;WAEI;EAMW,KAAM;EAEA;EACH;EAEK;EAGA,QAFL,qBAIG;;GACT,MACR;GAEU,MACV,qBAEF;eACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEAA,cACE,MAAOsG,WACT,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,e,C,C;A,E,C,CAGAtG;GAMY,YACR;QACe,eACf,SrG5BWqB,QAAAA,QqG4BM;QACF,kBACf,SrG9BWA,QAAAA,QqG8BM;QACF,qBACf,SrGhCWA,QAAAA,QqGgCM;KAEjB,SrGlCWA,QAAAA,QqGkCM,4BAErB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEArB;;EACagsC,KAAAA;SAEX;MADgBC,QAAqC,KAAtBA,wBACRD,eACzB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,a,C,C;A,E,C,CAEAlsC,cACE,MAAY,gBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,C;A,E,C,CAEAA,cACE,MAAY,iBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,S,C,C;A,E,C,CAEAA,0BACE;MAAa,eACA,eACA,gBACf,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,O,C,C;A,E,C,CAEAA,cACE,MAAY,gBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,C;A,E,C,CAEAA,cACE,MAAY,kBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,U,C,C;A,E,C,CAEAA,cACE,MAAY,oBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Y,C,C;A,E,C,CAEAA,cACE,MAAY,kBACd,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,U,C,C;A,E,C,CAEAA,0BACE;MAAa,+BACA,eACf,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,C;A,E,C,CAEAA,cACE,MAAa,gBACf,A,C,Q,C,M,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,C;A,E,C,CAEAA,cACE,MAAQ,CAAC,4HAYX,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,c,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CApKAosC;;E7E4FqB;;;gBC5CI;;;;;;S4EhDqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,E,C,CAgB9ChqC,yBAEE;6BAAW,aACe;;GACd;EAGP,SACL,AACA,gBACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,U,C,C,C,C;A,qB,C,C,G,C,C,A,E,+B,2C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,G,CrFfAslB,kBACM2kB;cAEYC;EADH,KACuBC,sBADlCF;OAGKA,UAAP;qCACF,A,C;A,E,C,CAOA,aAAiB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAMjB,YAEEA,UACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEArsC;EACgBwsC,IACdA;;GACIC,aAAwB,WAC1BJ;;G4B+KE,AA/EoB5nB,aA+ECM,OACzBC;O5B/KE;SAEF,SACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,G,CAMAhlB;EAAyBqsC;GAAS,W4B+FHhpB;EA1BP,+B5BrEF;SAA2C,A,C;A,E,C,CAiBjEjO,kBACI,MAAGpC,eAA2D,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAElE,iBACM,CAACy5B,YAAc;GAEfD,YACFA,OACApjB;KAAkBsjB,aAEpBF,AAAAA,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,E,C,CsG5DAtsC,YAAkB,oCACW6I,uBAAY4jC,qBAAcC,aAAU,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C,A,E,sC,kD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,4B,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,CCuBjEjtC,YAAe,MAAGktC,AAAAA,gBAAiB,A,C;A,E,C,CAEtB76B,YAAU,MAAG86B,SAAM,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAUhC;GACMC,QAAU,MACdA;;EAEwBC,UACxB;MAAqBH,0BzH6Oe3rC,gCyH5OlC+rC,QADF,U1E6YkCnkB,A0E5YtBokB,KzH8OG9jC;E+CnKLkd,IAAV0B;KAAU1B,OAKVhT;KAAW4S,cAKX+B;KAAU3B,Y0ErFR2mB;UACF,AACAE,UACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAKA,eACMC,QAAY,MAChBA;UACAhkB;KAAkB+jB,YACpB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEA,kBACEC;;EACIP;G1H6OcrsC,a0H7OM;EACTqsC;GACG,AAAdQ,gBAAkCA,UACtCP;QvGXK95B,euGWiC85B,WACxC,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAQA;EACMD;G1HgOcrsC,a0HhOM;GAEpBusC,QACF,MAA+BE,0BzH4MG/rC,8ByH5MlC,OACEosC,AzH6MWlkC,SyH5Mb,A1H0DF5I;YAAAA;Q0HvDAysC,UACAH;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAR,YAAW,MAAGiB,YAAO,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CACrBhB,YAAa,MAAG3N,YAAO,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAzBS,YAAI,MAAGY,SAAE92B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,2B,uC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CC/C3C;QACmB;cACY,MAE7B8kC;;;MAKA;;;;;yBAOEC;MAGA;MAKoB,iBALF,EAAEC,gBACDA;;GACbR,aACEA,cAEqBS;KAEzBF,cAEJ,OACc,UAAuC;iBAGrDG;iEAEA;sB1HwOoC1sC,8B0HxOpC,U1H0OekI;S0HzObwkC;0DACO/jC,2BAAoBA,eAC7B,CAGFgkC,KAAuBJ,WACvBD;QACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAeA9hB;;aAgCE;2FAGF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAhCEoiB;OAEe;MAGb1jB;oBAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAJiC,sBC7DL2jB;ODgE1B,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAGFC,6BAEiB,QACf;8BAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAJS,WACLF,4BACA;MAAOl/B,iBACT,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,M,C,CAGFq/B,6BAEiB,QACf;+BAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,oB,C;A,M,C,CAJS,YACLH,+BACA;MAAOl/B,mBACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,yB,qC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CEhDJhO;EAGmC,KAAX;EACsB,KAAf;6BADI;UAKjC;mBAAkB,sCAJ0B;;;uBAK1CstC;;mCACAA;OACF,6BAP4C;GAU5C;KAAkB,gCAChBA;KAAAA,UACF,AAEA,sCAAkB,QAChB,MAI4B,MAHL,AAAJ,UADD,WACU,KAAtBC,SAAyB3nB,MAAyB,KAAJ;EAItB;EADd0nB;;EAFZA;uBAAAA;SAAkBA;EAEc,KAApBA;;EACmB,KAApBA,KAAAA,UACXA;KAAAA,OAAkBE,WAEtB,AACF,AAEA,SACF,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAUAxtC;EACUstC;EAAiB;;EACG,KAApBA,KAAAA;;EACMA,KAAAA;IAEd;eAAS,KAAS;eAEdG;EACC;;GAGG,UACJA;YAI0B;;EAAZH,KAAAA,KAAmB;EACxBA,KAAAA;;EACCA,KAAAA,KAAe;EAEjBE,IAASA;aAGH,UACZC;KAEAA;MAID;mBAEDA;;SAIAA;EACC;MAGL,AAEA,MAAOA,gCACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA1uC,yBACE;4BAAkB,WACJ,CAAA,KAAR2uC,SAAWC,UACb,QAEJ,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA5uC;;EACe2uC;;EACAC;GAEb;aAAa,OAAuB;EAALD;EAAuB;EAAR,OAAGC;gBAEjD,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAYA3tC;;;EAMkBwtC,IAAoB,SAAuB;;EAC1C,gBACDI;EAGD,MAAGhoB,UAAyB,MAAG2nB,SAC9BM,SAAsC;EAGzC;;EAEF;EACJ;;GAEuB,KAAf,aAAyC,KAAX,aAC3C;GAGe;;;;6BANV;SAQL;KAAgB,WACkB,GAAhCC;KAAAA,KAAoBP,UACtB,AAEA,2BAG2B;;;yBAD3B;8BAGQQ,KACNC;;yBAOJ;iCAAkB,EAAEC,oBACXA,gBAEQ,SACTC;SAIG;;;;;sBAMLJ,KAAkB,KAAlBA;EACK,SAELA;KAAAA,KAAoBP;;;;;sBAMpBO,KAAkB,KAAlBA;EACK;;;;;sBAKLA,KAAAA,KAAoBP;;SAI1B,GAEW,QAASW,SACpB;SACF,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAKA;;EACoCC;EAAeA;EACpCA,KAAAA;EAAsCA;;;;qBASnD;mBAAoBD,SAAF;EACAA,IAChBtoB;MAAe,KAAfA;;EAhRevO;EAqRgB,OpEzRfI,KAAAA,AoEOE22B;;EAmRdxoB;EArBiB,AAArB4nB,MAqBiC,KAAd5nB,SAAgBA,UArBZ4nB;GAuBJ,MAGjBU;EAGsC,KAAnBtoB,QpElSLnO,KAAAA,AoEkS0BmO;6BAAF;IAEtCkoB;KAAmB,KAAnBA,KAAyC,KAAnBloB;EAEmB,KADD,KpErS1BnO,KAAAA,AoEOE22B,SpEPF32B,KAAAA,AoEsSImO;GAEI,KAvRJyoB,SAuRwB;OAI1BzoB;GAEG,KA1SNvO,KA0SQuO,aAvSLwoB;EA0SRN,SAAyC,KAAdloB,SA7StBvO,MA4STi3B;;wD7H5OE,iBA6BRzuC;e6HmN6C,KAAxB,KAhTNwX,KpEJCI,KAAAA,AoEOE22B,UA8SI,KAAdxoB,SAAgBA,aA9SNwoB,IAgTZE;OAAeR,OACwB,KAArB,KAAdloB,SAAgBA,SApTXvO,MpEJCI,KAAAA,AoEOE22B,WAqTdN,MACAA;KAA8BloB;GACZ,KAAdA,SA1TOvO,MA2TTy2B,KAAgBloB;cAGE,KA9TTvO,KA8TWuO,WAKxBsoB;EAG+B,KAzTbG,KpEjBJ52B,KAAAA,AoEOE22B,SAoUhBxoB;MAAe,KAAfA;6BAD+B;;eAInC,GAEI,GAAWsoB,UACjB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAluC;iBAIE;sB5HpDsCM,8B4HoDtC,OACEiuC,O5HnDe/lC,K4HoDjB,AACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBAxI;GAEMwuC,aAAqB;IAGzB;MAAmBC,4B5H/EmBnuC,gC6HlNG49B,KDiSzC,U5H7EiB11B;G4H8EO,KAAlBslC,YAAgD,KpEnXpCr2B,KAAAA,AoEmXcq2B,kBpElXLr2B,KAAAA,AoEmXnBq2B;EAA0BA;gCCnSO5P;GDmSf,CAAA,OCnSeA,MDmSQgQ;kBAI/CA;UAAeQ,OAAkBZ,SAChB,KAAbA,SAAeA,SAAmBA,UpEzXtBr2B,KAAAA,AoE0XZq2B,cACN,AAEA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,sB,C;A,G,CA1XE/uC,YAAc,MAAGsY,SAAM,A,C;A,G,CAGvBrX,WAAiB,MAAGouC,SAAoB,A,C;A,G,CAUxCrvC,WAAmB,MAAGsvC,SAAW,A,C;A,E,C,CAoBjCjvC,kBAjCiBiY;6BAAAA;EAmCQ;KAAS;GAGjB,CAAA,KAzBKg3B,QpEjBJ52B,KAAAA,AoEOE22B,aAmCgB;EAGf,KAzCJ/2B,QAaKg3B;6BA4BD,OAAnB;MAAW,KACb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA/uC,YAAkB,uCA5CD+X,2BAGG+2B,8BAUEC,aAgC2B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CArBjD9tC;;;;yBAKE;2BACF,A,C,C,C,A,E,wB,oC,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,I,C,C;A,G,C,C;A,G,C,I,C,C,A,E,0B,sC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CDkJF6R;GAGMu8B,UAA6B,CAAA,UAC/BA,sCAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAzDoB;;EACCC,AAAAA,AAAAA;GACF,CAAA;;;;YAEXJ;sCACAK,AAAAA;eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,8B,0C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,a,C;A,E,C,CGpIWt3B,YAAY,MAAG20B,SAAM,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,G,C,C,C,C,C,I,C,S,C,I,C,C,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAErB,cACXA,Q5GuDK95B,e4GvDiC85B,WACxC,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,K,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,G,C,C,C,C,O,C,G,C,C;A,E,C,CAEA5sC,YAAkB,wBhIkMJI,iCgIxMcwsC,aAMwB,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,A,E,+B,2C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,mB,C;A,G,CDsCpDplB,iBACMgoB;cAEa,iCAAfA;UAGKA,UAAP;qCACF,A,C;A,E,C,CAKa/vC,YAAe,MAAGm/B,AAAAA,gBAAY,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,C;A,E,C,CAE9B/rB;EACD+rB;EAAAA;SACQ,MA2KlB1pB;;;QACAA;oBAAuD,SACvDA;kBAA2C,GAAe,CAAA;EAnLxDs6B;GAAa,W/EiFcrsB;EA1BP;Q+E5CV,a7H66BF,UAAa,MAAE1iB,eACjB,SAA+BA;;GAE/B,KAAe,EAAEA,cACjB,SAAiCA;;;GA7xB9B;GAIQ;GAGN,SACH;E6H1JOm+B;;yBADb6Q;uCAGgE;;;yBAAhEA;gCAIJ7Q,aACF,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,C,C,CAEav+B,oBAA4Bu+B;gCAAAA,SAAH;MAAGA,MAAY,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,G,C,C,C,I,C,C,C,C,E,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,I,C,G,C,C;A,C,C,CAExC;EACIA;gCAAAA;EAAAA;EAzBb4Q;GAAa,W/EiFcrsB;EA1BP;;;yB+E5BpBssB;qDAFa7Q,SAKfA;OACF,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CAGa9+B,YAAiB,0CAAgB,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CACjCA,YAAoB,0CAAmB,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,C;A,E,C,CASpD;;mHAEekB;EAEHA;EAhDRwuC;GAAa,W/EiFcrsB;EA1BP;M+ENO,aAEdyb,O7H84Bfj+B;W6H/4BE8uC;QAAc,cACD7Q,A7Hg5BR,yBDx5BPr+B,K8HUAq+B,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,C,C,CAEA;EACYA;EAAAA,QACV8Q;UAA6B;EA1D3BF;GAAa,W/EiFcrsB;EA1BP;K+EKpBssB,QAAc,oBAGhB7Q;YACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;EACYA;EAAAA,QACVA;YAEA8Q;UAAyB9Q;EAEA,AAAbA;EAxEV4Q;GAAa,W/EiFcrsB;EA1BP;M+EkBS,IAC7BssB,QAAc,qBAElB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA3vC,qBACE;MA7E6B8+B,YA6EX,EA7EWA,gBA8Ef,KA1DyBA,SA2DnCsI,YAAiB,IACjB;SAEJ,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;;OAsEyB,EA5JMtI,AAAAA,oBA6JrB,SA7JqBA,AAAAA;IA+JrB;OAAe,EA/JMA,AAAAA,oBAgKrB,SAhKqBA,AAAAA;EAwFP;EACZA;EAAAA;EAEmB,GAoF7B1pB;;;OACAA;sBACAA;kBAA2C,GAAe;EAnLxDs6B;GAAa,W/EiFcrsB;EA1BP;M+EuCe,Y7H01Bd,EAAE1iB,cACjB,SAA+BA;OAEhB,EAAEA,cACjB,SAAiCA;;;GA7xB9B;GAIQ;GAGN,SACH;E6HvEKm+B;;yBADb6Q;gCAIF7Q,eACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;GACY,KAAa,EArGMA,AAAAA,oBAsGrB,KAAA,SAtGqBA,AAAAA;;mHA0GhB59B;EAESA;EAIZ49B;EAAAA;6BAJY59B,OAKtB49B;UAAa;EAjHgBA,Q9H4M7Br+B;O8HzFqB,a9H1ErBA;W8H6EAmvC;UAAyB9Q;EAxHvB4Q;GAAa,W/EiFcrsB;EA1BP;M+EmEmB,IACvCssB,QAAc,qBAGlB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;GACyB,EA/HM7Q,AAAAA,oBAgIrB,KAAA,SAhIqBA,AAAAA;EAAAA;EAAAA;UAmI3BxQ,WACA;OAMFwQ,UAAY;EA1IiBA,Q9H4M7Br+B;O8HjEqB;EAEDq+B,QAApB8Q;QAAiC;EA/I/BF;GAAa,W/EiFcrsB;EA1BP;K+E0FpBssB,QAAc;qBA/Ia7Q,SAiJ7BA;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBA;EAtKI4Q;GAAa,W/EiFcrsB;EA1BP;G+EgHlB,GAAoB;GAEpBwsB,eACFA,UACAzmB;KAAkB0mB,YAEpBD,AAAAA,gBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,qBACEz6B;;;QACAA;oBAAuD,SACvDA;kBAA2C,GAAe,CAAA,UAC5D,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEApV;EACM6vC;WAAsB;EACZE,YACdF;;EAzLEH;GAAa,W/EiFcrsB;EA1BP;;GAgGlB,AA/EoBoB,aA+ECM,OACzBC;O+EqCE;SAEF,SACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,K,C,I,C;A,M,C,C,E,CA1OA2c;iDAC0D,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAmCxC,WAAK+N,eAAqB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C,A,E,8B,0C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,sB,C;A,E,C,ClGxB5CxvC;GACa8vC;OAAsBC,sBACjC;qCAAiCv1B,uBAAWiyB,qBAAcC,aAC5D,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,C,CA8CalsC,kBAAwBmO,OAAH;MAAGA,UAAS,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,M,C,G,C,C;A,G,C,CAEjCnO,kBAA0BmO,OAAH;MAAGA,UAAW,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,G,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,Q,C,G,C,C;A,E,C,CAErClP,kBAAiBkP,OAAF;MAAEA,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,C;A,G,C,CAE5B7O,kBAFiB6O,OAEA;MAFAA,aAEc,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CAE/B7O,kBAJiB6O,OAIG;MAAG,AAJNA,aAIc,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,C;A,E,C,CAE/B7O,YAAiC,MAAG6O,AAAAA,eAAyB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAE7D7O,YAA6B,MAAG6O,AAAAA,eAAqB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,a,C,G,C,C;A,C,C,CAErDL,cAA0B,MAAGK,AAAAA,gBAAS,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,G,C,C,C,I,C,C,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,I,C,G,C,C;A,C,C,CAEtC;EACDA;EAAAA;EACGA,QACbA;;ETpDuBw9B;GAAS,W4B+FHhpB;EA1BP;QnBfTxU;GAAH,OTpCLmE,mBSsCDk9B;iEACkB,CAAA,UAClBA,uDAGN,A,C,Q,C,K,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,E,C,C,C,C,K,C,G,C,C;A,E,C,CAEA,cACEtuC,uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAYA4M;EACYK;EAAAA;EACEA;ET/EWw9B;GAAS,W4B+FHhpB;EA1BP;MnBWE,IAAGxU,SACzBqhC,wDT/DGl9B;iBSgEgCnE,SAErC,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;EACYA;EAAAA;ETxFaw9B;GAAS,W4B+FHhpB;EA1BP;MnBoBE,KACtBxU,sBTxEGmE;oBS6ELnE,QACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,cAAqC,MAAGA,AAAAA,iBAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEvD3O,YAAkB,MAAGoO,YAAsB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,K,C,I,C;A,M,C,C,E,CApF3CnN,sBACS,WAAA;SAAP;SACF,A,C,E,CAGAA;;4DAhBgC;8DAHA,yDAHP,0CA+BvB;SACF,A,C,C,C;A,E,C,C;A,G,C,M,C;A,M,C,CAiCgB,cAAmB,gBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA0BrC,0BACX+uC;mDACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CoGgENlwC;4CAEI,MAA6C,MAAtC;;8CjH5J+BuP,QiHgKtC;MAAuC,MAAhC,QAET,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA4gC;WACsB;;;;wEAGa,WAAiB,OAAEllC,SAChD,MAAOA;;+CxCvNqCyL;EhDifzC2C,KzCjb4B5M,AyC2tBCmR,KAAAA;OwF9jB5BwyB,aACKp0B,AAAAA,aAAP;YAKEq0B,gBACKplC,OjHvL2BsE,QiHuLlC;qBARJ;;gDAaM,CAAC8gC;GAILzC,WACFA,uCAEF;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA5tC;WACsB;;;;wEAGa,WAAiB,OAAEiL,UAChDA,WACA;;;+CxCzP4CyL;EhDifzC2C,KzCjb4B5M,AyC2tBCmR,KAAAA;OwF5hB5B0yB,WACFt0B,SACA;YAGEq0B,cACFplC,OjHxNkCsE,UiHyNlC;qBARJ;;gDAWM,CAAC8gC;GAILzC,WACFA,uCAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C,C,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA5tC,mBACE;KAAY,CAAA,mBxFs5EeqY,AwFr5ET5L;GxFq5ES4L,QwFp5EM;GxFo5ENA,WwFn5Ee;EACjCk4B,QACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAOAvwC;WjHjQqBwwC,SAYqBjhC,eiHuPxC;KAAY,CAAA,mBxFo4EY8I,AwFn4EN5L;ExFm4EM4L;;4CwFl4Ee;GxFo4EZA,QwFn4EY;GxFm4EZA,WwFl4Ee;EACjCk4B,QACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAMAvwC,qBACE;KAAY,CAAA,mBxFq3EYqY,AAAAA,AwFp3EP5L;;6CACeu3B,QAAwB;EAC/CuM,QACT,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAz2B;MAEWrN,OAAP;kBADF,OAQE;eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAgBAzM,cACM6Y;UAES;qBAFTA;GAGAA,WAAa,QACjB;MAAO43B,cACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,C;A,G,C,4B,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,G,CApREz+B,kBAAcy9B;qBAAAA,SAAH;MAAGA,MAAU,A,C;A,E,C,CAGXz9B;GACP,CAAC0+B,QAAU;E7GjCQrE;GAAS,W4B+FHhpB;EA1BP;GiFnClB,GAAestB,SACnB;MAAOlB,UAAAA,SACT,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAGa;EACDmB;EAAAA;SAII;E7G5CSvE;GAAS,W4B+FHhpB;EA1BP;GiFxBlB,GAAestB,QAAuB;EAEnBlB;EAAY;0BAAZA;EAAAA;qBAPbmB;GAONC,OAAqCD,WAIvCnB;qBAAAA,SAAAA;QAEJ,A,C,I,C,I,C,C,C,C,C,G,C,G,C,C,C,C,O,C,G,C,C;A,E,C,CAaA,6CAEEkB;SACAG;UACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA,mBACE;UAAoB7D,QAAF,EAAEA,gBACdA;GAAS,SACXA;EACAA;qBAAAA,SAAAA;WAEJ,kCAEF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAGA;aACyB2D,AAAAA;EACZA;EAAiB,AAAjBA;;EAGsB,AAAdvD;GAFnB;KAAkB,QACkBoC;qBAAAA;EAAAA;qBAFzBmB;EAEMT,OAA+BS;cAEjCvD;EAEboC;qBAAAA,SAAAA;OACF,CACF,A,C,Q,C,C,C,M,C,I,C,E,C,I,C,C,C,I,C,Y,C,I,C,M,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAEA,iCAEE;MAA2BmB,UAAiB,AAAjBA,aAGM,AAAdvD,gCAHgC,YACtCoC;EAAU;;cAAVA;EAAAA;cAAAA;EACmBA;qBAFLmB;EAEdT,OAA+BS;cAE7BvD;0BAGXyD,YACA;SAEFrB;qBAAAA,SAAAA;OACF,AAEAqB;GJ4BEvB,gBAA6B,CAAA;yBAC/BA;iBI3BF,A,C,c,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEA;aACyBqB,AAAAA;;GAEvB;KAAsB,WAChB3D;qBAAAA;EAAAA;GAAS,QAASA,MACtB8D;WACF,CACF,A,C,Q,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,Q,C,I,C,I,C,K,C,C,C,C,C,I,C,G,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EACiBtB;qBAAAA;EAAAA;EACCmB;qBAAAA;EAAAA;;+CAGZ3D;EhFsR8BnkB,AgFtRnB7d;EhF3CLqb,IAAV0B;KAAU1B,wBAKVhT;KAAW4S,cAKX+B;KAAU3B;qBgFiCN2mB,SAAAA;;+CAgBFA;EhFsQgCnkB,AgFtQrB7d;EhF3DHqb,IAAV0B;KAAU1B,wBAKVhT;KAAW4S,cAKX+B;KAAU3B;qBgFiDR2mB,SAAAA;SASJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA3JA+D;GAMMN,QACF,MAAoB9a,AAAAA,qC/HiPc10B,gC+H9OhC0vC,QAHF,U/HmPaxnC;G+HlPC;EpHkCTnJ,qBoHhCH2wC;OAAoB,mBjHlBPJ,UiHmBf,EAMyBI,OAA3BnB;mBAA4C,AAAjBmB;GhIwPTpwC,cgInPoB,UAC3BywC;EAGXxB;qBAAAA,SAAAA;MACAxC;mBAAqC2D,kBACvC,A,C;A,K,C,I,C;A,M,C,C,E,CA5BAI,iCAGiBE;;SAyBjB,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAnByD,YAAI,OAAG,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAyHrB,mBACnC;MAAA,iBAAA,UACMnC,AADN,cAEIoC,iBACA;OAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAS+B,mBAC/B;MAAA,iBAAA,UACMC,KADN,WAEID,iBACA;OAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAwIc,WAOlB,gB1HlUUj/B,mJ0HmUZ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CjCjUA4vB;;4CAC2B;+CAEV,iBACbp5B;mBAGA;iFAG+BA;E+BJ7B,eAAA;S/BIF;SAEF,SACF,A,C,Q,C,I,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CATkB,cACZlB,WAAOs6B,QAAwBA,SACjC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,W,+B,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CkCjCJuP;E3G6nPW7Y,oC2G1nPT8Y;;EASWz6B,8BACX06B;iBAAyBA,aAEzBC;MAGAC,AtGqD6BC;yBsGlD/B,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAQAF,oBACE;sDAAA,UhI+QiBpoC,IgI9Qf;M3GikPO,KAA6BywB,qC2GjkPpC,QAAA,OACE1J,AAAAA,KhI6Qa/mB,2BgI5Qf,CACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CCsbA;EACgBuoC;GACF,QACV,MAAA,QAAA,OACEC,KADF,OAEA,CAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAWAvqC;GACU,eAAgB;EAChBwqC,KAAwBp8B,UAChC;M1F8sE0B4C,A0F9sEP5C,a1F8sEO4C,8BvC/2E2BV,KAAAA,MAAoBO,6BiIiKzE,UjI9HiB9O;GiI+HX46B,SAAmBA;;+CAES,CAACA,sDACAA;;KAE/B,MAAA,KAAiBA,SAAjB,UACM8N,AjIxMO1oC;;yFiI2MsB2oC,wB7HypChC5uC,QAA8B,+B6HvpC3BwQ;MAAMqwB,kBAIZ,CAEJ,AAEA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAvoB,qBACE;K1F4qEwBpD,AAAAA,A0F3qET5C;;6CACiBuG,SAAmB+1B,oDAE/C;EAEIt8B,cAWK,CAAA,eAAe,AAC5B;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAzV;EnHhfqBwwC,SAYqBjhC,AmHqeYyiC;E1FspE5B35B,AAAAA,A0FrpEX5C;QACb;iDAAiCuG,QACnC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAcA;;oBAE8C;GACxC,CAACtF,0BAA6C;EAEnCA;WACO;EACNu7B;WACO,MACvBC;4BACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CASAhyC;WACqB;;EAGRiyC;GACF,a5Ggi8BApV,AAAAA,A4Ghi8BcoV;;GAER,SAAWz7B;EAET07B,K9GhaRvS,KAAYP;G8GiaN,QAAS,QACtB+S;8DACA;mCAQQ;qBAAA;;EAAD,cAAP;oBADF;;;kBAMEA;gGAEA;uBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CvG3iBEjwC;iBAIEkwC;;EuG4ZYC;GACF,QAASC,QvG1ZrB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CA8aApwC,YACEqwC,mBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEArwC;WACoB,MAElBqG;WACA;MAAiB0nB,aAAuB,UAAiBuiB,cACvDD,SACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAmPArwC,qBAIM,CuGnM6BuwC,cvGmML,MAAOC,gBAGnC;qBA6BF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAIAxwC,iBACE;eAAuB,AAAhB+tB,kBACEA,QACT,AACA;MAAO0iB,eACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOAzwC;E6D/wBgDsU;E7DoxBjCo8B,KanSRz5B,KzCjb4B5M,AyC2tBCmR,KAAAA;GbNvB,WAKK/D;EAAAA,kBAAdomB;UAAcpmB,SAEhB,MAAOk5B,AAAAA,cACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA3wC,qBACE;Kaw4DsBiW,AAAAA,Abv4DP5L;;4CACe;EACrBA,cACK,QAAQ,CACxB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAiIArK;WACqB;EL4sNZo2B,oCKrsNK;OAA2B8Y;EL6q7BhCvU;GK1q7BE,QL8q7BTA,2BK1q7BAiW;iBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA5wC,uBLg8zBEi6B;UACO4W;UAAuBh/B,kBKl7zBhC,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CAsDF8E;;2CAHU,SACA;;GAIe,KAAnBtM,gBACmB,KAAnBA,kBAEQ,WACCymC;GACH,QAAS,MAAO94B,QACtB;Ma3hBGf,MzCjb4B5M,AyC2tBCmR,KAAAA,AgD3xBYlH,gB7D+gChD,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEArW;WACqB;0CACD;uBAEA;wBACC;uBACE;;4CACE,WACvB;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CF3gCA8iB,0BkG2GyBA,QAAiCgwB,OlGzG/CC;YAAP;SAGFC,MACA;YACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CASA,yBH2jcIC;0CGxjcFC;MAGAlC;MAEAmC;sBACF,A,C,Q,C,I,C,C,C,C,C,G,C,C;A,E,C,CA0BA,4BACE;+BxB6NsCtyC,8BwB7NtC,UxB+NiBkI;IwB7NbqqC,mBADF;;;;;;;;G2BrDI,AA8CmBhvB,mDA7CvBb;W3B2DF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,C;A,E,C,CASAhjB;aAE2B;;;;W0B9FzByjB;KkBAEC,W5CkGA;YAEE0N,UAAoB,QACxBA;QAGA;MHo/OS,KAA6B6H,0DGp/OtC,aAAA,UxBiMiBzwB;;4CwB/LbsqC,KAAiBvjB,SAAaA;kDACIA,+BAC9B,MACQA,QACVwjB;;;;W0B9GNtvB;KkBAEC,a5CqHF,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA8BA;QACYsvB;;;EM1CsB,KAAmB94B;EAgtB7C+4B;GAAiB,CAAA,cAEFA;EACJA;EACAA;EACAC,KApvBE7d;EAqvBD4d,aA0CY,CAAA,KAALze,gBAvCFye;EACJA;EACAA;EACAC,KA3vBA7d;EA4vBC4d,aAEK,KA9vBN5d,YAAAA;EAgwBP4d;EAAgB,CAAA,aAGJ,YAGZA,KAtwBO5d;EAAAA;IAuwBI6d,QAEAA,KAAmBC,KAzwBvB9d;EA2wBG4d,OAEC;EACJ;EACA,WAEA,OAEV,KAMkBA;ESw0DHx7B;EAAAA;ETjmFL4d;GNuDD,KAAXG,KAAcwd,SAEjBxd,UAAiBwd;GACjBI,kBACCA,2BAAkCA;;;QM3DpB/d;;ESimFK5d,MTlkFQ,KAAmByC,gBNoD/Bsb,OACoB,KAAlCA;GAEa,wBAMjB6d,sCACA;Se8gFwB57B,Af1gFZ67B;Ee0gFY77B;;;;EvChzEuBV;;8BwB1NjD;KAAA,OACEw8B,OxB2Oe/7B,OwB1OjB;EewgF0BC,AftgFZ67B;EesgFY77B;;;;EvChzEuBV;;8BwBtNjD;KAAA,UxBwOiBS,MwBtOf;MAAA,KAAcyyB,SAAd,UACave,AxBoHEljB;;+CwBlHM0oC;EAAcjH,OErInCyH;;EuG4ZYC;GACF,QAASC,SzGtRnB,CAQF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,uBAEE;MAAA,KAAiB34B,cAAjB,UACgBi4B,AxBkGC1oC;MwB9FjB,GACI,GAAkB;GAClB,CAACyQ,6EAEKA;;W0B/MVwK;KkBAEC,W5CgNA;SAEGzK;EAAAA;G8BoEgB6U,AAAAA,yF9BlED7U;;W0BpNpBwK;KkBAEC,W5CqNA;OAEFirB,KAAW11B,cACb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CwG1MuB,YACnB43B,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,6C,C;A,G,CCGApxC,YAAc,MAAGugB,MAAK,A,C;A,G,CAUtBwzB,YAAwC,MAAGC,MAAM,A,C;A,G,CAGjDn0C,YAAgB,MAAGyY,MAAK,A,C;A,G,CAyBxB8gB;EACmB;GACD;EAAU6a,gDCmBcC;eDnBxC;SACF,A,C;A,E,C,CAiBA;GAEMC,UA/Ca77B,MAgDf;E5Gih9BKokB;G4G7g9BH0X,aAEF;EAtDe97B;QAuIjBiI;KAiSoC0xB;EAAAA,QA9RpCoC;;GACe,QAASL,KAuTuBM;EArTrCv6B,KAAawG,KAGvBg0B;YAAuBP;EAyQnBQ;GAAS,QAASC,KAAaC,YArQnCC;YAlCAL;eA+CAM;UAwGAC;UAAsBC,KA0BtBC;UACAC;UACAC;UA2DA7D;KAqBO8D,UADOC,8B5G8gbQpxC,c4GntbtBqxC;KAAsBC;EAEZt7B,KA9LKwG;E1F2pFOvI,AAAAA,A0F19EL5C;GACF;4CAEXkgC,SACAA;KACFlgC,cAlEFmgC;YA/CAC;KAxEiBl9B,MAiEnB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUA3Y,iBAC+B,AA4VOsyC,oBA5VE,QAGtCC;;G5G8+8BOxV,gC4Gl+8BL0U,YAEF;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAzxC,iBAEe,SAAiC,AAAtB81C,kBAElB,CA6VyBnB,cA5V3BhD,KAAAA,0BACA;SAGJ,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAmFA,yBAGE;eAAY;E5Gi48BL5U,AAAAA,A4Gh48BKgZ;EACHA,SACT;EAhNen1B,I5G8kcf0yB;qB4G53bF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;GAEgB,SAA8B,AAAnB0C,iBAICA;EzFjLnB,8BAAA;SyFiLLnB;OAGFA,KAAWhD,OAA6BgD;E5Gi38BjC9X;G4G728BG,WAGSkZ,QAAYA;kBjIgDK/0C,6BiIhDlC;KAAA,UAESyxC,KjIgDIvpC;GiI7CF,UAASyrC;EAAS,SAAWA;;WnHrNzBrE;EmH0NA0F;;;0DAjOAv9B,kBAmOXzE;;;WAIE2gC;c7Hs4CH1xC,QAA8B,+B6Ht4CT0xC;OACtBA,WACF,EAMJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EAEwB,4BAAtBsB;;EACI9B;GAAO,QAAS8B,OAA2B9B,QAG/C5W;8BAKF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAgBA,cACEA,8BAUF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAkBA,kBACY2Y,6BAAVC;MACA;sBjIpCoCn1C,8BiIoCpC,OAAsB2X,KjIlCPzP,KiIkCiB,CAClC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,kBACYgtC,iCAAVE;MACA;sBjIzCoCp1C,8BiIyCpC,OAAsB2X,KjIvCPzP,KiIuCiB,CAClC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAUA;EAvS4BitC,IAwSb;;;EAECX;GACF,WACI,QACd;oBjIuC6C/9B,KAAAA,MAAoBO,qBAkBpDE,KiIzDb,UACiBm+B,KjIwDJn+B;;EW/J8BzL,MAA7CA;MAAAA;YsHwGE,GACmB,AtH7GCA,AAAAA,iBUk4Of6rB,oC4GnxOC;;SADJge;SAEIA,YAGV,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA51C;E5GggSE,KAA6Bi5B;E4G//RjB;EACE6b;GACF,QACFllB,UAAcgmB,UAGxB;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAeAt2C;EACgB;mCAKd;MArV0Bm2C,KAqVRI,wDjID6B9+B,KAAAA,MAAoBO,qBAkBpDE,KiIjBf,UACiBm+B,KjIgBFn+B;;EW/J8BzL,MAA7CA;MAAAA;csHgJA,AAEA,MAtV0B2pC,KAsVRI,wDjIL6B/+B,KAAAA,MAAoBO,qBAkBpDE,KiIbf,UACiBk5B,AjIYFl5B;EW/J8BzL,MAA7CA;MAAAA;csHoJA,AACA,MtH1IyBA,MsH2I3B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOAgqC;UACqB;E5GguOZne,oC4G9tOA;S5G0s8BPuE;yB4Grk9BiBpkB,WA2XjB;SAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CASA;GACU,eAAgB,MACxBq8B;UAAev/B,QACf;M1F8wEwB4C,A0F9wEL5C,a1F8wEK4C,8BvC/2E2BV,KAAAA,MAAoBO,6BiIiGvE,UjI9De9O;;4CiI+DkByQ,SACxB,CAACA;EnHzX4BtK,AmH2XDsK;;GAC/B9Q,mBAAuC,CAAA,8BACrC6tC,WAAkBA,KAAW;EAC1B7tC,SAA8B,KAAZA,WACzB6tC,AAAAA;kBnH3YapG,SmH2YgB32B,UAEjC,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOAxS,oBACc,6BACZwvC;mBAGA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA5XAzC,YAEEz7B,K5Gyh9BOokB,sB4Gvh9BP+Z;WACF,A,C;A,K,C,I,C;A,M,C,C,G,C,K,C,E,CALA1C,iB7HukDOjxC,QAA8B;;;S6HlkDrC,A,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA0DuC,WAAG,SAAI,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAkJzB,iBAaZ,AAAC4zC,iBAA+B,CAAChuC,cAXpCotC,AAAAA,mBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAkBmB;;GAqPcxD,iBAnPjBjqC;EACFA;GACA,MAAY,KACpBsuC,WAkPgCjuC,UAjP5BL,QAAAA,UAAsB,UAGhC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAuCI,YAAI,MAAG,A5Ggw8BJq0B,AAAAA,A4Ghw8BKlkB,+CAAoC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA0ChDo+B,YAAW,MAAGp+B,gBAAmB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAuDd,cACjBjZ,WAAIs3C,KnH5YgC3nC,YmH6YtC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CAwL8B,iBACpB,4BACZ4nC;uBAGA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,U,C;A,M,C,CAJ6B,cACzBv3C,gBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,c,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,CvG1iBAI,YAA2B,SAAQ,A,C;A,E,C,CAyCnC,eLo3NyBs8B,KAA4B,AKn3N/C,gCACmB,OACrB8a,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAQA;ELy98BSra,AAAAA,AK798BMU;kBAC6B4Z,aAK1CC;KuGwV+C3C,avGtV/C4C;UAEAC;UAEAC;UAEAC;UAGAC;KAAkB,MAElBC;UAAkBN,KAElBK;KAAkB,OAGpB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKA,eAjF6BL,WAmFzBF,UAEFS;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YACuBC,WACvB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA,iBACkB,SACdF,UAAkBG,QAClBC;cAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA;;EAwBIC;GApBW,WLk68BNlb,AAAAA,AKj68BDua,KAAAA,wCACFY;cAEOC;;;2CAKc;EL658BlBpb,AAAAA,AK358BIkb;WACO,MAClBG,AAAAA;cACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAWAze;WACwB;;6CwGvIkB4a;ExG2UtCD,OAA4C+D,KA7L9CC;YAiDAC;YA7CA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeA1d;WACwB,MAEN;;EAEL2d,UAIX3F;eAGAj+B;oBAAyB6jC,WACzB7jC;;;6CwG/KwC2/B,OxGsLxC3/B;cAqJE0/B,OAA4C+D,MA5I9CE;YALA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAWA,yBAEE;MAAc,iBAAd,UACEG,eADF,U1BmBetvC,I0BlBbsvC;MAAEn9B,WACJ,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;GACW,CAAA,gBAAmB,CAAA,eAC1Bo9B,eAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAkBA,YACErB,AAAAA,KAAAA,wBAGF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,eACMA,KAAAA,YAAiC,MACrC7Z,AAAAA;iBAAmBkb,aACrB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMA;EAGiBC;WACO;YAKDlwC,oBAAqC;E6DnUZgO;E7DuUzBsN,AAAAA,KAAcjY;EA6BjCtE,SAzBEoxC;GAGA,sBAEF70B,KAAcjY,WAElB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,E,C,C,C,C,C;A,E,C,CAIA0P,oBACoB67B,KAAAA;WACK,MAEvB;MAAOwB,UACT,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAWA54C,yBACqB;wBAGjB;yFAEA,aAEF;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;EAKoB8jB,AAAAA,A6DtX4BtN;E7DuXtBqiC;GAEJ,QLsu8BpBhc,AAAAA,AKru8BEU,4BZ7UoCluB;6BYoVpCkuB,AAAAA,iBZpVoCluB,SYsVxC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAkBAypC;GA3U6B1B,WA8UJF;EAERwB;WAGb,MAAOrE,MAAAA;KAoBiBA,KAAAA;EAfIxoC;;GAoN1BktC,WACFA,uDACQC;EAWC;GACPtjB,cACFA,OAAa3Z,AAAAA,A6DroB+BvF;EAAAA;EzE6CRnH;EqHdtB;;;azGyYd4pC;UAA2BptC,QACpBqtC;KAI8B7E,KAAAA,aAJrC;UAEJ,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CAEAltC,YAAsC,MAAGktC,MAAAA,SAA+B,A,C;A,E,C,CAIxE,cAAyB,MAAGA,MAAAA,WAAmC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE/D;GACM8E,UAAkB,MACtBC;cAAmBjC;EACKkC;EAAeC;G0GxbjC,QACNC;0BAeA;MACAC;KAAS,UAAgBC,S1GuazBJ;OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;GACMF,UAAkB;EAuIlBO;GAAkB,SACpBA,MACAA;UAEFC,UAxIAtF;KAAAA;EAEW/Q,WACX;KAAY,UACVsW;EACOllC,kBACT,AACAykC,QACF,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA;GACMA,WACFC,cACOjC,yDACP;OAEFiC,cAAmBjC;EACfkC;GAAc,SAChBA,OACAA;oBAK0B,MAC5B9G;KAAajP,wBAKf,A,C,Q,C,C,C,C,M,C,I,C,E,C,C,C,I,C,C,C,I,C,uB,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,E,C,CAgBA;EAIkB8T,KAAAA;EACAA,KAAAA;;GAEJ,GACV,IAAiByC,6ClByVoBlrC,uBAAMA,6BA2B7Cqf,KAAQrf,AAAAA,QkBpXN,UlBuXazF,IkBtXX4wC;YAAwB/9B,A6DpfkBvF,oB7Dqf5C,OAE6B,QAG7BkjC,KAAoBK,AAAAA,eAAeC,aAEvC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKA;EACkB5C,KAAAA;EACAA,KAAAA;EAGG,8BACnB;MAAA,QAAA,UAAA;;mDAGE6C;KAAAA,KAAuBtP,kBACPA,MAClB,AAEAsP,0BAgBF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEA;EACkB7C,KAAAA;WACK;EAGFyC;WACO;;;GAIpBK,WACFA,SAAoB/C,+DAItBgD;cZlgBoC9qC;;GYsgBhC6qC,WACFA,SAAoB/C;EqBnHUvuB,ArBsHtBpgB;EqBvbF4d,IAAV0B;KAAU1B,qBAKVhT;KAAW4S,cAKX+B;KAAU3B;MjC7F4B/W;EY6hBlCs9B;cACW,6BAAbA;OAEFA,YAjBF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAoBA7sC,oBACY6sC,AAAAA;WACO,QACjBS;MACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,kBACMT;WAAoB,MACxB;MAAgBA,8B1BtRmCl1B,KAAAA,MAAoBO,6B0BsRvE,OAAmCo1B,A1BnPpBlkC,S0BmPgC,AAC/CyjC,AAAAA;UACAA;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CA+CA;EACeyK,KAAAA;GACTt0C,SAAgB;;GAEhBs3C,WACFA,SAAmBjD,0CAErBkD;YAAuBv3C,SAAaw3C,aACtC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,mCAGE;MlBoLuC3rC,uBAAMA,6BA2B7Cqf,KAAQrf,AAAAA,kBkB/MR,UlBkNezF;EkB5Mf+mB,AAAAA;EL079BkB;EAAyB;aAAvC,OA8E4Blc;;EAoD5B+T;GAAQ,SAAW,AATJwW,QAUjBztB,KAAAA,YKjk+BF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAMA;;GAGM,AAAC3L,cAAe;;EAETk1C;KAETA,aAAuBjD,wCAAgCjyC;EAkBvDkyC,KAAAA;EAAgDlyC;EuG5DrCq1C;EvG4DXnD,MuG3DU;GvG6CN,cACKgD,SAAmBjD,gDAI5BqD;0DAFI,uBAMJJ,aAAuBjD,wCAAgCjyC,eAE3D,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CASA;;EACak1C;KACFA,aAAuBjD;;4CflqBzBp3C,SAC4Bs/B;4BesqBjCob,gBZtqBenK;KYwqBf8J;KAGOA,aAAuBjD,mCAClC,A,C,Q,C,K,C,C,C,C,C,I,C,C,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAja2C,oBACvC5Z;GLqu8BE,AAAC/uB,aACH,QAAYgf,qBAEP;SKvu8BP,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAD+B,WAAG,cAAGhlB,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAyKZ;4CAErB,QAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAImB,wBAAO;MAAGkyC,iDwGtZWrG,SxGsZc,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA4CrB,WAAG,gBAAsB1J,gBAAU,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CAIjD;;GACL,SAAWgQ,QACrB1B;;WAEmB;EAERY;GACF;SAETC;SAAwBc,SAAeA,SAqPzCH;UAjPwBG,SAAeA,mBAEzC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CA0BqC,YAqNnCH,6BAnNA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAyKK;;GACDL,WACFA;EuGtMkCvxC;EvG0MnBouC;GACM;EAIvBhnB,AAAAA,cL079BFnc;gBA/EI,KAAc,KA8EcC,2BA9EW,uBK319BzC;6CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAjB4B;;EACZ8mC;;2CACW;;;GAGnBnlB;EAEO,OAAwBA;EAAxB;SAIXolB;uDADI,kBAEN,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAiCsC,YAAI,MAAG,CAACC,QAAEC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAsKrB;ELspNtB,KAA6BrhB,kDKppNlC;MAAA,QAAA,UACG1J,K1BhqBU/mB,K0BgqBX;uBAAA;yBACF,GAEIonB,YLk52BuCkJ,eKj52BzCxlB,AAAAA;0BAMJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CANsC,iBAChC;eAAA,QAAA,OACEic,AAAAA,K1BtqBO/mB,4B0BuqBT,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kC,C;A,E,C,CA0BN,eyGh9BmB+xC,czGi9BL,MACZC,AAAAA;;kCAEF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YACEC,SACAtqC,AAAAA;WAAiBuqC,WACnB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,C,CAEA,yBACE;MAAA,UACuDA,QADvD,UAAA;;6CACoD,KAAZvM,WACnBh+B,AAAAA,AAAAA;EACFsqC;GAAX,sByGz9BRE,KAAAA,UzG49BI;QAEJ,CACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,CA7BAC,kBAKEJ,QAAOjrB,AAAAA,WAAoBsrB,YAC7B,A,C,C;A,E,C,C;A,G,C,C,sC,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,E,CAyEAC,YACEC,WACF,A,C;A,M,C,C,E,CAFAD;;EAt9BqB;;;gBC5CI;;;;;;SDogCzB,A,C,C,C;A,G,C,C;A,G,C,C,kB,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C,C;A,E,C,C;A,G,C,S,C;A,E,C,Q,C,C,C,M,C,I,C,E,C,M,C,C,C,C;A,E,C,C0G5hCA,kBACMhC;GAAO,SACTA,MACAA;cAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,eACa,AAAPA,eACFkC,UACAC;WAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,C,C;A,E,C,C;A,G,C,M,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,C5GUyB,kB2B9BlBj4B;GAAD,AAoDmBa,mDAnDvBb;U3B6B2B;OAA2B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgIZ,wBAAI;gDAAQvC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAIZ,wBAAI;gDAAQvH,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgC3B,YAAI,MAAG,CAACmhC,QAAEC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,I,C,C,A,E,uB,mC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C6G5LzC9uC;EACgB0vC,YAAcrvC;GAChB,QAAS,MAAOsvC;MAMnBC,QAAYtzC,iBAAnB;kBAJF,OAUE;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAzCsB,iBAEZ,8BACR4jB;sBACAA;sBACAA;sBASAA;sBACAA;sBAEAA;uBAEA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAjByB,cAAO,SAAG9lB,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACZ,cAAO,SAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACN;MAId8sB,OAAP;kBADF,OAGE;UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACqB,cAAO,MAAK,CAAA,gBAAG,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEhC,cAAS,M1H4EJrzB,0B0H5EuC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAV,YAAI,cAAGg8C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CAEzC,cAAS,M1HsFJh8C,qB0HtFiC,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAV,YAAI,cAAGg8C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,uB,uD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCiBzC7vC;8CACiB05B,AAAAA,KAAAA;yEACKA,aAFa;SAG9B,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEL15B;8CACiB05B,AAAAA,KAAAA;yEACKA,aAFa;SAG9B,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAPyB,YAAI,MAAQ,MAALA,kBAAQ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAKjB,YAAI,uBAAUA,eAAK,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,M,C;A,E,C,CAmB7CoW;WACoB;2BCqFK;;;EClIbC,MAAVC;MACAhkC;qBxIyRoClX,6BwIxRpCm7C;;EACOC;GFkDHC;GAAkC,eAAkB;;KAEtD,MAGF;0BAYF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAC,YAAuC,sBACiC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAf/D;8CAEwCC;kBG+E9B,arIq/CZt5C,QAA8B;;MkIlkDL,qBAC1B,MAAO;MAEmB,qBAC1B,MAAO,sBAET;MAAO,qBACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAGwC;;OACsBs5C;kBGkE7C,arIq/CZt5C,QAA8B,mDkIxjDa,SACqB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CAuBvEwjB;EACiBmmB;;+CAIJhH,AAAAA,KAAAA,+BAATgH;iBAOU4P,gBAA0BA,UAApC5P;UpHtDG95B,oBoHyDP,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CAEahB,YAAU,MAAG86B,SAAM,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAEnB/5B;IAET4pC,KAAOrsC,UAAUssC,oBADnB;;gDAGEhP;8CAA+Ct9B,eAAUmoB,uBAE7D,A,C,I,C,I,C,C,C,C,C,G,C,G,C,C,C,C,O,C,G,C,C;A,E,CAvCAokB;EAGEvsC,OAAAA,AAAAA,AAAAA;WAAsBqW;IIrGD9N,gBJyGL+jC,SGvCXE;OHwCHn2B;QAAUrW,oBAFZ;;gDAIEs9B;uDAAyDnV,uBAE7D,A,C;A,M,C,C,E,CAZAokB,iCIlGuBhkC,kBDoSD;;SHtLtB,A,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAT2C,YACvC+0B,8CAA+Ct9B,qBAAUmoB,UAC3D,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAc0B,kBACX,8BACXskB;MAAKjX,YAEL;gBADqC8W,eGmCxB,wBHjCf,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,6B,yC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,gB,C;A,E,CKvHJI,cACEte,AAAAA,6BACF,A,C;A,K,C,Q,C,C,C,C,M,C,I,C,C,C;A,M,C,C,E,CAFAse;;SAEA,A,C,C,C;A,E,C,C;A,G,C,Q,C;A,M,C,CADgB,wBbWdlQ;K5GuDK95B,Y4GvDiC85B,QaXL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C;A,U,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,C,C,C,I,C,C,C,I,C,C,C,C,A,E,4B,wC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CFuCrC1gC,oBC3CyByM,kBDoSD,iBCpSCA;mBD8CvB;MAAOq0B,SACT,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CA8BA;;;;iBAUE;mEAEkB,CAAA,KAAZ+P,mBAGJC;OAAYD;IACLA,SACT;;+CAKaE;;yDAEPL;;2CAA2BM;EAClBN;EAEFO,KADCP;yDAICA;EACFA,8DAEEA;GACG,AAAZA,oBACiB,AAAfA,gBAAwBM;EACjBN,eAEXM;aAGFA;;YAIF,sBzIgLsCl8C,8ByIhLtC,UzIkLiBkI;E0I5SMyP,kBDoSD,iBCpSCA;mBD8ChBq0B;;KA+EG,KAAA,oDAGV,EAEQoQ;gBACa,KAAA;KAEnB9d;KAEAvjB,AlD9H8CvF,oBzEiC7B85B,Y2H+FrB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAwFApkC;4CACmB,MAAO,aACxB;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAvNQ,cAAO,MAAK,WAAEhL,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,MAAK,CAAA,UAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,MAAK,WAAEA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACd,cAAO,MAAK,WAAGA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,sBAAQA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACf,cAAO,sBAAQA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACf;EAEAwN;KAAa,MAAOA;KAClB,KAAA,kDACR,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAIK,YAAI,SAAG5N,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACP,YAAI,MAAG,SAACA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CACR,YAAI,MAAG,QAACA,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CA4Cbo8C,WAAgB,YACN,sDAAwD,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,iB,C;A,G,CA6ElEtkC,iBACMykC;GAAc,QAAS;ElDrJmB7mC,KkDsJtB8mC,QAAxBD;SACA;SACF,A,C;A,C,C,CAEAnxC;GACW,eACP,MAAOoxC;O9GpEkC3uC,A8GqEhC4uC;G9GrEgC5uC,Q8GsEzC,MAAOsxB,M9GpE+BtxB;Q8GqEvB,AAAN2uC,0B3H9HMhN;E2HiIIkN,KlG+UhBrkC,KzCjb4B5M,AyC2tBCmR,KAAAA,AkG1nBd+/B;;uFAKmBC;;KACnC,MAAOzd,MAASwd,AAAAA,AAAAA;iDAEhB,gBAAkBA,iBAGlBvzB;GAAO,QACT,MAAO+V,MAAS/V;UAEV,KAAA,yCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAhe;GACW,eAIP;OACSqxC;G9GjGgC5uC,AAAAA,W8GkGzC;O3HzJe2hC;G2H6J0B,AAArCkN,KlGmTDrkC,KzCjb4B5M,AyC2tBCmR,KAAAA,AkG9lBd+/B,sCAEhB,MAAOH,YAGPpzB;GAAO,QACT,MAAOA,SAEX,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEApqB;G9G/G6C6O,AAAAA,A8GgHvC4uC,iBACF;O3HxKejN;G2H4K0B,AAArCkN,KlGoSDrkC,KzCjb4B5M,AyC2tBCmR,KAAAA,AkG/kBd+/B,sCAEhB,WAGAvzB;GAAO,QACT,MAAOA,UAET;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,G,CAgBA1C,iBAAuBG,OAAH;qCAAqB,A,C;A,G,CAIzCzb,WAAwB,MAAG0gC,SAAM,A,C;A,E,C,CAEjC+Q,YAAoB,MAAGC,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEzCA,aAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1BC,iBACEnH;;EACIoH;GAAQ,QACVA,QAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEApH;EAEMntB;GAAc,SAChBA,MACAA;eAGcqjB,OAGhBgR;;EAEehR;GAAX,yBACFjlB;G3FnDE,AA/EoBpD,aA+ECM,OACzBC;S2FoDF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA9kB,YAAkB,MAAGoQ,AAAAA,eAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAQrC2tC,YACExlB,OAAWua,SACb,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAkL,YC5RuBrlC,KD6RfgyB,cAJNpS;OAAWua,SAMb,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,W,C;A,E,C,CASAmL,YAAwC,iCA3DT,yBA2DgC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE/DC,YAAwD,MC1SjCvlC,AD0S0C4f,iBAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEzE4lB;EC5SuBxlC,KD6SAylC;8BAhEQ,wBAkE7B/0C;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAg1C;ECnTuB1lC,KDoTA2lC;ECpTA3lC,KDqTL2lC;gCAxEa,wBA0E7Bj1C;QACAk1C;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAC;EC5TuB7lC,KD6TA2lC;EACTA;;OAEU/tB,UAAhB+tB;;EAAAA,yEAnFuB,wBAqF7Bj1C;;GACS,SAAS02B,U1IrKXx/B;oB0IsKP,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAk+C,YAAwB,iCA1FO,yBA0FkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEjDC;EACgBvB,cAAAA,SAAc5sB;8BA7FC,wB1I/EtBhwB;mB0I+KP;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAo+C;EChVuBhmC,KDiVL4f;ECjVK5f,KDkVH4f;gCArGW,wBAuG7B/d;QACAhS;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAo2C,YAA8B,iCA5GC,yBA4G2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE1DC;EC3VuBlmC,KD4VJ2mB;EC5VI3mB,KD6VH2mB;gCAhHW,wBAkH7B3P;QACAD;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAovB;ECpWuBnmC,KDqWJ2mB;8BAxHY,wBA0H7Bsd;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAoB;EC3WuBrlC,KD8WJ2lC;EC9WI3lC,KD+WH2lC;gCAlIW,wBAoI7B5uB;QACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAhDiC,wBAAO5uB;QAAH;SAAei+C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASlC,wBAAOxmB;QAAH;SAAe74B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,C,CA+CrCk+C,YACEhR,QAASkG,QAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAkM,cAAkB,MAAGpZ,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,CAOjD3lC,kBAAqBmQ,OAAH;MAAGA,SAAW,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAEhCwtC,kBACWxtC,OAATw8B;QAASx8B,QACX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA4uC,cAAkB,MAAGpZ,YAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,Q,C,C,C,M,C,I,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,E,C,CAUzCgY,YACEhR,Q1ItNOrsC,K0IsNE0+C,QAAa,2CAExB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAD,cAAkB,MAAGpZ,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAHtC,cAAUxZ,OAAImM,AAAAA,cAAgBA,AAAAA,cAAvB;SAAoCqU,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,E,C,CAejDoS,cAAkB,MAAGpZ,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,mB,C;A,E,CAQjD5lC,kBAAoBoQ,OAAH;MAAGA,SAAW,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,C,CAE/BwtC;EAFoBxtC,OAGlBw8B;QAASkG,OAHS1iC;EAKN0iC,KALM1iC;;+C3HtYDkgC,K2HsYClgC,QAQhBmZ;QAAgB,AAAA,2CAOpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAy1B,cAAkB,MAAGpZ,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CATa,eAC/CmU,8BAEF8D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHM,wBAAI;iDAAuC,KAAPlT,aAAUt7B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,G,CA8BxDrP,kBAAuBoQ,OAAH;MAAGA,UAAc,A,C;A,E,C,CAErCwtC;EAC2BxtC;EAAjB8uC,WAAiB9uC;GACZ,KAJQA,iBAKAoiC,AAAAA,aAAnB5F;QAASl+B,8BAEC8jC,OAAV5F;QAAU4F,mBAA+B9jC,SAAE8jC,UAE/C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAwM,cAAkB,MAAGpZ,YAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,G,CAY/C5lC,kBAAuBoQ,OAAH;MAAGA,UAAc,A,C;A,E,C,CAErCwtC;EAFuBxtC;EAGb+uC,WAHa/uC;GAIR,KAJQA,gBAIY,KAJZA,kBAKAuf,AAAAA;;EAAsBD,AAAAA,aAAzCkd;QAASl+B,iCACS,KANC0B,gBAMmB,KANnBA,eAOnBw8B,QAASl+B,SAAEihB,AAAAA,cAAaD,AAAAA;OACfC;GAAAA,eAAuBD,AAAAA,oBAChCkd;QAEa,KAXMx8B,iBAWIuf;;;;KACrBpG,QAAgB,AAAA,KAACoG,2CAGnBid;QAASl+B,SAAEihB,QAAaD,AAAAA,iBAE5B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAsvB,cAAkB,MAAGpZ,YAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAN9B,YAAI,MAAGiY,mBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,G,CAe1C79C,kBAAmBoQ,OAAH;MAAGA,UAAU,A,C;A,E,C,CAE7BwtC;EACsBv0C,AAAAA;YAElBujC,YACA;SAGsBx8B;W3H1ePkgC,K2H0eOlgC,UACxBw8B;QAAS9wB,AAAAA,AlD5gBqCtF;;4CkD+gB5C+S,QAAgB,AAAA,gCAMpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAy1B,cAAkB,MAAGpZ,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CARyB,eACvDmU,8BACF8D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHkB,wBAAI;iDAAuC,KAAPlT,aAAUt7B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,E,C,CAgBpEuuC;EACsBv0C,AAAAA;YAElBujC,YACA;SAEQl7B,AAAAA;SACVk7B;QAASwS;4CAGP71B,QAAgB,AAAA,gCAMpB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAy1B,cAAkB,MAAGpZ,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAR0B,eACvDmU,8BACF8D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHkB,wBAAI;iDAAiC,KAANlT,aAASnwB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,G,CAmB9Dxa,kBAAqBoQ,OAAH;MAAGA,UAAY,A,C;A,E,C,CAEjCwtC;EACar0C,OAAAA;;EAAAA;EACSF,AAAAA;YAElBujC,YACA;SAEEx8B;GAAAA,wBAMFw8B;QA4DG3M,8CAJItmB,AAAAA,AAAAA,QAAqBA,gB9HrmBvB5Z,SAC4Bs/B,6BGAlBiR,K2H+iBSlgC,UACxBw8B;QAAS9wB,AAAAA,AlDjlBmCtF;;4CkDolB1C+S,QAAgB,AAAA,iCAStB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAy1B,cAAkB,MAAGpZ,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CA9Bb,YAAI,MAAG9kC,SAAE8rC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,M,C,CAoB1B,eACMmN,8BAEF8D,kBAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAHM,wBAAI;iDAAuC,KAAPlT,aAAUt7B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,2B,C;A,E,C,CAkB9DuuC;EAC0BjuB;EACTD,AAAAA;;qEAEuB,aAC9B,KAAA;4CAINnG,QAAgBvoB,AAAAA;EAISq+C;EAgCF,cAhCzBzS;sBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAoS,cAAkB,MAAGpZ,YAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAPE,YAAI,MAAGiY,mBAAiB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAkDxEyB,YAAW,MAAGxjC,AAAAA,AAAAA,YAAczM,qBAA+B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAM3DrP,YAAkB,wBAAoByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C;A,M,C,C,E,CAD9C86C,+BAA2B,A,C,C,C,A,E,kC,8C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CGzb7Bz/C;;GACQ,SAAM;oBACgB;GACf,CAAA,KAATgB,QAAYI,UAAU;GAC1B;YAAoBJ;6BAAAA;KAAF;EACZA;;GAAK,CAAA,OAAGI,MAAM,aACpB,AACA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAzB,YACa09C,UAEX;MAAOqC,M7IpEEj/C,sB6IqEX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKE2B,oBAC4B;6BAAA;EAAR;EACA,UAAQ,GAAuB,AAAA,CAAR,kBACzC;MAAY,GAAQ,MACtB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEAA;EACoB,UAAQ,GAAuB,AAAA,CAAR;EAC7B,CAAA,EAAQ,WACpB;MAAkB,WAAQ,GAAuB,AAAA,CAAR,kBAC3C,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,E,C,CA7OAu9C,gBAAwC,qBAAkB,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,CAE1DC,gBAA0D,uBACnC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,I,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CAavBV,cAAkB,MAAGpZ,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CAQjDoZ,cAAkB,MAAGpZ,YAAoB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEzC5lC,kBAAsBwI,MAAJ;mDAA4C,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE9D1I;;EAAuBw/B,sCAAH;UAA8B,KAARA,QAAW92B,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE1D/I,YAAiB,MAAG+I,MAAAA,QAAc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Q,C;A,E,C,CAQlCw2C,cAAkB,MAAGpZ,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE5C5lC,YAAkB,cAAMi/C,aAAS,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEjCn/C;;SAAoB;iDAAsB6/C,KAAYrgB,SAAW2f,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEzEx/C,YAAiB,MAAGmgD,MAAUX,SAAQ,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CAStCD,cAAkB,MAAGpZ,YAA4B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEjD5lC,YAAkB,WAAKwa,kBAAMqlC,SAAW,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAExC//C;;SAAoB;iDAAiC,KAANw/B,SAAS9kB,UACpC,KAAb8kB,QAAgBugB,SAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEjCpgD;EA9BoB+I,KAAAA,AA8BsBgS;EAAcqlC,KAAAA,QAAvC;MAmLiBjf,MAAOhqB,KAAQA,cAnL2B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CAQ5EooC,cAAkB,MAAGpZ,YAAoC,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEzD5lC,YAAkB,cAAMwyC,aAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE/B1yC;;QAAoB;iDAA2C,KAARw/B,KAAWkT,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEvE/yC,YAAiB,MAAG+yC,MAAAA,SAAc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,O,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CAQlCwM,cAAkB,MAAGpZ,YAAuB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE5C5lC,YAAkB,MAAGwI,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE1B1I;;SAAoB;iDAA8B,KAARw/B,QAAW92B,QAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE1D/I,YAAiB,MAAG+I,MAAAA,QAAc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CASlCw2C,cAAkB,MAAGpZ,YAA0B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE/C5lC,YAAkB,WAAKyG,iBAAU+rC,SAAM,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEvC1yC;;SAAoB;iDAAoC,KAAXw/B,SAAc74B,UAC5C,KAAR64B,QAAWkT,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEvB/yC;EAA0CgH,KAAAA;EAAmB+rC,KAAAA,QAA5C;MAuIiB5R,MAAOhqB,KAAQA,cAvI2B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CAU5EooC,cAAkB,MAAGpZ,YAA2B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEhD5lC,YAAkB,cAAM2vB,iBAAMlpB,iBAAUipB,aAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE/C5vB;;SAAoB;iDAAqC,KAAXw/B,SAAc74B,UAC9C,KAAP64B,SAAU3P,UAAgB,KAAR2P,SAAW5P,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEzCjwB;EAA0CgH,KAAAA;EAAmBkpB,KAAAA;EACzDD,KAAAA,QADa;MAyHbkR,MAAOhqB,KAAQA,KAAQA,iBAxHR,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CASnBooC,cAAkB,MAAGpZ,YAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE9C5lC,YAAkB,cAAM2vB,oBAASD,aAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAExC5vB;;SAAoB;iDAA+B,KAAPw/B,SAAU3P,UACvC,KAAR2P,SAAW5P,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAEvBjwB;EAA0CkwB;EAAAA;EAAeD,KAAAA,QAAxC;MAqGiBkR,MAAOhqB,KAAQA,cArGuB,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CASxEooC,cAAkB,MAAGpZ,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEvC5lC,YAAkB,WAAKqJ,iBAAUqI,aAAU,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAE3C5R;;QAAoB;iDAEF,KAAXw/B,QAAcj2B,UACH,KAAXi2B,QAAc5tB,SAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE7BjS;EAC0B4J,KAAAA;EAAmBqI,KAAAA,QAD5B;MAmFiBkvB,MAAOhqB,KAAQA,cAlFc,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,E,C,CAS/DooC,cAAkB,MAAGpZ,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAExC5lC,YAAkB,WAAKqJ,iBAAUR,SAAK,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEtC/I;;SAAoB;iDAEF,KAAXw/B,QAAcj2B,UACP,KAAPi2B,SAAUz2B,SAAI,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAErBpJ;EAA0C4J,KAAAA;EAAmBR,KAAAA,QAA5C;MAgEiB+3B,MAAOhqB,KAAQA,cAhE0B,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,E,C,CAmB3EooC,cAAkB,MAAGpZ,YAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAExC5lC,YAAkB,WAAKqJ,iBAAUsQ,iBAAQpQ,aAAW,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,C,C,CAEpDzJ;;SAAoB;iDAEF,KAAXw/B,QAAcj2B,UACL,KAATi2B,SAAY3lB,UACZgmC,KAAYrgB,QAAa/1B,SAAU,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,G,CAE1C9J;EAA0C4J,KAAAA;EAAmBsQ,KAAAA;EACzDimC,KAAUr2C,QADG;MAsCbq3B,MAAOhqB,KAAQA,KAAQA,iBArCF,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAerB,cAAU,MAAG4oC,QAA2BM,SAAa,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,8B,0C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,e,C;A,E,C,CJ/OzD3D;KACY,SAAuB,CAAA,KAAZ4D,KxIqRN72C,AwInSGgP,kBAeJ,SAAwB,CAAA,KAAb6nC,KxIoRV72C,AwInSGgP;;UAgBV,KAAA,4BxImROhP,AwInSGgP,aAkBlBA,AAAAA;YACF,A,C,Q,C,C,C,M,C,I,C,E,C,I,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,G,C,C,C,C,E,C,C,C,C,C;A,E,C,CAEA8nC,cxI8QiB92C,AwInSGgP,kBAsBS+nC,AAAAA,gBAAP;kBACTC,SACX;oBAA+BC,aACjC,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAKAH,2BAEE;MAyIOC,UxI0HQ/2C,AwInSGgP,WAgCJ,YACI,KAAZ6nC,cACe,KAAbA,KxIiQO72C,AwInSGgP,oBAmCDkoC,SAEJH;;6BACe,KAAbF,KxI6PA72C,AwInSGgP,oBAuCImoC,SACTJ;;;QAIY,KAAZF,KxIuPE72C,AwInSGgP,gBA6CdikC;EAEOmE,UADKJ,mBAES,KAAZH,KxImPE72C,AwInSGgP,iBAgDwC,KAAb6nC,KxImP9B72C,AwInSGgP;gDAoKV,uDAGRikC;;EACYC,SACL6D;;wBAvHkB,KAAZF,KxIiPE72C,AwInSGgP,gBAmDS,KAAlB6nC,AxIgPM72C,AwInSGgP,sBAoDPqoC;UAIX,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAP;+CAEoCtwB,OAAzBuwB,AAAAA;gBAAP;yEAC4BvwB;;;;QAEI/V,KADZ+V;EAC0BA,OAAvCuwB,AAAAA;gBAAP;iCAEM,KAAA,uCAEV,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEAD;ExI2NiB92C,AwInSGgP,UA0ElBikC;;EACY+D,SACZ;YxIuNeh3C,AwInSGgP;GA4EJ,WACM,KAAZ6nC,YACW,KAAZA,KxIqNQ72C,AwInSGgP,gBA+EC,KAAZ6nC,KxIoNQ72C,AwInSGgP,iBAgFO,KAAlB6nC,AxImNQ72C,AwInSGgP,iBAgFS6kC;;;EACjBoD,UAAwBJ,AxIkNnB72C,AwInSGgP,kBAkFlB,EACgC6kC,OAAzBkD,AAAAA;gBAAP;uBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAD;GACkB,KAAZD,KxI4MW72C,AwInSGgP,kBAwFJ6nC,KxI2MC72C,AwInSGgP;;GAyFN,YAAgB,YACxBikC;GACgB,KAAZ4D,KxIwMO72C,AwInSGgP,kB7HmFXnY,gB6HiK6CggD,KxI+CrC72C,AwInSGgP,uBAoPN+nC,AAAAA;;;yBACZ9D;SAzJM;gBA8JM8D;GA7Je,KAAZF,KxIsMA72C,AwInSGgP,kB7H+FXnY,gB6H2JgDggD,KxIyCxC72C,AwInSGgP,kBA0PN+nC;;;yBACZ9D;SA7JM;gBAEWgE,QAAiBK,aACrBP;UAAP;+BAEa,YACf9D;EACWgE,QAAiBK,aACrBP,AAAAA;gBAAP;sBAGJ,MAAOO,WACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAR;OACaD,KxIsLI72C,AwInSGgP,uBAgHA6nC,KxImLH72C,AwInSGgP;;GAiHF,eACVikC,SAEO8D,AAAAA;gBAAP;gCACiB,YACjB;;OAIF,MAAOQ;OAEP,MAAOC;OAEP,MAAOC;OAEP,MAAOC;UAEU,KAAbb,KxIiKO72C,AwInSGgP,kBAuOlBikC;EACWC,SACXD;cACO8D,AAAAA;gBAvGD;2BACsB,KAAbF,KxI+JA72C,AwInSGgP,iBAqIZ,MAAO2oC,UAET;;QAEA,QAEN,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAC;;EAiBSb,OAfP;GACE9D;GACgB,KAAZ4D,KxIkJS72C,AwInSGgP,gBAiJiC,KAAb6nC,KxIkJvB72C,AwInSGgP;EA8Oc6nC,KxIqDjB72C,AwInSGgP,WA8ON+nC;;;yBACZ9D;SAnFAA;cARE8C;kBASU7C;ExIsIGlzC,AwInSGgP,iBAqJH,SAAwB,KAAb6nC,aAAoB,AAC9C5D;cACA;mBACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAoBA6D;GACmB,KAAbD,KxIsHW72C,AwInSGgP,qBA8KhBikC,SACO8D,AAAAA;gBAAP;oCAEe,KAAbF,KxIkHW72C,AwInSGgP,sBAkLhBikC,SACO8D,AAAAA;gBAAP;oCAEe,KAAbF,KxI8GW72C,AwInSGgP,qBAsLhBikC,SACO8D,AAAAA;gBAAP;sCAYc,CAAA,KAAZF,KxIgGW72C,AwInSGgP,oBAoMV,iCxI+FOhP,AwInSGgP;EAsMN6nC,KxI6FG72C,AwInSGgP,WAuMlBikC;SACO8D,AAAAA;;;EAdIG;WAET;KAEA,0BAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAWA1/C;ExIwFiBwI,AwInSGgP;GA4MP,SAAuB,KAAZ6nC,YAA6C,KAAbA,KxIuFvC72C,AwInSGgP,sBA8MhB;GACEikC;GACgB,KAAZ4D,KxImFO72C,AwInSGgP,gBAgNmC,KAAb6nC,KxImFzB72C,AwInSGgP,sBAoNd6nB;OADWqc;ExIgFAlzC,AwInSGgP,iBAqND,SAAwB,KAAb6nC,aAAoB,AAC9C5D;cACA;SAEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA6D;ExIuEiB92C,AwInSGgP;GA6NP,SAAuB,KAAZ6nC,YAA6C,KAAbA,KxIsEvC72C,AwInSGgP,kBA8NhBikC;EACWC,SACXD;cACA;SAEF,OACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CASA4E;EACkChB,KxIqDjB72C,AwInSGgP,WA8ON+nC,AAAAA;;0BACZ9D;SACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA4E;E7HhKShhD,gB6HiK6CggD,KxI+CrC72C,AwInSGgP,uBAoPN+nC,AAAAA;;0BACZ9D;SACA;SACF,A,C,Q,C,C,C,M,C,I,C,E,C,E,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C;A,E,C,CAEA4E;E7H1JShhD,gB6H2JgDggD,KxIyCxC72C,AwInSGgP,kBA0PN+nC,AAAAA;;0BACZ9D;SACA;SACF,A,C,Q,C,C,C,M,C,I,C,E,C,E,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,G,C,G,C,C,C,C,C,C,A,E,mC,+C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CK5PF37C,YAAoD,gCACjB,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,C;A,G,C,kB,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,C,C,CAMjCiG;;QAAc;iDAAgC,KAAR64B,KAAWe,UAAiB,KAARf,IAAW92B,QAAK,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,I,C,C;A,G,C,CAC1E/I,YAAiB,MAAG+I,MAAAA,QAAc,A,C,I,C,I,C,C,C,C,C,G,C,U,C,C;A,E,C,CAClCxI,YAAkB,cAAMqgC,kBAAQ73B,YAAO,A,C,Q,C,K,C,C,C,C,C,G,C,U,C,C;A,K,C,I,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,I,C,C,C,C,C;A,M,C,C,E,C,CAEvCw4C,+CAAoC,A,C,I,C,I,C,C,C,C,C,Q,C,C,C,M,C,C,C,E,C,Q,C,C,C,C,M,C,I,C,I,C,I,C,C,C,C,E,C,C,C,C,C,C,I,C,S,C,I,C,C,C,E,C,C,C,C,E,C,C,C,C,kB,C,C,C,C;A,e,C,C,C,C,C;A,E,C,C;A,G,C,O,C;A,E,CAapCjgD,2BAC6B0W,KAAAA;wCADU;SACS,A,C;A,E,CAGhDhY,YAAe,MAAGgY,MAAAA,SAAgB,A,C;A,G,CAClC3X,YAAiB,MAAG2X,MAAAA,SAAiB,A,C;A,G,CAIrCupC;EALkBvpC;;WAKqC,KALrCA,WAK0CA;wCAAnC;SAAkD,A,C;A,E,C,CAE3EupC,+BAC+BvpC,KAAAA;wCADM;SACqB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,CAW1DupC,WAA4B,MAAG93C,SAAQ,A,C;A,C,C,CAEvCpJ;EACMoY;GAAAA,SAC0BH,OAAAA;QAAM,GAAlC7O;wBAAsCgP,eACtC;SAEFhP,YACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,Q,C,C,C,C,M,C,C,C,C,E,C,C,C,C,C,C,C,A,E,mC,+C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CCxDF+3C;GvGyqF6B9oC,AAAAA,AuGxqFvB+oC,iBACF,MvGqqFsB/oC,AAAAA,AuGrqFf+oC;EAqBQA;GACE,SACW,CAAA,KAAzB3jC,iBApBUigC,KAAgB0D;GAClB,QACT,SAGJ,MAAA,KAAyBA,SAAzB,UACe1D,K9IuREt0C;G8ItRJ,QACT,SAEJ,AACA,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,C,A,E,iC,6C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CPgGAzJ,+BAEa;SACA;SACA;SACA;SACA;QACA,UAEb,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,c,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,C,C,M,C,C,C,C,C;A,E,C,CASEO,YAAkB,UAAMmhD,cAAQ34C,YAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,C,CAgBxC9H;EAHUwX,OAARiL;QAAQjL,MtEmcS2c,SsE9bjB;MA0HAqnB,UA1HM/4B,QAAM,mCALZA,QAAQjL,MtEmcS2c;uBsE1bbusB;kCAJEj+B;KAnDuC,OAAgB,UACzD,OAAgB,uBAA4C;;KAwD5Dk+B;QAhDsB,OAAgB,MAkDtCC;kBAbIppC,MtEmcS2c,SsEncjB1R;;;GArC0B,OAAgB,MAqHxCo+B;KAEArF,2CAlFF/4B,QAAQjL,MtEmcS2c,SsE3WjBqnB;0CAxFA/4B,QAAQjL,MtEmcS2c,SsEtWjBqnB;kCAhIyBsF,mBA8ITr+B;EA3GRjL,MtEmcS2c,SsEncjB1R;;GAnCyBq+B,mBAmJwBr+B;E5HzD1CpjB;G4H0DD0hD,iBAjHNt+B,QAAQjL,MtEmcS2c;WA5eK;EtDgGf90B,gBsDhGe;EtDgGfA,Q4HmEPm8C,oBAA0CwF,sBA3JlBC,aAuDDx+B,YtE/DD,OsEuKcA;E5HvE7BpjB,O4HwEPm8C;oBAA4CwF,aA/H5Cv+B;QAAQjL,MtEmcS2c,esEncjB1R,QAAQjL,MtEmcS2c,UsExajB,AACA,SACF,A,C,Q,C,M,C,C,C,C,C,I,C,C;A,E,C,CAEAusB;EACkBj+B;EAhCRjL;EAAAA,MtEmcS2c,SsEncjB1R;SAkCA;MAOIy+B,QAPS,wCACc,KAAA;aAnCnB1pC,MtEmcS2c,SsEncjB1R;;gBAsC6B,KAAA;EtE/EP,OsEgFA8O;E5HgBflyB,OA6CP0M;KAA6CA,csD7IvB;EtDgGf1M,OA6CP0M;KAA6CA,S4HpGrCyL,MtEmcS2c,SsEncjB1R;UA4CA,AACA+4B,AAAAA,wB5HkEyBzvC,QAHzBA;O4H5GA0W;QAAQjL,MtEmcS2c,UsEnZnB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEAwsB;EAlDUnpC;EAoDN0pC,OADF;YAAOz+B;GAAM,sCAANA;KA9FwB,OAAgB,aAC3C,OAAgB,SAAc,OAAgB,uBAChB;;;;EtEAZ;EtDgGfpjB,OA6CP0M;KAA6CA,M4HpG7C0W;QAAQjL,MtEmcS2c,UsE7YjB,E5HyDyBpoB;E4HtDvByvC;GADE2F,gBACF3F;KAEAA,uB5HiDFzvC;Q4H9CF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA60C;EAhEUppC;EAkEN0pC,OADF;YAAOz+B;GAAM,sCAANA;EAtGmB,OAAgB;;EtEJpB;EtDgGfpjB,OA6CP0M;KAA6CA,M4HpG7C0W;QAAQjL,MtEmcS2c,UsE/XjB,aApEQ3c,MtEmcS2c,SsEncjB1R;;;GArC0B,OAAgB,MAqHxCo+B;KAEArF,AAAAA,sCAVAA,AAAAA,wB5HuCuBzvC,QAHzBA;S4HjCF,A,C,Q,C,M,C,C,C,C,C,I,C,C;A,E,C,CAqBA80C;EACEK,O5HOA5sB;KAAM;E4HxGE9c,OAkGR;YAAOiL;GAAM,sCAANA;EAvImB,OAAgB;;EtEJpB;EtDgGfpjB,OA6CP0M;KAA6CA,M4HpG7C0W;QAAQjL,MtEmcS2c,UsE9VjB,AACAqnB,AAAAA,wB5HSyBzvC,QAHzBA;Q4HJF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,O,C;A,E,C,CA+BAzM,YAAkB,yBAAqByE,QAAQ,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,E,CAD/Cq9C,+BAA4B,A,C,C,C,A,E,+B,2C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,I,C;A,E,C,CGhS5BvxB,YAAoB,MAAG5X,cAAc,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C,C;A,G,C,C;A,G,C,K,C;A,E,C,CAkBrCslC,YAAwC,MAAGF,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAE7DG,YApBuBvlC,AAqBf4f,eACNwlB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAI,YAzBuBxlC,KA0Bf2lC,aACNP;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAM,YA9BuB1lC,KA+Bf2lC,aA/Be3lC;KAgCf2lC,aACNP;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAS,iBApCuB7lC;KAqCf2lC;EACFA;GAAY,QACd,sB1ImQkCt9C,8B0InQlC,OAvCmB2X,K1I4SNzP,U0InQb,AAEF60C;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAU,YAAwB,MAAGV,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE7CW,iBACE;MAAcvB,2B1IyPsBn8C,8B0IzPpC,OAjDqB2X,K1I4SNzP,U0IzPf,AACA60C;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAY,YAvDuBhmC,KAwDf4f,cAxDe5f;KAyDf4f,aACNwlB;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAa,YAA8B,MAAGb,YAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEnDc,YA/DuBlmC,KAgEf2mB,cAhEe3mB;KAiEf2mB,cACNye;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAe,YArEuBnmC,KAsEf2mB,aACNye;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEAC,YA1EuBrlC,KA2EfgyB,cA3EehyB;KA4EfgyB,cACNoT;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C,A,E,2B,wD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CK3EwBzqC,YAA+B,MAAGu4B,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAA8Ch5B,cAAwCg5B,KAAS32B,eAA2B22B,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAC1MkW;;ErH2FqB;;;gBC5CI;;;;;;SoH/CwB,A,C,I,C,I,C,C,C,C,C,G,C,mC,C,C,C,C;A,wB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,wB,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCAzBC,YAAkB,MAAGC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCpvC,cAA2BovC,KAAY/sC,eAA8B+sC,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACvJxiD,YAAY,MAAGyiD,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAA2BrvC,cAAqBqvC,KAAShtC,eAA2BgtC,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CAExHxhD,YAA2B,MAAGyhD,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAA6DtvC,cAAoCsvC,KAAWjtC,eAA6BitC,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAE1N,cACEC,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,e,C,C;A,E,C,CAEA,cACEA,WACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEA;GACM,AAACC,KAdsCJ,YAezCI,AAAAA,KAfyCJ,qBAoBzC;OAEF/sC;EACiBmtC,AAvB0BJ,QACNC,KAuBrCI;KArBqDH,KAsBrDG;KAtBqDH,KAsB3CE,KAAAA,KAzBiCJ,MAyBV,YACnC,A,C,Q,C,K,C,C,C,C,C,G,C,mB,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CAEAM;ElDfS3gB;;EpE8EY;;;gBC5CI;;;;;;;SqHnBqB,A,C,I,C,I,C,C,C,C,C,G,C,gC,C,C,C,C;A,qB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,M,C,CAbvB;;;GACXygB,KAhBiCJ,eAiBnCG,QAEJ,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,+C,C,C,G,C,C,A,E,sB,mD,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,C,wE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCpBkB3iD,YAAY,MAAGyiD,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAgCrvC,cAAqBqvC,KAAShtC,eAA2BgtC,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CAEtJliD,kB9CFiDuiC;W8CI7C,sCAEF;MAAO6E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,E,C,CAEA,cACEgb,gBACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,E,C,CAEA,oB9CbiD7f;G8CcvC,SAAW6E,cACjBlyB,mBACAA;qBAEJ,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,mB,C,C;A,G,C,CAEAlV;G9CpBiDuiC,W8CsB7C;GAEM,KAxB6B2f,WAyB/B9a,K9CzByC7E;EAAAA;U8C4B3C,oDAAwB8f,KA5BSH;KA8BjC9a,AAAAA,WAAgBgb,aAGpB,uCACF,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,G,C,CAEApiD;G9CpCiDuiC,W8CsC7C;GAEM,KAxC6B2f,WAyC/B9a,K9CzCyC7E;EAAAA;U8C4C3C,oDAA4B8f,KA5CKH;KA8CjC9a,AAAAA,WAAgBgb,aAGpB,uCACF,A,C,I,C,I,C,C,C,C,C,G,C,K,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAEAI;;EvHwCqB;;;gBC5CI;;;;;;;;SsHImB,A,C,I,C,I,C,C,C,C,C,G,C,8B,C,C,C,C;A,mB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCnDpBR,YAAkB,MAAGC,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCpvC,cAA2BovC,KAAY/sC,eAA8B+sC,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACvJniD,YAAsB,MAAG2iD,MAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAA6C5vC,cAA+B4vC,KAAkBvtC,eAAoCutC,QAAyB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,c,C,G,C,C;A,E,C,CAI3N;;EAL6CR;WAQzC,MAEFI;QACF,A,C,Q,C,K,C,C,C,C,C,G,C,a,C,C;A,E,C,CAEA,YACEntC,oBACF,A,C,Q,C,K,C,C,C,C,C,G,C,oB,C,C;A,E,C,CAEAwtC,cAHExtC,oBAKF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,qB,C,C;A,E,C,CAMYlV;EAzBiCiiD;YA0BnB,AAzBuBQ,UA0B7C;EAEQJ,KAAAA,QAAYM;WAEpB;GAEM,UACN,2CAGF;8CACF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,W,C,G,C,C;A,E,C,CAEA,cACEN,AAAAA,KAzC2CJ,YA0C7C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,E,C,CAEA,cACEI,AAAAA,KAAAA,KA7C2CJ,yBAiD7C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,iB,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,G,C,sB,C,E,C,CA9CAW;;ExHwFqB;;;gBC5CI;;;;;;;SuH5CoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,M,C,CA0CL,YA/BtC1tC,qBAiCEoyB;gBACF,A,C,Q,C,I,C,C,C,C,C,G,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,4C,C,C,G,C,C,A,E,W,mC,A,A,C,C,C,C;A,G,C,E,C;A,E,C3BRFrmC;WAGI;;EA6lC2B,AAARmrB,mBAA+B,AAAVA;GA3lCtC,GACF3Z,AvG8LsB;EuG3LH/S;;OA0lCI6M,YACqBA;;;;;;;;;;;W5F7lCvB;;;;;;gB4F2YU;;;;;EAsHlB;EzBniBRq1B;;;;;;;;;;;;;;WnEkCgB;;;;mBAAA;;sD4F2BvByN,OACA;SACF,A,C;A,E,C,CA2jCFvvC;GACY;EAAqB,AAARssB,mBAA+B,AAAVA,6BAA5C;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAQA;4CAEI;4CAGAy2B;iDAEAC,UAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,cACEpjD,sBASF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,2BACE;MMzmC+Bk/B,SNymCb,EMzmCaA,gBAoBUA;;;MNojCV,AAARxS,mBAA+B,AAAVA,oBAoCxC3rB,QAAU0Z;iDAEV2oC;UAEAD,UAEJ,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C;A,E,C,C;A,G,C,Y,C;A,G,C,CArrCeE,WAA6B,MAAG5iC,SAAM,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,C;A,G,C,CAItC6iC,kBAAa7iC,OAAH;MAAGA,UAAS,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CAGtBxN,kBAAuBwN,OAAH;MAAGA,UAAc,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CAGrCngB,YAAc,MAAGkG,SAAG,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CAIpBlG,WAAuB,MAAGijD,SAAY,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,C;A,G,C,CAItCjjD;EAAmBoC;EAAqB8D,OAAxB;WARCA,iBAQ2B,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,C;A,G,C,CAG5ClG,WAAoB,eAAQulB,gBAAM,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,C;A,G,CAI/CzlB,YAAgB,MAAGojD,SAAO,A,C;A,G,CAK1BpjD,WAAkB,SAAQ,A,C;A,G,CAG1BA,WAAmB,SAAQ,A,C;A,G,C,CAEFE,YAAgB,MAAGmjD,YAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BtwC,cAAyBswC,SAAUjuC,kBAA4BiuC,eAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzInjD,WAAkB,MAAGojD,YAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCvwC,YAA2BuwC,SAAYluC,kBAA8BkuC,eAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,E,C,CA8ChL9tC,eAzDmB4tC,QA2Df,MnFyEK,gBmFtEP;MAAOG,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMA/tC;GACS,KArFqBpP,YAwF1B,MnF2DK;GmFpIUg9C,SA2EHI,WACZ,MnFwDK;EmFtDHC;cACmBpwC,AAAAA,AAAAA,AAAAA,kBAAYoS,qDAAjCg+B;UAeF,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAGA;;EAkhC2Bh3C,KA7gCF7M;EACCA;;GA4gCC6M,cACqBA;EA1gC1CrG;GAAI,SAAe,CAAA,OAAGxG,cAI1BwG,QAAMxG,WAENujD;SACAra;eACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CApCgD;EAChBlpC;;GAoiCL6M,cACqBA;;GApiC5B,CAAA,OAAG02C,MAIb,MAAO,MA9G4B9iC,OAgHrCw9B;OACA;SACJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAgB,WAEZ4F,eACJ,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,K,C,C;A,E,C,C;A,G,C,a,C;A,G,C,CAyCSP,YAAU,YAAO,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CACjBrwC,YAAoB,OAAO,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,C,CAE3BnS,iBAAkCgjD,OAAH;MAAGA,UAAoB,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,C;A,G,C,CAEtDxjD,YAAgB,WAzJCkG,SAyJO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,C;A,G,C,CAEZlG,YAAmB,MAAGyjD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAA8C5wC,cAA4B4wC,QrGjG5H3wC,eqGiGwK2wC,WAAoB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC1KzjD,WAAwB,MAAG0jD,SAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAAmD7wC,YAAiC6wC,QrGlGhJ5wC,eqGkGsM4wC,WAAyB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,c,C,G,C,C;A,G,C,CAC7MpiD,WAAkB,MAAGqiD,SAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAuC9wC,YAA2B8wC,QrGnGlH7wC,eqGmG4J6wC,WAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,E,C,CAkBtL3jD;EACY4jD;WAER;ElH/CwC5hD;;;qBAAAA;EAErBA,KAAAA;6BAAAA,OkH+CrB;MAAOoqB,WlH/CY,KkHgDrB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEApsB;EACY6jD;WAER;ElHtDkC7hD;;qBAAAA;EACfA,KAAAA;6BAAAA,OkHuDrB;MAAO+C,UlHvDY,KkHwDrB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKAgO,iBACQ,KAAA,YACR,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAuC;UAEI,MnFrDK;EmFuDWkuC,AAAAA;GACN,QACV,MnFzDK,amF6DP;MAAOH,AAAAA,iCAOT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA/tC;GAEMvQ,uBACiB++C;EACDC,UAClB;MAAOC,AAAAA,mCAeCC,AAAAA;GACF,QACN,MAAO5U,QAGT;MAAO6U,AAAAA,iCAOT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMA5uC,YACE,MAAO6uC,AAAAA,AAAAA,AAAAA,6FA2CT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAKA;KAEI,MAEFjB;;;EACUxjD,gBA1JuH+jD;QrGjG5H3wC,eqGiGwK2wC;EA2J9J/jD,qBA1JsIgkD;QrGlGhJ5wC,eqGkGsM4wC;EA2JlMhkD,eA1J8GikD;QrGnGlH7wC,eqGmG4J6wC,UA2JjKS;QAAgB1kD,mBAClB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;EACwB8jD;EACA,6BACtB;MAAA,QAAA,UAAA;EACkBa;EACFC;GACF,QACVC;OAEU,YACVA;UACA9xC,AvGlGoB;gCuGpOIvM,YAwU5B,AAEAq+C,kBAIAf;UACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CAhLAR,WAtI2GG,QAAUjuC,kBAA4BiuC,aAC9BC;QAAYluC,kBAA8BkuC,aAwI3Ja,AAAAA;;MnHk+CKhhD,8BAA8B,+BmHj+CnC06C;QzB9JO/b,SyB+JT,A,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CA4CuB;2CAEf,MAGF;MAAO4hB,AAAAA,uBACT,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQmC;WAK7B;;WAGA,MAAOphD;KAEP,MAAOA,SAEX,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAQqB;;EACX;GACNitC,QACF4U,AAAAA,2BAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAH2B,WAAG,cAAG5U,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAWT;MAECyM;EzB7PpBla;GyB+PC,CAAC4iB,WnHg4CJvhD,6IAA8B;E0F/nD5B2+B;E1DuJA,KmF0GK,yBADN;YAUc,KAAZliC,kCnFnHD,KmFoHuB,yBAAxB;iBACqB,KAAZA,sCnFrHR,KmFsHuB,yBAAxB;SAGF,oBApBF;;kBAsBEyD;OACAA;;EnH42CCF,0HAA8B;E0F/nD5B2+B,OyBoRH;MnF7HG,MmF8HG,2BAQV,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAc,kBAEZ6iB;GzEvFE,AA/EoBlgC,aA+ECM,OACzBC;OyEuFE;MnFzIK,mBmF0IP,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAS,wBAAI;gDAAQ4/B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAAyB,kBAE5CC;GzE3FE,AA/EoBpgC,aA+ECM,OACzBC;OyE2FE;MnF7IK,mBmF8IP,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAAS,wBAAI;gDAAQ8/B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgCG,cACtBxiD,QACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,c,C;A,G,CAUF3C,WAAY,MAAGolD,SAAI,A,C;A,E,C,CAMnB;EACE,OxH5PAtkD;WwH6PA;MAAoB,aAAF,WAChBskD;EAAQ;6BAAA,OAARA;QAAK,IACP,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAIA,+BACE;MAAoB,UAAA,kCAAF,WACGC;;EAAY,OAAEC,KAAjC;;EACAF;6BAD+B,OAC/BA;QAAK,IACP,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA;;EAGuB;;GAFrB;YAAoBC;6BAAAA;KAAF;EACRA;cACW,SAAnB;KAAoC,KAAjB,QAAuB,WAC5C,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA,oBACE;MAAoBA,UAAAA,aAAF,QAChBA,MACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,uB,C;A,G,CAMAxjD,WAA4B,MAAG0jD,SAAQ,A,C;A,E,C,CAQvC,6BACEA;;;EACe5b;EACXp8B;GAAAA,cAEFA,UAAao8B,eACb6b;QAAkB7b,KAAAA,kBAClB;MAAoB8b,UAGlBC,cAF2CF,QAD3B,sCAC2BA;;;;iBAC3CG;MACAD;UACF,6BAH6CF;;;8BAK7CI;SACAA;OACA;SAE6CJ;6BAAAA;;;8BAG/CG;OAAyBC,AAAAA,WACzBA,AAAAA;;EACAF,OAAAA;;GAEqB,AAAjBA,SAAmBD,QACrBC,aAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,C,0H,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CAKanC,YAAU,MAjbsB7iC,SAibd,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,C;A,G,C,CAClBxN,YAAoB,YAAO,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,C;A,G,CAExC3S,YAAgB,MAAGkG,SAAG,A,C;A,G,CACtBlG,WAAoB,eAAOkG,SAAI,A,C;A,G,C,CAENpG,WAAuB,MAAGwlD,SAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAA8CzyC,YAAgCyyC,QrGnX1IxyC,eqGmXkMwyC,WAA0B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,e,C,G,C,C;A,G,C,CAC1MxlD,WAAsB,MAAGylD,SAAe,A,C,I,C,I,C,C,C,C,C,G,C,c,C,G,C,G,C,C;A,G,C,CAA6C1yC,YAA+B0yC,QrGpXtIzyC,eqGoX4LyyC,WAAyB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,c,C,G,C,C;A,G,C,CACnMzlD,WAAiB,MAAG0lD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAwC3yC,YAA0B2yC,QrGrXlH1yC,eqGqX8J0yC,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAChK1lD,WAAc,MAAG2lD,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAqC5yC,YAAuB4yC,QrGtXtG3yC,eqGsX4I2yC,WAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,E,C,CAUvJzlD,YAA+B,WA1bdkG,oBA0biC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,c,C,G,C,C;A,E,C,CAElDlG,YAAmC,gBA5blBkG,qBA4b4C,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,kB,C,G,C,C;A,E,C,CAK1EyP,WAEE,MAAOsuC,AAAAA,2BACT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;;SAIE;MAAA,KADkB9e,gBAClB,OAGEugB,OAFYC,KADd,eAIA,AACAC;SACAC;;EACoB1gB;GACF,QAChB2gB,QAAkBC,aAEtB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBACE9B,OAAAA,AAAAA;0BAMF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;;EACoB9e;EACAA,gBAClB;MAAA,QAAA,UAAA,MAEE3gC,AADYmhD;yBAEd,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEArwC,YACE,MAAOxD,AAAAA,wBAAqBk0C,YAC9B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA,YAIEC,KAFmBC,mCAKrB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CASAnzC;WAEI;EAEUrT;EACFukD;EAAAA;GACF,QACN;EAGI;GACF5U,QACF4U,UAEF;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA3uC,kBAGY2uC,AAAAA;GACF,QACN,MAAO5U,QAGT;MAAOl8B,AAAAA,AAhiBoCgN,gBAUfja,0CA6hB9B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,G,C,CAEyB8O,WAAuB,MAAGmxC,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAsCtzC,YAAgCszC,QrGre5HrzC,eqGqewKqzC,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC1KC,WAA2B,MAAGC,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAA0CxzC,YAAoCwzC,QrGtezIvzC,eqGseuLuzC,WAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CAE1LrmD,YAAgB,MAAGmjD,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BtwC,cAAyBswC,QrGxepGrwC,eqGwe0IqwC,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzInjD,WAAkB,MAAGojD,SAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAiCvwC,YAA2BuwC,QrGze5GtwC,eqGyesJswC,WAAmB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,Q,C,G,C,C;A,G,C,CACvJpjD,WAAoB,MAAGsmD,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAmCzzC,YAA6ByzC,QrG1epHxzC,eqG0ekKwzC,WAAqB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,U,C,G,C,C;A,G,C,CACrKn/C,WAAc,MAAGo/C,SAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAA6B1zC,YAAuB0zC,QrG3e/FzzC,eqG2euIyzC,WAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,G,C,CAKvI9mD,WAAoB,MAAG+mD,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAAuC3zC,YAA6B2zC,QrGhf3H1zC,eqGgf+K0zC,WAAwB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CACrL/mD,WAAoB,MAAGgnD,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAAuC5zC,YAA6B4zC,QrGjf3H3zC,eqGif+K2zC,WAAwB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CACrLhnD,WAAwB,MAAGinD,SAAkB,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,G,C,G,C,C;A,G,C,CAA2C7zC,YAAiC6zC,QrGlf3I5zC,eqGkfuM4zC,WAA4B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,iB,C,G,C,C;A,G,C,CACjNjnD,WAAwB,MAAGknD,SAAkB,A,C,I,C,I,C,C,C,C,C,G,C,iB,C,G,C,G,C,C;A,G,C,CAA2C9zC,YAAiC8zC,QrGnf3I7zC,eqGmfuM6zC,WAA4B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,iB,C,G,C,C;A,G,C,CAEjN3mD,YAAuB,MAAG4mD,SAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,G,C,I,C,C,M,C,C,C,C,C;A,G,C,CAAsC/zC,cAAgC+zC,QrGrfhI9zC,eqGqfoL8zC,WAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CAE1LC,YAAoB,MAAGzlB,SAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAmCvuB,cAA6BuuB,QrGvfjHtuB,eqGufyJsuB,WAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAElL;;EACa1hC,iBAhB8G4mD;QrG1epHxzC,eqG0ekKwzC;EAiBhK5mD,aAnBkGyjD;QrGxepGrwC,eqGwe0IqwC;EAoBtIzjD,aAnBwG0jD;QrGze5GtwC,eqGyesJswC;KAqBzJ,MAEFF;UACA4D;;GACIpnD,wBACAA,uBACAA,qBACF+S,AvG3VsB,oDuG4VtB;SAEQ/S,gBAnCuHymD;QrGre5HrzC,eqGqewKqzC;GAoC5J,AAAbzmD,wBACMA,cA/B0F6mD;QrG3e/FzzC,eqG2euIyzC,cAiCxH,AAAhB7mD,2BACSA,iBAvCiI2mD;QrGtezIvzC,eqGseuLuzC,gBAA9CA,QrGtezIvzC,eqGseuLuzC;EnHomCvLpjD,QAA8B,+BmHvjCnCvD;KAAAA;EAGAqnD;SAAAA;cAAkBC,4BAClBD;gBAAoBC,0BACpBD;aACAA;aAE0D,KADL,KADH,KAAhCC,6BACAA,iCACAA,sCACAA,yBAClBD;aAAiBC;EAEHtnD,KAAAA,wBA/CkH8mD;QrGhf3H1zC,eqGgf+K0zC;EAgDtK9mD,KAAAA,wBA/CkH+mD;QrGjf3H3zC,eqGif+K2zC;EAgDlK/mD,KAAAA,4BA/C8HgnD;QrGlf3I5zC,eqGkfuM4zC;EAgD1LhnD,KAAAA,4BA/C8HinD;QrGnf3I7zC,eqGmfuM6zC;EAkD5LjnD,sBAlL+H4lD;QrGnX1IxyC,eqGmXkMwyC;EAmLxL5lD,qBAlL4H6lD;QrGpXtIzyC,eqGoX4LyyC;EAmLvL7lD;ErGviBLoT,eqGqX8J0yC,QAkLzI,QAlL6FA;;EAmLhH,AArL0CF,cAqLxB,AApLuBC,cAoLN,MAlLiEE;QrGtXtG3yC,eqGsX4I2yC;EAmLzI/lD,cAlD8G0hC;QrGvfjHtuB,eqGufyJsuB,WAmDhK,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA9rB,WACE,MAAOnC,AAAAA,AAjnBoCgN,gBAUfja,4CA4mB9B,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAWA+gD,cAEEC,SACAC;;WAEE;GAEmB,KAAjBA,WAEF,MAGF;MAAOC,YACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGAH;EAEcE;EAAUD;mCAAAA;QAAe;EAAzBC;;EAEDzB;EAECyB;EAAUD;mCAAAA;QAAe;EAAzBC;;;;EAIGA;EAAUD;mCAAAA;QAAe;EAAzBC;6BAAAA;GAEf;KAAkB,WACJC,UACZn3B;;EACAA;EAAyBuiB;6BAAAA,OAAzBviB;KAAsB,IACxB,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,I,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAjMwB;6CA4fkJo3B,KrG15BnKv0C,YqG05B2Ou0C,OAwBhPC;MACAC;MAhB0LC;KrGn6BrL10C,YqGm6BiQ00C,QAC5EC;KrGp6BrL30C,YqGo6BiQ20C,QAkBtQC;KAAAA,KACAC;KAAAA,KACAC;KAAAA,OArhBE,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAoBmB,yBASrBvF,AADgBwF;mBACIA,eAPpB,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAmC0C;;EAC5B;GACNxY,QACF4U,AAAAA,2BAEF;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAH2B,WAAG,cAAG5U,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAoDb,yBAClB2X;WAASc,cAAiBA,eAC5B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAwBmD,kBAEnD1e,SAAAA;KADwD,AAA1C,AhDlcc,iBgDoc5B;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kC,C;A,G,CAsDFtpC,WACE,OAAqB,KAAbmjD,kBACa,KAAbA,qBACa,KAAbA,qBACD,CAAC/8C,KAAAA,cACV,A,C;A,G,CACApG,WAAmB,MAAGioD,YAAQ,A,C;A,E,C,CAI9B/nD,YAAkB,M5F/hBGoO,M4F+hBAO,SAAe,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAOpC,yBACEu0C;QAAU;EAKVv0C,OAAAA;OACAA;;E5FlmBwCA;EAAAA,kB4F9DiEw0C;QAAUjuC,eAA4BiuC;E5F8DvGx0C,a4F7DyEy0C;QAAYluC,kBAA8BkuC,UAqpB3J0D;OAzrB2C3mC,SAwsB7C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA,cAAuB,MAAGxR,AAAAA,iBAAkB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAC5C,YAAa,MAAGA,AAAAA,eAAY,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAC5B7O,YAAsB,M5FhnB2B6O,AAAAA,A4FgnBxBA,kBAAqB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAC9C7O,YAAoB,M5F/mByB6O,AAAAA,A4F+mBtBA,kBAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAC1C,cAAyB,M5F3jBeA,AAAAA,A4F2jBZA,oBAAe,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAE3C,cAAiB,MAAGA,AAAAA,iBAAgB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,C,C,CACpClI,cAAe,M5FjnB2BkI,AAAAA,A4FinBxBA,mBAAO,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,C,C,CACzBlI,gBAAsBkI,AAAAA,gBAAH;SAAc,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CACjC7O,kB5F7nB8B6O,A4F6nBVA,UAAH;M5F7nBaA,a4F6nBE,A,C;A,G,CAChC7O,kB5F9nB8B6O,A4F8nBPA,UAAH;M5F1nBgB,AAJNA,a4F8nBQ,A,C;A,G,CACtCnO,kB5FnoBqCmO,A4FmoBhBA,UAAH;M5FnoBmBA,U4FmoBP,A,C;A,G,CAC9BnO,kB5FloBuCmO,A4FkoBhBA,UAAH;M5FloBmBA,U4FkoBL,A,C;A,E,CAClClP,kB5FjoB8BkP,A4FioBZA,UAAH;M5FjoBeA,S4FioBD,A,C;A,E,C,CAG7B7O,kBAAyB6O,OAAH;MAAGA,SAAqB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAC9C,oBAA0CA,OAAH;MAAGA,WAAyB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CACnEuG,kBAAqE,MrGzpB9DpC,MqG0pBHnE,eAAoD,A,C,Q,C,M,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CACxD,YAAgB,OAAkB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAClC,YrG/rBEw9B,AqG+rBmBx9B,eAAH;OAAoB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,G,CACtC6Y,kBAA0C7Y,OAAH;MAAGA,UAAY,A,C;A,G,CACtD7O;ErGhrByBqsC,AqGgrBAx9B;GrGhrBS,W4B+FHwU;EA1BP,+ByE2mBF;SAAoB,A,C;A,K,C,I,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,I,C,I,C,C,C;A,K,C,I,C;A,K,C,Q,C,C,C,M,C,I,C,I,C,C,C;A,K,C,I,C;A,M,C,C,G,C,I,C,C,C;A,E,C,C;A,G,C,kD,C;A,G,C,CAOjBnjB,YAAgB,MAAG8iC,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BjwB,cAAyBiwB,QrGrqBpGhwB,eqGqqB0IgwB,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzI9iC,YAAmB,MAAGgoD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAkCn1C,cAA4Bm1C,QrGtqBhHl1C,eqGsqB4Jk1C,WAAoB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC9JhzC,YAAyB,MAAGizC,SAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAAwCp1C,cAAkCo1C,QrGvqBpIn1C,eqGuqBoLm1C,WAAsB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,W,C,G,C,C;A,G,C,CACxLjzC,WAA0B,MAAGkzC,SAAa,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,G,C,C;A,G,C,CAAyCr1C,YAAmCq1C,QrGxqBxIp1C,eqGwqB0Lo1C,WAAuB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Y,C,G,C,C;A,E,C,CAExN;;EACSxoD,aANkGojC;QrGrqBpGhwB,eqGqqB0IgwB;EAOrIpjC,gBAN2GsoD;QrGtqBhHl1C,eqGsqB4Jk1C;EA1uBtH7nC;EAivB/B,OAAkCzgB,mBAN2FuoD;QrGvqBpIn1C,eqGuqBoLm1C;EAO5K,OAAkCvoD,oBAN8FwoD;QrGxqBxIp1C,eqGwqB0Lo1C;mBAHrJplB;EAtsByE5tB,kBAA4BiuC,UAAtCA;SACQC;QAAYluC,kBAA8BkuC,WAitB7J,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,4C,C;A,G,C,CAUyBpjD,YAAgB,MAAG8iC,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BjwB,cAAyBiwB,QrG3rBpGhwB,eqG2rB0IgwB,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzI9iC,YAAmB,MAAGgoD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAkCn1C,cAA4Bm1C,QrG5rBhHl1C,eqG4rB4Jk1C,WAAoB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,S,C,G,C,C;A,E,C,CAEvL,uBACE9E;;;EACOxjD,aALkGojC;QrG3rBpGhwB,eqG2rB0IgwB;EAMrIpjC,gBAL2GsoD;QrG5rBhHl1C,eqG4rB4Jk1C;sBADvHllB;EA5tByE5tB,kBAA4BiuC,UAAtCA;SACQC;QAAYluC,kBAA8BkuC,WAouB7J,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,+C,C;A,G,C,CASyBpjD,YAAgB,MAAG8iC,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BjwB,cAAyBiwB,QrG7sBpGhwB,eqG6sB0IgwB,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CACzI9iC,YAAmB,MAAGgoD,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAkCn1C,cAA4Bm1C,QrG9sBhHl1C,eqG8sB4Jk1C,WAAoB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CAC9J/nD,YAAqB,MAAG+S,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAoCH,cAA8BG,QrG/sBvHF,eqG+sBqKE,WAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAEjM;;EACStT,aALkGojC;QrG7sBpGhwB,eqG6sB0IgwB;EAMrIpjC,gBAL2GsoD;QrG9sBhHl1C,eqG8sB4Jk1C;EAMtJtoD,iBALiHsT;QrG/sBvHF,eqG+sBqKE;0BAFhI8vB;EA9uByE5tB,kBAA4BiuC,UAAtCA;SACQC;QAAYluC,kBAA8BkuC,WAuvB7J,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,mB,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,sE,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CAYyBrwC,YAA0B,MAAG+2B,SAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAyCj3B,cAAmCi3B,QrGnuBrIh3B,eqGmuBiLg3B,WAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CACnL9pC,YAAgB,MAAG8iC,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAA+BjwB,cAAyBiwB,QrGpuBpGhwB,eqGouB0IgwB,WAAiB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,M,C,G,C,C;A,G,CAElKhjC,WAAkB,SAAO,A,C;A,G,CACzBA,WAAmB,SAAO,A,C;A,E,C,CAQ1BL,YAA2B,MAAG0oD,AAAAA,gBAAmB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAOjD;;EACSzoD,aAnBkGojC;QrGpuBpGhwB,eqGouB0IgwB;EAoBxIpjC,aAAP0oD;;;EACYA,OAAqC,KAAtBA,eAA3BC;SA1xByGlF;QAAUjuC,kBAA4BiuC;EA4xBtIiF,OA3xBwGhF;QAAYluC,kBAA8BkuC,UA4xB3JkF;QAAe5oD,gBACf6oD;QAAoB7oD,wBACtB,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;WAEI,MAEFyoD;QnHs0BKllD,QAA8B,+BmHr0BnCulD;QnHq0BKvlD,QAA8B,+BmHp0BnC;MAAA,QAAA,UAAA;;EAEmB0/C;GACjB;YAAwBA;6BAAAA;KAAF;EAEFA;EACFA,MAAQ,IACxBwF,AAAAA;gBACAK,AAAAA;;KACF,CACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;GACM,CAACtF,QAEHuF;;EAOAC;;GAJF;YAAoBC;6BAAAA;KAAF,UAIhBD;MAHWC,SACDA,MAAa;KAGzB,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,yBAEEzF;;WAEE;EAEgBt6C;GACdggD,aACF,MAGF1F;;EACAZ;SAAAA;OACA7vC,AvGpoBwB;sBuGooBGm2C,kCAAuCR,SAClE;QAAkB,EAAEQ,gBACS,GAA3BtG;iBAAgCsG,OAClC,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,kC,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,Q,C,C,C,M,C,C,C,G,C,C,C,I,C,I,C,C;A,E,C,CAyBa5oD;EACP6oD;;GAAQ,SACV,QAEF;WAAYA,WACd,A,C,Q,C,K,C,C,C,C,C,G,C,kB,C,G,C,C;A,E,C,CAEa7oD;WAET;EAESwE,KAAAA,QAAkBqkD;WAE3B;GAGsB,KAApBC,QAAuBA,SACzB,QAGF;MADYhhB,MAAcghB,QAAqBtkD,kBAC7BskD,aACpB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,oB,C,G,C,C;A,E,C,CAEa9oD;WAET;EAESwE,KAAAA,QAAkBqkD;WAE3B,QAGF;MADY/gB,MAAcghB,QAAqBtkD,kBAC7BskD,aACpB,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,oB,C,G,C,C;A,K,C,I,C;A,M,C,C,E,C,CAxCA5mD,cAEE,MAAU6lC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,G,C,C;A,G,C,M,C;A,E,C,CA2CA/nC,YAAkB,MAAK4sC,SAAO,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,M,C,C,G,C,mB,C,E,C,CAE9B1qC;GACQ,gBACJ;QACW,cACX;QACW,mBACX;QACW,gBACX;QACW,aACX,WAEFuQ,AvGttBwB;;KuGutBlB,KAAA,QACR,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,kB,C;A,K,C,I,C,C;A,E,C,C;A,G,C,C,+H,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,Q,C,C,C,M,C,C,C,E,C,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,G,C,CAuByBs2C,YAAkB,MAAGjmB,SAAO,A,C,I,C,I,C,C,C,C,C,G,C,M,C,G,C,G,C,C;A,G,C,CAAiCjwB,cAA2BiwB,QrGz5B1GhwB,eqGy5BgJgwB,WAAiB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,M,C,G,C,C;A,G,C,CAC/IrjC,WAA8B,MAAG4nD,SAAwB,A,C,I,C,I,C,C,C,C,C,G,C,uB,C,G,C,G,C,C;A,G,C,CAAiDx0C,YAAuCw0C,QrG15BnKv0C,eqG05B2Ou0C,WAAkC,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,uB,C,G,C,C;A,G,C,CAS3PrnD,WAAmC,MAAGwnD,SAA0B,A,C,I,C,I,C,C,C,C,C,G,C,yB,C,G,C,G,C,C;A,G,C,CAAuD30C,YAA4C20C,QrGn6BrL10C,eqGm6BiQ00C,WAAoC,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,yB,C,G,C,C;A,G,C,CACnRxnD,WAAmC,MAAGynD,SAA0B,A,C,I,C,I,C,C,C,C,C,G,C,yB,C,G,C,G,C,C;A,G,C,CAAuD50C,YAA4C40C,QrGp6BrL30C,eqGo6BiQ20C,WAAoC,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,yB,C,G,C,C;A,I,C,CACnRzyC,WAA0B,MAAGg0C,SAAa,A,C,I,C,I,C,C,C,C,C,G,C,Y,C,G,C,G,C,C;A,I,C,CAAyCn2C,YAAmCm2C,QrGr6BxIl2C,eqGq6B0Lk2C,WAAuB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Y,C,G,C,C;A,G,C,CAC/Lh0C,YAAwB,MAAG4tB,SAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAuC/vB,cAAiC+vB,QrGt6BhI9vB,eqGs6B8K8vB,WAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,G,CAI1M9iC,WAAkB,SAAO,A,C;A,G,CACzBA,WAAmB,SAAO,A,C;A,E,C,CAkB1BwV,eAEW,KAtCmCwtB,cAwC1C,wCAEF;MnF12BO,iBmF22BT,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;;;GAIE;YAAoBl5B;6BAAAA;KAAF;E5Gp7BX7J,K4Gq7BiB6J;E5Gr7BjB7J,K4Gs7BiB6J,MAAO;yCAG7Bq/C;eAA4BC;KAC9B,AAEAD,mBACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAQA,uBAjE0K5B;QrG15BnKv0C,eqG05B2Ou0C;SAyEhPE;Q5G78BOxnD,K4G68BoBopD,mCAC3B7B;Q5G98BOvnD,K4G88BoBopD,mCAC3BC;QAAc1B,QAASyB,mBACvBC;QAAczB,QAASwB;EACXA;GACF,QACRE;EAGKvhB,KAAcyf,QAlFmCF,kBAmFjDE,YA1EmLC;QrGn6BrL10C,eqGm6BiQ00C;EA4E/P1f,KAAcwf,QArFmCD,kBAsFjDC,YA5EmLG;QrGp6BrL30C,eqGo6BiQ20C,WA6ExQ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;SACE5+C;QAAOujB,kBACPk9B;QAASl9B;EACF28B,KAAoB38B,cA7FoF0W;QrGz5B1GhwB,eqGy5BgJgwB,UA8FrJymB;Q5Gj+BOxpD,K4Gi+BkBqsB,uBACzBo9B;Q5Gl+BOzpD,K4Gk+BgBqsB;EArjCWjM;EAAAA;EAsjCvB/d,KAAmBgqB,kBAnFuGwW;QrGt6BhI9vB,eqGs6B8K8vB;EAoFtKxgC,KAAmBgqB,qBArF6G48B;QrGr6BxIl2C,eqGq6B0Lk2C;EAsF7K58B;GACF,QACdq9B;EAGSC;SAAXxG;SAA+B,KAApBwG,YAAmC,CAAA,KAvGF5mB;EAwGN,CAAA,KAApB4mB,YAAmC,KAxGT5mB,aA2GuG6mB;QrGpgC9I72C,eqGogCwM62C,WAF/M,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,G,C,CAEyB7pD,WAAwB,MAAG6pD,SAAiB,A,C,I,C,I,C,C,C,C,C,G,C,gB,C,G,C,G,C,C;A,G,C,CAA+C92C,YAAiC82C,QrGpgC9I72C,eqGogCwM62C,WAA2B,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,gB,C,G,C,C;A,E,C,CAE1O;EAEED;SAAAA;;;GAEA;YAAoBE;6BAAAA;KAAF;EAEFA,MAAc;EAChBA,MAAc;EACP,CAAA,KAAfA,a5Gx/BC7pD,K4G0/BiB6pD,qBAGtBF;;KACF,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;;EAQI9B;;GALF;YAAoBiC;6BAAAA;KAAF;E5GpgCX9pD,K4GqgCmB8pD,iBAIxBjC;mB5GzgCK7nD,K4GsgCqB8pD,MAAe,gB5GtgCpC9pD,K4GugCqB8pD,MAAe;KAG3C,CACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA/pD,cACkB,OAAGypD,QAAnB;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAGA9pD,WAAsB,MAAGqqD,SAAcpC,SAAQ,A,C,Q,C,M,C,C,C,C,C,I,C,C;A,E,C,CAE/CjoD,YAA4B,MAAGsqD,SAAWrC,WAAc,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAMxDjoD,qBAEE;MAAA,YAAA,UACSuqD,AADT;6BACSA;KACT,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAvqD,qBACE;MAAA,QAAA,UAAA;GACkB,KAAZuqD,WACF,MAAOA,SAEX,AACA,SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,C,CA1GA9nD,cAEE,MAAU6lC,SADU,IAAK,iBAE3B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAPa,cAAO,MAAW,MAAR7mC,QAAUJ,SAAEmpD,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,Y,C;A,M,C,CAyIvB;;;MACkBzF,QAC1B9kD,aAASya;iDAET2oC;UAEAD,eAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,8B,2D,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C4BrqCwB6B,YAAuB,MAAGtjB,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAsCvuB,cAAgCuuB,KAAWlsB,eAA6BksB,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAE1L8oB;;EzHyFqB;;;gBC5CI;;;;;;SwH7C0B,A,C,I,C,I,C,C,C,C,C,G,C,qC,C,C,C,C;A,0B,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,kC,+D,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCF3BtF,YAA+B,MAAGqD,MAAY,A,C,I,C,I,C,C,C,C,C,G,C,W,C,G,C,G,C,C;A,G,C,CAA8Cp1C,cAAwCo1C,KAAe/yC,eAAiC+yC,QAAsB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,W,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CAElOkC;;E1HyFqB;;;gBC5CI;;;;;;SyH7C8B,A,C,I,C,I,C,C,C,C,C,G,C,yC,C,C,C,C;A,8B,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,gB,wC,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,8D,C;A,E,C,C9BkBvD70C,cACE7C,AtGuNwB,wCsGvNayiB,QACrC;MAAOk1B,AAAAA,MAA2B,KAALl1B,qCAc/B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA5BAm1B,WAIIn1B,sBAAiBlhB,KAAAA,uBAMrB,A,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAIqD,iBAEjDvB,AtGoNsB;;SsGnNRsW;OACd;MAAO+yB,SlHknDJ74C,mDkH/mDa8lB,KAAAA,qLlH+mDiB,iCkHzmDnC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gE,C;A,E,C,CAaF;;EACWnmB,KAAAA;EACEA,KAAAA;EACAA,KAAAA;GACF,CAAA,0BACP;EAEc0nD;EAAAA,QAEhBA;SACAjyB;UACF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEA/iB;KACmBi1C;ElH8kDZtnD,QAA8B,+BkH5kDnCwB;aACAA;kCACAA;yBACA8lD;QAAc,AAAdA;gBnElEwB,mBmEoExBD,AAAAA;gBACAt2C;KjGy52BuBooB,KAA4B,eiGz52BzB0f,eAC1B;MAAOzjB,MACT,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,CA7BAmyB,iBjGyq4BsCC,eAw9GpC32C;gBA/EI,KAAc,KA8EcC,KiG/n/BR22C,YjGij/BmB,uBiGhj/B3Cj4C,AtG+LwB;sCsG9L1B,A,C,C,A,E,+B,qD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,C+B5CwBM,YAAyB,MAAG43C,MAAS,A,C,I,C,I,C,C,C,C,C,G,C,Q,C,G,C,G,C,C;A,G,C,CAAwC93C,cAAkC83C,KAAYz1C,eAA8By1C,QAAmB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,Q,C,G,C,C;A,E,C,CAIpMze;OACanhC,AALuC4/C,sChI+pShD1xB,yBgItpSE5K;OAT8Cs8B,KAU9C;;uBhIqpSF1xB,4BgIlpSE5K;OAb8Cs8B,KAc9C;;chIipSF1xB,uBgI9oSE5K;OAjB8Cs8B,KAkB9C;;ahI6oSF1xB,sBgI1oSE5K;OArB8Cs8B,KAsB9C;;chIyoSF1xB,uBgItoSE5K;OAzB8Cs8B,KA0B9C;;chIqoSF1xB,uBgIloSE5K;OA7B8Cs8B,KA8B9C;;iBhIioSF1xB,0BgI9nSE5K;OAjC8Cs8B,KAkC9C;;gBhI6nSF1xB,qBgI1nSE5K;OArC8Cs8B,KAsC9C;;+HhIynSF1xB,0BgI9mSE5K;OAjD8Cs8B,KAkD9C;;gBhI6mSF1xB,yBgI1mSE5K;OArD8Cs8B,KAsD9C;;gBhIymSF1xB,yBgItmSE5K;OAzD8Cs8B,KA0D9C;;gBhIqmSF1xB,4BgIlmSE5K;OA7D8Cs8B,KA8D9C;;qBhIimSF1xB,+BgI7lSE5K;OAlE8Cs8B,KAmE9C;;yBhI4lSF1xB,mCgIxlSE5K;OAvE8Cs8B,KAwE9C;;ehIulSF1xB,wBgIplSE5K;OA3E8Cs8B,KA4E9C;;mBhImlSF1xB,wBgIhlSE5K;OA/E8Cs8B,KAgF9C;;WhI+kSF1xB,oBgI5kSE5K;OAnF8Cs8B,KAoF9C;;QAEA,QAEN,A,C,Q,C,K,C,C,C,C,C,G,C,4B,C,C;A,E,C,CAEAC,uBhI+kQE/tB;;EgIzqQkD8tB;YA8FhDl4C,ArI4IsB,mCqI3ItB;SAES1H;EACG8/C;YAEZp4C,ArIsIsB,6DqIrItB;OhIi/PFoqB,gBgI9+PApqB,ArIkIwB;8CqIjI1B,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,e,C,C;A,G,C,Q,C,C,C,M,C,C,C,G,C,C,C;A,M,C,C,E,C,CAvGAq4C;;E3HuFqB;;;gBC5CI;;;;;;S0H3C2B,A,C,I,C,I,C,C,C,C,C,G,C,sC,C,C,C,C;A,2B,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,4D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,ClDL5B/3C,YAAsB,MAAGwvB,MAAM,A,C,I,C,I,C,C,C,C,C,G,C,K,C,G,C,G,C,C;A,G,C,CAAqC1vB,cAA+B0vB,KAASrtB,eAA2BqtB,QAAgB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,K,C,G,C,C;A,G,C,CACvJziC,YAAkB,MAAGirD,MAAW,A,C,I,C,I,C,C,C,C,C,G,C,U,C,G,C,G,C,C;A,G,C,CAAyCl4C,cAA2Bk4C,KAAc71C,eAAgC61C,QAAqB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,U,C,G,C,C;A,E,C,CAG/L,cACE71C,kBAA+B81C,YAC/B91C;kBAAgCrM,YAChCqM;kBAAqC+1C,aACvC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,Y,C,C;A,G,C,CAEAjrD,kBAViDuiC;WAY7C,gBAEF;MAAO6E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,K,C,C;A,G,C,CAEApnC,kBAjBiDuiC;WAmB7C,gBAEF;MAAO6E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAEApnC,kBAxBiDuiC;WA0B7C,gBAEF;MAAO6E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,W,C,C;A,G,C,CAEApnC,kBA/BiDuiC;WAiC7C,gBAEF;MAAO6E,SACT,A,C,I,C,I,C,C,C,C,C,G,C,M,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAlCA8jB;;EzE0FqB;;;gBC5CI;;;;;;;SwE9CoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,4B,yD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,oE,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CmDFrBprD,YAAiB,MAAGqrD,MAAU,A,C,I,C,I,C,C,C,C,C,G,C,S,C,G,C,G,C,C;A,G,C,CAAgCt4C,cAA0Bs4C,KAAaj2C,eAA+Bi2C,QAAoB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,S,C,G,C,C;A,G,C,CACxJnrD,YAAuB,MAAGorD,MAAc,A,C,I,C,I,C,C,C,C,C,G,C,a,C,G,C,G,C,C;A,G,C,CAAsCv4C,cAAgCu4C,KAAiBl2C,eAAmCk2C,QAAwB,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,a,C,G,C,C;A,G,C,CAC1LprD,YAAyB,MAAGqrD,MAAgB,A,C,I,C,I,C,C,C,C,C,G,C,e,C,G,C,G,C,C;A,G,C,CAAwCx4C,cAAkCw4C,KAAmBn2C,eAAqCm2C,QAA0B,A,C,I,C,I,C,C,C,C,C,E,C,E,C,C,C,C,e,C,G,C,C;A,E,C,CAEhO,wBAEYC,KADmBhoB,kEALiF6nB;KAAaj2C,eAA+Bi2C,QAO5J,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,G,C,C,C,C,E,C,C,C,C,Q,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CARAI;;E5H6FqB;;;gBC5CI;;;;;;S2HjDyB,A,C,I,C,I,C,C,C,C,C,G,C,oC,C,C,C,C;A,yB,C,C,G,C,C;A,E,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCA1BnF,YAAwB,MAAGoF,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAuC34C,cAAiC24C,KAAWt2C,eAA6Bs2C,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAC7LC;;E7H4FqB;;;gBC5CI;;;;;;S4HhDoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,uB,oD,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,C,qD,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCArBz2C,YAAqB,MAAG02C,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAoC74C,cAA8B64C,KAAWx2C,eAA6Bw2C,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAIpL,cACEC,AAAAA,KAL8CD,YAMhD,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAE;;E9H0FqB;;;gBC5CI;;;;;;S6H9CoB,A,C,I,C,I,C,C,C,C,C,G,C,+B,C,C,C,C;A,oB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E,oB,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,CC4B7C1pD;4CACgC,MpI8wWI84B;OoI7wW1B3M,yBAEJ,MAAOw9B;mDAIP,MAAOx9B;QAEP,MAAOA,WAEb,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CCnCFy9B;EAGiBC;;+CxB8HZ1wC,wB7Gq98BMwhB,AAAAA,A6Gl+8B6BxhB,2CACpC2wC,QAAoC3wC;;;UwB3GtC;MAAa4U,oBAAmB,UAAa0a,qBAC5BshB;;aAGkB,8BACjCnyB;WACF,6BAEiE,MAEjE;yBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;WAEmB;GAEG,AAAhBp6B,iBACmCA,OCwKnCwsD,AzBrIF7X;;GwBlCa,QACX6X,AxBiCF7X;GwB7Be,AAAb30C,eACFysD,KAAiBzsD;GAGfA,eAAsB;EAQF,AAAhBA,QrIwzmBUm8B,AAAAA,mBqIvzmBlB;MAAa5L,aAAmB,UAAa0a,sBACrC,YACNyhB;OAAmB1sD,KAAAA,mBACrB,CACF,A,C,Q,C,I,C,E,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CC+WA2sD,iBACE;eAAuB,AAAhBp8B,kBACEA,QACT;gIAKE,QAEF;OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CC7aAvvB;;4CAEI,MAAO4rD;+CAIMC,KAAgBt8B;GAClB,QAAS,iBAGtB,OACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAcAvvB;;;;MAME2tB;gCAFqBguB;QA8BN;;;IAEbnD,cAAAA;OACUqT,yBAGZ,WACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA,yDAGE;gBA2CY,gEA3CM,EAAErT,gBACPA;EACEA,MAAW;EAENsT;qBAAAA;EAAAA;GACdA,WACeA;qBAAAA;EAAAA;GACF,WACSC;GACF;;GAMlB,CAACD,WACY,SACGA;;qBAIkCA,wBACtD;QAAkB,EAAEA,AAAAA,uBAEJA;qBAAAA;EAAAA;EACGA;EAAgB;qBAAhBA;EAAAA;EACgB,QAC7BC;GAEgB;;GnC7DpB5f,0DAIJF;OAAe,gBmC+Db,AAEAK;;YAKY0N,S1B1C0BrG;K0B2CrBqY,UACrB,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAOAC;EzJ6HsBrsD;SyJ3HL,MAKf;mCAAiB,QACFqY;EACS,OAAWA,eAA2B;GAE/C,gBACS,MAEpB6zC;OAAW7zC;qBAKb6zC;OAAW7zC;EACMA,QAAAA,UAAuB,OACxC6zC;;;KAEII;ElIq6BFrb,uCkIp6BFib;EAEqB,IACvB,SAEyBA;;OAEzB;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAyCA;EACMv2B;WACF;aAIuBA,cAGzB;KAAY,UACVoe,AAAAA;EACOpkB,cACT,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,C1BzHA48B;QACkBC;;EvHtCD/sD;eACoBA,OAA+B40B;GuHsCpD,QAAS;;;;;qDAuCpBtZ,wB7Gq98BMwhB,AAAAA,A6Gl+8B6BxhB,2CACpC2wC,QAAoC3wC;;sLANtCyxC;UACA;SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAeAhtD;+CACKub,wB7Gq98BMwhB,AAAAA,A6Gl+8B6BxhB,2CACpC2wC,QAAoC3wC;;SAWR;SAC0B,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,E,C,C2B1IxDy9B,+BACEloC;KAAAA;EAGIqqC;;4CAA+B;EAGhCA;qBAAD;UAAA;;EACkCA;E1B+BpB;;mBsBvChB8R;KAAYC,AAAAA,WAAoCC;EIuB7BpkD;MAEjBonB,AAAAA;EACOpnB,SAA8B,KAAZA;E1BaX;;c0B3BTqwC,AAAAA,uBAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAkBA1f,WAAiB,oCAAa,A,C;A,E,C,CAE9B;GACM0zB,WD3BuB,SAAkB;EC6BzBrhD;KxImk9BpBgxB,AAAAA,AwInk9BI5M;KAEAA,AAAAA,kDAKFA;mBxI4j9BF4M,AAAAA;kBwI5j9BkBhxB,YAEpB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAMAwxB,WAAuB,oCAAa,A,C;A,E,C,CAEpC;EAGepN;;+CAEQyqB,KAAAA,K3BsBmBrG;;+C2BnBzB8Y;;;;GAMG,SAAW,A1BtCZlS,e0BuCA,CAAA,KAAbkS,WACFC,WAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,K,C;A,E,C,CJhEA,etBsBmBnS,csBrBL,MACZ8R,AAAAA;;kCAEF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAEuD;EAItCM,ApI0mPR/0B,+CoI1mPmB;SAC1Bg1B;;;EAEAA,QpI2p/BAx5C;gBA/EI,KAAc,KA8EcC,mBA9EW;EoIzk/B3Cu5C,QpIwp/BAx5C;gBA/EI,KAAc,KA8EcC,mBA9EW;;EA/ja/B4C,kCACZzR;oDoIxglBAooD;kBAGA;MAAOC,mBAA0CA,YACnD,A,C,Q,C,I,C,C,C,C,C,I,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,U,C;A,M,C,CAV0B,YACtBA,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,G,C,C;A,G,C,U,C;A,M,C,CACyB,YACvBA,kBACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAyBFz7C,WAAS,oCAAa,A,C;A,E,C,CAEtB,kBAEEme,SAAAA;0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,kBACUA,KAAAA,UtBvBRorB;KAAAA,URA0BxN;O8ByB5B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C,C;A,E,C,C;A,G,C,yB,C;A,E,CAMA2f,WAAsB,oCAAa,A,C;A,E,C,CAEnC,8CACEv9B;OG9D2B,SAAkB,QH+D/C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA;EACUA,kCtBtCRorB;KAAAA;;;6CsB2CsC,KAAVprB,4CAC1B,MAAA,KAAcw9B,oCAAd,UAAA;;EACuB/S,KAAAA,gDvBAerG;GuBCjB,QAEjBqZ,WAEJ,A9BlDwB7f,O8BsD5B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,M,C,C,E,C,CAWA3rC;;GACmB,AAAbmsB,kBACKA,QAAAA;;aAAP;MAAOA,4BAOSg+B;WACO;EAEVsB,2CACoBt/B,gBACjC;MAAOu/B,sBAEX,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAdoC;;;GACpB,CAAA,wDAENzmB,oBACAA;EAAW9Y;;;SAHf;SAIF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAOoB,wBAAK;MAAM,CAAA,eAAc8Y,eAAW,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,4B,C;A,E,CAW5D0mB,WAAuB,oCAAa,A,C;A,E,C,CAEpC,iBACEC;;GAEIC,gBAA2B;2FpIgqlB3BzlD,KAAuB4wB,wBoIpplBb;6CAAd80B;UAGF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEAluD;EACM+L;;GAAS,0BACIoiD,OACfh+B;;EACOA,kCAAP;qCACkB,8CAClBA;yBACA;MAAkB,MAAXA,uCAEX,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBACM+9B;GAAY,SACdA,cACAA;cAEJ,A,C,Q,C,M,C,C,C,C,C,I,C,C;A,E,C,CAEA,mBACEF;;EAEIjiD;;GAAS,0BACHokB,kCtBtIVorB;KAAAA,mBsBuIoB,kBACVprB,kCtBxIVorB;KAAAA,YsB0IF,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,K,C,I,C;A,M,C,C,E,C,CAMAn5C,mCACuB,M9IzFdnC,wB8I0FP;kDACF,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,C,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAxCqC;GAC7BguD,KtB/GK1S,KAAAA,YsB+GmByS,OAC9B,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAoCsD,YAAI,SAAG,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,G,CKpL/DN,WAAuB,eAAc,A,C;A,E,C,CAErC1U;;GACW,CAAA,gBAAmB,CAAA,iBAC1B;ECqC2BmC;QDlC7BrqC;uDACAqqC,AAAAA;;EACO/B;GAAsB;E3B8Bb;;mBsBvChB6T;KAAYC,AAAAA,WAAoCC;;EtBuChC;;qBsBvChBF;KAAYC,AAAAA,WAAoCC;IKSzC/T,UAAP;SAGF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,mB,C,C;A,E,C,C;A,G,C,c,C;A,E,C,CCJAJ;;;0EACE9kC;;gDAEF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAGA;GACMk6C,cAAmB;EACThV,AAAAA;GACF,QAASiV,QACvB,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAGA;GACMD,cAAmB,MACvB;MAAoBhV,iBAAAA,WzGmPlB,2CtD+BkCl4C,8B+JlRpC,U/JoRekI;G+JnRD,QAASilD,QACvB,AACAD,aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,G,CAIA/mD,kBACM+mD;cAA+B,6BAAZA;UACvB,SACF,A,C;A,G,CAOArB;EAA+B5R;QAAH;uDAA4C,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C,C;A,E,C,C;A,G,C,a,C;A,G,CCzCxE4S,WAAwB,eAAc,A,C;A,E,C,CAEtC/U;GACW;;GACA,CAAA,wBAA2B,CAAA,eAClC;EDoC2BmC;QCjC7BrqC;uDACAqqC,AAAAA;;EACO/B;;E7B6BS;;asBvChB6T;KAAYC,AAAAA,WAAoCC,QOUzC/T;UAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,8C,C;A,G,CLIA1f,WAAkB,eAAc,A,C;A,G,CAEhC40B;;QAAgC;6DACd,A,C;A,E,C,CAElBtV;EACc;EAER5gC;wGAGFA;+BAOEA,OAAAA;MAAAA;MAGAm2C;;sBACOnV,AAAAA;uBAAP;;aAEAhhC,OAAAA;MAAAA;MAGAm2C;;sBACOnV,AAAAA;uBAAP;;SAEAhhC,OAAAA;MAAAA;MAGAm2C;;sBACOnV,AAAAA;uBAAP;;QAEA,gDAEN,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA;uBAGUhhC;WAAmB,MACvBA;OAAAA;SAAAA;SAGAm2C;SACAnV,AAAAA;sBACA;;eAEIhhC;WAAmB,MACvBA;OAAAA;SAAAA;SAGAm2C;SACAnV,AAAAA;sBACA;;WAEIhhC;WAAmB,MACvBA;OAAAA;SAAAA;SAGAm2C;SACAnV,AAAAA;sBACA;;2CAGA;QAEN,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA,iBACOhhC;GAAD,CAACA,MACHA,OACAgR;KAAkBhR,UAEtB,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAMAqhB;EAEyB;;6CzBpBiB8a;EyBqB1BjN;EAGJA;cAIF6kB,SACN7kB;WAoKEknB;cACUrT;;EACFsT;cAEFp0C,AAAAA,uCACNo0C;WAEFD;MAvKaE,SAEfpC;eAIAqC;SACA;SACF,A,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,C,C,C,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,E,C,E,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,G,CAGA38C,WAAU,MAAG48C,SAAM,A,C;A,G,CAqBnBC,WAAoC,MAAGC,SAAgB,A,C;A,G,CAoBvDp1B,yBACEq1B;;EtI678BOhyB,AAAAA,AsI178BKoe;GACF,WACQoR;EACF,QACHsB;cAKFmB;WACW;EAGR1a,gDzBtG0BC,QyBuGxC;MAAe,aACjB,A,C;A,G,CAKA9a,iBACEs1B;;EACOE,OAAP;MAAgB,WAAqB,8BACvC,A,C;A,E,C,CAeAjvD;GAEMkvD,aAA8B,QAElCC;MAGAD;;;;;EAGmB;;;EtIs48BZnyB,AAAAA,A6Gl+8B6BxhB,2CACpC2wC,QAAoC3wC;SyB+FlB;EAMZ6zC;;6CzBnJkC7a,OyBoJtC8a;;EACWA;;;;QAIT,GAEFA,MAA8BC,KADpBC,KAAkCF;GAI9B,QAGdA;UAEAG;KAEAC,KAAUJ,QAGZ;SACF,A,C,Q,C,C,C,M,C,I,C,E,C,I,C,C,C,I,C,Q,C,I,C,K,C,C,C,C,C,I,C,E,C,G,C,C,C,C,C;A,K,C,I,C;A,M,C,C,G,C,a,C,E,C,CAtHAjtD;EACcstD;;+CzBMXn0C,wB7Gq98BMwhB,AAAAA,A6Gl+8B6BxhB,2CACpC2wC,QAAoC3wC;;;KyBOL,QAE/B;MAAa4U,QAAmB,UAAa0a,cAC3C8kB,cAAajB,UACf,AACA;SACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CAoHAtsD;EACYwtD;GtIivNatzB,KAA4B,qBsIhvN3B;EAEhBuzB;cAIFP,AAAAA,uCACJ;OAAOQ,YAAY,YtIkpmBjB;GAAgB,QAElBh0B,iBsIlpmBA,AACA+zB,gBAEF,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CA4BAztD;;EtIi1OSo2B,AsIh1OQ6O,uCACfA,AAAAA;0BAEA;MAAiBA,WAAAA,QAAAA,4B3JLmBnmC,8B2JKpC,U3JHekI;2BqBg08BA2zB,AsI1z8BTsK,WtI0z8BStK;iBACfA;;;kCsItz8BM6yB;EtIqz8BS7yB,AsIrz8BmBsK;EtIqz8BnBtK,iBACfA;oBALAA;;;UsI9y8BA,AAEA,SACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAEA36B;EAGgBwtD;MAEZpZ,SACA;OAIF,0BAAgBnP,SAAe,SAC7BmP,SACF,CACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,E,C,CAUAp0C;;EAWM;GACAm6C,QACFwT,WAGFC;UACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,C,E,C,CAUA5tD,wBAC2B,MACzB6tD;;MtIywOOz3B,oCsIvwOK;oCAEZ3hB,AtI8ibsBzS;6BsI7ibxB,A,C,Q,C,I,C,C,C,C,C,I,C,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAjCE;GACM,CA1IJgoD,AzBrIF7X,0ByBgRIkb;KAAUnb,gDzBxQ0BC,WyB0QxC,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CAgBmC,YAAI,2BAAM,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,e,C;A,E,CA0B/C5a,iBAAiBu2B,OAAAA;UAAH;YAAa,A,C;A,G,CAE3Bl+C,WAAU,MAAG48C,SAAM,A,C;A,E,CAInB58C,YAAU,MAAGupC,MAAAA,YAAe,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,CAE5BxoC,cACEwoC,KAAAA,cACF,A,C;A,G,CAGAvpC;EACO48C;;yFACI,KAALh5B,iBACF,MAAOg5B,QAET;MAAO,MAAiBA,QAAQh5B,cAClC,A,C;A,E,C,CAQA,kBAvBmBs6B;WAwBL,MAIZA;OAAYnkD,QAEZ6iD;YACAsB;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,gB,C;A,M,C,CChY2B,yBAMzB;eAAe,KAARnnD,iBACEA,SACT;aAGW;2BAGO,eAAkB;qBAMvB0jD;GACF;;;;YAETrT;SAAAA;WAEJ,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,G,CAsGAp5C,WAAoB,MAAG0sD,AAAAA,oBAAkB,A,C;A,G,CACzC1sD;EADuB0sD;EAAAA;wBAAAA;GAC0B,KAAVA,+BADhBA;EAC6C,KAAVA,4BAApC;SAAmD,A,C;A,G,CASzEpvC,WAAwB,MAAG6yC,SAAW,A,C;A,E,C,CAWtCjwD;;EAEYwsD;qBAAAA;MAAAA;qBAAAA,SAAV;aAA4BA,MAC9B,A,C,Q,C,K,C,C,C,C,C,G,C,E,C,C,C,C,C;A,E,C,CAEAxsD;EACkCwsD;qBAAAA;EAAjB,KAAiBA,KAChC;kBAAkB,EAAEA,iBACNvkD,MAAe,QAAL;GACZ,uCjJwDZwE;KAA6CA,SiJvDnB;qBAJM+/C;EAIfA;8BjJuDjB//C;KAA6CA,OiJtD7C,AAEA,MjJ+DyBA,MiJ9D3B,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,CAvBAkgD,YAIEsD,QAhBqBzD,AAAAA,mBAgBM0D,WAAoBC,WACjD,A,C,C;A,E,C,C;A,G,C,4D,C;A,E,C,Q,C,C,C,C,M,C,I,C,E,C,M,C,C,C,C,C;A,E,C,CA8DAC,0BACEC;;EAEIC;GAAU,SACZA,MACAA;eAGGC;GAAD,IAAc,CAACC,SACjBC,aACA;WAGwBC,QAAcC;IACfC,QAAaC;GAGlC,CAACC,UACa;;iDnCpNlBnkB;OAAe;EmCqOCokB;EAASC,OnCrOzBrkB;OAAe,emCmOG;QAMlB2jB,QAAYW,AAAAA,2BAEZR;QAAcQ,SAChB,A,C,Q,C,K,C,C,C,C,C,G,C,C;A,E,C,CAEA;EACiBC,OACfC;;;wEAGED;iFAKgB,OAAhBA;eAEAA;UAGgB,kDAChBE,QAAW1kB,AAAAA,WAA4B2kB;EAI5B;EACTH;EAAc;E/BpChB9hB,SAAyB1C,YAA8BD;G9HyCpC,AAFHnsC,a6JDM+wD,WAC1B,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA53B;;GACY,UAAO,MAzEa63B;EA0EbC;EAAkB;gCAAlBA;EAAAA;GACZlV,WA3EyBiV;;KA6E5B;EAGYpF,A1B5Pd7X;W0B6PqB,QAErB;MAAOmd,MAAwD,AAAL,QAA3BA,AAAAA,kBACjC,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAIA;;EAG2BC,QAAsB;EAElC;OACEx7B;OACU,SAAWy7B,QACrBA;;EAIa,Q7JjP5BnxD;K6JiPAgxD;EACaI,KArGiBL;EAsGPM;KAGrB1nC;QACuB,QACvB,MAAA,QAAA,OACEA,eADF,SAEA,CAEJ,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C;A,E,C,CAEA2nC;;;;EAE2BJ,QAAsB;EAC9BA;EACLF;EAAsB,KAAJ;gCAAlBA;EAAAA,IACZA;UAA8B,SAAe,KAAJ,YAE5BI;KAxHiBL,WAyH9B;cAAkB,CAAA,cACLM;;EvI4imBT;GAAgB,QAElBh2B,gBuI3imBA81B;UACF,AACA,qBACF,A,C,Q,C,K,C,C,C,C,C,I,C,E,C,C,C,C,C;A,E,C,CAEA;GACMI,QAAQ;EAnIkBR;;;;EAsIbA;;GAEb5B,gBvIqnNmBtzB,KAA4B,AuIrnNhBszB,6BACjChxB,UACA;UAKE,CAACqzB,SACHA;GACa,SACXC,QAAmBpF,OACnBqF;gBAKgB,+BAEpB;gBAAA,YAAA,UAAA,MACE;MAAkBzjB,UAAlB,kBAAA,OACE0jB,M5JrGWhpD,K4JqGYipD,QAA+B,KAAb3jB,aAC3C;EAEeA;6BAAAA;KACjB,AAEA,MAAA,QAAA,UAAA,MACE;gBAAoBA,mBACP,MAAe,KAAbA,SAAeA,YAClB,YAEE0iB,KAAAA;EAEGgB;GAGF,SAAWzqB,KAAAA;EACdA;EACQA;;GAGK,AAAjBuqB,gBACMA;EAEA,QACGV;OAIfc,iBACF,CACF,AAEA,MAAqBF,8B5JtG8Bz6C,KAAAA,MAAoBO,6B4JsGvE,OACEq6C,QAAsB5qB,K5JpETv+B,M4JqEf,CAGF,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,C;A,E,C,CA+CA,iBACE;MAAA,QAAA,OAA2BilD,KAA3B,OAA0C,CAC5C,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C;A,E,C,CAEA,iBACMiD;WAAkB,MACtBA;MACAA;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,C,CAEA;GACMU,QAAQ,MAEZX;SACA;MAAoBI,YAAF,EAAEA,cAClBc,QAAsBd,KACxB,A7J5VAjxD;;E6J+VIgwD;GAAU,SACZA,MACAA;aAEFgB,AAAAA,eACAQ;WACF,A,C,Q,C,K,C,C,C,C,C,I,C,C,C;A,E,C,C;A,G,C,S,C;A,M,C,CArPyC,YAAI,UAAK,A,C,Q,C,I,C,C,C,C,C,I,C,E,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAO9CQ;;EACmBrqD;EACHA;GACV,EA5QmB,SAAkB,QA4Qf,MAC1B;oBACF,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CASE,YAAI,MAAGwoD,WAAc8B,KAAAA,UAAe,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C;A,E,C,C;A,G,C,W,C;A,K,C,I,C,C;A,E,C,C;A,G,C,a,C;A,E,C,CK9R1CzZ;GAEW,CAAA,eACP,8CAEF0Z;;EACOtZ;EAAkC+B;E9BiCzB;;kB8BjCT/B;UAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,sB,C;A,E,C,CAMA,kB9BUiB+B,O8BTfhrB;0BACF,A,C,Q,C,K,C,C,C,C,C,I,C,G,C,C,C,C,C,C;A,E,C,C;A,G,C,a,C;A,G,CCfAwiC,WAA0B,eAAc,A,C;A,E,C,CAExC3Z;GACW,CAAA,gBAAY;EHsCQmC;QGpC7BrqC;uDACAqqC,AAAAA;;EACO/B;;E/BgCS;;mBsBvChB6T;KAAYC,AAAAA,WAAoCC,QSOzC/T;UAAP;SACF,A,C,Q,C,M,C,C,C,C,C,I,C,E,C,E,C,C,C,C,G,C,C,C,C,G,C,C,C,C,C,C,A,E,yC,qD,A,A,C,C,C,C;A,G,C,E,C;A,G,C,C;A,G,C,I,C,C,A,E,qC,iD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,O,C;A,E,C/BeAzf,WAAc,MAAGwhB,SAAK,A,C;A,G,CAGtBnpC,WAAU,MAAG48C,SAAM,A,C;A,E,CAMnB58C,YAAU,MAAGupC,MAAAA,SAAe,A,C;A,E,C,Q,C,C,C,C,C,C,M,C,I,C,E,C,I,C,C,M,C,C,C,C,C;A,E,CAE5BxoC,cACEwoC,KAAAA,WACF,A,C;A,E,C,CAoCA;GA3CmBJ,cA4CL;EAERyX;GAAS,QAASA,MACtBA;YACArX;YACAJ;YACAyT;aACF,A,C,Q,C,K,C,C,C,C,C,I,C,C;A,E,CA1CA5V;EAZa4V;;wFAiBF;EAjBEA;MAmBTrT;WAGY,OAAwB,aAApCA;UAGFqX,QAAWrX,AAAAA,0BACXsX;QApBWtX,KAAAA,UAqBb,A,C;A,K,C,I,C,C;A,E,C,C;A,G,C,U,C;A,M,C,CAFsC,wBAAI;MAAGsX,MAnBhCtX,KAAAA,OAmBkD,A,C,Q,C,I,C,C,C,C,C,I,C,G,C,C,C,C,M,C,C;A,K,C,I,C,C,A,E,kB,+C,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,0D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CgClD/DuX;;EzI6FqB;;;gBC5CI;;;;;;;SwIjDe,A,C,I,C,I,C,C,C,C,C,G,C,0B,C,C,C,C;A,e,C,C,G,C,C,A,E,mB,gD,A,A,C,C,C,C;A,G,C,E,C;A,E,C,C;A,G,C,C,6D,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,Q,C,C,C,M,C,C,C,E,C,C,C,C;A,G,C,CCChB5P,YAAU,MAAG6P,MAAK,A,C,I,C,I,C,C,C,C,C,G,C,I,C,G,C,G,C,C;A,G,C,CAAyBhgD,cAAmBggD,KAAQ39C,eAA0B29C,QAAe,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,I,C,G,C,C;A,G,C,CAC/GhM,YAAoB,MAAGzlB,MAAQ,A,C,I,C,I,C,C,C,C,C,G,C,O,C,G,C,G,C,C;A,G,C,CAAmCvuB,cAA6BuuB,KAAWlsB,eAA6BksB,QAAkB,A,C,I,C,I,C,C,C,C,C,G,C,E,C,C,C,C,O,C,G,C,C;A,E,C,CAIjL,cACEjuB,AAAAA,KANmC0/C,YAOrC,A,C,Q,C,K,C,C,C,C,C,G,C,G,C,C,C,C,S,C,C;A,G,C,Q,C,C,C,M,C,C,C,E,C,C,C;A,M,C,C,E,C,CAJAC;;E1IyFqB;;;gBC5CI;;;;;;SyI7CgB,A,C,I,C,I,C,C,C,C,C,G,C,2B,C,C,C,C;A,gB,C,C,G,C,C;A,G,C,C;A,G,C,Q,C;A,K,C,I,C,C,A,E;A;A;A;A;A,U,C,C,C,C,C;A;A;A,U,C,C,C,C,C;A;A;A;A,W,C,C,C,C,C;A;A,W,C,C,C,C,C;A;A,W,C,C,C,C,C;A;A;A;A,W,C,C,C,C,C;A;A,W,C,C,C,C,C;A;A;A;A;A;A;A;A;A,W,C,C,C,E,C;A;A;A;A,W,C,C,C,E,C;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,W,C,I,C,I,C;A;A,W,C,I,C,I,C;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,W,C,I,C;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,gB,C,I,C,I,C,I,C,C,I,C,I,C,C;A,gB,C,I,C,I,C,G,C,C,C,C,C,I,C,C,C,C,C,C,C;A,gB,C,I,C,I,C,I,C,C,I,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,C,C,U,C,C,C,C,C,C,M,C,C,C,E,C,S;A,M,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,C,E,I,C,M,C,C;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,W,E,K,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,C,C,U,C,C,C,C,C,C,M,C,C,C,E,C,S;A,M,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C;A,E,C,C,C,C,C,U,C,C,C,C,C,C,M,C,C,C,E,C,S;A,M,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,C,E,I,C,M,C,C;A,E,C,C,C,W,E,K,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,C,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,C,E,C,I,C,K,C,C,C,E,C,C,M,C,C,C,E,C,S;A,M,C,C,C,E,C,S,C,E,C,M,C,C,E,Q,C,M,C,C,C,C,C,S;A,E,C,C,E,I,C,M,C,C,C,E,C,S;A,E,C,M,C,C,E,S,C,M,C,C,C,E,C,S;A,E,C,C,C,W,E,K,C,M,C,C,C,C,C,S;A,E,C,M,C,C,E,Q,C,M,C,C;A,E,C,C,C,U,C,C,C,C,C,M,C,C;A,M,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,C,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,E,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,E,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C,C,G,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,C,C,W,E,K,E,M,C,C,E,Q,E,I,C,C,C,C,C,yB,C,C,C,E,C,C,G,C,G,C,E,C,C,C,C,M,C,M,C,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,E,C,M,C,C,E,Q,C,M,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,C,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,C,E,I,C,M,C,C,E,I;A,E,C,M,C,C,E,Q,C,M,C,C,E,I,E,C,G,C;A,M,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,E,C,C,C,C,W,E,K,E,I,C,C,C,C,C,yB,C,C,C,E,C,C,C,c,E,C,G,C,G,C,E,C,C,C,C,M,C,M,C,C,C,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C,C,G,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,C,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,C,C,E,C,M,C,C,E,Q,E,M,C,C,E,Q,C,M,C,C,C,C;A,M,C,C,C,E,C,C,C,C,C,C,C,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,E,C,C,C,C;A,C,C,E,C,Q,C,C,C,C,M,C,C,C,E,C,C,C,C,G,C,C,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,G,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,G,C,C;A,C,C,E,C,I,G,C,C;A,C,C,G,C,I,K,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,K,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,I,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,K,C,W,C;A,C,C,E,C,I,K,C,M,C;A,C,C,E,C,I,K,C,Q,C;A,C,C,E,C,I,K,C,Q,C;A,C,C,E,C,I,K,C,K,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,G,C,I,I,C,wB,C;A,C,C,E,C,I,I,C,qB,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,G,C,I,I,C,c,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,G,C,I,I,C,c,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,G,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,S,C;A,C,C,G,C,I,I,C,c,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,qB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,yB,C;A,C,C,E,C,I,I,C,oB,C;A,C,C,E,C,I,I,C,U,C;A,C,C,G,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,a,C;A,C,C,G,C,I,I,C,c,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,S,C;A,C,C,G,C,I,I,C,a,C;A,C,C,G,C,I,I,C,e,C;A,C,C,E,C,I,I,C,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,C,C,E,C,I,I,C,Q,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,O,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,O,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,Y,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,O,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,M,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,S,C,C,M,C;A,C,C,E,C,C,C,E,C,I,I,C,W,C,C,M,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,G,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,G,C,S;A,C,C,E,C,G,C,S;A,C,C,E,C;;;C;A,C,C,E,C;A;A,C,C,E,C;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;C;A,C,C,E,C;;;;;;;;;;;;;;;;;C;A,C,C,E,C,I,I,C,I,C,I,C;A,C,C,E,C,I,K,C,I,C;A,C,C,E,C,I,I,C,I,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,O,C,G,C;A,C,C,E,C,I,I,C,M,C,G,C;A,C,C,E,C,I,I,C,M,C,G,C;A,C,C,E,C,I,I,C,Q,C,I,C;A,C,C,E,C,I,I,C,S,C,G,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C;;;;;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,C,C,C,C,K,C,I,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,K,C,I,C,K,C,I,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,K,C,K,C,K,C,K,C,C;A,C,C,E,C,C,C,gB,C,C,Q,C,S,C,S,C,Q,C,M,C,C;A,C,C,E,C,C,C,gB,C,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,E,C,G,C,C;A,C,C,E,C,C,C,gB,C,C,I,C,I,C,I,C,I,C,I,C,I,C,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,E,C,C,C,gB,C,C,C,C,C,M,C;A,C,C,E,C,C,C,gB,C,C,C,C;A,C,C,E,C,C,C,gB,C,C,I,C,M,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,I,C,K,C,K,C,K,C,K,C,C;A,C,C,E,C,C,C,gB,C,C,C,C,C,C,K,C,K,C,K,C,K,C,K,C,K,C,C;A,C,C,E,C,C,C,gB,C,C,E,C,E,C,E,C,E,C,G,C,G,C,C;A,C,C,E,C,C,C,gB,C,C,S,C,K,C,U,C,Q,C,U,C,O,C,I,C,O,C,I,C,O,C,I,C,C;A,C,C,E,C,I,K,C,E,C,C,O,C,I,C,G,C,I,C,Q,C,I,C,M,C,I,C,Q,C,I,C,K,C,I,C,E,C,I,C,K,C,I,C,E,C,I,C,K,C,I,C,E,C,I,C,C,C,C,E,C;A,C,C,E,C,C,C,gB,C,C,sB,C,oB,C,qB,C,a,C,Y,C,c,C,oB,C,gB,C,a,C,kB,C,iB,C,U,C,U,C,Y,C,S,C,c,C,C;A,C,C,E,C,I,K,C,E,C,C,oB,C,sB,C,kB,C,oB,C,mB,C,qB,C,W,C,a,C,U,C,Y,C,Y,C,oB,C,kB,C,0B,C,c,C,sB,C,W,C,U,C,gB,C,wB,C,e,C,uB,C,Q,C,gB,C,Q,C,gB,C,U,C,kB,C,O,C,e,C,Y,C,oB,C,C,C,C,E,C;A,C,C,E,C,C,C,gB,C,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,I,C,I,C,G,C,G,C,G,C,I,C,I,C,I,C,G,C,I,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,G,C,C;A,C,C,E,C,I,K,C,E,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,I,C,C,C,I,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,I,C,C,C,I,C,C,C,I,C,C,C,G,C,C,C,I,C,C,C,G,C,C,C,G,C,C,C,G,C,C,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,G,C,E,C,C,C,C,E,C;A,C,C,G,C,C,C,gB,C,C,M,C,S,C,a,C,U,C,Y,C,C;A,C,C,E,C,I,K,C,C,C,C,I,C,C,C,O,C,C,C,W,C,C,C,Q,C,C,C,U,C,C,C,C,C,C,G,C;A,C,C,G,C,C,C,gB,C,C,W,C,C;A,C,C,E,C,I,K,C,C,C,C,S,C,M,C,C,C,C,G,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,K,C,S;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,oB,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,I,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,sB,C;A,C,C,E,C,I,I,C,yB,C;A,C,C,E,C,I,I,C,yB,C;A,C,C,E,C,I,I,C,8B,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,iB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,gB,C;A,C,C,E,C,I,I,C,kB,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,a,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,c,C;A,C,C,E,C,I,I,C,Y,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,U,C;A,C,C,E,C,I,I,C,uB,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,I,C,e,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,K,C;A,C,C,E,C,I,I,C,O,C;A,C,C,E,C,I,I,C,W,C;A,C,C,E,C,I,I,C,S,C;A,C,C,E,C,I,I,C,I,C;A,C,C,E,C,I,I,C,Q,C;A,C,C,E,C,I,I,C,M,C;A,C,C,E,C,I,C,S;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,I,I,C,C,C,G,C,G,C,C,C;A,C,C,E,C,I,I,C,C,C,E,C,G,C,C,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,G,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,Q,C;A,C,C,E,C,C,C,E,C,K,C;A,C,C,E,C,C,C,E,C,K,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,K,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,Q,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,K,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,G,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,M,C;A,C,C,E,C,C,C,E,C,M,C;A,C,C,E,C,C,C,E,C,S,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,C,C,E,C,I,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,I,C,C,C,C;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,I,C,S;A,C,C,E,C,C,C,E,C,I,I,C,M,C,C,M,C;A,uB;A,C,C,E,C,iB;A,C,C,E,C,mB;A,C,C,E,C,C;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,C,C;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,C,C,E;A,C,C,E,C,C;A,C,C,E,C,I;A,C,C,E,C,I;A,C,C,E,C,C,C;A,C,C,E,C,C,C,E;A,C,C,E,C,C;A,C,C,E,C,C;A,C,C,E,C,I;A,C,C,E,C,C,C;A,C,C,E,C,C;A,C,C,E,C,C,C;A,C,C,E,C,U;A,C,C,E,C,I;A,C,C,E,C,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,M,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,M,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,G,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,G,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C,I,C;A,C,C,E,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,E,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,K,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,G,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,E,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,G,C,C,E,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,G,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,G,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C,C,C,E,C,C,C,E,C,C,O,C,I,C,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,C9J6bvCC,sCAA0C,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CAC1CC,sBAA4C,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CAC5CC,sBAA4C,A,C;A,C,C,K,C,C,C,0B,C,I,C,I,C,Q,C,CAC3CC,oCAC8C,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAQnCC,OAAaC,QAAkB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAGnBrwD,oCAA6B,A,C;A,C,C,K,C,C,C,qB,C,I,C,I,C,Q,C,CFmrBzBswD,OAC1BC,MAAeC,yDAA2C,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CAIhCC,OAC1BF,MAAeC,yEAAyD,A,C;A,C,C,K,C,C,C,iB,C,I,C,I,C,Q,C,CAI9CE,OAC1BH,MAAeC,YAAkC,A,C;A,C,C,K,C,C,C,wB,C,I,C,I,C,Q,C,CAIvBG,OAC1BJ;;;;;;;KAAuC,A,C;A,C,C,K,C,C,C,sB,C,I,C,I,C,Q,C,CAIbK,OAC1BL,MAAeC,cAAoC,A,C;A,C,C,K,C,C,C,6B,C,I,C,I,C,Q,C,CAIzBK,OAC1BN;;;;;;;KAA4C,A,C;A,C,C,K,C,C,C,qB,C,I,C,I,C,Q,C,CAIlBO,OAC1BP,MAAeQ,YAAsC,A,C;A,C,C,K,C,C,C,4B,C,I,C,I,C,Q,C,CAI3BC,OAC1BT;;;;;;KAA2C,A,C;A,C,C,K,C,C,C,0B,C,I,C,I,C,Q,C,CAIjBU,OAC1BV,MAAeQ,cAAwC,A,C;A,C,C,K,C,C,C,iC,C,I,C,I,C,Q,C,CAI7BG,OAC1BX;;;;;;KAAgD,A,C;A,C,C,K,C,C,C,qB,C,I,C,I,C,Q,C,C+BzqC/ChgB,OAAsB,qBAO3B,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CnC8sBYz8B,UAAyB,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CcvtBjBq9C,iBTgBVliD,iKSMU,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CyBiCMmiD,uBACkB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAClBC,uBAAiD,A,C;A,C,C,K,C,C,C,iB,C,I,C,I,C,Q,C,CAE7B15C,OAC1C25C,QAAuB,A,C;A,C,C,K,C,C,C,uB,C,I,C,I,C,Q,C,CA2aRp5C,+BjCndgB5Y,sBiCmd2B,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CEjetCyM,OACtBwlD,4BAA6D,A,C;A,C,C,K,C,C,C,iB,C,I,C,I,C,Q,C,CAIvC12C,OACtB22C,cAAmC,A,C;A,C,C,K,C,C,C,oB,C,I,C,I,C,Q,C,CAIbz7C,OACtBw7C,kCAAkE,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CiB3BlEtoC,OAAoB,YAAqB,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CHwD/BnV,UAAyB,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CzBmqBjB+D,iBzBjsBV5I,gLyBytBF,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CT+9COwiD,mBAAiC,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CAu4TnCr3B,OjBv8UNl6B,4iBAA8B,gCiBs9UrC,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,CF5gYasC,OAAUo6B,qCAA0C,A,C;A,C,C,K,C,C,C,4B,C,I,C,I,C,Q,C,CAmWtD80B,gDACiC,A,C;A,C,C,K,C,C,C,6B,C,I,C,I,C,Q,C,CACjCC,iDACkC,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CkFnZhCC,yBAAgC,A,C;A,C,C,K,C,C,C,sB,C,I,C,I,C,Q,C,CAChCC,mBAAoC,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CrFqMhBpqB,aZ65C1BvnC,QAA8B,4CY75CwB,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,C0GjKlDyqC,OAAU,+BAAkC,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CCmHnDmnB,OAAa36C,YAAmB,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CI8IhCq2B,OAAc,qBAQlB,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CAEIukB,iB1HrUM9iD,gC0HqU0B,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,CAUzB07B,OAAU,8BAAiC,A,C;A,C,C,K,C,C,C,c,C,I,C,I,C,Q,C,CEkG9C0E,OAAe,+BAAsB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAKrCC,OAAY,+BAAoC,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAQhDZ,OAAa,qCAA0C,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,CAYvDgD,OAAgB,+BAAoC,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CAKxDsgB,OAAc76C,YAAmB,A,C;A,C,C,K,C,C,C,W,C,I,C,I,C,Q,C,CAuH1Bi4B,OAAY,4BAA+B,A,C;A,C,C,K,C,C,C,2B,C,I,C,I,C,Q,C,CA6BlDoI,OAA4B,sBAMhC,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CvG7lBaya,iBrBZHhjD,6CqBY6C,A,C;A,C,C,K,C,C,C,gB,C,I,C,I,C,Q,C,CAuB1BijD,OcIpB,4BAAA;;mBdHoC,A,C;A,C,C,K,C,C,C,Q,C,I,C,I,C,Q,C,CAItBzjB,sByB3DG,oBzB2DoB,A,C;A,C,C,K,C,C,C,gB,C,I,C,I,C,Q,C,CAq4BzB0jB,gBAAwB,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CAiGlChb,OAAc,yBAA4B,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAC1CE,OAAa,wBAA2B,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CACxChB,OAAa,wBAA2B,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CACxCL,OAAW,sBAAyB,A,C;A,C,C,K,C,C,C,a,C,I,C,I,C,Q,C,CAEnCpG,oCAAmC,A,C;A,C,C,K,C,C,C,kB,C,I,C,I,C,Q,C,CFn+BpC99B,OACT2+B,eAA2Bx/B,KAAAA,6BAAoB,A,C;A,C,C,K,C,C,C,O,C,I,C,I,C,Q,C,CAoD7CmhD,OAAQt0B,cAAsBhmB,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CAI9B64B,OAAW7S,AAAAA,AAAAA,uBAA0C3K,A,C;A,C,C,K,C,C,C,Y,C,I,C,I,C,Q,C,CAE9C6d,OAAa,wBAA2B,A,C;A,C,C,K,C,C,C,e,C,I,C,I,C,Q,C,C6GnI/C6H,OAAgB,qBAoBpB,A,C;A,C,C,K,C,C,C,S,C,I,C,I,C,Q,C,CCYWlO,OAAU,6BAAgC,A,C;A,C,C,K,C,C,C,mB,C,I,C,I,C,Q,C,CGpBjDyR,OrIooDGl8C,0NAA8B,gCqIlnDvC,A,C;A,C,C,K,C,C,C,kB,C,I,C,I,C,Q,C,CAEMi8C,OrIgnDGj8C,qDAA8B,gCqI5mDvC,A,C;A,C,C,K,C,C,C,wB,C,I,C,I,C,Q,C,ClBmJsB4gD,iBlH/JV7xC,0CkH+J6D,A,C;A,C,C,K,C,C,C,uB,C,I,C,I,C,Q,C,CACnD4xC,iBlHhKV5xC,2CkHgK6D,A,C;A,C,C,K,C,C,C,oB,C,I,C,I,C,Q,C,CkC1KrC65C,OAAqB,qBAiBrD,A,C;A,C,C,K,C,C,C,gB,C,I,C,I,C,Q,C,CE6NW8D,oCAA6B,A,C;A,C,C,K,C,C,C,uB,C,I,C,I,C,Q,C,CAC7BpB,oCAAoC,A,C;A,C,C,K,C,C,C,wB,C,I,C,I,C,Q,C,CA4G7B6G,OACH,aACbpJ,AAAAA,KAAAA,sCAAiE,A,C;A,C,C,K,C,C,C,U,C,I,C,I,C,Q,C,CzBpMzDc,kDAAyC,A,C;A;A,I,C,e,C,C,C;e,G,C,I,C,I,C,I,C,I,C,I,C,Q,C,a,C,O,C,W,C,c,C,M,C,M,C,U,C,S,C,U,C,O,C,Q,C,G,C,K,C,S,C,G,C,Q,C,O,C,Y,C,sB,C,Q,C,Q,C,O,C,a,C,O,C,Y,C,W,C,O,C,O,C,K,C,O,C,S,C,S,C,c,C,O,C,U,C,K,C,qB,C,gB,C,W,C,U,C,O,C,I,C,Y,C,e,C,Q,C,S,C,mB,C,M,C,M,C,M,C,M,C,O,C,W,C,gB,C,U,C,a,C,c,C,e,C,W,C,U,C,Y,C,M,C,Y,C,gB,C,wB,C,K,C,e,C,Q,C,U,C,kB,C,C,gB,C,O,C,Y,C,c,C,W,C,S,C,Q,C,S,C,G,C,G,C,W,C,S,C,a,C,G,C,c,C,K,C,K,C,kB,C,a,C,O,C,S,C,W,C,e,C,Q,C,Q,C,U,C,O,C,M,C,I,C,uB,C,G,C,qB,C,W,C,U,C,G,C,c,C,S,C,e,C,gB,C,O,C,K,C,W,C,K,C,U,C,K,C,U,C,O,C,G,C,S,C,U,C,M,C,O,C,S,C,Q,C,+B,C,W,C,a,C,S,C,W,C,Y,C,M,C,e,C,O,C,Y,C,Q,C,oB,C,gB,C,U,C,K,C,c,C,M,C,W,C,U,C,qB,C,iC,C,4C,C,O,C,Y,C,U,C,W,C,S,C,c,C,Q,C,U,C,qD,C,M,C,Q,C,6C,C,8D,C,K,C,wE,C,6D,C,qF,C,+F,C,uD,C,qE,C,+C,C,M,C,gC,C,gE,C,e,C,Y,C,O,C,qC,C,G,C,gC,C,O,C,G,C,Q,C,M,C,S,C,+B,C,a,C,I,C,qC,C,iB,C,mC,C,+B,C,0F,C,M,C,Q,C,O,C,iB,C,U,C,W,C,K,C,M,C,M,C,I,C,E,C,gB,C,M,C,U,C,a,C,+B,C,e,C,K,C,Y,C,iB,C,Q,C,U,C,gB,C,c,C,U,C,O,C,M,C,K,C,a,C,sC,C,U,C,U,C,U,C,gB,C,G,C,a,C,M,C,a,C,U,C,iB,C,W,C,O,C,oC,C,K,C,S,C,c,C,Y,C,K,C,U,C,Q,C,W,C,M,C,M,C,c,C,S,C,S,C,O,C,K,C,O,C,Q,C,U,C,U,C,O,C,M,C,M,C,wB,C,Y,C,M,C,O,C,O,C,K,C,S,C,M,C,S,C,W,C,c,C,G,C,M,C,G,C,uC,C,a,C,G,C,Y,C,U,C,O,C,O,C,iB,C,I,C,S,C,S,C,U,C,G,C,W,C,I,C,I,C,Q,C,Q,C,Y,C,a,C,W,C,M,C,W,C,mB,C,U,C,Y,C,O,C,U,C,M,C,W,C,W,C,Y,C,M,C,Q,C,S,C,S,C,S,C,S,C,S,C,Q,C,U,C,S,C,Q,C,e,C,iB,C,mB,C,Y,C,e,C,uB,C,W,C,S,C,W,C,U,C,U,C,U,C,U,C,c,C,c,C,Q,C,Y,C,E,C,W,C,C,C,E,C,U,C,gB,C,K,C,kB,C,Q,C,Q,C,M,C,W,C,M,C,4B,C,W,C,e,C,2B,C,2B,C,G,C,I,C,I,C,oB,C,I,C,K,C,uB,C,oB,C,uB,C,mB,C,kC,C,iC,C,W,C,O,C,K,C,O,C,I,C,U,C,S,C,M,C,U,C,I,C,e,C,oB,C,I,C,uB,C,M,C,I,C,I,C,I,C,I,C,sC,C,K,C,I,C,oB,C,uB,C,K,C,G,C,oB,C,uB,C,G,C,2C,C,K,C,2C,C,I,C,Q,C,M,C,I,C,S,C,uB,C,4B,C,gB,C,I,C,S,C,4B,C,c,C,I,C,a,C,Y,C,G,C,gC,C,uB,C,gC,C,+B,C,0B,C,S,C,2C,C,gC,C,kC,C,S,C,S,C,S,C,e,C,Y,C,Y,C,c,C,gB,C,Q,C,Q,C,U,C,4B,C,M,C,sC,C,Y,C,W,C,Y,C,Q,C,M,C,U,C,M,C,S,C,Q,C,G,C,U,C,Q,C,M,C,M,C,M,C,gC,C,0B,C,kB,C,c,C,S,C,+B,C,+B,C,Q,C,U,C,c,C,M,C,W,C,I,C,I,C,gC,C,O,C,gC,C,M,C,qC,C,Y,C,qC,C,M,C,Q,C,gC,C,O,C,K,C,Q,C,W,C,W,C,U,C,Q,C,K,C,K,C,sC,C,I,C,sD,C,yD,C,oB,C,uB,C,iC,C,K,C,I,C,I,C,K,C,I,C,+B,C,K,C,oB,C,uC,C,O,C,iD,C,S,C,sC,C,W,C,a,C,uC,C,sC,C,O,C,uC,C,iC,C,W,C,K,C,U,C,I,C,gC,C,4B,C,+B,C,U,C,K,C,4B,C,sC,C,Q,C,I,C,I,C,I,C,I,C,+B,C,2C,C,I,C,I,C,I,C,Y,C,I,C,I,C,K,C,oB,C,mB,C,K,C,K,C,U,C,K,C,uB,C,I,C,K,C,K,C,K,C,K,C,K,C,K,C,K,C,I,C,oB,C,uB,C,K,C,0C,C,+B,C,M,C,O,C,+B,C,O,C,+B,C,I,C,4B,C,yD,C,+B,C,6B,C,6B,C,W,C,W,C,S,C,iB,C,S,C,Y,C,Q,C,W,C,a,C,gB,C,oC,C,gB,C,wC,C,S,C,Q,C,iC,C,kB,C,M,C,G,C,uC,C,G,C,K,C,gC,C,M,C,qC,C,G,C,M,C,M,C,Y,C,Q,C,C,C,uB,C,K,C,I,C,U,C,oB,C,uB,C,0B,C,6B,C,K,C,I,C,+B,C,K,C,oB,C,oB,C,uB,C,4B,C,oB,C,uB,C,W,C,U,C,a,C,U,C,c,C,e,C,8B,C,S,C,W,C,iC,C,U,C,oB,C,oB,C,uB,C,oB,C,uB,C,gB,C,O,C,O,C,Y,C,+B,C,qB,C,wB,C,O,C,O,C,a,C,a,C,a,C,c,C,S,C,I,C,oB,C,uB,C,K,C,I,C,oB,C,uB,C,K,C,oB,C,K,C,I,C,S,C,I,C,I,C,K,C,K,C,G,C,a,C,8B,C,oC,C,Q,C,e,C,wC,C,sB,C,I,C,wB,C,K,C,E;A;A;A;;;;A;;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A;A,C,Q,C,C,C,Q,C,M,C,C,C,C,I,C,C,C,C;A,C,C,C,C,C,C;A,M,C,M,C,I,C,mB,C,C,C,C,C,C,C,C,I,C,a,C,Q,C,C,C,C,M,C,M,C,U,C,C,C,I,C,U,C,C;A,I,C,C,uB;A,I,C,C,M,C,C,C,E,C,M,C,C,C,C,M,C,M,C,I,C,C;A,I,C,C,Q;A,G,C,I,C,C,C,C,C,C,E,C,C,Q,C,M,C,C,C,G,C,C,C,G,C;A,E,C,C,C,Q,C,E,C,C,C,C,C,C,C,Q,C,C,C;A,I,C,U,C,Q;A,K,C,C,C,C,C;A,I,C,oB,C,I,C,a,C,iB,C;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gB;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 3463855..c31adc5 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html
@@ -10,6 +10,7 @@
   <link rel="import" href="src/elements/collapsible_content.html">
   <link rel="import" href="src/elements/error_view.html">
   <link rel="import" href="src/elements/eval_box.html">
+  <link rel="import" href="src/elements/eval_link.html">
   <link rel="import" href="src/elements/field_ref.html">
   <link rel="import" href="src/elements/field_view.html">
   <link rel="import" href="src/elements/function_ref.html">
@@ -27,6 +28,7 @@
   <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">
   <link rel="import" href="src/elements/service_ref.html">
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 09ab85e..3001d69 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
@@ -61,7 +61,7 @@
         <div class="memberItem">
           <div class="memberName">script</div>
           <div class="memberValue">
-            <script-ref ref="{{ cls['script'] }}" line="{{ cls['line'] }}">
+            <script-ref ref="{{ cls['script'] }}" pos="{{ cls['tokenPos'] }}">
             </script-ref>
           </div>
         </div>
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 48a7d37..be5f8b5 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
@@ -1,9 +1,14 @@
 <head>
-<link rel="import" href="service_ref.html">
+  <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="code-ref" extends="service-ref">
-<template>
-  <a href="{{ url }}">{{ name }}</a>
-</template>
+  <template>
+    <template if="{{ code.isDartCode }}">
+      <a href="{{ url }}">{{ name }}</a>
+    </template>
+    <template if="{{ !code.isDartCode }}">
+      <span>{{ name }}</span>
+    </template>
+  </template>
 <script type="application/dart" src="code_ref.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_link.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_link.html
new file mode 100644
index 0000000..8de2c84
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_link.html
@@ -0,0 +1,29 @@
+<head>
+  <link rel="import" href="instance_ref.html">
+</head>
+<polymer-element name="eval-link">
+  <template>
+    <style>
+      .idle {
+        color: #0489c3;
+        cursor: pointer;
+      }
+      .busy {
+        color: #aaa;
+        cursor: wait;
+      }
+    </style>
+
+    <template if="{{ busy }}">
+      <span class="busy">[evaluate]</span>
+    </template>
+    <template if="{{ !busy }}">
+      <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
+    </template>
+    <template if="{{ result != null }}">
+      = <instance-ref ref="{{ result }}"></instance-ref>
+    </template>
+
+  </template>
+  <script type="application/dart" src="eval_link.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html
index 179b4918..9e5f896 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
@@ -1,19 +1,23 @@
 <head>
-<link rel="import" href="class_ref.html">
+<link rel="import" href="instance_ref.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="field-ref" extends="service-ref">
-<template>
-<div>
-  <template if="{{ ref['final'] }}"> final </template>
-  <template if="{{ ref['const'] }}"> const </template>
-  <template if="{{ (ref['declared_type']['name'] == 'dynamic' && !ref['final'] && !ref['const']) }}">
-  var
+  <template>
+    <div>
+      <template if="{{ ref['static'] }}">static</template>
+      <template if="{{ ref['final'] }}">final</template>
+      <template if="{{ ref['const'] }}">const</template>
+      <template if="{{ (ref['declared_type']['name'] == 'dynamic' &&
+                        !ref['final'] && !ref['const']) }}">
+        var
+      </template>
+      <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
+        <instance-ref ref="{{ ref['declared_type'] }}"></instance-ref>
+      </template>
+      <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+    </div>
   </template>
-  <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
-  </template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</div>
-</template> <script type="application/dart" src="field_ref.dart"></script> </polymer-element>
\ No newline at end of file
+  <script type="application/dart" src="field_ref.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
index 8857d5e0..d190acf 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
@@ -1,10 +1,35 @@
 <head>
   <link rel="import" href="class_ref.html">
+  <link rel="import" href="instance_ref.html">
+  <link rel="import" href="library_ref.html">
   <link rel="import" href="nav_bar.html">
+  <link rel="import" href="script_ref.html">
   <link rel="import" href="observatory_element.html">
 </head>
 <polymer-element name="field-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
@@ -19,40 +44,72 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-          <template if="{{ field['static'] }}">static</template>
-          <template if="{{ field['final'] }}">final</template>
-          <template if="{{ field['const'] }}">const</template>
-          {{ field['user_name'] }} ({{ field['name'] }})
-          <class-ref ref="{{ field['owner'] }}"></class-ref>
+    <div class="content">
+      <h1>
+        <template if="{{ field['static'] }}">static</template>
+        <template if="{{ field['final'] }}">final</template>
+        <template if="{{ field['const'] }}">const</template>
+        <template if="{{ (field['declared_type']['name'] == 'dynamic' &&
+                         !field['final'] && !field['const']) }}">
+          var
+        </template>
+        <template if="{{ (field['declared_type']['user_name'] != 'dynamic') }}">
+          {{ field['declared_type']['user_name'] }}
+        </template>
+        {{ field['user_name'] }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">owner</div>
+          <div class="memberValue">
+            <template if="{{ field['owner'].serviceType == 'Class' }}">
+              <class-ref ref="{{ field['owner'] }}"></class-ref>
+            </template>
+            <template if="{{ field['owner'].serviceType != 'Class' }}">
+              <library-ref ref="{{ field['owner'] }}"></library-ref>
+            </template>
+          </div>
         </div>
-        <div class="panel-body">
-        <template if="{{ field['guard_class'] == 'dynamic'}}">
-          <div class="alert alert-danger">
-            Field has been assigned multiple types. If a field is only ever
-            assigned a single type, performance may improve.
+        <div class="memberItem">
+          <div class="memberName">script</div>
+          <div class="memberValue">
+            <script-ref ref="{{ field['script'] }}"></script-ref>
+          </div>
+        </div>
+        <template if="{{ !field['static'] }}">
+          <div class="memberItem"
+               title="The types observed for this field at runtime.  Fields that are observed to have a single type at runtime or to never be null may allow for additional optimization.">
+            <div class="memberName">observed types</div>
+            <div class="memberValue">
+              <template if="{{ field['guard_class'] == 'dynamic' }}">
+                various
+              </template>
+              <template if="{{ field['guard_class'] == 'unknown' }}">
+                none
+              </template>
+              <template if="{{ field['guard_class'] != 'unknown' &&
+                            field['guard_class'] != 'dynamic' }}">
+                <class-ref ref="{{ field['guard_class'] }}"></class-ref>
+                <template if="{{ field['guard_nullable'] }}">
+                  &mdash; null observed
+                </template>
+                <template if="{{ !field['guard_nullable'] }}">
+                  &mdash; null not observed
+                </template>
+              </template>
+            </div>
           </div>
         </template>
-        <template if="{{ (field['guard_class'] != 'dynamic') && (field['guard_class'] != 'unknown') }}">
-          <div class="alert alert-success">Field has monomorphic type</div>
-          <template if="{{ (field['guard_class'] != 'dynamic') &&
-                        field['guard_nullable'] }}">
-            <div class="alert alert-info">
-              Field has been assigned null. If a field is never assigned null,
-              performance may improve.
+        <template if="{{ field['value'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">static value</div>
+            <div class="memberValue">
+              <instance-ref ref="{{ field['value'] }}"></instance-ref>
             </div>
-          </template>
-          <blockquote>
-            <class-ref ref="{{ field['guard_class'] }}"></class-ref>
-          </blockquote>
+          </div>
         </template>
-        </div>
       </div>
     </div>
-  </div>
   </template>
   <script type="application/dart" src="field_view.dart"></script>
 </polymer-element>
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 2760ab0..65955af 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
@@ -5,7 +5,7 @@
 <polymer-element name="function-ref" extends="service-ref">
   <template><!-- These comments are here to allow newlines.
      --><template if="{{ qualified && !hasParent && hasClass }}"><!--
-       --><class-ref ref="{{ ref['class'] }}"></class-ref>.</template><!--
+       --><class-ref ref="{{ ref['owner'] }}"></class-ref>.</template><!--
      --><template if="{{ qualified && hasParent }}"><!--
        --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
           </function-ref>.<!--
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 1f474f6..344f0aa 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
@@ -1,69 +1,140 @@
 <head>
   <link rel="import" href="class_ref.html">
   <link rel="import" href="code_ref.html">
+  <link rel="import" href="function_ref.html">
+  <link rel="import" href="library_ref.html">
   <link rel="import" href="observatory_element.html">
   <link rel="import" href="nav_bar.html">
+  <link rel="import" href="script_inset.html">
+  <link rel="import" href="script_ref.html">
 </head>
 <polymer-element name="function-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
-      <template if="{{ function['owner']['type'] == '@Class' }}">
+      <template if="{{ function['owner'].serviceType == 'Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
         <class-nav-menu cls="{{ function['owner'] }}"></class-nav-menu>
       </template>
-      <template if="{{ function['owner']['type'] == '@Library' }}">
+      <template if="{{ function['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
       <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-          {{ function['user_name'] }} ({{ function['name'] }})
-          <class-ref ref="{{ function['class'] }}"></class-ref>
-        </div>
-        <div class="panel-body">
-          <div>
-          <code-ref ref="{{ function['code'] }}"></code-ref>
-          <code-ref ref="{{ function['unoptimized_code'] }}"></code-ref>
+    <div class="content">
+      <h1>function {{ qualifiedName }}</h1>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">kind</div>
+          <div class="memberValue">
+            <template if="{{ function['is_static'] }}">static</template>
+            <template if="{{ function['is_const'] }}">const</template>
+            {{ kind }}
           </div>
-          <table class="table table-hover">
-            <tbody>
-              <tr>
-                <td>static</td><td>{{ function['is_static'] }}</td>
-              </tr>
-              <tr>
-                <td>Const</td><td>{{ function['is_const'] }}</td>
-              </tr>
-              <tr>
-                <td>Optimizable</td><td>{{ function['is_optimizable'] }}</td>
-              </tr>
-              <tr>
-                <td>Inlinable</td><td>{{ function['is_inlinable'] }}</td>
-              </tr>
-              <tr>
-                <td>Kind</td><td>{{ function['kind'] }}</td>
-              </tr>
-              <tr>
-                <td>Usage Count</td><td>{{ function['usage_counter'] }}</td>
-              </tr>
-              <tr>
-                <td>Optimized Call Site Count</td><td>{{ function['optimized_call_site_count'] }}</td>
-              </tr>
-              <tr>
-                <td>Deoptimizations</td><td>{{ function['deoptimizations'] }}</td>
-              </tr>
-            </tbody>
-          </table>
         </div>
-      </div>
+        <template if="{{ function['parent'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">parent function</div>
+            <div class="memberValue">
+              <function-ref ref="{{ function['parent'] }}"></function-ref>
+            </div>
+          </div>
+        </template>
+        <div class="memberItem">
+          <div class="memberName">owner</div>
+          <div class="memberValue">
+            <template if="{{ function['owner'].serviceType == 'Class' }}">
+              <class-ref ref="{{ function['owner'] }}"></class-ref>
+            </template>
+            <template if="{{ function['owner'].serviceType != 'Class' }}">
+              <library-ref ref="{{ function['owner'] }}"></library-ref>
+            </template>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">script</div>
+          <div class="memberValue">
+            <script-ref ref="{{ function['script'] }}"
+                        pos="{{ function['tokenPos'] }}">
+            </script-ref>
+          </div>
+        </div>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ function['code'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">optimized code</div>
+            <div class="memberValue">
+              <code-ref ref="{{ function['code'] }}"></code-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ function['unoptimized_code'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">unoptimized code</div>
+            <div class="memberValue">
+              <code-ref ref="{{ function['unoptimized_code'] }}"></code-ref>
+            </div>
+              <div class="memberValue">
+                <span title="This count is used to determine when a function will be optimized.  It is a combination of call counts and other factors.">
+                  (usage count: {{ function['usage_counter'] }})
+                </span>
+             </div>
+           </div>
+         </template>
+         <div class="memberItem">
+           <div class="memberName">deoptimizations</div>
+           <div class="memberValue">{{ function['deoptimizations'] }}</div>
+         </div>
+         <div class="memberItem">
+           <div class="memberName">optimizable</div>
+           <div class="memberValue">{{ function['is_optimizable'] }}</div>
+         </div>
+         <div class="memberItem">
+           <div class="memberName">inlinable</div>
+           <div class="memberValue">{{ function['is_inlinable'] }}</div>
+         </div>
+         <template if="{{ function.name != function.vmName }}">
+           <div class="memberItem">
+             <div class="memberName">vm name</div>
+             <div class="memberValue">{{ function.vmName }}</div>
+           </div>
+         </template>
+       </div>
     </div>
-  </div>
+
+    <hr>
+    <script-inset script="{{ function['script'] }}" pos="{{ function['tokenPos'] }}" endPos="{{ function['endTokenPos'] }}">
+    </script-inset>
+
+    <br>
   </template>
   <script type="application/dart" src="function_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
index 413ece1..d061d8b 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
@@ -19,7 +19,7 @@
         font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
-    <div>
+    <span>
       <template if="{{ isUnexpected(ref.serviceType) }}">
         unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
@@ -29,24 +29,30 @@
       </template>
 
       <template if="{{ isNull(ref.serviceType) }}">
-        <div title="{{ hoverText }}">{{ ref['preview'] }}</div>
+        <div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
       </template>
 
       <template if="{{ (isString(ref.serviceType) ||
                         isBool(ref.serviceType) ||
                         isInt(ref.serviceType)) ||
                         isDouble(ref.serviceType)) }}">
-        <a href="{{ url }}">{{ ref['preview'] }}</a>
+        <a href="{{ url }}">{{ ref['valueAsString'] }}</a>
       </template>
 
-      <template if="{{ isClosure(ref.serviceType) }}">
+      <template if="{{ (isType(ref.serviceType)) }}">
+        <a href="{{ url }}">{{ ref['user_name'] }}</a>
+      </template>
+
+      <template if="{{ isInstance(ref.serviceType) &&
+                       ref['closureFunc'] != null}}">
         <a href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
           {{ ref['closureFunc']['user_name'] }}
         </a>
       </template>
 
-      <template if="{{ isInstance(ref.serviceType) }}">
+      <template if="{{ isInstance(ref.serviceType) &&
+                       ref['closureFunc'] == null}}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
@@ -79,8 +85,7 @@
           </div>
         </curly-block>
       </template>
-
-    </div>
+    </span>
   </template>
   <script type="application/dart" src="instance_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
index 6c400ca..bcd4fe1 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
@@ -2,7 +2,9 @@
   <link rel="import" href="class_ref.html">
   <link rel="import" href="error_view.html">
   <link rel="import" href="eval_box.html">
+  <link rel="import" href="eval_link.html">
   <link rel="import" href="field_ref.html">
+  <link rel="import" href="function_ref.html">
   <link rel="import" href="instance_ref.html">
   <link rel="import" href="observatory_element.html">
   <link rel="import" href="nav_bar.html">
@@ -47,7 +49,12 @@
     <template if="{{ instance['error'] == null }}">
       <div class="content">
         <!-- TODO(turnidge): Handle null instances. -->
-        <h1>instance of {{ instance['class']['user_name'] }}</h1>
+        <template if="{{ isType(instance.serviceType) }}">
+          <h1>type {{ instance['user_name'] }}</h1>
+        </template>
+        <template if="{{ !isType(instance.serviceType) }}">
+          <h1>instance of {{ instance['class']['user_name'] }}</h1>
+        </template>
         <div class="memberList">
           <div class="memberItem">
             <div class="memberName">class</div>
@@ -56,16 +63,43 @@
               </class-ref>
             </div>
           </div>
-          <template if="{{ instance['preview'] != null }}">
+          <template if="{{ instance['valueAsString'] != null }}">
             <div class="memberItem">
-              <div class="memberName">preview</div>
-              <div class="memberValue">{{ instance['preview'] }}</div>
+              <div class="memberName">value</div>
+              <div class="memberValue">{{ instance['valueAsString'] }}</div>
             </div>
           </template>
           <div class="memberItem">
             <div class="memberName">size</div>
             <div class="memberValue">{{ instance['size'] | formatSize }}</div>
           </div>
+          <template if="{{ instance['type_class'] != null }}">
+            <div class="memberItem">
+              <div class="memberName">type class</div>
+              <div class="memberValue">
+                <class-ref ref="{{ instance['type_class'] }}">
+                </class-ref>
+              </div>
+            </div>
+          </template>
+          <template if="{{ instance['closureFunc'] != null }}">
+            <div class="memberItem">
+              <div class="memberName">closure function</div>
+              <div class="memberValue">
+                <function-ref ref="{{ instance['closureFunc'] }}">
+                </function-ref>
+              </div>
+            </div>
+          </template>
+
+          <div class="memberItem">&nbsp;</div>
+
+          <div class="memberItem">
+            <div class="memberName">toString()</div>
+            <div class="memberValue">
+              <eval-link callback="{{ eval }}" expr="toString()"></eval-link>
+            </div>
+          </div>
         </div>
       </div>
 
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 af6c097..38298ba 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
@@ -81,6 +81,7 @@
             <td on-click="{{toggleExpanded}}"
                 class="{{ coloring(row) }}"
                 style="{{ padding(row) }}">
+              <span id="expand" style="cursor: pointer;">{{ row.expander }}</span>
               <code-ref ref="{{ row.code }}"></code-ref>
             </td>
             <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
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 a1aefc6..8242355 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
@@ -2,6 +2,7 @@
   <link rel="import" href="function_ref.html">
   <link rel="import" href="isolate_ref.html">
   <link rel="import" href="observatory_element.html">
+  <link rel="import" href="script_inset.html">
   <link rel="import" href="script_ref.html">
 </head>
 <polymer-element name="isolate-summary" extends="observatory-element">
@@ -13,9 +14,7 @@
 
       <div class="col-md-1">{{ isolate.mainPort }}</div>
 
-      <!-- TODO(turnidge): Use function-ref when it can take isolate param -->
       <div class="col-md-4">
-
         <div class="row">
           <isolate-ref ref="{{ isolate }}"></isolate-ref>
         </div>
@@ -30,33 +29,6 @@
       </div>
 
       <div class="col-md-2">
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['total'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">total</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['dart'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">dart</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['compile'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">compile</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['gc'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">gc</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['init'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">init</p></div>
-        </div>
-      </div>
-      <div class="col-md-2">
         <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
@@ -72,21 +44,21 @@
         ( <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a> )
       </div>
     </div>
-    <div class="row">
-      <div class="col-md-3">
-      </div>
-      <div class="col-md-6">
-        <template if="{{ isolate.topFrame != null }}">
-          <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
-          (<script-ref ref="{{ isolate.topFrame['script'] }}"
-                       line="{{ isolate.topFrame['line'] }}"></script-ref>)
-          <br>
-          <pre>{{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
-        </template>
-      </div>
-      <div class="col-md-3">
-      </div>
+
+    <div class="content">
+      <template repeat="{{ key in isolate.counters.keys }}">
+        <div class="memberValue">{{ key }} ({{ isolate.counters[key] }})</div>
+      </template>
     </div>
+
+    <template if="{{ isolate.topFrame != null }}">
+      <script-inset script="{{ isolate.topFrame['script'] }}"
+                    pos="{{ isolate.topFrame['tokenPos'] }}">
+        <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
+        (<script-ref ref="{{ isolate.topFrame['script'] }}"
+                     pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+      </script-inset>
+    </template>
   </template>
   <script type="application/dart" src="isolate_summary.dart"></script>
 </polymer-element>
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 f21a82f..2c6a67a 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
@@ -5,6 +5,7 @@
   <link rel="import" href="library_ref.html">
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="observatory_element.html">
+  <link rel="import" href="script_inset.html">
   <link rel="import" href="script_ref.html">
 </head>
 <polymer-element name="isolate-view" extends="observatory-element">
@@ -33,6 +34,9 @@
         padding-left: 15%;
         padding-right: 15%;
       }
+      .miniProfileChart {
+        width: 80%;
+      }
     </style>
 
     <nav-bar>
@@ -68,7 +72,8 @@
               <function-ref ref="{{ isolate.topFrame['function'] }}">
               </function-ref>
               (<script-ref ref="{{ isolate.topFrame['script'] }}"
-                           line="{{ isolate.topFrame['line'] }}"></script-ref>)
+                           pos="{{ isolate.topFrame['tokenPos'] }}">
+              </script-ref>)
             </template>
 
             <template if="{{ isolate.idle }}">
@@ -110,12 +115,12 @@
       <hr>
     </template>
 
+    <br>
+
     <template if="{{ isolate.topFrame != null }}">
-      <br>
-      <div class="sourceInset">
-        <pre>
-          {{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
-      </div>
+      <script-inset script="{{ isolate.topFrame['script'] }}"
+                    pos="{{ isolate.topFrame['tokenPos'] }}">
+      </script-inset>
     </template>
 
     <br>
@@ -201,7 +206,14 @@
     <hr>
 
     <div class="content">
-      <div id="tagProfileChart" class="col-md-8" style="height: 400px"></div>
+      <div class="memberValue">Isolate execution</div>
+      <template repeat="{{ key in isolate.counters.keys }}">
+        <div class="memberValue">{{ key }} ({{ isolate.counters[key] }})</div>
+      </template>
+    </div>
+
+    <div class="content">
+      <div id="tagProfileChart" class="miniProfileChart" style="height: 600px"></div>
     </div>
 
     <hr>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html
index 1b3cad8..f7e42ff 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html
@@ -1,33 +1,11 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
 <polymer-element name="json-view" extends="observatory-element">
   <template>
-    <template bind if="{{ valueType == 'Primitive' }}">
-      <span>{{primitiveString}}</span>
-    </template>
-    <template bind if="{{ valueType == 'List' }}">
-      <table class="table table-condensed table-bordered">
-        <caption class="text-left">List, {{list.length}}</caption>
-        <tbody>
-          <tr template repeat="{{item in list)}}">
-            <th>{{counter}}</th>
-            <td><json-view json="{{item}}"></json-view></td>
-          </tr>
-        </tbody>
-      </table>
-    </template>
-    <template if="{{ valueType == 'Map' }}">
-      <table class="table table-condensed table-bordered">
-        <caption class="text-left">Map, {{keys.length}}</caption>
-        <tbody>
-          <tr template repeat="{{key in keys}}">
-            <th>{{key}}</th>
-            <td><json-view json="{{value(key)}}"></json-view></td>
-          </tr>
-        </tbody>
-      </table>
-    </template>
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+    </nav-bar>
+      <pre>{{ mapAsString }}</pre>
   </template>
   <script type="application/dart" src="json_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html
new file mode 100644
index 0000000..e4023b4
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html
@@ -0,0 +1,48 @@
+<head>
+  <link rel="import" href="observatory_element.html">
+</head>
+<polymer-element name="script-inset" extends="observatory-element">
+  <template>
+    <style>
+      .sourceInset {
+        padding-left: 15%;
+        padding-right: 15%;
+      }
+      .grayBox {
+        width: 100%;
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+     }
+    </style>
+    <div class="sourceInset">
+      <content></content>
+      <div class="grayBox">
+        <template if="{{ coverage == true }}">
+          <table>
+            <tbody>
+              <tr template repeat="{{ line in lines }}">
+                <td style="{{ hitStyle(line) }}"><span>  </span></td>
+                <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
+                <td>&nbsp;</td>
+                <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
+              </tr>
+            </tbody>
+          </table>
+        </template>
+        <template if="{{ coverage == false }}">
+          <table>
+            <tbody>
+              <tr template repeat="{{ line in lines }}">
+                <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
+                <td>&nbsp;</td>
+                <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
+              </tr>
+            </tbody>
+          </table>
+        </template>
+      </div>
+    </div>
+  </template>
+  <script type="application/dart" src="script_inset.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
index ef6b4a7..c251423 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
@@ -1,6 +1,7 @@
 <head>
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="observatory_element.html">
+  <link rel="import" href="script_inset.html">
 </head>
 <polymer-element name="script-view" extends="observatory-element">
 <template>
@@ -20,22 +21,9 @@
     </nav-refresh>
   </nav-bar>
 
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel-heading">Script source for: {{ script.name }}</div>
-      <div class="panel-body">
-        <table style="width:100%">
-          <tbody>
-          <tr template repeat="{{ line in script.lines }}">
-            <td style="{{ hitsStyle(line) }}">  </td>
-            <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
-            <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
-          </tr>
-          </tbody>
-        </table>
-      </div>
-    </div>
-  </div>
+  <script-inset id="scriptInset" script="{{ script }}" pos="{{ script.firstTokenPos }}" endPos="{{ script.lastTokenPos }}">
+  <h1>script {{ script.name }}</h1>
+  </script-inset>
 </template>
 <script type="application/dart" src="script_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html
index a965765..86ba979 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html
@@ -28,7 +28,8 @@
       </div>
       <div class="col-md-9">
         <function-ref ref="{{ frame['function'] }}"></function-ref>
-        ( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
+        ( <script-ref ref="{{ frame['script'] }}"
+                      pos="{{ frame['tokenPos'] }}">
         </script-ref> )
 
         <curly-block>
diff --git a/runtime/bin/vmservice/client/lib/elements.dart b/runtime/bin/vmservice/client/lib/elements.dart
index 27e33c3..9b77a35 100644
--- a/runtime/bin/vmservice/client/lib/elements.dart
+++ b/runtime/bin/vmservice/client/lib/elements.dart
@@ -10,6 +10,7 @@
 export 'package:observatory/src/elements/curly_block.dart';
 export 'package:observatory/src/elements/error_view.dart';
 export 'package:observatory/src/elements/eval_box.dart';
+export 'package:observatory/src/elements/eval_link.dart';
 export 'package:observatory/src/elements/field_ref.dart';
 export 'package:observatory/src/elements/field_view.dart';
 export 'package:observatory/src/elements/function_ref.dart';
@@ -28,6 +29,7 @@
 export 'package:observatory/src/elements/nav_bar.dart';
 export 'package:observatory/src/elements/observatory_application.dart';
 export 'package:observatory/src/elements/response_viewer.dart';
+export 'package:observatory/src/elements/script_inset.dart';
 export 'package:observatory/src/elements/script_ref.dart';
 export 'package:observatory/src/elements/script_view.dart';
 export 'package:observatory/src/elements/service_ref.dart';
diff --git a/runtime/bin/vmservice/client/lib/elements.html b/runtime/bin/vmservice/client/lib/elements.html
index 3463855..c31adc5 100644
--- a/runtime/bin/vmservice/client/lib/elements.html
+++ b/runtime/bin/vmservice/client/lib/elements.html
@@ -10,6 +10,7 @@
   <link rel="import" href="src/elements/collapsible_content.html">
   <link rel="import" href="src/elements/error_view.html">
   <link rel="import" href="src/elements/eval_box.html">
+  <link rel="import" href="src/elements/eval_link.html">
   <link rel="import" href="src/elements/field_ref.html">
   <link rel="import" href="src/elements/field_view.html">
   <link rel="import" href="src/elements/function_ref.html">
@@ -27,6 +28,7 @@
   <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">
   <link rel="import" href="src/elements/service_ref.html">
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 3071571..b541bf3 100644
--- a/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
@@ -18,8 +18,14 @@
       // Request the current anchor.
       requestCurrentHash();
     });
-    // Set the default hash.
-    window.location.hash = defaultHash;
+
+    if (window.location.hash == '') {
+      // Fresh start, load the vm page.
+      window.location.hash = defaultHash;
+    } else {
+      // The page is being reloaded.
+      requestCurrentHash();
+    }
   }
 
   /// Clear the current hash.
diff --git a/runtime/bin/vmservice/client/lib/src/app/view_model.dart b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
index dda6c81..3be79ea 100644
--- a/runtime/bin/vmservice/client/lib/src/app/view_model.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
@@ -9,6 +9,11 @@
   @observable final int depth;
   @observable final List<TableTreeRow> children = new List<TableTreeRow>();
   @observable final List<String> columns = [];
+  static const arrowRight = '\u2192';
+  static const arrowDownRight = '\u21b3';
+  // TODO(johnmccutchan): Move expander display decisions into html once
+  // tables and templates are better supported.
+  @observable String expander = arrowRight;
 
   TableTreeRow(TableTreeRow parent) :
       parent = parent,
@@ -22,8 +27,10 @@
     if (changed) {
       // If the state has changed, fire callbacks.
       if (_expanded) {
+        expander = arrowDownRight;
         onShow();
       } else {
+        expander = arrowRight;
         onHide();
       }
     }
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 09ab85e..3001d69 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -61,7 +61,7 @@
         <div class="memberItem">
           <div class="memberName">script</div>
           <div class="memberValue">
-            <script-ref ref="{{ cls['script'] }}" line="{{ cls['line'] }}">
+            <script-ref ref="{{ cls['script'] }}" pos="{{ cls['tokenPos'] }}">
             </script-ref>
           </div>
         </div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/code_ref.dart
index 47103d3..488bebc 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_ref.dart
@@ -6,8 +6,16 @@
 
 import 'package:polymer/polymer.dart';
 import 'service_ref.dart';
+import 'package:observatory/service.dart';
 
 @CustomTag('code-ref')
 class CodeRefElement extends ServiceRefElement {
+  @observable Code get code => ref;
+
+  refChanged(oldValue) {
+    super.refChanged(oldValue);
+    notifyPropertyChange(#code, 0, 1);
+  }
+
   CodeRefElement.created() : super.created();
 }
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 48a7d37..be5f8b5 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
@@ -1,9 +1,14 @@
 <head>
-<link rel="import" href="service_ref.html">
+  <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="code-ref" extends="service-ref">
-<template>
-  <a href="{{ url }}">{{ name }}</a>
-</template>
+  <template>
+    <template if="{{ code.isDartCode }}">
+      <a href="{{ url }}">{{ name }}</a>
+    </template>
+    <template if="{{ !code.isDartCode }}">
+      <span>{{ name }}</span>
+    </template>
+  </template>
 <script type="application/dart" src="code_ref.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/eval_link.dart b/runtime/bin/vmservice/client/lib/src/elements/eval_link.dart
new file mode 100644
index 0000000..be08b76
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_link.dart
@@ -0,0 +1,33 @@
+// 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 eval_link_element;
+
+import 'package:observatory/service.dart';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('eval-link')
+class EvalLinkElement extends PolymerElement {
+  EvalLinkElement.created() : super.created();
+
+  @observable bool busy = false;
+  @published var callback = null;
+  @published String expr = '';
+  @published ServiceObject result = null;
+
+  void evalNow(var a, var b, var c) {
+    if (busy) {
+      return;
+    }
+    if (callback != null) {
+      busy = true;
+      result = null;
+      callback(expr).then((ServiceObject obj) {
+          result = obj;
+        }).whenComplete(() {
+          busy = false;
+        });
+    }
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/eval_link.html b/runtime/bin/vmservice/client/lib/src/elements/eval_link.html
new file mode 100644
index 0000000..8de2c84
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_link.html
@@ -0,0 +1,29 @@
+<head>
+  <link rel="import" href="instance_ref.html">
+</head>
+<polymer-element name="eval-link">
+  <template>
+    <style>
+      .idle {
+        color: #0489c3;
+        cursor: pointer;
+      }
+      .busy {
+        color: #aaa;
+        cursor: wait;
+      }
+    </style>
+
+    <template if="{{ busy }}">
+      <span class="busy">[evaluate]</span>
+    </template>
+    <template if="{{ !busy }}">
+      <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
+    </template>
+    <template if="{{ result != null }}">
+      = <instance-ref ref="{{ result }}"></instance-ref>
+    </template>
+
+  </template>
+  <script type="application/dart" src="eval_link.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_ref.html b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
index 179b4918..9e5f896 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
@@ -1,19 +1,23 @@
 <head>
-<link rel="import" href="class_ref.html">
+<link rel="import" href="instance_ref.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="field-ref" extends="service-ref">
-<template>
-<div>
-  <template if="{{ ref['final'] }}"> final </template>
-  <template if="{{ ref['const'] }}"> const </template>
-  <template if="{{ (ref['declared_type']['name'] == 'dynamic' && !ref['final'] && !ref['const']) }}">
-  var
+  <template>
+    <div>
+      <template if="{{ ref['static'] }}">static</template>
+      <template if="{{ ref['final'] }}">final</template>
+      <template if="{{ ref['const'] }}">const</template>
+      <template if="{{ (ref['declared_type']['name'] == 'dynamic' &&
+                        !ref['final'] && !ref['const']) }}">
+        var
+      </template>
+      <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
+        <instance-ref ref="{{ ref['declared_type'] }}"></instance-ref>
+      </template>
+      <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+    </div>
   </template>
-  <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
-  </template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</div>
-</template> <script type="application/dart" src="field_ref.dart"></script> </polymer-element>
\ No newline at end of file
+  <script type="application/dart" src="field_ref.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_view.dart b/runtime/bin/vmservice/client/lib/src/elements/field_view.dart
index 4f33992..c3b4b34 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_view.dart
@@ -16,4 +16,4 @@
   void refresh(var done) {
     field.reload().whenComplete(done);
   }
-}
\ No newline at end of file
+}
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 8857d5e0..d190acf 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
@@ -1,10 +1,35 @@
 <head>
   <link rel="import" href="class_ref.html">
+  <link rel="import" href="instance_ref.html">
+  <link rel="import" href="library_ref.html">
   <link rel="import" href="nav_bar.html">
+  <link rel="import" href="script_ref.html">
   <link rel="import" href="observatory_element.html">
 </head>
 <polymer-element name="field-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
@@ -19,40 +44,72 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-          <template if="{{ field['static'] }}">static</template>
-          <template if="{{ field['final'] }}">final</template>
-          <template if="{{ field['const'] }}">const</template>
-          {{ field['user_name'] }} ({{ field['name'] }})
-          <class-ref ref="{{ field['owner'] }}"></class-ref>
+    <div class="content">
+      <h1>
+        <template if="{{ field['static'] }}">static</template>
+        <template if="{{ field['final'] }}">final</template>
+        <template if="{{ field['const'] }}">const</template>
+        <template if="{{ (field['declared_type']['name'] == 'dynamic' &&
+                         !field['final'] && !field['const']) }}">
+          var
+        </template>
+        <template if="{{ (field['declared_type']['user_name'] != 'dynamic') }}">
+          {{ field['declared_type']['user_name'] }}
+        </template>
+        {{ field['user_name'] }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">owner</div>
+          <div class="memberValue">
+            <template if="{{ field['owner'].serviceType == 'Class' }}">
+              <class-ref ref="{{ field['owner'] }}"></class-ref>
+            </template>
+            <template if="{{ field['owner'].serviceType != 'Class' }}">
+              <library-ref ref="{{ field['owner'] }}"></library-ref>
+            </template>
+          </div>
         </div>
-        <div class="panel-body">
-        <template if="{{ field['guard_class'] == 'dynamic'}}">
-          <div class="alert alert-danger">
-            Field has been assigned multiple types. If a field is only ever
-            assigned a single type, performance may improve.
+        <div class="memberItem">
+          <div class="memberName">script</div>
+          <div class="memberValue">
+            <script-ref ref="{{ field['script'] }}"></script-ref>
+          </div>
+        </div>
+        <template if="{{ !field['static'] }}">
+          <div class="memberItem"
+               title="The types observed for this field at runtime.  Fields that are observed to have a single type at runtime or to never be null may allow for additional optimization.">
+            <div class="memberName">observed types</div>
+            <div class="memberValue">
+              <template if="{{ field['guard_class'] == 'dynamic' }}">
+                various
+              </template>
+              <template if="{{ field['guard_class'] == 'unknown' }}">
+                none
+              </template>
+              <template if="{{ field['guard_class'] != 'unknown' &&
+                            field['guard_class'] != 'dynamic' }}">
+                <class-ref ref="{{ field['guard_class'] }}"></class-ref>
+                <template if="{{ field['guard_nullable'] }}">
+                  &mdash; null observed
+                </template>
+                <template if="{{ !field['guard_nullable'] }}">
+                  &mdash; null not observed
+                </template>
+              </template>
+            </div>
           </div>
         </template>
-        <template if="{{ (field['guard_class'] != 'dynamic') && (field['guard_class'] != 'unknown') }}">
-          <div class="alert alert-success">Field has monomorphic type</div>
-          <template if="{{ (field['guard_class'] != 'dynamic') &&
-                        field['guard_nullable'] }}">
-            <div class="alert alert-info">
-              Field has been assigned null. If a field is never assigned null,
-              performance may improve.
+        <template if="{{ field['value'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">static value</div>
+            <div class="memberValue">
+              <instance-ref ref="{{ field['value'] }}"></instance-ref>
             </div>
-          </template>
-          <blockquote>
-            <class-ref ref="{{ field['guard_class'] }}"></class-ref>
-          </blockquote>
+          </div>
         </template>
-        </div>
       </div>
     </div>
-  </div>
   </template>
   <script type="application/dart" src="field_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart
index c88333b..4ea737e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart
@@ -19,9 +19,8 @@
     ServiceMap refMap = ref;
     hasParent = (refMap != null && refMap['parent'] != null);
     hasClass = (refMap != null &&
-                refMap['class'] != null &&
-                refMap['class']['name'] != null &&
-                refMap['class']['name'] != '::');
+                refMap['owner'] != null &&
+                refMap['owner'].serviceType == 'Class');
   }
 
   @observable bool hasParent = false;
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 2760ab0..65955af 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
@@ -5,7 +5,7 @@
 <polymer-element name="function-ref" extends="service-ref">
   <template><!-- These comments are here to allow newlines.
      --><template if="{{ qualified && !hasParent && hasClass }}"><!--
-       --><class-ref ref="{{ ref['class'] }}"></class-ref>.</template><!--
+       --><class-ref ref="{{ ref['owner'] }}"></class-ref>.</template><!--
      --><template if="{{ qualified && hasParent }}"><!--
        --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
           </function-ref>.<!--
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_view.dart b/runtime/bin/vmservice/client/lib/src/elements/function_view.dart
index 1c3620c..3f94ce4 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.dart
@@ -14,7 +14,75 @@
   @published ServiceMap function;
   FunctionViewElement.created() : super.created();
 
+  // TODO(turnidge): Once we create a Function object, these fields
+  // should move there.
+  @published String qualifiedName;
+  @published String kind;
+
+  String _getQualifiedName(ServiceMap function) {
+    var parent = (function != null && function['parent'] != null
+                  ? function['parent'] : null);
+    if (parent != null) {
+      return "${_getQualifiedName(parent)}.${function['user_name']}";
+    }
+    var cls = (function != null &&
+               function['owner'] != null &&
+               function['owner'].serviceType == 'Class'
+               ? function['owner'] : null);
+    if (cls != null) {
+      return "${cls['user_name']}.${function['user_name']}";
+    }
+    return "${function['user_name']}";
+  }
+
+  void functionChanged(oldValue) {
+    notifyPropertyChange(#qualifiedName, 0, 1);
+    notifyPropertyChange(#kind, 0, 1);
+    qualifiedName = _getQualifiedName(function);
+    switch(function['kind']) {
+      case 'kRegularFunction':
+        kind = 'function';
+        break;
+      case 'kClosureFunction':
+        kind = 'closure function';
+        break;
+      case 'kSignatureFunction':
+        kind = 'signature function';
+        break;
+      case 'kGetterFunction':
+        kind = 'getter function';
+        break;
+      case 'kSetterFunction':
+        kind = 'setter function';
+        break;
+      case 'kConstructor':
+        kind = 'constructor';
+        break;
+      case 'kImplicitGetterFunction':
+        kind = 'implicit getter function';
+        break;
+      case 'kImplicitSetterFunction':
+        kind = 'implicit setter function';
+        break;
+      case 'kStaticInitializer':
+        kind = 'static initializer';
+        break;
+      case 'kMethodExtractor':
+        kind = 'method extractor';
+        break;
+      case 'kNoSuchMethodDispatcher':
+        kind = 'noSuchMethod dispatcher';
+        break;
+      case 'kInvokeFieldDispatcher':
+        kind = 'invoke field dispatcher';
+        break;
+      default:
+        kind = 'UNKNOWN';
+        break;
+    }
+  }
+
   void refresh(var done) {
     function.reload().whenComplete(done);
   }
-}
\ No newline at end of file
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_view.html b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
index 1f474f6..344f0aa 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
@@ -1,69 +1,140 @@
 <head>
   <link rel="import" href="class_ref.html">
   <link rel="import" href="code_ref.html">
+  <link rel="import" href="function_ref.html">
+  <link rel="import" href="library_ref.html">
   <link rel="import" href="observatory_element.html">
   <link rel="import" href="nav_bar.html">
+  <link rel="import" href="script_inset.html">
+  <link rel="import" href="script_ref.html">
 </head>
 <polymer-element name="function-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
-      <template if="{{ function['owner']['type'] == '@Class' }}">
+      <template if="{{ function['owner'].serviceType == 'Class' }}">
         <!-- TODO(turnidge): Add library nav menu here. -->
         <class-nav-menu cls="{{ function['owner'] }}"></class-nav-menu>
       </template>
-      <template if="{{ function['owner']['type'] == '@Library' }}">
+      <template if="{{ function['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
       <nav-menu link="." anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-          {{ function['user_name'] }} ({{ function['name'] }})
-          <class-ref ref="{{ function['class'] }}"></class-ref>
-        </div>
-        <div class="panel-body">
-          <div>
-          <code-ref ref="{{ function['code'] }}"></code-ref>
-          <code-ref ref="{{ function['unoptimized_code'] }}"></code-ref>
+    <div class="content">
+      <h1>function {{ qualifiedName }}</h1>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">kind</div>
+          <div class="memberValue">
+            <template if="{{ function['is_static'] }}">static</template>
+            <template if="{{ function['is_const'] }}">const</template>
+            {{ kind }}
           </div>
-          <table class="table table-hover">
-            <tbody>
-              <tr>
-                <td>static</td><td>{{ function['is_static'] }}</td>
-              </tr>
-              <tr>
-                <td>Const</td><td>{{ function['is_const'] }}</td>
-              </tr>
-              <tr>
-                <td>Optimizable</td><td>{{ function['is_optimizable'] }}</td>
-              </tr>
-              <tr>
-                <td>Inlinable</td><td>{{ function['is_inlinable'] }}</td>
-              </tr>
-              <tr>
-                <td>Kind</td><td>{{ function['kind'] }}</td>
-              </tr>
-              <tr>
-                <td>Usage Count</td><td>{{ function['usage_counter'] }}</td>
-              </tr>
-              <tr>
-                <td>Optimized Call Site Count</td><td>{{ function['optimized_call_site_count'] }}</td>
-              </tr>
-              <tr>
-                <td>Deoptimizations</td><td>{{ function['deoptimizations'] }}</td>
-              </tr>
-            </tbody>
-          </table>
         </div>
-      </div>
+        <template if="{{ function['parent'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">parent function</div>
+            <div class="memberValue">
+              <function-ref ref="{{ function['parent'] }}"></function-ref>
+            </div>
+          </div>
+        </template>
+        <div class="memberItem">
+          <div class="memberName">owner</div>
+          <div class="memberValue">
+            <template if="{{ function['owner'].serviceType == 'Class' }}">
+              <class-ref ref="{{ function['owner'] }}"></class-ref>
+            </template>
+            <template if="{{ function['owner'].serviceType != 'Class' }}">
+              <library-ref ref="{{ function['owner'] }}"></library-ref>
+            </template>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">script</div>
+          <div class="memberValue">
+            <script-ref ref="{{ function['script'] }}"
+                        pos="{{ function['tokenPos'] }}">
+            </script-ref>
+          </div>
+        </div>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ function['code'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">optimized code</div>
+            <div class="memberValue">
+              <code-ref ref="{{ function['code'] }}"></code-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ function['unoptimized_code'] != null }}">
+          <div class="memberItem">
+            <div class="memberName">unoptimized code</div>
+            <div class="memberValue">
+              <code-ref ref="{{ function['unoptimized_code'] }}"></code-ref>
+            </div>
+              <div class="memberValue">
+                <span title="This count is used to determine when a function will be optimized.  It is a combination of call counts and other factors.">
+                  (usage count: {{ function['usage_counter'] }})
+                </span>
+             </div>
+           </div>
+         </template>
+         <div class="memberItem">
+           <div class="memberName">deoptimizations</div>
+           <div class="memberValue">{{ function['deoptimizations'] }}</div>
+         </div>
+         <div class="memberItem">
+           <div class="memberName">optimizable</div>
+           <div class="memberValue">{{ function['is_optimizable'] }}</div>
+         </div>
+         <div class="memberItem">
+           <div class="memberName">inlinable</div>
+           <div class="memberValue">{{ function['is_inlinable'] }}</div>
+         </div>
+         <template if="{{ function.name != function.vmName }}">
+           <div class="memberItem">
+             <div class="memberName">vm name</div>
+             <div class="memberValue">{{ function.vmName }}</div>
+           </div>
+         </template>
+       </div>
     </div>
-  </div>
+
+    <hr>
+    <script-inset script="{{ function['script'] }}" pos="{{ function['tokenPos'] }}" endPos="{{ function['endTokenPos'] }}">
+    </script-inset>
+
+    <br>
   </template>
   <script type="application/dart" src="function_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
index cc9c8fe..cd64321 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
@@ -241,7 +241,8 @@
     if (profile == null) {
       return;
     }
-    profile.isolate.get('/allocationprofile/reset').then((ServiceMap response) {
+    var isolate = profile.isolate;
+    isolate.get('/allocationprofile?reset=true').then((ServiceMap response) {
       assert(response['type'] == 'AllocationProfile');
       profile = response;
     }).catchError((e, st) {
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.dart
index c97e484..4fddfbb 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.dart
@@ -40,9 +40,9 @@
     assert(ref is ServiceMap);
     if (expand) {
       ref.reload().then((result) {
-        if (result['preview'] != null) {
-          result.name = result['preview'];
-          result.vmName = result['preview'];
+        if (result['valueAsString'] != null) {
+          result.name = result['valueAsString'];
+          result.vmName = result['valueAsString'];
         }
         ref = result;
         notifyPropertyChange(#ref, 0, 1);
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 413ece1..d061d8b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -19,7 +19,7 @@
         font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
-    <div>
+    <span>
       <template if="{{ isUnexpected(ref.serviceType) }}">
         unexpected reference type &lt;{{ ref.serviceType }}&gt;
       </template>
@@ -29,24 +29,30 @@
       </template>
 
       <template if="{{ isNull(ref.serviceType) }}">
-        <div title="{{ hoverText }}">{{ ref['preview'] }}</div>
+        <div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
       </template>
 
       <template if="{{ (isString(ref.serviceType) ||
                         isBool(ref.serviceType) ||
                         isInt(ref.serviceType)) ||
                         isDouble(ref.serviceType)) }}">
-        <a href="{{ url }}">{{ ref['preview'] }}</a>
+        <a href="{{ url }}">{{ ref['valueAsString'] }}</a>
       </template>
 
-      <template if="{{ isClosure(ref.serviceType) }}">
+      <template if="{{ (isType(ref.serviceType)) }}">
+        <a href="{{ url }}">{{ ref['user_name'] }}</a>
+      </template>
+
+      <template if="{{ isInstance(ref.serviceType) &&
+                       ref['closureFunc'] != null}}">
         <a href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
           {{ ref['closureFunc']['user_name'] }}
         </a>
       </template>
 
-      <template if="{{ isInstance(ref.serviceType) }}">
+      <template if="{{ isInstance(ref.serviceType) &&
+                       ref['closureFunc'] == null}}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
@@ -79,8 +85,7 @@
           </div>
         </curly-block>
       </template>
-
-    </div>
+    </span>
   </template>
   <script type="application/dart" src="instance_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
index 6c400ca..bcd4fe1 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -2,7 +2,9 @@
   <link rel="import" href="class_ref.html">
   <link rel="import" href="error_view.html">
   <link rel="import" href="eval_box.html">
+  <link rel="import" href="eval_link.html">
   <link rel="import" href="field_ref.html">
+  <link rel="import" href="function_ref.html">
   <link rel="import" href="instance_ref.html">
   <link rel="import" href="observatory_element.html">
   <link rel="import" href="nav_bar.html">
@@ -47,7 +49,12 @@
     <template if="{{ instance['error'] == null }}">
       <div class="content">
         <!-- TODO(turnidge): Handle null instances. -->
-        <h1>instance of {{ instance['class']['user_name'] }}</h1>
+        <template if="{{ isType(instance.serviceType) }}">
+          <h1>type {{ instance['user_name'] }}</h1>
+        </template>
+        <template if="{{ !isType(instance.serviceType) }}">
+          <h1>instance of {{ instance['class']['user_name'] }}</h1>
+        </template>
         <div class="memberList">
           <div class="memberItem">
             <div class="memberName">class</div>
@@ -56,16 +63,43 @@
               </class-ref>
             </div>
           </div>
-          <template if="{{ instance['preview'] != null }}">
+          <template if="{{ instance['valueAsString'] != null }}">
             <div class="memberItem">
-              <div class="memberName">preview</div>
-              <div class="memberValue">{{ instance['preview'] }}</div>
+              <div class="memberName">value</div>
+              <div class="memberValue">{{ instance['valueAsString'] }}</div>
             </div>
           </template>
           <div class="memberItem">
             <div class="memberName">size</div>
             <div class="memberValue">{{ instance['size'] | formatSize }}</div>
           </div>
+          <template if="{{ instance['type_class'] != null }}">
+            <div class="memberItem">
+              <div class="memberName">type class</div>
+              <div class="memberValue">
+                <class-ref ref="{{ instance['type_class'] }}">
+                </class-ref>
+              </div>
+            </div>
+          </template>
+          <template if="{{ instance['closureFunc'] != null }}">
+            <div class="memberItem">
+              <div class="memberName">closure function</div>
+              <div class="memberValue">
+                <function-ref ref="{{ instance['closureFunc'] }}">
+                </function-ref>
+              </div>
+            </div>
+          </template>
+
+          <div class="memberItem">&nbsp;</div>
+
+          <div class="memberItem">
+            <div class="memberName">toString()</div>
+            <div class="memberValue">
+              <eval-link callback="{{ eval }}" expr="toString()"></eval-link>
+            </div>
+          </div>
         </div>
       </div>
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
index 14391e1..3e7322e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
@@ -234,11 +234,17 @@
   }
 
   @observable void toggleExpanded(Event e, var detail, Element target) {
+    // We only want to expand a tree row if the target of the click is
+    // the table cell (passed in as target) or the span containing the
+    // expander symbol (#expand).
+    if ((e.target.id != 'expand') && (e.target != target)) {
+      // Target of click was not the expander span or the table cell.
+      return;
+    }
     var row = target.parent;
     if (row is TableRowElement) {
       // Subtract 1 to get 0 based indexing.
       tree.toggle(row.rowIndex - 1);
     }
   }
-
 }
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 af6c097..38298ba 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
@@ -81,6 +81,7 @@
             <td on-click="{{toggleExpanded}}"
                 class="{{ coloring(row) }}"
                 style="{{ padding(row) }}">
+              <span id="expand" style="cursor: pointer;">{{ row.expander }}</span>
               <code-ref ref="{{ row.code }}"></code-ref>
             </td>
             <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
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 a1aefc6..8242355 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
@@ -2,6 +2,7 @@
   <link rel="import" href="function_ref.html">
   <link rel="import" href="isolate_ref.html">
   <link rel="import" href="observatory_element.html">
+  <link rel="import" href="script_inset.html">
   <link rel="import" href="script_ref.html">
 </head>
 <polymer-element name="isolate-summary" extends="observatory-element">
@@ -13,9 +14,7 @@
 
       <div class="col-md-1">{{ isolate.mainPort }}</div>
 
-      <!-- TODO(turnidge): Use function-ref when it can take isolate param -->
       <div class="col-md-4">
-
         <div class="row">
           <isolate-ref ref="{{ isolate }}"></isolate-ref>
         </div>
@@ -30,33 +29,6 @@
       </div>
 
       <div class="col-md-2">
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['total'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">total</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['dart'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">dart</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['compile'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">compile</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['gc'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">gc</p></div>
-        </div>
-        <div class="row">
-          <div class="col-md-5">{{ isolate.timers['init'] | formatTimePrecise }}</div>
-          <div class="col-md-1"></div>
-          <div class="col-md-3"><p class="text-muted">init</p></div>
-        </div>
-      </div>
-      <div class="col-md-2">
         <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
@@ -72,21 +44,21 @@
         ( <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a> )
       </div>
     </div>
-    <div class="row">
-      <div class="col-md-3">
-      </div>
-      <div class="col-md-6">
-        <template if="{{ isolate.topFrame != null }}">
-          <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
-          (<script-ref ref="{{ isolate.topFrame['script'] }}"
-                       line="{{ isolate.topFrame['line'] }}"></script-ref>)
-          <br>
-          <pre>{{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
-        </template>
-      </div>
-      <div class="col-md-3">
-      </div>
+
+    <div class="content">
+      <template repeat="{{ key in isolate.counters.keys }}">
+        <div class="memberValue">{{ key }} ({{ isolate.counters[key] }})</div>
+      </template>
     </div>
+
+    <template if="{{ isolate.topFrame != null }}">
+      <script-inset script="{{ isolate.topFrame['script'] }}"
+                    pos="{{ isolate.topFrame['tokenPos'] }}">
+        <function-ref ref="{{ isolate.topFrame['function'] }}"></function-ref>
+        (<script-ref ref="{{ isolate.topFrame['script'] }}"
+                     pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>)
+      </script-inset>
+    </template>
   </template>
   <script type="application/dart" src="isolate_summary.dart"></script>
 </polymer-element>
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 f21a82f..2c6a67a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
@@ -5,6 +5,7 @@
   <link rel="import" href="library_ref.html">
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="observatory_element.html">
+  <link rel="import" href="script_inset.html">
   <link rel="import" href="script_ref.html">
 </head>
 <polymer-element name="isolate-view" extends="observatory-element">
@@ -33,6 +34,9 @@
         padding-left: 15%;
         padding-right: 15%;
       }
+      .miniProfileChart {
+        width: 80%;
+      }
     </style>
 
     <nav-bar>
@@ -68,7 +72,8 @@
               <function-ref ref="{{ isolate.topFrame['function'] }}">
               </function-ref>
               (<script-ref ref="{{ isolate.topFrame['script'] }}"
-                           line="{{ isolate.topFrame['line'] }}"></script-ref>)
+                           pos="{{ isolate.topFrame['tokenPos'] }}">
+              </script-ref>)
             </template>
 
             <template if="{{ isolate.idle }}">
@@ -110,12 +115,12 @@
       <hr>
     </template>
 
+    <br>
+
     <template if="{{ isolate.topFrame != null }}">
-      <br>
-      <div class="sourceInset">
-        <pre>
-          {{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
-      </div>
+      <script-inset script="{{ isolate.topFrame['script'] }}"
+                    pos="{{ isolate.topFrame['tokenPos'] }}">
+      </script-inset>
     </template>
 
     <br>
@@ -201,7 +206,14 @@
     <hr>
 
     <div class="content">
-      <div id="tagProfileChart" class="col-md-8" style="height: 400px"></div>
+      <div class="memberValue">Isolate execution</div>
+      <template repeat="{{ key in isolate.counters.keys }}">
+        <div class="memberValue">{{ key }} ({{ isolate.counters[key] }})</div>
+      </template>
+    </div>
+
+    <div class="content">
+      <div id="tagProfileChart" class="miniProfileChart" style="height: 600px"></div>
     </div>
 
     <hr>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/json_view.dart b/runtime/bin/vmservice/client/lib/src/elements/json_view.dart
index 8aca30d..26b6954 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/json_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/json_view.dart
@@ -6,55 +6,90 @@
 
 import 'package:polymer/polymer.dart';
 import 'observatory_element.dart';
+import 'package:observatory/service.dart';
+
+class JsonPrettyPrinter {
+  String prettyPrint(ServiceMap map) {
+    _buffer.clear();
+    _buffer.write('{\n');
+    _printMap(map, 0);
+    _buffer.write('}\n');
+    return _buffer.toString();
+  }
+
+  void _printMap(ObservableMap map, int depth) {
+    if (_seen.contains(map)) {
+      return;
+    }
+    _seen.add(map);
+    for (var k in map.keys) {
+      var v = map[k];
+      if (v is Map) {
+        _writeIndent(depth);
+        _buffer.write('"$k": {\n');
+        _printMap(v, depth + 1);
+        _writeIndent(depth);
+        _buffer.write('}\n');
+      } else if (v is List) {
+        _writeIndent(depth);
+        _buffer.write('"$k": [\n');
+        _printList(v, depth + 1);
+        _writeIndent(depth);
+        _buffer.write(']\n');
+      } else {
+        _writeIndent(depth);
+        _buffer.write('"$k": $v');
+        _buffer.write('\n');
+      }
+    }
+    _seen.remove(map);
+  }
+
+  void _printList(ObservableList list, int depth) {
+    if (_seen.contains(list)) {
+      return;
+    }
+    _seen.add(list);
+    for (var v in list) {
+      if (v is Map) {
+        _writeIndent(depth);
+        _buffer.write('{\n');
+        _printMap(v, depth + 1);
+        _writeIndent(depth);
+        _buffer.write('}\n');
+      } else if (v is List) {
+        _writeIndent(depth);
+        _buffer.write('[\n');
+        _printList(v, depth + 1);
+        _writeIndent(depth);
+        _buffer.write(']\n');
+      } else {
+        _writeIndent(depth);
+        _buffer.write(v);
+        _buffer.write('\n');
+      }
+    }
+    _seen.remove(list);
+  }
+
+  void _writeIndent(int depth) {
+    const tab = '  ';  // 2 spaces.
+    _buffer.write(depth * tab);
+  }
+
+  final _buffer = new StringBuffer();
+  final _seen = new Set();
+}
+
 
 @CustomTag('json-view')
 class JsonViewElement extends ObservatoryElement {
-  @published var json = null;
-  var _count = 0;
-
+  @published ServiceMap map;
+  @observable String mapAsString;
   JsonViewElement.created() : super.created();
 
-  void enteredView() {
-    super.enteredView();
-    _count = 0;
-  }
-
-  void jsonChanged(oldValue) {
-    notifyPropertyChange(#valueType, "a", "b");
-  }
-
-  String get primitiveString {
-    return json.toString();
-  }
-
-  String get valueType {
-    if (json is Map) {
-      return 'Map';
-    } else if (json is List) {
-      return 'List';
-    }
-    return 'Primitive';
-  }
-
-  int get counter {
-    return _count++;
-  }
-
-  List get list {
-    if (json is List) {
-      return json;
-    }
-    return [];
-  }
-
-  List get keys {
-    if (json is Map) {
-      return json.keys.toList();
-    }
-    return [];
-  }
-
-  dynamic value(String key) {
-    return json[key];
+  void mapChanged(oldValue) {
+    var jpp = new JsonPrettyPrinter();
+    mapAsString = jpp.prettyPrint(map);
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/json_view.html b/runtime/bin/vmservice/client/lib/src/elements/json_view.html
index 1b3cad8..f7e42ff 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/json_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/json_view.html
@@ -1,33 +1,11 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
 <polymer-element name="json-view" extends="observatory-element">
   <template>
-    <template bind if="{{ valueType == 'Primitive' }}">
-      <span>{{primitiveString}}</span>
-    </template>
-    <template bind if="{{ valueType == 'List' }}">
-      <table class="table table-condensed table-bordered">
-        <caption class="text-left">List, {{list.length}}</caption>
-        <tbody>
-          <tr template repeat="{{item in list)}}">
-            <th>{{counter}}</th>
-            <td><json-view json="{{item}}"></json-view></td>
-          </tr>
-        </tbody>
-      </table>
-    </template>
-    <template if="{{ valueType == 'Map' }}">
-      <table class="table table-condensed table-bordered">
-        <caption class="text-left">Map, {{keys.length}}</caption>
-        <tbody>
-          <tr template repeat="{{key in keys}}">
-            <th>{{key}}</th>
-            <td><json-view json="{{value(key)}}"></json-view></td>
-          </tr>
-        </tbody>
-      </table>
-    </template>
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+    </nav-bar>
+      <pre>{{ mapAsString }}</pre>
   </template>
   <script type="application/dart" src="json_view.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 b6b92ec..fff6dde 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
@@ -148,10 +148,6 @@
     return type == 'Instance';
   }
 
-  bool isClosure(String type) {
-    return type == 'Closure';
-  }
-
   bool isDouble(String type) {
     return type == 'Double';
   }
@@ -161,6 +157,10 @@
             type == 'Array');
   }
 
+  bool isType(String type) {
+    return (type == 'Type');
+  }
+
   bool isUnexpected(String type) {
     return (!['Null',
               'Smi',
@@ -168,11 +168,11 @@
               'Biginit',
               'Bool',
               'String',
-              'Closure',
 	      'Double',
               'Instance',
               'GrowableObjectArray',
               'Array',
+              'Type',
               'Error'].contains(type));
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/response_viewer.dart b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.dart
index b81272f..a541b35 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/response_viewer.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.dart
@@ -12,4 +12,4 @@
 class ResponseViewerElement extends ObservatoryElement {
   @published ObservatoryApplication app;
   ResponseViewerElement.created() : super.created();
-}
\ No newline at end of file
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart b/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart
new file mode 100644
index 0000000..f2a54ba
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart
@@ -0,0 +1,79 @@
+// 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 script_inset_element;
+
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
+import 'package:polymer/polymer.dart';
+
+/// Box with script source code in it.
+@CustomTag('script-inset')
+class ScriptInsetElement extends ObservatoryElement {
+  @published Script script;
+  @published int pos;
+  @published int endPos;
+  @published bool coverage = false;
+
+  @observable List<ScriptLine> lines = toObservable([]);
+
+  void scriptChanged(oldValue) {
+    _updateProperties();
+    notifyPropertyChange(#hitStyle, 0, 1);
+  }
+
+  void posChanged(oldValue) {
+    _updateProperties();
+  }
+
+  coverageChanged(oldValue) {
+    notifyPropertyChange(#lines, 0, 1);
+    notifyPropertyChange(#hitStyle, 0, 1);
+  }
+
+  static const hitStyleNone = 'min-width:32px;';
+  static const hitStyleExecuted = 'min-width:32px;background-color:green';
+  static const hitStyleNotExecuted = 'min-width:32px;background-color:red';
+
+  @observable String hitStyle(ScriptLine line) {
+    if ((script == null) || !coverage) {
+      return hitStyleNone;
+    }
+    var hit = script.hits[line.line];
+    if (hit == null) {
+      return hitStyleNone;
+    }
+    if (hit == 0) {
+      return hitStyleNotExecuted;
+    }
+    assert(hit > 0);
+    return hitStyleExecuted;
+  }
+
+
+  void _updateProperties() {
+    if (!script.loaded) {
+      script.load().then((_) {
+          if (script.loaded) {
+            _updateProperties();
+          }
+        });
+      return;
+    }
+    notifyPropertyChange(#lines, 0, 1);
+    lines.clear();
+    var startLineNumber = script.tokenToLine(pos);
+    if (endPos == null) {
+      lines.add(script.lines[startLineNumber - 1]);
+    } else {
+      var endLineNumber = script.tokenToLine(endPos);
+      assert(endLineNumber != null);
+      for (var i = startLineNumber; i <= endLineNumber; i++) {
+        lines.add(script.lines[i - 1]);
+      }
+    }
+  }
+
+  ScriptInsetElement.created() : super.created();
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_inset.html b/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
new file mode 100644
index 0000000..e4023b4
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
@@ -0,0 +1,48 @@
+<head>
+  <link rel="import" href="observatory_element.html">
+</head>
+<polymer-element name="script-inset" extends="observatory-element">
+  <template>
+    <style>
+      .sourceInset {
+        padding-left: 15%;
+        padding-right: 15%;
+      }
+      .grayBox {
+        width: 100%;
+        background-color: #f5f5f5;
+        border: 1px solid #ccc;
+        padding: 10px;
+     }
+    </style>
+    <div class="sourceInset">
+      <content></content>
+      <div class="grayBox">
+        <template if="{{ coverage == true }}">
+          <table>
+            <tbody>
+              <tr template repeat="{{ line in lines }}">
+                <td style="{{ hitStyle(line) }}"><span>  </span></td>
+                <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
+                <td>&nbsp;</td>
+                <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
+              </tr>
+            </tbody>
+          </table>
+        </template>
+        <template if="{{ coverage == false }}">
+          <table>
+            <tbody>
+              <tr template repeat="{{ line in lines }}">
+                <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
+                <td>&nbsp;</td>
+                <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
+              </tr>
+            </tbody>
+          </table>
+        </template>
+      </div>
+    </div>
+  </template>
+  <script type="application/dart" src="script_inset.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/script_ref.dart
index 1eaf1b4..c88d43a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_ref.dart
@@ -5,20 +5,28 @@
 library script_ref_element;
 
 import 'package:polymer/polymer.dart';
+import 'package:observatory/service.dart';
 import 'service_ref.dart';
 
 @CustomTag('script-ref')
 class ScriptRefElement extends ServiceRefElement {
-  @published int line = -1;
+  @published int pos = -1;
 
   String get hoverText {
     if (ref == null) {
       return super.hoverText;
     }
-    if (line < 0) {
-      return ref.vmName;
-    } else {
-      return '${ref.vmName}:$line';
+    return ref.vmName;
+  }
+
+  void posChanged(oldValue) {
+    _updateProperties(null);
+  }
+
+  void _updateProperties(_) {
+    if (ref != null && ref.loaded) {
+      notifyPropertyChange(#name, 0, 1);
+      notifyPropertyChange(#url, 0, 1);
     }
   }
 
@@ -26,11 +34,32 @@
     if (ref == null) {
       return super.name;
     }
-    if (line < 0) {
-      return ref.name;
-    } else {
-      return '${ref.name}:$line';
+    if (pos >= 0) {
+      if (ref.loaded) {
+        // Script is loaded, get the line number.
+        Script script = ref;
+        return '${super.name}:${script.tokenToLine(pos)}';
+      } else {
+        ref.load().then(_updateProperties);
+      }
     }
+    return super.name;
+  }
+
+  String get url {
+    if (ref == null) {
+      return super.url;
+    }
+    if (pos >= 0) {
+      if (ref.loaded) {
+        // Script is loaded, get the line number.
+        Script script = ref;
+        return '${super.url}#line=${script.tokenToLine(pos)}';
+      } else {
+        ref.load().then(_updateProperties);
+      }
+    }
+    return super.url;
   }
 
   ScriptRefElement.created() : super.created();
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_view.dart b/runtime/bin/vmservice/client/lib/src/elements/script_view.dart
index 687f078..5971488 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.dart
@@ -5,10 +5,11 @@
 library script_view_element;
 
 import 'observatory_element.dart';
+import 'package:observatory/elements.dart';
 import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
 
-/// Displays an Error response.
+/// Displays an Script response.
 @CustomTag('script-view')
 class ScriptViewElement extends ObservatoryElement {
   @published Script script;
@@ -24,31 +25,9 @@
     script.load();
   }
 
-  void _triggerHitRefresh() {
-    notifyPropertyChange(#hitsStyle, 0, 1);
-  }
-
   showCoverageChanged(oldValue) {
-    _triggerHitRefresh();
-  }
-
-  static const hitStyleNone = 'min-width:32px;';
-  static const hitStyleExecuted = 'min-width:32px;background-color:green';
-  static const hitStyleNotExecuted = 'min-width:32px;background-color:red';
-
-  @observable String hitsStyle(ScriptLine line) {
-    if ((script == null) || !showCoverage) {
-      return hitStyleNone;
-    }
-    var hit = script.hits[line.line];
-    if (hit == null) {
-      return hitStyleNone;
-    }
-    if (hit == 0) {
-      return hitStyleNotExecuted;
-    }
-    assert(hit > 0);
-    return hitStyleExecuted;
+    ScriptInsetElement sie = shadowRoot.querySelector('#scriptInset');
+    sie.coverage = showCoverage;
   }
 
   void refresh(var done) {
@@ -56,9 +35,6 @@
   }
 
   void refreshCoverage(var done) {
-    script.isolate.refreshCoverage().then((_) {
-      _triggerHitRefresh();
-      done();
-    });
+    script.isolate.refreshCoverage().whenComplete(done);
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_view.html b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
index ef6b4a7..c251423 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
@@ -1,6 +1,7 @@
 <head>
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="observatory_element.html">
+  <link rel="import" href="script_inset.html">
 </head>
 <polymer-element name="script-view" extends="observatory-element">
 <template>
@@ -20,22 +21,9 @@
     </nav-refresh>
   </nav-bar>
 
-  <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel-heading">Script source for: {{ script.name }}</div>
-      <div class="panel-body">
-        <table style="width:100%">
-          <tbody>
-          <tr template repeat="{{ line in script.lines }}">
-            <td style="{{ hitsStyle(line) }}">  </td>
-            <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
-            <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
-          </tr>
-          </tbody>
-        </table>
-      </div>
-    </div>
-  </div>
+  <script-inset id="scriptInset" script="{{ script }}" pos="{{ script.firstTokenPos }}" endPos="{{ script.lastTokenPos }}">
+  <h1>script {{ script.name }}</h1>
+  </script-inset>
 </template>
 <script type="application/dart" src="script_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
index bdc1fe9..822645f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
@@ -60,6 +60,7 @@
       case 'Instance':
       case 'Smi':
       case 'String':
+      case 'Type':
         InstanceViewElement element = new Element.tag('instance-view');
         element.instance = object;
         return element;
@@ -98,7 +99,9 @@
         element.vm = object;
         return element;
       default:
-        return null;
+        JsonViewElement element = new Element.tag('json-view');
+        element.map = object;
+        return element;
     }
   }
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
index a965765..86ba979 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
@@ -28,7 +28,8 @@
       </div>
       <div class="col-md-9">
         <function-ref ref="{{ frame['function'] }}"></function-ref>
-        ( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
+        ( <script-ref ref="{{ frame['script'] }}"
+                      pos="{{ frame['tokenPos'] }}">
         </script-ref> )
 
         <curly-block>
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index 5e008d1..9024d49 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -99,6 +99,8 @@
     return reload();
   }
 
+  Future<ServiceObject> _inProgressReload;
+
   /// Reload [this]. Returns a future which completes to [this] or
   /// a [ServiceError].
   Future<ServiceObject> reload() {
@@ -110,17 +112,23 @@
     if (loaded && immutable) {
       return new Future.value(this);
     }
-    return vm.getAsMap(link).then((ObservableMap map) {
-        var mapType = _stripRef(map['type']);
-        if (mapType != _serviceType) {
-          // If the type changes, return a new object instead of
-          // updating the existing one.
-          assert(mapType == 'Error' || mapType == 'Null');
-          return new ServiceObject._fromMap(owner, map);
-        }
-        update(map);
-        return this;
+    if (_inProgressReload == null) {
+      _inProgressReload = vm.getAsMap(link).then((ObservableMap map) {
+          var mapType = _stripRef(map['type']);
+          if (mapType != _serviceType) {
+            // If the type changes, return a new object instead of
+            // updating the existing one.
+            assert(mapType == 'Error' || mapType == 'Null');
+            return new ServiceObject._fromMap(owner, map);
+          }
+          update(map);
+          return this;
+      }).whenComplete(() {
+          // This reload is complete.
+          _inProgressReload = null;
       });
+    }
+    return _inProgressReload;
   }
 
   /// Update [this] using [map] as a source. [map] can be a reference.
@@ -229,6 +237,14 @@
   }
 
   Future<ServiceObject> get(String id) {
+    var parts = id.split('#');
+    assert(parts.length >= 1);
+    // We should never see more than two hashes.
+    assert(parts.length <= 2);
+    // The ID does not include anything after the # (or the # itself).
+    id = parts[0];
+    // I'm serious.
+    assert(!id.contains('#'));
     // Isolates are handled specially, since they can cache sub-objects.
     if (id.startsWith(_isolatesPrefix)) {
       String isolateId = _parseIsolateId(id);
@@ -436,6 +452,7 @@
 class Isolate extends ServiceObjectOwner {
   @reflectable VM get vm => owner;
   @reflectable Isolate get isolate => this;
+  @observable ObservableMap counters = toObservable(new ObservableMap());
 
   String get link => _id;
   String get hashLink => '#/$_id';
@@ -517,6 +534,7 @@
     // Because the coverage data was upgraded into a ServiceObject,
     // the script can be directly accessed.
     Script script = scriptCoverage['script'];
+    assert(_cache.containsValue(script));
     script._processHits(scriptCoverage['hits']);
   }
 
@@ -599,6 +617,28 @@
       topFrame = null ;
     }
 
+    var countersMap = map['tagCounters'];
+    if (countersMap != null) {
+      var names = countersMap['names'];
+      var counts = countersMap['counters'];
+      assert(names.length == counts.length);
+      var sum = 0;
+      for (var i = 0; i < counts.length; i++) {
+        sum += counts[i];
+      }
+      // TODO: Why does this not work without this?
+      counters = toObservable({});
+      if (sum == 0) {
+        for (var i = 0; i < names.length; i++) {
+          counters[names[i]] = '0.0%';
+        }
+      } else {
+        for (var i = 0; i < names.length; i++) {
+          counters[names[i]] =
+              (counts[i] / sum * 100.0).toStringAsFixed(2) + '%';
+        }
+      }
+    }
     var timerMap = {};
     map['timers'].forEach((timer) {
         timerMap[timer['name']] = timer['time'];
@@ -810,7 +850,8 @@
   @reflectable final hits = new ObservableMap<int, int>();
   @observable ServiceObject library;
   @observable String kind;
-
+  @observable int firstTokenPos;
+  @observable int lastTokenPos;
   bool get canCache => true;
   bool get immutable => true;
 
@@ -819,6 +860,14 @@
 
   Script._empty(ServiceObjectOwner owner) : super._empty(owner);
 
+  /// This function maps a token position to a line number.
+  int tokenToLine(int token) => _tokenToLine[token];
+  Map _tokenToLine;
+
+  /// This function maps a token position to a column number.
+  int tokenToCol(int token) => _tokenToCol[token];
+  Map _tokenToCol;
+
   void _update(ObservableMap map, bool mapIsRef) {
     kind = map['kind'];
     _url = map['name'];
@@ -826,13 +875,42 @@
     name = _shortUrl;
     vmName = _url;
     _processSource(map['source']);
+    _parseTokenPosTable(map['tokenPosTable']);
+  }
+
+  void _parseTokenPosTable(List<List<int>> table) {
+    if (table == null) {
+      return;
+    }
+    _tokenToLine = {};
+    _tokenToCol = {};
+    firstTokenPos = null;
+    lastTokenPos = null;
+    for (var line in table) {
+      // Each entry begins with a line number...
+      var lineNumber = line[0];
+      for (var pos = 1; pos < line.length; pos += 2) {
+        // ...and is followed by (token offset, col number) pairs.
+        var tokenOffset = line[pos];
+        var colNumber = line[pos+1];
+        if (firstTokenPos == null) {
+          // Mark first token position.
+          firstTokenPos = tokenOffset;
+          lastTokenPos = tokenOffset;
+        } else {
+          // Keep track of max and min token positions.
+          firstTokenPos = (firstTokenPos <= tokenOffset) ?
+              firstTokenPos : tokenOffset;
+          lastTokenPos = (lastTokenPos >= tokenOffset) ?
+              lastTokenPos : tokenOffset;
+        }
+        _tokenToLine[tokenOffset] = lineNumber;
+        _tokenToCol[tokenOffset] = colNumber;
+      }
+    }
   }
 
   void _processHits(List scriptHits) {
-    if (!_loaded) {
-      // Eagerly grab script source.
-      load();
-    }
     // Update hits table.
     for (var i = 0; i < scriptHits.length; i += 2) {
       var line = scriptHits[i];
@@ -860,8 +938,6 @@
       lines.add(new ScriptLine(i + 1, sourceLines[i]));
     }
   }
-
-
 }
 
 class CodeTick {
@@ -1130,6 +1206,8 @@
     }
     return 0;
   }
+
+  @reflectable bool get isDartCode => kind == CodeKind.Dart;
 }
 
 // Returns true if [map] is a service map. i.e. it has the following keys:
diff --git a/runtime/bin/vmservice/client/resources.sh b/runtime/bin/vmservice/client/resources.sh
index 0686805..18a84ac 100755
--- a/runtime/bin/vmservice/client/resources.sh
+++ b/runtime/bin/vmservice/client/resources.sh
@@ -12,12 +12,12 @@
 
 PREFIX="vmservice/client"
 echo "For resources_sources.gypi:"
-for i in `find deployed/web/ -not -type d -not -path '*/\.*'`; do
+for i in `find deployed/web/ -not -type d -not -path '*/\.*' -not -path '*~'`; do
   echo "'$PREFIX/$i',"
 done
 
 PREFIX="../../../../dart/runtime/bin/vmservice/client"
 echo "For devtools.gypi:"
-for i in `find deployed/web/ -not -type d -not -path '*/\.*'`; do
+for i in `find deployed/web/ -not -type d -not -path '*/\.*' -not -path '*~'`; do
   echo "'$PREFIX/$i',"
 done
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index c6c7732..9046ec8 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -1089,8 +1089,13 @@
  */
 DART_EXPORT Dart_Handle Dart_NewSendPort(Dart_Port port_id);
 
+
+DART_EXPORT Dart_Handle Dart_PortGetId(Dart_Handle port, Dart_Port* port_id);
+
 /**
- * Gets the ReceivePort for the provided port id, creating it if necessary.
+ * Gets the ReceivePort for the provided port id.
+ * Returns Dart_Null if a port with the provided port id is not associated with
+ * the current isolate.
  *
  * Note that there is at most one ReceivePort for a given port id.
  */
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 083ea66..dbc971b 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -40,7 +40,7 @@
     const String& class_name =
         String::Handle(isolate_lib.PrivateName(Symbols::_RawReceivePortImpl()));
     const String& function_name =
-        String::Handle(isolate_lib.PrivateName(Symbols::_get_or_create()));
+        String::Handle(isolate_lib.PrivateName(Symbols::_create()));
     func = Resolver::ResolveStatic(isolate_lib,
                                    class_name,
                                    function_name,
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index 0b846e1..f5e4824 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -84,16 +84,17 @@
   }
 
   SendPort get sendPort {
-    return new _SendPortImpl(_id);
+    return new _SendPortImpl._from(this);
   }
 
   /**** Internal implementation details ****/
   // Called from the VM to create a new RawReceivePort instance.
-  static _RawReceivePortImpl _get_or_create(int id) {
-    _RawReceivePortImpl port = _portMap[id];
-    if (port != null) {
-      return port;
-    }
+  static _RawReceivePortImpl _get(int id) {
+    return _portMap[id];
+  }
+
+  static _RawReceivePortImpl _create(int id) {
+    assert(_portMap[id]== null);
     return new _RawReceivePortImpl._internal(id);
   }
 
@@ -157,12 +158,13 @@
   }
 
   /*--- private implementation ---*/
-  const _SendPortImpl(int id) : _id = id;
+  _SendPortImpl._from(_RawReceivePortImpl from) : _id = from._id;
+  _SendPortImpl._with(int id) : _id = id;
 
   // _SendPortImpl._create is called from the VM when a new SendPort instance is
   // needed by the VM code.
   static SendPort _create(int id) {
-    return new _SendPortImpl(id);
+    return new _SendPortImpl._with(id);
   }
 
   // Forward the implementation of sending messages to the VM. Only port ids
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index d2427f9..894b3ed 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -129,14 +129,6 @@
   const Array& results = Array::Handle(Array::New(non_implicit_param_count));
   const Array& args = Array::Handle(Array::New(9));
 
-  // Return for synthetic functions and getters.
-  if (func.IsGetterFunction() ||
-      func.IsImplicitConstructor() ||
-      func.IsImplicitGetterFunction() ||
-      func.IsImplicitSetterFunction()) {
-    return results.raw();
-  }
-
   Smi& pos = Smi::Handle();
   String& name = String::Handle();
   Instance& param = Instance::Handle();
@@ -149,32 +141,52 @@
   // of functions because some have no body, e.g. signature functions.
   EnsureConstructorsAreCompiled(func);
 
-  // Reparse the function for the following information:
-  // * The default value of a parameter.
-  // * Whether a parameters has been deflared as final.
-  // * Any metadata associated with the parameter.
-  const Object& result = Object::Handle(Parser::ParseFunctionParameters(func));
-  if (result.IsError()) {
-    ThrowInvokeError(Error::Cast(result));
-    UNREACHABLE();
+  bool has_extra_parameter_info = true;
+  if (non_implicit_param_count == 0) {
+    has_extra_parameter_info = false;
+  }
+  if (func.IsImplicitConstructor()) {
+    // This covers the default constructor and forwarding constructors.
+    has_extra_parameter_info = false;
+  }
+
+  Array& param_descriptor = Array::Handle();
+  if (has_extra_parameter_info) {
+    // Reparse the function for the following information:
+    // * The default value of a parameter.
+    // * Whether a parameters has been deflared as final.
+    // * Any metadata associated with the parameter.
+    const Object& result =
+        Object::Handle(Parser::ParseFunctionParameters(func));
+    if (result.IsError()) {
+      ThrowInvokeError(Error::Cast(result));
+      UNREACHABLE();
+    }
+    param_descriptor ^= result.raw();
+    ASSERT(param_descriptor.Length() ==
+           (Parser::kParameterEntrySize * non_implicit_param_count));
   }
 
   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func)));
   args.SetAt(2, owner_mirror);
 
-  const Array& param_descriptor = Array::Cast(result);
-  ASSERT(param_descriptor.Length() ==
-         (Parser::kParameterEntrySize * non_implicit_param_count));
+  if (!has_extra_parameter_info) {
+    is_final ^= Bool::True().raw();
+    default_value = Object::null();
+    metadata = Object::null();
+  }
+
   for (intptr_t i = 0; i < non_implicit_param_count; i++) {
     pos ^= Smi::New(i);
     name ^= func.ParameterNameAt(implicit_param_count + i);
-    is_final ^= param_descriptor.At(
-        i * Parser::kParameterEntrySize + Parser::kParameterIsFinalOffset);
-    default_value = param_descriptor.At(
-        i * Parser::kParameterEntrySize + Parser::kParameterDefaultValueOffset);
-    metadata = param_descriptor.At(
-        i * Parser::kParameterEntrySize + Parser::kParameterMetadataOffset);
-
+    if (has_extra_parameter_info) {
+      is_final ^= param_descriptor.At(i * Parser::kParameterEntrySize +
+          Parser::kParameterIsFinalOffset);
+      default_value = param_descriptor.At(i * Parser::kParameterEntrySize +
+          Parser::kParameterDefaultValueOffset);
+      metadata = param_descriptor.At(i * Parser::kParameterEntrySize +
+          Parser::kParameterMetadataOffset);
+    }
     ASSERT(default_value.IsNull() || default_value.IsInstance());
 
     // Arguments 0 (referent) and 2 (owner) are the same for all parameters. See
@@ -349,10 +361,12 @@
   const Array& args = Array::Handle(Array::New(8));
   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls)));
   args.SetAt(1, type);
-  // We do not set the names of anonymous mixin applications because the mirrors
+  // Note that the VM does not consider mixin application aliases to be mixin
+  // applications, so this only covers anonymous mixin applications. We do not
+  // set the names of anonymous mixin applications here because the mirrors
   // use a different naming convention than the VM (lib.S with lib.M and S&M
   // respectively).
-  if (!cls.IsAnonymousMixinApplication()) {
+  if (!cls.IsMixinApplication()) {
     args.SetAt(2, String::Handle(cls.Name()));
   }
   args.SetAt(3, owner_mirror);
@@ -1314,9 +1328,11 @@
       const Class& klass = Class::Cast(entry);
       // We filter out function signature classes and dynamic.
       // TODO(12478): Should not need to filter out dynamic.
+      // Note that the VM does not consider mixin application aliases to be
+      // mixin applications.
       if (!klass.IsCanonicalSignatureClass() &&
           !klass.IsDynamicClass() &&
-          !klass.IsAnonymousMixinApplication()) {
+          !klass.IsMixinApplication()) {
         type = klass.DeclarationType();
         member_mirror = CreateClassMirror(klass,
                                           type,
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index 717e49d..a81767d 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -7,6 +7,25 @@
     return _StringBase.createFromCharCodes(charCodes);
   }
 
+  /* patch */ factory String.fromCharCode(int charCode) {
+    if (charCode >= 0) {
+      if (charCode <= 0xff) {
+        return _OneByteString._allocate(1).._setAt(0, charCode);
+      }
+      if (charCode <= 0xffff) {
+        return _StringBase._createFromCodePoints(new _List(1)..[0] = charCode);
+      }
+      if (charCode <= 0x10ffff) {
+        var low = 0xDC00 | (charCode & 0x3ff);
+        int bits = charCode - 0x10000;
+        var high = 0xD800 | (bits >> 10);
+        return  _StringBase._createFromCodePoints(new _List(2)..[0] = high
+                                                              ..[1] = low);
+      }
+    }
+    throw new RangeError.range(charCode, 0, 0x10ffff);
+  }
+
   /* patch */ const factory String.fromEnvironment(String name,
                                                    {String defaultValue})
       native "String_fromEnvironment";
@@ -778,64 +797,96 @@
     return result;
   }
 
-  // Lower-case conversion table for Latin-1.
-  static const _LC_TABLE = const [
-    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
-    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
-    0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
-    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-    0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
-    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
-    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
-    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
-    0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
-    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
-    0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
-    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
-    0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
-    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
-    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7,
-    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf,
-    0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
-    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
-    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
-    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
-  ];
+  // Lower-case conversion table for Latin-1 as string.
+  // Upper-case ranges: 0x41-0x5a ('A' - 'Z'), 0xc0-0xd6, 0xd8-0xde.
+  // Conversion to lower case performed by adding 0x20.
+  static const _LC_TABLE =
+      "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+      "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
+      "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
+      "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
+      "\x40\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
+      "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x5b\x5c\x5d\x5e\x5f"
+      "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
+      "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
+      "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
+      "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
+      "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
+      "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
+      "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
+      "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xd7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xdf"
+      "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
+      "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff";
 
-  String _toLowerCaseUpperCaseDetectedAt(int firstUpperCaseIndex) {
-    // String contains upper case characters. Create a new string.
-    final length = this.length;
-    final result = _allocate(length);
-    // First up to firstUpperIndex.
-    int i = 0;
-    for (; i < firstUpperCaseIndex; i++) {
-      result._setAt(i, this.codeUnitAt(i));
-    }
-    for (; i < length; i++) {
-      result._setAt(i, _LC_TABLE[this.codeUnitAt(i)]);
-    }
-    return result;
-  }
+  // Upper-case conversion table for Latin-1 as string.
+  // Lower-case ranges: 0x61-0x7a ('a' - 'z'), 0xe0-0xff.
+  // The characters 0xb5 (µ) and 0xff (ÿ) have upper case variants
+  // that are not Latin-1. These are both marked as 0x00 in the table.
+  // The German "sharp s" \xdf (ß) should be converted into two characters (SS),
+  // and is also marked with 0x00.
+  // Conversion to lower case performed by subtracting 0x20.
+  static const _UC_TABLE =
+      "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+      "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
+      "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
+      "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
+      "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
+      "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
+      "\x60\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
+      "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x7b\x7c\x7d\x7e\x7f"
+      "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
+      "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
+      "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
+      "\xb0\xb1\xb2\xb3\xb4\x00\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
+      "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
+      "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\x00"
+      "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
+      "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xf7\xd8\xd9\xda\xdb\xdc\xdd\xde\x00";
 
   String toLowerCase() {
     for (int i = 0; i < this.length; i++) {
       final c = this.codeUnitAt(i);
-      // Ranges: 0x41-0x5a ('A' - 'Z'), 0xc0-0xd6, 0xd8-0xde.
-      if (c != _LC_TABLE[c]) {
-        return _toLowerCaseUpperCaseDetectedAt(i);
+      if (c == _LC_TABLE.codeUnitAt(c)) continue;
+      // Upper-case character found.
+      final result = _allocate(this.length);
+      for (int j = 0; j < i; j++) {
+        result._setAt(j, this.codeUnitAt(j));
       }
+      for (int j = i; j < this.length; j++) {
+        result._setAt(j, _LC_TABLE.codeUnitAt(this.codeUnitAt(j)));
+      }
+      return result;
+    }
+    return this;
+  }
+
+  String toUpperCase() {
+    for (int i = 0; i < this.length; i++) {
+      final c = this.codeUnitAt(i);
+      // Continue loop if character is unchanged by upper-case conversion.
+      if (c == _UC_TABLE.codeUnitAt(c)) continue;
+
+      // Check rest of string for characters that do not convert to
+      // single-characters in the Latin-1 range.
+      for (int j = i; j < this.length; j++) {
+        final c = this.codeUnitAt(j);
+        if ((_UC_TABLE.codeUnitAt(c) == 0x00) && (c != 0x00)) {
+          // We use the 0x00 value for characters other than the null character,
+          // that don't convert to a single Latin-1 character when upper-cased.
+          // In that case, call the generic super-class method.
+          return super.toUpperCase();
+        }
+      }
+      // Some lower-case characters found, but all upper-case to single Latin-1
+      // characters.
+      final result = _allocate(this.length);
+      for (int j = 0; j < i; j++) {
+        result._setAt(j, this.codeUnitAt(j));
+      }
+      for (int j = i; j < this.length; j++) {
+        result._setAt(j, _UC_TABLE.codeUnitAt(this.codeUnitAt(j)));
+      }
+      return result;
     }
     return this;
   }
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 1269903..576731d 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -196,6 +196,7 @@
 #if !defined(TARGET_ARCH_ARM)
 #if !defined(TARGET_ARCH_X64)
 #if !defined(TARGET_ARCH_IA32)
+#if !defined(TARGET_ARCH_ARM64)
 // No target architecture specified pick the one matching the host architecture.
 #if defined(HOST_ARCH_MIPS)
 #define TARGET_ARCH_MIPS 1
@@ -205,6 +206,8 @@
 #define TARGET_ARCH_X64 1
 #elif defined(HOST_ARCH_IA32)
 #define TARGET_ARCH_IA32 1
+#elif defined(HOST_ARCH_ARM64)
+#define TARGET_ARCH_ARM64 1
 #else
 #error Automatic target architecture detection failed.
 #endif
@@ -212,10 +215,12 @@
 #endif
 #endif
 #endif
+#endif
 
 // Verify that host and target architectures match, we cannot
 // have a 64 bit Dart VM generating 32 bit code or vice-versa.
-#if defined(TARGET_ARCH_X64)
+#if defined(TARGET_ARCH_X64) ||                                                \
+    defined(TARGET_ARCH_ARM64)
 #if !defined(ARCH_IS_64_BIT)
 #error Mismatched Host/Target architectures.
 #endif
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index b88bad2..60eb69e 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -16,6 +16,11 @@
 # Flaky on buildbot. Issue 5133 and 10409.
 cc/Sleep: Pass, Fail
 
+cc/GenerateSource: Fail  # Issue 17857
+
+[ $mode == debug ]
+cc/PrintToJSONStream: Crash  # Issue 17857
+
 [ $arch == x64 ]
 cc/IsolateInterrupt: Skip
 
@@ -75,6 +80,9 @@
 [ $arch == mips && $mode == debug ]
 cc/FindCodeObject: Skip # Takes more than 8 minutes. dartbug.com/17440.
 
+[ $arch == simarm64 ]
+dart/*: Skip
+
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 dart/mirrored_compilation_error_test: Skip # Can't pass needed VM flag
 
diff --git a/runtime/vm/assembler.h b/runtime/vm/assembler.h
index 043ea56..3ba58ed 100644
--- a/runtime/vm/assembler.h
+++ b/runtime/vm/assembler.h
@@ -13,7 +13,9 @@
 
 namespace dart {
 
-#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
+#if defined(TARGET_ARCH_ARM) ||                                                \
+    defined(TARGET_ARCH_ARM64) ||                                              \
+    defined(TARGET_ARCH_MIPS)
 DECLARE_FLAG(bool, use_far_branches);
 #endif
 
@@ -217,6 +219,8 @@
 #include "vm/assembler_x64.h"
 #elif defined(TARGET_ARCH_ARM)
 #include "vm/assembler_arm.h"
+#elif defined(TARGET_ARCH_ARM64)
+#include "vm/assembler_arm64.h"
 #elif defined(TARGET_ARCH_MIPS)
 #include "vm/assembler_mips.h"
 #else
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
new file mode 100644
index 0000000..8c07d5b
--- /dev/null
+++ b/runtime/vm/assembler_arm64.cc
@@ -0,0 +1,78 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_ARM64)
+
+#include "vm/assembler.h"
+#include "vm/cpu.h"
+#include "vm/longjump.h"
+#include "vm/runtime_entry.h"
+#include "vm/simulator.h"
+#include "vm/stack_frame.h"
+#include "vm/stub_code.h"
+
+// An extra check since we are assuming the existence of /proc/cpuinfo below.
+#if !defined(USING_SIMULATOR) && !defined(__linux__) && !defined(ANDROID)
+#error ARM64 cross-compile only supported on Linux
+#endif
+
+namespace dart {
+
+DEFINE_FLAG(bool, print_stop_message, true, "Print stop message.");
+DECLARE_FLAG(bool, inline_alloc);
+
+
+void Assembler::InitializeMemoryWithBreakpoints(uword data, intptr_t length) {
+  ASSERT(Utils::IsAligned(data, 4));
+  ASSERT(Utils::IsAligned(length, 4));
+  const uword end = data + length;
+  while (data < end) {
+    *reinterpret_cast<int32_t*>(data) = Instr::kBreakPointInstruction;
+    data += 4;
+  }
+}
+
+
+void Assembler::Stop(const char* message) {
+  UNIMPLEMENTED();
+}
+
+
+void Assembler::Emit(int32_t value) {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  buffer_.Emit<int32_t>(value);
+}
+
+
+static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
+  "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
+  "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",
+  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
+  "r24", "ip0", "ip1", "pp",  "ctx", "fp",  "lr",  "r31",
+};
+
+
+const char* Assembler::RegisterName(Register reg) {
+  ASSERT((0 <= reg) && (reg < kNumberOfCpuRegisters));
+  return cpu_reg_names[reg];
+}
+
+
+static const char* fpu_reg_names[kNumberOfFpuRegisters] = {
+  "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",
+  "v8",  "v9",  "v10", "v11", "v12", "v13", "v14", "v15",
+  "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
+  "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
+};
+
+
+const char* Assembler::FpuRegisterName(FpuRegister reg) {
+  ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters));
+  return fpu_reg_names[reg];
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
new file mode 100644
index 0000000..cd7bd36
--- /dev/null
+++ b/runtime/vm/assembler_arm64.h
@@ -0,0 +1,477 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_ASSEMBLER_ARM64_H_
+#define VM_ASSEMBLER_ARM64_H_
+
+#ifndef VM_ASSEMBLER_H_
+#error Do not include assembler_arm64.h directly; use assembler.h instead.
+#endif
+
+#include "platform/assert.h"
+#include "platform/utils.h"
+#include "vm/constants_arm64.h"
+#include "vm/object.h"
+#include "vm/simulator.h"
+
+namespace dart {
+
+// Forward declarations.
+class RuntimeEntry;
+
+// TODO(zra): Label, Address, and FieldAddress are copied from ARM,
+// they must be adapted to ARM64.
+class Label : public ValueObject {
+ public:
+  Label() : position_(0) { }
+
+  ~Label() {
+    // Assert if label is being destroyed with unresolved branches pending.
+    ASSERT(!IsLinked());
+  }
+
+  // Returns the position for bound and linked labels. Cannot be used
+  // for unused labels.
+  intptr_t Position() const {
+    ASSERT(!IsUnused());
+    return IsBound() ? -position_ - kWordSize : position_ - kWordSize;
+  }
+
+  bool IsBound() const { return position_ < 0; }
+  bool IsUnused() const { return position_ == 0; }
+  bool IsLinked() const { return position_ > 0; }
+
+ private:
+  intptr_t position_;
+
+  void Reinitialize() {
+    position_ = 0;
+  }
+
+  void BindTo(intptr_t position) {
+    ASSERT(!IsBound());
+    position_ = -position - kWordSize;
+    ASSERT(IsBound());
+  }
+
+  void LinkTo(intptr_t position) {
+    ASSERT(!IsBound());
+    position_ = position + kWordSize;
+    ASSERT(IsLinked());
+  }
+
+  friend class Assembler;
+  DISALLOW_COPY_AND_ASSIGN(Label);
+};
+
+
+class Address : public ValueObject {
+ public:
+  Address(const Address& other)
+      : ValueObject(),
+        encoding_(other.encoding_),
+        type_(other.type_),
+        base_(other.base_) {
+  }
+
+  Address& operator=(const Address& other) {
+    encoding_ = other.encoding_;
+    type_ = other.type_;
+    base_ = other.base_;
+    return *this;
+  }
+
+  enum AddressType {
+    Offset,
+    PreIndex,
+    PostIndex,
+    Reg,
+  };
+
+  // Offset is in bytes. For the unsigned imm12 case, we unscale based on the
+  // operand size, and assert that offset is aligned accordingly.
+  // For the smaller signed imm9 case, the offset is the number of bytes, but
+  // is unscaled.
+  Address(Register rn, int32_t offset = 0, AddressType at = Offset,
+          OperandSize sz = kDoubleWord) {
+    ASSERT((rn != R31) && (rn != ZR));
+    const Register crn = ConcreteRegister(rn);
+    const int32_t scale = Log2OperandSizeBytes(sz);
+    if (Utils::IsUint(12 + scale, offset) && (at == Offset)) {
+      ASSERT(offset == ((offset >> scale) << scale));
+      encoding_ =
+          B24 |
+          ((offset >> scale) << kImm12Shift) |
+          (static_cast<int32_t>(crn) << kRnShift);
+    } else {
+      ASSERT(Utils::IsInt(9, offset));
+      ASSERT((at == PreIndex) || (at == PostIndex));
+      int32_t idx = (at == PostIndex) ? B10 : (B11 | B10);
+      encoding_ =
+          idx |
+          ((offset & 0x1ff) << kImm9Shift) |
+          (static_cast<int32_t>(crn) << kRnShift);
+    }
+    type_ = at;
+    base_ = crn;
+  }
+
+  // TODO(zra): Write CanHoldOffset(int32_t off, AddressType, OperandSize).
+  // TODO(zra): Write constructor for PC-relative load address.
+
+  // Base register rn with offset rm. rm is sign-extended according to ext.
+  // If ext is UXTX, rm may be optionally scaled by the
+  // Log2OperandSize (specified by the instruction).
+  Address(Register rn, Register rm, Extend ext = UXTX, bool scaled = false) {
+    ASSERT((rn != R31) && (rn != ZR));
+    ASSERT((rm != R31) && (rm != SP));
+    ASSERT(!scaled || (ext == UXTX));  // Can only scale when ext = UXTX.
+    ASSERT((ext == UXTW) || (ext == UXTX) || (ext == SXTW) || (ext == SXTX));
+    const Register crn = ConcreteRegister(rn);
+    const Register crm = ConcreteRegister(rm);
+    const int32_t s = scaled ? B12 : 0;
+    encoding_ =
+        B21 | B11 | s |
+        (static_cast<int32_t>(crn) << kRnShift) |
+        (static_cast<int32_t>(crm) << kRmShift) |
+        (static_cast<int32_t>(ext) << kExtendTypeShift);
+    type_ = Reg;
+    base_ = crn;
+  }
+
+ private:
+  uint32_t encoding() const { return encoding_; }
+  AddressType type() const { return type_; }
+  Register base() const { return base_; }
+
+  uint32_t encoding_;
+  AddressType type_;
+  Register base_;
+
+  friend class Assembler;
+};
+
+
+class FieldAddress : public Address {
+ public:
+  FieldAddress(Register base, int32_t disp)
+      : Address(base, disp - kHeapObjectTag) { }
+
+  FieldAddress(const FieldAddress& other) : Address(other) { }
+
+  FieldAddress& operator=(const FieldAddress& other) {
+    Address::operator=(other);
+    return *this;
+  }
+};
+
+
+class Operand : public ValueObject {
+ public:
+  // Data-processing operand - Uninitialized.
+  Operand() : encoding_(-1), type_(Unknown) { }
+
+  // Data-processing operands - Copy constructor.
+  Operand(const Operand& other)
+      : ValueObject(), encoding_(other.encoding_), type_(other.type_) { }
+
+  explicit Operand(Register rm) {
+    ASSERT((rm != R31) && (rm != SP));
+    const Register crm = ConcreteRegister(rm);
+    encoding_ = (static_cast<int32_t>(crm) << kRmShift);
+    type_ = Shifted;
+  }
+
+  Operand(Register rm, Shift shift, int32_t imm) {
+    ASSERT(Utils::IsUint(6, imm));
+    ASSERT((rm != R31) && (rm != SP));
+    const Register crm = ConcreteRegister(rm);
+    encoding_ =
+        (imm << kImm6Shift) |
+        (static_cast<int32_t>(crm) << kRmShift) |
+        (static_cast<int32_t>(shift) << kShiftTypeShift);
+    type_ = Shifted;
+  }
+
+  Operand(Register rm, Extend extend, int32_t imm) {
+    ASSERT(Utils::IsUint(3, imm));
+    ASSERT((rm != R31) && (rm != SP));
+    const Register crm = ConcreteRegister(rm);
+    encoding_ =
+        B21 |
+        (static_cast<int32_t>(crm) << kRmShift) |
+        (static_cast<int32_t>(extend) << kExtendTypeShift) |
+        ((imm & 0x7) << kImm3Shift);
+    type_ = Extended;
+  }
+
+  explicit Operand(int32_t imm) {
+    if (Utils::IsUint(12, imm)) {
+      encoding_ = imm << kImm12Shift;
+    } else {
+      // imm only has bits in [12, 24) set.
+      ASSERT(((imm & 0xfff) == 0) && (Utils::IsUint(12, imm >> 12)));
+      encoding_ = B22 | ((imm >> 12) << kImm12Shift);
+    }
+    type_ = Immediate;
+  }
+
+  // TODO(zra): Add bitfield immediate operand
+  // Operand(int32_t n, int32_t imms, int32_t immr);
+
+  enum OperandType {
+    Shifted,
+    Extended,
+    Immediate,
+    BitfieldImm,
+    Unknown,
+  };
+
+ private:
+  uint32_t encoding() const {
+    return encoding_;
+  }
+  OperandType type() const {
+    return type_;
+  }
+
+  uint32_t encoding_;
+  OperandType type_;
+
+  friend class Assembler;
+};
+
+
+class Assembler : public ValueObject {
+ public:
+  explicit Assembler(bool use_far_branches = false)
+      : buffer_(),
+        object_pool_(GrowableObjectArray::Handle()),
+        prologue_offset_(-1),
+        use_far_branches_(use_far_branches),
+        comments_() { }
+  ~Assembler() { }
+
+  void PopRegister(Register r) {
+    UNIMPLEMENTED();
+  }
+
+  void Drop(intptr_t stack_elements) {
+    UNIMPLEMENTED();
+  }
+
+  void Bind(Label* label) {
+    UNIMPLEMENTED();
+  }
+
+  // Misc. functionality
+  intptr_t CodeSize() const { return buffer_.Size(); }
+  intptr_t prologue_offset() const { return prologue_offset_; }
+
+  // Count the fixups that produce a pointer offset, without processing
+  // the fixups.  On ARM64 there are no pointers in code.
+  intptr_t CountPointerOffsets() const { return 0; }
+
+  const ZoneGrowableArray<intptr_t>& GetPointerOffsets() const {
+    ASSERT(buffer_.pointer_offsets().length() == 0);  // No pointers in code.
+    return buffer_.pointer_offsets();
+  }
+  const GrowableObjectArray& object_pool() const { return object_pool_; }
+
+  bool use_far_branches() const {
+    return FLAG_use_far_branches || use_far_branches_;
+  }
+
+  void set_use_far_branches(bool b) {
+    ASSERT(buffer_.Size() == 0);
+    use_far_branches_ = b;
+  }
+
+  void FinalizeInstructions(const MemoryRegion& region) {
+    buffer_.FinalizeInstructions(region);
+  }
+
+  // Debugging and bringup support.
+  void Stop(const char* message);
+  void Unimplemented(const char* message);
+  void Untested(const char* message);
+  void Unreachable(const char* message);
+
+  static void InitializeMemoryWithBreakpoints(uword data, intptr_t length);
+
+  void Comment(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
+
+  const Code::Comments& GetCodeComments() const;
+
+  static const char* RegisterName(Register reg);
+
+  static const char* FpuRegisterName(FpuRegister reg);
+
+  // TODO(zra): Make sure this is right.
+  // Instruction pattern from entrypoint is used in Dart frame prologs
+  // to set up the frame and save a PC which can be used to figure out the
+  // RawInstruction object corresponding to the code running in the frame.
+  static const intptr_t kEntryPointToPcMarkerOffset = 0;
+
+  // Emit data (e.g encoded instruction or immediate) in instruction stream.
+  void Emit(int32_t value);
+
+  // On some other platforms, we draw a distinction between safe and unsafe
+  // smis.
+  static bool IsSafe(const Object& object) { return true; }
+  static bool IsSafeSmi(const Object& object) { return object.IsSmi(); }
+
+  // Addition and subtraction.
+  void add(Register rd, Register rn, Operand o) {
+    AddSubHelper(kDoubleWord, false, false, rd, rn, o);
+  }
+  void addw(Register rd, Register rn, Operand o) {
+    AddSubHelper(kWord, false, false, rd, rn, o);
+  }
+  void sub(Register rd, Register rn, Operand o) {
+    AddSubHelper(kDoubleWord, false, true, rd, rn, o);
+  }
+
+  // Move wide immediate.
+  void movk(Register rd, int32_t imm, int32_t hw_idx) {
+    ASSERT(rd != SP);
+    const Register crd = ConcreteRegister(rd);
+    EmitMoveWideOp(MOVK, crd, imm, hw_idx, kDoubleWord);
+  }
+  void movn(Register rd, int32_t imm, int32_t hw_idx) {
+    ASSERT(rd != SP);
+    const Register crd = ConcreteRegister(rd);
+    EmitMoveWideOp(MOVN, crd, imm, hw_idx, kDoubleWord);
+  }
+  void movz(Register rd, int32_t imm, int32_t hw_idx) {
+    ASSERT(rd != SP);
+    const Register crd = ConcreteRegister(rd);
+    EmitMoveWideOp(MOVZ, crd, imm, hw_idx, kDoubleWord);
+  }
+
+  // Loads and Stores.
+  void ldr(Register rt, Address a) {
+    // If we are doing pre-/post-indexing, and the base and result registers
+    // are the same, then the result of the load will be clobbered by the
+    // writeback, which is unlikely to be useful.
+    ASSERT(((a.type() != Address::PreIndex) &&
+            (a.type() != Address::PostIndex)) ||
+           (rt != a.base()));
+    EmitLoadStoreReg(LDR, rt, a, kDoubleWord);
+  }
+  void str(Register rt, Address a) {
+    EmitLoadStoreReg(STR, rt, a, kDoubleWord);
+  }
+
+  // Function return.
+  void ret(Register rn = R30) {
+    EmitUnconditionalBranchRegOp(RET, rn);
+  }
+
+ private:
+  AssemblerBuffer buffer_;  // Contains position independent code.
+  GrowableObjectArray& object_pool_;  // Objects and patchable jump targets.
+  int32_t prologue_offset_;
+
+  bool use_far_branches_;
+
+  class CodeComment : public ZoneAllocated {
+   public:
+    CodeComment(intptr_t pc_offset, const String& comment)
+        : pc_offset_(pc_offset), comment_(comment) { }
+
+    intptr_t pc_offset() const { return pc_offset_; }
+    const String& comment() const { return comment_; }
+
+   private:
+    intptr_t pc_offset_;
+    const String& comment_;
+
+    DISALLOW_COPY_AND_ASSIGN(CodeComment);
+  };
+
+  GrowableArray<CodeComment*> comments_;
+
+  void AddSubHelper(OperandSize os, bool set_flags, bool subtract,
+                    Register rd, Register rn, Operand o) {
+    ASSERT((rd != R31) && (rn != R31));
+    const Register crd = ConcreteRegister(rd);
+    const Register crn = ConcreteRegister(rn);
+    if (o.type() == Operand::Immediate) {
+      ASSERT((rd != ZR) && (rn != ZR));
+      EmitAddSubImmOp(subtract ? SUBI : ADDI, crd, crn, o, os, set_flags);
+    } else if (o.type() == Operand::Shifted) {
+      ASSERT((rd != SP) && (rn != SP));
+      EmitAddSubShiftExtOp(subtract ? SUB : ADD, crd, crn, o, os, set_flags);
+    } else {
+      ASSERT(o.type() == Operand::Extended);
+      ASSERT((rd != SP) && (rn != ZR));
+      EmitAddSubShiftExtOp(subtract ? SUB : ADD, crd, crn, o, os, set_flags);
+    }
+  }
+
+  void EmitAddSubImmOp(AddSubImmOp op, Register rd, Register rn,
+                       Operand o, OperandSize os, bool set_flags) {
+    ASSERT((os == kDoubleWord) || (os == kWord));
+    const int32_t size = (os == kDoubleWord) ? B31 : 0;
+    const int32_t s = set_flags ? B29 : 0;
+    const int32_t encoding =
+        op | size | s |
+        (static_cast<int32_t>(rd) << kRdShift) |
+        (static_cast<int32_t>(rn) << kRnShift) |
+        o.encoding();
+    Emit(encoding);
+  }
+
+  void EmitAddSubShiftExtOp(AddSubShiftExtOp op,
+                            Register rd, Register rn, Operand o,
+                            OperandSize sz, bool set_flags) {
+    ASSERT((sz == kDoubleWord) || (sz == kWord));
+    const int32_t size = (sz == kDoubleWord) ? B31 : 0;
+    const int32_t s = set_flags ? B29 : 0;
+    const int32_t encoding =
+        op | size | s |
+        (static_cast<int32_t>(rd) << kRdShift) |
+        (static_cast<int32_t>(rn) << kRnShift) |
+        o.encoding();
+    Emit(encoding);
+  }
+
+  void EmitUnconditionalBranchRegOp(UnconditionalBranchRegOp op, Register rn) {
+    const int32_t encoding =
+        op | (static_cast<int32_t>(rn) << kRnShift);
+    Emit(encoding);
+  }
+
+  void EmitMoveWideOp(MoveWideOp op, Register rd, int32_t imm, int32_t hw_idx,
+                      OperandSize sz) {
+    ASSERT(Utils::IsUint(16, imm));
+    ASSERT((hw_idx >= 0) && (hw_idx <= 3));
+    ASSERT((sz == kDoubleWord) || (sz == kWord));
+    const int32_t size = (sz == kDoubleWord) ? B31 : 0;
+    const int32_t encoding =
+        op | size |
+        (static_cast<int32_t>(rd) << kRdShift) |
+        (hw_idx << kHWShift) |
+        (imm << kImm16Shift);
+    Emit(encoding);
+  }
+
+  void EmitLoadStoreReg(LoadStoreRegOp op, Register rt, Address a,
+                        OperandSize sz) {
+    const int32_t size = Log2OperandSizeBytes(sz);
+    const int32_t encoding =
+        op | (size << kSzShift) |
+        (static_cast<int32_t>(rt) << kRtShift) |
+        a.encoding();
+    Emit(encoding);
+  }
+
+  DISALLOW_ALLOCATION();
+  DISALLOW_COPY_AND_ASSIGN(Assembler);
+};
+
+}  // namespace dart
+
+#endif  // VM_ASSEMBLER_ARM64_H_
diff --git a/runtime/vm/assembler_arm64_test.cc b/runtime/vm/assembler_arm64_test.cc
new file mode 100644
index 0000000..6e26fe8
--- /dev/null
+++ b/runtime/vm/assembler_arm64_test.cc
@@ -0,0 +1,396 @@
+// 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.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_ARM64)
+
+#include "vm/assembler.h"
+#include "vm/cpu.h"
+#include "vm/os.h"
+#include "vm/unit_test.h"
+#include "vm/virtual_memory.h"
+
+namespace dart {
+
+#define __ assembler->
+
+ASSEMBLER_TEST_GENERATE(Simple, assembler) {
+  __ add(R0, ZR, Operand(ZR));
+  __ add(R0, R0, Operand(42));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Simple, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+// Move wide immediate tests.
+// movz
+ASSEMBLER_TEST_GENERATE(Movz0, assembler) {
+  __ movz(R0, 42, 0);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Movz0, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Movz1, assembler) {
+  __ movz(R0, 42, 0);  // Overwritten by next instruction.
+  __ movz(R0, 42, 1);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Movz1, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42LL << 16, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Movz2, assembler) {
+  __ movz(R0, 42, 2);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Movz2, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42LL << 32, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Movz3, assembler) {
+  __ movz(R0, 42, 3);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Movz3, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42LL << 48, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+// movn
+ASSEMBLER_TEST_GENERATE(Movn0, assembler) {
+  __ movn(R0, 42, 0);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Movn0, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(~42LL, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Movn1, assembler) {
+  __ movn(R0, 42, 1);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Movn1, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(~(42LL << 16), EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Movn2, assembler) {
+  __ movn(R0, 42, 2);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Movn2, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(~(42LL << 32), EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Movn3, assembler) {
+  __ movn(R0, 42, 3);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Movn3, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(~(42LL << 48), EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+// movk
+ASSEMBLER_TEST_GENERATE(Movk0, assembler) {
+  __ movz(R0, 1, 3);
+  __ movk(R0, 42, 0);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Movk0, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(
+      42LL | (1LL << 48), EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Movk1, assembler) {
+  __ movz(R0, 1, 0);
+  __ movk(R0, 42, 1);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Movk1, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(
+      (42LL << 16) | 1, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Movk2, assembler) {
+  __ movz(R0, 1, 0);
+  __ movk(R0, 42, 2);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Movk2, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(
+      (42LL << 32) | 1, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Movk3, assembler) {
+  __ movz(R0, 1, 0);
+  __ movk(R0, 42, 3);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Movk3, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(
+      (42LL << 48) | 1, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(MovzBig, assembler) {
+  __ movz(R0, 0x8000, 0);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(MovzBig, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(0x8000, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+// add tests.
+ASSEMBLER_TEST_GENERATE(AddReg, assembler) {
+  __ movz(R0, 20, 0);
+  __ movz(R1, 22, 0);
+  __ add(R0, R0, Operand(R1));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(AddReg, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(AddLSLReg, assembler) {
+  __ movz(R0, 20, 0);
+  __ movz(R1, 11, 0);
+  __ add(R0, R0, Operand(R1, LSL, 1));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(AddLSLReg, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(AddLSRReg, assembler) {
+  __ movz(R0, 20, 0);
+  __ movz(R1, 44, 0);
+  __ add(R0, R0, Operand(R1, LSR, 1));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(AddLSRReg, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(AddASRReg, assembler) {
+  __ movz(R0, 20, 0);
+  __ movz(R1, 44, 0);
+  __ add(R0, R0, Operand(R1, ASR, 1));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(AddASRReg, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(AddASRNegReg, assembler) {
+  __ movz(R0, 43, 0);
+  __ movn(R1, 0, 0);  // R1 <- -1
+  __ add(R1, ZR, Operand(R1, LSL, 3));  // R1 <- -8
+  __ add(R0, R0, Operand(R1, ASR, 3));  // R0 <- 43 + (-8 >> 3)
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(AddASRNegReg, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+// TODO(zra): test other sign extension modes.
+ASSEMBLER_TEST_GENERATE(AddExtReg, assembler) {
+  __ movz(R0, 43, 0);
+  __ movz(R1, 0xffff, 0);
+  __ movk(R1, 0xffff, 1);  // R1 <- -1 (32-bit)
+  __ add(R0, R0, Operand(R1, SXTW, 0));  // R0 <- R0 + (sign extended R1)
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(AddExtReg, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+// Loads and Stores.
+ASSEMBLER_TEST_GENERATE(SimpleLoadStore, assembler) {
+  __ movz(R0, 43, 0);
+  __ movz(R1, 42, 0);
+  __ str(R1, Address(SP, -1*kWordSize, Address::PreIndex));
+  __ ldr(R0, Address(SP, 1*kWordSize, Address::PostIndex));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(SimpleLoadStore, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) {
+  __ movz(R0, 43, 0);
+  __ movz(R1, 42, 0);
+  __ add(R2, SP, Operand(1));
+  __ str(R1, Address(R2, -1, Address::PreIndex));
+  __ ldr(R0, Address(R2, -1, Address::PostIndex));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) {
+  __ movz(R0, 43, 0);
+  __ movz(R1, 42, 0);
+  // Largest negative offset that can fit in the signed 9-bit immediate field.
+  __ str(R1, Address(SP, -32*kWordSize, Address::PreIndex));
+  // Largest positive kWordSize aligned offset that we can fit.
+  __ ldr(R0, Address(SP, 31*kWordSize, Address::PostIndex));
+  // Correction.
+  __ add(SP, SP, Operand(kWordSize));  // Restore SP.
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) {
+  __ movz(R0, 43, 0);
+  __ movz(R1, 42, 0);
+  __ sub(SP, SP, Operand(512*kWordSize));
+  __ str(R1, Address(SP, 512*kWordSize, Address::Offset));
+  __ add(SP, SP, Operand(512*kWordSize));
+  __ ldr(R0, Address(SP));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) {
+  __ movz(R0, 43, 0);
+  __ movz(R1, 42, 0);
+  __ movz(R2, 0xfff8, 0);
+  __ movk(R2, 0xffff, 1);  // R2 <- -8 (int32_t).
+  // This should sign extend R2, and add to SP to get address,
+  // i.e. SP - kWordSize.
+  __ str(R1, Address(SP, R2, SXTW));
+  __ sub(SP, SP, Operand(kWordSize));
+  __ ldr(R0, Address(SP));
+  __ add(SP, SP, Operand(kWordSize));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) {
+  __ movz(R0, 43, 0);
+  __ movz(R1, 42, 0);
+  __ movz(R2, 10, 0);
+  __ sub(SP, SP, Operand(10*kWordSize));
+  // Store R1 into SP + R2 * kWordSize.
+  __ str(R1, Address(SP, R2, UXTX, true));
+  __ ldr(R0, Address(SP, R2, UXTX, true));
+  __ add(SP, SP, Operand(10*kWordSize));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(LoadStoreScaledReg, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+}  // namespace dart
+
+#endif  // defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/assembler_test.cc b/runtime/vm/assembler_test.cc
index 2bd9563..e93889a 100644
--- a/runtime/vm/assembler_test.cc
+++ b/runtime/vm/assembler_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when test is ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "vm/assembler.h"
 #include "vm/globals.h"
 #include "vm/os.h"
@@ -73,3 +77,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/ast.cc b/runtime/vm/ast.cc
index aab3c6b..9a30a27 100644
--- a/runtime/vm/ast.cc
+++ b/runtime/vm/ast.cc
@@ -418,7 +418,8 @@
 
 
 const Instance* ClosureNode::EvalConstExpr() const {
-  if (function().IsImplicitStaticClosureFunction()) {
+  if (!is_deferred_reference_ &&
+      function().IsImplicitStaticClosureFunction()) {
     // Return a value that represents an instance. Only the type is relevant.
     return &Instance::Handle();
   }
@@ -562,6 +563,9 @@
 
 
 bool StaticGetterNode::IsPotentiallyConst() const {
+  if (is_deferred_reference_) {
+    return false;
+  }
   const String& getter_name =
       String::Handle(Field::GetterName(this->field_name()));
   const Function& getter_func =
@@ -574,6 +578,9 @@
 
 
 const Instance* StaticGetterNode::EvalConstExpr() const {
+  if (is_deferred_reference_) {
+    return NULL;
+  }
   const String& getter_name =
       String::Handle(Field::GetterName(this->field_name()));
   const Function& getter_func =
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index b2e87e8..bf9490b 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -440,7 +440,8 @@
       : AstNode(token_pos),
         function_(function),
         receiver_(receiver),
-        scope_(scope) {
+        scope_(scope),
+        is_deferred_reference_(false) {
     ASSERT(function_.IsZoneHandle());
     ASSERT((function_.IsNonImplicitClosureFunction() &&
             (receiver_ == NULL) && (scope_ != NULL)) ||
@@ -454,6 +455,8 @@
   AstNode* receiver() const { return receiver_; }
   LocalScope* scope() const { return scope_; }
 
+  void set_is_deferred(bool value) { is_deferred_reference_ = value; }
+
   virtual void VisitChildren(AstNodeVisitor* visitor) const {
     if (receiver() != NULL) {
       receiver()->Visit(visitor);
@@ -470,6 +473,7 @@
   const Function& function_;
   AstNode* receiver_;
   LocalScope* scope_;
+  bool is_deferred_reference_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(ClosureNode);
 };
@@ -482,12 +486,17 @@
 class PrimaryNode : public AstNode {
  public:
   PrimaryNode(intptr_t token_pos, const Object& primary)
-      : AstNode(token_pos), primary_(primary) {
+      : AstNode(token_pos),
+        primary_(primary),
+        is_deferred_reference_(false) {
     ASSERT(primary_.IsNotTemporaryScopedHandle());
   }
 
   const Object& primary() const { return primary_; }
 
+  void set_is_deferred(bool value) { is_deferred_reference_ = value; }
+  bool is_deferred_reference() const { return is_deferred_reference_; }
+
   bool IsSuper() const {
     return primary().IsString() && (primary().raw() == Symbols::Super().raw());
   }
@@ -498,6 +507,7 @@
 
  private:
   const Object& primary_;
+  bool is_deferred_reference_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(PrimaryNode);
 };
@@ -669,7 +679,6 @@
 };
 
 
-
 class UnaryOpNode : public AstNode {
  public:
   // Returns optimized version, e.g., for ('-' '1') ('-1') literal is returned.
@@ -1139,11 +1148,12 @@
 class LoadStaticFieldNode : public AstNode {
  public:
   LoadStaticFieldNode(intptr_t token_pos, const Field& field)
-      : AstNode(token_pos), field_(field) {
+      : AstNode(token_pos), field_(field), is_deferred_reference_(false) {
     ASSERT(field_.IsZoneHandle());
   }
 
   const Field& field() const { return field_; }
+  void set_is_deferred(bool value) { is_deferred_reference_ = value; }
 
   virtual void VisitChildren(AstNodeVisitor* visitor) const { }
 
@@ -1155,13 +1165,16 @@
 
   virtual const Instance* EvalConstExpr() const {
     ASSERT(field_.is_static());
-    return field_.is_const() ? &Instance::ZoneHandle(field_.value()) : NULL;
+    return !is_deferred_reference_ && field_.is_const()
+        ? &Instance::ZoneHandle(field_.value())
+        : NULL;
   }
 
   DECLARE_COMMON_NODE_FUNCTIONS(LoadStaticFieldNode);
 
  private:
   const Field& field_;
+  bool is_deferred_reference_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(LoadStaticFieldNode);
 };
@@ -1385,7 +1398,8 @@
         receiver_(receiver),
         cls_(cls),
         field_name_(field_name),
-        is_super_getter_(is_super_getter) {
+        is_super_getter_(is_super_getter),
+        is_deferred_reference_(false) {
     ASSERT(cls_.IsZoneHandle());
     ASSERT(field_name_.IsZoneHandle());
     ASSERT(field_name_.IsSymbol());
@@ -1401,6 +1415,7 @@
   const Class& cls() const { return cls_; }
   const String& field_name() const { return field_name_; }
   bool is_super_getter() const { return is_super_getter_; }
+  void set_is_deferred(bool value) { is_deferred_reference_ = value; }
 
   virtual void VisitChildren(AstNodeVisitor* visitor) const { }
 
@@ -1416,6 +1431,7 @@
   const Class& cls_;
   const String& field_name_;
   const bool is_super_getter_;
+  bool is_deferred_reference_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(StaticGetterNode);
 };
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 23efa89..24cd17f 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -8,6 +8,7 @@
 #include "bin/file.h"
 
 #include "platform/assert.h"
+#include "platform/globals.h"
 
 #include "vm/dart_api_impl.h"
 #include "vm/stack_frame.h"
@@ -30,6 +31,8 @@
   }
 }
 
+// TODO(zra): Remove when tests are ready to enable.
+#if !defined(TARGET_ARCH_ARM64)
 
 //
 // Measure compile of all functions in dart core lib classes.
@@ -578,4 +581,6 @@
   benchmark->set_score(elapsed_time);
 }
 
+#endif  // !defined(TARGET_ARCH_ARM64)
+
 }  // namespace dart
diff --git a/runtime/vm/cha_test.cc b/runtime/vm/cha_test.cc
index f78aeef..763cc4f 100644
--- a/runtime/vm/cha_test.cc
+++ b/runtime/vm/cha_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "platform/assert.h"
 #include "vm/cha.h"
 #include "vm/class_finalizer.h"
@@ -127,3 +131,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index c49794a..9e90e41 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -512,6 +512,77 @@
 }
 
 
+// This function reports a compilation error if the recursive 'type' T being
+// finalized is a non-contractive type, i.e. if the induced type set S of P is
+// not finite, where P is the instantiation of T with its own type parameters.
+// The induced type set S consists of the super types of any type in S as well
+// as the type arguments of any parameterized type in S.
+// The Dart Language Specification does not disallow the declaration and use of
+// non-contractive types (this may change). They are nevertheless disallowed
+// as an implementation restriction in the VM since they cause divergence.
+// A non-contractive type can be detected by looking at the queue of types
+// pending finalization that are mutually recursive with the checked type.
+void ClassFinalizer::CheckRecursiveType(const Class& cls,
+                                        const Type& type,
+                                        GrowableObjectArray* pending_types) {
+  Isolate* isolate = Isolate::Current();
+  if (FLAG_trace_type_finalization) {
+    OS::Print("Checking recursive type '%s': %s\n",
+              String::Handle(type.Name()).ToCString(),
+              type.ToCString());
+  }
+  const Class& type_cls = Class::Handle(isolate, type.type_class());
+  const TypeArguments& arguments =
+      TypeArguments::Handle(isolate, type.arguments());
+  // A type can only be recursive via its type arguments.
+  ASSERT(!arguments.IsNull());
+  const intptr_t num_type_args = arguments.Length();
+  ASSERT(num_type_args > 0);
+  ASSERT(num_type_args == type_cls.NumTypeArguments());
+  const intptr_t num_type_params = type_cls.NumTypeParameters();
+  const intptr_t first_type_param = num_type_args - num_type_params;
+  // If the type is not generic (num_type_params == 0) or if its type parameters
+  // are instantiated, no divergence can occur. Note that if the type parameters
+  // are null, i.e. if the generic type is raw, they are considered
+  // instantiated and no divergence can occur.
+  if ((num_type_params == 0) ||
+      arguments.IsSubvectorInstantiated(first_type_param, num_type_params)) {
+    return;
+  }
+  // The type parameters are not instantiated. Verify that there is no other
+  // type pending finalization with the same type class, but different
+  // uninstantiated type parameters.
+  Type& pending_type = Type::Handle(isolate);
+  TypeArguments& pending_arguments = TypeArguments::Handle(isolate);
+  const intptr_t num_pending_types = pending_types->Length();
+  for (intptr_t i = num_pending_types - 1; i >= 0; i--) {
+    pending_type ^= pending_types->At(i);
+    if (FLAG_trace_type_finalization) {
+      OS::Print("  Comparing with pending type '%s': %s\n",
+                String::Handle(pending_type.Name()).ToCString(),
+                pending_type.ToCString());
+    }
+    if ((pending_type.raw() != type.raw()) &&
+        (pending_type.type_class() == type_cls.raw())) {
+      pending_arguments = pending_type.arguments();
+      if (!pending_arguments.IsSubvectorEquivalent(arguments,
+                                                   first_type_param,
+                                                   num_type_params) &&
+          !pending_arguments.IsSubvectorInstantiated(first_type_param,
+                                                     num_type_params)) {
+        // Reject the non-contractive recursive type.
+        const Script& script = Script::Handle(isolate, cls.script());
+        const String& type_name = String::Handle(isolate, type.Name());
+        ReportError(Error::Handle(isolate),  // No previous error.
+                    script, type.token_pos(),
+                    "illegal recursive type '%s'",
+                    type_name.ToCString());
+      }
+    }
+  }
+}
+
+
 // Finalize the type argument vector 'arguments' of the type defined by the
 // class 'cls' parameterized with the type arguments 'cls_args'.
 // The vector 'cls_args' is already initialized as a subvector at the correct
@@ -543,12 +614,15 @@
 // It is too early to canonicalize the type arguments of the vector, because
 // several type argument vectors may be mutually recursive and finalized at the
 // same time. Canonicalization happens when pending types are processed.
+// The trail is required to correctly instantiate a recursive type argument
+// of the super type.
 void ClassFinalizer::FinalizeTypeArguments(
     const Class& cls,
     const TypeArguments& arguments,
     intptr_t num_uninitialized_arguments,
     Error* bound_error,
-    GrowableObjectArray* pending_types) {
+    GrowableObjectArray* pending_types,
+    GrowableObjectArray* trail) {
   ASSERT(arguments.Length() >= cls.NumTypeArguments());
   if (!cls.is_type_finalized()) {
     FinalizeTypeParameters(cls, pending_types);
@@ -574,31 +648,76 @@
     for (intptr_t i = super_offset; i < num_uninitialized_arguments; i++) {
       if (!super_type_args.IsNull()) {
         super_type_arg = super_type_args.TypeAt(i);
-        if (!super_type_arg.IsFinalized()) {
-          super_type_arg ^= FinalizeType(
-              cls, super_type_arg, kFinalize, pending_types);
-          super_type_args.SetTypeAt(i, super_type_arg);
+        if (!super_type_arg.IsTypeRef()) {
+          if (super_type_arg.IsBeingFinalized()) {
+            ASSERT(super_type_arg.IsType());
+            CheckRecursiveType(cls, Type::Cast(super_type_arg), pending_types);
+            if (FLAG_trace_type_finalization) {
+              OS::Print("Creating TypeRef '%s': '%s'\n",
+                        String::Handle(super_type_arg.Name()).ToCString(),
+                        super_type_arg.ToCString());
+            }
+            super_type_arg = TypeRef::New(super_type_arg);
+            super_type_args.SetTypeAt(i, super_type_arg);
+          } else {
+            if (!super_type_arg.IsFinalized()) {
+              super_type_arg ^= FinalizeType(
+                  cls, super_type_arg, kFinalize, pending_types);
+              super_type_args.SetTypeAt(i, super_type_arg);
+              // Note that super_type_arg may still not be finalized here, in
+              // which case it is a TypeRef to a legal recursive type.
+            }
+          }
         }
-        if (!super_type_arg.IsBeingFinalized() &&
-            !super_type_arg.IsInstantiated()) {
+        // Instantiate super_type_arg with the current argument vector.
+        if (!super_type_arg.IsInstantiated()) {
+          if (FLAG_trace_type_finalization && super_type_arg.IsTypeRef()) {
+            AbstractType& ref_type = AbstractType::Handle(
+                TypeRef::Cast(super_type_arg).type());
+            OS::Print("Instantiating TypeRef '%s': '%s'\n"
+                      "  instantiator: '%s'\n",
+                      String::Handle(super_type_arg.Name()).ToCString(),
+                      ref_type.ToCString(),
+                      arguments.ToCString());
+          }
           Error& error = Error::Handle();
-          super_type_arg = super_type_arg.InstantiateFrom(arguments, &error);
+          super_type_arg =
+              super_type_arg.InstantiateFrom(arguments, &error, trail);
           if (!error.IsNull()) {
             // InstantiateFrom does not report an error if the type is still
-            // uninstantiated. Instead, it will return a new BoundedType so that
-            // the check is postponed to run time.
+            // uninstantiated. Instead, it will return a new BoundedType so
+            // that the check is postponed to run time.
             ASSERT(super_type_arg.IsInstantiated());
             // Keep only the first bound error.
             if (bound_error->IsNull()) {
               *bound_error = error.raw();
             }
           }
+          if (!super_type_arg.IsFinalized() &&
+              !super_type_arg.IsBeingFinalized()) {
+            // The super_type_arg was instantiated from a type being finalized.
+            // We need to finish finalizing its type arguments.
+            if (super_type_arg.IsTypeRef()) {
+              super_type_arg = TypeRef::Cast(super_type_arg).type();
+            }
+            Type::Cast(super_type_arg).set_is_being_finalized();
+            pending_types->Add(super_type_arg);
+            const Class& cls = Class::Handle(super_type_arg.type_class());
+            FinalizeTypeArguments(
+                cls,
+                TypeArguments::Handle(super_type_arg.arguments()),
+                cls.NumTypeArguments() - cls.NumTypeParameters(),
+                bound_error,
+                pending_types,
+                trail);
+            Type::Cast(super_type_arg).SetIsFinalized();
+          }
         }
       }
       arguments.SetTypeAt(i, super_type_arg);
     }
     FinalizeTypeArguments(super_class, arguments, super_offset,
-                          bound_error, pending_types);
+                          bound_error, pending_types, trail);
   }
 }
 
@@ -763,26 +882,28 @@
     return type.raw();
   }
 
-  if (type.IsBeingFinalized()) {
-    if (FLAG_trace_type_finalization) {
-      OS::Print("Creating TypeRef '%s' for class '%s'\n",
-                String::Handle(type.Name()).ToCString(),
-                cls.ToCString());
-    }
-    return TypeRef::New(type);
+  // Recursive types must be processed in FinalizeTypeArguments() and cannot be
+  // encountered here.
+  ASSERT(!type.IsBeingFinalized());
+
+  // A malformed type gets mapped to a finalized type.
+  ResolveType(cls, type);
+  if (type.IsMalformed()) {
+    ASSERT(type.IsFinalized());
+    return type.raw();
   }
 
-  ResolveType(cls, type);
+  Isolate* isolate = Isolate::Current();
   if (FLAG_trace_type_finalization) {
     OS::Print("Finalizing type '%s' for class '%s'\n",
-              String::Handle(type.Name()).ToCString(),
+              String::Handle(isolate, type.Name()).ToCString(),
               cls.ToCString());
   }
 
   if (type.IsTypeParameter()) {
     const TypeParameter& type_parameter = TypeParameter::Cast(type);
     const Class& parameterized_class =
-        Class::Handle(type_parameter.parameterized_class());
+        Class::Handle(isolate, type_parameter.parameterized_class());
     ASSERT(!parameterized_class.IsNull());
     // The index must reflect the position of this type parameter in the type
     // arguments vector of its parameterized class. The offset to add is the
@@ -802,7 +923,7 @@
 
     if (FLAG_trace_type_finalization) {
       OS::Print("Done finalizing type parameter '%s' with index %" Pd "\n",
-                String::Handle(type_parameter.name()).ToCString(),
+                String::Handle(isolate, type_parameter.name()).ToCString(),
                 type_parameter.index());
     }
 
@@ -813,7 +934,6 @@
   // At this point, we can only have a parameterized_type.
   const Type& parameterized_type = Type::Cast(type);
 
-  Isolate* isolate = Isolate::Current();
   // This type is the root type of the type graph if no pending types queue is
   // allocated yet.
   const bool is_root_type = (pending_types == NULL);
@@ -862,6 +982,12 @@
     parameterized_type.set_arguments(arguments);
   }
 
+  // Mark the type as being finalized in order to detect self reference and
+  // postpone bound checking until after all types in the graph of
+  // mutually recursive types are finalized.
+  parameterized_type.set_is_being_finalized();
+  pending_types->Add(parameterized_type);
+
   // The full type argument vector consists of the type arguments of the
   // super types of type_class, which are initialized from the parsed
   // type arguments, followed by the parsed type arguments.
@@ -891,11 +1017,8 @@
       // num_type_parameters) of this type being finalized with the still
       // unfinalized run-time argument vector (of length num_type_arguments).
       // This type being finalized may be recursively reached via bounds
-      // checking, in which case type arguments of super classes will be seen
-      // as dynamic.
+      // checking or type arguments of its super type.
       parameterized_type.set_arguments(full_arguments);
-      // Mark type as being finalized in order to detect self reference.
-      parameterized_type.set_is_being_finalized();
       // Finalize the current type arguments of the type, which are still the
       // parsed type arguments.
       if (!arguments.IsNull()) {
@@ -928,17 +1051,15 @@
         owner_class = type_class.raw();
       }
       if (offset > 0) {
+        GrowableObjectArray& trail =
+            GrowableObjectArray::Handle(isolate, GrowableObjectArray::New());
         FinalizeTypeArguments(owner_class, full_arguments, offset,
-                              &bound_error, pending_types);
+                              &bound_error, pending_types, &trail);
       }
       if (full_arguments.IsRaw(0, num_type_arguments)) {
         // The parameterized_type is raw. Set its argument vector to null, which
         // is more efficient in type tests.
         full_arguments = TypeArguments::null();
-      } else {
-        // Postpone bound checking until after all types in the graph of
-        // mutually recursive types are finalized.
-        pending_types->Add(parameterized_type);
       }
       parameterized_type.set_arguments(full_arguments);
     } else {
@@ -952,15 +1073,21 @@
            !full_arguments.IsRaw(0, num_type_arguments));
     // Mark the type as finalized.
     parameterized_type.SetIsFinalized();
+    // Do not yet remove the type from the pending_types array.
   }
 
   // If we are done finalizing a graph of mutually recursive types, check their
   // bounds.
   if (is_root_type) {
     Type& type = Type::Handle(isolate);
-    for (intptr_t i = 0; i < types.Length(); i++) {
+    for (intptr_t i = types.Length() - 1; i >= 0; i--) {
       type ^= types.At(i);
       CheckTypeBounds(cls, type);
+      if (FLAG_trace_type_finalization && type.IsRecursive()) {
+        OS::Print("Done finalizing recursive type '%s': %s\n",
+                  String::Handle(isolate, type.Name()).ToCString(),
+                  type.ToCString());
+      }
     }
   }
 
@@ -984,6 +1111,14 @@
   }
 
   if (finalization >= kCanonicalize) {
+    if (FLAG_trace_type_finalization && parameterized_type.IsRecursive()) {
+      AbstractType& type = Type::Handle(isolate);
+      type = parameterized_type.Canonicalize();
+      OS::Print("Done canonicalizing recursive type '%s': %s\n",
+                String::Handle(isolate, type.Name()).ToCString(),
+                type.ToCString());
+      return type.raw();
+    }
     return parameterized_type.Canonicalize();
   } else {
     return parameterized_type.raw();
@@ -2387,27 +2522,28 @@
     const MixinAppType& mixin_app_type) {
   // Lookup or create mixin application classes in the library of cls
   // and resolve super type and mixin types.
-  const Library& library = Library::Handle(cls.library());
+  Isolate* isolate = Isolate::Current();
+  const Library& library = Library::Handle(isolate, cls.library());
   ASSERT(!library.IsNull());
-  const Script& script = Script::Handle(cls.script());
+  const Script& script = Script::Handle(isolate, cls.script());
   ASSERT(!script.IsNull());
   const GrowableObjectArray& type_args =
-      GrowableObjectArray::Handle(GrowableObjectArray::New());
+      GrowableObjectArray::Handle(isolate, GrowableObjectArray::New());
   AbstractType& mixin_super_type =
-      AbstractType::Handle(mixin_app_type.super_type());
+      AbstractType::Handle(isolate, mixin_app_type.super_type());
   ResolveType(cls, mixin_super_type);
   ASSERT(mixin_super_type.HasResolvedTypeClass());  // Even if malformed.
   // The super type may have a BoundedType as type argument, but cannot be
   // a BoundedType itself.
   CollectTypeArguments(cls, Type::Cast(mixin_super_type), type_args);
-  AbstractType& mixin_type = AbstractType::Handle();
-  Type& generic_mixin_type = Type::Handle();
-  Class& mixin_type_class = Class::Handle();
-  Class& mixin_app_class = Class::Handle();
-  String& mixin_app_class_name = String::Handle();
-  String& mixin_type_class_name = String::Handle();
-  AbstractType& super_type_arg = AbstractType::Handle();
-  AbstractType& mixin_type_arg = AbstractType::Handle();
+  AbstractType& mixin_type = AbstractType::Handle(isolate);
+  Type& generic_mixin_type = Type::Handle(isolate);
+  Class& mixin_type_class = Class::Handle(isolate);
+  Class& mixin_app_class = Class::Handle(isolate);
+  String& mixin_app_class_name = String::Handle(isolate);
+  String& mixin_type_class_name = String::Handle(isolate);
+  AbstractType& super_type_arg = AbstractType::Handle(isolate);
+  AbstractType& mixin_type_arg = AbstractType::Handle(isolate);
   const intptr_t depth = mixin_app_type.Depth();
   for (intptr_t i = 0; i < depth; i++) {
     mixin_type = mixin_app_type.MixinTypeAt(i);
@@ -2469,7 +2605,7 @@
       // Add the mixin type to the list of interfaces that the mixin application
       // class implements. This is necessary so that cycle check work at
       // compile time (type arguments are ignored by that check).
-      const Array& interfaces = Array::Handle(Array::New(1));
+      const Array& interfaces = Array::Handle(isolate, Array::New(1));
       interfaces.SetAt(0, generic_mixin_type);
       ASSERT(mixin_app_class.interfaces() == Object::empty_array().raw());
       mixin_app_class.set_interfaces(interfaces);
@@ -2491,12 +2627,14 @@
                                  Object::null_type_arguments(),
                                  mixin_type.token_pos());
   }
-  AbstractType& type_arg = AbstractType::Handle();
-  const TypeArguments& mixin_app_args =
-    TypeArguments::Handle(TypeArguments::New(type_args.Length()));
-  for (intptr_t i = 0; i < type_args.Length(); i++) {
-    type_arg ^= type_args.At(i);
-    mixin_app_args.SetTypeAt(i, type_arg);
+  TypeArguments& mixin_app_args = TypeArguments::Handle(isolate);
+  if (type_args.Length() > 0) {
+    mixin_app_args = TypeArguments::New(type_args.Length());
+    AbstractType& type_arg = AbstractType::Handle(isolate);
+    for (intptr_t i = 0; i < type_args.Length(); i++) {
+      type_arg ^= type_args.At(i);
+      mixin_app_args.SetTypeAt(i, type_arg);
+    }
   }
   if (FLAG_trace_class_finalization) {
     OS::Print("ResolveMixinAppType: mixin appl type args: %s\n",
@@ -2528,13 +2666,14 @@
   if (FLAG_trace_class_finalization) {
     OS::Print("Resolving super and interfaces: %s\n", cls.ToCString());
   }
+  Isolate* isolate = Isolate::Current();
   const intptr_t cls_index = cls.id();
   for (intptr_t i = 0; i < visited->length(); i++) {
     if ((*visited)[i] == cls_index) {
       // We have already visited class 'cls'. We found a cycle.
-      const String& class_name = String::Handle(cls.Name());
-      const Script& script = Script::Handle(cls.script());
-      ReportError(Error::Handle(),  // No previous error.
+      const String& class_name = String::Handle(isolate, cls.Name());
+      const Script& script = Script::Handle(isolate, cls.script());
+      ReportError(Error::Handle(isolate),  // No previous error.
                   script, cls.token_pos(),
                   "cyclic reference found for class '%s'",
                   class_name.ToCString());
@@ -2543,8 +2682,8 @@
 
   // If the class/interface has no explicit super class/interfaces
   // and is not a mixin application, we are done.
-  AbstractType& super_type = AbstractType::Handle(cls.super_type());
-  Array& super_interfaces = Array::Handle(cls.interfaces());
+  AbstractType& super_type = AbstractType::Handle(isolate, cls.super_type());
+  Array& super_interfaces = Array::Handle(isolate, cls.interfaces());
   if ((super_type.IsNull() || super_type.IsObjectType()) &&
       (super_interfaces.Length() == 0)) {
     cls.set_is_cycle_free();
@@ -2567,29 +2706,30 @@
 
   // Resolve and check the super type and interfaces of cls.
   visited->Add(cls_index);
-  AbstractType& interface = AbstractType::Handle();
-  Class& interface_class = Class::Handle();
+  AbstractType& interface = AbstractType::Handle(isolate);
+  Class& interface_class = Class::Handle(isolate);
 
   // Resolve super type. Failures lead to a longjmp.
   ResolveType(cls, super_type);
   if (super_type.IsMalformedOrMalbounded()) {
-    ReportError(Error::Handle(super_type.error()));
+    ReportError(Error::Handle(isolate, super_type.error()));
   }
   if (super_type.IsDynamicType()) {
-    const Script& script = Script::Handle(cls.script());
-    ReportError(Error::Handle(),  // No previous error.
+    const Script& script = Script::Handle(isolate, cls.script());
+    ReportError(Error::Handle(isolate),  // No previous error.
                 script, cls.token_pos(),
                 "class '%s' may not extend 'dynamic'",
-                String::Handle(cls.Name()).ToCString());
+                String::Handle(isolate, cls.Name()).ToCString());
   }
   interface_class = super_type.type_class();
   if (interface_class.IsSignatureClass()) {
-    const Script& script = Script::Handle(cls.script());
-    ReportError(Error::Handle(),  // No previous error.
+    const Script& script = Script::Handle(isolate, cls.script());
+    ReportError(Error::Handle(isolate),  // No previous error.
                 script, cls.token_pos(),
                 "class '%s' may not extend function type alias '%s'",
-                String::Handle(cls.Name()).ToCString(),
-                String::Handle(super_type.UserVisibleName()).ToCString());
+                String::Handle(isolate, cls.Name()).ToCString(),
+                String::Handle(isolate,
+                               super_type.UserVisibleName()).ToCString());
   }
 
   // If cls belongs to core lib or to core lib's implementation, restrictions
@@ -2634,12 +2774,12 @@
       }
     }
     if (is_error) {
-      const Script& script = Script::Handle(cls.script());
-      ReportError(Error::Handle(),  // No previous error.
+      const Script& script = Script::Handle(isolate, cls.script());
+      ReportError(Error::Handle(isolate),  // No previous error.
                   script, cls.token_pos(),
                   "'%s' is not allowed to extend '%s'",
-                  String::Handle(cls.Name()).ToCString(),
-                  String::Handle(interface_class.Name()).ToCString());
+                  String::Handle(isolate, cls.Name()).ToCString(),
+                  String::Handle(isolate, interface_class.Name()).ToCString());
     }
   }
   // Now resolve the super interfaces of the super type.
@@ -2652,21 +2792,21 @@
     ASSERT(!interface.IsTypeParameter());  // Should be detected by parser.
     // A malbounded interface is only reported when involved in a type test.
     if (interface.IsMalformed()) {
-      ReportError(Error::Handle(interface.error()));
+      ReportError(Error::Handle(isolate, interface.error()));
     }
     if (interface.IsDynamicType()) {
-      const Script& script = Script::Handle(cls.script());
-      ReportError(Error::Handle(),  // No previous error.
+      const Script& script = Script::Handle(isolate, cls.script());
+      ReportError(Error::Handle(isolate),  // No previous error.
                   script, cls.token_pos(),
                   "'dynamic' may not be used as interface");
     }
     interface_class = interface.type_class();
     if (interface_class.IsSignatureClass()) {
-      const Script& script = Script::Handle(cls.script());
-      ReportError(Error::Handle(),  // No previous error.
+      const Script& script = Script::Handle(isolate, cls.script());
+      ReportError(Error::Handle(isolate),  // No previous error.
                   script, cls.token_pos(),
                   "function type alias '%s' may not be used as interface",
-                  String::Handle(interface_class.Name()).ToCString());
+                  String::Handle(isolate, interface_class.Name()).ToCString());
     }
     // Verify that unless cls belongs to core lib, it cannot extend, implement,
     // or mixin any of Null, bool, num, int, double, String, dynamic.
@@ -2678,18 +2818,19 @@
           interface.IsDoubleType() ||
           interface.IsStringType() ||
           interface.IsDynamicType()) {
-        const Script& script = Script::Handle(cls.script());
-        const String& interface_name = String::Handle(interface_class.Name());
+        const Script& script = Script::Handle(isolate, cls.script());
+        const String& interface_name = String::Handle(isolate,
+                                                      interface_class.Name());
         if (cls.IsMixinApplication()) {
-          ReportError(Error::Handle(),  // No previous error.
+          ReportError(Error::Handle(isolate),  // No previous error.
                       script, cls.token_pos(),
                       "illegal mixin of '%s'",
                       interface_name.ToCString());
         } else {
-          ReportError(Error::Handle(),  // No previous error.
+          ReportError(Error::Handle(isolate),  // No previous error.
                       script, cls.token_pos(),
                       "'%s' is not allowed to extend or implement '%s'",
-                      String::Handle(cls.Name()).ToCString(),
+                      String::Handle(isolate, cls.Name()).ToCString(),
                       interface_name.ToCString());
         }
       }
diff --git a/runtime/vm/class_finalizer.h b/runtime/vm/class_finalizer.h
index f0d8061..92740ca 100644
--- a/runtime/vm/class_finalizer.h
+++ b/runtime/vm/class_finalizer.h
@@ -145,7 +145,11 @@
                                     const TypeArguments& arguments,
                                     intptr_t num_uninitialized_arguments,
                                     Error* bound_error,
-                                    GrowableObjectArray* pending_types);
+                                    GrowableObjectArray* pending_types,
+                                    GrowableObjectArray* trail);
+  static void CheckRecursiveType(const Class& cls,
+                                 const Type& type,
+                                 GrowableObjectArray* pending_types);
   static void CheckTypeBounds(const Class& cls, const Type& type);
   static void CheckTypeArgumentBounds(const Class& cls,
                                       const TypeArguments& arguments,
diff --git a/runtime/vm/code_descriptors.cc b/runtime/vm/code_descriptors.cc
index 1b7d395..b889912 100644
--- a/runtime/vm/code_descriptors.cc
+++ b/runtime/vm/code_descriptors.cc
@@ -71,7 +71,6 @@
   for (intptr_t i = 0; i < num_entries; i++) {
     stack_map_ = MapAt(i);
     stack_map_.SetPC(entry_point + stack_map_.PC());
-    stack_map_.SetCode(code);
   }
   return Array::MakeArray(list_);
 }
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index 3780f91..e8c8092 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "platform/assert.h"
 #include "vm/globals.h"
 
@@ -280,3 +284,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 071cecb..8eee03d 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -60,6 +60,8 @@
 DEFINE_FLAG(bool, use_osr, true, "Use on-stack replacement.");
 DEFINE_FLAG(bool, trace_osr, false, "Trace attempts at on-stack replacement.");
 
+DECLARE_FLAG(charp, deoptimize_filter);
+
 
 DEFINE_RUNTIME_ENTRY(TraceFunctionEntry, 1) {
   const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
@@ -619,34 +621,6 @@
 }
 
 
-// Resolves and compiles the target function of an instance call, updates
-// function cache of the receiver's class and returns the compiled code or null.
-// Only the number of named arguments is checked, but not the actual names.
-RawCode* ResolveCompileInstanceCallTarget(const Instance& receiver,
-                                          const ICData& ic_data) {
-  ArgumentsDescriptor
-      arguments_descriptor(Array::Handle(ic_data.arguments_descriptor()));
-  String& function_name = String::Handle(ic_data.target_name());
-  ASSERT(function_name.IsSymbol());
-
-  Function& function = Function::Handle();
-  function = Resolver::ResolveDynamic(receiver,
-                                      function_name,
-                                      arguments_descriptor);
-  if (function.IsNull()) {
-    return Code::null();
-  } else {
-    if (!function.HasCode()) {
-      const Error& error = Error::Handle(Compiler::CompileFunction(function));
-      if (!error.IsNull()) {
-        Exceptions::PropagateError(error);
-      }
-    }
-    return function.CurrentCode();
-  }
-}
-
-
 // Result of an invoke may be an unhandled exception, in which case we
 // rethrow it.
 static void CheckResultError(const Object& result) {
@@ -677,24 +651,98 @@
 }
 
 
+// An instance call of the form o.f(...) could not be resolved.  Check if
+// there is a getter with the same name.  If so, invoke it.  If the value is
+// a closure, invoke it with the given arguments.  If the value is a
+// non-closure, attempt to invoke "call" on it.
+static bool ResolveCallThroughGetter(const Instance& receiver,
+                                     const Class& receiver_class,
+                                     const String& target_name,
+                                     const Array& arguments_descriptor,
+                                     const ICData& ic_data,
+                                     Function* result) {
+  // 1. Check if there is a getter with the same name.
+  const String& getter_name = String::Handle(Field::GetterName(target_name));
+  const int kNumArguments = 1;
+  ArgumentsDescriptor args_desc(
+      Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
+  const Function& getter = Function::Handle(
+      Resolver::ResolveDynamicForReceiverClass(receiver_class,
+                                               getter_name,
+                                               args_desc));
+  if (getter.IsNull() || getter.IsMethodExtractor()) {
+    return false;
+  }
+
+  const Function& target_function =
+      Function::Handle(receiver_class.GetInvocationDispatcher(
+          target_name,
+          arguments_descriptor,
+          RawFunction::kInvokeFieldDispatcher));
+  ASSERT(!target_function.IsNull());
+  if (FLAG_trace_ic) {
+    OS::PrintErr("InvokeField IC miss: adding <%s> id:%" Pd " -> <%s>\n",
+        Class::Handle(receiver.clazz()).ToCString(),
+        receiver.GetClassId(),
+        target_function.ToCString());
+  }
+  *result = target_function.raw();
+  return true;
+}
+
+
+// Handle other invocations (implicit closures, noSuchMethod).
+RawFunction* InlineCacheMissHelper(
+    const Instance& receiver,
+    const ICData& ic_data) {
+  const Array& args_descriptor = Array::Handle(ic_data.arguments_descriptor());
+
+  const Class& receiver_class = Class::Handle(receiver.clazz());
+  const String& target_name = String::Handle(ic_data.target_name());
+
+  Function& result = Function::Handle();
+  if (!ResolveCallThroughGetter(receiver,
+                                receiver_class,
+                                target_name,
+                                args_descriptor,
+                                ic_data,
+                                &result)) {
+    ArgumentsDescriptor desc(args_descriptor);
+    const Function& target_function =
+        Function::Handle(receiver_class.GetInvocationDispatcher(
+            target_name,
+            args_descriptor,
+            RawFunction::kNoSuchMethodDispatcher));
+    if (FLAG_trace_ic) {
+      OS::PrintErr("NoSuchMethod IC miss: adding <%s> id:%" Pd " -> <%s>\n",
+          Class::Handle(receiver.clazz()).ToCString(),
+          receiver.GetClassId(),
+          target_function.ToCString());
+    }
+    result = target_function.raw();
+  }
+  return result.raw();
+}
+
 static RawFunction* InlineCacheMissHandler(
     const GrowableArray<const Instance*>& args,
     const ICData& ic_data) {
   const Instance& receiver = *args[0];
-  const Code& target_code =
-      Code::Handle(ResolveCompileInstanceCallTarget(receiver, ic_data));
-  if (target_code.IsNull()) {
-    // Let the megamorphic stub handle special cases: NoSuchMethod,
-    // closure calls.
+  ArgumentsDescriptor
+      arguments_descriptor(Array::Handle(ic_data.arguments_descriptor()));
+  String& function_name = String::Handle(ic_data.target_name());
+  ASSERT(function_name.IsSymbol());
+  Function& target_function = Function::Handle(
+      Resolver::ResolveDynamic(receiver, function_name, arguments_descriptor));
+  if (target_function.IsNull()) {
     if (FLAG_trace_ic) {
-      OS::PrintErr("InlineCacheMissHandler NULL code for %s receiver: %s\n",
+      OS::PrintErr("InlineCacheMissHandler NULL function for %s receiver: %s\n",
                    String::Handle(ic_data.target_name()).ToCString(),
                    receiver.ToCString());
     }
-    return Function::null();
+    ic_data.set_is_closure_call(true);
+    target_function = InlineCacheMissHelper(receiver, ic_data);
   }
-  const Function& target_function =
-      Function::Handle(target_code.function());
   ASSERT(!target_function.IsNull());
   if (args.length() == 1) {
     ic_data.AddReceiverCheck(args[0]->GetClassId(), target_function);
@@ -832,9 +880,7 @@
 //   Arg1: ICData object.
 //   Arg2: Arguments descriptor array.
 
-//   Returns: target instructions to call or null if the
-// InstanceFunctionLookup stub should be used (e.g., to invoke no such
-// method and implicit closures)..
+//   Returns: target function to call.
 DEFINE_RUNTIME_ENTRY(MegamorphicCacheMissHandler, 3) {
   const Instance& receiver = Instance::CheckedHandle(arguments.ArgAt(0));
   const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(1));
@@ -850,59 +896,21 @@
   }
 
   ArgumentsDescriptor args_desc(descriptor);
-  const Function& target = Function::Handle(
+  Function& target_function = Function::Handle(
       Resolver::ResolveDynamicForReceiverClass(cls,
                                                name,
                                                args_desc));
-
-  Instructions& instructions = Instructions::Handle();
-  if (!target.IsNull()) {
-    if (!target.HasCode()) {
-      const Error& error = Error::Handle(Compiler::CompileFunction(target));
-      if (!error.IsNull()) {
-        Exceptions::PropagateError(error);
-      }
-    }
-    ASSERT(target.HasCode());
-    instructions = Code::Handle(target.CurrentCode()).instructions();
+  if (target_function.IsNull()) {
+    ic_data.set_is_closure_call(true);
+    target_function = InlineCacheMissHelper(receiver, ic_data);
   }
-  arguments.SetReturn(instructions);
-  if (instructions.IsNull()) return;
 
+  ASSERT(!target_function.IsNull());
+  // Insert function found into cache and return it.
   cache.EnsureCapacity();
   const Smi& class_id = Smi::Handle(Smi::New(cls.id()));
-  cache.Insert(class_id, target);
-  return;
-}
-
-
-// Updates IC data for two arguments. Used by the equality operation when
-// the control flow bypasses regular inline cache (null arguments).
-//   Arg0: Receiver object.
-//   Arg1: Argument after receiver.
-//   Arg2: Target's name.
-//   Arg3: ICData.
-DEFINE_RUNTIME_ENTRY(UpdateICDataTwoArgs, 4) {
-  const Instance& receiver = Instance::CheckedHandle(arguments.ArgAt(0));
-  const Instance& arg1 = Instance::CheckedHandle(arguments.ArgAt(1));
-  const String& target_name = String::CheckedHandle(arguments.ArgAt(2));
-  const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(3));
-  GrowableArray<const Instance*> args(2);
-  args.Add(&receiver);
-  args.Add(&arg1);
-  const intptr_t kNumArguments = 2;
-    ArgumentsDescriptor args_desc(
-        Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
-  const Function& target_function = Function::Handle(
-      Resolver::ResolveDynamic(receiver,
-                               target_name,
-                               args_desc));
-  ASSERT(!target_function.IsNull());
-  GrowableArray<intptr_t> class_ids(kNumArguments);
-  ASSERT(ic_data.num_args_tested() == kNumArguments);
-  class_ids.Add(receiver.GetClassId());
-  class_ids.Add(arg1.GetClassId());
-  ic_data.AddCheck(class_ids, target_function);
+  cache.Insert(class_id, target_function);
+  arguments.SetReturn(target_function);
 }
 
 
@@ -950,126 +958,6 @@
 }
 
 
-// An instance call of the form o.f(...) could not be resolved.  Check if
-// there is a getter with the same name.  If so, invoke it.  If the value is
-// a closure, invoke it with the given arguments.  If the value is a
-// non-closure, attempt to invoke "call" on it.
-static bool ResolveCallThroughGetter(const Instance& receiver,
-                                     const Class& receiver_class,
-                                     const String& target_name,
-                                     const Array& arguments_descriptor,
-                                     const Array& arguments,
-                                     const ICData& ic_data,
-                                     Object* result) {
-  // 1. Check if there is a getter with the same name.
-  const String& getter_name = String::Handle(Field::GetterName(target_name));
-  const int kNumArguments = 1;
-  ArgumentsDescriptor args_desc(
-      Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
-  const Function& getter = Function::Handle(
-      Resolver::ResolveDynamicForReceiverClass(receiver_class,
-                                               getter_name,
-                                               args_desc));
-  if (getter.IsNull() || getter.IsMethodExtractor()) {
-    return false;
-  }
-
-  const Function& target_function =
-      Function::Handle(receiver_class.GetInvocationDispatcher(
-          target_name,
-          arguments_descriptor,
-          RawFunction::kInvokeFieldDispatcher));
-  // Update IC data.
-  ASSERT(!target_function.IsNull());
-  ic_data.AddReceiverCheck(receiver.GetClassId(), target_function);
-  if (FLAG_trace_ic) {
-    OS::PrintErr("InvokeField IC miss: adding <%s> id:%" Pd " -> <%s>\n",
-        Class::Handle(receiver.clazz()).ToCString(),
-        receiver.GetClassId(),
-        target_function.ToCString());
-  }
-  *result = DartEntry::InvokeFunction(target_function,
-                                      arguments,
-                                      arguments_descriptor);
-  CheckResultError(*result);
-  return true;
-}
-
-
-// The IC miss handler has failed to find a (cacheable) instance function to
-// invoke.  Handle three possibilities:
-//
-// 1. If the call was a getter o.f, there may be an instance function with
-//    the same name.  If so, create an implicit closure and return it.
-//
-// 2. If the call was an instance call o.f(...), there may be a getter with
-//    the same name.  If so, invoke it.  If the value is a closure, invoke
-//    it with the given arguments.  If the value is a non-closure, attempt
-//    to invoke "call" on it.
-//
-// 3. There is no such method.
-DEFINE_RUNTIME_ENTRY(InstanceFunctionLookup, 4) {
-  const Instance& receiver = Instance::CheckedHandle(arguments.ArgAt(0));
-  const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(1));
-  const Array& args_descriptor = Array::CheckedHandle(arguments.ArgAt(2));
-  const Array& args = Array::CheckedHandle(arguments.ArgAt(3));
-
-  const Class& receiver_class = Class::Handle(receiver.clazz());
-  const String& target_name = String::Handle(ic_data.target_name());
-
-  Object& result = Object::Handle();
-  if (!ResolveCallThroughGetter(receiver,
-                                receiver_class,
-                                target_name,
-                                args_descriptor,
-                                args,
-                                ic_data,
-                                &result)) {
-    ArgumentsDescriptor desc(args_descriptor);
-    const Function& target_function =
-        Function::Handle(receiver_class.GetInvocationDispatcher(
-            target_name,
-            args_descriptor,
-            RawFunction::kNoSuchMethodDispatcher));
-    // Update IC data.
-    ASSERT(!target_function.IsNull());
-    intptr_t receiver_cid = receiver.GetClassId();
-    if (ic_data.num_args_tested() == 1) {
-      // In optimized code we may enter into here via the
-      // MegamorphicCacheMissHandler since noSuchMethod dispatchers are not
-      // inserted into the megamorphic cache. Therefore, we need to guard
-      // against entering the same check twice into the ICData.
-      // Note that num_args_tested == 1 in optimized code.
-      // TODO(fschneider): Handle extraordinary cases like noSuchMethod and
-      // implicit closure invocation properly in the megamorphic cache.
-      const Function& target =
-          Function::Handle(ic_data.GetTargetForReceiverClassId(receiver_cid));
-      if (target.IsNull()) {
-        ic_data.AddReceiverCheck(receiver_cid, target_function);
-      }
-    } else {
-      // Operators calls have two or three arguments tested ([], []=, etc.)
-      ASSERT(ic_data.num_args_tested() > 1);
-      GrowableArray<intptr_t> class_ids(ic_data.num_args_tested());
-      class_ids.Add(receiver_cid);
-      for (intptr_t i = 1; i < ic_data.num_args_tested(); ++i) {
-        class_ids.Add(Object::Handle(args.At(i)).GetClassId());
-      }
-      ic_data.AddCheck(class_ids, target_function);
-    }
-    if (FLAG_trace_ic) {
-      OS::PrintErr("NoSuchMethod IC miss: adding <%s> id:%" Pd " -> <%s>\n",
-          Class::Handle(receiver.clazz()).ToCString(),
-          receiver_cid,
-          target_function.ToCString());
-    }
-    result = DartEntry::InvokeFunction(target_function, args, args_descriptor);
-  }
-  CheckResultError(result);
-  arguments.SetReturn(result);
-}
-
-
 static bool CanOptimizeFunction(const Function& function, Isolate* isolate) {
   const intptr_t kLowInvocationCount = -100000000;
   if (isolate->debugger()->IsStepping() ||
@@ -1219,10 +1107,32 @@
       // code.
       uword optimized_entry =
           Instructions::Handle(optimized_code.instructions()).EntryPoint();
-      function.SetCode(original_code);
+      function.AttachCode(original_code);
       frame->set_pc(optimized_entry);
     }
   }
+
+  if (FLAG_deoptimize_filter != NULL) {
+    DartFrameIterator iterator;
+    StackFrame* frame = iterator.NextFrame();
+    ASSERT(frame != NULL);
+    const Code& code = Code::Handle(frame->LookupDartCode());
+    ASSERT(!code.IsNull());
+    if (code.is_optimized()) {
+      const Function& function = Function::Handle(code.function());
+      ASSERT(!function.IsNull());
+      if (strstr(function.ToFullyQualifiedCString(),
+                 FLAG_deoptimize_filter) != NULL) {
+        if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) {
+          OS::PrintErr("*** Forcing deoptimization (%s)\n",
+                       function.ToFullyQualifiedCString());
+          // TODO(turnidge): Consider changing to DeoptimizeAt for
+          // just the top frame.
+          DeoptimizeAll();
+        }
+      }
+    }
+  }
 }
 
 
diff --git a/runtime/vm/code_generator.h b/runtime/vm/code_generator.h
index 61bbd05..aeb6357 100644
--- a/runtime/vm/code_generator.h
+++ b/runtime/vm/code_generator.h
@@ -28,7 +28,6 @@
 DECLARE_RUNTIME_ENTRY(InlineCacheMissHandlerTwoArgs);
 DECLARE_RUNTIME_ENTRY(InlineCacheMissHandlerThreeArgs);
 DECLARE_RUNTIME_ENTRY(StaticCallMissHandlerTwoArgs);
-DECLARE_RUNTIME_ENTRY(InstanceFunctionLookup);
 DECLARE_RUNTIME_ENTRY(Instanceof);
 DECLARE_RUNTIME_ENTRY(TypeCheck);
 DECLARE_RUNTIME_ENTRY(BadTypeError);
@@ -47,7 +46,6 @@
 DECLARE_RUNTIME_ENTRY(TraceFunctionEntry);
 DECLARE_RUNTIME_ENTRY(TraceFunctionExit);
 DECLARE_RUNTIME_ENTRY(DeoptimizeMaterialize);
-DECLARE_RUNTIME_ENTRY(UpdateICDataTwoArgs);
 DECLARE_RUNTIME_ENTRY(UpdateFieldCid);
 
 #define DEOPT_REASONS(V)                                                       \
@@ -89,9 +87,6 @@
 const char* DeoptReasonToText(intptr_t deopt_id);
 
 
-RawCode* ResolveCompileInstanceCallTarget(const Instance& receiver,
-                                          const ICData& ic_data);
-
 void DeoptimizeAt(const Code& optimized_code, uword pc);
 void DeoptimizeAll();
 
diff --git a/runtime/vm/code_generator_test.cc b/runtime/vm/code_generator_test.cc
index 860e4ad..50776b0 100644
--- a/runtime/vm/code_generator_test.cc
+++ b/runtime/vm/code_generator_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "platform/assert.h"
 #include "vm/globals.h"
 #include "vm/ast.h"
@@ -566,3 +570,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/code_patcher_arm64.cc b/runtime/vm/code_patcher_arm64.cc
new file mode 100644
index 0000000..2e81384
--- /dev/null
+++ b/runtime/vm/code_patcher_arm64.cc
@@ -0,0 +1,88 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_ARM64.
+#if defined(TARGET_ARCH_ARM64)
+
+#include "vm/code_patcher.h"
+
+#include "vm/instructions.h"
+#include "vm/object.h"
+
+namespace dart {
+
+RawArray* CodePatcher::GetClosureArgDescAt(uword return_address,
+                                           const Code& code) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+uword CodePatcher::GetStaticCallTargetAt(uword return_address,
+                                         const Code& code) {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+void CodePatcher::PatchStaticCallAt(uword return_address,
+                                    const Code& code,
+                                    uword new_target) {
+  UNIMPLEMENTED();
+}
+
+
+void CodePatcher::PatchInstanceCallAt(uword return_address,
+                                      const Code& code,
+                                      uword new_target) {
+  UNIMPLEMENTED();
+}
+
+
+int32_t CodePatcher::GetPoolOffsetAt(uword return_address) {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+void CodePatcher::SetPoolOffsetAt(uword return_address, int32_t offset) {
+  UNIMPLEMENTED();
+}
+
+
+void CodePatcher::InsertCallAt(uword start, uword target) {
+  UNIMPLEMENTED();
+}
+
+
+uword CodePatcher::GetInstanceCallAt(uword return_address,
+                                     const Code& code,
+                                     ICData* ic_data) {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+intptr_t CodePatcher::InstanceCallSizeInBytes() {
+  // The instance call instruction sequence has a variable size on ARM.
+  UNREACHABLE();
+  return 0;
+}
+
+
+RawFunction* CodePatcher::GetUnoptimizedStaticCallAt(
+    uword return_address, const Code& code, ICData* ic_data_result) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+RawObject* CodePatcher::GetEdgeCounterAt(uword pc, const Code& code) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/code_patcher_arm64_test.cc b/runtime/vm/code_patcher_arm64_test.cc
new file mode 100644
index 0000000..7c2fe8f
--- /dev/null
+++ b/runtime/vm/code_patcher_arm64_test.cc
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_ARM64)
+
+// TODO(zra): Port these tests.
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 8ffa3ce..de4987a 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -566,7 +566,7 @@
                   Code::Handle(function.unoptimized_code()).EntryPoint());
             }
           }
-          function.SetCode(code);
+          function.AttachCode(code);
 
           for (intptr_t i = 0;
                i < flow_graph->guarded_fields()->length();
@@ -576,7 +576,7 @@
           }
         } else {
           function.set_unoptimized_code(code);
-          function.SetCode(code);
+          function.AttachCode(code);
           ASSERT(CodePatcher::CodeIsPatchable(code));
         }
         if (parsed_function->HasDeferredPrefixes()) {
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index 3e6ef9d..af05390 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "platform/assert.h"
 #include "vm/class_finalizer.h"
 #include "vm/compiler.h"
@@ -98,3 +102,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
new file mode 100644
index 0000000..2cffb65
--- /dev/null
+++ b/runtime/vm/constants_arm64.h
@@ -0,0 +1,569 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_CONSTANTS_ARM64_H_
+#define VM_CONSTANTS_ARM64_H_
+
+#include "platform/assert.h"
+
+namespace dart {
+
+enum Register {
+  kFirstFreeCpuRegister = 0,
+  R0  =  0,
+  R1  =  1,
+  R2  =  2,
+  R3  =  3,
+  R4  =  4,
+  R5  =  5,
+  R6  =  6,
+  R7  =  7,
+  R8  =  8,
+  R9  =  9,
+  R10 = 10,
+  R11 = 11,
+  R12 = 12,
+  R13 = 13,
+  R14 = 14,
+  R15 = 15,
+  R16 = 16,
+  R17 = 17,
+  R18 = 18,
+  R19 = 19,
+  R20 = 20,
+  R21 = 21,
+  R22 = 22,
+  R23 = 23,
+  R24 = 24,
+  kLastFreeCpuRegister = 24,
+  R25 = 25,  // IP0
+  R26 = 26,  // IP1
+  R27 = 27,  // PP
+  R28 = 28,  // CTX
+  R29 = 29,  // FP
+  R30 = 30,  // LR
+  R31 = 31,  // ZR, SP
+  kNumberOfCpuRegisters = 32,
+  kNoRegister = -1,
+
+  // These registers both use the encoding R31, but to avoid mistakes we give
+  // them different values, and then translate before encoding.
+  SP = 32,
+  ZR = 33,
+
+  // Aliases.
+  IP0 = R25,
+  IP1 = R26,
+  FP = R29,
+  LR = R30,
+};
+
+enum VRegister {
+  V0  =  0,
+  V1  =  1,
+  V2  =  2,
+  V3  =  3,
+  V4  =  4,
+  V5  =  5,
+  V6  =  6,
+  V7  =  7,
+  V8  =  8,
+  V9  =  9,
+  V10 = 10,
+  V11 = 11,
+  V12 = 12,
+  V13 = 13,
+  V14 = 14,
+  V15 = 15,
+  V16 = 16,
+  V17 = 17,
+  V18 = 18,
+  V19 = 19,
+  V20 = 20,
+  V21 = 21,
+  V22 = 22,
+  V23 = 24,
+  V24 = 24,
+  V25 = 25,
+  V26 = 26,
+  V27 = 27,
+  V28 = 28,
+  V29 = 29,
+  V30 = 30,
+  V31 = 31,
+  kNumberOfVRegisters = 32,
+  kNoVRegister = -1,
+};
+
+// Register alias for floating point scratch register.
+const VRegister VTMP0 = V30;
+const VRegister VTMP1 = V31;
+
+// Architecture independent aliases.
+typedef VRegister FpuRegister;
+const FpuRegister FpuTMP = VTMP0;
+const int kNumberOfFpuRegisters = kNumberOfVRegisters;
+const FpuRegister kNoFpuRegister = kNoVRegister;
+
+// Register aliases.
+const Register TMP = R25;  // Used as scratch register by assembler.
+const Register TMP0 = R25;
+const Register TMP1 = R26;
+const Register CTX = R27;  // Caches current context in generated code.
+const Register PP = R26;  // Caches object pool pointer in generated code.
+const Register SPREG = R31;  // Stack pointer register.
+const Register FPREG = FP;  // Frame pointer register.
+const Register ICREG = R5;  // IC data register.
+
+// Exception object is passed in this register to the catch handlers when an
+// exception is thrown.
+const Register kExceptionObjectReg = R0;
+
+// Stack trace object is passed in this register to the catch handlers when
+// an exception is thrown.
+const Register kStackTraceObjectReg = R1;
+
+// Masks, sizes, etc.
+const int kXRegSizeInBits = 64;
+const int kWRegSizeInBits = 32;
+const int64_t kXRegMask = 0xffffffffffffffffL;
+const int64_t kWRegMask = 0x00000000ffffffffL;
+
+// List of registers used in load/store multiple.
+typedef uint32_t RegList;
+const RegList kAllCpuRegistersList = 0xFFFF;
+
+
+// C++ ABI call registers.
+const RegList kAbiArgumentCpuRegs =
+    (1 << R0) | (1 << R1) | (1 << R2) | (1 << R3) |
+    (1 << R4) | (1 << R5) | (1 << R6) | (1 << R7);
+const RegList kAbiPreservedCpuRegs =
+    (1 << R19) | (1 << R20) | (1 << R21) | (1 << R22) |
+    (1 << R23) | (1 << R24) | (1 << R25) | (1 << R26) |
+    (1 << R27) | (1 << R28) | (1 << R29);
+const int kAbiPreservedCpuRegCount = 11;
+const VRegister kAbiFirstPreservedFpuReg = V8;
+const VRegister kAbiLastPreservedFpuReg = V15;
+const int kAbiPreservedFpuRegCount = 8;
+
+// CPU registers available to Dart allocator.
+const RegList kDartAvailableCpuRegs =
+    (1 << R0)  | (1 << R1)  | (1 << R2)  | (1 << R3)  |
+    (1 << R4)  | (1 << R5)  | (1 << R6)  | (1 << R7)  |
+    (1 << R8)  | (1 << R9)  | (1 << R10) | (1 << R11) |
+    (1 << R12) | (1 << R13) | (1 << R14) | (1 << R15) |
+    (1 << R16) | (1 << R17) | (1 << R18) | (1 << R19) |
+    (1 << R20) | (1 << R21) | (1 << R22) | (1 << R23) |
+    (1 << R24);
+
+// Registers available to Dart that are not preserved by runtime calls.
+const RegList kDartVolatileCpuRegs =
+    kDartAvailableCpuRegs & ~kAbiPreservedCpuRegs;
+const int kDartVolatileCpuRegCount = 19;
+const VRegister kDartFirstVolatileFpuReg = V0;
+const VRegister kDartLastVolatileFpuReg = V7;
+const int kDartVolatileFpuRegCount = 8;
+
+static inline Register ConcreteRegister(Register r) {
+  return ((r == ZR) || (r == SP)) ? R31 : r;
+}
+
+// Values for the condition field as defined in section A3.2.
+enum Condition {
+  kNoCondition = -1,
+  EQ =  0,  // equal
+  NE =  1,  // not equal
+  CS =  2,  // carry set/unsigned higher or same
+  CC =  3,  // carry clear/unsigned lower
+  MI =  4,  // minus/negative
+  PL =  5,  // plus/positive or zero
+  VS =  6,  // overflow
+  VC =  7,  // no overflow
+  HI =  8,  // unsigned higher
+  LS =  9,  // unsigned lower or same
+  GE = 10,  // signed greater than or equal
+  LT = 11,  // signed less than
+  GT = 12,  // signed greater than
+  LE = 13,  // signed less than or equal
+  AL = 14,  // always (unconditional)
+  NV = 15,  // special condition (refer to section C1.2.3)
+  kMaxCondition = 16,
+};
+
+enum Bits {
+  B0  =  (1 << 0), B1  =  (1 << 1), B2  =  (1 << 2), B3  =  (1 << 3),
+  B4  =  (1 << 4), B5  =  (1 << 5), B6  =  (1 << 6), B7  =  (1 << 7),
+  B8  =  (1 << 8), B9  =  (1 << 9), B10 = (1 << 10), B11 = (1 << 11),
+  B12 = (1 << 12), B13 = (1 << 13), B14 = (1 << 14), B15 = (1 << 15),
+  B16 = (1 << 16), B17 = (1 << 17), B18 = (1 << 18), B19 = (1 << 19),
+  B20 = (1 << 20), B21 = (1 << 21), B22 = (1 << 22), B23 = (1 << 23),
+  B24 = (1 << 24), B25 = (1 << 25), B26 = (1 << 26), B27 = (1 << 27),
+  B28 = (1 << 28), B29 = (1 << 29), B30 = (1 << 30), B31 = (1 << 31),
+};
+
+enum OperandSize {
+  kByte,
+  kUnsignedByte,
+  kHalfword,
+  kUnsignedHalfword,
+  kWord,
+  kUnsignedWord,
+  kDoubleWord,
+  kSWord,
+  kDWord,
+};
+
+static inline int Log2OperandSizeBytes(OperandSize os) {
+  switch (os) {
+    case kByte:
+    case kUnsignedByte:
+      return 0;
+    case kHalfword:
+    case kUnsignedHalfword:
+      return 1;
+    case kWord:
+    case kUnsignedWord:
+    case kSWord:
+      return 2;
+    case kDoubleWord:
+    case kDWord:
+      return 3;
+    default:
+      UNREACHABLE();
+      break;
+  }
+  return -1;
+}
+
+// Opcodes from C3
+// C3.1.
+enum MainOp {
+  DPImmediateMask = 0x1c000000,
+  DPImmediateFixed = B28,
+
+  CompareBranchMask = 0x1c000000,
+  CompareBranchFixed = B28 | B26,
+
+  LoadStoreMask = B27 | B25,
+  LoadStoreFixed = B27,
+
+  DPRegisterMask = 0x0e000000,
+  DPRegisterFixed = B27 | B25,
+
+  DPSimd1Mask = 0x1e000000,
+  DPSimd1Fixed = B27 | B26 | B25,
+
+  DPSimd2Mask = 0x1e000000,
+  DPSimd2Fixed = B28 | DPSimd1Fixed,
+};
+
+// C3.2.3
+enum ExceptionGenOp {
+  ExceptionGenMask = 0xff000000,
+  ExceptionGenFixed = CompareBranchFixed | B31 | B30,
+  SVC = ExceptionGenFixed | B0,
+  BRK = ExceptionGenFixed | B21,
+  HLT = ExceptionGenFixed | B22,
+};
+
+// C3.2.4
+enum SystemOp {
+  SystemMask = 0xffc00000,
+  SystemFixed = CompareBranchFixed | B31 | B30 | B24,
+  HINT = SystemFixed | B17 | B16 | B13 | B4 | B3 | B2 | B1 | B0,
+};
+
+// C3.2.7
+enum UnconditionalBranchRegOp {
+  UnconditionalBranchRegMask = 0xfe000000,
+  UnconditionalBranchRegFixed = CompareBranchFixed | B31 | B30 | B25,
+  BR = UnconditionalBranchRegFixed | B20 | B19 | B18 | B17 | B16,
+  BLR = BR | B21,
+  RET = BR | B22,
+};
+
+enum LoadStoreRegOp {
+  LoadStoreRegMask = 0x3a000000,
+  LoadStoreRegFixed = LoadStoreFixed | B29 | B28,
+  STR = LoadStoreRegFixed,
+  LDR = LoadStoreRegFixed | B22,
+};
+
+// C3.4.1
+enum AddSubImmOp {
+  AddSubImmMask = 0x1f000000,
+  AddSubImmFixed = DPImmediateFixed | B24,
+  ADDI = AddSubImmFixed,
+  SUBI = AddSubImmFixed | B30,
+};
+
+// C3.4.5
+enum MoveWideOp {
+  MoveWideMask = 0x1f800000,
+  MoveWideFixed = DPImmediateFixed | B25 | B23,
+  MOVN = MoveWideFixed,
+  MOVZ = MoveWideFixed | B30,
+  MOVK = MoveWideFixed | B30 | B29,
+};
+
+
+// C3.5.1
+enum AddSubShiftExtOp {
+  AddSubShiftExtMask = 0x1f000000,
+  AddSubShiftExtFixed = DPRegisterFixed | B24,
+  ADD = AddSubShiftExtFixed,
+  SUB = AddSubShiftExtFixed | B30,
+};
+
+#define APPLY_OP_LIST(_V)                                                      \
+_V(DPImmediate)                                                                \
+_V(CompareBranch)                                                              \
+_V(LoadStore)                                                                  \
+_V(DPRegister)                                                                 \
+_V(DPSimd1)                                                                    \
+_V(DPSimd2)                                                                    \
+_V(ExceptionGen)                                                               \
+_V(System)                                                                     \
+_V(LoadStoreReg)                                                               \
+_V(UnconditionalBranchReg)                                                     \
+_V(AddSubImm)                                                                  \
+_V(MoveWide)                                                                   \
+_V(AddSubShiftExt)                                                             \
+
+
+enum Shift {
+  kNoShift = -1,
+  LSL = 0,  // Logical shift left
+  LSR = 1,  // Logical shift right
+  ASR = 2,  // Arithmetic shift right
+  ROR = 3,  // Rotate right
+  kMaxShift = 4,
+};
+
+enum Extend {
+  kNoExtend = -1,
+  UXTB = 0,
+  UXTH = 1,
+  UXTW = 2,
+  UXTX = 3,
+  SXTB = 4,
+  SXTH = 5,
+  SXTW = 6,
+  SXTX = 7,
+  kMaxExtend = 8,
+};
+
+enum R31Type {
+  R31IsSP,
+  R31IsZR,
+  R31IsUndef,
+};
+
+// Constants used for the decoding or encoding of the individual fields of
+// instructions. Based on the "Figure 3-1 ARM instruction set summary".
+enum InstructionFields {
+  // S-bit (modify condition register)
+  kSShift = 29,
+  kSBits = 1,
+
+  // sf field.
+  kSFShift = 31,
+  kSFBits = 1,
+
+  // size field,
+  kSzShift = 30,
+  kSzBits = 2,
+
+  // Registers.
+  kRdShift = 0,
+  kRdBits = 5,
+  kRnShift = 5,
+  kRnBits = 5,
+  kRaShift = 10,
+  kRaBits = 5,
+  kRmShift = 16,
+  kRmBits = 5,
+  kRtShift = 0,
+  kRtBits = 5,
+
+  // Immediates.
+  kImm3Shift = 10,
+  kImm3Bits = 3,
+  kImm6Shift = 10,
+  kImm6Bits = 6,
+  kImm9Shift = 12,
+  kImm9Bits = 9,
+  kImm12Shift = 10,
+  kImm12Bits = 12,
+  kImm12ShiftShift = 22,
+  kImm12ShiftBits = 2,
+  kImm16Shift = 5,
+  kImm16Bits = 16,
+
+  kHWShift = 21,
+  kHWBits = 2,
+
+  // Shift and Extend.
+  kShiftExtendShift = 21,
+  kShiftExtendBits = 1,
+  kShiftTypeShift = 22,
+  kShiftTypeBits = 2,
+  kExtendTypeShift = 13,
+  kExtendTypeBits = 3,
+
+  // Hint Fields.
+  kHintCRmShift = 8,
+  kHintCRmBits = 4,
+  kHintOp2Shift = 5,
+  kHintOp2Bits = 3,
+};
+
+
+const uint32_t kImmExceptionIsRedirectedCall = 0xca11;
+const uint32_t kImmExceptionIsUnreachable = 0xdebf;
+const uint32_t kImmExceptionIsPrintf = 0xdeb1;
+const uint32_t kImmExceptionIsDebug = 0xdeb0;
+
+// The class Instr enables access to individual fields defined in the ARM
+// architecture instruction set encoding as described in figure A3-1.
+//
+// Example: Test whether the instruction at ptr sets the condition code bits.
+//
+// bool InstructionSetsConditionCodes(byte* ptr) {
+//   Instr* instr = Instr::At(ptr);
+//   int type = instr->TypeField();
+//   return ((type == 0) || (type == 1)) && instr->HasS();
+// }
+//
+class Instr {
+ public:
+  enum {
+    kInstrSize = 4,
+    kInstrSizeLog2 = 2,
+    kPCReadOffset = 8
+  };
+
+  static const int32_t kNopInstruction = HINT;  // hint #0 === nop.
+  static const int32_t kBreakPointInstruction =  // hlt #kImmExceptionIsDebug.
+      HLT | (kImmExceptionIsDebug << kImm16Shift);
+  static const int kBreakPointInstructionSize = kInstrSize;
+
+  // Get the raw instruction bits.
+  inline int32_t InstructionBits() const {
+    return *reinterpret_cast<const int32_t*>(this);
+  }
+
+  // Set the raw instruction bits to value.
+  inline void SetInstructionBits(int32_t value) {
+    *reinterpret_cast<int32_t*>(this) = value;
+  }
+
+  // Read one particular bit out of the instruction bits.
+  inline int Bit(int nr) const {
+    return (InstructionBits() >> nr) & 1;
+  }
+
+  // Read a bit field out of the instruction bits.
+  inline int Bits(int shift, int count) const {
+    return (InstructionBits() >> shift) & ((1 << count) - 1);
+  }
+
+
+  inline int SField() const { return Bit(kSShift); }
+  inline int SFField() const { return Bit(kSFShift); }
+  inline int SzField() const { return Bits(kSzShift, kSzBits); }
+  inline Register RdField() const { return static_cast<Register>(
+                                        Bits(kRdShift, kRdBits)); }
+  inline Register RnField() const { return static_cast<Register>(
+                                        Bits(kRnShift, kRnBits)); }
+  inline Register RaField() const { return static_cast<Register>(
+                                        Bits(kRaShift, kRaBits)); }
+  inline Register RmField() const { return static_cast<Register>(
+                                        Bits(kRmShift, kRmBits)); }
+  inline Register RtField() const { return static_cast<Register>(
+                                        Bits(kRtShift, kRtBits)); }
+
+  // Immediates
+  inline int Imm3Field() const { return Bits(kImm3Shift, kImm3Bits); }
+  inline int Imm6Field() const { return Bits(kImm6Shift, kImm6Bits); }
+  inline int Imm9Field() const { return Bits(kImm9Shift, kImm9Bits); }
+  // Sign-extended Imm9Field()
+  inline int64_t SImm9Field() const {
+      return (static_cast<int32_t>(Imm9Field()) << 23) >> 23; }
+  inline int Imm12Field() const { return Bits(kImm12Shift, kImm12Bits); }
+  inline int Imm16Field() const { return Bits(kImm16Shift, kImm16Bits); }
+
+  inline int Imm12ShiftField() const {
+    return Bits(kImm12ShiftShift, kImm12ShiftBits); }
+  inline int HWField() const { return Bits(kHWShift, kHWBits); }
+
+  // Shift and Extend.
+  inline bool IsShift() const { return (Bit(kShiftExtendShift) == 0); }
+  inline bool IsExtend() const { return (Bit(kShiftExtendShift) == 1); }
+  inline Shift ShiftTypeField() const {
+      return static_cast<Shift>(Bits(kShiftTypeShift, kShiftTypeBits)); }
+  inline Extend ExtendTypeField() const {
+      return static_cast<Extend>(Bits(kExtendTypeShift, kExtendTypeBits)); }
+  inline int ShiftAmountField() const { return Imm6Field(); }
+  inline int ExtShiftAmountField() const { return Imm3Field(); }
+
+  // Instruction identification.
+  #define IS_OP(op)                                                            \
+    inline bool Is##op##Op() const {                                           \
+      return ((InstructionBits() & op##Mask) == (op##Fixed & op##Mask)); }
+  APPLY_OP_LIST(IS_OP)
+  #undef IS_OP
+
+  inline bool HasS() const { return (SField() == 1); }
+
+  // Indicate whether Rd can be the SP or ZR. This does not check that the
+  // instruction actually has an Rd field.
+  R31Type RdMode() const {
+    // The following instructions use SP as Rd:
+    //  Add/sub (immediate) when not setting the flags.
+    //  Add/sub (extended) when not setting the flags.
+    //  Logical (immediate) when not setting the flags.
+    // Otherwise, R31 is the ZR.
+    if (IsAddSubImmOp() || (IsAddSubShiftExtOp() && IsExtend())) {
+      if (HasS()) {
+        return R31IsZR;
+      } else {
+        return R31IsSP;
+      }
+    }
+    // TODO(zra): Handle for logical immediate operations.
+    return R31IsZR;
+  }
+
+  // Indicate whether Rn can be SP or ZR. This does not check that the
+  // instruction actually has an Rn field.
+  R31Type RnMode() const {
+    // The following instructions use SP as Rn:
+    //  All loads and stores.
+    //  Add/sub (immediate).
+    //  Add/sub (extended).
+    // Otherwise, r31 is ZR.
+    if (IsLoadStoreOp() ||
+        IsAddSubImmOp() ||
+        (IsAddSubShiftExtOp() && IsExtend())) {
+      return R31IsSP;
+    }
+    return R31IsZR;
+  }
+
+  // Instructions are read out of a code stream. The only way to get a
+  // reference to an instruction is to convert a pointer. There is no way
+  // to allocate or create instances of class Instr.
+  // Use the At(pc) function to create references to Instr.
+  static Instr* At(uword pc) { return reinterpret_cast<Instr*>(pc); }
+
+ private:
+  DISALLOW_ALLOCATION();
+  DISALLOW_IMPLICIT_CONSTRUCTORS(Instr);
+};
+
+}  // namespace dart
+
+#endif  // VM_CONSTANTS_ARM64_H_
diff --git a/runtime/vm/cpu.h b/runtime/vm/cpu.h
index 9546f17..2fffb25 100644
--- a/runtime/vm/cpu.h
+++ b/runtime/vm/cpu.h
@@ -29,6 +29,8 @@
 #include "vm/cpu_x64.h"
 #elif defined(TARGET_ARCH_ARM)
 #include "vm/cpu_arm.h"
+#elif defined(TARGET_ARCH_ARM64)
+#include "vm/cpu_arm64.h"
 #elif defined(TARGET_ARCH_MIPS)
 #include "vm/cpu_mips.h"
 #else
diff --git a/runtime/vm/cpu_arm64.cc b/runtime/vm/cpu_arm64.cc
new file mode 100644
index 0000000..4e6a1d4
--- /dev/null
+++ b/runtime/vm/cpu_arm64.cc
@@ -0,0 +1,90 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+
+#if defined(TARGET_ARCH_ARM64)
+
+#include "vm/cpu.h"
+#include "vm/cpuinfo.h"
+#include "vm/simulator.h"
+
+#if defined(HOST_ARCH_ARM64)
+#include <sys/syscall.h>  /* NOLINT */
+#include <unistd.h>  /* NOLINT */
+#endif
+
+namespace dart {
+
+void CPU::FlushICache(uword start, uword size) {
+#if defined(USING_SIMULATOR)
+  // Nothing to do.
+#else
+  UNIMPLEMENTED();
+#endif
+}
+
+
+const char* CPU::Id() {
+  return
+#if !defined(HOST_ARCH_ARM64)
+  "sim"
+#endif  // !defined(HOST_ARCH_ARM64)
+  "arm64";
+}
+
+
+const char* HostCPUFeatures::hardware_ = NULL;
+#if defined(DEBUG)
+bool HostCPUFeatures::initialized_ = false;
+#endif
+
+
+#if defined(HOST_ARCH_ARM64)
+void HostCPUFeatures::InitOnce() {
+  CpuInfo::InitOnce();
+  hardware_ = CpuInfo::GetCpuModel();
+#if defined(DEBUG)
+  initialized_ = true;
+#endif
+}
+
+
+void HostCPUFeatures::Cleanup() {
+  DEBUG_ASSERT(initialized_);
+#if defined(DEBUG)
+  initialized_ = false;
+#endif
+  ASSERT(hardware_ != NULL);
+  free(const_cast<char*>(hardware_));
+  hardware_ = NULL;
+  CpuInfo::Cleanup();
+}
+
+#else
+
+void HostCPUFeatures::InitOnce() {
+  CpuInfo::InitOnce();
+  hardware_ = CpuInfo::GetCpuModel();
+#if defined(DEBUG)
+  initialized_ = true;
+#endif
+}
+
+
+void HostCPUFeatures::Cleanup() {
+  DEBUG_ASSERT(initialized_);
+#if defined(DEBUG)
+  initialized_ = false;
+#endif
+  ASSERT(hardware_ != NULL);
+  free(const_cast<char*>(hardware_));
+  hardware_ = NULL;
+  CpuInfo::Cleanup();
+}
+#endif  // defined(HOST_ARCH_ARM64)
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/cpu_arm64.h b/runtime/vm/cpu_arm64.h
new file mode 100644
index 0000000..884981b
--- /dev/null
+++ b/runtime/vm/cpu_arm64.h
@@ -0,0 +1,55 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_CPU_ARM64_H_
+#define VM_CPU_ARM64_H_
+
+#include "vm/allocation.h"
+#include "vm/simulator.h"
+
+namespace dart {
+
+// TargetCPUFeatures gives CPU features for the architecture that we are
+// generating code for. HostCPUFeatures gives the CPU features for the
+// architecture that we are actually running on. When the architectures
+// are the same, TargetCPUFeatures will query HostCPUFeatures. When they are
+// different (i.e. we are running in a simulator), HostCPUFeatures will
+// additionally mock the options needed for the target architecture so that
+// they may be altered for testing.
+
+class HostCPUFeatures: public AllStatic {
+ public:
+  static void InitOnce();
+  static void Cleanup();
+  static const char* hardware() {
+    DEBUG_ASSERT(initialized_);
+    return hardware_;
+  }
+
+ private:
+  static const char* hardware_;
+#if defined(DEBUG)
+  static bool initialized_;
+#endif
+};
+
+class TargetCPUFeatures : public AllStatic {
+ public:
+  static void InitOnce() {
+    HostCPUFeatures::InitOnce();
+  }
+  static void Cleanup() {
+    HostCPUFeatures::Cleanup();
+  }
+  static const char* hardware() {
+    return HostCPUFeatures::hardware();
+  }
+  static bool double_truncate_round_supported() {
+    return false;
+  }
+};
+
+}  // namespace dart
+
+#endif  // VM_CPU_ARM64_H_
diff --git a/runtime/vm/cpu_test.cc b/runtime/vm/cpu_test.cc
index 99e0b23..6ccdebe 100644
--- a/runtime/vm/cpu_test.cc
+++ b/runtime/vm/cpu_test.cc
@@ -20,6 +20,12 @@
 #else  // defined(HOST_ARCH_ARM)
   EXPECT_STREQ("simarm", CPU::Id());
 #endif  // defined(HOST_ARCH_ARM)
+#elif defined(TARGET_ARCH_ARM64)
+#if defined(HOST_ARCH_ARM64)
+  EXPECT_STREQ("arm64", CPU::Id());
+#else  // defined(HOST_ARCH_ARM64)
+  EXPECT_STREQ("simarm64", CPU::Id());
+#endif  // defined(HOST_ARCH_ARM64)
 #elif defined(TARGET_ARCH_MIPS)
 #if defined(HOST_ARCH_MIPS)
   EXPECT_STREQ("mips", CPU::Id());
diff --git a/runtime/vm/custom_isolate_test.cc b/runtime/vm/custom_isolate_test.cc
index 9394e57..9f26952 100644
--- a/runtime/vm/custom_isolate_test.cc
+++ b/runtime/vm/custom_isolate_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "include/dart_api.h"
 #include "include/dart_native_api.h"
 
@@ -26,7 +30,7 @@
 static const char* kCustomIsolateScriptChars =
     "import 'dart:isolate';\n"
     "\n"
-    "RawReceivePort mainPort;\n"
+    "final RawReceivePort mainPort = new RawReceivePort();\n"
     "\n"
     "echo(arg) native \"native_echo\";\n"
     "\n"
@@ -170,18 +174,9 @@
   Dart_EnterScope();
   Dart_Handle result;
 
-  // Reload all the test classes here.
-  //
-  // TODO(turnidge): Use the create isolate callback instead?
-  Dart_Handle lib = TestCase::LoadTestScript(kCustomIsolateScriptChars,
-                                             NativeLookup);
+  Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url()));
   EXPECT_VALID(lib);
 
-  Dart_Handle recv_port = Dart_GetReceivePort(Dart_GetMainPortId());
-  EXPECT_VALID(recv_port);
-  result = Dart_SetField(lib, NewString("mainPort"), recv_port);
-  EXPECT_VALID(result);
-
   result = Dart_Invoke(lib, NewString(main_), 0, NULL);
   EXPECT_VALID(result);
   free(const_cast<char*>(main_));
@@ -287,17 +282,30 @@
   Dart_Isolate new_isolate = TestCase::CreateTestIsolate();
   EXPECT(new_isolate != NULL);
   Dart_SetMessageNotifyCallback(&NotifyMessage);
-  Dart_Port new_port = Dart_GetMainPortId();
+  Dart_EnterScope();
+  // Reload all the test classes here.
+  //
+  // TODO(turnidge): Use the create isolate callback instead?
+  Dart_Handle lib = TestCase::LoadTestScript(kCustomIsolateScriptChars,
+                                             NativeLookup);
+  EXPECT_VALID(lib);
+
+  Dart_Handle main_port = Dart_GetField(lib, NewString("mainPort"));
+  EXPECT_VALID(main_port);
+  Dart_Port main_port_id;
+  Dart_Handle err = Dart_PortGetId(main_port, &main_port_id);
+  EXPECT_VALID(err);
 
   OS::Print("-- Adding StartEvent to queue --\n");
   event_queue->Add(new StartEvent(new_isolate, isolate_main));
 
   // Restore the original isolate.
+  Dart_ExitScope();
   Dart_ExitIsolate();
   Dart_EnterIsolate(saved_isolate);
   Dart_EnterScope();
 
-  Dart_Handle send_port = Dart_NewSendPort(new_port);
+  Dart_Handle send_port = Dart_NewSendPort(main_port_id);
   EXPECT_VALID(send_port);
   Dart_SetReturnValue(args, send_port);
 
@@ -346,3 +354,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 43f7b03..e03377d 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -233,12 +233,15 @@
   Object::VerifyBuiltinVtables();
 
   StubCode::Init(isolate);
+  // TODO(zra): ifndef to be removed when ARM64 port is ready.
+#if !defined(TARGET_ARCH_ARM64)
   if (snapshot_buffer == NULL) {
     if (!isolate->object_store()->PreallocateObjects()) {
       return isolate->object_store()->sticky_error();
     }
   }
   isolate->megamorphic_cache_table()->InitMissHandler();
+#endif
 
   isolate->heap()->EnableGrowthControl();
   isolate->set_init_callback_data(data);
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 7848d34..7522f73 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1189,6 +1189,27 @@
 }
 
 
+DART_EXPORT Dart_Handle Dart_PortGetId(Dart_Handle port, Dart_Port* port_id) {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  CHECK_CALLBACK_STATE(isolate);
+  const Instance& port_instance = Api::UnwrapInstanceHandle(isolate, port);
+  if (port_instance.IsNull()) {
+    RETURN_TYPE_ERROR(isolate, port, Instance);
+  }
+  if (!DartLibraryCalls::IsSendPort(port_instance) &&
+      !DartLibraryCalls::IsReceivePort(port_instance)) {
+    return Api::NewError("expected an instance of RawReceivePort or SendPort.");
+  }
+  const Object& idObj = Object::Handle(
+      DartLibraryCalls::PortGetId(port_instance));
+  ASSERT(idObj.IsInteger());
+  const Integer& id = Integer::Cast(idObj);
+  *port_id = static_cast<Dart_Port>(id.AsInt64Value());
+  return Api::Success();
+}
+
+
 DART_EXPORT Dart_Handle Dart_GetReceivePort(Dart_Port port_id) {
   Isolate* isolate = Isolate::Current();
   DARTSCOPE(isolate);
@@ -1200,7 +1221,7 @@
       isolate, isolate_lib.PrivateName(Symbols::_RawReceivePortImpl()));
   // TODO(asiva): Symbols should contain private keys.
   const String& function_name =
-      String::Handle(isolate_lib.PrivateName(Symbols::_get_or_create()));
+      String::Handle(isolate_lib.PrivateName(Symbols::_get()));
   const int kNumArguments = 1;
   const Function& function = Function::Handle(
       isolate,
@@ -3869,7 +3890,7 @@
 DART_EXPORT void* Dart_GetNativeIsolateData(Dart_NativeArguments args) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   Isolate* isolate = arguments->isolate();
-  ASSERT(isolate);
+  ASSERT(isolate == Isolate::Current());
   return isolate->init_callback_data();
 }
 
@@ -3909,7 +3930,7 @@
     RETURN_NULL_ERROR(field_values);
   }
   Isolate* isolate = arguments->isolate();
-  CHECK_ISOLATE(isolate);
+  ASSERT(isolate == Isolate::Current());
   REUSABLE_OBJECT_HANDLESCOPE(isolate);
   Object& obj = isolate->ObjectHandle();
   obj = arguments->NativeArgAt(arg_index);
@@ -3938,8 +3959,7 @@
 DART_EXPORT Dart_Handle Dart_GetNativeReceiver(Dart_NativeArguments args,
                                                intptr_t* value) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
-  Isolate* isolate = arguments->isolate();
-  CHECK_ISOLATE(isolate);
+  ASSERT(arguments->isolate() == Isolate::Current());
   if (value == NULL) {
     RETURN_NULL_ERROR(value);
   }
@@ -3956,7 +3976,7 @@
                                                      void** peer) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   Isolate* isolate = arguments->isolate();
-  CHECK_ISOLATE(isolate);
+  ASSERT(isolate == Isolate::Current());
   if (Api::StringGetPeerHelper(arguments, arg_index, peer)) {
     return Api::Success();
   }
@@ -3986,6 +4006,7 @@
         CURRENT_FUNC, arguments->NativeArgCount() - 1, index);
   }
   Isolate* isolate = arguments->isolate();
+  ASSERT(isolate == Isolate::Current());
   REUSABLE_OBJECT_HANDLESCOPE(isolate);
   Object& obj = isolate->ObjectHandle();
   obj = arguments->NativeArgAt(index);
@@ -4043,6 +4064,7 @@
         CURRENT_FUNC, arguments->NativeArgCount() - 1, index);
   }
   Isolate* isolate = arguments->isolate();
+  ASSERT(isolate == Isolate::Current());
   REUSABLE_OBJECT_HANDLESCOPE(isolate);
   Object& obj = isolate->ObjectHandle();
   obj = arguments->NativeArgAt(index);
@@ -4072,8 +4094,7 @@
 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args,
                                      Dart_Handle retval) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
-  Isolate* isolate = arguments->isolate();
-  CHECK_ISOLATE(isolate);
+  ASSERT(arguments->isolate() == Isolate::Current());
   if ((retval != Api::Null()) && (!Api::IsInstance(retval))) {
     const Object& ret_obj = Object::Handle(Api::UnwrapHandle(retval));
     FATAL1("Return value check failed: saw '%s' expected a dart Instance.",
@@ -4087,11 +4108,13 @@
 DART_EXPORT void Dart_SetWeakHandleReturnValue(Dart_NativeArguments args,
                                                Dart_WeakPersistentHandle rval) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+#if defined(DEBUG)
   Isolate* isolate = arguments->isolate();
-  CHECK_ISOLATE(isolate);
+  ASSERT(isolate == Isolate::Current());
   ASSERT(isolate->api_state() != NULL &&
          (isolate->api_state()->IsValidWeakPersistentHandle(rval) ||
           isolate->api_state()->IsValidPrologueWeakPersistentHandle(rval)));
+#endif
   Api::SetWeakHandleReturnValue(arguments, rval);
 }
 
@@ -4118,13 +4141,12 @@
 DART_EXPORT void Dart_SetIntegerReturnValue(Dart_NativeArguments args,
                                             int64_t retval) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
-  Isolate* isolate = arguments->isolate();
-  CHECK_ISOLATE(isolate);
+  ASSERT(arguments->isolate() == Isolate::Current());
   if (Smi::IsValid64(retval)) {
     Api::SetSmiReturnValue(arguments, retval);
   } else {
     // Slow path for Mints and Bigints.
-    ASSERT_CALLBACK_STATE(isolate);
+    ASSERT_CALLBACK_STATE(arguments->isolate());
     Api::SetIntegerReturnValue(arguments, retval);
   }
 }
@@ -4133,9 +4155,11 @@
 DART_EXPORT void Dart_SetDoubleReturnValue(Dart_NativeArguments args,
                                            double retval) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+#if defined(DEBUG)
   Isolate* isolate = arguments->isolate();
-  CHECK_ISOLATE(isolate);
+  ASSERT(isolate == Isolate::Current());
   ASSERT_CALLBACK_STATE(isolate);
+#endif
   Api::SetDoubleReturnValue(arguments, retval);
 }
 
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index 3a5cf64..c26afac 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -83,10 +83,9 @@
                            CURRENT_FUNC, #dart_handle);                        \
     } else if (tmp.IsError()) {                                                \
       return dart_handle;                                                      \
-    } else {                                                                   \
-      return Api::NewError("%s expects argument '%s' to be of type %s.",       \
-                           CURRENT_FUNC, #dart_handle, #type);                 \
     }                                                                          \
+    return Api::NewError("%s expects argument '%s' to be of type %s.",         \
+                         CURRENT_FUNC, #dart_handle, #type);                   \
   } while (0)
 
 
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 67105ae..f826f41 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "bin/builtin.h"
 #include "include/dart_api.h"
 #include "include/dart_debugger_api.h"
@@ -2306,24 +2310,30 @@
 
 
 TEST_CASE(WeakPersistentHandleExternalAllocationSizeOversized) {
+  Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
   Heap* heap = Isolate::Current()->heap();
   Dart_WeakPersistentHandle weak1 = NULL;
-  const intptr_t kWeak1ExternalSize = 100 * MB;
+  // Large enough to exceed any new space limit. Not actually allocated.
+  const intptr_t kWeak1ExternalSize = 500 * MB;
   {
     Dart_EnterScope();
     Dart_Handle obj = NewString("weakly referenced string");
     EXPECT_VALID(obj);
+    // Triggers a scavenge immediately, since kWeak1ExternalSize is above limit.
     weak1 = Dart_NewWeakPersistentHandle(obj,
                                          NULL,
                                          kWeak1ExternalSize,
                                          NopCallback);
     EXPECT_VALID(AsHandle(weak1));
-    // While new space is "full" of external data, any allocation will
-    // trigger GC, so after two of them, obj should be promoted.
-    Dart_Handle trigger1 = NewString("trigger1");
-    EXPECT_VALID(trigger1);
-    Dart_Handle trigger2 = NewString("trigger2");
-    EXPECT_VALID(trigger2);
+    // ... but the object is still alive and not yet promoted, so external size
+    // in new space is still above the limit. Thus, even the following tiny
+    // external allocation will trigger another scavenge.
+    Dart_WeakPersistentHandle trigger =
+      Dart_NewWeakPersistentHandle(obj, NULL, 1, NopCallback);
+    EXPECT_VALID(AsHandle(trigger));
+    Dart_DeleteWeakPersistentHandle(isolate, trigger);
+    // After the two scavenges above, 'obj' should now be promoted, hence its
+    // external size charged to old space.
     {
       DARTSCOPE(Isolate::Current());
       String& handle = String::Handle();
@@ -2334,7 +2344,6 @@
     EXPECT(heap->ExternalInWords(Heap::kOld) == kWeak1ExternalSize / kWordSize);
     Dart_ExitScope();
   }
-  Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
   Dart_DeleteWeakPersistentHandle(isolate, weak1);
   Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
   EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
@@ -8089,3 +8098,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index 123d535..103c1d9 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -458,6 +458,9 @@
   if (object_id == kFalseValue) {
     return AllocateDartCObjectBool(false);
   }
+  if (object_id == kDoubleObject) {
+    return AllocateDartCObjectDouble(ReadDouble());
+  }
   if (Symbols::IsVMSymbolId(object_id)) {
     return ReadVMSymbol(object_id);
   }
@@ -537,10 +540,9 @@
       return object;
     }
     case kDoubleCid: {
-      // Read the double value for the object.
-      Dart_CObject* object = AllocateDartCObjectDouble(Read<double>());
-      AddBackRef(object_id, object, kIsDeserialized);
-      return object;
+      // Doubles are handled specially when being sent as part of message
+      // snapshots.
+      UNREACHABLE();
     }
     case kOneByteStringCid: {
       intptr_t len = ReadSmiValue();
@@ -600,12 +602,16 @@
       return object;
     }
 
-#define READ_TYPED_DATA(type, ctype)                                           \
-    {                                                                          \
+#define READ_TYPED_DATA_HEADER(type)                                           \
       intptr_t len = ReadSmiValue();                                           \
       Dart_CObject* object =                                                   \
-          AllocateDartCObjectTypedData(Dart_TypedData_k##type, len);     \
+          AllocateDartCObjectTypedData(Dart_TypedData_k##type, len);           \
       AddBackRef(object_id, object, kIsDeserialized);                          \
+
+
+#define READ_TYPED_DATA(type, ctype)                                           \
+    {                                                                          \
+      READ_TYPED_DATA_HEADER(type);                                            \
       if (len > 0) {                                                           \
         ctype* p =                                                             \
             reinterpret_cast<ctype*>(object->value.as_typed_data.values);      \
@@ -617,12 +623,26 @@
     }                                                                          \
 
     case kTypedDataInt8ArrayCid:
-    case kExternalTypedDataInt8ArrayCid:
-      READ_TYPED_DATA(Int8, int8_t);
+    case kExternalTypedDataInt8ArrayCid: {
+      READ_TYPED_DATA_HEADER(Int8);
+      if (len > 0) {
+        uint8_t* p =
+            reinterpret_cast<uint8_t*>(object->value.as_typed_data.values);
+        ReadBytes(p, len);
+      }
+      return object;
+    }
 
     case kTypedDataUint8ArrayCid:
-    case kExternalTypedDataUint8ArrayCid:
-      READ_TYPED_DATA(Uint8, uint8_t);
+    case kExternalTypedDataUint8ArrayCid: {
+      READ_TYPED_DATA_HEADER(Uint8);
+      if (len > 0) {
+        uint8_t* p =
+            reinterpret_cast<uint8_t*>(object->value.as_typed_data.values);
+        ReadBytes(p, len);
+      }
+      return object;
+    }
 
     case kTypedDataUint8ClampedArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
@@ -1035,13 +1055,8 @@
       break;
     }
     case Dart_CObject_kDouble:
-      // Write out the serialization header value for this object.
-      WriteInlinedHeader(object);
-      // Write out the class and tags information.
-      WriteIndexedObject(kDoubleCid);
-      WriteIntptrValue(0);
-      // Write double value.
-      Write<double>(object->value.as_double);
+      WriteVMIsolateObject(kDoubleObject);
+      WriteDouble(object->value.as_double);
       break;
     case Dart_CObject_kString: {
       const uint8_t* utf8_str =
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 33c97c6..5b37906 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -58,12 +58,22 @@
   ASSERT(!code.IsNull());
   ASSERT(Isolate::Current()->no_callback_scope_depth() == 0);
 #if defined(USING_SIMULATOR)
+#if defined(ARCH_IS_64_BIT)
+  // TODO(zra): Change to intptr_t so we have only one case.
+    return bit_copy<RawObject*, int64_t>(Simulator::Current()->Call(
+        reinterpret_cast<int64_t>(entrypoint),
+        static_cast<int64_t>(code.EntryPoint()),
+        reinterpret_cast<int64_t>(&arguments_descriptor),
+        reinterpret_cast<int64_t>(&arguments),
+        reinterpret_cast<int64_t>(&context)));
+#else
     return bit_copy<RawObject*, int64_t>(Simulator::Current()->Call(
         reinterpret_cast<int32_t>(entrypoint),
         static_cast<int32_t>(code.EntryPoint()),
         reinterpret_cast<int32_t>(&arguments_descriptor),
         reinterpret_cast<int32_t>(&arguments),
         reinterpret_cast<int32_t>(&context)));
+#endif
 #else
     return entrypoint(code.EntryPoint(),
                       arguments_descriptor,
@@ -493,9 +503,9 @@
 }
 
 
-bool DartLibraryCalls::IsSendPort(const Instance& send_port) {
+bool DartLibraryCalls::IsSendPort(const Instance& obj) {
   // Get instance class.
-  const Class& cls = Class::Handle(send_port.clazz());
+  const Class& cls = Class::Handle(obj.clazz());
   // Get send port class from isolate library.
   const Library& isolate_lib = Library::Handle(Library::IsolateLibrary());
   const Class& send_port_cls = Class::Handle(
@@ -505,4 +515,17 @@
   return cls.id() == send_port_cls.id();
 }
 
+
+bool DartLibraryCalls::IsReceivePort(const Instance& obj) {
+  // Get instance class.
+  const Class& cls = Class::Handle(obj.clazz());
+  // Get send port class from isolate library.
+  const Library& isolate_lib = Library::Handle(Library::IsolateLibrary());
+  const Class& recv_port_cls = Class::Handle(
+      isolate_lib.LookupClassAllowPrivate(Symbols::_RawReceivePortImpl()));
+  // Check for the same class id.
+  ASSERT(!recv_port_cls.IsNull());
+  return cls.id() == recv_port_cls.id();
+}
+
 }  // namespace dart
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index 760b26f..8ed16f1 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -184,7 +184,8 @@
   // Returns the value of _id on success, a RawError on failure.
   static RawObject* PortGetId(const Instance& port);
 
-  static bool IsSendPort(const Instance& send_port);
+  static bool IsSendPort(const Instance& obj);
+  static bool IsReceivePort(const Instance& obj);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/dart_entry_test.cc b/runtime/vm/dart_entry_test.cc
index 301dd56..eb45b1b 100644
--- a/runtime/vm/dart_entry_test.cc
+++ b/runtime/vm/dart_entry_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "platform/assert.h"
 #include "vm/assembler.h"
 #include "vm/class_finalizer.h"
@@ -111,3 +115,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 00ea8f8..3d487b2 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -710,18 +710,11 @@
 
 
 void ActivationFrame::PrintToJSONObject(JSONObject* jsobj) {
-  intptr_t line = LineNumber();
   const Script& script = Script::Handle(SourceScript());
-
   jsobj->AddProperty("script", script);
-  jsobj->AddProperty("line", line);
-  jsobj->AddProperty("col", ColumnNumber());
+  jsobj->AddProperty("tokenPos", TokenPos());
   jsobj->AddProperty("function", function());
   jsobj->AddProperty("code", code());
-
-  // TODO(turnidge): Consider dropping lineString from the frame.
-  String& line_string = String::Handle(script.GetLine(line));
-  jsobj->AddProperty("lineString", line_string.ToCString());
   {
     JSONArray jsvars(jsobj, "vars");
     const int num_vars = NumLocalVariables();
diff --git a/runtime/vm/debugger_api_impl.cc b/runtime/vm/debugger_api_impl.cc
index 58e7794..5baae81 100644
--- a/runtime/vm/debugger_api_impl.cc
+++ b/runtime/vm/debugger_api_impl.cc
@@ -746,40 +746,7 @@
   }
 
   const GrowableObjectArray& info =
-      GrowableObjectArray::Handle(GrowableObjectArray::New());
-  const String& source = String::Handle(script.Source());
-  const String& key = Symbols::Empty();
-  const Object& line_separator = Object::Handle();
-  const TokenStream& tkns = TokenStream::Handle(script.tokens());
-  int line_offset = script.line_offset();
-  ASSERT(!tkns.IsNull());
-  TokenStream::Iterator tkit(tkns, 0);
-  int current_line = -1;
-  Scanner s(source, key);
-  s.Scan();
-  while (s.current_token().kind != Token::kEOS) {
-    ASSERT(tkit.IsValid());
-    ASSERT(s.current_token().kind == tkit.CurrentTokenKind());
-    int token_line = s.current_token().position.line;
-    if (token_line != current_line) {
-      // emit line
-      info.Add(line_separator);
-      info.Add(Smi::Handle(Smi::New(token_line + line_offset)));
-      current_line = token_line;
-    }
-    // TODO(hausner): Could optimize here by not reporting tokens
-    // that will never be a location used by the debugger, e.g.
-    // braces, semicolons, most keywords etc.
-    info.Add(Smi::Handle(Smi::New(tkit.CurrentPosition())));
-    int column = s.current_token().position.column;
-    // On the first line of the script we must add the column offset.
-    if (token_line == 1) {
-      column += script.col_offset();
-    }
-    info.Add(Smi::Handle(Smi::New(column)));
-    s.Scan();
-    tkit.Advance();
-  }
+      GrowableObjectArray::Handle(script.GenerateLineNumberArray());
   return Api::NewHandle(isolate, Array::MakeArray(info));
 }
 
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index 99b7ad9..744306a 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "include/dart_debugger_api.h"
 #include "include/dart_mirrors_api.h"
 #include "platform/assert.h"
@@ -2078,4 +2082,66 @@
   EXPECT(super_type == Dart_Null());
 }
 
+TEST_CASE(Debug_ScriptGetTokenInfo_Basic) {
+  const char* kScriptChars =
+      "var foo;\n"
+      "\n"
+      "main() {\n"
+      "}";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  intptr_t libId = -1;
+  EXPECT_VALID(Dart_LibraryId(lib, &libId));
+  Dart_Handle scriptUrl = NewString(TestCase::url());
+  Dart_Handle tokens = Dart_ScriptGetTokenInfo(libId, scriptUrl);
+  EXPECT_VALID(tokens);
+
+  Dart_Handle tokens_string = Dart_ToString(tokens);
+  EXPECT_VALID(tokens_string);
+  const char* tokens_cstr = "";
+  EXPECT_VALID(Dart_StringToCString(tokens_string, &tokens_cstr));
+  EXPECT_STREQ(
+      "[null, 1, 0, 1, 1, 5, 2, 8,"
+      " null, 3, 5, 1, 6, 5, 7, 6, 8, 8,"
+      " null, 4, 10, 1]",
+      tokens_cstr);
+}
+
+TEST_CASE(Debug_ScriptGetTokenInfo_MultiLineInterpolation) {
+  const char* kScriptChars =
+      "var foo = 'hello world';\n"
+      "\n"
+      "void test() {\n"
+      "  return '''\n"
+      "foo=$foo"
+      "''';\n"
+      "}\n"
+      "\n"
+      "main() {\n"
+      "}";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  intptr_t libId = -1;
+  EXPECT_VALID(Dart_LibraryId(lib, &libId));
+  Dart_Handle scriptUrl = NewString(TestCase::url());
+  Dart_Handle tokens = Dart_ScriptGetTokenInfo(libId, scriptUrl);
+  EXPECT_VALID(tokens);
+
+  Dart_Handle tokens_string = Dart_ToString(tokens);
+  EXPECT_VALID(tokens_string);
+  const char* tokens_cstr = "";
+  EXPECT_VALID(Dart_StringToCString(tokens_string, &tokens_cstr));
+  EXPECT_STREQ(
+      "[null, 1, 0, 1, 1, 5, 2, 9, 3, 11, 4, 24,"
+      " null, 3, 7, 1, 8, 6, 9, 10, 10, 11, 11, 13,"
+      " null, 4, 13, 3, 14, 10,"
+      " null, 5, 17, 5, 18, 9, 19, 12,"
+      " null, 6, 21, 1,"
+      " null, 8, 24, 1, 25, 5, 26, 6, 27, 8,"
+      " null, 9, 29, 1]",
+      tokens_cstr);
+}
+
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/debugger_arm64.cc b/runtime/vm/debugger_arm64.cc
new file mode 100644
index 0000000..c4632f2
--- /dev/null
+++ b/runtime/vm/debugger_arm64.cc
@@ -0,0 +1,46 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_ARM64)
+
+#include "vm/code_patcher.h"
+#include "vm/cpu.h"
+#include "vm/debugger.h"
+#include "vm/instructions.h"
+#include "vm/stub_code.h"
+
+namespace dart {
+
+RawInstance* ActivationFrame::GetInstanceCallReceiver(
+                 intptr_t num_actual_args) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+RawObject* ActivationFrame::GetClosureObject(intptr_t num_actual_args) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+uword CodeBreakpoint::OrigStubAddress() const {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+void CodeBreakpoint::PatchCode() {
+  UNIMPLEMENTED();
+}
+
+
+void CodeBreakpoint::RestoreCode() {
+  UNIMPLEMENTED();
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/debugger_test.cc b/runtime/vm/debugger_test.cc
index d4a71da..7d16bd1 100644
--- a/runtime/vm/debugger_test.cc
+++ b/runtime/vm/debugger_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "vm/debugger.h"
 #include "vm/unit_test.h"
 
@@ -104,6 +108,6 @@
   EXPECT(saw_paused_event);
 }
 
-
-
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/disassembler_arm64.cc b/runtime/vm/disassembler_arm64.cc
new file mode 100644
index 0000000..4859b69
--- /dev/null
+++ b/runtime/vm/disassembler_arm64.cc
@@ -0,0 +1,613 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/disassembler.h"
+
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_ARM64.
+#if defined(TARGET_ARCH_ARM64)
+#include "platform/assert.h"
+
+namespace dart {
+
+class ARM64Decoder : public ValueObject {
+ public:
+  ARM64Decoder(char* buffer, size_t buffer_size)
+      : buffer_(buffer),
+        buffer_size_(buffer_size),
+        buffer_pos_(0) {
+    buffer_[buffer_pos_] = '\0';
+  }
+
+  ~ARM64Decoder() {}
+
+  // Writes one disassembled instruction into 'buffer' (0-terminated).
+  // Returns true if the instruction was successfully decoded, false otherwise.
+  void InstructionDecode(uword pc);
+
+ private:
+  // Bottleneck functions to print into the out_buffer.
+  void Print(const char* str);
+
+  // Printing of common values.
+  void PrintRegister(int reg, R31Type r31t);
+  void PrintShiftExtendRm(Instr* instr);
+  void PrintMemOperand(Instr* instr);
+  void PrintS(Instr* instr);
+
+  // Handle formatting of instructions and their options.
+  int FormatRegister(Instr* instr, const char* option);
+  int FormatOption(Instr* instr, const char* format);
+  void Format(Instr* instr, const char* format);
+  void Unknown(Instr* instr);
+
+  // Decode instructions.
+  #define DECODE_OP(op)                                                        \
+    void Decode##op(Instr* instr);
+  APPLY_OP_LIST(DECODE_OP)
+  #undef DECODE_OP
+
+
+  // Convenience functions.
+  char* get_buffer() const { return buffer_; }
+  char* current_position_in_buffer() { return buffer_ + buffer_pos_; }
+  size_t remaining_size_in_buffer() { return buffer_size_ - buffer_pos_; }
+
+  char* buffer_;  // Decode instructions into this buffer.
+  size_t buffer_size_;  // The size of the character buffer.
+  size_t buffer_pos_;  // Current character position in buffer.
+
+  DISALLOW_ALLOCATION();
+  DISALLOW_COPY_AND_ASSIGN(ARM64Decoder);
+};
+
+
+// Support for assertions in the ARM64Decoder formatting functions.
+#define STRING_STARTS_WITH(string, compare_string) \
+  (strncmp(string, compare_string, strlen(compare_string)) == 0)
+
+
+// Append the str to the output buffer.
+void ARM64Decoder::Print(const char* str) {
+  char cur = *str++;
+  while (cur != '\0' && (buffer_pos_ < (buffer_size_ - 1))) {
+    buffer_[buffer_pos_++] = cur;
+    cur = *str++;
+  }
+  buffer_[buffer_pos_] = '\0';
+}
+
+
+// These register names are defined in a way to match the native disassembler
+// formatting, except for register aliases ctx (r9) and pp (r10).
+// See for example the command "objdump -d <binary file>".
+static const char* reg_names[kNumberOfCpuRegisters] = {
+  "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
+  "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",
+  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
+  "r24", "ip0", "ip1", "pp",  "ctx", "fp",  "lr",  "r31",
+};
+
+
+// Print the register name according to the active name converter.
+void ARM64Decoder::PrintRegister(int reg, R31Type r31t) {
+  ASSERT(0 <= reg);
+  ASSERT(reg < kNumberOfCpuRegisters);
+  if (reg == 31) {
+    const char* rstr = (r31t == R31IsZR) ? "zr" : "sp";
+    Print(rstr);
+  } else {
+    Print(reg_names[reg]);
+  }
+}
+
+
+// These shift names are defined in a way to match the native disassembler
+// formatting. See for example the command "objdump -d <binary file>".
+static const char* shift_names[kMaxShift] = {
+  "lsl", "lsr", "asr", "ror"
+};
+
+
+static const char* extend_names[kMaxExtend] = {
+  "uxtb", "uxth", "uxtw", "uxtx",
+  "sxtb", "sxth", "sxtw", "sxtx",
+};
+
+
+// Print the register shift operands for the instruction. Generally used for
+// data processing instructions.
+void ARM64Decoder::PrintShiftExtendRm(Instr* instr) {
+  int rm = instr->RmField();
+  Shift shift = instr->ShiftTypeField();
+  int shift_amount = instr->ShiftAmountField();
+  Extend extend = instr->ExtendTypeField();
+  int extend_shift_amount = instr->ExtShiftAmountField();
+
+  PrintRegister(rm, R31IsZR);
+
+  if (instr->IsShift() && (shift == LSL) && (shift_amount == 0)) {
+    // Special case for using rm only.
+    return;
+  }
+  if (instr->IsShift()) {
+    // by immediate
+    if ((shift == ROR) && (shift_amount == 0)) {
+      Print(" RRX");
+      return;
+    } else if (((shift == LSR) || (shift == ASR)) && (shift_amount == 0)) {
+      shift_amount = 32;
+    }
+    buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                               remaining_size_in_buffer(),
+                               " %s #%d",
+                               shift_names[shift],
+                               shift_amount);
+  } else {
+    ASSERT(instr->IsExtend());
+    // by register
+    buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                               remaining_size_in_buffer(),
+                               " %s",
+                               extend_names[extend]);
+    if (((instr->SFField() == 1) && (extend == UXTX)) ||
+        ((instr->SFField() == 0) && (extend == UXTW))) {
+      // Shift amount.
+      buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                                 remaining_size_in_buffer(),
+                                 " %d",
+                                 extend_shift_amount);
+    }
+  }
+}
+
+
+void ARM64Decoder::PrintMemOperand(Instr* instr) {
+  const Register rn = instr->RnField();
+  if (instr->Bit(24) == 1) {
+    // rn + scaled unsigned 12-bit immediate offset.
+    const uint32_t scale = instr->SzField();
+    const uint32_t imm12 = instr->Imm12Field();
+    const uint32_t off = imm12 << scale;
+    Print("[");
+    PrintRegister(rn, R31IsSP);
+    if (off != 0) {
+      buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                                 remaining_size_in_buffer(),
+                                 ", #%d",
+                                 off);
+    }
+    Print("]");
+  } else {
+    switch (instr->Bits(10, 2)) {
+      case 1: {
+        const int32_t imm9 = instr->SImm9Field();
+        // rn + signed 9-bit immediate, post-index, writeback.
+        Print("[");
+        PrintRegister(rn, R31IsSP);
+        Print("]");
+        buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                                   remaining_size_in_buffer(),
+                                   ", #%d !",
+                                   imm9);
+        break;
+      }
+      case 3: {
+        const int32_t imm9 = instr->SImm9Field();
+        // rn + signed 9-bit immediate, pre-index, writeback.
+        Print("[");
+        PrintRegister(rn, R31IsSP);
+        buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                                   remaining_size_in_buffer(),
+                                   ", #%d",
+                                   imm9);
+        Print("] !");
+        break;
+      }
+      case 2: {
+        const Register rm = instr->RmField();
+        const Extend ext = instr->ExtendTypeField();
+        const int s = instr->Bit(12);
+        Print("[");
+        PrintRegister(rn, R31IsSP);
+        Print(", ");
+        PrintRegister(rm, R31IsZR);
+        buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                                   remaining_size_in_buffer(),
+                                   " %s",
+                                   extend_names[ext]);
+        if (s == 1) {
+          Print(" scaled");
+        }
+        Print("]");
+        break;
+      }
+      default: {
+        Print("???");
+      }
+    }
+  }
+}
+
+
+// Handle all register based formatting in these functions to reduce the
+// complexity of FormatOption.
+int ARM64Decoder::FormatRegister(Instr* instr, const char* format) {
+  ASSERT(format[0] == 'r');
+  if (format[1] == 'n') {  // 'rn: Rn register
+    int reg = instr->RnField();
+    PrintRegister(reg, instr->RnMode());
+    return 2;
+  } else if (format[1] == 'd') {  // 'rd: Rd register
+    int reg = instr->RdField();
+    PrintRegister(reg, instr->RdMode());
+    return 2;
+  } else if (format[1] == 'm') {  // 'rm: Rm register
+    int reg = instr->RmField();
+    PrintRegister(reg, R31IsZR);
+    return 2;
+  } else if (format[1] == 't') {  // 'rt: Rt register
+    int reg = instr->RtField();
+    PrintRegister(reg, R31IsZR);
+    return 2;
+  }
+  UNREACHABLE();
+  return -1;
+}
+
+
+// FormatOption takes a formatting string and interprets it based on
+// the current instructions. The format string points to the first
+// character of the option string (the option escape has already been
+// consumed by the caller.)  FormatOption returns the number of
+// characters that were consumed from the formatting string.
+int ARM64Decoder::FormatOption(Instr* instr, const char* format) {
+  switch (format[0]) {
+    case 'i': {  // 'imm12, imm16
+      uint64_t imm;
+      int ret = 5;
+      if (format[4] == '2') {
+        ASSERT(STRING_STARTS_WITH(format, "imm12"));
+        imm = instr->Imm12Field();
+        if (format[5] == 's') {
+          // shifted immediate.
+          if (instr->Imm12ShiftField() == 1) {
+            imm = imm << 12;
+          } else if ((instr->Imm12ShiftField() & 0x2) != 0) {
+            Print("Unknown Shift");
+          }
+          ret = 6;
+        }
+      } else {
+        ASSERT(STRING_STARTS_WITH(format, "imm16"));
+        imm = instr->Imm16Field();
+      }
+      buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                                 remaining_size_in_buffer(),
+                                 "0x%"Px64,
+                                 imm);
+      return ret;
+    }
+    case 's': {  // 's: S flag.
+      if (format[1] == 'h') {
+        ASSERT(STRING_STARTS_WITH(format, "shift_op"));
+        PrintShiftExtendRm(instr);
+        return 8;
+      } else if (format[1] == 'f') {
+        ASSERT(STRING_STARTS_WITH(format, "sf"));
+        if (instr->SFField() == 1) {
+          // TODO(zra): If we don't use the w form much, we can omit printing
+          // this x.
+          Print("x");
+        } else {
+          Print("w");
+        }
+        return 2;
+      } else if (format[1] == 'z') {
+        ASSERT(STRING_STARTS_WITH(format, "sz"));
+        const int sz = instr->SzField();
+        char const* sz_str;
+        switch (sz) {
+          case 0: sz_str = "b"; break;
+          case 1: sz_str = "h"; break;
+          case 2: sz_str = "w"; break;
+          case 3: sz_str = "x"; break;
+          default: sz_str = "?"; break;
+        }
+        buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                                   remaining_size_in_buffer(),
+                                   "%s",
+                                   sz_str);
+        return 2;
+      } else if (format[1] == ' ') {
+        if (instr->HasS()) {
+          Print("s");
+        }
+        return 1;
+      } else {
+        UNREACHABLE();
+      }
+    }
+    case 'r': {
+      return FormatRegister(instr, format);
+    }
+    case 'h': {
+      ASSERT(STRING_STARTS_WITH(format, "hw"));
+      const int shift = instr->HWField() << 4;
+      if (shift != 0) {
+        buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
+                                   remaining_size_in_buffer(),
+                                   "lsl %d",
+                                   shift);
+      }
+      return 2;
+    }
+    case 'm': {
+      ASSERT(STRING_STARTS_WITH(format, "memop"));
+      PrintMemOperand(instr);
+      return 5;
+    }
+    default: {
+      UNREACHABLE();
+      break;
+    }
+  }
+  UNREACHABLE();
+  return -1;
+}
+
+
+// Format takes a formatting string for a whole instruction and prints it into
+// the output buffer. All escaped options are handed to FormatOption to be
+// parsed further.
+void ARM64Decoder::Format(Instr* instr, const char* format) {
+  char cur = *format++;
+  while ((cur != 0) && (buffer_pos_ < (buffer_size_ - 1))) {
+    if (cur == '\'') {  // Single quote is used as the formatting escape.
+      format += FormatOption(instr, format);
+    } else {
+      buffer_[buffer_pos_++] = cur;
+    }
+    cur = *format++;
+  }
+  buffer_[buffer_pos_]  = '\0';
+}
+
+
+// For currently unimplemented decodings the disassembler calls Unknown(instr)
+// which will just print "unknown" of the instruction bits.
+void ARM64Decoder::Unknown(Instr* instr) {
+  Format(instr, "unknown");
+}
+
+
+void ARM64Decoder::DecodeMoveWide(Instr* instr) {
+  switch (instr->Bits(29, 2)) {
+    case 0:
+      Format(instr, "movn'sf 'rd, 'imm16 'hw");
+      break;
+    case 2:
+      Format(instr, "movz'sf 'rd, 'imm16 'hw");
+      break;
+    case 3:
+      Format(instr, "movk'sf 'rd, 'imm16 'hw");
+      break;
+    default:
+      Unknown(instr);
+      break;
+  }
+}
+
+
+void ARM64Decoder::DecodeLoadStoreReg(Instr* instr) {
+  if (instr->Bits(25, 2) != 0) {
+    Unknown(instr);
+    return;
+  }
+  if (instr->Bit(22) == 1) {
+    Format(instr, "ldr'sz 'rt, 'memop");
+  } else {
+    Format(instr, "str'sz 'rt, 'memop");
+  }
+}
+
+
+void ARM64Decoder::DecodeAddSubImm(Instr* instr) {
+  switch (instr->Bit(30)) {
+    case 0:
+      Format(instr, "addi'sf's 'rd, 'rn, 'imm12s");
+      break;
+    case 1:
+      Format(instr, "subi'sf's 'rd, 'rn, 'imm12s");
+      break;
+    default:
+      Unknown(instr);
+      break;
+  }
+}
+
+void ARM64Decoder::DecodeDPImmediate(Instr* instr) {
+  if (instr->IsMoveWideOp()) {
+    DecodeMoveWide(instr);
+  } else if (instr->IsAddSubImmOp()) {
+    DecodeAddSubImm(instr);
+  } else {
+    Unknown(instr);
+  }
+}
+
+
+void ARM64Decoder::DecodeExceptionGen(Instr* instr) {
+  if ((instr->Bits(0, 2) == 1) && (instr->Bits(2, 3) == 0) &&
+      (instr->Bits(21, 3) == 0)) {
+    Format(instr, "svc 'imm16");
+  } else if ((instr->Bits(0, 2) == 0) && (instr->Bits(2, 3) == 0) &&
+             (instr->Bits(21, 3) == 1)) {
+    Format(instr, "brk 'imm16");
+  } else if ((instr->Bits(0, 2) == 0) && (instr->Bits(2, 3) == 0) &&
+             (instr->Bits(21, 3) == 2)) {
+    Format(instr, "hlt 'imm16");
+  }
+}
+
+
+void ARM64Decoder::DecodeSystem(Instr* instr) {
+  if ((instr->Bits(0, 8) == 0x5f) && (instr->Bits(12, 4) == 2) &&
+      (instr->Bits(16, 3) == 3) && (instr->Bits(19, 2) == 0) &&
+      (instr->Bit(21) == 0)) {
+    if (instr->Bits(8, 4) == 0) {
+      Format(instr, "nop");
+    } else {
+      Unknown(instr);
+    }
+  } else {
+    Unknown(instr);
+  }
+}
+
+
+void ARM64Decoder::DecodeUnconditionalBranchReg(Instr* instr) {
+  if ((instr->Bits(0, 5) == 0) && (instr->Bits(10, 5) == 0) &&
+      (instr->Bits(16, 5) == 0x1f)) {
+    switch (instr->Bits(21, 4)) {
+      case 0:
+        Format(instr, "br 'rn");
+        break;
+      case 1:
+        Format(instr, "blr 'rn");
+        break;
+      case 2:
+        Format(instr, "ret 'rn");
+        break;
+      default:
+        Unknown(instr);
+        break;
+    }
+  }
+}
+
+
+void ARM64Decoder::DecodeCompareBranch(Instr* instr) {
+  if (instr->IsExceptionGenOp()) {
+    DecodeExceptionGen(instr);
+  } else if (instr->IsSystemOp()) {
+    DecodeSystem(instr);
+  } else if (instr->IsUnconditionalBranchRegOp()) {
+    DecodeUnconditionalBranchReg(instr);
+  } else {
+    Unknown(instr);
+  }
+}
+
+
+void ARM64Decoder::DecodeLoadStore(Instr* instr) {
+  if (instr->IsLoadStoreRegOp()) {
+    DecodeLoadStoreReg(instr);
+  } else {
+    Unknown(instr);
+  }
+}
+
+
+void ARM64Decoder::DecodeAddSubShiftExt(Instr* instr) {
+  switch (instr->Bit(30)) {
+    case 0:
+      Format(instr, "add'sf's 'rd, 'rn, 'shift_op");
+      break;
+    case 1:
+      Format(instr, "sub'sf's 'rd, 'rn, 'shift_op");
+      break;
+    default:
+      UNREACHABLE();
+      break;
+  }
+}
+
+
+void ARM64Decoder::DecodeDPRegister(Instr* instr) {
+  if (instr->IsAddSubShiftExtOp()) {
+    DecodeAddSubShiftExt(instr);
+  } else {
+    Unknown(instr);
+  }
+}
+
+
+void ARM64Decoder::DecodeDPSimd1(Instr* instr) {
+  Unknown(instr);
+}
+
+
+void ARM64Decoder::DecodeDPSimd2(Instr* instr) {
+  Unknown(instr);
+}
+
+
+void ARM64Decoder::InstructionDecode(uword pc) {
+  Instr* instr = Instr::At(pc);
+
+  if (instr->IsDPImmediateOp()) {
+    DecodeDPImmediate(instr);
+  } else if (instr->IsCompareBranchOp()) {
+    DecodeCompareBranch(instr);
+  } else if (instr->IsLoadStoreOp()) {
+    DecodeLoadStore(instr);
+  } else if (instr->IsDPRegisterOp()) {
+    DecodeDPRegister(instr);
+  } else if (instr->IsDPSimd1Op()) {
+    DecodeDPSimd1(instr);
+  } else {
+    ASSERT(instr->IsDPSimd2Op());
+    DecodeDPSimd2(instr);
+  }
+}
+
+
+void Disassembler::DecodeInstruction(char* hex_buffer, intptr_t hex_size,
+                                     char* human_buffer, intptr_t human_size,
+                                     int* out_instr_size, uword pc) {
+  ARM64Decoder decoder(human_buffer, human_size);
+  decoder.InstructionDecode(pc);
+  int32_t instruction_bits = Instr::At(pc)->InstructionBits();
+  OS::SNPrint(hex_buffer, hex_size, "%08x", instruction_bits);
+  if (out_instr_size) {
+    *out_instr_size = Instr::kInstrSize;
+  }
+}
+
+
+void Disassembler::Disassemble(uword start,
+                               uword end,
+                               DisassemblyFormatter* formatter,
+                               const Code::Comments& comments) {
+  ASSERT(formatter != NULL);
+  char hex_buffer[kHexadecimalBufferSize];  // Instruction in hexadecimal form.
+  char human_buffer[kUserReadableBufferSize];  // Human-readable instruction.
+  uword pc = start;
+  intptr_t comment_finger = 0;
+  while (pc < end) {
+    const intptr_t offset = pc - start;
+    while (comment_finger < comments.Length() &&
+           comments.PCOffsetAt(comment_finger) <= offset) {
+      formatter->Print(
+          "        ;; %s\n",
+          String::Handle(comments.CommentAt(comment_finger)).ToCString());
+      comment_finger++;
+    }
+    int instruction_length;
+    DecodeInstruction(hex_buffer, sizeof(hex_buffer),
+                      human_buffer, sizeof(human_buffer),
+                      &instruction_length, pc);
+
+    formatter->ConsumeInstruction(hex_buffer,
+                                  sizeof(hex_buffer),
+                                  human_buffer,
+                                  sizeof(human_buffer),
+                                  pc);
+    pc += instruction_length;
+  }
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM
diff --git a/runtime/vm/disassembler_test.cc b/runtime/vm/disassembler_test.cc
index 1c33942..3c5cedd 100644
--- a/runtime/vm/disassembler_test.cc
+++ b/runtime/vm/disassembler_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "vm/assembler.h"
 #include "vm/disassembler.h"
 #include "vm/unit_test.h"
@@ -23,3 +27,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/elfgen.h b/runtime/vm/elfgen.h
index 9406853..57c884b 100644
--- a/runtime/vm/elfgen.h
+++ b/runtime/vm/elfgen.h
@@ -403,6 +403,9 @@
   WriteShort(&header_, kEM_X86_64);  // e_machine
 #elif defined(TARGET_ARCH_ARM)
   WriteShort(&header_, kEM_ARM);  // e_machine
+#elif defined(TARGET_ARCH_ARM64)
+  // TODO(zra): Find the right ARM64 constant.
+  WriteShort(&header_, kEM_ARM);  // e_machine
 #elif defined(TARGET_ARCH_MIPS)
   WriteShort(&header_, kEM_MIPS);  // e_machine
 #else
diff --git a/runtime/vm/exceptions_test.cc b/runtime/vm/exceptions_test.cc
index e3138a3..45b6577 100644
--- a/runtime/vm/exceptions_test.cc
+++ b/runtime/vm/exceptions_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "include/dart_api.h"
 #include "platform/assert.h"
 #include "vm/dart_api_impl.h"
@@ -133,3 +137,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/find_code_object_test.cc b/runtime/vm/find_code_object_test.cc
index f67b684..f9e5aee 100644
--- a/runtime/vm/find_code_object_test.cc
+++ b/runtime/vm/find_code_object_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "platform/assert.h"
 #include "vm/class_finalizer.h"
 #include "vm/compiler.h"
@@ -156,3 +160,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index 98a774b..3c2352e 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -115,7 +115,7 @@
                             Definition::UseKind use_kind) {
   if (use_kind == Definition::kValue) {
     ASSERT(instr->IsDefinition());
-    instr->AsDefinition()->set_ssa_temp_index(alloc_ssa_temp_index());
+    AllocateSSAIndexes(instr->AsDefinition());
   }
   instr->InsertAfter(prev);
   ASSERT(instr->env() == NULL);
@@ -129,7 +129,7 @@
                                  Definition::UseKind use_kind) {
   if (use_kind == Definition::kValue) {
     ASSERT(instr->IsDefinition());
-    instr->AsDefinition()->set_ssa_temp_index(alloc_ssa_temp_index());
+    AllocateSSAIndexes(instr->AsDefinition());
   }
   ASSERT(instr->env() == NULL);
   if (env != NULL) env->DeepCopyTo(instr);
@@ -716,7 +716,7 @@
     ASSERT(parameter_count() == inlining_parameters->length());
     for (intptr_t i = 0; i < parameter_count(); ++i) {
       Definition* defn = (*inlining_parameters)[i];
-      defn->set_ssa_temp_index(alloc_ssa_temp_index());  // New SSA temp.
+      AllocateSSAIndexes(defn);
       AddToInitialDefinitions(defn);
       env.Add(defn);
     }
@@ -926,7 +926,7 @@
         // Not a load, store, or constant.
         if (definition->is_used()) {
           // Assign fresh SSA temporary and update expression stack.
-          definition->set_ssa_temp_index(alloc_ssa_temp_index());
+          AllocateSSAIndexes(definition);
           env->Add(definition);
         }
       }
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
index 8b134b3..9c4008d 100644
--- a/runtime/vm/flow_graph.h
+++ b/runtime/vm/flow_graph.h
@@ -120,6 +120,14 @@
 
   intptr_t alloc_ssa_temp_index() { return current_ssa_temp_index_++; }
 
+  void AllocateSSAIndexes(Definition* def) {
+    ASSERT(def);
+    def->set_ssa_temp_index(alloc_ssa_temp_index());
+    // Always allocate a second index. This index is unused except
+    // for Definitions with register pair outputs.
+    alloc_ssa_temp_index();
+  }
+
   intptr_t InstructionCount() const;
 
   ConstantInstr* GetConstant(const Object& object);
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index 86c54fd..00e12a47 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -34,6 +34,18 @@
 static const intptr_t kTempVirtualRegister = -2;
 static const intptr_t kIllegalPosition = -1;
 static const intptr_t kMaxPosition = 0x7FFFFFFF;
+static const intptr_t kPairVirtualRegisterOffset = 1;
+
+// Definitions which have pair representations
+// (kPairOfTagged or kPairOfUnboxedDouble) use two virtual register names.
+// At SSA index allocation time each definition reserves two SSA indexes,
+// the second index is only used for pairs. This function maps from the first
+// SSA index to the second.
+static intptr_t ToSecondPairVreg(intptr_t vreg) {
+  // Map vreg to its pair vreg.
+  return vreg + kPairVirtualRegisterOffset;
+}
+
 
 static intptr_t MinPosition(intptr_t a, intptr_t b) {
   return (a < b) ? a : b;
@@ -74,7 +86,9 @@
     blocked_cpu_registers_(),
     blocked_fpu_registers_(),
     cpu_spill_slot_count_(0) {
-  for (intptr_t i = 0; i < vreg_count_; i++) live_ranges_.Add(NULL);
+  for (intptr_t i = 0; i < vreg_count_; i++) {
+    live_ranges_.Add(NULL);
+  }
   for (intptr_t i = 0; i < vreg_count_; i++) {
     value_representations_.Add(kNoRepresentation);
   }
@@ -114,25 +128,33 @@
     for (BackwardInstructionIterator it(block); !it.Done(); it.Advance()) {
       Instruction* current = it.Current();
 
+      // Initialize location summary for instruction.
+      current->InitializeLocationSummary(true);  // Optimizing.
+      LocationSummary* locs = current->locs();
+
       // Handle definitions.
       Definition* current_def = current->AsDefinition();
       if ((current_def != NULL) && current_def->HasSSATemp()) {
         kill->Add(current_def->ssa_temp_index());
         live_in->Remove(current_def->ssa_temp_index());
+        if (current_def->HasPairRepresentation()) {
+          kill->Add(ToSecondPairVreg(current_def->ssa_temp_index()));
+          live_in->Remove(ToSecondPairVreg(current_def->ssa_temp_index()));
+        }
       }
 
       // Handle uses.
-      current->InitializeLocationSummary(true);  // Optimizing.
-      LocationSummary* locs = current->locs();
       ASSERT(locs->input_count() == current->InputCount());
       for (intptr_t j = 0; j < current->InputCount(); j++) {
         Value* input = current->InputAt(j);
-        const intptr_t use = input->definition()->ssa_temp_index();
 
         ASSERT(!locs->in(j).IsConstant() || input->BindsToConstant());
         if (locs->in(j).IsConstant()) continue;
 
-        live_in->Add(use);
+        live_in->Add(input->definition()->ssa_temp_index());
+        if (input->definition()->HasPairRepresentation()) {
+          live_in->Add(ToSecondPairVreg(input->definition()->ssa_temp_index()));
+        }
       }
 
       // Add non-argument uses from the deoptimization environment (pushed
@@ -147,11 +169,15 @@
             // Treat its inputs as part of the environment.
             for (intptr_t i = 0; i < defn->InputCount(); i++) {
               if (!defn->InputAt(i)->BindsToConstant()) {
-                live_in->Add(defn->InputAt(i)->definition()->ssa_temp_index());
+                intptr_t idx = defn->InputAt(i)->definition()->ssa_temp_index();
+                live_in->Add(idx);
               }
             }
           } else if (!defn->IsPushArgument() && !defn->IsConstant()) {
             live_in->Add(defn->ssa_temp_index());
+            if (defn->HasPairRepresentation()) {
+              live_in->Add(ToSecondPairVreg(defn->ssa_temp_index()));
+            }
           }
         }
       }
@@ -161,6 +187,7 @@
     if (block->IsJoinEntry()) {
       JoinEntryInstr* join = block->AsJoinEntry();
       for (PhiIterator it(join); !it.Done(); it.Advance()) {
+        // TODO(johnmccutchan): Fix handling of PhiInstr with PairLocation.
         PhiInstr* phi = it.Current();
         ASSERT(phi != NULL);
         kill->Add(phi->ssa_temp_index());
@@ -185,8 +212,8 @@
       for (intptr_t i = 0;
            i < catch_entry->initial_definitions()->length();
            i++) {
-        intptr_t vreg =
-            (*catch_entry->initial_definitions())[i]->ssa_temp_index();
+        Definition* def = (*catch_entry->initial_definitions())[i];
+        const intptr_t vreg = def->ssa_temp_index();
         kill_[catch_entry->postorder_number()]->Add(vreg);
         live_in_[catch_entry->postorder_number()]->Remove(vreg);
       }
@@ -195,7 +222,8 @@
 
   // Process initial definitions, ie, constants and incoming parameters.
   for (intptr_t i = 0; i < graph_entry_->initial_definitions()->length(); i++) {
-    intptr_t vreg = (*graph_entry_->initial_definitions())[i]->ssa_temp_index();
+    Definition* def = (*graph_entry_->initial_definitions())[i];
+    const intptr_t vreg = def->ssa_temp_index();
     kill_[graph_entry_->postorder_number()]->Add(vreg);
     live_in_[graph_entry_->postorder_number()]->Remove(vreg);
   }
@@ -607,7 +635,8 @@
       (instr->representation() == kUnboxedMint) ||
       (instr->representation() == kUnboxedFloat32x4) ||
       (instr->representation() == kUnboxedInt32x4) ||
-      (instr->representation() == kUnboxedFloat64x2)) {
+      (instr->representation() == kUnboxedFloat64x2) ||
+      (instr->representation() == kPairOfUnboxedDouble)) {
     return Location::kFpuRegister;
   } else {
     return Location::kRegister;
@@ -666,6 +695,7 @@
   // Record the corresponding phi input use for each phi.
   intptr_t move_idx = 0;
   for (PhiIterator it(join); !it.Done(); it.Advance()) {
+    // TODO(johnmccutchan): Fix handling of PhiInstr with PairLocation.
     PhiInstr* phi = it.Current();
     Value* val = phi->InputAt(pred_idx);
     MoveOperands* move = parallel_move->MoveOperandsAt(move_idx);
@@ -709,6 +739,7 @@
   const bool is_loop_header = BlockInfoAt(join->start_pos())->is_loop_header();
   intptr_t move_idx = 0;
   for (PhiIterator it(join); !it.Done(); it.Advance()) {
+    // TODO(johnmccutchan): Fix handling of PhiInstr with PairLocation.
     PhiInstr* phi = it.Current();
     ASSERT(phi != NULL);
     const intptr_t vreg = phi->ssa_temp_index();
@@ -796,10 +827,16 @@
         continue;
       }
 
-      const intptr_t vreg = def->ssa_temp_index();
-      LiveRange* range = GetLiveRange(vreg);
+      LiveRange* range = GetLiveRange(def->ssa_temp_index());
       range->AddUseInterval(block_start_pos, use_pos);
       range->AddUse(use_pos, &locations[i]);
+
+      if (def->HasPairRepresentation()) {
+        LiveRange* range =
+            GetLiveRange(ToSecondPairVreg(def->ssa_temp_index()));
+        range->AddUseInterval(block_start_pos, use_pos);
+        range->AddUse(use_pos, &locations[i]);
+      }
     }
 
     env->set_locations(locations);
@@ -834,16 +871,197 @@
 
     locations[i] = Location::Any();
 
-    const intptr_t vreg = def->ssa_temp_index();
-    LiveRange* range = GetLiveRange(vreg);
+    LiveRange* range = GetLiveRange(def->ssa_temp_index());
     range->AddUseInterval(block_start_pos, use_pos);
     range->AddUse(use_pos, &locations[i]);
+    if (def->HasPairRepresentation()) {
+      LiveRange* range = GetLiveRange(ToSecondPairVreg(def->ssa_temp_index()));
+      range->AddUseInterval(block_start_pos, use_pos);
+      range->AddUse(use_pos, &locations[i]);
+    }
   }
 
   mat->set_locations(locations);
 }
 
 
+void FlowGraphAllocator::ProcessOneInput(BlockEntryInstr* block,
+                                         intptr_t pos,
+                                         Location* in_ref,
+                                         Value* input,
+                                         intptr_t vreg) {
+  ASSERT(in_ref != NULL);
+  ASSERT(!in_ref->IsPairLocation());
+  ASSERT(input != NULL);
+  ASSERT(block != NULL);
+  LiveRange* range = GetLiveRange(vreg);
+  if (in_ref->IsMachineRegister()) {
+    // Input is expected in a fixed register. Expected shape of
+    // live ranges:
+    //
+    //                 j' i  i'
+    //      value    --*
+    //      register   [-----)
+    //
+    MoveOperands* move =
+        AddMoveAt(pos - 1, *in_ref, Location::Any());
+    BlockLocation(*in_ref, pos - 1, pos + 1);
+    range->AddUseInterval(block->start_pos(), pos - 1);
+    range->AddHintedUse(pos - 1, move->src_slot(), in_ref);
+  } else if (in_ref->IsUnallocated()) {
+    if (in_ref->policy() == Location::kWritableRegister) {
+      // Writable unallocated input. Expected shape of
+      // live ranges:
+      //
+      //                 i  i'
+      //      value    --*
+      //      temp       [--)
+      MoveOperands* move = AddMoveAt(pos,
+                                     Location::RequiresRegister(),
+                                     Location::PrefersRegister());
+
+      // Add uses to the live range of the input.
+      range->AddUseInterval(block->start_pos(), pos);
+      range->AddUse(pos, move->src_slot());
+
+      // Create live range for the temporary.
+      LiveRange* temp = MakeLiveRangeForTemporary();
+      temp->AddUseInterval(pos, pos + 1);
+      temp->AddHintedUse(pos, in_ref, move->src_slot());
+      temp->AddUse(pos, move->dest_slot());
+      *in_ref = Location::RequiresRegister();
+      CompleteRange(temp, RegisterKindFromPolicy(*in_ref));
+    } else {
+      // Normal unallocated input. Expected shape of
+      // live ranges:
+      //
+      //                 i  i'
+      //      value    -----*
+      //
+      range->AddUseInterval(block->start_pos(), pos + 1);
+      range->AddUse(pos + 1, in_ref);
+    }
+  } else {
+    ASSERT(in_ref->IsConstant());
+  }
+}
+
+
+void FlowGraphAllocator::ProcessOneOutput(BlockEntryInstr* block,
+                                          Instruction* current,
+                                          intptr_t pos,
+                                          Location* out,
+                                          Definition* def,
+                                          intptr_t vreg,
+                                          bool output_same_as_first_input,
+                                          Location* in_ref,
+                                          Definition* input,
+                                          intptr_t input_vreg,
+                                          BitVector* interference_set) {
+  ASSERT(out != NULL);
+  ASSERT(!out->IsPairLocation());
+  ASSERT(def != NULL);
+  ASSERT(block != NULL);
+
+  LiveRange* range = vreg >= 0 ?
+      GetLiveRange(vreg) : MakeLiveRangeForTemporary();
+
+  // Process output and finalize its liverange.
+  if (out->IsMachineRegister()) {
+    // Fixed output location. Expected shape of live range:
+    //
+    //                    i  i' j  j'
+    //    register        [--)
+    //    output             [-------
+    //
+    BlockLocation(*out, pos, pos + 1);
+
+    if (range->vreg() == kTempVirtualRegister) return;
+
+    // We need to emit move connecting fixed register with another location
+    // that will be allocated for this output's live range.
+    // Special case: fixed output followed by a fixed input last use.
+    UsePosition* use = range->first_use();
+
+    // If the value has no uses we don't need to allocate it.
+    if (use == NULL) return;
+
+    if (use->pos() == (pos + 1)) {
+      ASSERT(use->location_slot()->IsUnallocated());
+      *(use->location_slot()) = *out;
+
+      // Remove first use. It was allocated.
+      range->set_first_use(range->first_use()->next());
+    }
+
+    // Shorten live range to the point of definition, this might make the range
+    // empty (if the only use immediately follows). If range is not empty add
+    // move from a fixed register to an unallocated location.
+    range->DefineAt(pos + 1);
+    if (range->Start() == range->End()) return;
+
+    MoveOperands* move = AddMoveAt(pos + 1, Location::Any(), *out);
+    range->AddHintedUse(pos + 1, move->dest_slot(), out);
+  } else if (output_same_as_first_input) {
+    ASSERT(in_ref != NULL);
+    ASSERT(input != NULL);
+    // Output register will contain a value of the first input at instruction's
+    // start. Expected shape of live ranges:
+    //
+    //                 i  i'
+    //    input #0   --*
+    //    output       [----
+    //
+    ASSERT(in_ref->Equals(Location::RequiresRegister()) ||
+           in_ref->Equals(Location::RequiresFpuRegister()));
+
+    // TODO(johnmccutchan): Without this I get allocated a register instead
+    // of an FPU register. Figure out why.
+
+    *out = *in_ref;
+    // Create move that will copy value between input and output.
+    MoveOperands* move = AddMoveAt(pos,
+                                   Location::RequiresRegister(),
+                                   Location::Any());
+
+    // Add uses to the live range of the input.
+    LiveRange* input_range = GetLiveRange(input_vreg);
+    input_range->AddUseInterval(block->start_pos(), pos);
+    input_range->AddUse(pos, move->src_slot());
+
+    // Shorten output live range to the point of definition and add both input
+    // and output uses slots to be filled by allocator.
+    range->DefineAt(pos);
+    range->AddHintedUse(pos, out, move->src_slot());
+    range->AddUse(pos, move->dest_slot());
+    range->AddUse(pos, in_ref);
+
+    if ((interference_set != NULL) &&
+        (range->vreg() >= 0) &&
+        interference_set->Contains(range->vreg())) {
+      interference_set->Add(input->ssa_temp_index());
+    }
+  } else {
+    // Normal unallocated location that requires a register. Expected shape of
+    // live range:
+    //
+    //                    i  i'
+    //    output          [-------
+    //
+    ASSERT(out->Equals(Location::RequiresRegister()) ||
+           out->Equals(Location::RequiresFpuRegister()));
+
+    // Shorten live range to the point of definition and add use to be filled by
+    // allocator.
+    range->DefineAt(pos);
+    range->AddUse(pos, out);
+  }
+
+  AssignSafepoints(range);
+  CompleteRange(range, RegisterKindForResult(current));
+}
+
+
 // Create and update live ranges corresponding to instruction's inputs,
 // temporaries and output.
 void FlowGraphAllocator::ProcessOneInstruction(BlockEntryInstr* block,
@@ -853,6 +1071,7 @@
 
   Definition* def = current->AsDefinition();
   if ((def != NULL) && (def->AsConstant() != NULL)) {
+    ASSERT(!def->HasPairRepresentation());
     LiveRange* range = (def->ssa_temp_index() != -1) ?
         GetLiveRange(def->ssa_temp_index()) : NULL;
 
@@ -881,7 +1100,6 @@
   const intptr_t pos = current->lifetime_position();
   ASSERT(IsInstructionStartPosition(pos));
 
-  // Number of input locations and number of input operands have to agree.
   ASSERT(locs->input_count() == current->InputCount());
 
   // Normalize same-as-first-input output if input is specified as
@@ -902,63 +1120,28 @@
   // Process inputs.
   // Skip the first input if output is specified with kSameAsFirstInput policy,
   // they will be processed together at the very end.
-  for (intptr_t j = output_same_as_first_input ? 1 : 0;
-       j < current->InputCount();
-       j++) {
-    Value* input = current->InputAt(j);
-    const intptr_t vreg = input->definition()->ssa_temp_index();
-    LiveRange* range = GetLiveRange(vreg);
-
-    Location* in_ref = locs->in_slot(j);
-
-    if (in_ref->IsMachineRegister()) {
-      // Input is expected in a fixed register. Expected shape of
-      // live ranges:
-      //
-      //                 j' i  i'
-      //      value    --*
-      //      register   [-----)
-      //
-      MoveOperands* move =
-          AddMoveAt(pos - 1, *in_ref, Location::Any());
-      BlockLocation(*in_ref, pos - 1, pos + 1);
-      range->AddUseInterval(block->start_pos(), pos - 1);
-      range->AddHintedUse(pos - 1, move->src_slot(), in_ref);
-    } else if (in_ref->IsUnallocated()) {
-      if (in_ref->policy() == Location::kWritableRegister) {
-        // Writable unallocated input. Expected shape of
-        // live ranges:
-        //
-        //                 i  i'
-        //      value    --*
-        //      temp       [--)
-        MoveOperands* move = AddMoveAt(pos,
-                                       Location::RequiresRegister(),
-                                       Location::PrefersRegister());
-
-        // Add uses to the live range of the input.
-        range->AddUseInterval(block->start_pos(), pos);
-        range->AddUse(pos, move->src_slot());
-
-        // Create live range for the temporary.
-        LiveRange* temp = MakeLiveRangeForTemporary();
-        temp->AddUseInterval(pos, pos + 1);
-        temp->AddHintedUse(pos, in_ref, move->src_slot());
-        temp->AddUse(pos, move->dest_slot());
-        *in_ref = Location::RequiresRegister();
-        CompleteRange(temp, RegisterKindFromPolicy(*in_ref));
+  {
+    for (intptr_t j = output_same_as_first_input ? 1 : 0;
+         j < locs->input_count();
+         j++) {
+      // Determine if we are dealing with a value pair, and if so, whether
+      // the location is the first register or second register.
+      Value* input = current->InputAt(j);
+      Location* in_ref = locs->in_slot(j);
+      if (in_ref->IsPairLocation()) {
+        ASSERT(input->definition()->HasPairRepresentation());
+        PairLocation* pair = in_ref->AsPairLocation();
+        const intptr_t vreg = input->definition()->ssa_temp_index();
+        // Each element of the pair is assigned it's own virtual register number
+        // and is allocated its own LiveRange.
+        ProcessOneInput(block, pos, pair->SlotAt(0),
+                        input, vreg);
+        ProcessOneInput(block, pos, pair->SlotAt(1), input,
+                        ToSecondPairVreg(vreg));
       } else {
-        // Normal unallocated input. Expected shape of
-        // live ranges:
-        //
-        //                 i  i'
-        //      value    -----*
-        //
-        range->AddUseInterval(block->start_pos(), pos + 1);
-        range->AddUse(pos + 1, in_ref);
+        ProcessOneInput(block, pos, in_ref, input,
+                        input->definition()->ssa_temp_index());
       }
-    } else {
-      ASSERT(in_ref->IsConstant());
     }
   }
 
@@ -971,6 +1154,8 @@
     //
 
     Location temp = locs->temp(j);
+    // We do not support pair locations for temporaries.
+    ASSERT(!temp.IsPairLocation());
     if (temp.IsMachineRegister()) {
       BlockLocation(temp, pos, pos + 1);
     } else if (temp.IsUnallocated()) {
@@ -1010,14 +1195,27 @@
     // locations.  Every register is blocked now so attempt to
     // allocate will not succeed.
     for (intptr_t j = 0; j < locs->temp_count(); j++) {
+      ASSERT(!locs->temp(j).IsPairLocation());
       ASSERT(!locs->temp(j).IsUnallocated());
     }
 
     for (intptr_t j = 0; j < locs->input_count(); j++) {
-      ASSERT(!locs->in(j).IsUnallocated());
+      if (locs->in(j).IsPairLocation()) {
+        PairLocation* pair = locs->in_slot(j)->AsPairLocation();
+        ASSERT(!pair->At(0).IsUnallocated());
+        ASSERT(!pair->At(1).IsUnallocated());
+      } else {
+        ASSERT(!locs->in(j).IsUnallocated());
+      }
     }
 
-    ASSERT(!locs->out(0).IsUnallocated());
+    if (locs->out(0).IsPairLocation()) {
+      PairLocation* pair = locs->out_slot(0)->AsPairLocation();
+      ASSERT(!pair->At(0).IsUnallocated());
+      ASSERT(!pair->At(1).IsUnallocated());
+    } else {
+      ASSERT(!locs->out(0).IsUnallocated());
+    }
 #endif
   }
 
@@ -1035,103 +1233,69 @@
     return;
   }
 
-  // We might have a definition without use.  We do not assign SSA index to
-  // such definitions.
-  LiveRange* range = (def->ssa_temp_index() >= 0) ?
-      GetLiveRange(def->ssa_temp_index()) :
-      MakeLiveRangeForTemporary();
+  ASSERT(locs->output_count() == 1);
   Location* out = locs->out_slot(0);
-
-  // Process output and finalize its liverange.
-  if (out->IsMachineRegister()) {
-    // Fixed output location. Expected shape of live range:
-    //
-    //                    i  i' j  j'
-    //    register        [--)
-    //    output             [-------
-    //
-    BlockLocation(*out, pos, pos + 1);
-
-    if (range->vreg() == kTempVirtualRegister) return;
-
-    // We need to emit move connecting fixed register with another location
-    // that will be allocated for this output's live range.
-    // Special case: fixed output followed by a fixed input last use.
-    UsePosition* use = range->first_use();
-
-    // If the value has no uses we don't need to allocate it.
-    if (use == NULL) return;
-
-    if (use->pos() == (pos + 1)) {
-      ASSERT(use->location_slot()->IsUnallocated());
-      *(use->location_slot()) = *out;
-
-      // Remove first use. It was allocated.
-      range->set_first_use(range->first_use()->next());
-    }
-
-    // Shorten live range to the point of definition, this might make the range
-    // empty (if the only use immediately follows). If range is not empty add
-    // move from a fixed register to an unallocated location.
-    range->DefineAt(pos + 1);
-    if (range->Start() == range->End()) return;
-
-    MoveOperands* move = AddMoveAt(pos + 1, Location::Any(), *out);
-    range->AddHintedUse(pos + 1, move->dest_slot(), out);
-  } else if (output_same_as_first_input) {
-    // Output register will contain a value of the first input at instruction's
-    // start. Expected shape of live ranges:
-    //
-    //                 i  i'
-    //    input #0   --*
-    //    output       [----
-    //
-    ASSERT(locs->in(0).Equals(Location::RequiresRegister()) ||
-           locs->in(0).Equals(Location::RequiresFpuRegister()));
-
-    // Create move that will copy value between input and output.
-    locs->set_out(0, Location::RequiresRegister());
-    MoveOperands* move = AddMoveAt(pos,
-                                   Location::RequiresRegister(),
-                                   Location::Any());
-
-    // Add uses to the live range of the input.
-    Definition* input = current->InputAt(0)->definition();
-    LiveRange* input_range =
-        GetLiveRange(input->ssa_temp_index());
-    input_range->AddUseInterval(block->start_pos(), pos);
-    input_range->AddUse(pos, move->src_slot());
-
-    // Shorten output live range to the point of definition and add both input
-    // and output uses slots to be filled by allocator.
-    range->DefineAt(pos);
-    range->AddHintedUse(pos, out, move->src_slot());
-    range->AddUse(pos, move->dest_slot());
-    range->AddUse(pos, locs->in_slot(0));
-
-    if ((interference_set != NULL) &&
-        (range->vreg() >= 0) &&
-        interference_set->Contains(range->vreg())) {
-      interference_set->Add(input->ssa_temp_index());
+  if (out->IsPairLocation()) {
+    ASSERT(def->HasPairRepresentation());
+    PairLocation* pair = out->AsPairLocation();
+    if (output_same_as_first_input) {
+      ASSERT(locs->in_slot(0)->IsPairLocation());
+      PairLocation* in_pair = locs->in_slot(0)->AsPairLocation();
+      Definition* input = current->InputAt(0)->definition();
+      ASSERT(input->HasPairRepresentation());
+      // Each element of the pair is assigned it's own virtual register number
+      // and is allocated its own LiveRange.
+      ProcessOneOutput(block, current, pos,  // BlockEntry, Instruction, seq.
+                       pair->SlotAt(0), def,  // (output) Location, Definition.
+                       def->ssa_temp_index(),  // (output) virtual register.
+                       true,  // output mapped to first input.
+                       in_pair->SlotAt(0), input,  // (input) Location, Def.
+                       input->ssa_temp_index(),  // (input) virtual register.
+                       interference_set);
+      ProcessOneOutput(block, current, pos,
+                       pair->SlotAt(1), def,
+                       ToSecondPairVreg(def->ssa_temp_index()),
+                       true,
+                       in_pair->SlotAt(1), input,
+                       ToSecondPairVreg(input->ssa_temp_index()),
+                       interference_set);
+    } else {
+      // Each element of the pair is assigned it's own virtual register number
+      // and is allocated its own LiveRange.
+      ProcessOneOutput(block, current, pos,
+                       pair->SlotAt(0), def,
+                       def->ssa_temp_index(),
+                       false,            // output is not mapped to first input.
+                       NULL, NULL, -1,   // First input not needed.
+                       interference_set);
+      ProcessOneOutput(block, current, pos,
+                       pair->SlotAt(1), def,
+                       ToSecondPairVreg(def->ssa_temp_index()),
+                       false,
+                       NULL, NULL, -1,
+                       interference_set);
     }
   } else {
-    // Normal unallocated location that requires a register. Expected shape of
-    // live range:
-    //
-    //                    i  i'
-    //    output          [-------
-    //
-    ASSERT(locs->out(0).Equals(Location::RequiresRegister()) ||
-           locs->out(0).Equals(Location::RequiresFpuRegister()));
-
-    // Shorten live range to the point of definition and add use to be filled by
-    // allocator.
-    range->DefineAt(pos);
-    range->AddUse(pos, out);
+    if (output_same_as_first_input) {
+      Location* in_ref = locs->in_slot(0);
+      Definition* input = current->InputAt(0)->definition();
+      ASSERT(!in_ref->IsPairLocation());
+      ProcessOneOutput(block, current, pos,  // BlockEntry, Instruction, seq.
+                       out, def,  // (output) Location, Definition.
+                       def->ssa_temp_index(),  // (output) virtual register.
+                       true,  // output mapped to first input.
+                       in_ref, input,  // (input) Location, Def.
+                       input->ssa_temp_index(),  // (input) virtual register.
+                       interference_set);
+    } else {
+      ProcessOneOutput(block, current, pos,
+                       out, def,
+                       def->ssa_temp_index(),
+                       false,            // output is not mapped to first input.
+                       NULL, NULL, -1,   // First input not needed.
+                       interference_set);
+    }
   }
-
-  AssignSafepoints(range);
-  CompleteRange(range, RegisterKindForResult(current));
 }
 
 
@@ -1718,6 +1882,7 @@
 
 
 void ReachingDefs::AddPhi(PhiInstr* phi) {
+  // TODO(johnmccutchan): Fix handling of PhiInstr with PairLocation.
   if (phi->reaching_defs() == NULL) {
     phi->set_reaching_defs(
         new BitVector(flow_graph_.max_virtual_register_number()));
@@ -1741,6 +1906,7 @@
 void ReachingDefs::Compute() {
   // Transitively collect all phis that are used by the given phi.
   for (intptr_t i = 0; i < phis_.length(); i++) {
+    // TODO(johnmccutchan): Fix handling of PhiInstr with PairLocation.
     PhiInstr* phi = phis_[i];
 
     // Add all phis that affect this phi to the list.
@@ -1844,6 +2010,7 @@
     for (PhiIterator it(loop_header->entry()->AsJoinEntry());
          !it.Done();
          it.Advance()) {
+      // TODO(johnmccutchan): Fix handling of PhiInstr with PairLocation.
       PhiInstr* phi = it.Current();
       ASSERT(phi->is_alive());
       const intptr_t phi_vreg = phi->ssa_temp_index();
@@ -1908,7 +2075,8 @@
 bool FlowGraphAllocator::RangeHasOnlyUnconstrainedUsesInLoop(LiveRange* range,
                                                              intptr_t loop_id) {
   if (range->vreg() >= 0) {
-    return GetLiveRange(range->vreg())->HasOnlyUnconstrainedUsesInLoop(loop_id);
+    LiveRange* parent = GetLiveRange(range->vreg());
+    return parent->HasOnlyUnconstrainedUsesInLoop(loop_id);
   }
   return false;
 }
@@ -1989,6 +2157,8 @@
     return;
   }
 
+  ASSERT(candidate != kNoRegister);
+
   TRACE_ALLOC(OS::Print("assigning blocked register "));
   TRACE_ALLOC(MakeRegisterLocation(candidate).Print());
   TRACE_ALLOC(OS::Print(" to live range v%" Pd " until %" Pd "\n",
@@ -2499,6 +2669,7 @@
   for (intptr_t i = 0; i < graph_entry->initial_definitions()->length(); ++i) {
     Definition* def = (*graph_entry->initial_definitions())[i];
     value_representations_[def->ssa_temp_index()] = def->representation();
+    ASSERT(!def->HasPairRepresentation());
   }
 
   for (BlockIterator it = flow_graph_.reverse_postorder_iterator();
@@ -2520,6 +2691,7 @@
     if (block->IsJoinEntry()) {
       JoinEntryInstr* join = block->AsJoinEntry();
       for (PhiIterator it(join); !it.Done(); it.Advance()) {
+        // TODO(johnmccutchan): Fix handling of PhiInstr with PairLocation.
         PhiInstr* phi = it.Current();
         if ((phi != NULL) && (phi->ssa_temp_index() >= 0)) {
           value_representations_[phi->ssa_temp_index()] = phi->representation();
@@ -2532,7 +2704,11 @@
          instr_it.Advance()) {
       Definition* def = instr_it.Current()->AsDefinition();
       if ((def != NULL) && (def->ssa_temp_index() >= 0)) {
-        value_representations_[def->ssa_temp_index()] = def->representation();
+        const intptr_t vreg = def->ssa_temp_index();
+        value_representations_[vreg] = def->representation();
+        if (def->HasPairRepresentation()) {
+         value_representations_[ToSecondPairVreg(vreg)] = def->representation();
+        }
       }
     }
   }
diff --git a/runtime/vm/flow_graph_allocator.h b/runtime/vm/flow_graph_allocator.h
index 5e9ec74..348f692 100644
--- a/runtime/vm/flow_graph_allocator.h
+++ b/runtime/vm/flow_graph_allocator.h
@@ -109,6 +109,22 @@
                                   const intptr_t block_start_pos,
                                   const intptr_t use_pos,
                                   MaterializeObjectInstr* mat);
+  void ProcessOneInput(BlockEntryInstr* block,
+                       intptr_t pos,
+                       Location* in_ref,
+                       Value* input,
+                       intptr_t vreg);
+  void ProcessOneOutput(BlockEntryInstr* block,
+                        Instruction* current,
+                        intptr_t pos,
+                        Location* out,
+                        Definition* def,
+                        intptr_t vreg,
+                        bool output_same_as_first_input,
+                        Location* in_ref,
+                        Definition* input,
+                        intptr_t input_vreg,
+                        BitVector* interference_set);
   void ProcessOneInstruction(BlockEntryInstr* block,
                              Instruction* instr,
                              BitVector* interference_set);
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index ae60f3f..7e251ee 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -3088,16 +3088,12 @@
       for_instance.value(),
       &node->field(),
       AbstractType::ZoneHandle(node->field().type()));
-  if (owner()->exit_collector() != NULL) {
-    // While inlining into an optimized function, the field has
-    // to be added to the list of guarded fields of the caller.
-    if (node->field().guarded_cid() != kIllegalCid) {
-      if (!node->field().is_nullable() ||
-          (node->field().guarded_cid() == kNullCid)) {
-        load->set_result_cid(node->field().guarded_cid());
-      }
-      FlowGraph::AddToGuardedFields(owner()->guarded_fields(), &node->field());
+  if (node->field().guarded_cid() != kIllegalCid) {
+    if (!node->field().is_nullable() ||
+        (node->field().guarded_cid() == kNullCid)) {
+      load->set_result_cid(node->field().guarded_cid());
     }
+    FlowGraph::AddToGuardedFields(owner()->guarded_fields(), &node->field());
   }
   ReturnDefinition(load);
 }
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 6cfea32..5ba1ab7 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -35,6 +35,8 @@
 DECLARE_FLAG(bool, use_osr);
 DEFINE_FLAG(bool, enable_simd_inline, true,
     "Enable inlining of SIMD related method calls.");
+DEFINE_FLAG(charp, deoptimize_filter, NULL,
+            "Force deoptimization in named function");
 
 // Assign locations to incoming arguments, i.e., values pushed above spill slots
 // with PushArgument.  Recursively allocates from outermost to innermost
@@ -169,6 +171,14 @@
 }
 
 
+bool FlowGraphCompiler::ShouldDeoptimizeFunction() const {
+  return (is_optimizing() &&
+          (FLAG_deoptimize_filter != NULL) &&
+          (strstr(parsed_function().function().ToFullyQualifiedCString(),
+                  FLAG_deoptimize_filter) != NULL));
+}
+
+
 static bool IsEmptyBlock(BlockEntryInstr* block) {
   return !block->HasParallelMove() &&
          block->next()->IsGoto() &&
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 278f9bb..e9a1476 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -269,6 +269,8 @@
   bool CanOSRFunction() const;
   bool is_optimizing() const { return is_optimizing_; }
 
+  bool ShouldDeoptimizeFunction() const;
+
   const GrowableArray<BlockInfo*>& block_info() const { return block_info_; }
   ParallelMoveResolver* parallel_move_resolver() {
     return &parallel_move_resolver_;
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index be60565..8f9ba76 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -1280,25 +1280,11 @@
   __ add(IP, R2, ShifterOperand(R3, LSL, 2));
   __ ldr(R0, FieldAddress(IP, base + kWordSize));
   __ ldr(R1, FieldAddress(R0, Function::code_offset()));
-  if (FLAG_collect_code) {
-    // If we are collecting code, the code object may be null.
-    Label is_compiled;
-    __ CompareImmediate(R1, reinterpret_cast<intptr_t>(Object::null()));
-    __ b(&is_compiled, NE);
-    __ BranchLinkPatchable(&StubCode::CompileFunctionRuntimeCallLabel());
-    AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
-                         Isolate::kNoDeoptId,
-                         token_pos);
-    RecordSafepoint(locs);
-    // R0: target function.
-    __ ldr(R1, FieldAddress(R0, Function::code_offset()));
-    __ Bind(&is_compiled);
-  }
-  __ ldr(R0, FieldAddress(R1, Code::instructions_offset()));
+  __ ldr(R1, FieldAddress(R1, Code::instructions_offset()));
   __ LoadObject(R5, ic_data);
   __ LoadObject(R4, arguments_descriptor);
-  __ AddImmediate(R0, Instructions::HeaderSize() - kHeapObjectTag);
-  __ blx(R0);
+  __ AddImmediate(R1, Instructions::HeaderSize() - kHeapObjectTag);
+  __ blx(R1);
   AddCurrentDescriptor(PcDescriptors::kOther, Isolate::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
   AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
new file mode 100644
index 0000000..da404a0
--- /dev/null
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -0,0 +1,429 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_ARM64.
+#if defined(TARGET_ARCH_ARM64)
+
+#include "vm/flow_graph_compiler.h"
+
+#include "vm/ast_printer.h"
+#include "vm/compiler.h"
+#include "vm/cpu.h"
+#include "vm/dart_entry.h"
+#include "vm/deopt_instructions.h"
+#include "vm/il_printer.h"
+#include "vm/locations.h"
+#include "vm/object_store.h"
+#include "vm/parser.h"
+#include "vm/stack_frame.h"
+#include "vm/stub_code.h"
+#include "vm/symbols.h"
+
+namespace dart {
+
+FlowGraphCompiler::~FlowGraphCompiler() {
+  // BlockInfos are zone-allocated, so their destructors are not called.
+  // Verify the labels explicitly here.
+  for (int i = 0; i < block_info_.length(); ++i) {
+    ASSERT(!block_info_[i]->jump_label()->IsLinked());
+  }
+}
+
+
+bool FlowGraphCompiler::SupportsUnboxedMints() {
+  return false;
+}
+
+
+bool FlowGraphCompiler::SupportsUnboxedSimd128() {
+  return false;
+}
+
+
+bool FlowGraphCompiler::SupportsSinCos() {
+  return false;
+}
+
+
+RawDeoptInfo* CompilerDeoptInfo::CreateDeoptInfo(FlowGraphCompiler* compiler,
+                                                 DeoptInfoBuilder* builder,
+                                                 const Array& deopt_table) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CompilerDeoptInfoWithStub::GenerateCode(FlowGraphCompiler* compiler,
+                                             intptr_t stub_ix) {
+  UNIMPLEMENTED();
+}
+
+
+#define __ assembler()->
+
+
+// Fall through if bool_register contains null.
+void FlowGraphCompiler::GenerateBoolToJump(Register bool_register,
+                                           Label* is_true,
+                                           Label* is_false) {
+  UNIMPLEMENTED();
+}
+
+
+RawSubtypeTestCache* FlowGraphCompiler::GenerateCallSubtypeTestStub(
+    TypeTestStubKind test_kind,
+    Register instance_reg,
+    Register type_arguments_reg,
+    Register temp_reg,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+RawSubtypeTestCache*
+FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
+    intptr_t token_pos,
+    const AbstractType& type,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void FlowGraphCompiler::CheckClassIds(Register class_id_reg,
+                                      const GrowableArray<intptr_t>& class_ids,
+                                      Label* is_equal_lbl,
+                                      Label* is_not_equal_lbl) {
+  UNIMPLEMENTED();
+}
+
+
+bool FlowGraphCompiler::GenerateInstantiatedTypeNoArgumentsTest(
+    intptr_t token_pos,
+    const AbstractType& type,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return false;
+}
+
+
+RawSubtypeTestCache* FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
+    intptr_t token_pos,
+    const Class& type_class,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+RawSubtypeTestCache* FlowGraphCompiler::GenerateUninstantiatedTypeTest(
+    intptr_t token_pos,
+    const AbstractType& type,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof(
+    intptr_t token_pos,
+    const AbstractType& type,
+    Label* is_instance_lbl,
+    Label* is_not_instance_lbl) {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void FlowGraphCompiler::GenerateInstanceOf(intptr_t token_pos,
+                                           intptr_t deopt_id,
+                                           const AbstractType& type,
+                                           bool negate_result,
+                                           LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateAssertAssignable(intptr_t token_pos,
+                                                 intptr_t deopt_id,
+                                                 const AbstractType& dst_type,
+                                                 const String& dst_name,
+                                                 LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::CopyParameters() {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateInlinedGetter(intptr_t offset) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateInlinedSetter(intptr_t offset) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitFrameEntry() {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::CompileGraph() {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateCall(intptr_t token_pos,
+                                     const ExternalLabel* label,
+                                     PcDescriptors::Kind kind,
+                                     LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
+                                         intptr_t token_pos,
+                                         const ExternalLabel* label,
+                                         PcDescriptors::Kind kind,
+                                         LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::GenerateRuntimeCall(intptr_t token_pos,
+                                            intptr_t deopt_id,
+                                            const RuntimeEntry& entry,
+                                            intptr_t argument_count,
+                                            LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitEdgeCounter() {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitOptimizedInstanceCall(
+    ExternalLabel* target_label,
+    const ICData& ic_data,
+    intptr_t argument_count,
+    intptr_t deopt_id,
+    intptr_t token_pos,
+    LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitInstanceCall(ExternalLabel* target_label,
+                                         const ICData& ic_data,
+                                         intptr_t argument_count,
+                                         intptr_t deopt_id,
+                                         intptr_t token_pos,
+                                         LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitMegamorphicInstanceCall(
+    const ICData& ic_data,
+    intptr_t argument_count,
+    intptr_t deopt_id,
+    intptr_t token_pos,
+    LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+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) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitOptimizedStaticCall(
+    const Function& function,
+    const Array& arguments_descriptor,
+    intptr_t argument_count,
+    intptr_t deopt_id,
+    intptr_t token_pos,
+    LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitEqualityRegConstCompare(Register reg,
+                                                    const Object& obj,
+                                                    bool needs_number_check,
+                                                    intptr_t token_pos) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitEqualityRegRegCompare(Register left,
+                                                  Register right,
+                                                  bool needs_number_check,
+                                                  intptr_t token_pos) {
+  UNIMPLEMENTED();
+}
+
+
+// This function must be in sync with FlowGraphCompiler::RecordSafepoint and
+// FlowGraphCompiler::SlowPathEnvironmentFor.
+void FlowGraphCompiler::SaveLiveRegisters(LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::RestoreLiveRegisters(LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+void FlowGraphCompiler::EmitTestAndCall(const ICData& ic_data,
+                                        Register class_id_reg,
+                                        intptr_t argument_count,
+                                        const Array& argument_names,
+                                        Label* deopt,
+                                        intptr_t deopt_id,
+                                        intptr_t token_index,
+                                        LocationSummary* locs) {
+  UNIMPLEMENTED();
+}
+
+
+// Do not implement or use this function.
+FieldAddress FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
+                                                          intptr_t index_scale,
+                                                          Register array,
+                                                          intptr_t index) {
+  UNREACHABLE();
+  return FieldAddress(array, index);
+}
+
+
+// Do not implement or use this function.
+FieldAddress FlowGraphCompiler::ElementAddressForRegIndex(intptr_t cid,
+                                                          intptr_t index_scale,
+                                                          Register array,
+                                                          Register index) {
+  UNREACHABLE();  // No register indexed with offset addressing mode on ARM.
+  return FieldAddress(array, index);
+}
+
+
+Address FlowGraphCompiler::ExternalElementAddressForIntIndex(
+    intptr_t index_scale,
+    Register array,
+    intptr_t index) {
+  UNREACHABLE();
+  return FieldAddress(array, index);
+}
+
+
+Address FlowGraphCompiler::ExternalElementAddressForRegIndex(
+    intptr_t index_scale,
+    Register array,
+    Register index) {
+  UNREACHABLE();
+  return FieldAddress(array, index);
+}
+
+
+#undef __
+#define __ compiler_->assembler()->
+
+
+void ParallelMoveResolver::EmitMove(int index) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::EmitSwap(int index) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::MoveMemoryToMemory(const Address& dst,
+                                              const Address& src) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::StoreObject(const Address& dst, const Object& obj) {
+  UNIMPLEMENTED();
+}
+
+
+// Do not call or implement this function. Instead, use the form below that
+// uses an offset from the frame pointer instead of an Address.
+void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
+  UNREACHABLE();
+}
+
+
+// Do not call or implement this function. Instead, use the form below that
+// uses offsets from the frame pointer instead of Addresses.
+void ParallelMoveResolver::Exchange(const Address& mem1, const Address& mem2) {
+  UNREACHABLE();
+}
+
+
+void ParallelMoveResolver::Exchange(Register reg, intptr_t stack_offset) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::Exchange(intptr_t stack_offset1,
+                                    intptr_t stack_offset2) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::SpillScratch(Register reg) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::RestoreScratch(Register reg) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::SpillFpuScratch(FpuRegister reg) {
+  UNIMPLEMENTED();
+}
+
+
+void ParallelMoveResolver::RestoreFpuScratch(FpuRegister reg) {
+  UNIMPLEMENTED();
+}
+
+
+#undef __
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 1ad7f5f..c3abc05 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -1330,26 +1330,11 @@
   // be invoked as a normal Dart function.
   __ movl(EAX, FieldAddress(EDI, ECX, TIMES_4, base + kWordSize));
   __ movl(EBX, FieldAddress(EAX, Function::code_offset()));
-  if (FLAG_collect_code) {
-    // If we are collecting code, the code object may be null.
-    Label is_compiled;
-    const Immediate& raw_null =
-        Immediate(reinterpret_cast<intptr_t>(Object::null()));
-    __ cmpl(EBX, raw_null);
-    __ j(NOT_EQUAL, &is_compiled, Assembler::kNearJump);
-    __ call(&StubCode::CompileFunctionRuntimeCallLabel());
-    AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
-                         Isolate::kNoDeoptId,
-                         token_pos);
-    RecordSafepoint(locs);
-    __ movl(EBX, FieldAddress(EAX, Function::code_offset()));
-    __ Bind(&is_compiled);
-  }
-  __ movl(EAX, FieldAddress(EBX, Code::instructions_offset()));
+  __ movl(EBX, FieldAddress(EBX, Code::instructions_offset()));
   __ LoadObject(ECX, ic_data);
   __ LoadObject(EDX, arguments_descriptor);
-  __ addl(EAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
-  __ call(EAX);
+  __ addl(EBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
+  __ call(EBX);
   AddCurrentDescriptor(PcDescriptors::kOther, Isolate::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
   AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index a80250d..e83fed8 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -1320,25 +1320,13 @@
   __ sll(T1, T3, 2);
   __ addu(T1, T2, T1);
   __ lw(T0, FieldAddress(T1, base + kWordSize));
+
   __ lw(T1, FieldAddress(T0, Function::code_offset()));
-  if (FLAG_collect_code) {
-    // If we are collecting code, the code object may be null.
-    Label is_compiled;
-    __ BranchNotEqual(T1, reinterpret_cast<int32_t>(Object::null()),
-                      &is_compiled);
-    __ BranchLink(&StubCode::CompileFunctionRuntimeCallLabel());
-    AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
-                         Isolate::kNoDeoptId,
-                         token_pos);
-    RecordSafepoint(locs);
-    __ lw(T1, FieldAddress(T0, Function::code_offset()));
-    __ Bind(&is_compiled);
-  }
-  __ lw(T0, FieldAddress(T1, Code::instructions_offset()));
+  __ lw(T1, FieldAddress(T1, Code::instructions_offset()));
   __ LoadObject(S5, ic_data);
   __ LoadObject(S4, arguments_descriptor);
-  __ AddImmediate(T0, Instructions::HeaderSize() - kHeapObjectTag);
-  __ jalr(T0);
+  __ AddImmediate(T1, Instructions::HeaderSize() - kHeapObjectTag);
+  __ jalr(T1);
   AddCurrentDescriptor(PcDescriptors::kOther, Isolate::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
   AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 249bfee..e822504 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -1364,28 +1364,13 @@
   // illegal class id was found, the target is a cache miss handler that can
   // be invoked as a normal Dart function.
   __ movq(RAX, FieldAddress(RDI, RCX, TIMES_8, base + kWordSize));
-  __ movq(RBX, FieldAddress(RAX, Function::code_offset()));
-  if (FLAG_collect_code) {
-    // If we are collecting code, the code object may be null.
-    Label is_compiled;
-    const Immediate& raw_null =
-        Immediate(reinterpret_cast<intptr_t>(Object::null()));
-    __ cmpq(RBX, raw_null);
-    __ j(NOT_EQUAL, &is_compiled, Assembler::kNearJump);
-    __ call(&StubCode::CompileFunctionRuntimeCallLabel());
-    AddCurrentDescriptor(PcDescriptors::kRuntimeCall,
-                         Isolate::kNoDeoptId,
-                         token_pos);
-    RecordSafepoint(locs);
-    __ movq(RBX, FieldAddress(RAX, Function::code_offset()));
-    __ Bind(&is_compiled);
-  }
-  __ movq(RAX, FieldAddress(RBX, Code::instructions_offset()));
+  __ movq(RCX, FieldAddress(RAX, Function::code_offset()));
+  __ movq(RCX, FieldAddress(RCX, Code::instructions_offset()));
   __ LoadObject(RBX, ic_data, PP);
   __ LoadObject(R10, arguments_descriptor, PP);
   __ AddImmediate(
-      RAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag), PP);
-  __ call(RAX);
+      RCX, Immediate(Instructions::HeaderSize() - kHeapObjectTag), PP);
+  __ call(RCX);
   AddCurrentDescriptor(PcDescriptors::kOther, Isolate::kNoDeoptId, token_pos);
   RecordSafepoint(locs);
   AddDeoptIndexAtCall(Isolate::ToDeoptAfter(deopt_id), token_pos);
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 9ff894b..bbf06f5 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -34,6 +34,8 @@
     "Always inline functions that have threshold or fewer instructions");
 DEFINE_FLAG(int, inlining_callee_call_sites_threshold, 1,
     "Always inline functions containing threshold or fewer calls.");
+DEFINE_FLAG(int, inlining_callee_size_threshold, 80,
+    "Do not inline callees larger than threshold");
 DEFINE_FLAG(int, inlining_caller_size_threshold, 50000,
     "Stop inlining once caller reaches the threshold.");
 DEFINE_FLAG(int, inlining_constant_arguments_count, 1,
@@ -425,6 +427,9 @@
       // Prevent methods becoming humongous and thus slow to compile.
       return false;
     }
+    if (instr_count > FLAG_inlining_callee_size_threshold) {
+      return false;
+    }
     // 'instr_count' can be 0 if it was not computed yet.
     if ((instr_count != 0) && (instr_count <= FLAG_inlining_size_threshold)) {
       return true;
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 5ee1e2f..77e20cc 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -303,6 +303,19 @@
 }
 
 
+void FlowGraphOptimizer::AppendExtractNthOutputForMerged(Definition* instr,
+                                                         intptr_t index,
+                                                         Representation rep,
+                                                         intptr_t cid) {
+  ExtractNthOutputInstr* extract = new ExtractNthOutputInstr(new Value(instr),
+                                                             index,
+                                                             rep,
+                                                             cid);
+  instr->ReplaceUsesWith(extract);
+  flow_graph()->InsertAfter(instr, extract, NULL, Definition::kValue);
+}
+
+
 // Dart:
 //  var x = d % 10;
 //  var y = d ~/ 10;
@@ -347,17 +360,16 @@
           (other_binop->left()->definition() == left_def) &&
           (other_binop->right()->definition() == right_def)) {
         (*merge_candidates)[k] = NULL;  // Clear it.
-        // Append a LoadIndexed behind TRUNC_DIV and MOD.
         ASSERT(curr_instr->HasUses());
-        AppendLoadIndexedForMerged(
+        AppendExtractNthOutputForMerged(
             curr_instr,
-            MergedMathInstr::ResultIndexOf(curr_instr->op_kind()),
-            kArrayCid);
+            MergedMathInstr::OutputIndexOf(curr_instr->op_kind()),
+            kTagged, kSmiCid);
         ASSERT(other_binop->HasUses());
-        AppendLoadIndexedForMerged(
+        AppendExtractNthOutputForMerged(
             other_binop,
-            MergedMathInstr::ResultIndexOf(other_binop->op_kind()),
-            kArrayCid);
+            MergedMathInstr::OutputIndexOf(other_binop->op_kind()),
+            kTagged, kSmiCid);
 
         ZoneGrowableArray<Value*>* args = new ZoneGrowableArray<Value*>(2);
         args->Add(new Value(curr_instr->left()->definition()));
@@ -396,12 +408,12 @@
       // Instruction was merged already.
       continue;
     }
-    ASSERT((curr_instr->kind() == MethodRecognizer::kMathSin) ||
-           (curr_instr->kind() == MethodRecognizer::kMathCos));
+    const intptr_t kind = curr_instr->kind();
+    ASSERT((kind == MethodRecognizer::kMathSin) ||
+           (kind == MethodRecognizer::kMathCos));
     // Check if there is sin/cos binop with same inputs.
-    const intptr_t other_kind =
-        (curr_instr->kind() == MethodRecognizer::kMathSin) ?
-            MethodRecognizer::kMathCos : MethodRecognizer::kMathSin;
+    const intptr_t other_kind = (kind == MethodRecognizer::kMathSin) ?
+        MethodRecognizer::kMathCos : MethodRecognizer::kMathSin;
     Definition* def = curr_instr->value()->definition();
     for (intptr_t k = i + 1; k < merge_candidates->length(); k++) {
       MathUnaryInstr* other_op = (*merge_candidates)[k];
@@ -409,25 +421,21 @@
       if ((other_op != NULL) && (other_op->kind() == other_kind) &&
           (other_op->value()->definition() == def)) {
         (*merge_candidates)[k] = NULL;  // Clear it.
-        // Append a LoadIndexed behind SIN and COS.
         ASSERT(curr_instr->HasUses());
-        AppendLoadIndexedForMerged(
-            curr_instr,
-            MergedMathInstr::ResultIndexOf(curr_instr->kind()),
-            kTypedDataFloat64ArrayCid);
+        AppendExtractNthOutputForMerged(curr_instr,
+                                        MergedMathInstr::OutputIndexOf(kind),
+                                        kUnboxedDouble, kDoubleCid);
         ASSERT(other_op->HasUses());
-        AppendLoadIndexedForMerged(
+        AppendExtractNthOutputForMerged(
             other_op,
-            MergedMathInstr::ResultIndexOf(other_op->kind()),
-            kTypedDataFloat64ArrayCid);
+            MergedMathInstr::OutputIndexOf(other_kind),
+            kUnboxedDouble, kDoubleCid);
         ZoneGrowableArray<Value*>* args = new ZoneGrowableArray<Value*>(1);
         args->Add(new Value(curr_instr->value()->definition()));
-
         // Replace with SinCos.
-        MergedMathInstr* sin_cos = new MergedMathInstr(
-            args,
-            curr_instr->DeoptimizationTarget(),
-            MergedMathInstr::kSinCos);
+        MergedMathInstr* sin_cos =
+            new MergedMathInstr(args, curr_instr->DeoptimizationTarget(),
+                                MergedMathInstr::kSinCos);
         curr_instr->ReplaceWith(sin_cos, current_iterator());
         other_op->ReplaceUsesWith(sin_cos);
         other_op->RemoveFromGraph();
@@ -755,7 +763,7 @@
 
 
 void FlowGraphOptimizer::SelectRepresentations() {
-  // Convervatively unbox all phis that were proven to be of Double,
+  // Conservatively unbox all phis that were proven to be of Double,
   // Float32x4, or Int32x4 type.
   for (intptr_t i = 0; i < block_order_.length(); ++i) {
     JoinEntryInstr* join_entry = block_order_[i]->AsJoinEntry();
@@ -7913,6 +7921,11 @@
 }
 
 
+void ConstantPropagator::VisitExtractNthOutput(ExtractNthOutputInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
 void ConstantPropagator::VisitConstant(ConstantInstr* instr) {
   SetValue(instr, instr->value());
 }
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index 9b8d841..7d29c22 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -237,7 +237,8 @@
   void TryMergeMathUnary(GrowableArray<MathUnaryInstr*>* merge_candidates);
 
   void AppendLoadIndexedForMerged(Definition* instr, intptr_t ix, intptr_t cid);
-
+  void AppendExtractNthOutputForMerged(Definition* instr, intptr_t ix,
+                                       Representation rep, intptr_t cid);
   bool TryStringLengthOneEquality(InstanceCallInstr* call, Token::Kind op_kind);
 
   FlowGraph* flow_graph_;
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index e83951c..5e2724c 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -1292,14 +1292,13 @@
 
 
 CompileType MergedMathInstr::ComputeType() const {
-  if (kind() == MergedMathInstr::kTruncDivMod) {
-    return CompileType::FromCid(kArrayCid);
-  } else if (kind() == MergedMathInstr::kSinCos) {
-    return CompileType::FromCid(kTypedDataFloat64ArrayCid);
-  } else {
-    UNIMPLEMENTED();
-    return CompileType::Dynamic();
-  }
+  return CompileType::Dynamic();
 }
 
+
+CompileType ExtractNthOutputInstr::ComputeType() const {
+  return CompileType::FromCid(definition_cid_);
+}
+
+
 }  // namespace dart
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc
index 7dc10e9..25640ff 100644
--- a/runtime/vm/gc_marker.cc
+++ b/runtime/vm/gc_marker.cc
@@ -249,7 +249,7 @@
         // If the code wasn't strongly visited through other references
         // after skipping the function's code pointer, then we disconnect the
         // code from the function.
-        func->ptr()->code_ = Code::null();
+        func->ptr()->code_ = StubCode::LazyCompile_entry()->code();
         func->ptr()->unoptimized_code_ = Code::null();
         if (FLAG_log_code_drop) {
           // NOTE: This code runs while GC is in progress and runs within
diff --git a/runtime/vm/guard_field_test.cc b/runtime/vm/guard_field_test.cc
index 193d4b7..d815b4f5 100644
--- a/runtime/vm/guard_field_test.cc
+++ b/runtime/vm/guard_field_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "vm/dart_api_impl.h"
 #include "vm/dart_api_state.h"
 #include "vm/intermediate_language.h"
@@ -270,3 +274,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 3d19886..a0743ab 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -34,6 +34,8 @@
 DEFINE_FLAG(int, old_gen_heap_size, Heap::kHeapSizeInMB,
             "old gen heap size in MB,"
             "e.g: --old_gen_heap_size=1024 allocates a 1024MB old gen heap");
+DEFINE_FLAG(int, new_gen_ext_limit, 64,
+            "maximum total external size (MB) in new gen before triggering GC");
 
 Heap::Heap() : read_only_(false), gc_in_progress_(false) {
   for (int sel = 0;
@@ -94,6 +96,11 @@
 void Heap::AllocateExternal(intptr_t size, Space space) {
   if (space == kNew) {
     new_space_->AllocateExternal(size);
+    if (new_space_->ExternalInWords() > (FLAG_new_gen_ext_limit * MBInWords)) {
+      // Attempt to free some external allocation by a scavenge. (If the total
+      // remains above the limit, next external alloc will trigger another.)
+      CollectGarbage(kNew);
+    }
   } else {
     ASSERT(space == kOld);
     old_space_->AllocateExternal(size);
@@ -198,6 +205,7 @@
 
 void Heap::CollectGarbage(Space space, ApiCallbacks api_callbacks) {
   Isolate* isolate = Isolate::Current();
+  TIMERSCOPE(isolate, time_gc);
   bool invoke_api_callbacks = (api_callbacks == kInvokeApiCallbacks);
   switch (space) {
     case kNew: {
@@ -207,6 +215,8 @@
       new_space_->Scavenge(invoke_api_callbacks);
       RecordAfterGC();
       PrintStats();
+      // TODO(koda): Replace promotion failure tracking with
+      // old_space_->NeedsGarbageCollection.
       if (new_space_->HadPromotionFailure() || old_space_->NeedExternalGC()) {
         // Old collections should call the API callbacks.
         CollectGarbage(kOld, kInvokeApiCallbacks);
@@ -254,6 +264,7 @@
 
 void Heap::CollectAllGarbage() {
   Isolate* isolate = Isolate::Current();
+  TIMERSCOPE(isolate, time_gc);
   {
     VMTagScope tagScope(isolate, VMTag::kGCNewSpaceTagId);
     RecordBeforeGC(kNew, kFull);
@@ -460,12 +471,8 @@
   stats_.space_ = space;
   stats_.reason_ = reason;
   stats_.before_.micros_ = OS::GetCurrentTimeMicros();
-  stats_.before_.new_used_in_words_ = new_space_->UsedInWords();
-  stats_.before_.new_capacity_in_words_ = new_space_->CapacityInWords();
-  stats_.before_.new_external_in_words_ = new_space_->ExternalInWords();
-  stats_.before_.old_used_in_words_ = old_space_->UsedInWords();
-  stats_.before_.old_capacity_in_words_ = old_space_->CapacityInWords();
-  stats_.before_.old_external_in_words_ = old_space_->ExternalInWords();
+  stats_.before_.new_ = new_space_->GetCurrentUsage();
+  stats_.before_.old_ = old_space_->GetCurrentUsage();
   stats_.times_[0] = 0;
   stats_.times_[1] = 0;
   stats_.times_[2] = 0;
@@ -487,12 +494,8 @@
     old_space_->AddGCTime(delta);
     old_space_->IncrementCollections();
   }
-  stats_.after_.new_used_in_words_ = new_space_->UsedInWords();
-  stats_.after_.new_capacity_in_words_ = new_space_->CapacityInWords();
-  stats_.after_.new_external_in_words_ = new_space_->ExternalInWords();
-  stats_.after_.old_used_in_words_ = old_space_->UsedInWords();
-  stats_.after_.old_capacity_in_words_ = old_space_->CapacityInWords();
-  stats_.after_.old_external_in_words_ = old_space_->ExternalInWords();
+  stats_.after_.new_ = new_space_->GetCurrentUsage();
+  stats_.after_.old_ = old_space_->GetCurrentUsage();
   ASSERT(gc_in_progress_);
   gc_in_progress_ = false;
 }
@@ -530,18 +533,18 @@
     MicrosecondsToSeconds(stats_.before_.micros_ - isolate->start_time()),
     MicrosecondsToMilliseconds(stats_.after_.micros_ -
                                     stats_.before_.micros_),
-    RoundWordsToKB(stats_.before_.new_used_in_words_),
-    RoundWordsToKB(stats_.after_.new_used_in_words_),
-    RoundWordsToKB(stats_.before_.new_capacity_in_words_),
-    RoundWordsToKB(stats_.after_.new_capacity_in_words_),
-    RoundWordsToKB(stats_.before_.new_external_in_words_),
-    RoundWordsToKB(stats_.after_.new_external_in_words_),
-    RoundWordsToKB(stats_.before_.old_used_in_words_),
-    RoundWordsToKB(stats_.after_.old_used_in_words_),
-    RoundWordsToKB(stats_.before_.old_capacity_in_words_),
-    RoundWordsToKB(stats_.after_.old_capacity_in_words_),
-    RoundWordsToKB(stats_.before_.old_external_in_words_),
-    RoundWordsToKB(stats_.after_.old_external_in_words_),
+    RoundWordsToKB(stats_.before_.new_.used_in_words),
+    RoundWordsToKB(stats_.after_.new_.used_in_words),
+    RoundWordsToKB(stats_.before_.new_.capacity_in_words),
+    RoundWordsToKB(stats_.after_.new_.capacity_in_words),
+    RoundWordsToKB(stats_.before_.new_.external_in_words),
+    RoundWordsToKB(stats_.after_.new_.external_in_words),
+    RoundWordsToKB(stats_.before_.old_.used_in_words),
+    RoundWordsToKB(stats_.after_.old_.used_in_words),
+    RoundWordsToKB(stats_.before_.old_.capacity_in_words),
+    RoundWordsToKB(stats_.after_.old_.capacity_in_words),
+    RoundWordsToKB(stats_.before_.old_.external_in_words),
+    RoundWordsToKB(stats_.after_.old_.external_in_words),
     MicrosecondsToMilliseconds(stats_.times_[0]),
     MicrosecondsToMilliseconds(stats_.times_[1]),
     MicrosecondsToMilliseconds(stats_.times_[2]),
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 045b4ee..7d40316 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -11,6 +11,7 @@
 #include "vm/globals.h"
 #include "vm/pages.h"
 #include "vm/scavenger.h"
+#include "vm/spaces.h"
 #include "vm/weak_table.h"
 
 namespace dart {
@@ -258,12 +259,8 @@
     public:
       Data() {}
       int64_t micros_;
-      intptr_t new_used_in_words_;
-      intptr_t new_capacity_in_words_;
-      intptr_t new_external_in_words_;
-      intptr_t old_used_in_words_;
-      intptr_t old_capacity_in_words_;
-      intptr_t old_external_in_words_;
+      SpaceUsage new_;
+      SpaceUsage old_;
     private:
       DISALLOW_COPY_AND_ASSIGN(Data);
     };
diff --git a/runtime/vm/heap_test.cc b/runtime/vm/heap_test.cc
index 950bc00..cfd167d 100644
--- a/runtime/vm/heap_test.cc
+++ b/runtime/vm/heap_test.cc
@@ -2,6 +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.
 
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "platform/assert.h"
 #include "vm/dart_api_impl.h"
 #include "vm/globals.h"
@@ -206,3 +209,5 @@
 }
 
 }  // namespace dart.
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index db7cee1..38f9c2a 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -170,9 +170,14 @@
 static void PrintUse(BufferFormatter* f, const Definition& definition) {
   if (definition.is_used()) {
     if (definition.HasSSATemp()) {
-      f->Print("v%" Pd, definition.ssa_temp_index());
+      if (definition.HasPairRepresentation()) {
+        f->Print("v%" Pd ", v%" Pd "", definition.ssa_temp_index(),
+                                       definition.ssa_temp_index() + 1);
+      } else {
+        f->Print("v%" Pd "", definition.ssa_temp_index());
+      }
     } else if (definition.temp_index() != -1) {
-      f->Print("t%" Pd, definition.temp_index());
+      f->Print("t%" Pd "", definition.temp_index());
     }
   }
 }
@@ -232,7 +237,9 @@
 void Definition::PrintOperandsTo(BufferFormatter* f) const {
   for (int i = 0; i < InputCount(); ++i) {
     if (i > 0) f->Print(", ");
-    if (InputAt(i) != NULL) InputAt(i)->PrintTo(f);
+    if (InputAt(i) != NULL) {
+      InputAt(i)->PrintTo(f);
+    }
   }
 }
 
@@ -573,6 +580,12 @@
 }
 
 
+void ExtractNthOutputInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("Extract %" Pd " from ", index());
+  Definition::PrintOperandsTo(f);
+}
+
+
 void BinarySmiOpInstr::PrintTo(BufferFormatter* f) const {
   Definition::PrintTo(f);
   f->Print(" %co", overflow_ ? '+' : '-');
diff --git a/runtime/vm/instructions.h b/runtime/vm/instructions.h
index 97fe299..0f5b8a5 100644
--- a/runtime/vm/instructions.h
+++ b/runtime/vm/instructions.h
@@ -13,6 +13,8 @@
 #include "vm/instructions_x64.h"
 #elif defined(TARGET_ARCH_ARM)
 #include "vm/instructions_arm.h"
+#elif defined(TARGET_ARCH_ARM64)
+#include "vm/instructions_arm64.h"
 #elif defined(TARGET_ARCH_MIPS)
 #include "vm/instructions_mips.h"
 #else
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
new file mode 100644
index 0000000..0d1b10a
--- /dev/null
+++ b/runtime/vm/instructions_arm64.cc
@@ -0,0 +1,129 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_ARM64.
+#if defined(TARGET_ARCH_ARM64)
+
+#include "vm/assembler.h"
+#include "vm/constants_arm64.h"
+#include "vm/cpu.h"
+#include "vm/instructions.h"
+#include "vm/object.h"
+
+namespace dart {
+
+CallPattern::CallPattern(uword pc, const Code& code)
+    : object_pool_(Array::Handle(code.ObjectPool())),
+      end_(pc),
+      args_desc_load_end_(0),
+      ic_data_load_end_(0),
+      target_address_pool_index_(-1),
+      args_desc_(Array::Handle()),
+      ic_data_(ICData::Handle()) {
+  UNIMPLEMENTED();
+}
+
+
+int CallPattern::LengthInBytes() {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+// Decodes a load sequence ending at 'end' (the last instruction of the load
+// sequence is the instruction before the one at end).  Returns a pointer to
+// the first instruction in the sequence.  Returns the register being loaded
+// and the loaded object in the output parameters 'reg' and 'obj'
+// respectively.
+uword InstructionPattern::DecodeLoadObject(uword end,
+                                           const Array& object_pool,
+                                           Register* reg,
+                                           Object* obj) {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+// Decodes a load sequence ending at 'end' (the last instruction of the load
+// sequence is the instruction before the one at end).  Returns a pointer to
+// the first instruction in the sequence.  Returns the register being loaded
+// and the loaded immediate value in the output parameters 'reg' and 'value'
+// respectively.
+uword InstructionPattern::DecodeLoadWordImmediate(uword end,
+                                                  Register* reg,
+                                                  intptr_t* value) {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+// Decodes a load sequence ending at 'end' (the last instruction of the load
+// sequence is the instruction before the one at end).  Returns a pointer to
+// the first instruction in the sequence.  Returns the register being loaded
+// and the index in the pool being read from in the output parameters 'reg'
+// and 'index' respectively.
+uword InstructionPattern::DecodeLoadWordFromPool(uword end,
+                                                 Register* reg,
+                                                 intptr_t* index) {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+RawICData* CallPattern::IcData() {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+RawArray* CallPattern::ClosureArgumentsDescriptor() {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+uword CallPattern::TargetAddress() const {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+void CallPattern::SetTargetAddress(uword target_address) const {
+  UNIMPLEMENTED();
+}
+
+
+void CallPattern::InsertAt(uword pc, uword target_address) {
+  UNIMPLEMENTED();
+}
+
+
+JumpPattern::JumpPattern(uword pc, const Code& code) : pc_(pc) { }
+
+
+int JumpPattern::pattern_length_in_bytes() {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+bool JumpPattern::IsValid() const {
+  UNIMPLEMENTED();
+  return false;
+}
+
+
+uword JumpPattern::TargetAddress() const {
+  UNIMPLEMENTED();
+  return 0;
+}
+
+
+void JumpPattern::SetTargetAddress(uword target_address) const {
+  UNIMPLEMENTED();
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/instructions_arm64.h b/runtime/vm/instructions_arm64.h
new file mode 100644
index 0000000..7cda4cd
--- /dev/null
+++ b/runtime/vm/instructions_arm64.h
@@ -0,0 +1,101 @@
+// 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.
+// Classes that describe assembly patterns as used by inline caches.
+
+#ifndef VM_INSTRUCTIONS_ARM64_H_
+#define VM_INSTRUCTIONS_ARM64_H_
+
+#ifndef VM_INSTRUCTIONS_H_
+#error Do not include instructions_arm64.h directly; use instructions.h instead.
+#endif
+
+#include "vm/constants_arm64.h"
+#include "vm/object.h"
+
+namespace dart {
+
+class InstructionPattern : public AllStatic {
+ public:
+  // Decodes a load sequence ending at 'end' (the last instruction of the
+  // load sequence is the instruction before the one at end).  Returns the
+  // address of the first instruction in the sequence.  Returns the register
+  // being loaded and the loaded object in the output parameters 'reg' and
+  // 'obj' respectively.
+  static uword DecodeLoadObject(uword end,
+                                const Array& object_pool,
+                                Register* reg,
+                                Object* obj);
+
+  // Decodes a load sequence ending at 'end' (the last instruction of the
+  // load sequence is the instruction before the one at end).  Returns the
+  // address of the first instruction in the sequence.  Returns the register
+  // being loaded and the loaded immediate value in the output parameters
+  // 'reg' and 'value' respectively.
+  static uword DecodeLoadWordImmediate(uword end,
+                                       Register* reg,
+                                       intptr_t* value);
+
+  // Decodes a load sequence ending at 'end' (the last instruction of the
+  // load sequence is the instruction before the one at end).  Returns the
+  // address of the first instruction in the sequence.  Returns the register
+  // being loaded and the index in the pool being read from in the output
+  // parameters 'reg' and 'index' respectively.
+  static uword DecodeLoadWordFromPool(uword end,
+                                      Register* reg,
+                                      intptr_t* index);
+};
+
+
+class CallPattern : public ValueObject {
+ public:
+  CallPattern(uword pc, const Code& code);
+
+  RawICData* IcData();
+  RawArray* ClosureArgumentsDescriptor();
+
+  uword TargetAddress() const;
+  void SetTargetAddress(uword target_address) const;
+
+  // This constant length is only valid for inserted call patterns used for
+  // lazy deoptimization. Regular call pattern may vary in length.
+  static int LengthInBytes();
+
+  static void InsertAt(uword pc, uword target_address);
+
+ private:
+  const Array& object_pool_;
+
+  uword end_;
+  uword args_desc_load_end_;
+  uword ic_data_load_end_;
+
+  intptr_t target_address_pool_index_;
+  Array& args_desc_;
+  ICData& ic_data_;
+
+  DISALLOW_COPY_AND_ASSIGN(CallPattern);
+};
+
+
+class JumpPattern : public ValueObject {
+ public:
+  JumpPattern(uword pc, const Code& code);
+
+  static const int kLengthInBytes = 3 * Instr::kInstrSize;
+
+  static int pattern_length_in_bytes();
+
+  bool IsValid() const;
+  uword TargetAddress() const;
+  void SetTargetAddress(uword target_address) const;
+
+ private:
+  const uword pc_;
+
+  DISALLOW_COPY_AND_ASSIGN(JumpPattern);
+};
+
+}  // namespace dart
+
+#endif  // VM_INSTRUCTIONS_ARM64_H_
diff --git a/runtime/vm/instructions_arm64_test.cc b/runtime/vm/instructions_arm64_test.cc
new file mode 100644
index 0000000..7c2fe8f
--- /dev/null
+++ b/runtime/vm/instructions_arm64_test.cc
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_ARM64)
+
+// TODO(zra): Port these tests.
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/instructions_arm_test.cc b/runtime/vm/instructions_arm_test.cc
index 46dbb1c..a723258 100644
--- a/runtime/vm/instructions_arm_test.cc
+++ b/runtime/vm/instructions_arm_test.cc
@@ -16,7 +16,7 @@
 #define __ assembler->
 
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
-  __ BranchLinkPatchable(&StubCode::InstanceFunctionLookupLabel());
+  __ BranchLinkPatchable(&StubCode::InvokeDartCodeLabel());
   __ Ret();
 }
 
@@ -27,13 +27,13 @@
   // before the end of the code buffer.
   CallPattern call(test->entry() + test->code().Size() - Instr::kInstrSize,
                    test->code());
-  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
             call.TargetAddress());
 }
 
 
 ASSEMBLER_TEST_GENERATE(Jump, assembler) {
-  __ BranchPatchable(&StubCode::InstanceFunctionLookupLabel());
+  __ BranchPatchable(&StubCode::InvokeDartCodeLabel());
   __ BranchPatchable(&StubCode::AllocateArrayLabel());
 }
 
@@ -47,7 +47,7 @@
                              VirtualMemory::kReadWrite);
   EXPECT(status);
   JumpPattern jump1(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
             jump1.TargetAddress());
   JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
                     test->code());
@@ -59,7 +59,7 @@
   jump2.SetTargetAddress(target1);
   EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
             jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
             jump2.TargetAddress());
 }
 
@@ -68,7 +68,7 @@
 ASSEMBLER_TEST_GENERATE(JumpARMv6, assembler) {
   // ARMv7 is the default.
   HostCPUFeatures::set_arm_version(ARMv6);
-  __ BranchPatchable(&StubCode::InstanceFunctionLookupLabel());
+  __ BranchPatchable(&StubCode::InvokeDartCodeLabel());
   __ BranchPatchable(&StubCode::AllocateArrayLabel());
   HostCPUFeatures::set_arm_version(ARMv7);
 }
@@ -84,7 +84,7 @@
                              VirtualMemory::kReadWrite);
   EXPECT(status);
   JumpPattern jump1(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
             jump1.TargetAddress());
   JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
                     test->code());
@@ -96,7 +96,7 @@
   jump2.SetTargetAddress(target1);
   EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
             jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
             jump2.TargetAddress());
   HostCPUFeatures::set_arm_version(ARMv7);
 }
diff --git a/runtime/vm/instructions_ia32_test.cc b/runtime/vm/instructions_ia32_test.cc
index 637f72e..43c804c 100644
--- a/runtime/vm/instructions_ia32_test.cc
+++ b/runtime/vm/instructions_ia32_test.cc
@@ -17,20 +17,20 @@
 #define __ assembler->
 
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
-  __ call(&StubCode::InstanceFunctionLookupLabel());
+  __ call(&StubCode::InvokeDartCodeLabel());
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(Call, test) {
   CallPattern call(test->entry());
-  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
             call.TargetAddress());
 }
 
 
 ASSEMBLER_TEST_GENERATE(Jump, assembler) {
-  __ jmp(&StubCode::InstanceFunctionLookupLabel());
+  __ jmp(&StubCode::InvokeDartCodeLabel());
   __ jmp(&StubCode::AllocateArrayLabel());
   __ ret();
 }
@@ -45,7 +45,7 @@
                              VirtualMemory::kReadWrite);
   EXPECT(status);
   JumpPattern jump1(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
             jump1.TargetAddress());
   JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
                     test->code());
@@ -57,7 +57,7 @@
   jump2.SetTargetAddress(target1);
   EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
             jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
             jump2.TargetAddress());
 }
 
diff --git a/runtime/vm/instructions_mips_test.cc b/runtime/vm/instructions_mips_test.cc
index 4aff913..365395e 100644
--- a/runtime/vm/instructions_mips_test.cc
+++ b/runtime/vm/instructions_mips_test.cc
@@ -15,7 +15,7 @@
 #define __ assembler->
 
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
-  __ BranchLinkPatchable(&StubCode::InstanceFunctionLookupLabel());
+  __ BranchLinkPatchable(&StubCode::InvokeDartCodeLabel());
   __ Ret();
 }
 
@@ -27,13 +27,13 @@
   // return jump.
   CallPattern call(test->entry() + test->code().Size() - (2*Instr::kInstrSize),
                    test->code());
-  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
             call.TargetAddress());
 }
 
 
 ASSEMBLER_TEST_GENERATE(Jump, assembler) {
-  __ BranchPatchable(&StubCode::InstanceFunctionLookupLabel());
+  __ BranchPatchable(&StubCode::InvokeDartCodeLabel());
   __ BranchPatchable(&StubCode::AllocateArrayLabel());
 }
 
@@ -47,7 +47,7 @@
                              VirtualMemory::kReadWrite);
   EXPECT(status);
   JumpPattern jump1(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
             jump1.TargetAddress());
   JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
                     test->code());
@@ -59,7 +59,7 @@
   jump2.SetTargetAddress(target1);
   EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
             jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
             jump2.TargetAddress());
 }
 
diff --git a/runtime/vm/instructions_x64_test.cc b/runtime/vm/instructions_x64_test.cc
index 5cd4c8d..c217775 100644
--- a/runtime/vm/instructions_x64_test.cc
+++ b/runtime/vm/instructions_x64_test.cc
@@ -15,14 +15,14 @@
 #define __ assembler->
 
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
-  __ call(&StubCode::InstanceFunctionLookupLabel());
+  __ call(&StubCode::InvokeDartCodeLabel());
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(Call, test) {
   CallPattern call(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
             call.TargetAddress());
 }
 
@@ -35,7 +35,7 @@
   __ pushq(PP);
   __ LoadPoolPointer(PP);
   prologue_code_size = assembler->CodeSize();
-  __ JmpPatchable(&StubCode::InstanceFunctionLookupLabel(), PP);
+  __ JmpPatchable(&StubCode::InvokeDartCodeLabel(), PP);
   __ JmpPatchable(&StubCode::AllocateArrayLabel(), PP);
   __ popq(PP);
   __ ret();
@@ -53,7 +53,7 @@
   EXPECT(status);
   JumpPattern jump1(test->entry() + prologue_code_size, test->code());
   jump1.IsValid();
-  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
             jump1.TargetAddress());
   JumpPattern jump2((test->entry() +
                      jump1.pattern_length_in_bytes() + prologue_code_size),
@@ -66,7 +66,7 @@
   jump2.SetTargetAddress(target1);
   EXPECT_EQ(StubCode::AllocateArrayLabel().address(),
             jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(),
+  EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
             jump2.TargetAddress());
 }
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 7b4d385..993a614 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -805,7 +805,9 @@
   ReplaceUsesWith(other);
   // Reuse this instruction's SSA name for other.
   ASSERT(!other->HasSSATemp());
-  if (HasSSATemp()) other->set_ssa_temp_index(ssa_temp_index());
+  if (HasSSATemp()) {
+    other->set_ssa_temp_index(ssa_temp_index());
+  }
 
   // Finally insert the other definition in place of this one in the graph.
   previous()->LinkTo(other);
@@ -3228,16 +3230,16 @@
 }
 
 
-intptr_t MergedMathInstr::ResultIndexOf(MethodRecognizer::Kind kind) {
+intptr_t MergedMathInstr::OutputIndexOf(intptr_t kind) {
   switch (kind) {
-    case MethodRecognizer::kMathSin: return 0;
-    case MethodRecognizer::kMathCos: return 1;
+    case MethodRecognizer::kMathSin: return 1;
+    case MethodRecognizer::kMathCos: return 0;
     default: UNIMPLEMENTED(); return -1;
   }
 }
 
 
-intptr_t MergedMathInstr::ResultIndexOf(Token::Kind token) {
+intptr_t MergedMathInstr::OutputIndexOf(Token::Kind token) {
   switch (token) {
     case Token::kTRUNCDIV: return 0;
     case Token::kMOD: return 1;
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 1177d69..3d867f6 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -779,6 +779,7 @@
   M(Simd64x2Shuffle)                                                           \
   M(Float64x2ZeroArg)                                                          \
   M(Float64x2OneArg)                                                           \
+  M(ExtractNthOutput)                                                          \
 
 
 #define FORWARD_DECLARATION(type) class type##Instr;
@@ -1764,7 +1765,10 @@
   }
   bool HasSSATemp() const { return ssa_temp_index_ >= 0; }
   void ClearSSATempIndex() { ssa_temp_index_ = -1; }
-
+  bool HasPairRepresentation() const {
+    return (representation() == kPairOfTagged) ||
+           (representation() == kPairOfUnboxedDouble);
+  }
   bool is_used() const { return (use_kind_ != kEffect); }
   void set_use_kind(UseKind kind) { use_kind_ = kind; }
 
@@ -7286,11 +7290,67 @@
 };
 
 
+class ExtractNthOutputInstr : public TemplateDefinition<1> {
+ public:
+  // Extract the Nth output register from value.
+  ExtractNthOutputInstr(Value* value,
+                        intptr_t n,
+                        Representation definition_rep,
+                        intptr_t definition_cid)
+      : index_(n),
+        definition_rep_(definition_rep),
+        definition_cid_(definition_cid) {
+    SetInputAt(0, value);
+  }
+
+  Value* value() const { return inputs_[0]; }
+
+  DECLARE_INSTRUCTION(ExtractNthOutput)
+
+  virtual CompileType ComputeType() const;
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+  virtual bool CanDeoptimize() const { return false; }
+
+  intptr_t index() const { return index_; }
+
+  virtual Representation representation() const {
+    return definition_rep_;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    if (representation() == kTagged) {
+      return kPairOfTagged;
+    } else if (representation() == kUnboxedDouble) {
+      return kPairOfUnboxedDouble;
+    }
+    UNREACHABLE();
+    return definition_rep_;
+  }
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const {
+    ExtractNthOutputInstr* other_extract = other->AsExtractNthOutput();
+    return (other_extract->representation() == representation()) &&
+           (other_extract->index() == index());
+  }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  const intptr_t index_;
+  const Representation definition_rep_;
+  const intptr_t definition_cid_;
+  DISALLOW_COPY_AND_ASSIGN(ExtractNthOutputInstr);
+};
+
+
 class MergedMathInstr : public Definition {
  public:
   enum Kind {
     kTruncDivMod,
-    kTruncDivRem,
     kSinCos,
   };
 
@@ -7317,6 +7377,9 @@
     return (*inputs_)[i];
   }
 
+  static intptr_t OutputIndexOf(intptr_t kind);
+  static intptr_t OutputIndexOf(Token::Kind token);
+
   virtual CompileType ComputeType() const;
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
@@ -7333,9 +7396,9 @@
 
   virtual Representation representation() const {
     if (kind_ == kTruncDivMod) {
-      return kTagged;
+      return kPairOfTagged;
     } else if (kind_ == kSinCos) {
-      return kTagged;
+      return kPairOfUnboxedDouble;
     } else {
       UNIMPLEMENTED();
       return kTagged;
@@ -7356,10 +7419,6 @@
 
   virtual intptr_t DeoptimizationTarget() const { return deopt_id_; }
 
-  // Returns the result index for one of the merged instructjons
-  static intptr_t ResultIndexOf(MethodRecognizer::Kind kind);
-  static intptr_t ResultIndexOf(Token::Kind token);
-
   DECLARE_INSTRUCTION(MergedMath)
 
   virtual bool AllowsCSE() const { return true; }
@@ -7383,10 +7442,8 @@
   virtual void RawSetInputAt(intptr_t i, Value* value) {
     (*inputs_)[i] = value;
   }
-
   ZoneGrowableArray<Value*>* inputs_;
   MergedMathInstr::Kind kind_;
-
   DISALLOW_COPY_AND_ASSIGN(MergedMathInstr);
 };
 
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 4ad78bf..1ae7daa 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -4930,41 +4930,80 @@
 
 void InvokeMathCFunctionInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // For pow-function return NaN if exponent is NaN.
-  Label do_call, skip_call;
+  Label skip_call;
   if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
     // Pseudo code:
-    // if (exponent == 0.0) return 0.0;
+    // if (exponent == 0.0) return 1.0;
     // if (base == 1.0) return 1.0;
     // if (base.isNaN || exponent.isNaN) {
     //    return double.NAN;
     // }
+    // if (base != -Infinity && exponent == 0.5) {
+    //   if (base == 0.0) return 0.0;
+    //   return sqrt(value);
+    // }
     DRegister base = EvenDRegisterOf(locs()->in(0).fpu_reg());
     DRegister exp = EvenDRegisterOf(locs()->in(1).fpu_reg());
     DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
     Register temp = locs()->temp(0).reg();
     DRegister saved_base = EvenDRegisterOf(locs()->temp(1).fpu_reg());
     ASSERT((base == result) && (result != saved_base));
-    Label check_base_is_one;
-    // Check if exponent is 0.0 -> return 1.0;
+
+    Label try_sqrt, check_base, return_nan;
     __ vmovd(saved_base, base);
-    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0)));
-    __ LoadDFromOffset(DTMP, temp, Double::value_offset() - kHeapObjectTag);
-    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(1)));
-    __ LoadDFromOffset(result, temp, Double::value_offset() - kHeapObjectTag);
+    __ LoadDImmediate(DTMP, 0.0, temp);
+    __ LoadDImmediate(result, 1.0, temp);
+    // exponent == 0.0 -> return 1.0;
     __ vcmpd(exp, DTMP);
     __ vmstat();
-    __ b(&check_base_is_one, VS);  // NaN -> not zero.
+    __ b(&check_base, VS);  // NaN -> check base.
     __ b(&skip_call, EQ);  // exp is 0.0, result is 1.0.
 
-    __ Bind(&check_base_is_one);
+    __ Bind(&check_base);
+    // Note: 'exp' could be NaN.
+    // base == 1.0 -> return 1.0;
     __ vcmpd(saved_base, result);
     __ vmstat();
-    __ vmovd(result, saved_base, VS);  // base is NaN, return NaN.
-    __ b(&skip_call, VS);
-    __ b(&skip_call, EQ);  // base and result are 1.0.
+    __ b(&return_nan, VS);
+    __ b(&skip_call, EQ);  // base is 1.0, result is 1.0.
+
+    __ vcmpd(saved_base, exp);
+    __ b(&try_sqrt, VC);  // // Neither 'exp' nor 'base' is NaN.
+
+    __ Bind(&return_nan);
+    __ LoadDImmediate(result, NAN, temp);
+    __ b(&skip_call);
+
+    Label do_pow, return_zero;
+    __ Bind(&try_sqrt);
+
+    // Before calling pow, check if we could use sqrt instead of pow.
+    __ LoadDImmediate(result, -INFINITY, temp);
+
+    // base == -Infinity -> call pow;
+    __ vcmpd(saved_base, result);
+    __ b(&do_pow, EQ);
+
+    // exponent == 0.5 ?
+    __ LoadDImmediate(result, 0.5, temp);
+    __ vcmpd(exp, result);
+    __ b(&do_pow, NE);
+
+    // base == 0 -> return 0;
+    __ vcmpd(base, DTMP);
+    __ b(&return_zero, EQ);
+
+    __ vsqrtd(result, saved_base);
+    __ b(&skip_call);
+
+    __ Bind(&return_zero);
+    __ vmovd(result, DTMP);
+    __ b(&skip_call);
+
+    __ Bind(&do_pow);
     __ vmovd(base, saved_base);  // Restore base.
   }
-  __ Bind(&do_call);
+
   if (InputCount() == 2) {
     // Args must be in D0 and D1, so move arg from Q1(== D3:D2) to D1.
     __ vmovd(D1, D2);
@@ -4985,19 +5024,68 @@
 }
 
 
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const {
+  // Only use this instruction in optimized code.
+  ASSERT(opt);
+  const intptr_t kNumInputs = 1;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  if (representation() == kUnboxedDouble) {
+    if (index() == 0) {
+      summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
+                                        Location::Any()));
+    } else {
+      ASSERT(index() == 1);
+      summary->set_in(0, Location::Pair(Location::Any(),
+                                        Location::RequiresFpuRegister()));
+    }
+    summary->set_out(0, Location::RequiresFpuRegister());
+  } else {
+    ASSERT(representation() == kTagged);
+    if (index() == 0) {
+      summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                        Location::Any()));
+    } else {
+      ASSERT(index() == 1);
+      summary->set_in(0, Location::Pair(Location::Any(),
+                                        Location::RequiresRegister()));
+    }
+    summary->set_out(0, Location::RequiresRegister());
+  }
+  return summary;
+}
+
+
+void ExtractNthOutputInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(locs()->in(0).IsPairLocation());
+  PairLocation* pair = locs()->in(0).AsPairLocation();
+  Location in_loc = pair->At(index());
+  if (representation() == kUnboxedDouble) {
+    QRegister out = locs()->out(0).fpu_reg();
+    QRegister in = in_loc.fpu_reg();
+    __ vmovq(out, in);
+  } else {
+    ASSERT(representation() == kTagged);
+    Register out = locs()->out(0).reg();
+    Register in = in_loc.reg();
+    __ mov(out, ShifterOperand(in));
+  }
+}
+
+
 LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const {
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
-    const intptr_t kNumTemps = 4;
+    const intptr_t kNumTemps = 2;
     LocationSummary* summary =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
     summary->set_temp(1, Location::RequiresFpuRegister());
-    summary->set_temp(2, Location::RequiresRegister());  // result_div.
-    summary->set_temp(3, Location::RequiresRegister());  // result_mod.
-    summary->set_out(0, Location::RequiresRegister());
+    // Output is a pair of registers.
+    summary->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                       Location::RequiresRegister()));
     return summary;
   }
   UNIMPLEMENTED();
@@ -5013,7 +5101,10 @@
   if (kind() == MergedMathInstr::kTruncDivMod) {
     Register left = locs()->in(0).reg();
     Register right = locs()->in(1).reg();
-    Register result = locs()->out(0).reg();
+    ASSERT(locs()->out(0).IsPairLocation());
+    PairLocation* pair = locs()->out(0).AsPairLocation();
+    Register result_div = pair->At(0).reg();
+    Register result_mod = pair->At(1).reg();
     Range* right_range = InputAt(1)->definition()->range();
     if ((right_range == NULL) || right_range->Overlaps(0, 0)) {
       // Handle divide by zero in runtime.
@@ -5022,8 +5113,7 @@
     }
     Register temp = locs()->temp(0).reg();
     DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
-    Register result_div = locs()->temp(2).reg();
-    Register result_mod = locs()->temp(3).reg();
+
     __ Asr(temp, left, kSmiTagSize);  // SmiUntag left into temp.
     __ Asr(IP, right, kSmiTagSize);  // SmiUntag right into IP.
 
@@ -5056,15 +5146,6 @@
     __ add(result_mod, result_mod, ShifterOperand(right), GE);
     __ Bind(&done);
 
-    __ LoadObject(result, Array::ZoneHandle(Array::New(2, Heap::kOld)));
-    // Note that index is expected smi-tagged, (i.e, times 2) for all arrays.
-    // [0]: divide resut, [1]: mod result.
-    __ mov(temp, ShifterOperand(0 +
-        FlowGraphCompiler::DataOffsetFor(kArrayCid) - kHeapObjectTag));
-    Address store_address(result, temp, LSL, 0);
-    __ StoreIntoObjectNoBarrier(result, store_address, result_div);
-    __ add(temp, temp, ShifterOperand(kWordSize));
-    __ StoreIntoObjectNoBarrier(result, store_address, result_mod);
     return;
   }
   if (kind() == MergedMathInstr::kSinCos) {
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
new file mode 100644
index 0000000..ad54f6d
--- /dev/null
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -0,0 +1,1258 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_ARM64.
+#if defined(TARGET_ARCH_ARM64)
+
+#include "vm/intermediate_language.h"
+
+#include "vm/dart_entry.h"
+#include "vm/flow_graph_compiler.h"
+#include "vm/locations.h"
+#include "vm/object_store.h"
+#include "vm/parser.h"
+#include "vm/simulator.h"
+#include "vm/stack_frame.h"
+#include "vm/stub_code.h"
+#include "vm/symbols.h"
+
+#define __ compiler->assembler()->
+
+namespace dart {
+
+LocationSummary* Instruction::MakeCallSummary() {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+LocationSummary* PushArgumentInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ReturnInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* IfThenElseInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* LoadLocalInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StoreLocalInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StoreLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ConstantInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+LocationSummary* AssertBooleanInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void AssertBooleanInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+Condition EqualityCompareInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
+                                                   BranchLabels labels) {
+  UNIMPLEMENTED();
+  return VS;
+}
+
+
+void EqualityCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                          BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
+                                           BranchLabels labels) {
+  UNIMPLEMENTED();
+  return VS;
+}
+
+void TestSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                  BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+Condition RelationalOpInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
+                                                BranchLabels labels) {
+  UNIMPLEMENTED();
+  return VS;
+}
+
+
+void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                       BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* NativeCallInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StringToCharCodeInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StringToCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StringInterpolateInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StringInterpolateInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* LoadUntaggedInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* LoadClassIdInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+CompileType LoadIndexedInstr::ComputeType() const {
+  UNIMPLEMENTED();
+  return CompileType::Dynamic();
+}
+
+
+Representation LoadIndexedInstr::representation() const {
+  UNIMPLEMENTED();
+  return kTagged;
+}
+
+
+LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+Representation StoreIndexedInstr::RequiredInputRepresentation(
+    intptr_t idx) const {
+  UNIMPLEMENTED();
+  return kTagged;
+}
+
+
+LocationSummary* StoreIndexedInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* GuardFieldInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void GuardFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StoreInstanceFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void LoadFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
+    bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void InstantiateTypeArgumentsInstr::EmitNativeCode(
+    FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* AllocateContextInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckStackOverflowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BoxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BoxInt32x4Instr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BoxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Simd32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Simd32x4ShuffleMixInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Simd32x4GetSignMaskInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
+    bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float32x4ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float32x4SplatInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float32x4SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float32x4ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float32x4MinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float32x4SqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float32x4ScaleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float32x4ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float32x4ClampInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float32x4ClampInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float32x4WithInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float32x4WithInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
+    bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
+    bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
+    bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float64x2ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
+    bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Int32x4BoolConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* MathMinMaxInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void MathMinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* SmiToDoubleInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* DoubleToSmiInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* DoubleToFloatInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void DoubleToFloatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* FloatToDoubleInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void FloatToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void InvokeMathCFunctionInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ExtractNthOutputInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void MergedMathInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
+    bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BranchInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxIntegerInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BoxIntegerInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ShiftMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ThrowInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ReThrowInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+void GraphEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* GotoInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* CurrentContextInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+Condition StrictCompareInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
+                                                 BranchLabels labels) {
+  UNIMPLEMENTED();
+  return VS;
+}
+
+
+void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
+                                        BranchInstr* branch) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BooleanNegateInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* AllocateObjectInstr::MakeLocationSummary(bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index acfa39d..74a7587 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -2570,6 +2570,9 @@
   CheckStackOverflowSlowPath* slow_path = new CheckStackOverflowSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
 
+  if (compiler->ShouldDeoptimizeFunction()) {
+    __ jmp(slow_path->entry_label());
+  }
   __ cmpl(ESP,
           Address::Absolute(Isolate::Current()->stack_limit_address()));
   __ j(BELOW_EQUAL, slow_path->entry_label());
@@ -4760,7 +4763,7 @@
   for (intptr_t i = 0; i < InputCount(); i++) {
     __ movsd(Address(ESP, kDoubleSize * i), locs()->in(i).fpu_reg());
   }
-  Label do_call, skip_call;
+  Label skip_call;
   if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
     // Pseudo code:
     // if (exponent == 0.0) return 1.0;
@@ -4768,37 +4771,73 @@
     // if (base.isNaN || exponent.isNaN) {
     //    return double.NAN;
     // }
+    // if (base != -Infinity && exponent == 0.5) {
+    //   if (base == 0.0) return 0.0;
+    //   return sqrt(value);
+    // }
     XmmRegister base = locs()->in(0).fpu_reg();
     XmmRegister exp = locs()->in(1).fpu_reg();
     XmmRegister result = locs()->out(0).fpu_reg();
     Register temp = locs()->temp(kObjectTempIndex).reg();
     XmmRegister zero_temp = locs()->temp(kDoubleTempIndex).fpu_reg();
 
-    Label check_base_is_one;
-    // Check if exponent is 0.0 -> return 1.0;
+    Label try_sqrt, check_base, return_nan;
     __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0)));
     __ movsd(zero_temp, FieldAddress(temp, Double::value_offset()));
     __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(1)));
     __ movsd(result, FieldAddress(temp, Double::value_offset()));
-    // 'result' contains 1.0.
+
+    // exponent == 0.0 -> return 1.0;
     __ comisd(exp, zero_temp);
-    __ j(PARITY_EVEN, &check_base_is_one, Assembler::kNearJump);  // NaN.
-    __ j(EQUAL, &skip_call, Assembler::kNearJump);  // exp is 0, result is 1.0.
+    __ j(PARITY_EVEN, &check_base, Assembler::kNearJump);
+    __ j(EQUAL, &skip_call, Assembler::kNearJump);  // 'result' is 1.0.
 
-    Label base_is_nan;
-    __ Bind(&check_base_is_one);
+    __ Bind(&check_base);
+    // Note: 'exp' could be NaN.
+
+    // base == 1.0 -> return 1.0;
     __ comisd(base, result);
-    __ j(PARITY_EVEN, &base_is_nan, Assembler::kNearJump);
-    __ j(EQUAL, &skip_call, Assembler::kNearJump);  // base and result are 1.0
-    __ jmp(&do_call, Assembler::kNearJump);
+    __ j(PARITY_EVEN, &return_nan, Assembler::kNearJump);
+    __ j(EQUAL, &skip_call, Assembler::kNearJump);
+    // Note: 'base' could be NaN.
+    __ comisd(exp, base);
+    // Neither 'exp' nor 'base' is NaN.
+    __ j(PARITY_ODD, &try_sqrt, Assembler::kNearJump);
+    // Return NaN.
+    __ Bind(&return_nan);
+    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(NAN)));
+    __ movsd(result, FieldAddress(temp, Double::value_offset()));
+    __ jmp(&skip_call);
 
-    __ Bind(&base_is_nan);
-    // Returns NaN.
-    __ movsd(result, base);
+    Label do_pow, return_zero;
+    __ Bind(&try_sqrt);
+    // Before calling pow, check if we could use sqrt instead of pow.
+    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(-INFINITY)));
+    __ movsd(result, FieldAddress(temp, Double::value_offset()));
+    // base == -Infinity -> call pow;
+    __ comisd(base, result);
+    __ j(EQUAL, &do_pow, Assembler::kNearJump);
+
+    // exponent == 0.5 ?
+    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0.5)));
+    __ movsd(result, FieldAddress(temp, Double::value_offset()));
+    __ comisd(exp, result);
+    __ j(NOT_EQUAL, &do_pow, Assembler::kNearJump);
+
+    // base == 0 -> return 0;
+    __ comisd(base, zero_temp);
+    __ j(EQUAL, &return_zero, Assembler::kNearJump);
+
+    __ sqrtsd(result, base);
     __ jmp(&skip_call, Assembler::kNearJump);
-    // exp is Nan case is handled correctly in the C-library.
+
+    __ Bind(&return_zero);
+    __ movsd(result, zero_temp);
+    __ jmp(&skip_call);
+
+    __ Bind(&do_pow);
   }
-  __ Bind(&do_call);
+
   __ CallRuntime(TargetFunction(), InputCount());
   __ fstpl(Address(ESP, 0));
   __ movsd(locs()->out(0).fpu_reg(), Address(ESP, 0));
@@ -4808,27 +4847,77 @@
 }
 
 
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const {
+  // Only use this instruction in optimized code.
+  ASSERT(opt);
+  const intptr_t kNumInputs = 1;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  if (representation() == kUnboxedDouble) {
+    if (index() == 0) {
+      summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
+                                        Location::Any()));
+    } else {
+      ASSERT(index() == 1);
+      summary->set_in(0, Location::Pair(Location::Any(),
+                                        Location::RequiresFpuRegister()));
+    }
+    summary->set_out(0, Location::RequiresFpuRegister());
+  } else {
+    ASSERT(representation() == kTagged);
+    if (index() == 0) {
+      summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                        Location::Any()));
+    } else {
+      ASSERT(index() == 1);
+      summary->set_in(0, Location::Pair(Location::Any(),
+                                        Location::RequiresRegister()));
+    }
+    summary->set_out(0, Location::RequiresRegister());
+  }
+  return summary;
+}
+
+
+void ExtractNthOutputInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(locs()->in(0).IsPairLocation());
+  PairLocation* pair = locs()->in(0).AsPairLocation();
+  Location in_loc = pair->At(index());
+  if (representation() == kUnboxedDouble) {
+    XmmRegister out = locs()->out(0).fpu_reg();
+    XmmRegister in = in_loc.fpu_reg();
+    __ movaps(out, in);
+  } else {
+    ASSERT(representation() == kTagged);
+    Register out = locs()->out(0).reg();
+    Register in = in_loc.reg();
+    __ movl(out, in);
+  }
+}
+
+
 LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const {
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
-    const intptr_t kNumTemps = 1;
+    const intptr_t kNumTemps = 0;
     LocationSummary* summary =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
     // Both inputs must be writable because they will be untagged.
     summary->set_in(0, Location::RegisterLocation(EAX));
     summary->set_in(1, Location::WritableRegister());
-    summary->set_out(0, Location::RequiresRegister());
-    // Will be used for sign extension and division.
-    summary->set_temp(0, Location::RegisterLocation(EDX));
+    // Output is a pair of registers.
+    summary->set_out(0, Location::Pair(Location::RegisterLocation(EAX),
+                                       Location::RegisterLocation(EDX)));
     return summary;
   }
   if (kind() == MergedMathInstr::kSinCos) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 0;
     LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
-    summary->set_in(0, Location::FpuRegisterLocation(XMM1));
-    summary->set_out(0, Location::RegisterLocation(EAX));
+        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    summary->set_in(0, Location::RequiresFpuRegister());
+    summary->set_out(0, Location::Pair(Location::RequiresFpuRegister(),
+                                       Location::RequiresFpuRegister()));
     return summary;
   }
   UNIMPLEMENTED();
@@ -4852,7 +4941,10 @@
   if (kind() == MergedMathInstr::kTruncDivMod) {
     Register left = locs()->in(0).reg();
     Register right = locs()->in(1).reg();
-    Register result = locs()->out(0).reg();
+    ASSERT(locs()->out(0).IsPairLocation());
+    PairLocation* pair = locs()->out(0).AsPairLocation();
+    Register result1 = pair->At(0).reg();
+    Register result2 = pair->At(1).reg();
     Range* right_range = InputAt(1)->definition()->range();
     if ((right_range == NULL) || right_range->Overlaps(0, 0)) {
       // Handle divide by zero in runtime.
@@ -4861,8 +4953,8 @@
     }
     ASSERT(left == EAX);
     ASSERT((right != EDX) && (right != EAX));
-    ASSERT(locs()->temp(0).reg() == EDX);
-    ASSERT((result != EDX) && (result != EAX));
+    ASSERT(result1 == EAX);
+    ASSERT(result2 == EDX);
     __ SmiUntag(left);
     __ SmiUntag(right);
     __ cdq();  // Sign extend EAX -> EDX:EAX.
@@ -4904,53 +4996,30 @@
     }
     __ Bind(&done);
 
-    __ LoadObject(result, Array::ZoneHandle(Array::New(2, Heap::kOld)));
-    const intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(kArrayCid);
-    Address trunc_div_address(
-        FlowGraphCompiler::ElementAddressForIntIndex(
-            kArrayCid, index_scale, result,
-            MergedMathInstr::ResultIndexOf(Token::kTRUNCDIV)));
-    Address mod_address(
-        FlowGraphCompiler::ElementAddressForIntIndex(
-            kArrayCid, index_scale, result,
-            MergedMathInstr::ResultIndexOf(Token::kMOD)));
     __ SmiTag(EAX);
     __ SmiTag(EDX);
-    __ StoreIntoObjectNoBarrier(result, trunc_div_address, EAX);
-    __ StoreIntoObjectNoBarrier(result, mod_address, EDX);
     return;
   }
 
   if (kind() == MergedMathInstr::kSinCos) {
+    XmmRegister in = locs()->in(0).fpu_reg();
+    ASSERT(locs()->out(0).IsPairLocation());
+    PairLocation* pair = locs()->out(0).AsPairLocation();
+    XmmRegister out1 = pair->At(0).fpu_reg();
+    XmmRegister out2 = pair->At(1).fpu_reg();
+
     // Do x87 sincos, since the ia32 compilers may not fuse sin/cos into
     // sincos.
     __ pushl(EAX);
     __ pushl(EAX);
-    __ movsd(Address(ESP, 0), locs()->in(0).fpu_reg());
+    __ movsd(Address(ESP, 0), in);
     __ fldl(Address(ESP, 0));
     __ fsincos();
     __ fstpl(Address(ESP, 0));
-    __ movsd(XMM1, Address(ESP, 0));
+    __ movsd(out1, Address(ESP, 0));
     __ fstpl(Address(ESP, 0));
-    __ movsd(XMM0, Address(ESP, 0));
+    __ movsd(out2, Address(ESP, 0));
     __ addl(ESP, Immediate(2 * kWordSize));
-
-    Register result = locs()->out(0).reg();
-    const TypedData& res_array = TypedData::ZoneHandle(
-      TypedData::New(kTypedDataFloat64ArrayCid, 2, Heap::kOld));
-    __ LoadObject(result, res_array);
-    const intptr_t index_scale =
-        FlowGraphCompiler::ElementSizeFor(kTypedDataFloat64ArrayCid);
-    Address sin_address(
-        FlowGraphCompiler::ElementAddressForIntIndex(
-            kTypedDataFloat64ArrayCid, index_scale, result,
-            MergedMathInstr::ResultIndexOf(MethodRecognizer::kMathSin)));
-    Address cos_address(
-        FlowGraphCompiler::ElementAddressForIntIndex(
-            kTypedDataFloat64ArrayCid, index_scale, result,
-            MergedMathInstr::ResultIndexOf(MethodRecognizer::kMathCos)));
-    __ movsd(sin_address, XMM0);
-    __ movsd(cos_address, XMM1);
     return;
   }
 
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index cb3c4b6..fe94ba22 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -3701,62 +3701,139 @@
 
 void InvokeMathCFunctionInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // For pow-function return NaN if exponent is NaN.
-  Label do_call, skip_call;
+  Label skip_call;
   if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
     // Pseudo code:
-    // if (exponent == 0.0) return 0.0;
+    // if (exponent == 0.0) return 1.0;
     // if (base == 1.0) return 1.0;
     // if (base.isNaN || exponent.isNaN) {
     //    return double.NAN;
     // }
+    // if (base != -Infinity && exponent == 0.5) {
+    //   if (base == 0.0) return 0.0;
+    //   return sqrt(value);
+    // }
     DRegister base = locs()->in(0).fpu_reg();
     DRegister exp = locs()->in(1).fpu_reg();
     DRegister result = locs()->out(0).fpu_reg();
 
-    Label check_base_is_one;
-
-    // Check if exponent is 0.0 -> return 1.0;
-    __ LoadObject(TMP, Double::ZoneHandle(Double::NewCanonical(0)));
-    __ LoadDFromOffset(DTMP, TMP, Double::value_offset() - kHeapObjectTag);
-    __ LoadObject(TMP, Double::ZoneHandle(Double::NewCanonical(1)));
-    __ LoadDFromOffset(result, TMP, Double::value_offset() - kHeapObjectTag);
-    // 'result' contains 1.0.
+    Label try_sqrt, check_base, return_nan;
+    __ LoadImmediate(DTMP, 0.0);
+    __ LoadImmediate(result, 1.0);
+    // exponent == 0.0 -> return 1.0;
     __ cund(exp, exp);
-    __ bc1t(&check_base_is_one);  // NaN -> not zero.
+    __ bc1t(&check_base);  // NaN -> check base.
     __ ceqd(exp, DTMP);
     __ bc1t(&skip_call);  // exp is 0.0, result is 1.0.
 
-    Label base_is_nan;
-    __ Bind(&check_base_is_one);
+    __ Bind(&check_base);
+    // Note: 'exp' could be NaN.
+    // base == 1.0 -> return 1.0;
     __ cund(base, base);
-    __ bc1t(&base_is_nan);
+    __ bc1t(&return_nan);
     __ ceqd(base, result);
     __ bc1t(&skip_call);  // base and result are 1.0.
-    __ b(&do_call);
 
-    __ Bind(&base_is_nan);
-    __ movd(result, base);  // base is NaN, return NaN.
+    __ cund(exp, exp);
+    __ bc1f(&try_sqrt);  // Neither 'exp' nor 'base' are NaN.
+
+    __ Bind(&return_nan);
+    __ LoadImmediate(result, NAN);
     __ b(&skip_call);
+
+    __ Bind(&try_sqrt);
+    // Before calling pow, check if we could use sqrt instead of pow.
+    Label do_pow, return_zero;
+    __ LoadImmediate(result, INFINITY);
+    // base == -Infinity -> call pow;
+    __ ceqd(base, result);
+    __ b(&do_pow);
+
+    // exponent == 0.5 ?
+    __ LoadImmediate(result, 0.5);
+    __ ceqd(base, result);
+    __ bc1f(&do_pow);
+
+    // base == 0 -> return 0;
+    __ ceqd(base, DTMP);
+    __ bc1t(&return_zero);
+
+    __ sqrtd(result, base);
+    __ b(&skip_call);
+
+    __ Bind(&return_zero);
+    __ movd(result, DTMP);
+    __ b(&skip_call);
+
+    __ Bind(&do_pow);
   }
-  __ Bind(&do_call);
   // double values are passed and returned in vfp registers.
   __ CallRuntime(TargetFunction(), InputCount());
   __ Bind(&skip_call);
 }
 
 
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const {
+  // Only use this instruction in optimized code.
+  ASSERT(opt);
+  const intptr_t kNumInputs = 1;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  if (representation() == kUnboxedDouble) {
+    if (index() == 0) {
+      summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
+                                        Location::Any()));
+    } else {
+      ASSERT(index() == 1);
+      summary->set_in(0, Location::Pair(Location::Any(),
+                                        Location::RequiresFpuRegister()));
+    }
+    summary->set_out(0, Location::RequiresFpuRegister());
+  } else {
+    ASSERT(representation() == kTagged);
+    if (index() == 0) {
+      summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                        Location::Any()));
+    } else {
+      ASSERT(index() == 1);
+      summary->set_in(0, Location::Pair(Location::Any(),
+                                        Location::RequiresRegister()));
+    }
+    summary->set_out(0, Location::RequiresRegister());
+  }
+  return summary;
+}
+
+
+void ExtractNthOutputInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(locs()->in(0).IsPairLocation());
+  PairLocation* pair = locs()->in(0).AsPairLocation();
+  Location in_loc = pair->At(index());
+  if (representation() == kUnboxedDouble) {
+    DRegister out = locs()->out(0).fpu_reg();
+    DRegister in = in_loc.fpu_reg();
+    __ movd(out, in);
+  } else {
+    ASSERT(representation() == kTagged);
+    Register out = locs()->out(0).reg();
+    Register in = in_loc.reg();
+    __ mov(out, in);
+  }
+}
+
+
 LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const {
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
-    const intptr_t kNumTemps = 3;
+    const intptr_t kNumTemps = 1;
     LocationSummary* summary =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
-    summary->set_temp(1, Location::RequiresRegister());  // result_div.
-    summary->set_temp(2, Location::RequiresRegister());  // result_mod.
-    summary->set_out(0, Location::RequiresRegister());
+    // Output is a pair of registers.
+    summary->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                       Location::RequiresRegister()));
     return summary;
   }
   UNIMPLEMENTED();
@@ -3772,10 +3849,11 @@
   if (kind() == MergedMathInstr::kTruncDivMod) {
     Register left = locs()->in(0).reg();
     Register right = locs()->in(1).reg();
-    Register result = locs()->out(0).reg();
     Register temp = locs()->temp(0).reg();
-    Register result_div = locs()->temp(1).reg();
-    Register result_mod = locs()->temp(2).reg();
+    ASSERT(locs()->out(0).IsPairLocation());
+    PairLocation* pair = locs()->out(0).AsPairLocation();
+    Register result_div = pair->At(0).reg();
+    Register result_mod = pair->At(1).reg();
     Range* right_range = InputAt(1)->definition()->range();
     if ((right_range == NULL) || right_range->Overlaps(0, 0)) {
       // Handle divide by zero in runtime.
@@ -3817,16 +3895,6 @@
 
     __ SmiTag(result_div);
     __ SmiTag(result_mod);
-    __ LoadObject(result, Array::ZoneHandle(Array::New(2, Heap::kOld)));
-    // Note that index is expected smi-tagged, (i.e, times 2) for all arrays.
-    // [0]: divide resut, [1]: mod result.
-    __ LoadImmediate(temp,
-        FlowGraphCompiler::DataOffsetFor(kArrayCid) - kHeapObjectTag);
-    __ addu(temp, result, temp);
-    Address div_result_address(temp, 0);
-    Address mod_result_address(temp, kWordSize);
-    __ StoreIntoObjectNoBarrier(result, div_result_address, result_div);
-    __ StoreIntoObjectNoBarrier(result, mod_result_address, result_mod);
     return;
   }
   UNIMPLEMENTED();
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index e36e034..f5d8fc8 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -4668,53 +4668,82 @@
   if (InputCount() == 2) {
     ASSERT(locs()->in(1).fpu_reg() == XMM1);
   }
-  // For pow-function return NaN if exponent is NaN.
-  Label do_call, skip_call;
+
+  Label skip_call;
   if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
     // Pseudo code:
-    // if (exponent == 0.0) return 0.0;
+    // if (exponent == 0.0) return 1.0;
     // if (base == 1.0) return 1.0;
     // if (base.isNaN || exponent.isNaN) {
     //    return double.NAN;
     // }
+    // if (base != -Infinity && exponent == 0.5) {
+    //   if (base == 0.0) return 0.0;
+    //   return sqrt(value);
+    // }
     XmmRegister base = locs()->in(0).fpu_reg();
     XmmRegister exp = locs()->in(1).fpu_reg();
     XmmRegister result = locs()->out(0).fpu_reg();
     Register temp = locs()->temp(kObjectTempIndex).reg();
     XmmRegister zero_temp = locs()->temp(kDoubleTempIndex).fpu_reg();
 
-    // Check if exponent is 0.0 -> return 1.0;
+    Label try_sqrt, check_base, return_nan;
     __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0)), PP);
     __ movsd(zero_temp, FieldAddress(temp, Double::value_offset()));
     __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(1)), PP);
     __ movsd(result, FieldAddress(temp, Double::value_offset()));
-    // 'result' contains 1.0.
-    Label exp_is_nan;
+
+    // exponent == 0.0 -> return 1.0;
     __ comisd(exp, zero_temp);
-    __ j(PARITY_EVEN, &exp_is_nan, Assembler::kNearJump);  // NaN.
-    __ j(EQUAL, &skip_call, Assembler::kNearJump);  // exp is 0, result is 1.0.
+    __ j(PARITY_EVEN, &check_base, Assembler::kNearJump);
+    __ j(EQUAL, &skip_call, Assembler::kNearJump);  // 'result' is 1.0.
 
-    Label base_is_nan;
-    // Checks if base == 1.0.
+    __ Bind(&check_base);
+    // Note: 'exp' could be NaN.
+
+    // base == 1.0 -> return 1.0;
     __ comisd(base, result);
-    __ j(PARITY_EVEN, &base_is_nan, Assembler::kNearJump);
-    __ j(EQUAL, &skip_call, Assembler::kNearJump);  // base and result are 1.0
-    __ jmp(&do_call, Assembler::kNearJump);
+    __ j(PARITY_EVEN, &return_nan, Assembler::kNearJump);
+    __ j(EQUAL, &skip_call, Assembler::kNearJump);
+    // Note: 'base' could be NaN.
+    __ comisd(exp, base);
+    // Neither 'exp' nor 'base' is NaN.
+    __ j(PARITY_ODD, &try_sqrt, Assembler::kNearJump);
+    // Return NaN.
+    __ Bind(&return_nan);
+    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(NAN)), PP);
+    __ movsd(result, FieldAddress(temp, Double::value_offset()));
+    __ jmp(&skip_call);
 
-    __ Bind(&base_is_nan);
-    // Returns NaN.
-    __ movsd(result, base);
+    Label do_pow, return_zero;
+    __ Bind(&try_sqrt);
+    // Before calling pow, check if we could use sqrt instead of pow.
+    __ LoadObject(temp,
+        Double::ZoneHandle(Double::NewCanonical(-INFINITY)), PP);
+    __ movsd(result, FieldAddress(temp, Double::value_offset()));
+    // base == -Infinity -> call pow;
+    __ comisd(base, result);
+    __ j(EQUAL, &do_pow, Assembler::kNearJump);
+
+    // exponent == 0.5 ?
+    __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0.5)), PP);
+    __ movsd(result, FieldAddress(temp, Double::value_offset()));
+    __ comisd(exp, result);
+    __ j(NOT_EQUAL, &do_pow, Assembler::kNearJump);
+
+    // base == 0 -> return 0;
+    __ comisd(base, zero_temp);
+    __ j(EQUAL, &return_zero, Assembler::kNearJump);
+
+    __ sqrtsd(result, base);
     __ jmp(&skip_call, Assembler::kNearJump);
 
-    __ Bind(&exp_is_nan);
-    // Checks if base == 1.0.
-    __ comisd(base, result);
-    __ j(PARITY_EVEN, &base_is_nan, Assembler::kNearJump);
-    __ j(EQUAL, &skip_call, Assembler::kNearJump);  // base and result are 1.0
-    __ movsd(result, exp);  // result is NaN
-    __ jmp(&skip_call, Assembler::kNearJump);
+    __ Bind(&return_zero);
+    __ movsd(result, zero_temp);
+    __ jmp(&skip_call);
+
+    __ Bind(&do_pow);
   }
-  __ Bind(&do_call);
   __ CallRuntime(TargetFunction(), InputCount());
   __ movaps(locs()->out(0).fpu_reg(), XMM0);
   __ Bind(&skip_call);
@@ -4723,18 +4752,66 @@
 }
 
 
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const {
+  // Only use this instruction in optimized code.
+  ASSERT(opt);
+  const intptr_t kNumInputs = 1;
+  LocationSummary* summary =
+      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  if (representation() == kUnboxedDouble) {
+    if (index() == 0) {
+      summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
+                                        Location::Any()));
+    } else {
+      ASSERT(index() == 1);
+      summary->set_in(0, Location::Pair(Location::Any(),
+                                        Location::RequiresFpuRegister()));
+    }
+    summary->set_out(0, Location::RequiresFpuRegister());
+  } else {
+    ASSERT(representation() == kTagged);
+    if (index() == 0) {
+      summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                        Location::Any()));
+    } else {
+      ASSERT(index() == 1);
+      summary->set_in(0, Location::Pair(Location::Any(),
+                                        Location::RequiresRegister()));
+    }
+    summary->set_out(0, Location::RequiresRegister());
+  }
+  return summary;
+}
+
+
+void ExtractNthOutputInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(locs()->in(0).IsPairLocation());
+  PairLocation* pair = locs()->in(0).AsPairLocation();
+  Location in_loc = pair->At(index());
+  if (representation() == kUnboxedDouble) {
+    XmmRegister out = locs()->out(0).fpu_reg();
+    XmmRegister in = in_loc.fpu_reg();
+    __ movaps(out, in);
+  } else {
+    ASSERT(representation() == kTagged);
+    Register out = locs()->out(0).reg();
+    Register in = in_loc.reg();
+    __ movq(out, in);
+  }
+}
+
+
 LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const {
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
-    const intptr_t kNumTemps = 1;
+    const intptr_t kNumTemps = 0;
     LocationSummary* summary =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
     // Both inputs must be writable because they will be untagged.
     summary->set_in(0, Location::RegisterLocation(RAX));
     summary->set_in(1, Location::WritableRegister());
-    summary->set_out(0, Location::RequiresRegister());
-    // Will be used for sign extension and division.
-    summary->set_temp(0, Location::RegisterLocation(RDX));
+    summary->set_out(0, Location::Pair(Location::RegisterLocation(RAX),
+                                       Location::RegisterLocation(RDX)));
     return summary;
   }
   if (kind() == MergedMathInstr::kSinCos) {
@@ -4742,11 +4819,14 @@
     const intptr_t kNumTemps = 1;
     LocationSummary* summary =
         new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    // Because we always call into the runtime (LocationSummary::kCall) we
+    // must specify each input, temp, and output register explicitly.
     summary->set_in(0, Location::FpuRegisterLocation(XMM1));
     // R13 is chosen because it is callee saved so we do not need to back it
     // up before calling into the runtime.
     summary->set_temp(0, Location::RegisterLocation(R13));
-    summary->set_out(0, Location::RegisterLocation(RAX));
+    summary->set_out(0, Location::Pair(Location::FpuRegisterLocation(XMM2),
+                                       Location::FpuRegisterLocation(XMM3)));
     return summary;
   }
   UNIMPLEMENTED();
@@ -4770,14 +4850,16 @@
   if (kind() == MergedMathInstr::kTruncDivMod) {
     Register left = locs()->in(0).reg();
     Register right = locs()->in(1).reg();
-    Register result = locs()->out(0).reg();
+    ASSERT(locs()->out(0).IsPairLocation());
+    PairLocation* pair = locs()->out(0).AsPairLocation();
+    Register result1 = pair->At(0).reg();
+    Register result2 = pair->At(1).reg();
     Label not_32bit, done;
-    Register temp = locs()->temp(0).reg();
+    Register temp = RDX;
     ASSERT(left == RAX);
     ASSERT((right != RDX) && (right != RAX));
-    ASSERT(temp == RDX);
-    ASSERT((result != RDX) && (result != RAX));
-
+    ASSERT(result1 == RAX);
+    ASSERT(result2 == RDX);
     Range* right_range = InputAt(1)->definition()->range();
     if ((right_range == NULL) || right_range->Overlaps(0, 0)) {
       // Handle divide by zero in runtime.
@@ -4846,28 +4928,20 @@
       __ subq(RDX, right);
     }
     __ Bind(&all_done);
-    __ SmiTag(result);
 
-    __ LoadObject(result, Array::ZoneHandle(Array::New(2, Heap::kOld)), PP);
-    const intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(kArrayCid);
-    Address trunc_div_address(
-        FlowGraphCompiler::ElementAddressForIntIndex(
-            kArrayCid, index_scale, result,
-            MergedMathInstr::ResultIndexOf(Token::kTRUNCDIV)));
-    Address mod_address(
-        FlowGraphCompiler::ElementAddressForIntIndex(
-            kArrayCid, index_scale, result,
-            MergedMathInstr::ResultIndexOf(Token::kMOD)));
     __ SmiTag(RAX);
     __ SmiTag(RDX);
-    __ StoreIntoObjectNoBarrier(result, trunc_div_address, RAX);
-    __ StoreIntoObjectNoBarrier(result, mod_address, RDX);
     // FLAG_throw_on_javascript_int_overflow: not needed.
     // Note that the result of an integer division/modulo of two
     // in-range arguments, cannot create out-of-range result.
     return;
   }
   if (kind() == MergedMathInstr::kSinCos) {
+    ASSERT(locs()->out(0).IsPairLocation());
+    PairLocation* pair = locs()->out(0).AsPairLocation();
+    XmmRegister out1 = pair->At(0).fpu_reg();
+    XmmRegister out2 = pair->At(1).fpu_reg();
+
     // Save RSP.
     __ movq(locs()->temp(0).reg(), RSP);
     // +-------------------------------+
@@ -4890,27 +4964,11 @@
     __ movaps(XMM0, locs()->in(0).fpu_reg());
 
     __ CallRuntime(kSinCosRuntimeEntry, InputCount());
-    __ movsd(XMM0, Address(RSP, 2 * kWordSize + kDoubleSize * 2));  // sin.
-    __ movsd(XMM1, Address(RSP, 2 * kWordSize + kDoubleSize));  // cos.
+    __ movsd(out2, Address(RSP, 2 * kWordSize + kDoubleSize * 2));  // sin.
+    __ movsd(out1, Address(RSP, 2 * kWordSize + kDoubleSize));  // cos.
     // Restore RSP.
     __ movq(RSP, locs()->temp(0).reg());
 
-    Register result = locs()->out(0).reg();
-    const TypedData& res_array = TypedData::ZoneHandle(
-      TypedData::New(kTypedDataFloat64ArrayCid, 2, Heap::kOld));
-    __ LoadObject(result, res_array, PP);
-    const intptr_t index_scale =
-        FlowGraphCompiler::ElementSizeFor(kTypedDataFloat64ArrayCid);
-    Address sin_address(
-        FlowGraphCompiler::ElementAddressForIntIndex(
-            kTypedDataFloat64ArrayCid, index_scale, result,
-            MergedMathInstr::ResultIndexOf(MethodRecognizer::kMathSin)));
-    Address cos_address(
-        FlowGraphCompiler::ElementAddressForIntIndex(
-            kTypedDataFloat64ArrayCid, index_scale, result,
-            MergedMathInstr::ResultIndexOf(MethodRecognizer::kMathCos)));
-    __ movsd(sin_address, XMM0);
-    __ movsd(cos_address, XMM1);
     return;
   }
   UNIMPLEMENTED();
diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
new file mode 100644
index 0000000..6369048
--- /dev/null
+++ b/runtime/vm/intrinsifier_arm64.cc
@@ -0,0 +1,408 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_ARM64.
+#if defined(TARGET_ARCH_ARM64)
+
+#include "vm/intrinsifier.h"
+
+#include "vm/assembler.h"
+#include "vm/flow_graph_compiler.h"
+#include "vm/object.h"
+#include "vm/object_store.h"
+#include "vm/symbols.h"
+
+namespace dart {
+
+#define __ assembler->
+
+void Intrinsifier::List_Allocate(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Array_getLength(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::ImmutableList_getLength(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Array_getIndexed(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::ImmutableList_getIndexed(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Array_setIndexed(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+// Allocate a GrowableObjectArray using the backing array specified.
+// On stack: type argument (+1), data (+0).
+void Intrinsifier::GrowableList_Allocate(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::GrowableList_getLength(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::GrowableList_getCapacity(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::GrowableList_getIndexed(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+// Set value into growable object array at specified index.
+// On stack: growable array (+2), index (+1), value (+0).
+void Intrinsifier::GrowableList_setIndexed(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+// Set length of growable object array. The length cannot
+// be greater than the length of the data container.
+// On stack: growable array (+1), length (+0).
+void Intrinsifier::GrowableList_setLength(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+// Set data of growable object array.
+// On stack: growable array (+1), data (+0).
+void Intrinsifier::GrowableList_setData(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::GrowableList_add(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+// Gets the length of a TypedData.
+void Intrinsifier::TypedData_getLength(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+#define TYPED_DATA_ALLOCATOR(clazz)                                            \
+void Intrinsifier::TypedData_##clazz##_new(Assembler* assembler) {             \
+  UNIMPLEMENTED();                                                             \
+}                                                                              \
+void Intrinsifier::TypedData_##clazz##_factory(Assembler* assembler) {         \
+  UNIMPLEMENTED();                                                             \
+}
+CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATOR)
+#undef TYPED_DATA_ALLOCATOR
+
+
+void Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_add(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_subFromInteger(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_sub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_mul(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+// Implementation:
+//  res = left % right;
+//  if (res < 0) {
+//    if (right < 0) {
+//      res = res - right;
+//    } else {
+//      res = res + right;
+//    }
+//  }
+void Intrinsifier::Integer_moduloFromInteger(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_truncDivide(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_negate(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_bitAndFromInteger(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_bitAnd(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_bitOrFromInteger(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_bitOr(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_bitXorFromInteger(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_bitXor(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_shl(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_greaterThanFromInt(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_lessThan(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_greaterThan(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_lessEqualThan(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_greaterEqualThan(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+// This is called for Smi, Mint and Bigint receivers. The right argument
+// can be Smi, Mint, Bigint or double.
+void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_equal(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Integer_sar(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Smi_bitNegate(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Smi_bitLength(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Double_greaterThan(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Double_greaterEqualThan(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Double_lessThan(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Double_equal(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Double_lessEqualThan(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Double_add(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Double_mul(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Double_sub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Double_div(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+// Left is double right is integer (Bigint, Mint or Smi)
+void Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Double_fromInteger(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Double_getIsNaN(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Double_getIsNegative(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Double_toInt(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Math_sqrt(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+//    var state = ((_A * (_state[kSTATE_LO])) + _state[kSTATE_HI]) & _MASK_64;
+//    _state[kSTATE_LO] = state & _MASK_32;
+//    _state[kSTATE_HI] = state >> 32;
+void Intrinsifier::Random_nextState(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::Object_equal(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::String_getHashCode(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::String_getLength(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::String_codeUnitAt(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::String_getIsEmpty(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::OneByteString_getHashCode(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+// Arg0: OneByteString (receiver).
+// Arg1: Start index as Smi.
+// Arg2: End index as Smi.
+// The indexes must be valid.
+void Intrinsifier::OneByteString_substringUnchecked(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::OneByteString_setAt(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::OneByteString_allocate(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+// TODO(srdjan): Add combinations (one-byte/two-byte/external strings).
+void StringEquality(Assembler* assembler, intptr_t string_cid) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::OneByteString_equality(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void Intrinsifier::TwoByteString_equality(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index fdaf5a6..d10bef9 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -899,6 +899,8 @@
     jsheap.AddProperty("capacityOld", heap()->CapacityInWords(Heap::kOld));
   }
 
+  // TODO(turnidge): Don't compute a full stack trace every time we
+  // request an isolate's info.
   DebuggerStackTrace* stack = debugger()->StackTrace();
   if (stack->Length() > 0) {
     JSONObject jsframe(&jsobj, "topFrame");
@@ -924,7 +926,10 @@
   jsobj.AddProperty("rootLib", lib);
 
   timer_list().PrintTimersToJSONProperty(&jsobj);
-
+  {
+    JSONObject tagCounters(&jsobj, "tagCounters");
+    vm_tag_counters()->PrintToJSONObject(&tagCounters);
+  }
   if (object_store()->sticky_error() != Object::null()) {
     Error& error = Error::Handle(this, object_store()->sticky_error());
     ASSERT(!error.IsNull());
diff --git a/runtime/vm/isolate_test.cc b/runtime/vm/isolate_test.cc
index 2bb21c7..cee4b81 100644
--- a/runtime/vm/isolate_test.cc
+++ b/runtime/vm/isolate_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "platform/assert.h"
 #include "vm/globals.h"
 #include "vm/isolate.h"
@@ -80,3 +84,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index 4962f03..065e171 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -139,6 +139,20 @@
 }
 
 
+bool JSONStream::HasOption(const char* key) const {
+  ASSERT(key);
+  return LookupOption(key) != NULL;
+}
+
+
+bool JSONStream::OptionIs(const char* key, const char* value) const {
+  ASSERT(key);
+  ASSERT(value);
+  const char* key_value = LookupOption(key);
+  return (key_value != NULL) && (strcmp(key_value, value) == 0);
+}
+
+
 void JSONStream::Clear() {
   buffer_.Clear();
   open_objects_ = 0;
@@ -302,6 +316,10 @@
 
 
 void JSONStream::SetArguments(const char** arguments, intptr_t num_arguments) {
+  if (num_arguments > 0) {
+    // Set command.
+    command_ = arguments[0];
+  }
   arguments_ = arguments;
   num_arguments_ = num_arguments;
 }
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index 6b71a9d..ab06799 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -56,6 +56,12 @@
 
   const char* LookupOption(const char* key) const;
 
+  bool HasOption(const char* key) const;
+
+  // Returns true if there is an option with key and value, false
+  // otherwise.
+  bool OptionIs(const char* key, const char* value) const;
+
   const char* command() const { return command_; }
   const char** arguments() const { return arguments_; }
   const char** option_keys() const { return option_keys_; }
diff --git a/runtime/vm/json_test.cc b/runtime/vm/json_test.cc
index efe7a67..3109cce 100644
--- a/runtime/vm/json_test.cc
+++ b/runtime/vm/json_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "platform/assert.h"
 #include "platform/json.h"
 #include "vm/json_stream.h"
@@ -312,4 +316,27 @@
 }
 
 
+TEST_CASE(JSON_JSONStream_Options) {
+  const char* arguments[] = {"a", "b", "c"};
+  const char* option_keys[] = {"dog", "cat"};
+  const char* option_values[] = {"apple", "banana"};
+
+  JSONStream js;
+  EXPECT(js.num_arguments() == 0);
+  js.SetArguments(&arguments[0], 3);
+  EXPECT(js.num_arguments() == 3);
+  EXPECT_STREQ("a", js.command());
+
+  EXPECT(js.num_options() == 0);
+  js.SetOptions(&option_keys[0], &option_values[0], 3);
+  EXPECT(js.num_options() == 3);
+  EXPECT(!js.HasOption("lizard"));
+  EXPECT(js.HasOption("dog"));
+  EXPECT(js.HasOption("cat"));
+  EXPECT(js.OptionIs("cat", "banana"));
+  EXPECT(!js.OptionIs("dog", "banana"));
+}
+
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/locations.cc b/runtime/vm/locations.cc
index dd6d324..41a3d79 100644
--- a/runtime/vm/locations.cc
+++ b/runtime/vm/locations.cc
@@ -87,6 +87,22 @@
 }
 
 
+Location Location::Pair(Location first, Location second) {
+  PairLocation* pair_location = new PairLocation();
+  ASSERT((reinterpret_cast<intptr_t>(pair_location) & kLocationTagMask) == 0);
+  pair_location->SetAt(0, first);
+  pair_location->SetAt(1, second);
+  Location loc(reinterpret_cast<uword>(pair_location) | kPairLocationTag);
+  return loc;
+}
+
+
+PairLocation* Location::AsPairLocation() const {
+  ASSERT(IsPairLocation());
+  return reinterpret_cast<PairLocation*>(value_ & ~kLocationTagMask);
+}
+
+
 Location Location::RegisterOrConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafe(constant->value()))
@@ -176,8 +192,12 @@
       }
       UNREACHABLE();
     default:
-      ASSERT(IsConstant());
-      return "C";
+      if (IsConstant()) {
+        return "C";
+      } else {
+        ASSERT(IsPairLocation());
+        return "2P";
+      }
   }
   return "?";
 }
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index 43182cd..503633b 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -13,6 +13,7 @@
 
 class BufferFormatter;
 class Value;
+class PairLocation;
 
 
 enum Representation {
@@ -24,6 +25,8 @@
   kUnboxedFloat32x4,
   kUnboxedInt32x4,
   kUnboxedFloat64x2,
+  kPairOfTagged,
+  kPairOfUnboxedDouble,
   kNumRepresentations
 };
 
@@ -33,7 +36,7 @@
 // LocationSummary object which specifies expected location for every input
 // and output.
 // Each location is encoded as a single word: for non-constant locations
-// low 3 bits denote location kind, rest is kind specific location payload
+// low 4 bits denote location kind, rest is kind specific location payload
 // e.g. for REGISTER kind payload is register code (value of the Register
 // enumeration), constant locations contain a tagged (low 2 bits are set to 01)
 // Object handle.
@@ -51,15 +54,12 @@
   };
 
   static const uword kInvalidLocation = 0;
-  static const uword kConstantMask = 0x3;
-
-  static const intptr_t kMachineRegisterMask = 0x6;
-  static const intptr_t kMachineRegister = 0x6;
+  static const uword kLocationTagMask = 0x3;
 
  public:
   // Constant payload can overlap with kind field so Kind values
   // have to be chosen in a way that their last 2 bits are never
-  // the same as kConstant.
+  // the same as kConstantTag or kPairLocationTag.
   // Note that two locations with different kinds should never point to
   // the same place. For example kQuadStackSlot location should never intersect
   // with kDoubleStackSlot location.
@@ -68,30 +68,77 @@
     kInvalid = 0,
 
     // Constant value. This location contains a tagged Object handle.
-    kConstant = 1,
+    kConstantTag = 1,
+
+    // This location contains a tagged pointer to a PairLocation.
+    kPairLocationTag = 2,
 
     // Unallocated location represents a location that is not fixed and can be
     // allocated by a register allocator.  Each unallocated location has
     // a policy that specifies what kind of location is suitable. Payload
     // contains register allocation policy.
-    kUnallocated = 2,
+    kUnallocated = 3,
 
     // Spill slots allocated by the register allocator.  Payload contains
     // a spill index.
-    kStackSlot = 3,  // Word size slot.
-    kDoubleStackSlot = 4,  // 64bit stack slot.
-    kQuadStackSlot = 8,  // 128bit stack slot.
+    kStackSlot = 4,  // Word size slot.
+    kDoubleStackSlot = 7,  // 64bit stack slot.
+    kQuadStackSlot = 11,  // 128bit stack slot.
 
     // Register location represents a fixed register.  Payload contains
     // register code.
-    kRegister = 6,
+    kRegister = 8,
 
     // FpuRegister location represents a fixed fpu register.  Payload contains
     // its code.
-    kFpuRegister = 7,
+    kFpuRegister = 12,
   };
 
   Location() : value_(kInvalidLocation) {
+    // Verify that non-tagged location kinds do not interfere with location tags
+    // (kConstantTag and kPairLocationTag).
+    COMPILE_ASSERT(((kInvalid & kLocationTagMask) != kConstantTag),
+                   invalid_conflicts_with_constant_tag);
+    COMPILE_ASSERT(((kInvalid & kLocationTagMask) != kPairLocationTag),
+                   invalid_conflicts_with_pair_tag);
+
+    COMPILE_ASSERT(((kUnallocated & kLocationTagMask) != kConstantTag),
+                   unallocated_conflicts_with_constant_tag);
+    COMPILE_ASSERT(((kUnallocated & kLocationTagMask) != kPairLocationTag),
+                   unallocated_conflicts_with_pair_tag);
+
+    COMPILE_ASSERT(((kStackSlot & kLocationTagMask) != kConstantTag),
+                   stackslot_conflicts_with_constant_tag);
+    COMPILE_ASSERT(((kStackSlot & kLocationTagMask) != kPairLocationTag),
+                   stackslot_conflicts_with_pair_tag);
+
+    COMPILE_ASSERT(((kDoubleStackSlot & kLocationTagMask) != kConstantTag),
+                   doublestackslot_conflicts_with_constant_tag);
+    COMPILE_ASSERT(((kDoubleStackSlot & kLocationTagMask) != kPairLocationTag),
+                   doublestackslot_conflicts_with_pair_tag);
+
+    COMPILE_ASSERT(((kQuadStackSlot & kLocationTagMask) != kConstantTag),
+                   quadstackslot_conflicts_with_constant_tag);
+    COMPILE_ASSERT(((kQuadStackSlot & kLocationTagMask) != kPairLocationTag),
+                   quadstackslot_conflicts_with_pair_tag);
+
+    COMPILE_ASSERT(((kRegister & kLocationTagMask) != kConstantTag),
+                   register_conflicts_with_constant_tag);
+    COMPILE_ASSERT(((kRegister & kLocationTagMask) != kPairLocationTag),
+                   register_conflicts_with_pair_tag);
+
+    COMPILE_ASSERT(((kFpuRegister & kLocationTagMask) != kConstantTag),
+                   fpuregister_conflicts_with_constant_tag);
+    COMPILE_ASSERT(((kFpuRegister & kLocationTagMask) != kPairLocationTag),
+                   fpuregister_conflicts_with_pair_tag);
+
+    // Verify tags and tagmask.
+    COMPILE_ASSERT(((kConstantTag & kLocationTagMask) == kConstantTag),
+                   bad_constant_tag);
+
+    COMPILE_ASSERT(((kPairLocationTag & kLocationTagMask) == kPairLocationTag),
+                  bad_pair_tag);
+
     ASSERT(IsInvalid());
   }
 
@@ -108,21 +155,28 @@
 
   // Constants.
   bool IsConstant() const {
-    ASSERT((kConstant & kConstantMask) == kConstant);
-    return (value_ & kConstantMask) == kConstant;
+    return (value_ & kLocationTagMask) == kConstantTag;
   }
 
   static Location Constant(const Object& obj) {
-    Location loc(reinterpret_cast<uword>(&obj) | kConstant);
+    Location loc(reinterpret_cast<uword>(&obj) | kConstantTag);
     ASSERT(&obj == &loc.constant());
     return loc;
   }
 
   const Object& constant() const {
     ASSERT(IsConstant());
-    return *reinterpret_cast<const Object*>(value_ & ~kConstantMask);
+    return *reinterpret_cast<const Object*>(value_ & ~kLocationTagMask);
   }
 
+  bool IsPairLocation() const {
+    return (value_ & kLocationTagMask) == kPairLocationTag;
+  }
+
+  static Location Pair(Location first, Location second);
+
+  PairLocation* AsPairLocation() const;
+
   // Unallocated locations.
   enum Policy {
     kAny,
@@ -211,7 +265,7 @@
   }
 
   static bool IsMachineRegisterKind(Kind kind) {
-    return (kind & kMachineRegisterMask) == kMachineRegister;
+    return (kind == kRegister) || (kind == kFpuRegister);
   }
 
   static Location MachineRegisterLocation(Kind kind,
@@ -337,6 +391,40 @@
 };
 
 
+class PairLocation : public ZoneAllocated {
+ public:
+  PairLocation() {
+    for (intptr_t i = 0; i < kPairLength; i++) {
+      ASSERT(locations_[i].IsInvalid());
+    }
+  }
+
+  intptr_t length() const { return kPairLength; }
+
+  Location At(intptr_t i) const {
+    ASSERT(i >= 0);
+    ASSERT(i < kPairLength);
+    return locations_[i];
+  }
+
+  void SetAt(intptr_t i, Location loc) {
+    ASSERT(i >= 0);
+    ASSERT(i < kPairLength);
+    locations_[i] = loc;
+  }
+
+  Location* SlotAt(intptr_t i) {
+    ASSERT(i >= 0);
+    ASSERT(i < kPairLength);
+    return &locations_[i];
+  }
+
+ private:
+  static const intptr_t kPairLength = 2;
+  Location locations_[kPairLength];
+};
+
+
 class RegisterSet : public ValueObject {
  public:
   RegisterSet() : cpu_registers_(0), fpu_registers_(0) {
@@ -456,7 +544,9 @@
   }
 
   void set_out(intptr_t index, Location loc) {
-    ASSERT(!always_calls() || (loc.IsMachineRegister() || loc.IsInvalid()));
+    ASSERT(!always_calls() ||
+           (loc.IsMachineRegister() || loc.IsInvalid() ||
+            loc.IsPairLocation()));
     output_locations_[index] = loc;
   }
 
diff --git a/runtime/vm/megamorphic_cache_table.cc b/runtime/vm/megamorphic_cache_table.cc
index 473c63b..6c18cc0 100644
--- a/runtime/vm/megamorphic_cache_table.cc
+++ b/runtime/vm/megamorphic_cache_table.cc
@@ -69,7 +69,7 @@
                                      0));  // No token position.
   miss_handler_code_ = code.raw();
   miss_handler_function_ = function.raw();
-  function.SetCode(code);
+  function.AttachCode(code);
 }
 
 
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index d76e060..f745486 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -251,8 +251,9 @@
   if (FLAG_trace_isolates) {
     OS::Print("[-] Closing port:\n"
               "\thandler:    %s\n"
-              "\tport:       %" Pd64 "\n",
-              name(), port);
+              "\tport:       %" Pd64 "\n"
+              "\tports:      control(%" Pd ") live(%" Pd ")\n",
+              name(), port, control_ports_, live_ports_);
   }
 }
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index c8c2e6a..f81ec3d 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -667,7 +667,7 @@
     PcDescriptors::initializeHandle(
         empty_descriptors_,
         reinterpret_cast<RawPcDescriptors*>(address + kHeapObjectTag));
-    empty_descriptors_->raw_ptr()->length_ = Smi::New(0);
+    empty_descriptors_->raw_ptr()->length_ = 0;
   }
 
 
@@ -3197,9 +3197,6 @@
   return mixin() != Type::null();
 }
 
-bool Class::IsAnonymousMixinApplication() const {
-  return IsMixinApplication() && !is_mixin_app_alias();
-}
 
 void Class::set_patch_class(const Class& cls) const {
   ASSERT(patch_class() == Class::null());
@@ -3863,12 +3860,8 @@
   jsobj.AddProperty("library", Object::Handle(library()));
   const Script& script = Script::Handle(this->script());
   if (!script.IsNull()) {
-    intptr_t line_number = 0;
-    intptr_t column_number = 0;
-    script.GetTokenLocation(token_pos(), &line_number, &column_number);
     jsobj.AddProperty("script", script);
-    jsobj.AddProperty("line", line_number);
-    jsobj.AddProperty("col", column_number);
+    jsobj.AddProperty("tokenPos", token_pos());
   }
   {
     JSONArray interfaces_array(&jsobj, "interfaces");
@@ -4020,9 +4013,17 @@
 }
 
 
-static intptr_t FinalizeHash(uword hash) {
+static uint32_t CombineHashes(uint32_t hash, uint32_t other_hash) {
+  hash += other_hash;
+  hash += hash << 10;
+  hash ^= hash >> 6;  // Logical shift, unsigned hash.
+  return hash;
+}
+
+
+static uint32_t FinalizeHash(uint32_t hash) {
   hash += hash << 3;
-  hash ^= hash >> 11;
+  hash ^= hash >> 11;  // Logical shift, unsigned hash.
   hash += hash << 15;
   return hash;
 }
@@ -4032,13 +4033,13 @@
   if (IsNull()) return 0;
   const intptr_t num_types = Length();
   if (IsRaw(0, num_types)) return 0;
-  intptr_t result = 0;
+  uint32_t result = 0;
   AbstractType& type = AbstractType::Handle();
   for (intptr_t i = 0; i < num_types; i++) {
     type = TypeAt(i);
-    result += type.Hash();
-    result += result << 10;
-    result ^= result >> 6;
+    // The hash may be calculated during type finalization (for debugging
+    // purposes only) while a type argument is still temporarily null.
+    result = CombineHashes(result, type.IsNull() ? 0 : type.Hash());
   }
   return FinalizeHash(result);
 }
@@ -4069,8 +4070,10 @@
 }
 
 
-bool TypeArguments::IsEquivalent(const TypeArguments& other,
-                                 GrowableObjectArray* trail) const {
+bool TypeArguments::IsSubvectorEquivalent(const TypeArguments& other,
+                                          intptr_t from_index,
+                                          intptr_t len,
+                                          GrowableObjectArray* trail) const {
   if (this->raw() == other.raw()) {
     return true;
   }
@@ -4083,7 +4086,7 @@
   }
   AbstractType& type = AbstractType::Handle();
   AbstractType& other_type = AbstractType::Handle();
-  for (intptr_t i = 0; i < num_types; i++) {
+  for (intptr_t i = from_index; i < from_index + len; i++) {
     type = TypeAt(i);
     other_type = other.TypeAt(i);
     if (!type.IsEquivalent(other_type, trail)) {
@@ -4094,6 +4097,24 @@
 }
 
 
+bool TypeArguments::IsRecursive() const {
+  if (IsNull()) return false;
+  const intptr_t num_types = Length();
+  AbstractType& type = AbstractType::Handle();
+  for (intptr_t i = 0; i < num_types; i++) {
+    type = TypeAt(i);
+    // If this type argument is null, the type parameterized with this type
+    // argument is still being finalized and is definitely recursive. The null
+    // type argument will be replaced by a non-null type before the type is
+    // marked as finalized.
+    if (type.IsNull() || type.IsRecursive()) {
+      return true;
+    }
+  }
+  return false;
+}
+
+
 bool TypeArguments::IsDynamicTypes(bool raw_instantiated,
                                    intptr_t from_index,
                                    intptr_t len) const {
@@ -4102,7 +4123,6 @@
   Class& type_class = Class::Handle();
   for (intptr_t i = 0; i < len; i++) {
     type = TypeAt(from_index + i);
-    ASSERT(!type.IsNull());
     if (!type.HasResolvedTypeClass()) {
       if (raw_instantiated && type.IsTypeParameter()) {
         // An uninstantiated type parameter is equivalent to dynamic (even in
@@ -4239,24 +4259,12 @@
 }
 
 
-void TypeArguments::set_type_at(intptr_t index,
+void TypeArguments::SetTypeAt(intptr_t index,
                                 const AbstractType& value) const {
   StorePointer(TypeAddr(index), value.raw());
 }
 
 
-void TypeArguments::SetTypeAt(intptr_t index, const AbstractType& value) const {
-  const AbstractType& type_arg = AbstractType::Handle(TypeAt(index));
-  if (type_arg.IsTypeRef()) {
-    if (value.raw() != type_arg.raw()) {
-      TypeRef::Cast(type_arg).set_type(value);
-    }
-  } else {
-    set_type_at(index, value);
-  }
-}
-
-
 bool TypeArguments::IsResolved() const {
   AbstractType& type = AbstractType::Handle();
   const intptr_t num_types = Length();
@@ -4270,12 +4278,16 @@
 }
 
 
-bool TypeArguments::IsInstantiated(GrowableObjectArray* trail) const {
+bool TypeArguments::IsSubvectorInstantiated(intptr_t from_index,
+                                            intptr_t len,
+                                            GrowableObjectArray* trail) const {
+  ASSERT(!IsNull());
   AbstractType& type = AbstractType::Handle();
-  const intptr_t num_types = Length();
-  for (intptr_t i = 0; i < num_types; i++) {
-    type = TypeAt(i);
-    if (!type.IsBeingFinalized() && !type.IsInstantiated(trail)) {
+  for (intptr_t i = 0; i < len; i++) {
+    type = TypeAt(from_index + i);
+    // If the type argument is null, the type parameterized with this type
+    // argument is still being finalized. Skip this null type argument.
+    if (!type.IsNull() && !type.IsInstantiated(trail)) {
       return false;
     }
   }
@@ -4439,7 +4451,13 @@
   AbstractType& type = AbstractType::Handle();
   for (intptr_t i = 0; i < num_types; i++) {
     type = TypeAt(i);
-    if (!type.IsBeingFinalized() && !type.IsInstantiated()) {
+    // If this type argument T is null, the type A containing T in its flattened
+    // type argument vector V is recursive and is still being finalized.
+    // T is the type argument of a super type of A. T is being instantiated
+    // during finalization of V, which is also the instantiator. T depends
+    // solely on the type parameters of A and will be replaced by a non-null
+    // type before A is marked as finalized.
+    if (!type.IsNull() && !type.IsInstantiated()) {
       type = type.InstantiateFrom(instantiator_type_arguments,
                                   bound_error,
                                   trail);
@@ -4555,7 +4573,7 @@
   for (intptr_t i = 0; i < table_size; i++) {
     element ^= table.At(i);
     if (!element.IsNull()) {
-      intptr_t hash = element.Hash();
+      const intptr_t hash = element.Hash();
       ASSERT(Utils::IsPowerOfTwo(new_table_size));
       intptr_t index = hash & (new_table_size - 1);
       new_element = new_table.At(index);
@@ -4588,6 +4606,24 @@
   const Smi& used = Smi::Handle(isolate, Smi::New(used_elements));
   table.SetAt(table_size, used);
 
+#ifdef DEBUG
+  // Verify that there are no duplicates.
+  // Duplicates could appear if hash values are not kept constant across
+  // snapshots, e.g. if class ids are not preserved by the snapshots.
+  TypeArguments& other_arguments = TypeArguments::Handle();
+  for (intptr_t i = 0; i < table_size; i++) {
+    if ((i != index) && (table.At(i) != TypeArguments::null())) {
+      other_arguments ^= table.At(i);
+      if (arguments.Equals(other_arguments)) {
+        // Recursive types may be equal, but have different hashes.
+        ASSERT(arguments.IsRecursive());
+        ASSERT(other_arguments.IsRecursive());
+        ASSERT(arguments.Hash() != other_arguments.Hash());
+      }
+    }
+  }
+#endif
+
   // Rehash if table is 75% full.
   if (used_elements > ((table_size / 4) * 3)) {
     GrowCanonicalTypeArguments(isolate, table);
@@ -4649,7 +4685,7 @@
   Array& table = Array::Handle(isolate,
                                object_store->canonical_type_arguments());
   // Last element of the array is the number of used elements.
-  const intptr_t used_elements =
+  const intptr_t num_used =
       Smi::Value(Smi::RawCast(table.At(table.Length() - 1)));
   const intptr_t hash = Hash();
   intptr_t index =
@@ -4665,16 +4701,18 @@
       SetTypeAt(i, type_arg);
     }
     // Canonicalization of a recursive type may change its hash.
-    const intptr_t new_hash = Hash();
+    intptr_t canonical_hash = hash;
+    if (IsRecursive()) {
+      canonical_hash = Hash();
+    }
     // Canonicalization of the type argument's own type arguments may add an
     // entry to the table, or even grow the table, and thereby change the
     // previously calculated index.
     table = object_store->canonical_type_arguments();
-    if ((new_hash != hash) ||
-        (Smi::Value(Smi::RawCast(table.At(table.Length() - 1)))
-         != used_elements)) {
-      index =
-          FindIndexInCanonicalTypeArguments(isolate, table, *this, new_hash);
+    if ((canonical_hash != hash) ||
+        (Smi::Value(Smi::RawCast(table.At(table.Length() - 1))) != num_used)) {
+      index = FindIndexInCanonicalTypeArguments(
+          isolate, table, *this, canonical_hash);
       result ^= table.At(index);
     }
     if (result.IsNull()) {
@@ -4769,16 +4807,26 @@
 }
 
 
-void Function::SetCode(const Code& value) const {
+void Function::set_code(const Code& value) const {
   StorePointer(&raw_ptr()->code_, value.raw());
+}
+
+void Function::AttachCode(const Code& value) const {
+  set_code(value);
   ASSERT(Function::Handle(value.function()).IsNull() ||
     (value.function() == this->raw()));
   value.set_owner(*this);
 }
 
 
+bool Function::HasCode() const {
+  ASSERT(raw_ptr()->code_ != Code::null());
+  return raw_ptr()->code_ != StubCode::LazyCompile_entry()->code();
+}
+
+
 void Function::ClearCode() const {
-  StorePointer(&raw_ptr()->code_, Code::null());
+  StorePointer(&raw_ptr()->code_, StubCode::LazyCompile_entry()->code());
   StorePointer(&raw_ptr()->unoptimized_code_, Code::null());
 }
 
@@ -4805,7 +4853,7 @@
   // Patch entry of the optimized code.
   CodePatcher::PatchEntry(current_code);
   // Use previously compiled unoptimized code.
-  SetCode(Code::Handle(unoptimized_code()));
+  AttachCode(Code::Handle(unoptimized_code()));
   CodePatcher::RestoreEntry(Code::Handle(unoptimized_code()));
 }
 
@@ -5822,6 +5870,13 @@
     const ClosureData& data = ClosureData::Handle(ClosureData::New());
     result.set_data(data);
   }
+
+// TODO(zra): Remove when arm64 is ready.
+#if !defined(TARGET_ARCH_ARM64)
+  result.set_code(Code::Handle(StubCode::LazyCompile_entry()->code()));
+#else
+  result.set_code(Code::Handle());
+#endif
   return result.raw();
 }
 
@@ -5834,8 +5889,7 @@
   const PatchClass& clone_owner =
       PatchClass::Handle(PatchClass::New(new_owner, origin));
   clone.set_owner(clone_owner);
-  clone.StorePointer(&clone.raw_ptr()->code_, Code::null());
-  clone.StorePointer(&clone.raw_ptr()->unoptimized_code_, Code::null());
+  clone.ClearCode();
   clone.set_usage_counter(0);
   clone.set_deoptimization_counter(0);
   clone.set_optimized_instruction_count(0);
@@ -5862,6 +5916,7 @@
                     parent_owner,
                     token_pos));
   result.set_parent_function(parent);
+
   return result.raw();
 }
 
@@ -6353,7 +6408,12 @@
   }
   jsobj.AddProperty("name", internal_name);
   jsobj.AddProperty("user_name", user_name);
-  jsobj.AddProperty("class", cls);
+  if (cls.IsTopLevel()) {
+    const Library& library = Library::Handle(cls.library());
+    jsobj.AddProperty("owner", library);
+  } else {
+    jsobj.AddProperty("owner", cls);
+  }
   const Function& parent = Function::Handle(parent_function());
   if (!parent.IsNull()) {
     jsobj.AddProperty("parent", parent);
@@ -6373,6 +6433,13 @@
   jsobj.AddProperty("code", Object::Handle(CurrentCode()));
   jsobj.AddProperty("deoptimizations",
                     static_cast<intptr_t>(deoptimization_counter()));
+
+  const Script& script = Script::Handle(this->script());
+  if (!script.IsNull()) {
+    jsobj.AddProperty("script", script);
+    jsobj.AddProperty("tokenPos", token_pos());
+    jsobj.AddProperty("endTokenPos", end_token_pos());
+  }
 }
 
 
@@ -6669,16 +6736,15 @@
     jsobj.AddProperty("value", valueObj);
   }
 
-  jsobj.AddProperty("owner", cls);
-
-  // TODO(turnidge): Once the vmservice supports returning types,
-  // return the type here instead of the class.
-  AbstractType& declared_type = AbstractType::Handle(type());
-  if (declared_type.HasResolvedTypeClass()) {
-    cls = declared_type.type_class();
-    jsobj.AddProperty("declared_type", cls);
+  if (cls.IsTopLevel()) {
+    const Library& library = Library::Handle(cls.library());
+    jsobj.AddProperty("owner", library);
+  } else {
+    jsobj.AddProperty("owner", cls);
   }
 
+  AbstractType& declared_type = AbstractType::Handle(type());
+  jsobj.AddProperty("declared_type", declared_type);
   jsobj.AddProperty("static", is_static());
   jsobj.AddProperty("final", is_final());
   jsobj.AddProperty("const", is_const());
@@ -6703,6 +6769,12 @@
   } else {
     jsobj.AddProperty("guard_length", guarded_list_length());
   }
+  const Class& origin_cls = Class::Handle(origin());
+  const Script& script = Script::Handle(origin_cls.script());
+  if (!script.IsNull()) {
+    jsobj.AddProperty("script", script);
+    jsobj.AddProperty("token_pos", token_pos());
+  }
 }
 
 
@@ -7524,6 +7596,82 @@
 }
 
 
+RawGrowableObjectArray* Script::GenerateLineNumberArray() const {
+  const GrowableObjectArray& info =
+      GrowableObjectArray::Handle(GrowableObjectArray::New());
+  const String& source = String::Handle(Source());
+  const String& key = Symbols::Empty();
+  const Object& line_separator = Object::Handle();
+  const TokenStream& tkns = TokenStream::Handle(tokens());
+  ASSERT(!tkns.IsNull());
+  TokenStream::Iterator tkit(tkns, 0, TokenStream::Iterator::kAllTokens);
+  int current_line = -1;
+  Scanner s(source, key);
+  s.Scan();
+  bool skippedNewline = false;
+  while (tkit.CurrentTokenKind() != Token::kEOS) {
+    if (tkit.CurrentTokenKind() == Token::kNEWLINE) {
+      // Skip newlines from the token stream.
+      skippedNewline = true;
+      tkit.Advance();
+      continue;
+    }
+    if (s.current_token().kind != tkit.CurrentTokenKind()) {
+      // Suppose we have a multiline string with interpolation:
+      //
+      // 10    '''
+      // 11    bar
+      // 12    baz
+      // 13    foo is $foo
+      // 14    '''
+      //
+      // In the token stream, this becomes something like:
+      //
+      // 10    string('bar\nbaz\nfoo is\n')
+      // 11    newline
+      // 12    newline
+      // 13    string('') interpol_var(foo) string('\n')
+      // 14
+      //
+      // In order to keep the token iterator and the scanner in sync,
+      // we need to skip the extra empty string before the
+      // interpolation.
+      if (skippedNewline &&
+          (s.current_token().kind == Token::kINTERPOL_VAR ||
+           s.current_token().kind == Token::kINTERPOL_START) &&
+          tkit.CurrentTokenKind() == Token::kSTRING) {
+        const String& tokenValue = String::Handle(tkit.CurrentLiteral());
+        if (tokenValue.Length() == 0) {
+          tkit.Advance();
+        }
+      }
+    }
+    skippedNewline = false;
+    ASSERT(s.current_token().kind == tkit.CurrentTokenKind());
+    int token_line = s.current_token().position.line;
+    if (token_line != current_line) {
+      // emit line
+      info.Add(line_separator);
+      info.Add(Smi::Handle(Smi::New(token_line + line_offset())));
+      current_line = token_line;
+    }
+    // TODO(hausner): Could optimize here by not reporting tokens
+    // that will never be a location used by the debugger, e.g.
+    // braces, semicolons, most keywords etc.
+    info.Add(Smi::Handle(Smi::New(tkit.CurrentPosition())));
+    int column = s.current_token().position.column;
+    // On the first line of the script we must add the column offset.
+    if (token_line == 1) {
+      column += col_offset();
+    }
+    info.Add(Smi::Handle(Smi::New(column)));
+    tkit.Advance();
+    s.Scan();
+  }
+  return info.raw();
+}
+
+
 const char* Script::GetKindAsCString() const {
   switch (kind()) {
     case RawScript::kScriptTag:
@@ -7791,6 +7939,7 @@
 }
 
 
+// See also Dart_ScriptGetTokenInfo.
 void Script::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", JSONType(ref));
@@ -7807,6 +7956,35 @@
   }
   const String& source = String::Handle(Source());
   jsobj.AddProperty("source", source.ToCString());
+
+  // Print the line number table
+  {
+    JSONArray tokenPosTable(&jsobj, "tokenPosTable");
+
+    const GrowableObjectArray& lineNumberArray =
+        GrowableObjectArray::Handle(GenerateLineNumberArray());
+    Object& value = Object::Handle();
+    intptr_t pos = 0;
+
+    // Skip leading null.
+    ASSERT(lineNumberArray.Length() > 0);
+    value = lineNumberArray.At(pos);
+    ASSERT(value.IsNull());
+    pos++;
+
+    while (pos < lineNumberArray.Length()) {
+      JSONArray lineInfo(&tokenPosTable);
+      while (pos < lineNumberArray.Length()) {
+        value = lineNumberArray.At(pos);
+        pos++;
+        if (value.IsNull()) {
+          break;
+        }
+        const Smi& smi = Smi::Cast(value);
+        lineInfo.AddValue(smi.Value());
+      }
+    }
+  }
 }
 
 
@@ -7980,8 +8158,14 @@
 }
 
 
-void Library::AddClassMetadata(const Class& cls, intptr_t token_pos) const {
-  AddMetadata(cls, String::Handle(MakeClassMetaName(cls)), token_pos);
+void Library::AddClassMetadata(const Class& cls,
+                               const Class& toplevel_class,
+                               intptr_t token_pos) const {
+  // We use the toplevel class as the owner of a class's metadata field because
+  // a class's metadata is in scope of the library, not the class.
+  AddMetadata(toplevel_class,
+              String::Handle(MakeClassMetaName(cls)),
+              token_pos);
 }
 
 
@@ -9036,7 +9220,7 @@
     while (class_iter.HasNext()) {
       klass = class_iter.GetNextClass();
       if (!klass.IsCanonicalSignatureClass() &&
-          !klass.IsAnonymousMixinApplication()) {
+          !klass.IsMixinApplication()) {
         jsarr.AddValue(klass);
       }
     }
@@ -9638,14 +9822,12 @@
 
 
 intptr_t PcDescriptors::Length() const {
-  return Smi::Value(raw_ptr()->length_);
+  return raw_ptr()->length_;
 }
 
 
 void PcDescriptors::SetLength(intptr_t value) const {
-  // This is only safe because we create a new Smi, which does not cause
-  // heap allocation.
-  raw_ptr()->length_ = Smi::New(value);
+  raw_ptr()->length_ = value;
 }
 
 
@@ -9847,11 +10029,6 @@
 }
 
 
-void Stackmap::SetCode(const dart::Code& code) const {
-  StorePointer(&raw_ptr()->code_, code.raw());
-}
-
-
 bool Stackmap::GetBit(intptr_t bit_index) const {
   ASSERT(InRange(bit_index));
   int byte_index = bit_index >> kBitsPerByteLog2;
@@ -12551,69 +12728,23 @@
 }
 
 
-const char* Instance::ToUserCString(intptr_t max_len, intptr_t nesting) const {
-  if (IsNull()) {
-    return "null";
-  } else if (raw() == Object::sentinel().raw()) {
-    return "<not initialized>";
-  } else if (raw() == Object::transition_sentinel().raw()) {
-    return "<being initialized>";
-  } else {
-    return ToCString();
-  }
-}
-
-
-void Instance::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  JSONObject jsobj(stream);
+void Instance::PrintSharedInstanceJSON(JSONObject* jsobj, bool ref) const {
+  jsobj->AddProperty("type", JSONType(ref));
   Class& cls = Class::Handle(this->clazz());
-
-  // TODO(turnidge): Handle <optimized out> like other null-like values.
-  if (IsNull()) {
-    jsobj.AddProperty("type", ref ? "@Null" : "Null");
-    jsobj.AddProperty("id", "objects/null");
-    jsobj.AddProperty("preview", "null");
-    return;
-  } else if (raw() == Object::sentinel().raw()) {
-    jsobj.AddProperty("type", ref ? "@Null" : "Null");
-    jsobj.AddProperty("id", "objects/not-initialized");
-    jsobj.AddProperty("preview", "<not initialized>");
-    return;
-  } else if (raw() == Object::transition_sentinel().raw()) {
-    jsobj.AddProperty("type", ref ? "@Null" : "Null");
-    jsobj.AddProperty("id", "objects/being-initialized");
-    jsobj.AddProperty("preview", "<being initialized>");
-    return;
-  } else if (raw() == Symbols::OptimizedOut().raw()) {
-    // TODO(turnidge): This is a hack.  The user could have this
-    // special string in their program.  Fixing this involves updating
-    // the debugging api a bit.
-    jsobj.AddProperty("type", ref ? "@Null" : "Null");
-    jsobj.AddProperty("id", "objects/optimized-out");
-    jsobj.AddProperty("preview", "<optimized out>");
-    return;
-  } else {
-    ObjectIdRing* ring = Isolate::Current()->object_id_ring();
-    const intptr_t id = ring->GetIdForObject(raw());
-    if (IsClosure()) {
-      const Function& closureFunc = Function::Handle(Closure::function(*this));
-      jsobj.AddProperty("closureFunc", closureFunc);
-      jsobj.AddProperty("type", ref ? "@Closure" : "Closure");
-    } else {
-      jsobj.AddProperty("type", JSONType(ref));
-    }
-    jsobj.AddPropertyF("id", "objects/%" Pd "", id);
-    jsobj.AddProperty("class", cls);
-    jsobj.AddProperty("preview", ToUserCString(40));
-  }
+  jsobj->AddProperty("class", cls);
+  // TODO(turnidge): Provide the type arguments here too.
   if (ref) {
     return;
   }
 
+  if (raw()->IsHeapObject()) {
+    jsobj->AddProperty("size", raw()->Size());
+  }
+
   // Walk the superclass chain, adding all instance fields.
   {
     Instance& fieldValue = Instance::Handle();
-    JSONArray jsarr(&jsobj, "fields");
+    JSONArray jsarr(jsobj, "fields");
     while (!cls.IsNull()) {
       const Array& field_array = Array::Handle(cls.fields());
       Field& field = Field::Handle();
@@ -12633,7 +12764,7 @@
   }
 
   if (NumNativeFields() > 0) {
-    JSONArray jsarr(&jsobj, "nativeFields");
+    JSONArray jsarr(jsobj, "nativeFields");
     for (intptr_t i = 0; i < NumNativeFields(); i++) {
       intptr_t value = GetNativeField(i);
       JSONObject jsfield(&jsarr);
@@ -12641,8 +12772,41 @@
       jsfield.AddProperty("value", value);
     }
   }
+}
 
-  jsobj.AddProperty("size", raw()->Size());
+
+void Instance::PrintToJSONStream(JSONStream* stream, bool ref) const {
+  JSONObject jsobj(stream);
+
+  // Handle certain special instance values.
+  if (IsNull()) {
+    jsobj.AddProperty("type", ref ? "@Null" : "Null");
+    jsobj.AddProperty("id", "objects/null");
+    jsobj.AddProperty("valueAsString", "null");
+    return;
+  } else if (raw() == Object::sentinel().raw()) {
+    jsobj.AddProperty("type", ref ? "@Null" : "Null");
+    jsobj.AddProperty("id", "objects/not-initialized");
+    jsobj.AddProperty("valueAsString", "<not initialized>");
+    return;
+  } else if (raw() == Object::transition_sentinel().raw()) {
+    jsobj.AddProperty("type", ref ? "@Null" : "Null");
+    jsobj.AddProperty("id", "objects/being-initialized");
+    jsobj.AddProperty("valueAsString", "<being initialized>");
+    return;
+  }
+
+  PrintSharedInstanceJSON(&jsobj, ref);
+  ObjectIdRing* ring = Isolate::Current()->object_id_ring();
+  const intptr_t id = ring->GetIdForObject(raw());
+  if (IsClosure()) {
+    const Function& closureFunc = Function::Handle(Closure::function(*this));
+    jsobj.AddProperty("closureFunc", closureFunc);
+  }
+  jsobj.AddPropertyF("id", "objects/%" Pd "", id);
+  if (ref) {
+    return;
+  }
 }
 
 
@@ -12751,6 +12915,13 @@
 }
 
 
+bool AbstractType::IsRecursive() const {
+  // AbstractType is an abstract class.
+  UNREACHABLE();
+  return false;
+}
+
+
 RawAbstractType* AbstractType::InstantiateFrom(
     const TypeArguments& instantiator_type_arguments,
     Error* bound_error,
@@ -12775,6 +12946,34 @@
 }
 
 
+RawObject* AbstractType::OnlyBuddyInTrail(GrowableObjectArray* trail) const {
+  if (trail == NULL) {
+    return Object::null();
+  }
+  const intptr_t len = trail->Length();
+  ASSERT((len % 2) == 0);
+  for (intptr_t i = 0; i < len; i += 2) {
+    if (trail->At(i) == this->raw()) {
+      ASSERT(trail->At(i + 1) != Object::null());
+      return trail->At(i + 1);
+    }
+  }
+  return Object::null();
+}
+
+
+void AbstractType::AddOnlyBuddyToTrail(GrowableObjectArray** trail,
+                                       const Object& buddy) const {
+  if (*trail == NULL) {
+    *trail = &GrowableObjectArray::ZoneHandle(GrowableObjectArray::New());
+  } else {
+    ASSERT(OnlyBuddyInTrail(*trail) == Object::null());
+  }
+  (*trail)->Add(*this);
+  (*trail)->Add(buddy);
+}
+
+
 RawString* AbstractType::BuildName(NameVisibility name_visibility) const {
   if (IsBoundedType()) {
     const AbstractType& type = AbstractType::Handle(
@@ -12814,7 +13013,14 @@
   intptr_t num_type_params;  // Number of type parameters to print.
   if (HasResolvedTypeClass()) {
     const Class& cls = Class::Handle(type_class());
-    num_type_params = cls.NumTypeParameters();  // Do not print the full vector.
+    if (IsResolved() || !cls.IsMixinApplication()) {
+      // Do not print the full vector, but only the declared type parameters.
+      num_type_params = cls.NumTypeParameters();
+    } else {
+      // Do not print the type parameters of an unresolved mixin application,
+      // since it would prematurely trigger the application of the mixin type.
+      num_type_params = 0;
+    }
     if (name_visibility == kInternalName) {
       class_name = cls.Name();
     } else {
@@ -13266,8 +13472,25 @@
   if (raw_ptr()->type_state_ == RawType::kFinalizedUninstantiated) {
     return false;
   }
+  if (arguments() == TypeArguments::null()) {
+    return true;
+  }
   const TypeArguments& args = TypeArguments::Handle(arguments());
-  return args.IsNull() || args.IsInstantiated(trail);
+  const intptr_t num_type_args = args.Length();
+  intptr_t len = num_type_args;  // Check the full vector of type args.
+  ASSERT(num_type_args > 0);
+  // This type is not instantiated if it refers to type parameters.
+  // This IsInstantiated() call may be invoked on an unresolved signature type.
+  // Although this type may still be unresolved, the type parameters it may
+  // refer to are resolved by definition. We can therefore return the correct
+  // result even for an unresolved type. We just need to look at all type
+  // arguments and not just at the type parameters.
+  if (HasResolvedTypeClass()) {
+    const Class& cls = Class::Handle(type_class());
+    len = cls.NumTypeParameters();  // Check the type parameters only.
+    ASSERT(num_type_args == cls.NumTypeArguments());
+  }
+  return (len == 0) || args.IsSubvectorInstantiated(num_type_args - len, len);
 }
 
 
@@ -13281,20 +13504,40 @@
   if (IsMalformed()) {
     return raw();
   }
+  // Instantiating this type with its own type arguments as instantiator can
+  // occur during finalization and bounds checking. Return the type unchanged.
+  if (arguments() == instantiator_type_arguments.raw()) {
+    return raw();
+  }
+  // If this type is recursive, we may already be instantiating it.
+  Type& instantiated_type = Type::Handle();
+  instantiated_type ^= OnlyBuddyInTrail(trail);
+  if (!instantiated_type.IsNull()) {
+    ASSERT(IsRecursive());
+    return instantiated_type.raw();
+  }
+  // Note that the type class has to be resolved at this time, but not
+  // necessarily finalized yet. We may be checking bounds at compile time or
+  // finalizing the type argument vector of a recursive type.
+  const Class& cls = Class::Handle(type_class());
+
+  // This uninstantiated type is not modified, as it can be instantiated
+  // with different instantiators. Allocate a new instantiated version of it.
+  instantiated_type = Type::New(cls, TypeArguments::Handle(), token_pos());
   TypeArguments& type_arguments = TypeArguments::Handle(arguments());
+  ASSERT(type_arguments.Length() == cls.NumTypeArguments());
+  if (type_arguments.IsRecursive()) {
+    AddOnlyBuddyToTrail(&trail, instantiated_type);
+  }
   type_arguments = type_arguments.InstantiateFrom(instantiator_type_arguments,
                                                   bound_error,
                                                   trail);
-  // Note that the type class has to be resolved at this time, but not
-  // necessarily finalized yet. We may be checking bounds at compile time.
-  const Class& cls = Class::Handle(type_class());
-  // This uninstantiated type is not modified, as it can be instantiated
-  // with different instantiators.
-  Type& instantiated_type = Type::Handle(
-      Type::New(cls, type_arguments, token_pos()));
-  ASSERT(type_arguments.IsNull() ||
-         (type_arguments.Length() == cls.NumTypeArguments()));
-  instantiated_type.SetIsFinalized();
+  instantiated_type.set_arguments(type_arguments);
+  if (IsFinalized()) {
+    instantiated_type.SetIsFinalized();
+  } else {
+    instantiated_type.set_is_resolved();
+  }
   // Canonicalization is not part of instantiation.
   return instantiated_type.raw();
 }
@@ -13343,26 +13586,42 @@
   const TypeArguments& other_type_args = TypeArguments::Handle(
       isolate, other_type.arguments());
   if (type_args.IsNull()) {
-    return other_type_args.IsRaw(from_index, num_type_params);
+    // Ignore from_index.
+    return other_type_args.IsRaw(0, num_type_params);
   }
   if (other_type_args.IsNull()) {
-    return type_args.IsRaw(from_index, num_type_params);
+    // Ignore from_index.
+    return type_args.IsRaw(0, num_type_params);
   }
-  ASSERT(type_args.Length() >= (from_index + num_type_params));
-  ASSERT(other_type_args.Length() >= (from_index + num_type_params));
-  AbstractType& type_arg = AbstractType::Handle(isolate);
-  AbstractType& other_type_arg = AbstractType::Handle(isolate);
-  for (intptr_t i = 0; i < num_type_params; i++) {
-    type_arg = type_args.TypeAt(from_index + i);
-    other_type_arg = other_type_args.TypeAt(from_index + i);
-    if (!type_arg.IsEquivalent(other_type_arg, trail)) {
-      return false;
+  if (!type_args.IsSubvectorEquivalent(other_type_args,
+                                       from_index,
+                                       num_type_params)) {
+    return false;
+  }
+#ifdef DEBUG
+  if (from_index > 0) {
+    // Verify that the type arguments of the super class match, since they
+    // depend solely on the type parameters that were just verified to match.
+    ASSERT(type_args.Length() >= (from_index + num_type_params));
+    ASSERT(other_type_args.Length() >= (from_index + num_type_params));
+    AbstractType& type_arg = AbstractType::Handle(isolate);
+    AbstractType& other_type_arg = AbstractType::Handle(isolate);
+    for (intptr_t i = 0; i < from_index; i++) {
+      type_arg = type_args.TypeAt(i);
+      other_type_arg = other_type_args.TypeAt(i);
+      ASSERT(type_arg.IsEquivalent(other_type_arg, trail));
     }
   }
+#endif
   return true;
 }
 
 
+bool Type::IsRecursive() const {
+  return TypeArguments::Handle(arguments()).IsRecursive();
+}
+
+
 RawAbstractType* Type::CloneUnfinalized() const {
   ASSERT(IsResolved());
   if (IsFinalized()) {
@@ -13500,10 +13759,10 @@
 
 intptr_t Type::Hash() const {
   ASSERT(IsFinalized());
-  uword result = 1;
+  uint32_t result = 1;
   if (IsMalformed()) return result;
-  result += Class::Handle(type_class()).id();
-  result += TypeArguments::Handle(arguments()).Hash();
+  result = CombineHashes(result, Class::Handle(type_class()).id());
+  result = CombineHashes(result, TypeArguments::Handle(arguments()).Hash());
   return FinalizeHash(result);
 }
 
@@ -13570,10 +13829,20 @@
       char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
       OS::SNPrint(chars, len, format, class_name);
       return chars;
+    } else if (IsFinalized() && IsRecursive()) {
+      const char* format = "Type: (@%" Px " H%" Px ") class '%s', args:[%s]";
+      const intptr_t hash = Hash();
+      const char* args_cstr = TypeArguments::Handle(arguments()).ToCString();
+      const intptr_t len =
+          OS::SNPrint(NULL, 0, format, raw(), hash, class_name, args_cstr) + 1;
+      char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
+      OS::SNPrint(chars, len, format, raw(), hash, class_name, args_cstr);
+      return chars;
     } else {
       const char* format = "Type: class '%s', args:[%s]";
       const char* args_cstr = TypeArguments::Handle(arguments()).ToCString();
-      intptr_t len = OS::SNPrint(NULL, 0, format, class_name, args_cstr) + 1;
+      const intptr_t len =
+          OS::SNPrint(NULL, 0, format, class_name, args_cstr) + 1;
       char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
       OS::SNPrint(chars, len, format, class_name, args_cstr);
       return chars;
@@ -13585,18 +13854,20 @@
 
 
 void Type::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  // TODO(koda): Decide whether to assign stable ids to non-canonical types.
-  if (!IsCanonical()) {
-    return Object::PrintToJSONStream(stream, ref);
-  }
-  ASSERT(IsCanonical());
   JSONObject jsobj(stream);
-  jsobj.AddProperty("type", JSONType(ref));
-  const Class& type_cls = Class::Handle(type_class());
-  intptr_t id = type_cls.FindCanonicalTypeIndex(*this);
-  ASSERT(id >= 0);
-  intptr_t cid = type_cls.id();
-  jsobj.AddPropertyF("id", "classes/%" Pd "/types/%" Pd "", cid, id);
+  PrintSharedInstanceJSON(&jsobj, ref);
+  if (IsCanonical()) {
+    const Class& type_cls = Class::Handle(type_class());
+    intptr_t id = type_cls.FindCanonicalTypeIndex(*this);
+    ASSERT(id >= 0);
+    intptr_t cid = type_cls.id();
+    jsobj.AddPropertyF("id", "classes/%" Pd "/types/%" Pd "", cid, id);
+    jsobj.AddProperty("type_class", type_cls);
+  } else {
+    ObjectIdRing* ring = Isolate::Current()->object_id_ring();
+    const intptr_t id = ring->GetIdForObject(raw());
+    jsobj.AddPropertyF("id", "objects/%" Pd "", id);
+  }
   const char* name = String::Handle(Name()).ToCString();
   const char* user_name = String::Handle(UserVisibleName()).ToCString();
   jsobj.AddProperty("name", name);
@@ -13604,7 +13875,6 @@
   if (ref) {
     return;
   }
-  jsobj.AddProperty("type_class", type_cls);
   jsobj.AddProperty("type_arguments", TypeArguments::Handle(arguments()));
 }
 
@@ -13629,7 +13899,7 @@
 }
 
 
-RawAbstractType* TypeRef::InstantiateFrom(
+RawTypeRef* TypeRef::InstantiateFrom(
     const TypeArguments& instantiator_type_arguments,
     Error* bound_error,
     GrowableObjectArray* trail) const {
@@ -13638,21 +13908,21 @@
   if (!instantiated_type_ref.IsNull()) {
     return instantiated_type_ref.raw();
   }
-  instantiated_type_ref = TypeRef::New(Type::Handle(Type::DynamicType()));
-  AddOnlyBuddyToTrail(&trail, instantiated_type_ref);
-  const AbstractType& ref_type = AbstractType::Handle(type());
+  AbstractType& ref_type = AbstractType::Handle(type());
   ASSERT(!ref_type.IsTypeRef());
-  const AbstractType& instantiated_ref_type = AbstractType::Handle(
-      ref_type.InstantiateFrom(instantiator_type_arguments,
-                               bound_error,
-                               trail));
-  instantiated_type_ref.set_type(instantiated_ref_type);
+  AbstractType& instantiated_ref_type = AbstractType::Handle();
+  instantiated_ref_type = ref_type.InstantiateFrom(
+        instantiator_type_arguments, bound_error, trail);
+  ASSERT(!instantiated_ref_type.IsTypeRef());
+  instantiated_type_ref = TypeRef::New(instantiated_ref_type);
+  AddOnlyBuddyToTrail(&trail, instantiated_type_ref);
   return instantiated_type_ref.raw();
 }
 
 
 void TypeRef::set_type(const AbstractType& value) const {
   ASSERT(value.HasResolvedTypeClass());
+  ASSERT(!value.IsTypeRef());
   StorePointer(&raw_ptr()->type_, value.raw());
 }
 
@@ -13660,11 +13930,13 @@
 // A TypeRef cannot be canonical by definition. Only its referenced type can be.
 // Consider the type Derived, where class Derived extends Base<Derived>.
 // The first type argument of its flattened type argument vector is Derived,
-// i.e. itself, but pointer equality is not possible.
+// represented by a TypeRef pointing to itself.
 RawAbstractType* TypeRef::Canonicalize(GrowableObjectArray* trail) const {
   if (TestAndAddToTrail(&trail)) {
     return raw();
   }
+  // TODO(regis): Try to reduce the number of nodes required to represent the
+  // referenced recursive type.
   AbstractType& ref_type = AbstractType::Handle(type());
   ref_type = ref_type.Canonicalize(trail);
   set_type(ref_type);
@@ -13674,7 +13946,8 @@
 
 intptr_t TypeRef::Hash() const {
   // Do not calculate the hash of the referenced type to avoid divergence.
-  uword result = Class::Handle(AbstractType::Handle(type()).type_class()).id();
+  const uint32_t result =
+      Class::Handle(AbstractType::Handle(type()).type_class()).id();
   return FinalizeHash(result);
 }
 
@@ -13715,34 +13988,6 @@
 }
 
 
-RawObject* TypeRef::OnlyBuddyInTrail(GrowableObjectArray* trail) const {
-  if (trail == NULL) {
-    return Object::null();
-  }
-  const intptr_t len = trail->Length();
-  ASSERT((len % 2) == 0);
-  for (intptr_t i = 0; i < len; i += 2) {
-    if (trail->At(i) == this->raw()) {
-      ASSERT(trail->At(i + 1) != Object::null());
-      return trail->At(i + 1);
-    }
-  }
-  return Object::null();
-}
-
-
-void TypeRef::AddOnlyBuddyToTrail(GrowableObjectArray** trail,
-                                  const Object& buddy) const {
-  if (*trail == NULL) {
-    *trail = &GrowableObjectArray::ZoneHandle(GrowableObjectArray::New());
-  } else {
-    ASSERT(OnlyBuddyInTrail(*trail) == Object::null());
-  }
-  (*trail)->Add(*this);
-  (*trail)->Add(buddy);
-}
-
-
 RawTypeRef* TypeRef::New() {
   ASSERT(Isolate::Current()->object_store()->type_ref_class() != Class::null());
   RawObject* raw = Object::Allocate(TypeRef::kClassId,
@@ -13760,23 +14005,32 @@
 
 
 const char* TypeRef::ToCString() const {
-  const char* format = "TypeRef: %s%s";
-  const char* type_cstr = String::Handle(Class::Handle(AbstractType::Handle(
-      type()).type_class()).Name()).ToCString();
-  const char* args_cstr = (AbstractType::Handle(
-      type()).arguments() == TypeArguments::null()) ? "" : "<...>";
-  intptr_t len = OS::SNPrint(NULL, 0, format, type_cstr, args_cstr) + 1;
-  char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
-  OS::SNPrint(chars, len, format, type_cstr, args_cstr);
-  return chars;
+  const char* type_cstr = String::Handle(Class::Handle(
+      type_class()).Name()).ToCString();
+  AbstractType& ref_type = AbstractType::Handle(type());
+  if (ref_type.IsFinalized()) {
+    const char* format = "TypeRef: %s<...> (@%" Px " H%" Px ")";
+    const intptr_t hash = ref_type.Hash();
+    const intptr_t len =
+        OS::SNPrint(NULL, 0, format, type_cstr, ref_type.raw(), hash) + 1;
+    char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
+    OS::SNPrint(chars, len, format, type_cstr, ref_type.raw(), hash);
+    return chars;
+  } else {
+    const char* format = "TypeRef: %s<...>";
+    const intptr_t len = OS::SNPrint(NULL, 0, format, type_cstr) + 1;
+    char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
+    OS::SNPrint(chars, len, format, type_cstr);
+    return chars;
+  }
 }
 
 
 void TypeRef::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
+  PrintSharedInstanceJSON(&jsobj, ref);
   ObjectIdRing* ring = Isolate::Current()->object_id_ring();
   const intptr_t id = ring->GetIdForObject(raw());
-  jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "objects/%" Pd "", id);
   const char* name = String::Handle(Name()).ToCString();
   const char* user_name = String::Handle(UserVisibleName()).ToCString();
@@ -13923,10 +14177,10 @@
 
 intptr_t TypeParameter::Hash() const {
   ASSERT(IsFinalized());
-  uword result = Class::Handle(parameterized_class()).id();
+  uint32_t result = Class::Handle(parameterized_class()).id();
   // No need to include the hash of the bound, since the type parameter is fully
   // identified by its class and index.
-  result <<= index();
+  result = CombineHashes(result, index());
   return FinalizeHash(result);
 }
 
@@ -13990,16 +14244,16 @@
 
 void TypeParameter::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
+  PrintSharedInstanceJSON(&jsobj, ref);
   ObjectIdRing* ring = Isolate::Current()->object_id_ring();
   const intptr_t id = ring->GetIdForObject(raw());
-  jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "objects/%" Pd "", id);
   const char* name = String::Handle(Name()).ToCString();
   const char* user_name = String::Handle(UserVisibleName()).ToCString();
   jsobj.AddProperty("name", name);
   jsobj.AddProperty("user_name", user_name);
-  const Class& cls = Class::Handle(parameterized_class());
-  jsobj.AddProperty("parameterized_class", cls);
+  const Class& param_cls = Class::Handle(parameterized_class());
+  jsobj.AddProperty("parameterized_class", param_cls);
   if (ref) {
     return;
   }
@@ -14063,6 +14317,11 @@
 }
 
 
+bool BoundedType::IsRecursive() const {
+  return AbstractType::Handle(type()).IsRecursive();
+}
+
+
 void BoundedType::set_type(const AbstractType& value) const {
   ASSERT(value.IsFinalized() || value.IsBeingFinalized());
   ASSERT(!value.IsMalformed());
@@ -14137,11 +14396,12 @@
 
 
 intptr_t BoundedType::Hash() const {
-  uword result = AbstractType::Handle(type()).Hash();
+  uint32_t result = AbstractType::Handle(type()).Hash();
   // No need to include the hash of the bound, since the bound is defined by the
   // type parameter (modulo instantiation state).
-  result += TypeParameter::Handle(type_parameter()).Hash();
-return FinalizeHash(result);
+  result = CombineHashes(result,
+                         TypeParameter::Handle(type_parameter()).Hash());
+  return FinalizeHash(result);
 }
 
 
@@ -14187,9 +14447,9 @@
 
 void BoundedType::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
+  PrintSharedInstanceJSON(&jsobj, ref);
   ObjectIdRing* ring = Isolate::Current()->object_id_ring();
   const intptr_t id = ring->GetIdForObject(raw());
-  jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "objects/%" Pd "", id);
   const char* name = String::Handle(Name()).ToCString();
   const char* user_name = String::Handle(UserVisibleName()).ToCString();
@@ -14281,7 +14541,12 @@
 
 
 void Number::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+  JSONObject jsobj(stream);
+  PrintSharedInstanceJSON(&jsobj, ref);
+  ObjectIdRing* ring = Isolate::Current()->object_id_ring();
+  const intptr_t id = ring->GetIdForObject(raw());
+  jsobj.AddPropertyF("id", "objects/%" Pd "", id);
+  jsobj.AddProperty("valueAsString", ToCString());
 }
 
 
@@ -14723,11 +14988,9 @@
 
 void Smi::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
-  jsobj.AddProperty("type", JSONType(ref));
+  PrintSharedInstanceJSON(&jsobj, ref);
   jsobj.AddPropertyF("id", "objects/int-%" Pd "", Value());
-  class Class& cls = Class::Handle(this->clazz());
-  jsobj.AddProperty("class", cls);
-  jsobj.AddPropertyF("preview", "%" Pd "", Value());
+  jsobj.AddPropertyF("valueAsString", "%" Pd "", Value());
 }
 
 
@@ -15142,16 +15405,12 @@
  public:
   StringHasher() : hash_(0) {}
   void Add(int32_t ch) {
-    hash_ += ch;
-    hash_ += hash_ << 10;
-    hash_ ^= hash_ >> 6;
+    hash_ = CombineHashes(hash_, ch);
   }
   // Return a non-zero hash of at most 'bits' bits.
   intptr_t Finalize(int bits) {
     ASSERT(1 <= bits && bits <= (kBitsPerWord - 1));
-    hash_ += hash_ << 3;
-    hash_ ^= hash_ >> 11;
-    hash_ += hash_ << 15;
+    hash_ = FinalizeHash(hash_);
     hash_ = hash_ & ((static_cast<intptr_t>(1) << bits) - 1);
     ASSERT(hash_ <= static_cast<uint32_t>(kMaxInt32));
     return hash_ == 0 ? 1 : hash_;
@@ -15960,7 +16219,7 @@
 }
 
 
-const char* String::ToUserCString(intptr_t max_len, intptr_t nesting) const {
+const char* String::ToUserCString(intptr_t max_len) const {
   // Compute the needed length for the buffer.
   const intptr_t escaped_len = EscapedStringLen(max_len);
   intptr_t print_len = escaped_len;
@@ -15997,7 +16256,21 @@
 
 
 void String::PrintToJSONStream(JSONStream* stream, bool ref) const {
-  Instance::PrintToJSONStream(stream, ref);
+  JSONObject jsobj(stream);
+  if (raw() == Symbols::OptimizedOut().raw()) {
+    // TODO(turnidge): This is a hack.  The user could have this
+    // special string in their program.  Fixing this involves updating
+    // the debugging api a bit.
+    jsobj.AddProperty("type", ref ? "@Null" : "Null");
+    jsobj.AddProperty("id", "objects/optimized-out");
+    jsobj.AddProperty("valueAsString", "<optimized out>");
+    return;
+  }
+  PrintSharedInstanceJSON(&jsobj, ref);
+  ObjectIdRing* ring = Isolate::Current()->object_id_ring();
+  const intptr_t id = ring->GetIdForObject(raw());
+  jsobj.AddPropertyF("id", "objects/%" Pd "", id);
+  jsobj.AddProperty("valueAsString", ToUserCString(1024));
 }
 
 
@@ -16795,7 +17068,7 @@
   jsobj.AddPropertyF("id", "objects/bool-%s", str);
   class Class& cls = Class::Handle(this->clazz());
   jsobj.AddProperty("class", cls);
-  jsobj.AddPropertyF("preview", "%s", str);
+  jsobj.AddPropertyF("valueAsString", "%s", str);
 }
 
 
@@ -16880,12 +17153,10 @@
 
 void Array::PrintToJSONStream(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
-  Class& cls = Class::Handle(this->clazz());
+  PrintSharedInstanceJSON(&jsobj, ref);
   ObjectIdRing* ring = Isolate::Current()->object_id_ring();
   const intptr_t id = ring->GetIdForObject(raw());
-  jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "objects/%" Pd "", id);
-  jsobj.AddProperty("class", cls);
   jsobj.AddProperty("length", Length());
   if (ref) {
     return;
@@ -17116,115 +17387,13 @@
 }
 
 
-const char* GrowableObjectArray::ToUserCString(intptr_t max_len,
-                                               intptr_t nesting) const {
-  if (Length() == 0) {
-    return "[]";
-  }
-  if (nesting > 3) {
-    return "[...]";
-  }
-
-  Isolate* isolate = Isolate::Current();
-  Zone* zone = isolate->current_zone();
-  Object& obj = Object::Handle(isolate);
-  Instance& element = Instance::Handle(isolate);
-
-  // Pre-print the suffix that we will use if the string is truncated.
-  // It is important to know the suffix length when deciding where to
-  // limit the list.
-  const intptr_t kMaxTruncSuffixLen = 16;
-  char trunc_suffix[kMaxTruncSuffixLen];
-  intptr_t trunc_suffix_len;
-  if (nesting == 0) {
-    trunc_suffix_len = OS::SNPrint(trunc_suffix, 16, "...](length:%" Pd ")",
-                                   Length());
-  } else {
-    trunc_suffix_len = OS::SNPrint(trunc_suffix, 16, "...]");
-  }
-  bool truncate = false;
-
-  const int kMaxPrintElements = 128;
-  const char* strings[kMaxPrintElements];
-  intptr_t print_len = 1;  // +1 for "["
-
-  // Figure out how many elements will fit in the string.
-  int i = 0;
-  while (i < Length()) {
-    if (i == kMaxPrintElements) {
-      if (i < Length()) {
-        truncate = true;
-      }
-      break;
-    }
-    obj = At(i);
-    if (!obj.IsNull() && !obj.IsInstance()) {
-      UNREACHABLE();
-      return "[<invalid list>]";
-    }
-    element ^= obj.raw();
-
-    // Choose max child length.  This is chosen so that it is small
-    // enough to maybe fit but not so small that we can't print
-    // anything.
-    int child_max_len = max_len - print_len;
-    if ((i + 1) < Length()) {
-      child_max_len -= (trunc_suffix_len + 1);  // 1 for ","
-    } else {
-      child_max_len -= 1;  // 1 for "]"
-    }
-    if (child_max_len < 8) {
-      child_max_len = 8;
-    }
-
-    strings[i] = element.ToUserCString(child_max_len,  nesting + 1);
-    print_len += strlen(strings[i]) + 1;  // +1 for "," or "]"
-    i++;
-    if (print_len > max_len) {
-      truncate = true;
-      break;
-    }
-  }
-  if (truncate) {
-    // Go backwards until there is enough room for the truncation suffix.
-    while (i >= 0 && (print_len + trunc_suffix_len) > max_len) {
-      i--;
-      print_len -= (strlen(strings[i]) + 1);  // +1 for ","
-    }
-  }
-
-  // Finally, allocate and print the string.
-  int num_to_print = i;
-  char* buffer = zone->Alloc<char>(print_len + 1);  // +1 for "\0"
-  intptr_t pos = 0;
-  buffer[pos++] = '[';
-  for (i = 0; i < num_to_print; i++) {
-    if ((i + 1) == Length()) {
-      pos += OS::SNPrint((buffer + pos), (max_len + 1 - pos),
-                         "%s]", strings[i]);
-    } else {
-      pos += OS::SNPrint((buffer + pos), (max_len + 1 - pos),
-                         "%s,", strings[i]);
-    }
-  }
-  if (i < Length()) {
-    pos += OS::SNPrint((buffer + pos), (max_len + 1 - pos), "%s", trunc_suffix);
-  }
-  ASSERT(pos <= max_len);
-  buffer[pos] = '\0';
-  return buffer;
-}
-
-
 void GrowableObjectArray::PrintToJSONStream(JSONStream* stream,
                                             bool ref) const {
   JSONObject jsobj(stream);
-  Class& cls = Class::Handle(this->clazz());
+  PrintSharedInstanceJSON(&jsobj, ref);
   ObjectIdRing* ring = Isolate::Current()->object_id_ring();
   const intptr_t id = ring->GetIdForObject(raw());
-  jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "objects/%" Pd "", id);
-  jsobj.AddProperty("class", cls);
   jsobj.AddProperty("length", Length());
   if (ref) {
     return;
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 9d6d35a..5ba48aa 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -817,8 +817,8 @@
   RawType* mixin() const { return raw_ptr()->mixin_; }
   void set_mixin(const Type& value) const;
 
+  // Note this returns false for mixin application aliases.
   bool IsMixinApplication() const;
-  bool IsAnonymousMixinApplication() const;
 
   RawClass* patch_class() const {
     return raw_ptr()->patch_class_;
@@ -1298,24 +1298,39 @@
     return TypeTest(kIsMoreSpecificThan, other, from_index, len, bound_error);
   }
 
-  // Check if the vectors are equal.
+  // Check if the vectors are equal (they may be null).
   bool Equals(const TypeArguments& other) const {
-    return IsEquivalent(other);
+    return IsSubvectorEquivalent(other, 0, IsNull() ? 0 : Length());
   }
 
   bool IsEquivalent(const TypeArguments& other,
-                    GrowableObjectArray* trail = NULL) const;
+                    GrowableObjectArray* trail = NULL) const {
+    return IsSubvectorEquivalent(other, 0, IsNull() ? 0 : Length(), trail);
+  }
+  bool IsSubvectorEquivalent(const TypeArguments& other,
+                             intptr_t from_index,
+                             intptr_t len,
+                             GrowableObjectArray* trail = NULL) const;
 
-  bool IsInstantiated(GrowableObjectArray* trail = NULL) const;
+  // Check if the vector is instantiated (it must not be null).
+  bool IsInstantiated(GrowableObjectArray* trail = NULL) const {
+    return IsSubvectorInstantiated(0, Length(), trail);
+  }
+  bool IsSubvectorInstantiated(intptr_t from_index,
+                               intptr_t len,
+                               GrowableObjectArray* trail = NULL) const;
   bool IsUninstantiatedIdentity() const;
   bool CanShareInstantiatorTypeArguments(const Class& instantiator_class) const;
 
-  // Returns true if all types of this vector are respectively, resolved,
+  // Return true if all types of this vector are respectively, resolved,
   // finalized, or bounded.
   bool IsResolved() const;
   bool IsFinalized() const;
   bool IsBounded() const;
 
+  // Return true if this vector contains a recursive type argument.
+  bool IsRecursive() const;
+
   // Clone this type argument vector and clone all unfinalized type arguments.
   // Finalized type arguments are shared.
   RawTypeArguments* CloneUnfinalized() const;
@@ -1399,7 +1414,6 @@
 
   RawArray* instantiations() const;
   void set_instantiations(const Array& value) const;
-  void set_type_at(intptr_t index, const AbstractType& value) const;
   RawAbstractType** TypeAddr(intptr_t index) const;
   void SetLength(intptr_t value) const;
 
@@ -1499,8 +1513,9 @@
   void set_parameter_names(const Array& value) const;
 
   // Sets function's code and code's function.
-  void SetCode(const Code& value) const;
-  void  ClearCode() const;
+  void AttachCode(const Code& value) const;
+  void set_code(const Code& value) const;
+  void ClearCode() const;
 
   // Disables optimized code and switches to unoptimized code.
   void SwitchToUnoptimizedCode() const;
@@ -1515,7 +1530,7 @@
   static intptr_t unoptimized_code_offset() {
     return OFFSET_OF(RawFunction, unoptimized_code_);
   }
-  inline bool HasCode() const;
+  bool HasCode() const;
 
   // Returns true if there is at least one debugger breakpoint
   // set in this function.
@@ -2383,6 +2398,7 @@
   bool HasSource() const;
   RawString* Source() const;
   RawString* GenerateSource() const;  // Generates source code from Tokenstream.
+  RawGrowableObjectArray* GenerateLineNumberArray() const;
   RawScript::Kind kind() const {
     return static_cast<RawScript::Kind>(raw_ptr()->kind_);
   }
@@ -2560,7 +2576,9 @@
 
   void AddExport(const Namespace& ns) const;
 
-  void AddClassMetadata(const Class& cls, intptr_t token_pos) const;
+  void AddClassMetadata(const Class& cls,
+                        const Class& toplevel_class,
+                        intptr_t token_pos) const;
   void AddFieldMetadata(const Field& field, intptr_t token_pos) const;
   void AddFunctionMetadata(const Function& func, intptr_t token_pos) const;
   void AddLibraryMetadata(const Class& cls, intptr_t token_pos) const;
@@ -2952,9 +2970,6 @@
     return GetBit(index);
   }
 
-  RawCode* Code() const { return raw_ptr()->code_; }
-  void SetCode(const dart::Code& code) const;
-
   intptr_t Length() const { return raw_ptr()->length_; }
 
   uword PC() const { return raw_ptr()->pc_; }
@@ -4024,20 +4039,15 @@
   // error object if evaluating the expression fails.
   RawObject* Evaluate(const String& expr) const;
 
-  // Returns a string representation of this instance in a form
-  // that is suitable for an end user.
-  //
-  // max_len is advisory, and the returned string may exceed this max
-  // length.
-  virtual const char* ToUserCString(intptr_t max_len = 40,
-                                    intptr_t nesting = 0) const;
-
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawInstance));
   }
 
   static RawInstance* New(const Class& cls, Heap::Space space = Heap::kNew);
 
+ protected:
+  virtual void PrintSharedInstanceJSON(JSONObject* jsobj, bool ref) const;
+
  private:
   RawObject** FieldAddrAtOffset(intptr_t offset) const {
     ASSERT(IsValidFieldOffset(offset));
@@ -4144,6 +4154,7 @@
   }
   virtual bool IsEquivalent(const Instance& other,
                             GrowableObjectArray* trail = NULL) const;
+  virtual bool IsRecursive() const;
 
   // Instantiate this type using the given type argument vector.
   // Return a new type, or return 'this' if it is already instantiated.
@@ -4166,6 +4177,15 @@
   virtual RawAbstractType* Canonicalize(
       GrowableObjectArray* trail = NULL) const;
 
+  // Return the object associated with the receiver in the trail or
+  // Object::null() if the receiver is not contained in the trail.
+  RawObject* OnlyBuddyInTrail(GrowableObjectArray* trail) const;
+
+  // If the trail is null, allocate a trail, add the pair <receiver, buddy> to
+  // the trail. The receiver may only be added once with its only buddy.
+  void AddOnlyBuddyToTrail(GrowableObjectArray** trail,
+                           const Object& buddy) const;
+
   // The name of this type, including the names of its type arguments, if any.
   virtual RawString* Name() const {
     return BuildName(kInternalName);
@@ -4299,6 +4319,7 @@
   virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const;
   virtual bool IsEquivalent(const Instance& other,
                             GrowableObjectArray* trail = NULL) const;
+  virtual bool IsRecursive() const;
   virtual RawAbstractType* InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
       Error* malformed_error,
@@ -4417,7 +4438,8 @@
   virtual bool IsInstantiated(GrowableObjectArray* trail = NULL) const;
   virtual bool IsEquivalent(const Instance& other,
                             GrowableObjectArray* trail = NULL) const;
-  virtual RawAbstractType* InstantiateFrom(
+  virtual bool IsRecursive() const { return true; }
+  virtual RawTypeRef* InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
       Error* bound_error,
       GrowableObjectArray* trail = NULL) const;
@@ -4438,15 +4460,6 @@
   bool TestAndAddBuddyToTrail(GrowableObjectArray** trail,
                               const Object& buddy) const;
 
-  // Return the object associated with the receiver in the trail or
-  // Object::null() if the receiver is not contained in the trail.
-  RawObject* OnlyBuddyInTrail(GrowableObjectArray* trail) const;
-
-  // If the trail is null, allocate a trail, add the pair <receiver, buddy> to
-  // the trail. The receiver may only be added once with its only buddy.
-  void AddOnlyBuddyToTrail(GrowableObjectArray** trail,
-                           const Object& buddy) const;
-
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawTypeRef));
   }
@@ -4505,6 +4518,7 @@
   }
   virtual bool IsEquivalent(const Instance& other,
                             GrowableObjectArray* trail = NULL) const;
+  virtual bool IsRecursive() const { return false; }
   virtual RawAbstractType* InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
       Error* bound_error,
@@ -4588,6 +4602,7 @@
   }
   virtual bool IsEquivalent(const Instance& other,
                             GrowableObjectArray* trail = NULL) const;
+  virtual bool IsRecursive() const;
   virtual RawAbstractType* InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
       Error* bound_error,
@@ -5113,6 +5128,9 @@
 
   void ToUTF8(uint8_t* utf8_array, intptr_t array_len) const;
 
+  // Produces a quoted, escaped, (possibly) truncated string.
+  const char* ToUserCString(intptr_t max_len) const;
+
   // Copies the string characters into the provided external array
   // and morphs the string object into an external string object.
   // The remaining unused part of the original string object is marked as
@@ -5123,10 +5141,6 @@
                           void* peer,
                           Dart_PeerFinalizer cback) const;
 
-  // Produces a quoted, escaped, (possibly) truncated string.
-  const char* ToUserCString(intptr_t max_len = 40,
-                            intptr_t nesting = 0) const;
-
   // Creates a new String object from a C string that is assumed to contain
   // UTF-8 encoded characters and '\0' is considered a termination character.
   // TODO(7123) - Rename this to FromCString(....).
@@ -5873,11 +5887,6 @@
     return Instance::null();
   }
 
-  // Produces a readable representation of this array, e.g. '[1,2,3]',
-  // subject to length limits.
-  const char* ToUserCString(intptr_t max_len = 40,
-                            intptr_t nesting = 0) const;
-
   static intptr_t type_arguments_offset() {
     return OFFSET_OF(RawGrowableObjectArray, type_arguments_);
   }
@@ -6671,11 +6680,6 @@
 }
 
 
-bool Function::HasCode() const {
-  return raw_ptr()->code_ != Code::null();
-}
-
-
 intptr_t Field::Offset() const {
   ASSERT(!is_static());  // Offset is valid only for instance fields.
   intptr_t value = Smi::Value(reinterpret_cast<RawSmi*>(raw_ptr()->value_));
diff --git a/runtime/vm/object_arm64_test.cc b/runtime/vm/object_arm64_test.cc
new file mode 100644
index 0000000..77096ff
--- /dev/null
+++ b/runtime/vm/object_arm64_test.cc
@@ -0,0 +1,11 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "platform/assert.h"
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_ARM64)
+
+// TODO(zra): Port these tests.
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/object_id_ring_test.cc b/runtime/vm/object_id_ring_test.cc
index aeae8e2..ca764e4 100644
--- a/runtime/vm/object_id_ring_test.cc
+++ b/runtime/vm/object_id_ring_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "platform/assert.h"
 #include "vm/globals.h"
 #include "vm/object_id_ring.h"
@@ -190,3 +194,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 91d4d1e..052b904 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "vm/assembler.h"
 #include "vm/bigint_operations.h"
 #include "vm/class_finalizer.h"
@@ -3923,55 +3927,40 @@
       "var toolong2 = "
       "'0123456789012345678901234567890123\\t567890123456789howdy';\n"
       "var toolong3 = "
-      "'012345678901234567890123456789\\u0001567890123456789howdy';\n"
-      "\n"
-      "class _Cobra { }\n"
-      "var instance = new _Cobra();\n"
-      "\n"
-      "var empty_list = [];\n"
-      "var simple_list = [1,2,'otter'];\n"
-      "var nested_list = [[[[1]]],[2,'otter']];\n"
-      "var deeply_nested_list = [[[[[1]]]],[2,'otter']];\n"
-      "var toolong_list = "
-      "['0123456789','0123456789','0123456789','0123456789'];\n"
-      "var toolong2_list = [toolong];\n"
-      "var justenough_list = [0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,99];"
-      "var toolong3_list = [0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,3,4];"
-      "\n"
-      "var simple_map = {1: 2, 2: 'otter'};\n";
+      "'012345678901234567890123456789\\u0001567890123456789howdy';\n";
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   EXPECT_VALID(lib);
 
-  Instance& obj = Instance::Handle();
+  String& obj = String::Handle();
   Dart_Handle result;
 
   // Simple string.
   result = Dart_GetField(lib, NewString("simple"));
   EXPECT_VALID(result);
   obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("\"simple\"", obj.ToUserCString());
+  EXPECT_STREQ("\"simple\"", obj.ToUserCString(40));
 
   // Escaped chars.
   result = Dart_GetField(lib, NewString("escapes"));
   EXPECT_VALID(result);
   obj ^= Api::UnwrapHandle(result);
   EXPECT_STREQ("\"stuff\\n\\r\\f\\b\\t\\v'\\\"\\$stuff\"",
-               obj.ToUserCString());
+               obj.ToUserCString(40));
 
   // U-escaped chars.
   result = Dart_GetField(lib, NewString("uescapes"));
   EXPECT_VALID(result);
   obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("\"stuff\\u0001\\u0002stuff\"", obj.ToUserCString());
+  EXPECT_STREQ("\"stuff\\u0001\\u0002stuff\"", obj.ToUserCString(40));
 
   // Truncation.
   result = Dart_GetField(lib, NewString("toolong"));
   EXPECT_VALID(result);
   obj ^= Api::UnwrapHandle(result);
   EXPECT_STREQ("\"01234567890123456789012345678901234\"...",
-               obj.ToUserCString());
+               obj.ToUserCString(40));
 
-  // Truncation.  Custom limit.
+  // Truncation, shorter.
   result = Dart_GetField(lib, NewString("toolong"));
   EXPECT_VALID(result);
   obj ^= Api::UnwrapHandle(result);
@@ -3982,80 +3971,14 @@
   EXPECT_VALID(result);
   obj ^= Api::UnwrapHandle(result);
   EXPECT_STREQ("\"0123456789012345678901234567890123\"...",
-               obj.ToUserCString());
+               obj.ToUserCString(40));
 
   // Truncation, limit is in u-escape
   result = Dart_GetField(lib, NewString("toolong3"));
   EXPECT_VALID(result);
   obj ^= Api::UnwrapHandle(result);
   EXPECT_STREQ("\"012345678901234567890123456789\"...",
-               obj.ToUserCString());
-
-  // Instance of a class.
-  result = Dart_GetField(lib, NewString("instance"));
-  EXPECT_VALID(result);
-  obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("Instance of '_Cobra'", obj.ToUserCString());
-
-  // Empty list.
-  result = Dart_GetField(lib, NewString("empty_list"));
-  EXPECT_VALID(result);
-  obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("[]", obj.ToUserCString());
-
-  // Simple list.
-  result = Dart_GetField(lib, NewString("simple_list"));
-  EXPECT_VALID(result);
-  obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("[1,2,\"otter\"]", obj.ToUserCString());
-
-  // Nested list.
-  result = Dart_GetField(lib, NewString("nested_list"));
-  EXPECT_VALID(result);
-  obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("[[[[1]]],[2,\"otter\"]]", obj.ToUserCString());
-
-  // Deeply ested list.
-  result = Dart_GetField(lib, NewString("deeply_nested_list"));
-  EXPECT_VALID(result);
-  obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("[[[[[...]]]],[2,\"otter\"]]", obj.ToUserCString());
-
-  // Truncation.
-  result = Dart_GetField(lib, NewString("toolong_list"));
-  EXPECT_VALID(result);
-  obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("[\"0123456789\",\"012345\"...,...](length:4)",
-               obj.ToUserCString());
-
-  // More truncation.
-  result = Dart_GetField(lib, NewString("toolong2_list"));
-  EXPECT_VALID(result);
-  obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("[\"012345678901234567890123456789012\"...]",
-               obj.ToUserCString());
-
-  // Just fits.
-  result = Dart_GetField(lib, NewString("justenough_list"));
-  EXPECT_VALID(result);
-  obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("[0,1,2,3,4,0,1,2,3,4,0,1,2,3,4,0,1,2,99]",
-               obj.ToUserCString());
-
-  // Just too big, small elements.
-  result = Dart_GetField(lib, NewString("toolong3_list"));
-  EXPECT_VALID(result);
-  obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("[0,1,2,3,4,0,1,2,3,4,0,1,...](length:20)",
-               obj.ToUserCString());
-
-  // Simple map.
-  //
-  // TODO(turnidge): Consider showing something like: {1: 2, 2: 'otter'}
-  result = Dart_GetField(lib, NewString("simple_map"));
-  EXPECT_VALID(result);
-  obj ^= Api::UnwrapHandle(result);
-  EXPECT_STREQ("Instance of '_LinkedHashMap'", obj.ToUserCString());
+               obj.ToUserCString(40));
 }
 
 
@@ -4090,3 +4013,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index 96accfd..0aaad3c 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -59,6 +59,8 @@
     const char arch[] = "x64";
 #elif defined(TARGET_ARCH_ARM)
     const char arch[] = "arm";
+#elif defined(TARGET_ARCH_ARM64)
+    const char arch[] = "arm64";
 #elif defined(TARGET_ARCH_MIPS)
     const char arch[] = "mips";
 #else
@@ -355,6 +357,8 @@
   static const uint32_t kElfMachIA32 = 3;
   static const uint32_t kElfMachX64 = 62;
   static const uint32_t kElfMachARM = 40;
+  // TODO(zra): Find the right ARM64 constant.
+  static const uint32_t kElfMachARM64 = 40;
   static const uint32_t kElfMachMIPS = 10;
   static const int kInvalidClockId = -1;
 
@@ -405,6 +409,8 @@
     return kElfMachX64;
 #elif defined(TARGET_ARCH_ARM)
     return kElfMachARM;
+#elif defined(TARGET_ARCH_ARM64)
+    return kElfMachARM64;
 #elif defined(TARGET_ARCH_MIPS)
     return kElfMachMIPS;
 #else
@@ -570,7 +576,9 @@
 // TODO(5411554):  May need to hoist these architecture dependent code
 // into a architecture specific file e.g: os_ia32_linux.cc
 word OS::ActivationFrameAlignment() {
-#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
+#if defined(TARGET_ARCH_IA32) ||                                               \
+    defined(TARGET_ARCH_X64) ||                                                \
+    defined(TARGET_ARCH_ARM64)
   const int kMinimumAlignment = 16;
 #elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
   const int kMinimumAlignment = 8;
@@ -588,7 +596,9 @@
 
 
 word OS::PreferredCodeAlignment() {
-#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
+#if defined(TARGET_ARCH_IA32) ||                                               \
+    defined(TARGET_ARCH_X64) ||                                                \
+    defined(TARGET_ARCH_ARM64)
   const int kMinimumAlignment = 32;
 #elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
   const int kMinimumAlignment = 16;
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 23fef6f..1b34b63 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -124,9 +124,6 @@
       pages_tail_(NULL),
       large_pages_(NULL),
       max_capacity_in_words_(max_capacity_in_words),
-      capacity_in_words_(0),
-      used_in_words_(0),
-      external_in_words_(0),
       sweeping_(false),
       page_space_controller_(FLAG_heap_growth_space_ratio,
                              FLAG_heap_growth_rate,
@@ -165,7 +162,7 @@
     }
   }
   pages_tail_ = page;
-  capacity_in_words_ += kPageSizeInWords;
+  usage_.capacity_in_words += kPageSizeInWords;
   page->set_object_end(page->memory_->end());
   return page;
 }
@@ -176,7 +173,7 @@
   HeapPage* page = HeapPage::Allocate(page_size_in_words, type);
   page->set_next(large_pages_);
   large_pages_ = page;
-  capacity_in_words_ += page_size_in_words;
+  usage_.capacity_in_words += page_size_in_words;
   // Only one object in this page.
   page->set_object_end(page->object_start() + size);
   return page;
@@ -184,7 +181,7 @@
 
 
 void PageSpace::FreePage(HeapPage* page, HeapPage* previous_page) {
-  capacity_in_words_ -= (page->memory_->size() >> kWordSizeLog2);
+  usage_.capacity_in_words -= (page->memory_->size() >> kWordSizeLog2);
   // Remove the page from the list.
   if (previous_page != NULL) {
     previous_page->set_next(page->next());
@@ -200,7 +197,7 @@
 
 
 void PageSpace::FreeLargePage(HeapPage* page, HeapPage* previous_page) {
-  capacity_in_words_ -= (page->memory_->size() >> kWordSizeLog2);
+  usage_.capacity_in_words -= (page->memory_->size() >> kWordSizeLog2);
   // Remove the page from the list.
   if (previous_page != NULL) {
     previous_page->set_next(page->next());
@@ -227,23 +224,28 @@
   ASSERT(size >= kObjectAlignment);
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
   uword result = 0;
+  SpaceUsage after_allocation = usage_;
+  after_allocation.used_in_words += size >> kWordSizeLog2;
   if (size < kAllocatablePageSize) {
     const bool is_protected = (type == HeapPage::kExecutable)
         && FLAG_write_protect_code;
     result = freelist_[type].TryAllocate(size, is_protected);
-    if ((result == 0) &&
-        (page_space_controller_.CanGrowPageSpace(size) ||
-         growth_policy == kForceGrowth) &&
-        CanIncreaseCapacityInWords(kPageSizeInWords)) {
-      HeapPage* page = AllocatePage(type);
-      ASSERT(page != NULL);
-      // Start of the newly allocated page is the allocated object.
-      result = page->object_start();
-      // Enqueue the remainder in the free list.
-      uword free_start = result + size;
-      intptr_t free_size = page->object_end() - free_start;
-      if (free_size > 0) {
-        freelist_[type].Free(free_start, free_size);
+    if (result == 0) {
+      // Can we grow by one page?
+      after_allocation.capacity_in_words += kPageSizeInWords;
+      if ((!page_space_controller_.NeedsGarbageCollection(after_allocation) ||
+           growth_policy == kForceGrowth) &&
+          CanIncreaseCapacityInWords(kPageSizeInWords)) {
+        HeapPage* page = AllocatePage(type);
+        ASSERT(page != NULL);
+        // Start of the newly allocated page is the allocated object.
+        result = page->object_start();
+        // Enqueue the remainder in the free list.
+        uword free_start = result + size;
+        intptr_t free_size = page->object_end() - free_start;
+        if (free_size > 0) {
+          freelist_[type].Free(free_start, free_size);
+        }
       }
     }
   } else {
@@ -253,7 +255,8 @@
       // On overflow we fail to allocate.
       return 0;
     }
-    if ((page_space_controller_.CanGrowPageSpace(size) ||
+    after_allocation.capacity_in_words += page_size_in_words;
+    if ((!page_space_controller_.NeedsGarbageCollection(after_allocation) ||
          growth_policy == kForceGrowth) &&
         CanIncreaseCapacityInWords(page_size_in_words)) {
       HeapPage* page = AllocateLargePage(size, type);
@@ -263,7 +266,7 @@
     }
   }
   if (result != 0) {
-    used_in_words_ += (size >> kWordSizeLog2);
+    usage_ = after_allocation;
     if (FLAG_compiler_stats && (type == HeapPage::kExecutable)) {
       CompilerStats::code_allocated += size;
     }
@@ -275,13 +278,14 @@
 
 void PageSpace::AllocateExternal(intptr_t size) {
   intptr_t size_in_words = size >> kWordSizeLog2;
-  external_in_words_ += size_in_words;
+  usage_.external_in_words += size_in_words;
+  // TODO(koda): Control growth.
 }
 
 
 void PageSpace::FreeExternal(intptr_t size) {
   intptr_t size_in_words = size >> kWordSizeLog2;
-  external_in_words_ -= size_in_words;
+  usage_.external_in_words -= size_in_words;
 }
 
 
@@ -530,7 +534,8 @@
   }
 
   // Save old value before GCMarker visits the weak persistent handles.
-  intptr_t external_before_in_words = external_in_words_;
+  SpaceUsage usage_before = usage_;
+  usage_.used_in_words = 0;
 
   // Mark all reachable old-gen objects.
   bool collect_code = FLAG_collect_code && ShouldCollectCode();
@@ -547,7 +552,6 @@
   int64_t mid2 = OS::GetCurrentTimeMicros();
 
   GCSweeper sweeper(heap_);
-  intptr_t used_in_words = 0;
 
   HeapPage* prev_page = NULL;
   HeapPage* page = pages_;
@@ -557,7 +561,7 @@
     if (page_in_use == 0) {
       FreePage(page, prev_page);
     } else {
-      used_in_words += (page_in_use >> kWordSizeLog2);
+      usage_.used_in_words += (page_in_use >> kWordSizeLog2);
       prev_page = page;
     }
     // Advance to the next page.
@@ -574,7 +578,7 @@
     if (page_in_use == 0) {
       FreeLargePage(page, prev_page);
     } else {
-      used_in_words += (page_in_use >> kWordSizeLog2);
+      usage_.used_in_words += (page_in_use >> kWordSizeLog2);
       prev_page = page;
     }
     // Advance to the next page.
@@ -599,17 +603,11 @@
     }
   }
 
-  // Record data and print if requested.
-  intptr_t used_before_in_words = used_in_words_;
-  used_in_words_ = used_in_words;
-
   int64_t end = OS::GetCurrentTimeMicros();
 
   // Record signals for growth control. Include size of external allocations.
-  page_space_controller_.EvaluateGarbageCollection(
-      used_before_in_words + external_before_in_words,
-      used_in_words + external_in_words_,
-      start, end);
+  page_space_controller_.EvaluateGarbageCollection(usage_before, usage_,
+                                                   start, end);
 
   heap_->RecordTime(kMarkObjects, mid1 - start);
   heap_->RecordTime(kResetFreeLists, mid2 - mid1);
@@ -651,34 +649,37 @@
 PageSpaceController::~PageSpaceController() {}
 
 
-bool PageSpaceController::CanGrowPageSpace(intptr_t size_in_bytes) {
-  intptr_t size_in_words = size_in_bytes >> kWordSizeLog2;
-  size_in_words = Utils::RoundUp(size_in_words, PageSpace::kPageSizeInWords);
-  intptr_t size_in_pages =  size_in_words / PageSpace::kPageSizeInWords;
+bool PageSpaceController::NeedsGarbageCollection(SpaceUsage after) const {
   if (!is_enabled_) {
-    return true;
-  }
-  if (heap_growth_ratio_ == 100) {
-    return true;
-  }
-  if (grow_heap_ <= 0) {
     return false;
   }
-  grow_heap_ -= size_in_pages;
-  return true;
+  if (heap_growth_ratio_ == 100) {
+    return false;
+  }
+  intptr_t capacity_increase_in_words =
+    after.capacity_in_words - last_usage_.capacity_in_words;
+  ASSERT(capacity_increase_in_words >= 0);
+  capacity_increase_in_words =
+      Utils::RoundUp(capacity_increase_in_words, PageSpace::kPageSizeInWords);
+  intptr_t capacity_increase_in_pages =
+      capacity_increase_in_words / PageSpace::kPageSizeInWords;
+  return capacity_increase_in_pages > grow_heap_;
 }
 
 
 void PageSpaceController::EvaluateGarbageCollection(
-    intptr_t used_before_in_words, intptr_t used_after_in_words,
-    int64_t start, int64_t end) {
+    SpaceUsage before, SpaceUsage after, int64_t start, int64_t end) {
   // TODO(iposva): Reevaluate the growth policies.
-  ASSERT(used_before_in_words >= used_after_in_words);
+  intptr_t before_total_in_words =
+      before.used_in_words + before.external_in_words;
+  intptr_t after_total_in_words =
+      after.used_in_words + after.external_in_words;
+  ASSERT(before_total_in_words >= after_total_in_words);
   ASSERT(end >= start);
   history_.AddGarbageCollectionTime(start, end);
   int collected_garbage_ratio = static_cast<int>(
-      (static_cast<double>(used_before_in_words - used_after_in_words) /
-      static_cast<double>(used_before_in_words))
+      (static_cast<double>(before_total_in_words - after_total_in_words) /
+      static_cast<double>(before_total_in_words))
                        * 100.0);
   bool enough_free_space =
       (collected_garbage_ratio >= heap_growth_ratio_);
@@ -692,9 +693,9 @@
     grow_heap_ = 0;
   } else {
     intptr_t growth_target = static_cast<intptr_t>(
-        used_after_in_words /  desired_utilization_);
+        after_total_in_words /  desired_utilization_);
     intptr_t growth_in_words = Utils::RoundUp(
-        growth_target - used_after_in_words,
+        growth_target - after_total_in_words,
         PageSpace::kPageSizeInWords);
     int growth_in_pages =
         growth_in_words / PageSpace::kPageSizeInWords;
@@ -705,6 +706,7 @@
   heap->RecordData(PageSpace::kGCTimeFraction,
                    garbage_collection_time_fraction);
   heap->RecordData(PageSpace::kAllowedGrowth, grow_heap_);
+  last_usage_ = after;
 }
 
 
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index 320efe3..07dfac8 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -7,6 +7,7 @@
 
 #include "vm/freelist.h"
 #include "vm/globals.h"
+#include "vm/spaces.h"
 #include "vm/virtual_memory.h"
 
 namespace dart {
@@ -116,14 +117,18 @@
                       int garbage_collection_time_ratio);
   ~PageSpaceController();
 
-  bool CanGrowPageSpace(intptr_t size_in_bytes);
+  // Returns whether growing to 'after' should trigger a GC.
+  // This method can be called before allocation (e.g., pretenuring) or after
+  // (e.g., promotion), as it does not change the state of the controller.
+  bool NeedsGarbageCollection(SpaceUsage after) const;
 
+  // Should be called after each collection to update the controller state.
   // A garbage collection is considered as successful if more than
   // heap_growth_ratio % of memory got deallocated by the garbage collector.
   // In this case garbage collection will be performed next time. Otherwise
   // the heap will grow.
-  void EvaluateGarbageCollection(intptr_t used_before_in_words,
-                                 intptr_t used_after_in_words,
+  void EvaluateGarbageCollection(SpaceUsage before,
+                                 SpaceUsage after,
                                  int64_t start, int64_t end);
 
   int64_t last_code_collection_in_us() { return last_code_collection_in_us_; }
@@ -131,8 +136,12 @@
     last_code_collection_in_us_ = t;
   }
 
-  void set_is_enabled(bool state) {
-    is_enabled_ = state;
+  void Enable(SpaceUsage current) {
+    last_usage_ = current;
+    is_enabled_ = true;
+  }
+  void Disable() {
+    is_enabled_ = false;
   }
   bool is_enabled() {
     return is_enabled_;
@@ -141,7 +150,10 @@
  private:
   bool is_enabled_;
 
-  // Heap growth control variable.
+  // Usage after last evaluated GC or last enabled.
+  SpaceUsage last_usage_;
+
+  // Pages of capacity growth allowed before next GC is advised.
   intptr_t grow_heap_;
 
   // If the garbage collector was not able to free more than heap_growth_ratio_
@@ -186,12 +198,17 @@
                     HeapPage::PageType type = HeapPage::kData,
                     GrowthPolicy growth_policy = kControlGrowth);
 
-  intptr_t UsedInWords() const { return used_in_words_; }
-  intptr_t CapacityInWords() const { return capacity_in_words_; }
-  intptr_t ExternalInWords() const {
-    return external_in_words_;
+  bool NeedsGarbageCollection() const {
+    return page_space_controller_.NeedsGarbageCollection(usage_);
   }
 
+  intptr_t UsedInWords() const { return usage_.used_in_words; }
+  intptr_t CapacityInWords() const { return usage_.capacity_in_words; }
+  intptr_t ExternalInWords() const {
+    return usage_.external_in_words;
+  }
+  SpaceUsage GetCurrentUsage() const { return usage_; }
+
   bool Contains(uword addr) const;
   bool Contains(uword addr, HeapPage::PageType type) const;
   bool IsValidAddress(uword addr) const {
@@ -214,7 +231,11 @@
   void StartEndAddress(uword* start, uword* end) const;
 
   void SetGrowthControlState(bool state) {
-    page_space_controller_.set_is_enabled(state);
+    if (state) {
+      page_space_controller_.Enable(usage_);
+    } else {
+      page_space_controller_.Disable();
+    }
   }
 
   bool GrowthControlState() {
@@ -222,7 +243,7 @@
   }
 
   bool NeedExternalGC() {
-    return used_in_words_ + ExternalInWords() > max_capacity_in_words_;
+    return UsedInWords() + ExternalInWords() > max_capacity_in_words_;
   }
 
   void WriteProtect(bool read_only);
@@ -275,8 +296,8 @@
   static intptr_t LargePageSizeInWordsFor(intptr_t size);
 
   bool CanIncreaseCapacityInWords(intptr_t increase_in_words) {
-    ASSERT(capacity_in_words_ <= max_capacity_in_words_);
-    return increase_in_words <= (max_capacity_in_words_ - capacity_in_words_);
+    ASSERT(CapacityInWords() <= max_capacity_in_words_);
+    return increase_in_words <= (max_capacity_in_words_ - CapacityInWords());
   }
 
   FreeList freelist_[HeapPage::kNumPageTypes];
@@ -289,9 +310,7 @@
 
   // Various sizes being tracked for this generation.
   intptr_t max_capacity_in_words_;
-  intptr_t capacity_in_words_;
-  intptr_t used_in_words_;
-  intptr_t external_in_words_;
+  SpaceUsage usage_;
 
   // Keep track whether a MarkSweep is currently running.
   bool sweeping_;
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 88f4b3c..b549c6a 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -906,6 +906,13 @@
     if (!IsIdentifier()) {
       ExpectIdentifier("identifier expected");
     }
+    // Reject expressions with deferred library prefix eagerly.
+    Object& obj = Object::Handle(library_.LookupLocalObject(*CurrentLiteral()));
+    if (!obj.IsNull() && obj.IsLibraryPrefix()) {
+      if (LibraryPrefix::Cast(obj).is_deferred_load()) {
+        ErrorMsg("Metadata must be compile-time constant");
+      }
+    }
     AstNode* expr = NULL;
     if ((LookaheadToken(1) == Token::kLPAREN) ||
         ((LookaheadToken(1) == Token::kPERIOD) &&
@@ -2000,9 +2007,9 @@
 }
 
 
-AstNode* Parser::CreateImplicitClosureNode(const Function& func,
-                                           intptr_t token_pos,
-                                           AstNode* receiver) {
+ClosureNode* Parser::CreateImplicitClosureNode(const Function& func,
+                                               intptr_t token_pos,
+                                               AstNode* receiver) {
   Function& implicit_closure_function =
       Function::ZoneHandle(func.ImplicitClosureFunction());
   if (receiver != NULL) {
@@ -3808,6 +3815,7 @@
 
 
 void Parser::ParseClassDeclaration(const GrowableObjectArray& pending_classes,
+                                   const Class& toplevel_class,
                                    intptr_t metadata_pos) {
   TRACE_PARSER("ParseClassDeclaration");
   bool is_patch = false;
@@ -3910,7 +3918,7 @@
     cls.set_is_abstract();
   }
   if (metadata_pos >= 0) {
-    library_.AddClassMetadata(cls, metadata_pos);
+    library_.AddClassMetadata(cls, toplevel_class, metadata_pos);
   }
 
   const bool is_mixin_declaration = (CurrentToken() == Token::kASSIGN);
@@ -4109,6 +4117,7 @@
 
 void Parser::ParseMixinAppAlias(
     const GrowableObjectArray& pending_classes,
+    const Class& toplevel_class,
     intptr_t metadata_pos) {
   TRACE_PARSER("ParseMixinAppAlias");
   const intptr_t classname_pos = TokenPos();
@@ -4161,7 +4170,7 @@
   ExpectSemicolon();
   pending_classes.Add(mixin_application, Heap::kOld);
   if (metadata_pos >= 0) {
-    library_.AddClassMetadata(mixin_application, metadata_pos);
+    library_.AddClassMetadata(mixin_application, toplevel_class, metadata_pos);
   }
 }
 
@@ -4207,6 +4216,7 @@
 
 
 void Parser::ParseTypedef(const GrowableObjectArray& pending_classes,
+                          const Class& toplevel_class,
                           intptr_t metadata_pos) {
   TRACE_PARSER("ParseTypedef");
   ExpectToken(Token::kTYPEDEF);
@@ -4215,7 +4225,7 @@
     if (FLAG_warn_mixin_typedef) {
       Warning("deprecated mixin application typedef");
     }
-    ParseMixinAppAlias(pending_classes, metadata_pos);
+    ParseMixinAppAlias(pending_classes, toplevel_class, metadata_pos);
     return;
   }
 
@@ -4322,7 +4332,9 @@
   ASSERT(!function_type_alias.is_finalized());
   pending_classes.Add(function_type_alias, Heap::kOld);
   if (metadata_pos >= 0) {
-    library_.AddClassMetadata(function_type_alias, metadata_pos);
+    library_.AddClassMetadata(function_type_alias,
+                              toplevel_class,
+                              metadata_pos);
   }
 }
 
@@ -5182,17 +5194,17 @@
     set_current_class(cls);  // No current class.
     intptr_t metadata_pos = SkipMetadata();
     if (CurrentToken() == Token::kCLASS) {
-      ParseClassDeclaration(pending_classes, metadata_pos);
+      ParseClassDeclaration(pending_classes, toplevel_class, metadata_pos);
     } else if ((CurrentToken() == Token::kTYPEDEF) &&
                (LookaheadToken(1) != Token::kLPAREN)) {
       set_current_class(toplevel_class);
-      ParseTypedef(pending_classes, metadata_pos);
+      ParseTypedef(pending_classes, toplevel_class, metadata_pos);
     } else if ((CurrentToken() == Token::kABSTRACT) &&
         (LookaheadToken(1) == Token::kCLASS)) {
-      ParseClassDeclaration(pending_classes, metadata_pos);
+      ParseClassDeclaration(pending_classes, toplevel_class, metadata_pos);
     } else if (is_patch_source() && IsLiteral("patch") &&
                (LookaheadToken(1) == Token::kCLASS)) {
-      ParseClassDeclaration(pending_classes, metadata_pos);
+      ParseClassDeclaration(pending_classes, toplevel_class, metadata_pos);
     } else {
       set_current_class(toplevel_class);
       if (IsVariableDeclaration()) {
@@ -8028,9 +8040,10 @@
     if ((CurrentToken() == Token::kCASCADE) && consume_cascades) {
       return ParseCascades(expr);
     }
-    expr = LiteralIfStaticConst(expr);
     if (require_compiletime_const) {
       expr = FoldConstExpr(expr_pos, expr);
+    } else {
+      expr = LiteralIfStaticConst(expr);
     }
     return expr;
   }
@@ -8380,11 +8393,14 @@
     }
     if (current_function().is_static() ||
         current_function().IsInFactoryScope()) {
-      return new StaticGetterNode(primary->token_pos(),
-                                  NULL,  // No receiver.
-                                  false,  // Not a super getter.
-                                  Class::ZoneHandle(current_class().raw()),
-                                  name);
+      StaticGetterNode* getter =
+          new StaticGetterNode(primary->token_pos(),
+                               NULL,  // No receiver.
+                               false,  // Not a super getter.
+                               Class::ZoneHandle(current_class().raw()),
+                               name);
+      getter->set_is_deferred(primary->is_deferred_reference());
+      return getter;
     } else {
       AstNode* receiver = LoadReceiver(primary->token_pos());
       return CallGetter(node->token_pos(), receiver, name);
@@ -8396,13 +8412,15 @@
 
 AstNode* Parser::LoadClosure(PrimaryNode* primary) {
   ASSERT(primary->primary().IsFunction());
-  AstNode* closure = NULL;
   const Function& func =
       Function::CheckedZoneHandle(primary->primary().raw());
   const String& funcname = String::ZoneHandle(func.name());
   if (func.is_static()) {
     // Static function access.
-    closure = CreateImplicitClosureNode(func, primary->token_pos(), NULL);
+    ClosureNode* closure =
+        CreateImplicitClosureNode(func, primary->token_pos(), NULL);
+    closure->set_is_deferred(primary->is_deferred_reference());
+    return closure;
   } else {
     // Instance function access.
     if (parsing_metadata_) {
@@ -8417,9 +8435,10 @@
                funcname.ToCString());
     }
     AstNode* receiver = LoadReceiver(primary->token_pos());
-    closure = CallGetter(primary->token_pos(), receiver, funcname);
+    return CallGetter(primary->token_pos(), receiver, funcname);
   }
-  return closure;
+  UNREACHABLE();
+  return NULL;
 }
 
 
@@ -9095,7 +9114,9 @@
   // Check if an instance/static function exists.
   func = cls.LookupFunction(ident);
   if (!func.IsNull() &&
-      (func.IsDynamicFunction() || func.IsStaticFunction())) {
+      (func.IsDynamicFunction() ||
+      func.IsStaticFunction() ||
+      func.is_abstract())) {
     if (node != NULL) {
       *node = new PrimaryNode(ident_pos,
                               Function::ZoneHandle(isolate(), func.raw()));
@@ -9107,7 +9128,7 @@
   // it is still a field.
   func = cls.LookupGetterFunction(ident);
   if (!func.IsNull()) {
-    if (func.IsDynamicFunction()) {
+    if (func.IsDynamicFunction() || func.is_abstract()) {
       if (node != NULL) {
         CheckInstanceFieldAccess(ident_pos, ident);
         ASSERT(AbstractType::Handle(func.result_type()).IsResolved());
@@ -9137,7 +9158,7 @@
   }
   func = cls.LookupSetterFunction(ident);
   if (!func.IsNull()) {
-    if (func.IsDynamicFunction()) {
+    if (func.IsDynamicFunction() || func.is_abstract()) {
       if (node != NULL) {
         // We create a getter node even though a getter doesn't exist as
         // it could be followed by an assignment which will convert it to
@@ -9242,31 +9263,52 @@
     obj = prefix.LookupObject(ident);
   } else {
     // Remember that this function depends on an import prefix of an
-    // unloaded deferred library.
-    parsed_function()->AddDeferredPrefix(prefix);
+    // unloaded deferred library. Note that parsed_function() can be
+    // NULL when parsing expressions outside the scope of a function.
+    if (parsed_function() != NULL) {
+      parsed_function()->AddDeferredPrefix(prefix);
+    }
   }
+  const bool is_deferred = prefix.is_deferred_load();
   if (obj.IsNull()) {
     // Unresolved prefixed primary identifier.
     return NULL;
   } else if (obj.IsClass()) {
     const Class& cls = Class::Cast(obj);
-    return new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw()));
+    PrimaryNode* primary =
+        new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw()));
+    primary->set_is_deferred(is_deferred);
+    return primary;
   } else if (obj.IsField()) {
     const Field& field = Field::Cast(obj);
     ASSERT(field.is_static());
-    return GenerateStaticFieldLookup(field, ident_pos);
+    AstNode* get_field = GenerateStaticFieldLookup(field, ident_pos);
+    ASSERT(get_field != NULL);
+    ASSERT(get_field->IsLoadStaticFieldNode() ||
+           get_field->IsStaticGetterNode());
+    if (get_field->IsLoadStaticFieldNode()) {
+      get_field->AsLoadStaticFieldNode()->set_is_deferred(is_deferred);
+    } else if (get_field->IsStaticGetterNode()) {
+      get_field->AsStaticGetterNode()->set_is_deferred(is_deferred);
+    }
+    return get_field;
   } else if (obj.IsFunction()) {
     const Function& func = Function::Cast(obj);
     ASSERT(func.is_static());
     if (func.IsGetterFunction() || func.IsSetterFunction()) {
-      return new StaticGetterNode(ident_pos,
-                                  /* receiver */ NULL,
-                                  /* is_super_getter */ false,
-                                  Class::ZoneHandle(func.Owner()),
-                                  ident);
-
+      StaticGetterNode* getter =
+          new StaticGetterNode(ident_pos,
+                               /* receiver */ NULL,
+                               /* is_super_getter */ false,
+                               Class::ZoneHandle(func.Owner()),
+                               ident);
+      getter->set_is_deferred(is_deferred);
+      return getter;
     } else {
-      return new PrimaryNode(ident_pos, Function::ZoneHandle(func.raw()));
+      PrimaryNode* primary =
+          new PrimaryNode(ident_pos, Function::ZoneHandle(func.raw()));
+      primary->set_is_deferred(is_deferred);
+      return primary;
     }
   }
   // All possible object types are handled above.
@@ -10518,6 +10560,14 @@
   } else if (expr->IsLoadLocalNode() &&
       expr->AsLoadLocalNode()->local().IsConst()) {
     return *expr->AsLoadLocalNode()->local().ConstValue();
+  } else if (expr->IsLoadStaticFieldNode()) {
+    const Field& field = expr->AsLoadStaticFieldNode()->field();
+    // We already checked that this field is const and has been
+    // initialized.
+    ASSERT(field.is_const());
+    ASSERT(field.value() != Object::sentinel().raw());
+    ASSERT(field.value() != Object::transition_sentinel().raw());
+    return Instance::ZoneHandle(field.value());
   } else {
     ASSERT(expr->EvalConstExpr() != NULL);
     ReturnNode* ret = new ReturnNode(expr->token_pos(), expr);
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 587444a..e1da304 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -334,11 +334,14 @@
   // Support for parsing of scripts.
   void ParseTopLevel();
   void ParseClassDeclaration(const GrowableObjectArray& pending_classes,
+                             const Class& toplevel_class,
                              intptr_t metadata_pos);
   void ParseClassDefinition(const Class& cls);
   void ParseMixinAppAlias(const GrowableObjectArray& pending_classes,
+                          const Class& toplevel_class,
                           intptr_t metadata_pos);
   void ParseTypedef(const GrowableObjectArray& pending_classes,
+                    const Class& toplevel_class,
                     intptr_t metadata_pos);
   void ParseTopLevelVariable(TopLevel* top_level, intptr_t metadata_pos);
   void ParseTopLevelFunction(TopLevel* top_level, intptr_t metadata_pos);
@@ -434,9 +437,9 @@
 
   static void SetupDefaultsForOptionalParams(const ParamList* params,
                                              Array& default_values);
-  AstNode* CreateImplicitClosureNode(const Function& func,
-                                     intptr_t token_pos,
-                                     AstNode* receiver);
+  ClosureNode* CreateImplicitClosureNode(const Function& func,
+                                         intptr_t token_pos,
+                                         AstNode* receiver);
   static void AddFormalParamsToFunction(const ParamList* params,
                                         const Function& func);
   void AddFormalParamsToScope(const ParamList* params, LocalScope* scope);
diff --git a/runtime/vm/port.cc b/runtime/vm/port.cc
index 0c9a627..a055cee 100644
--- a/runtime/vm/port.cc
+++ b/runtime/vm/port.cc
@@ -20,7 +20,7 @@
 intptr_t PortMap::capacity_ = 0;
 intptr_t PortMap::used_ = 0;
 intptr_t PortMap::deleted_ = 0;
-Dart_Port PortMap::next_port_ = 7111;
+Random* PortMap::prng_ = NULL;
 
 
 intptr_t PortMap::FindPort(Dart_Port port) {
@@ -63,15 +63,17 @@
 
 
 Dart_Port PortMap::AllocatePort() {
-  Dart_Port result = next_port_;
+  const Dart_Port kMASK = 0x3fffffff;
+  Dart_Port result = prng_->NextUInt32() & kMASK;
 
-  do {
-    // TODO(iposva): Use an approved hashing function to have less predictable
-    // port ids, or make them not accessible from Dart code or both.
-    next_port_++;
-  } while (FindPort(next_port_) >= 0);
+  // Keep getting new values while we have an illegal port number or the port
+  // number is already in use.
+  while ((result == 0) || (FindPort(result) >= 0)) {
+    result = prng_->NextUInt32() & kMASK;
+  }
 
   ASSERT(result != 0);
+  ASSERT(FindPort(result) < 0);
   return result;
 }
 
@@ -258,6 +260,7 @@
 
 void PortMap::InitOnce() {
   mutex_ = new Mutex();
+  prng_ = new Random();
 
   static const intptr_t kInitialCapacity = 8;
   // TODO(iposva): Verify whether we want to keep exponentially growing.
diff --git a/runtime/vm/port.h b/runtime/vm/port.h
index e6c711e..5a0f177 100644
--- a/runtime/vm/port.h
+++ b/runtime/vm/port.h
@@ -8,6 +8,7 @@
 #include "include/dart_api.h"
 #include "vm/allocation.h"
 #include "vm/globals.h"
+#include "vm/random.h"
 
 namespace dart {
 
@@ -82,7 +83,7 @@
   static intptr_t used_;
   static intptr_t deleted_;
 
-  static Dart_Port next_port_;
+  static Random* prng_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/random.h b/runtime/vm/random.h
index c1c69d6..06d789a 100644
--- a/runtime/vm/random.h
+++ b/runtime/vm/random.h
@@ -10,7 +10,7 @@
 
 namespace dart {
 
-class Random : public ValueObject {
+class Random {
  public:
   Random();
   ~Random();
@@ -22,7 +22,6 @@
 
   uint64_t _state;
 
-  DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(Random);
 };
 
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 631472f..acf2554 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -137,7 +137,7 @@
       case kPcDescriptorsCid: {
         const RawPcDescriptors* raw_descriptors =
             reinterpret_cast<const RawPcDescriptors*>(this);
-        intptr_t num_descriptors = Smi::Value(raw_descriptors->ptr()->length_);
+        intptr_t num_descriptors = raw_descriptors->ptr()->length_;
         instance_size = PcDescriptors::InstanceSize(num_descriptors);
         break;
       }
@@ -371,7 +371,7 @@
   Code code;
   code = fn.CurrentCode();
 
-  if (!code.IsNull() &&  // The function may not have code.
+  if (fn.HasCode() &&  // The function may not have code.
       !code.is_optimized() &&
       (fn.CurrentCode() == fn.unoptimized_code()) &&
       !code.HasBreakpoint() &&
@@ -495,19 +495,13 @@
 
 intptr_t RawPcDescriptors::VisitPcDescriptorsPointers(
     RawPcDescriptors* raw_obj, ObjectPointerVisitor* visitor) {
-  RawPcDescriptors* obj = raw_obj->ptr();
-  intptr_t length = Smi::Value(obj->length_);
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&obj->length_));
-  return PcDescriptors::InstanceSize(length);
+  return PcDescriptors::InstanceSize(raw_obj->ptr()->length_);
 }
 
 
 intptr_t RawStackmap::VisitStackmapPointers(RawStackmap* raw_obj,
                                             ObjectPointerVisitor* visitor) {
-  RawStackmap* obj = raw_obj->ptr();
-  intptr_t length = obj->length_;
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&obj->code_));
-  return Stackmap::InstanceSize(length);
+  return Stackmap::InstanceSize(raw_obj->ptr()->length_);
 }
 
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 5ba26e8..c63b502 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -867,7 +867,7 @@
 class RawPcDescriptors : public RawObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors);
 
-  RawSmi* length_;  // Number of descriptors.
+  intptr_t length_;  // Number of descriptors.
 
   // Variable length data follows here.
   intptr_t data_[0];
@@ -886,8 +886,6 @@
 class RawStackmap : public RawObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap);
 
-  RawCode* code_;  // Code object corresponding to the frame described.
-
   // TODO(kmillikin): We need a small number of bits to encode the register
   // count.  Consider packing them in with the length.
   intptr_t length_;  // Length of payload, in bits.
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index db45e58..c4f063e 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -6,6 +6,7 @@
 #include "vm/object.h"
 #include "vm/object_store.h"
 #include "vm/snapshot.h"
+#include "vm/stub_code.h"
 #include "vm/symbols.h"
 #include "vm/visitor.h"
 
@@ -459,7 +460,7 @@
   // Now set all the type fields.
   for (intptr_t i = 0; i < len; i++) {
     *reader->TypeHandle() ^= reader->ReadObjectImpl();
-    type_arguments.set_type_at(i, *reader->TypeHandle());
+    type_arguments.SetTypeAt(i, *reader->TypeHandle());
   }
 
   // If object needs to be a canonical object, Canonicalize it.
@@ -709,6 +710,14 @@
     *(func.raw()->from() + i) = reader->ReadObjectRef();
   }
 
+// TODO(zra): Remove when arm64 is ready.
+#if !defined(TARGET_ARCH_ARM64)
+  // Set up code pointer with the lazy-compile-stub.
+  func.set_code(Code::Handle(StubCode::LazyCompile_entry()->code()));
+#else
+  func.set_code(Code::Handle());
+#endif
+
   return func.raw();
 }
 
@@ -741,7 +750,11 @@
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
-  visitor.VisitPointers(from(), to());
+  visitor.VisitPointers(from(), to_no_code());
+
+  // Write null for the code and unoptimized code.
+  writer->WriteVMIsolateObject(kNullObject);
+  writer->WriteVMIsolateObject(kNullObject);
 }
 
 
@@ -1761,8 +1774,9 @@
                             intptr_t tags,
                             Snapshot::Kind kind) {
   ASSERT(reader != NULL);
+  ASSERT(kind != Snapshot::kMessage);
   // Read the double value for the object.
-  double value = reader->Read<double>();
+  double value = reader->ReadDouble();
 
   // Create a Double object or get canonical one if it is a canonical constant.
   Double& dbl = Double::ZoneHandle(reader->isolate(), Double::null());
@@ -1773,10 +1787,8 @@
     // references that are objects from the core library (loaded from a
     // full snapshot). Objects that are only in the script need not be
     // canonicalized as they are already canonical.
-    // When reading a message snapshot we always have to canonicalize.
     if (RawObject::IsCanonical(tags) &&
-        (RawObject::IsCreatedFromSnapshot(tags) ||
-         (kind == Snapshot::kMessage))) {
+        RawObject::IsCreatedFromSnapshot(tags)) {
       dbl = Double::NewCanonical(value);
     } else {
       dbl = Double::New(value, HEAP_SPACE(kind));
@@ -1804,7 +1816,7 @@
   writer->WriteIntptrValue(writer->GetObjectTags(this));
 
   // Write out the double value.
-  writer->Write<double>(ptr()->value_);
+  writer->WriteDouble(ptr()->value_);
 }
 
 
@@ -2292,7 +2304,7 @@
 
 
 #define TYPED_DATA_READ(setter, type)                                          \
-  for (intptr_t i = 0; i < lengthInBytes; i += element_size) {                 \
+  for (intptr_t i = 0; i < length_in_bytes; i += element_size) {               \
     result.Set##setter(i, reader->Read<type>());                               \
   }                                                                            \
 
@@ -2314,17 +2326,15 @@
 
   // Setup the array elements.
   intptr_t element_size = ElementSizeInBytes(cid);
-  intptr_t lengthInBytes = len * element_size;
+  intptr_t length_in_bytes = len * element_size;
   switch (cid) {
     case kTypedDataInt8ArrayCid:
-      TYPED_DATA_READ(Int8, int8_t);
-      break;
     case kTypedDataUint8ArrayCid:
-      TYPED_DATA_READ(Uint8, uint8_t);
+    case kTypedDataUint8ClampedArrayCid: {
+      uint8_t* data = reinterpret_cast<uint8_t*>(result.DataAddr(0));
+      reader->ReadBytes(data, length_in_bytes);
       break;
-    case kTypedDataUint8ClampedArrayCid:
-      TYPED_DATA_READ(Uint8, uint8_t);
-      break;
+    }
     case kTypedDataInt16ArrayCid:
       TYPED_DATA_READ(Int16, int16_t);
       break;
@@ -2406,14 +2416,12 @@
   // Write out the array elements.
   switch (cid) {
     case kTypedDataInt8ArrayCid:
-      TYPED_DATA_WRITE(int8_t);
-      break;
     case kTypedDataUint8ArrayCid:
-      TYPED_DATA_WRITE(uint8_t);
+    case kTypedDataUint8ClampedArrayCid: {
+      uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data_);
+      writer->WriteBytes(data, len);
       break;
-    case kTypedDataUint8ClampedArrayCid:
-      TYPED_DATA_WRITE(uint8_t);
-      break;
+    }
     case kTypedDataInt16ArrayCid:
       TYPED_DATA_WRITE(int16_t);
       break;
diff --git a/runtime/vm/resolver_test.cc b/runtime/vm/resolver_test.cc
index f06e42f..75e375e 100644
--- a/runtime/vm/resolver_test.cc
+++ b/runtime/vm/resolver_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "platform/assert.h"
 #include "vm/assembler.h"
 #include "vm/class_finalizer.h"
@@ -213,3 +217,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
new file mode 100644
index 0000000..d771682
--- /dev/null
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -0,0 +1,24 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_ARM64)
+
+#include "vm/runtime_entry.h"
+
+#include "vm/assembler.h"
+#include "vm/simulator.h"
+#include "vm/stub_code.h"
+
+namespace dart {
+
+#define __ assembler->
+
+void RuntimeEntry::Call(Assembler* assembler, intptr_t argument_count) const {
+  UNIMPLEMENTED();
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/runtime_entry_test.cc b/runtime/vm/runtime_entry_test.cc
index 9dd6ff3..6e5720c 100644
--- a/runtime/vm/runtime_entry_test.cc
+++ b/runtime/vm/runtime_entry_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "vm/runtime_entry.h"
 
 #include "vm/object.h"
@@ -26,7 +30,7 @@
   owner_class.SetFunctions(functions);
   Library& lib = Library::Handle(Library::CoreLibrary());
   lib.AddClass(owner_class);
-  function.SetCode(code);
+  function.AttachCode(code);
   return function;
 }
 
@@ -59,3 +63,5 @@
 END_LEAF_RUNTIME_ENTRY
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/scanner.cc b/runtime/vm/scanner.cc
index 7e1dfbe..761c0c1 100644
--- a/runtime/vm/scanner.cc
+++ b/runtime/vm/scanner.cc
@@ -874,6 +874,8 @@
     if (inserted_new_lines &&
         ((current_token_.kind == Token::kINTERPOL_VAR) ||
          (current_token_.kind == Token::kINTERPOL_START))) {
+      // NOTE: If this changes, be sure to update
+      // Script::GenerateLineNumberArray to stay in sync.
       empty_string_token_.position.line = current_token_.position.line;
       token_stream->Add(empty_string_token_);
     }
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index ff22786..0c43bec 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -711,11 +711,6 @@
     OS::PrintErr(" done.\n");
   }
 
-  // During from/to flip and promoted stack use, move external allocation
-  // out of tospace temporarily.
-  intptr_t saved_external = external_size_;
-  FreeExternal(saved_external);
-
   // Setup the visitor and run a scavenge.
   ScavengerVisitor visitor(isolate, this);
   Prologue(isolate, invoke_api_callbacks);
@@ -725,9 +720,6 @@
   ProcessToSpace(&visitor);
   int64_t middle = OS::GetCurrentTimeMicros();
   IterateWeakReferences(isolate, &visitor);
-  // Done with promoted stack; restore external allocation.
-  ASSERT(!PromotedStackHasMore());
-  AllocateExternal(saved_external);
   ScavengerWeakVisitor weak_visitor(this, prologue_weak_are_strong);
   // Include the prologue weak handles, since we must process any promotion.
   const bool visit_prologue_weak_handles = true;
@@ -774,8 +766,6 @@
 void Scavenger::AllocateExternal(intptr_t size) {
   ASSERT(size >= 0);
   external_size_ += size;
-  intptr_t remaining = end_ - top_;
-  end_ -= Utils::Minimum(remaining, size);
 }
 
 
@@ -783,7 +773,6 @@
   ASSERT(size >= 0);
   external_size_ -= size;
   ASSERT(external_size_ >= 0);
-  end_ = Utils::Minimum(to_->end(), end_ + size);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/scavenger.h b/runtime/vm/scavenger.h
index f139437..17d2857 100644
--- a/runtime/vm/scavenger.h
+++ b/runtime/vm/scavenger.h
@@ -10,6 +10,7 @@
 #include "vm/flags.h"
 #include "vm/globals.h"
 #include "vm/raw_object.h"
+#include "vm/spaces.h"
 #include "vm/virtual_memory.h"
 #include "vm/visitor.h"
 
@@ -81,6 +82,13 @@
   intptr_t ExternalInWords() const {
     return external_size_ >> kWordSizeLog2;
   }
+  SpaceUsage GetCurrentUsage() const {
+    SpaceUsage usage;
+    usage.used_in_words = UsedInWords();
+    usage.capacity_in_words = CapacityInWords();
+    usage.external_in_words = ExternalInWords();
+    return usage;
+  }
 
   void VisitObjects(ObjectVisitor* visitor) const;
   void VisitObjectPointers(ObjectPointerVisitor* visitor) const;
@@ -160,14 +168,12 @@
   // not consume space in the to space they leave enough room for this stack.
   void PushToPromotedStack(uword addr) {
     ASSERT(scavenging_);
-    ASSERT(external_size_ == 0);
     end_ -= sizeof(addr);
     ASSERT(end_ > top_);
     *reinterpret_cast<uword*>(end_) = addr;
   }
   uword PopFromPromotedStack() {
     ASSERT(scavenging_);
-    ASSERT(external_size_ == 0);
     uword result = *reinterpret_cast<uword*>(end_);
     end_ += sizeof(result);
     ASSERT(end_ <= to_->end());
@@ -175,7 +181,6 @@
   }
   bool PromotedStackHasMore() const {
     ASSERT(scavenging_);
-    ASSERT(external_size_ == 0);
     return end_ < to_->end();
   }
 
@@ -211,7 +216,6 @@
   intptr_t collections_;
 
   // The total size of external data associated with objects in this scavenger.
-  // External allocations decrease end_. If promoted stack is in use, this is 0.
   intptr_t external_size_;
 
   friend class ScavengerVisitor;
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 2b3be6a..5d5c246 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -798,6 +798,54 @@
 }
 
 
+static bool HandleInstanceCommands(Isolate* isolate,
+                                   const Object& obj,
+                                   JSONStream* js,
+                                   intptr_t arg_pos) {
+  ASSERT(js->num_arguments() > arg_pos);
+  const char* action = js->GetArgument(arg_pos);
+  if (strcmp(action, "eval") == 0) {
+    if (js->num_arguments() > (arg_pos + 1)) {
+      PrintError(js, "expected at most %" Pd " arguments but found %" Pd "\n",
+                 arg_pos + 1,
+                 js->num_arguments());
+      return true;
+    }
+    if (obj.IsNull()) {
+      PrintErrorWithKind(js, "EvalCollected",
+                         "attempt to evaluate against collected object\n",
+                         js->num_arguments());
+      return true;
+    }
+    if (obj.raw() == Object::sentinel().raw()) {
+      PrintErrorWithKind(js, "EvalExpired",
+                         "attempt to evaluate against expired object\n",
+                         js->num_arguments());
+      return true;
+    }
+    const char* expr = js->LookupOption("expr");
+    if (expr == NULL) {
+      PrintError(js, "eval expects an 'expr' option\n",
+                 js->num_arguments());
+      return true;
+    }
+    const String& expr_str = String::Handle(isolate, String::New(expr));
+    ASSERT(obj.IsInstance());
+    const Instance& instance = Instance::Cast(obj);
+    const Object& result = Object::Handle(instance.Evaluate(expr_str));
+    if (result.IsNull()) {
+      Object::null_instance().PrintToJSONStream(js, true);
+    } else {
+      result.PrintToJSONStream(js, true);
+    }
+    return true;
+  }
+
+  PrintError(js, "unrecognized action '%s'\n", action);
+  return true;
+}
+
+
 static bool HandleClassesClosures(Isolate* isolate, const Class& cls,
                                   JSONStream* js) {
   intptr_t id;
@@ -944,11 +992,8 @@
     }
     return true;
   }
+  ASSERT(js->num_arguments() >= 4);
   intptr_t id;
-  if (js->num_arguments() > 4) {
-    PrintError(js, "Command too long");
-    return true;
-  }
   if (!GetIntegerId(js->GetArgument(3), &id)) {
     PrintError(js, "Must specify collection object id: types/id");
     return true;
@@ -959,8 +1004,11 @@
     PrintError(js, "Canonical type %" Pd " not found", id);
     return true;
   }
-  type.PrintToJSONStream(js, false);
-  return true;
+  if (js->num_arguments() == 4) {
+    type.PrintToJSONStream(js, false);
+    return true;
+  }
+  return HandleInstanceCommands(isolate, type, js, 4);
 }
 
 
@@ -1070,7 +1118,7 @@
   JSONObject jsobj(js);
   jsobj.AddProperty("type", "Null");
   jsobj.AddProperty("id", id);
-  jsobj.AddProperty("preview", preview);
+  jsobj.AddProperty("valueAsString", preview);
 }
 
 
@@ -1181,8 +1229,6 @@
     PrintError(js, "unrecognized object id '%s'", arg);
     return true;
   }
-
-  // Now what should we do with the object?
   if (js->num_arguments() == 2) {
     // Print.
     if (obj.IsNull()) {
@@ -1197,47 +1243,7 @@
     obj.PrintToJSONStream(js, false);
     return true;
   }
-  ASSERT(js->num_arguments() > 2);
-
-  const char* action = js->GetArgument(2);
-  if (strcmp(action, "eval") == 0) {
-    if (js->num_arguments() > 3) {
-      PrintError(js, "expected at most 3 arguments but found %" Pd "\n",
-                 js->num_arguments());
-      return true;
-    }
-    if (obj.IsNull()) {
-      PrintErrorWithKind(js, "EvalCollected",
-                         "attempt to evaluate against collected object\n",
-                         js->num_arguments());
-      return true;
-    }
-    if (obj.raw() == Object::sentinel().raw()) {
-      PrintErrorWithKind(js, "EvalExpired",
-                         "attempt to evaluate against expired object\n",
-                         js->num_arguments());
-      return true;
-    }
-    const char* expr = js->LookupOption("expr");
-    if (expr == NULL) {
-      PrintError(js, "eval expects an 'expr' option\n",
-                 js->num_arguments());
-      return true;
-    }
-    const String& expr_str = String::Handle(isolate, String::New(expr));
-    ASSERT(obj.IsInstance());
-    const Instance& instance = Instance::Cast(obj);
-    const Object& result = Object::Handle(instance.Evaluate(expr_str));
-    if (result.IsNull()) {
-      Object::null_instance().PrintToJSONStream(js, true);
-    } else {
-      result.PrintToJSONStream(js, true);
-    }
-    return true;
-  }
-
-  PrintError(js, "unrecognized action '%s'\n", action);
-  return true;
+  return HandleInstanceCommands(isolate, obj, js, 2);
 }
 
 
@@ -1455,25 +1461,35 @@
 
 
 static bool HandleAllocationProfile(Isolate* isolate, JSONStream* js) {
-  if (js->num_arguments() == 2) {
-    const char* sub_command = js->GetArgument(1);
-    if (!strcmp(sub_command, "reset")) {
-      isolate->class_table()->ResetAllocationAccumulators();
-      isolate->class_table()->AllocationProfilePrintToJSONStream(js);
-      return true;
-    } else if (!strcmp(sub_command, "fullgc")) {
-      isolate->heap()->CollectAllGarbage();
-      isolate->class_table()->AllocationProfilePrintToJSONStream(js);
-      return true;
-    } else {
-      PrintError(js, "Unrecognized subcommand '%s'", sub_command);
-      return true;
-    }
-  }
+  bool should_reset_accumulator = false;
+  bool should_collect = false;
   if (js->num_arguments() != 1) {
     PrintError(js, "Command too long");
     return true;
   }
+  if (js->HasOption("reset")) {
+    if (js->OptionIs("reset", "true")) {
+      should_reset_accumulator = true;
+    } else {
+      PrintError(js, "Unrecognized reset option '%s'",
+                 js->LookupOption("reset"));
+      return true;
+    }
+  }
+  if (js->HasOption("gc")) {
+    if (js->OptionIs("gc", "full")) {
+      should_collect = true;
+    } else {
+      PrintError(js, "Unrecognized gc option '%s'", js->LookupOption("gc"));
+      return true;
+    }
+  }
+  if (should_reset_accumulator) {
+    isolate->class_table()->ResetAllocationAccumulators();
+  }
+  if (should_collect) {
+    isolate->heap()->CollectAllGarbage();
+  }
   isolate->class_table()->AllocationProfilePrintToJSONStream(js);
   return true;
 }
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index d71a780..89d2d27 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "include/dart_debugger_api.h"
 #include "vm/dart_api_impl.h"
 #include "vm/dart_entry.h"
@@ -112,6 +116,9 @@
 
 
 // Search for the formatted string in buff.
+//
+// TODO(turnidge): This function obscures the line number of failing
+// EXPECTs.  Rework this.
 static void ExpectSubstringF(const char* buff, const char* fmt, ...) {
   Isolate* isolate = Isolate::Current();
 
@@ -374,7 +381,7 @@
   handler.filterMsg("name");
   EXPECT_STREQ(
       "{\"type\":\"Null\",\"id\":\"objects\\/null\","
-      "\"preview\":\"null\"}",
+      "\"valueAsString\":\"null\"}",
       handler.msg());
 
   // not initialized
@@ -384,7 +391,7 @@
   handler.filterMsg("name");
   EXPECT_STREQ(
       "{\"type\":\"Null\",\"id\":\"objects\\/not-initialized\","
-      "\"preview\":\"<not initialized>\"}",
+      "\"valueAsString\":\"<not initialized>\"}",
       handler.msg());
 
   // being initialized
@@ -394,7 +401,7 @@
   handler.filterMsg("name");
   EXPECT_STREQ(
       "{\"type\":\"Null\",\"id\":\"objects\\/being-initialized\","
-      "\"preview\":\"<being initialized>\"}",
+      "\"valueAsString\":\"<being initialized>\"}",
       handler.msg());
 
   // optimized out
@@ -404,7 +411,7 @@
   handler.filterMsg("name");
   EXPECT_STREQ(
       "{\"type\":\"Null\",\"id\":\"objects\\/optimized-out\","
-      "\"preview\":\"<optimized out>\"}",
+      "\"valueAsString\":\"<optimized out>\"}",
       handler.msg());
 
   // collected
@@ -414,7 +421,7 @@
   handler.filterMsg("name");
   EXPECT_STREQ(
       "{\"type\":\"Null\",\"id\":\"objects\\/collected\","
-      "\"preview\":\"<collected>\"}",
+      "\"valueAsString\":\"<collected>\"}",
       handler.msg());
 
   // expired
@@ -424,7 +431,7 @@
   handler.filterMsg("name");
   EXPECT_STREQ(
       "{\"type\":\"Null\",\"id\":\"objects\\/expired\","
-      "\"preview\":\"<expired>\"}",
+      "\"valueAsString\":\"<expired>\"}",
       handler.msg());
 
   // bool
@@ -435,7 +442,7 @@
   EXPECT_STREQ(
       "{\"type\":\"Bool\",\"id\":\"objects\\/bool-true\","
       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/46\","
-      "\"user_name\":\"bool\"},\"preview\":\"true\"}",
+      "\"user_name\":\"bool\"},\"valueAsString\":\"true\"}",
       handler.msg());
 
   // int
@@ -444,9 +451,12 @@
   handler.HandleNextMessage();
   handler.filterMsg("name");
   EXPECT_STREQ(
-      "{\"type\":\"Smi\",\"id\":\"objects\\/int-123\","
+      "{\"type\":\"Smi\","
       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
-      "\"user_name\":\"int\"},\"preview\":\"123\"}",
+      "\"user_name\":\"int\"},"
+      "\"fields\":[],"
+      "\"id\":\"objects\\/int-123\","
+      "\"valueAsString\":\"123\"}",
       handler.msg());
 
   // object id ring / valid
@@ -455,11 +465,12 @@
   handler.HandleNextMessage();
   handler.filterMsg("name");
   handler.filterMsg("size");
+  handler.filterMsg("id");
   EXPECT_STREQ(
-      "{\"type\":\"String\",\"id\":\"objects\\/1\","
-      "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/60\","
-      "\"user_name\":\"String\"},\"preview\":\"\\\"value\\\"\","
-      "\"fields\":[],}",
+      "{\"type\":\"String\","
+      "\"class\":{\"type\":\"@Class\","
+      "\"user_name\":\"String\"},\"fields\":[],"
+      "\"valueAsString\":\"\\\"value\\\"\"}",
       handler.msg());
 
   // object id ring / invalid => expired
@@ -469,7 +480,7 @@
   handler.filterMsg("name");
   EXPECT_STREQ(
       "{\"type\":\"Null\",\"id\":\"objects\\/expired\","
-      "\"preview\":\"<expired>\"}",
+      "\"valueAsString\":\"<expired>\"}",
       handler.msg());
 
   // expired/eval => error
@@ -492,9 +503,11 @@
   handler.HandleNextMessage();
   handler.filterMsg("name");
   EXPECT_STREQ(
-      "{\"type\":\"@Smi\",\"id\":\"objects\\/int-222\","
+      "{\"type\":\"@Smi\","
       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
-      "\"user_name\":\"int\"},\"preview\":\"222\"}",
+      "\"user_name\":\"int\"},"
+      "\"id\":\"objects\\/int-222\","
+      "\"valueAsString\":\"222\"}",
       handler.msg());
 
   // eval returning null works
@@ -505,7 +518,8 @@
   handler.HandleNextMessage();
   handler.filterMsg("name");
   EXPECT_STREQ(
-      "{\"type\":\"@Null\",\"id\":\"objects\\/null\",\"preview\":\"null\"}",
+      "{\"type\":\"@Null\",\"id\":\"objects\\/null\","
+      "\"valueAsString\":\"null\"}",
       handler.msg());
 
   // object id ring / invalid => expired
@@ -589,9 +603,10 @@
   handler.HandleNextMessage();
   handler.filterMsg("name");
   EXPECT_STREQ(
-      "{\"type\":\"@Smi\",\"id\":\"objects\\/int-54320\","
+      "{\"type\":\"@Smi\","
       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
-      "\"user_name\":\"int\"},\"preview\":\"54320\"}",
+      "\"user_name\":\"int\"},\"id\":\"objects\\/int-54320\","
+      "\"valueAsString\":\"54320\"}",
       handler.msg());
 }
 
@@ -663,9 +678,11 @@
   handler.HandleNextMessage();
   handler.filterMsg("name");
   EXPECT_STREQ(
-      "{\"type\":\"@Smi\",\"id\":\"objects\\/int-111235\","
+      "{\"type\":\"@Smi\","
       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
-      "\"user_name\":\"int\"},\"preview\":\"111235\"}",
+      "\"user_name\":\"int\"},"
+      "\"id\":\"objects\\/int-111235\","
+      "\"valueAsString\":\"111235\"}",
       handler.msg());
 
   // Request function 0 from class A.
@@ -781,8 +798,9 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg());
+  EXPECT_SUBSTRING("\"name\":\"A\"", handler.msg());
   ExpectSubstringF(handler.msg(),
-                   "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid);
+                   "\"id\":\"classes\\/%" Pd "\"", cid);
 
   // Request canonical type 0 from class A.
   service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'types', '0'],"
@@ -790,9 +808,9 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Type\"", handler.msg());
+  EXPECT_SUBSTRING("\"name\":\"A<bool>\"", handler.msg());
   ExpectSubstringF(handler.msg(),
-                   "\"id\":\"classes\\/%" Pd "\\/types\\/0\","
-                   "\"name\":\"A<bool>\",", cid);
+                   "\"id\":\"classes\\/%" Pd "\\/types\\/0\"", cid);
 
   // Request canonical type 1 from class A.
   service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'types', '1'],"
@@ -800,9 +818,9 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"Type\"", handler.msg());
+  EXPECT_SUBSTRING("\"name\":\"A<A<bool>>\"", handler.msg());
   ExpectSubstringF(handler.msg(),
-                   "\"id\":\"classes\\/%" Pd "\\/types\\/1\","
-                   "\"name\":\"A<A<bool>>\",", cid);
+                   "\"id\":\"classes\\/%" Pd "\\/types\\/1\"", cid);
 
   // Request for non-existent canonical type from class A.
   service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'types', '42'],"
@@ -995,6 +1013,39 @@
 }
 
 
+TEST_CASE(Service_Scripts) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "main() {\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(h_lib);
+
+  // Build a mock message handler and wrap it in a dart port.
+  ServiceTestMessageHandler handler;
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  Dart_Handle port =
+      Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+
+  Instance& service_msg = Instance::Handle();
+  service_msg = Eval(h_lib, "[port, ['scripts', 'dart:test-lib'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_STREQ(
+      "{\"type\":\"Script\",\"id\":\"scripts\\/dart%3Atest-lib\","
+       "\"name\":\"dart:test-lib\",\"user_name\":\"dart:test-lib\","
+       "\"kind\":\"script\","
+       "\"source\":\"var port;\\n\\nmain() {\\n}\","
+       "\"tokenPosTable\":[[1,0,1,1,5,2,9],[3,5,1,6,5,7,6,8,8],[4,10,1]]}",
+      handler.msg());
+}
+
+
 TEST_CASE(Service_Coverage) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
@@ -1067,6 +1118,45 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
+
+  // Too long.
+  service_msg = Eval(h_lib, "[port, ['allocationprofile', 'foo'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
+
+  // Bad gc option.
+  service_msg = Eval(h_lib, "[port, ['allocationprofile'], ['gc'], ['cat']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
+
+  // Bad reset option.
+  service_msg = Eval(h_lib, "[port, ['allocationprofile'], ['reset'], ['ff']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
+
+  // Good reset.
+  service_msg =
+      Eval(h_lib, "[port, ['allocationprofile'], ['reset'], ['true']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
+
+  // Good GC.
+  service_msg =
+      Eval(h_lib, "[port, ['allocationprofile'], ['gc'], ['full']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
+
+  // Good GC and reset.
+  service_msg = Eval(h_lib,
+      "[port, ['allocationprofile'], ['gc', 'reset'], ['full', 'true']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
 }
 
 
@@ -1290,3 +1380,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/simulator.h b/runtime/vm/simulator.h
index 58c493f..5838f7c 100644
--- a/runtime/vm/simulator.h
+++ b/runtime/vm/simulator.h
@@ -21,6 +21,14 @@
 #include "vm/simulator_arm.h"
 #endif
 
+#elif defined(TARGET_ARCH_ARM64)
+#if defined(HOST_ARCH_ARM64)
+// No simulator used.
+#else
+#define USING_SIMULATOR 1
+#include "vm/simulator_arm64.h"
+#endif
+
 #elif defined(TARGET_ARCH_MIPS)
 #if defined(HOST_ARCH_MIPS)
 // No simulator used.
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
new file mode 100644
index 0000000..d15b8e3
--- /dev/null
+++ b/runtime/vm/simulator_arm64.cc
@@ -0,0 +1,1008 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include <math.h>  // for isnan.
+#include <setjmp.h>
+#include <stdlib.h>
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_ARM64)
+
+// Only build the simulator if not compiling for real ARM hardware.
+#if !defined(HOST_ARCH_ARM64)
+
+#include "vm/simulator.h"
+
+#include "vm/assembler.h"
+#include "vm/constants_arm64.h"
+#include "vm/cpu.h"
+#include "vm/disassembler.h"
+#include "vm/native_arguments.h"
+#include "vm/stack_frame.h"
+#include "vm/thread.h"
+
+namespace dart {
+
+DEFINE_FLAG(bool, trace_sim, false, "Trace simulator execution.");
+DEFINE_FLAG(int, stop_sim_at, 0, "Address to stop simulator at.");
+
+
+// This macro provides a platform independent use of sscanf. The reason for
+// SScanF not being implemented in a platform independent way through
+// OS in the same way as SNPrint is that the Windows C Run-Time
+// Library does not provide vsscanf.
+#define SScanF sscanf  // NOLINT
+
+
+Simulator::Simulator() {
+  // Setup simulator support first. Some of this information is needed to
+  // setup the architecture state.
+  // We allocate the stack here, the size is computed as the sum of
+  // the size specified by the user and the buffer space needed for
+  // handling stack overflow exceptions. To be safe in potential
+  // stack underflows we also add some underflow buffer space.
+  stack_ = new char[(Isolate::GetSpecifiedStackSize() +
+                     Isolate::kStackSizeBuffer +
+                     kSimulatorStackUnderflowSize)];
+  pc_modified_ = false;
+  icount_ = 0;
+  break_pc_ = NULL;
+  break_instr_ = 0;
+  top_exit_frame_info_ = 0;
+
+  // Setup architecture state.
+  // All registers are initialized to zero to start with.
+  for (int i = 0; i < kNumberOfCpuRegisters; i++) {
+    registers_[i] = 0;
+  }
+  n_flag_ = false;
+  z_flag_ = false;
+  c_flag_ = false;
+  v_flag_ = false;
+
+  // The sp is initialized to point to the bottom (high address) of the
+  // allocated stack area.
+  registers_[R31] = StackTop();
+  // The lr and pc are initialized to a known bad value that will cause an
+  // access violation if the simulator ever tries to execute it.
+  registers_[LR] = kBadLR;
+  pc_ = kBadLR;
+}
+
+
+Simulator::~Simulator() {
+  delete[] stack_;
+  Isolate* isolate = Isolate::Current();
+  if (isolate != NULL) {
+    isolate->set_simulator(NULL);
+  }
+}
+
+
+// Get the active Simulator for the current isolate.
+Simulator* Simulator::Current() {
+  Simulator* simulator = Isolate::Current()->simulator();
+  if (simulator == NULL) {
+    simulator = new Simulator();
+    Isolate::Current()->set_simulator(simulator);
+  }
+  return simulator;
+}
+
+
+// Sets the register in the architecture state.
+void Simulator::set_register(Register reg, int64_t value, R31Type r31t) {
+  // register is in range, and if it is R31, a mode is specified.
+  ASSERT((reg >= 0) && (reg < kNumberOfCpuRegisters));
+  ASSERT((reg != R31) || (r31t != R31IsUndef));
+  if ((reg != R31) || (r31t != R31IsZR)) {
+    registers_[reg] = value;
+  }
+}
+
+
+// Get the register from the architecture state.
+int64_t Simulator::get_register(Register reg, R31Type r31t) const {
+  ASSERT((reg >= 0) && (reg < kNumberOfCpuRegisters));
+  ASSERT((reg != R31) || (r31t != R31IsUndef));
+  if ((reg == R31) && (r31t == R31IsZR)) {
+    return 0;
+  } else {
+    return registers_[reg];
+  }
+}
+
+
+void Simulator::set_wregister(Register reg, int32_t value, R31Type r31t) {
+  ASSERT((reg >= 0) && (reg < kNumberOfCpuRegisters));
+  ASSERT((reg != R31) || (r31t != R31IsUndef));
+  // When setting in W mode, clear the high bits.
+  if ((reg != R31) || (r31t != R31IsZR)) {
+    registers_[reg] = Utils::LowHighTo64Bits(static_cast<uint32_t>(value), 0);
+  }
+}
+
+
+// Get the register from the architecture state.
+int32_t Simulator::get_wregister(Register reg, R31Type r31t) const {
+  ASSERT((reg >= 0) && (reg < kNumberOfCpuRegisters));
+  ASSERT((reg != R31) || (r31t != R31IsUndef));
+  if ((reg == R31) && (r31t == R31IsZR)) {
+    return 0;
+  } else {
+    return registers_[reg];
+  }
+}
+
+
+// Raw access to the PC register.
+void Simulator::set_pc(int64_t value) {
+  pc_modified_ = true;
+  pc_ = value;
+}
+
+
+// Raw access to the PC register without the special adjustment when reading.
+int64_t Simulator::get_pc() const {
+  return pc_;
+}
+
+
+void Simulator::HandleIllegalAccess(uword addr, Instr* instr) {
+  uword fault_pc = get_pc();
+  // TODO(zra): drop into debugger.
+  char buffer[128];
+  snprintf(buffer, sizeof(buffer),
+           "illegal memory access at 0x%" Px ", pc=0x%" Px "\n",
+           addr, fault_pc);
+  // The debugger will return control in non-interactive mode.
+  FATAL("Cannot continue execution after illegal memory access.");
+}
+
+
+// The ARMv8 manual advises that an unaligned access may generate a fault,
+// and if not, will likely take a number of additional cycles to execute,
+// so let's just not generate any.
+void Simulator::UnalignedAccess(const char* msg, uword addr, Instr* instr) {
+  char buffer[64];
+  snprintf(buffer, sizeof(buffer),
+           "unaligned %s at 0x%" Px ", pc=%p\n", msg, addr, instr);
+  // TODO(zra): Drop into the simulator debugger when it exists.
+  // The debugger will not be able to single step past this instruction, but
+  // it will be possible to disassemble the code and inspect registers.
+  FATAL("Cannot continue execution after unaligned access.");
+}
+
+
+void Simulator::UnimplementedInstruction(Instr* instr) {
+  char buffer[64];
+  snprintf(buffer, sizeof(buffer), "Unimplemented instruction: pc=%p\n", instr);
+  // TODO(zra): drop into debugger.
+  FATAL("Cannot continue execution after unimplemented instruction.");
+}
+
+
+// Returns the top of the stack area to enable checking for stack pointer
+// validity.
+uword Simulator::StackTop() const {
+  // To be safe in potential stack underflows we leave some buffer above and
+  // set the stack top.
+  return reinterpret_cast<uword>(stack_) +
+      (Isolate::GetSpecifiedStackSize() + Isolate::kStackSizeBuffer);
+}
+
+
+intptr_t Simulator::ReadX(uword addr, Instr* instr) {
+  if ((addr & 7) == 0) {
+    intptr_t* ptr = reinterpret_cast<intptr_t*>(addr);
+    return *ptr;
+  }
+  UnalignedAccess("read", addr, instr);
+  return 0;
+}
+
+
+void Simulator::WriteX(uword addr, intptr_t value, Instr* instr) {
+  if ((addr & 7) == 0) {
+    intptr_t* ptr = reinterpret_cast<intptr_t*>(addr);
+    *ptr = value;
+    return;
+  }
+  UnalignedAccess("write", addr, instr);
+}
+
+
+uint32_t Simulator::ReadWU(uword addr, Instr* instr) {
+  if ((addr & 3) == 0) {
+    uint32_t* ptr = reinterpret_cast<uint32_t*>(addr);
+    return *ptr;
+  }
+  UnalignedAccess("read unsigned single word", addr, instr);
+  return 0;
+}
+
+
+int32_t Simulator::ReadW(uword addr, Instr* instr) {
+  if ((addr & 3) == 0) {
+    int32_t* ptr = reinterpret_cast<int32_t*>(addr);
+    return *ptr;
+  }
+  UnalignedAccess("read single word", addr, instr);
+  return 0;
+}
+
+
+void Simulator::WriteW(uword addr, uint32_t value, Instr* instr) {
+  if ((addr & 3) == 0) {
+    uint32_t* ptr = reinterpret_cast<uint32_t*>(addr);
+    *ptr = value;
+    return;
+  }
+  UnalignedAccess("write single word", addr, instr);
+}
+
+
+uint16_t Simulator::ReadHU(uword addr, Instr* instr) {
+  if ((addr & 1) == 0) {
+    uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
+    return *ptr;
+  }
+  UnalignedAccess("unsigned halfword read", addr, instr);
+  return 0;
+}
+
+
+int16_t Simulator::ReadH(uword addr, Instr* instr) {
+  if ((addr & 1) == 0) {
+    int16_t* ptr = reinterpret_cast<int16_t*>(addr);
+    return *ptr;
+  }
+  UnalignedAccess("signed halfword read", addr, instr);
+  return 0;
+}
+
+
+void Simulator::WriteH(uword addr, uint16_t value, Instr* instr) {
+  if ((addr & 1) == 0) {
+    uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
+    *ptr = value;
+    return;
+  }
+  UnalignedAccess("halfword write", addr, instr);
+}
+
+
+uint8_t Simulator::ReadBU(uword addr) {
+  uint8_t* ptr = reinterpret_cast<uint8_t*>(addr);
+  return *ptr;
+}
+
+
+int8_t Simulator::ReadB(uword addr) {
+  int8_t* ptr = reinterpret_cast<int8_t*>(addr);
+  return *ptr;
+}
+
+
+void Simulator::WriteB(uword addr, uint8_t value) {
+  uint8_t* ptr = reinterpret_cast<uint8_t*>(addr);
+  *ptr = value;
+}
+
+
+// Unsupported instructions use Format to print an error and stop execution.
+void Simulator::Format(Instr* instr, const char* format) {
+  OS::Print("Simulator found unsupported instruction:\n 0x%p: %s\n",
+            instr,
+            format);
+  UNIMPLEMENTED();
+}
+
+
+// Calculate and set the Negative and Zero flags.
+void Simulator::SetNZFlagsW(int32_t val) {
+  n_flag_ = (val < 0);
+  z_flag_ = (val == 0);
+}
+
+
+// Calculate C flag value for additions.
+bool Simulator::CarryFromW(int32_t left, int32_t right) {
+  uint32_t uleft = static_cast<uint32_t>(left);
+  uint32_t uright = static_cast<uint32_t>(right);
+  uint32_t urest  = 0xffffffffU - uleft;
+
+  return (uright > urest);
+}
+
+
+// Calculate C flag value for subtractions.
+bool Simulator::BorrowFromW(int32_t left, int32_t right) {
+  uint32_t uleft = static_cast<uint32_t>(left);
+  uint32_t uright = static_cast<uint32_t>(right);
+
+  return (uright > uleft);
+}
+
+
+// Calculate V flag value for additions and subtractions.
+bool Simulator::OverflowFromW(int32_t alu_out,
+                              int32_t left, int32_t right, bool addition) {
+  bool overflow;
+  if (addition) {
+               // operands have the same sign
+    overflow = ((left >= 0 && right >= 0) || (left < 0 && right < 0))
+               // and operands and result have different sign
+               && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));
+  } else {
+               // operands have different signs
+    overflow = ((left < 0 && right >= 0) || (left >= 0 && right < 0))
+               // and first operand and result have different signs
+               && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));
+  }
+  return overflow;
+}
+
+
+// Calculate and set the Negative and Zero flags.
+void Simulator::SetNZFlagsX(int64_t val) {
+  n_flag_ = (val < 0);
+  z_flag_ = (val == 0);
+}
+
+
+// Calculate C flag value for additions.
+bool Simulator::CarryFromX(int64_t left, int64_t right) {
+  uint64_t uleft = static_cast<uint64_t>(left);
+  uint64_t uright = static_cast<uint64_t>(right);
+  uint64_t urest  = 0xffffffffffffffffULL - uleft;
+
+  return (uright > urest);
+}
+
+
+// Calculate C flag value for subtractions.
+bool Simulator::BorrowFromX(int64_t left, int64_t right) {
+  uint64_t uleft = static_cast<uint64_t>(left);
+  uint64_t uright = static_cast<uint64_t>(right);
+
+  return (uright > uleft);
+}
+
+
+// Calculate V flag value for additions and subtractions.
+bool Simulator::OverflowFromX(int64_t alu_out,
+                              int64_t left, int64_t right, bool addition) {
+  bool overflow;
+  if (addition) {
+               // operands have the same sign
+    overflow = ((left >= 0 && right >= 0) || (left < 0 && right < 0))
+               // and operands and result have different sign
+               && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));
+  } else {
+               // operands have different signs
+    overflow = ((left < 0 && right >= 0) || (left >= 0 && right < 0))
+               // and first operand and result have different signs
+               && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));
+  }
+  return overflow;
+}
+
+
+// Set the Carry flag.
+void Simulator::SetCFlag(bool val) {
+  c_flag_ = val;
+}
+
+
+// Set the oVerflow flag.
+void Simulator::SetVFlag(bool val) {
+  v_flag_ = val;
+}
+
+
+void Simulator::DecodeMoveWide(Instr* instr) {
+  const Register rd = instr->RdField();
+  const int hw = instr->HWField();
+  const int64_t shift = hw << 4;
+  const int64_t shifted_imm =
+      static_cast<uint64_t>(instr->Imm16Field()) << shift;
+
+  if (instr->SFField()) {
+    if (instr->Bits(29, 2) == 0) {
+      // Format(instr, "movn'sf 'rd, 'imm16 'hw");
+      set_register(rd, ~shifted_imm, instr->RdMode());
+    } else if (instr->Bits(29, 2) == 2) {
+      // Format(instr, "movz'sf 'rd, 'imm16 'hw");
+      set_register(rd, shifted_imm, instr->RdMode());
+    } else if (instr->Bits(29, 2) == 3) {
+      // Format(instr, "movk'sf 'rd, 'imm16 'hw");
+      const int64_t rd_val = get_register(rd, instr->RdMode());
+      const int64_t result = (rd_val & ~(0xffffL << shift)) | shifted_imm;
+      set_register(rd, result, instr->RdMode());
+    } else {
+      UnimplementedInstruction(instr);
+    }
+  } else if ((hw & 0x2) == 0) {
+    if (instr->Bits(29, 2) == 0) {
+      // Format(instr, "movn'sf 'rd, 'imm16 'hw");
+      set_wregister(rd, ~shifted_imm & kWRegMask,  instr->RdMode());
+    } else if (instr->Bits(29, 2) == 2) {
+      // Format(instr, "movz'sf 'rd, 'imm16 'hw");
+      set_wregister(rd, shifted_imm & kWRegMask, instr->RdMode());
+    } else if (instr->Bits(29, 2) == 3) {
+      // Format(instr, "movk'sf 'rd, 'imm16 'hw");
+      const int32_t rd_val = get_wregister(rd, instr->RdMode());
+      const int32_t result = (rd_val & ~(0xffffL << shift)) | shifted_imm;
+      set_wregister(rd, result, instr->RdMode());
+    } else {
+      UnimplementedInstruction(instr);
+    }
+  } else {
+    // Dest is 32 bits, but shift is more than 32.
+    UnimplementedInstruction(instr);
+  }
+}
+
+
+void Simulator::DecodeAddSubImm(Instr* instr) {
+  bool addition = (instr->Bit(30) == 0);
+  // Format(instr, "addi'sf's 'rd, 'rn, 'imm12s");
+  // Format(instr, "subi'sf's 'rd, 'rn, 'imm12s");
+  const Register rd = instr->RdField();
+  const Register rn = instr->RnField();
+  const uint32_t imm = (instr->Bit(22) == 1) ? (instr->Imm12Field() << 12)
+                                             : (instr->Imm12Field());
+  if (instr->SFField()) {
+    // 64-bit add.
+    const int64_t rn_val = get_register(rn, instr->RnMode());
+    const int64_t alu_out = addition ? (rn_val + imm) : (rn_val - imm);
+    set_register(rd, alu_out, instr->RdMode());
+    if (instr->HasS()) {
+      SetNZFlagsX(alu_out);
+      SetCFlag(CarryFromX(rn_val, imm));
+      SetVFlag(OverflowFromX(alu_out, rn_val, imm, addition));
+    }
+  } else {
+    // 32-bit add.
+    const int32_t rn_val = get_wregister(rn, instr->RnMode());
+    const int32_t alu_out = addition ? (rn_val + imm) : (rn_val - imm);
+    set_wregister(rd, alu_out, instr->RdMode());
+    if (instr->HasS()) {
+      SetNZFlagsW(alu_out);
+      SetCFlag(CarryFromW(rn_val, imm));
+      SetVFlag(OverflowFromW(alu_out, rn_val, imm, addition));
+    }
+  }
+}
+
+void Simulator::DecodeDPImmediate(Instr* instr) {
+  if (instr->IsMoveWideOp()) {
+    DecodeMoveWide(instr);
+  } else if (instr->IsAddSubImmOp()) {
+    DecodeAddSubImm(instr);
+  } else {
+    UnimplementedInstruction(instr);
+  }
+}
+
+
+void Simulator::DecodeExceptionGen(Instr* instr) {
+  UnimplementedInstruction(instr);
+}
+
+
+void Simulator::DecodeSystem(Instr* instr) {
+  if ((instr->Bits(0, 8) == 0x5f) && (instr->Bits(12, 4) == 2) &&
+      (instr->Bits(16, 3) == 3) && (instr->Bits(19, 2) == 0) &&
+      (instr->Bit(21) == 0)) {
+    if (instr->Bits(8, 4) == 0) {
+      // Format(instr, "nop");
+    } else {
+      UnimplementedInstruction(instr);
+    }
+  } else {
+    UnimplementedInstruction(instr);
+  }
+}
+
+
+void Simulator::DecodeUnconditionalBranchReg(Instr* instr) {
+  if ((instr->Bits(0, 5) == 0) && (instr->Bits(10, 6) == 0) &&
+      (instr->Bits(16, 5) == 0x1f)) {
+    switch (instr->Bits(21, 4)) {
+      case 2: {
+        // Format(instr, "ret 'rn");
+        const Register rn = instr->RnField();
+        const int64_t rn_val = get_register(rn, instr->RnMode());
+        set_pc(rn_val);
+        break;
+      }
+      default:
+        UnimplementedInstruction(instr);
+        break;
+    }
+  } else {
+    UnimplementedInstruction(instr);
+  }
+}
+
+
+void Simulator::DecodeCompareBranch(Instr* instr) {
+  if (instr->IsExceptionGenOp()) {
+    DecodeExceptionGen(instr);
+  } else if (instr->IsSystemOp()) {
+    DecodeSystem(instr);
+  } else if (instr->IsUnconditionalBranchRegOp()) {
+    DecodeUnconditionalBranchReg(instr);
+  } else {
+    UnimplementedInstruction(instr);
+  }
+}
+
+
+void Simulator::DecodeLoadStoreReg(Instr* instr) {
+  // TODO(zra): SIMD loads and stores have bit 26 (V) set.
+  // (bit 25 is never set for loads and stores).
+  if (instr->Bits(25, 2) != 0) {
+    UnimplementedInstruction(instr);
+    return;
+  }
+
+  // Calculate the address.
+  const Register rn = instr->RnField();
+  const Register rt = instr->RtField();
+  const int64_t rn_val = get_register(rn, R31IsSP);
+  const uint32_t size = instr->SzField();
+  uword address = 0;
+  uword wb_address = 0;
+  bool wb = false;
+  if (instr->Bit(24) == 1) {
+    // addr = rn + scaled unsigned 12-bit immediate offset.
+    const uint32_t imm12 = static_cast<uint32_t>(instr->Imm12Field());
+    const uint32_t offset = imm12 << size;
+    address = rn_val + offset;
+  } else if (instr->Bit(10) == 1) {
+    // addr = rn + signed 9-bit immediate offset.
+    wb = true;
+    const int64_t offset = static_cast<int64_t>(instr->SImm9Field());
+    if (instr->Bit(11) == 1) {
+      // Pre-index.
+      address = rn_val + offset;
+      wb_address = address;
+    } else {
+      // Post-index.
+      address = rn_val;
+      wb_address = rn_val + offset;
+    }
+  } else if (instr->Bits(10, 2) == 2) {
+    // addr = rn + (rm EXT optionally scaled by operand instruction size).
+    const Register rm = instr->RmField();
+    const Extend ext = instr->ExtendTypeField();
+    const uint8_t scale =
+        (ext == UXTX) && (instr->Bit(12) == 1) ? size : 0;
+    const int64_t rm_val = get_register(rm, R31IsZR);
+    const int64_t offset = ExtendOperand(kXRegSizeInBits, rm_val, ext, scale);
+    address = rn_val + offset;
+  } else {
+    UnimplementedInstruction(instr);
+  }
+
+  // Check the address.
+  if (IsIllegalAddress(address)) {
+    HandleIllegalAccess(address, instr);
+    return;
+  }
+
+  // Do access.
+  if (instr->Bits(22, 2) == 0) {
+    // Format(instr, "str'sz 'rt, 'memop");
+    int32_t rt_val32 = get_wregister(rt, R31IsZR);
+    switch (size) {
+      case 0: {
+        uint8_t val = static_cast<uint8_t>(rt_val32);
+        WriteB(address, val);
+        break;
+      }
+      case 1: {
+        uint16_t val = static_cast<uint16_t>(rt_val32);
+        WriteH(address, val, instr);
+        break;
+      }
+      case 2: {
+        uint32_t val = static_cast<uint32_t>(rt_val32);
+        WriteW(address, val, instr);
+        break;
+      }
+      case 3: {
+        int64_t val = get_register(rt, R31IsZR);
+        WriteX(address, val, instr);
+        break;
+      }
+      default:
+        UNREACHABLE();
+        break;
+    }
+  } else {
+    // Format(instr, "ldr'sz 'rt, 'memop");
+    // Undefined case.
+    if ((size == 3) && (instr->Bits(22, 0) == 3)) {
+      UnimplementedInstruction(instr);
+      return;
+    }
+
+    // Read the value.
+    const bool signd = instr->Bit(23) == 1;
+    // Write the W register for signed values when size < 2.
+    // Write the W register for unsigned values when size == 2.
+    const bool use_w =
+        (signd && (instr->Bit(22) == 1)) || (!signd && (size == 2));
+    int64_t val = 0;  // Sign extend into an int64_t.
+    switch (size) {
+      case 0: {
+        if (signd) {
+          val = static_cast<int64_t>(ReadB(address));
+        } else {
+          val = static_cast<int64_t>(ReadBU(address));
+        }
+        break;
+      }
+      case 1: {
+        if (signd) {
+          val = static_cast<int64_t>(ReadH(address, instr));
+        } else {
+          val = static_cast<int64_t>(ReadHU(address, instr));
+        }
+        break;
+      }
+      case 2: {
+        if (signd) {
+          val = static_cast<int64_t>(ReadW(address, instr));
+        } else {
+          val = static_cast<int64_t>(ReadWU(address, instr));
+        }
+        break;
+      }
+      case 3:
+        val = ReadX(address, instr);
+        break;
+      default:
+        UNREACHABLE();
+        break;
+    }
+
+    // Write to register.
+    if (use_w) {
+      set_wregister(rt, static_cast<int32_t>(val), R31IsZR);
+    } else {
+      set_register(rt, val, R31IsZR);
+    }
+  }
+
+  // Do writeback.
+  if (wb) {
+    set_register(rn, wb_address, R31IsSP);
+  }
+}
+
+
+void Simulator::DecodeLoadStore(Instr* instr) {
+  if (instr->IsLoadStoreRegOp()) {
+    DecodeLoadStoreReg(instr);
+  } else {
+    UnimplementedInstruction(instr);
+  }
+}
+
+
+int64_t Simulator::ShiftOperand(uint8_t reg_size,
+                                int64_t value,
+                                Shift shift_type,
+                                uint8_t amount) {
+  if (amount == 0) {
+    return value;
+  }
+  int64_t mask = reg_size == kXRegSizeInBits ? kXRegMask : kWRegMask;
+  switch (shift_type) {
+    case LSL:
+      return (value << amount) & mask;
+    case LSR:
+      return static_cast<uint64_t>(value) >> amount;
+    case ASR: {
+      // Shift used to restore the sign.
+      uint8_t s_shift = kXRegSizeInBits - reg_size;
+      // Value with its sign restored.
+      int64_t s_value = (value << s_shift) >> s_shift;
+      return (s_value >> amount) & mask;
+    }
+    case ROR: {
+      if (reg_size == kWRegSizeInBits) {
+        value &= kWRegMask;
+      }
+      return (static_cast<uint64_t>(value) >> amount) |
+             ((value & ((1L << amount) - 1L)) << (reg_size - amount));
+    }
+    default:
+      UNIMPLEMENTED();
+      return 0;
+  }
+}
+
+
+int64_t Simulator::ExtendOperand(uint8_t reg_size,
+                                 int64_t value,
+                                 Extend extend_type,
+                                 uint8_t amount) {
+  switch (extend_type) {
+    case UXTB:
+      value &= 0xff;
+      break;
+    case UXTH:
+      value &= 0xffff;
+      break;
+    case UXTW:
+      value &= 0xffffffff;
+      break;
+    case SXTB:
+      value = (value << 56) >> 56;
+      break;
+    case SXTH:
+      value = (value << 48) >> 48;
+      break;
+    case SXTW:
+      value = (value << 32) >> 32;
+      break;
+    case UXTX:
+    case SXTX:
+      break;
+    default:
+      UNREACHABLE();
+  }
+  int64_t mask = (reg_size == kXRegSizeInBits) ? kXRegMask : kWRegMask;
+  return (value << amount) & mask;
+}
+
+
+int64_t Simulator::DecodeShiftExtendOperand(Instr* instr) {
+  const Register rm = instr->RmField();
+  const int64_t rm_val = get_register(rm, R31IsZR);
+  const uint8_t size = instr->SFField() ? kXRegSizeInBits : kWRegSizeInBits;
+  if (instr->IsShift()) {
+    const Shift shift_type = instr->ShiftTypeField();
+    const uint8_t shift_amount = instr->Imm6Field();
+    return ShiftOperand(size, rm_val, shift_type, shift_amount);
+  } else {
+    ASSERT(instr->IsExtend());
+    const Extend extend_type = instr->ExtendTypeField();
+    const uint8_t shift_amount = instr->Imm3Field();
+    return ExtendOperand(size, rm_val, extend_type, shift_amount);
+  }
+  UNREACHABLE();
+  return -1;
+}
+
+
+void Simulator::DecodeAddSubShiftExt(Instr* instr) {
+  switch (instr->Bit(30)) {
+    case 0: {
+      // Format(instr, "add'sf's 'rd, 'rn, 'shift_op");
+      const Register rd = instr->RdField();
+      const Register rn = instr->RnField();
+      const int64_t rm_val = DecodeShiftExtendOperand(instr);
+      if (instr->SFField()) {
+        // 64-bit add.
+        const int64_t rn_val = get_register(rn, instr->RnMode());
+        const int64_t alu_out = rn_val + rm_val;
+        set_register(rd, alu_out, instr->RdMode());
+        if (instr->HasS()) {
+          SetNZFlagsX(alu_out);
+          SetCFlag(CarryFromX(rn_val, rm_val));
+          SetVFlag(OverflowFromX(alu_out, rn_val, rm_val, true));
+        }
+      } else {
+        // 32-bit add.
+        const int32_t rn_val = get_wregister(rn, instr->RnMode());
+        const int32_t rm_val32 = static_cast<int32_t>(rm_val & kWRegMask);
+        const int32_t alu_out = rn_val + rm_val32;
+        set_wregister(rd, alu_out, instr->RdMode());
+        if (instr->HasS()) {
+          SetNZFlagsW(alu_out);
+          SetCFlag(CarryFromW(rn_val, rm_val32));
+          SetVFlag(OverflowFromW(alu_out, rn_val, rm_val32, true));
+        }
+      }
+      break;
+    }
+    default:
+      UnimplementedInstruction(instr);
+      break;
+  }
+}
+
+
+void Simulator::DecodeDPRegister(Instr* instr) {
+  if (instr->IsAddSubShiftExtOp()) {
+    DecodeAddSubShiftExt(instr);
+  } else {
+    UnimplementedInstruction(instr);
+  }
+}
+
+
+void Simulator::DecodeDPSimd1(Instr* instr) {
+  UnimplementedInstruction(instr);
+}
+
+
+void Simulator::DecodeDPSimd2(Instr* instr) {
+  UnimplementedInstruction(instr);
+}
+
+
+// Executes the current instruction.
+void Simulator::InstructionDecode(Instr* instr) {
+  pc_modified_ = false;
+  if (FLAG_trace_sim) {
+    const uword start = reinterpret_cast<uword>(instr);
+    const uword end = start + Instr::kInstrSize;
+    Disassembler::Disassemble(start, end);
+  }
+
+  if (instr->IsDPImmediateOp()) {
+    DecodeDPImmediate(instr);
+  } else if (instr->IsCompareBranchOp()) {
+    DecodeCompareBranch(instr);
+  } else if (instr->IsLoadStoreOp()) {
+    DecodeLoadStore(instr);
+  } else if (instr->IsDPRegisterOp()) {
+    DecodeDPRegister(instr);
+  } else if (instr->IsDPSimd1Op()) {
+    DecodeDPSimd1(instr);
+  } else {
+    ASSERT(instr->IsDPSimd2Op());
+    DecodeDPSimd2(instr);
+  }
+
+  if (!pc_modified_) {
+    set_pc(reinterpret_cast<int64_t>(instr) + Instr::kInstrSize);
+  }
+}
+
+
+void Simulator::Execute() {
+  // Get the PC to simulate. Cannot use the accessor here as we need the
+  // raw PC value and not the one used as input to arithmetic instructions.
+  uword program_counter = get_pc();
+
+  if (FLAG_stop_sim_at == 0) {
+    // Fast version of the dispatch loop without checking whether the simulator
+    // should be stopping at a particular executed instruction.
+    while (program_counter != kEndSimulatingPC) {
+      Instr* instr = reinterpret_cast<Instr*>(program_counter);
+      icount_++;
+      if (IsIllegalAddress(program_counter)) {
+        HandleIllegalAccess(program_counter, instr);
+      } else {
+        InstructionDecode(instr);
+      }
+      program_counter = get_pc();
+    }
+  } else {
+    // FLAG_stop_sim_at is at the non-default value. Stop in the debugger when
+    // we reach the particular instruction count.
+    while (program_counter != kEndSimulatingPC) {
+      Instr* instr = reinterpret_cast<Instr*>(program_counter);
+      icount_++;
+      if (icount_ == FLAG_stop_sim_at) {
+        // TODO(zra): Add a debugger.
+        UNIMPLEMENTED();
+      } else if (IsIllegalAddress(program_counter)) {
+        HandleIllegalAccess(program_counter, instr);
+      } else {
+        InstructionDecode(instr);
+      }
+      program_counter = get_pc();
+    }
+  }
+}
+
+
+int64_t Simulator::Call(int64_t entry,
+                        int64_t parameter0,
+                        int64_t parameter1,
+                        int64_t parameter2,
+                        int64_t parameter3) {
+  // Save the SP register before the call so we can restore it.
+  intptr_t sp_before_call = get_register(R31, R31IsSP);
+
+  // Setup parameters.
+  set_register(R0, parameter0);
+  set_register(R1, parameter1);
+  set_register(R2, parameter2);
+  set_register(R3, parameter3);
+
+  // Make sure the activation frames are properly aligned.
+  intptr_t stack_pointer = sp_before_call;
+  if (OS::ActivationFrameAlignment() > 1) {
+    stack_pointer =
+        Utils::RoundDown(stack_pointer, OS::ActivationFrameAlignment());
+  }
+  set_register(R31, stack_pointer, R31IsSP);
+
+  // Prepare to execute the code at entry.
+  set_pc(entry);
+  // Put down marker for end of simulation. The simulator will stop simulation
+  // when the PC reaches this value. By saving the "end simulation" value into
+  // the LR the simulation stops when returning to this call point.
+  set_register(LR, kEndSimulatingPC);
+
+  // Remember the values of callee-saved registers.
+  int64_t r19_val = get_register(R19);
+  int64_t r20_val = get_register(R20);
+  int64_t r21_val = get_register(R21);
+  int64_t r22_val = get_register(R22);
+  int64_t r23_val = get_register(R23);
+  int64_t r24_val = get_register(R24);
+  int64_t r25_val = get_register(R25);
+  int64_t r26_val = get_register(R26);
+  int64_t r27_val = get_register(R27);
+  int64_t r28_val = get_register(R28);
+  int64_t r29_val = get_register(R29);
+
+  // Setup the callee-saved registers with a known value. To be able to check
+  // that they are preserved properly across dart execution.
+  int64_t callee_saved_value = icount_;
+  set_register(R19, callee_saved_value);
+  set_register(R20, callee_saved_value);
+  set_register(R21, callee_saved_value);
+  set_register(R22, callee_saved_value);
+  set_register(R23, callee_saved_value);
+  set_register(R24, callee_saved_value);
+  set_register(R25, callee_saved_value);
+  set_register(R26, callee_saved_value);
+  set_register(R27, callee_saved_value);
+  set_register(R28, callee_saved_value);
+  set_register(R29, callee_saved_value);
+
+  // Start the simulation
+  Execute();
+
+  // Check that the callee-saved registers have been preserved.
+  ASSERT(callee_saved_value == get_register(R19));
+  ASSERT(callee_saved_value == get_register(R20));
+  ASSERT(callee_saved_value == get_register(R21));
+  ASSERT(callee_saved_value == get_register(R22));
+  ASSERT(callee_saved_value == get_register(R23));
+  ASSERT(callee_saved_value == get_register(R24));
+  ASSERT(callee_saved_value == get_register(R25));
+  ASSERT(callee_saved_value == get_register(R26));
+  ASSERT(callee_saved_value == get_register(R27));
+  ASSERT(callee_saved_value == get_register(R28));
+  ASSERT(callee_saved_value == get_register(R29));
+
+  // Restore callee-saved registers with the original value.
+  set_register(R19, r19_val);
+  set_register(R20, r20_val);
+  set_register(R21, r21_val);
+  set_register(R22, r22_val);
+  set_register(R23, r23_val);
+  set_register(R24, r24_val);
+  set_register(R25, r25_val);
+  set_register(R26, r26_val);
+  set_register(R27, r27_val);
+  set_register(R28, r28_val);
+  set_register(R29, r29_val);
+
+  // Restore the SP register and return R1:R0.
+  set_register(R31, sp_before_call, R31IsSP);
+  int64_t return_value;
+  return_value = get_register(R0);
+  return return_value;
+}
+
+}  // namespace dart
+
+#endif  // !defined(HOST_ARCH_ARM64)
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/simulator_arm64.h b/runtime/vm/simulator_arm64.h
new file mode 100644
index 0000000..6c32c1b
--- /dev/null
+++ b/runtime/vm/simulator_arm64.h
@@ -0,0 +1,178 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Declares a Simulator for ARM64 instructions if we are not generating a native
+// ARM64 binary. This Simulator allows us to run and debug ARM64 code generation
+// on regular desktop machines.
+// Dart calls into generated code by "calling" the InvokeDartCode stub,
+// which will start execution in the Simulator or forwards to the real entry
+// on a ARM64 HW platform.
+
+#ifndef VM_SIMULATOR_ARM64_H_
+#define VM_SIMULATOR_ARM64_H_
+
+#ifndef VM_SIMULATOR_H_
+#error Do not include simulator_arm64.h directly; use simulator.h.
+#endif
+
+#include "vm/constants_arm64.h"
+#include "vm/object.h"
+
+namespace dart {
+
+class Isolate;
+
+class Simulator {
+ public:
+  static const uword kSimulatorStackUnderflowSize = 64;
+
+  Simulator();
+  ~Simulator();
+
+  // The currently executing Simulator instance, which is associated to the
+  // current isolate
+  static Simulator* Current();
+
+  // Accessors for register state.
+  void set_register(Register reg, int64_t value, R31Type r31t = R31IsUndef);
+  int64_t get_register(Register reg, R31Type r31t = R31IsUndef) const;
+  void set_wregister(Register reg, int32_t value, R31Type r31t = R31IsUndef);
+  int32_t get_wregister(Register reg, R31Type r31t = R31IsUndef) const;
+
+  int64_t get_pc() const;
+  void set_pc(int64_t pc);
+
+  // Accessor to the internal simulator stack top.
+  uword StackTop() const;
+
+  // The isolate's top_exit_frame_info refers to a Dart frame in the simulator
+  // stack. The simulator's top_exit_frame_info refers to a C++ frame in the
+  // native stack.
+  uword top_exit_frame_info() const { return top_exit_frame_info_; }
+  void set_top_exit_frame_info(uword value) { top_exit_frame_info_ = value; }
+
+  // Call on program start.
+  static void InitOnce() {}
+
+  // Dart generally calls into generated code with 5 parameters. This is a
+  // convenience function, which sets up the simulator state and grabs the
+  // result on return. The return value is R0. The parameters are placed in
+  // R0-3.
+  int64_t Call(int64_t entry,
+               int64_t parameter0,
+               int64_t parameter1,
+               int64_t parameter2,
+               int64_t parameter3);
+
+  void Longjmp(uword pc,
+               uword sp,
+               uword fp,
+               RawObject* raw_exception,
+               RawObject* raw_stacktrace) {
+    UNIMPLEMENTED();
+  }
+
+ private:
+  // Known bad pc value to ensure that the simulator does not execute
+  // without being properly setup.
+  static const uword kBadLR = -1;
+  // A pc value used to signal the simulator to stop execution.  Generally
+  // the lr is set to this value on transition from native C code to
+  // simulated execution, so that the simulator can "return" to the native
+  // C code.
+  static const uword kEndSimulatingPC = -2;
+
+  // CPU state.
+  int64_t registers_[kNumberOfCpuRegisters];
+  bool n_flag_;
+  bool z_flag_;
+  bool c_flag_;
+  bool v_flag_;
+
+  // Simulator support.
+  int64_t pc_;
+  char* stack_;
+  bool pc_modified_;
+  intptr_t icount_;
+  static int64_t flag_stop_sim_at_;
+  uword top_exit_frame_info_;
+
+  // Registered breakpoints.
+  Instr* break_pc_;
+  int64_t break_instr_;
+
+  // Illegal memory access support.
+  static bool IsIllegalAddress(uword addr) {
+    return addr < 64*1024;
+  }
+  void HandleIllegalAccess(uword addr, Instr* instr);
+
+  // Handles an unaligned memory access.
+  void UnalignedAccess(const char* msg, uword addr, Instr* instr);
+
+  // Handles a legal instruction that the simulator does not implement.
+  void UnimplementedInstruction(Instr* instr);
+
+  // Unsupported instructions use Format to print an error and stop execution.
+  void Format(Instr* instr, const char* format);
+
+  inline uint8_t ReadBU(uword addr);
+  inline int8_t ReadB(uword addr);
+  inline void WriteB(uword addr, uint8_t value);
+
+  inline uint16_t ReadHU(uword addr, Instr* instr);
+  inline int16_t ReadH(uword addr, Instr* instr);
+  inline void WriteH(uword addr, uint16_t value, Instr* instr);
+
+  inline uint32_t ReadWU(uword addr, Instr* instr);
+  inline int32_t ReadW(uword addr, Instr* instr);
+  inline void WriteW(uword addr, uint32_t value, Instr* instr);
+
+  inline intptr_t ReadX(uword addr, Instr* instr);
+  inline void WriteX(uword addr, intptr_t value, Instr* instr);
+
+  // Helper functions to set the conditional flags in the architecture state.
+  void SetNZFlagsW(int32_t val);
+  bool CarryFromW(int32_t left, int32_t right);
+  bool BorrowFromW(int32_t left, int32_t right);
+  bool OverflowFromW(
+      int32_t alu_out, int32_t left, int32_t right, bool addition);
+
+  void SetNZFlagsX(int64_t val);
+  bool CarryFromX(int64_t left, int64_t right);
+  bool BorrowFromX(int64_t left, int64_t right);
+  bool OverflowFromX(
+      int64_t alu_out, int64_t left, int64_t right, bool addition);
+
+  void SetCFlag(bool val);
+  void SetVFlag(bool val);
+
+  int64_t ShiftOperand(uint8_t reg_size,
+                       int64_t value,
+                       Shift shift_type,
+                       uint8_t amount);
+
+  int64_t ExtendOperand(uint8_t reg_size,
+                        int64_t value,
+                        Extend extend_type,
+                        uint8_t amount);
+
+  int64_t DecodeShiftExtendOperand(Instr* instr);
+
+  // Decode instructions.
+  void InstructionDecode(Instr* instr);
+  #define DECODE_OP(op)                                                        \
+    void Decode##op(Instr* instr);
+  APPLY_OP_LIST(DECODE_OP)
+  #undef DECODE_OP
+
+  // Executes ARM64 instructions until the PC reaches kEndSimulatingPC.
+  void Execute();
+
+  DISALLOW_COPY_AND_ASSIGN(Simulator);
+};
+
+}  // namespace dart
+
+#endif  // VM_SIMULATOR_ARM64_H_
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 8c0a49e..9fef5bf 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -32,12 +32,13 @@
 static bool IsObjectStoreClassId(intptr_t class_id) {
   // Check if this is a class which is stored in the object store.
   return (class_id == kObjectCid ||
-          (class_id >= kInstanceCid && class_id <= kInt32x4Cid) ||
+          (class_id >= kInstanceCid && class_id <= kFloat64x2Cid) ||
           class_id == kArrayCid ||
           class_id == kImmutableArrayCid ||
           RawObject::IsStringClassId(class_id) ||
           RawObject::IsTypedDataClassId(class_id) ||
-          RawObject::IsExternalTypedDataClassId(class_id));
+          RawObject::IsExternalTypedDataClassId(class_id) ||
+          class_id == kNullCid);
 }
 
 
@@ -779,6 +780,10 @@
   if (object_id == kFalseValue) {
     return Bool::False().raw();
   }
+  if (object_id == kDoubleObject) {
+    ASSERT(kind_ == Snapshot::kMessage);
+    return Double::New(ReadDouble());
+  }
   intptr_t class_id = ClassIdFromObjectId(object_id);
   if (IsSingletonClassId(class_id)) {
     return isolate()->class_table()->At(class_id);  // get singleton class.
@@ -1208,6 +1213,15 @@
     return true;
   }
 
+  intptr_t cid = rawobj->GetClassId();
+
+  if ((kind_ == Snapshot::kMessage) && (cid == kDoubleCid)) {
+    WriteVMIsolateObject(kDoubleObject);
+    RawDouble* rd = reinterpret_cast<RawDouble*>(rawobj);
+    WriteDouble(rd->ptr()->value_);
+    return true;
+  }
+
   // Check if object has already been serialized, in that case just write
   // the object id out.
   uword tags = rawobj->ptr()->tags_;
@@ -1227,7 +1241,7 @@
 
   // Check if the object is a Mint and could potentially be a Smi
   // on other architectures (64 bit), if so write it out as int64_t value.
-  if (rawobj->GetClassId() == kMintCid) {
+  if (cid == kMintCid) {
     int64_t value = reinterpret_cast<RawMint*>(rawobj)->ptr()->value_;
     const intptr_t kSmi64Bits = 62;
     const int64_t kSmi64Max = (static_cast<int64_t>(1) << kSmi64Bits) - 1;
@@ -1240,7 +1254,7 @@
 
   // Check if it is a code object in that case just write a Null object
   // as we do not want code objects in the snapshot.
-  if (rawobj->GetClassId() == kCodeCid) {
+  if (cid == kCodeCid) {
     WriteVMIsolateObject(kNullObject);
     return true;
   }
@@ -1249,7 +1263,7 @@
   // or a predefined internal VM class in the object store.
   if (kind_ != Snapshot::kFull) {
     // Check if it is an internal VM class which is in the object store.
-    if (rawobj->GetClassId() == kClassCid) {
+    if (cid == kClassCid) {
       RawClass* raw_class = reinterpret_cast<RawClass*>(rawobj);
       intptr_t class_id = raw_class->ptr()->id_;
       if (IsObjectStoreClassId(class_id)) {
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 1530b65..327cbeb 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -182,6 +182,13 @@
     stream_.ReadBytes(addr, len);
   }
 
+  double ReadDouble() {
+    double result;
+    stream_.ReadBytes(reinterpret_cast<uint8_t*>(&result), sizeof(result));
+    return result;
+  }
+
+
   const uint8_t* CurrentBufferAddress() const {
     return stream_.AddressOfCurrentPosition();
   }
@@ -421,6 +428,10 @@
     stream_.WriteBytes(addr, len);
   }
 
+  void WriteDouble(double value) {
+    stream_.WriteBytes(reinterpret_cast<const uint8_t*>(&value), sizeof(value));
+  }
+
  protected:
   BaseWriter(uint8_t** buffer,
              ReAlloc alloc,
diff --git a/runtime/vm/snapshot_ids.h b/runtime/vm/snapshot_ids.h
index ad01aa0..3d8e03f 100644
--- a/runtime/vm/snapshot_ids.h
+++ b/runtime/vm/snapshot_ids.h
@@ -17,7 +17,10 @@
   kZeroArrayObject,
   kTrueValue,
   kFalseValue,
-  kClassIdsOffset = kFalseValue,
+  // Marker for special encoding of double objects in message snapshots.
+  kDoubleObject,
+
+  kClassIdsOffset = kDoubleObject,
 
   // The class ids of predefined classes are included in this list
   // at an offset of kClassIdsOffset.
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index a46d72a..01e14b2 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "include/dart_debugger_api.h"
 #include "platform/assert.h"
 #include "vm/bigint_operations.h"
@@ -2089,9 +2093,13 @@
       EXPECT_NOTNULL(root);
       EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
-      for (int i = 0; i < kArrayLength; i++) {
-        Dart_CObject* element = root->value.as_array.values[i];
-        EXPECT_EQ(root->value.as_array.values[0], element);
+      Dart_CObject* element = root->value.as_array.values[0];
+      EXPECT_EQ(Dart_CObject_kDouble, element->type);
+      EXPECT_EQ(3.14, element->value.as_double);
+      for (int i = 1; i < kArrayLength; i++) {
+        element = root->value.as_array.values[i];
+        // Double values are expected to not be canonicalized in messages.
+        EXPECT_NE(root->value.as_array.values[0], element);
         EXPECT_EQ(Dart_CObject_kDouble, element->type);
         EXPECT_EQ(3.14, element->value.as_double);
       }
@@ -2136,14 +2144,21 @@
       EXPECT_NOTNULL(root);
       EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
-      for (int i = 0; i < kArrayLength; i++) {
-        Dart_CObject* element = root->value.as_array.values[i];
+      Dart_CObject* element = root->value.as_array.values[0];
+      EXPECT_EQ(Dart_CObject_kString, element->type);
+      EXPECT_STREQ("A", element->value.as_string);
+      element = root->value.as_array.values[1];
+      EXPECT_EQ(Dart_CObject_kDouble, element->type);
+      EXPECT_STREQ(2.72, element->value.as_double);
+      for (int i = 2; i < kArrayLength; i++) {
+        element = root->value.as_array.values[i];
         if ((i % 2) == 0) {
           EXPECT_EQ(root->value.as_array.values[0], element);
           EXPECT_EQ(Dart_CObject_kString, element->type);
           EXPECT_STREQ("A", element->value.as_string);
         } else {
-          EXPECT_EQ(root->value.as_array.values[1], element);
+          // Double values are expected to not be canonicalized in messages.
+          EXPECT_NE(root->value.as_array.values[1], element);
           EXPECT_EQ(Dart_CObject_kDouble, element->type);
           EXPECT_STREQ(2.72, element->value.as_double);
         }
@@ -2193,10 +2208,10 @@
       "getDoubleList() {\n"
       "  var d = 3.14;\n"
       "  var list = [3.14, 3.14, 3.14, 3.14, 3.14, 3.14];\n"
-      "  list.add(3.14);;\n"
-      "  list.add(3.14);;\n"
-      "  list.add(3.14);;\n"
-      "  list.add(3.14);;\n"
+      "  list.add(3.14);\n"
+      "  list.add(3.14);\n"
+      "  list.add(3.14);\n"
+      "  list.add(3.14);\n"
       "  return list;\n"
       "}\n"
       "getTypedDataList() {\n"
@@ -2293,9 +2308,14 @@
       EXPECT_NOTNULL(root);
       EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
-      for (int i = 0; i < kArrayLength; i++) {
-        Dart_CObject* element = root->value.as_array.values[i];
-        EXPECT_EQ(root->value.as_array.values[0], element);
+      Dart_CObject* element = root->value.as_array.values[0];
+      // Double values are expected to not be canonicalized in messages.
+      EXPECT_EQ(Dart_CObject_kDouble, element->type);
+      EXPECT_EQ(3.14, element->value.as_double);
+      for (int i = 1; i < kArrayLength; i++) {
+        element = root->value.as_array.values[i];
+        // Double values are expected to not be canonicalized in messages.
+        EXPECT_NE(root->value.as_array.values[0], element);
         EXPECT_EQ(Dart_CObject_kDouble, element->type);
         EXPECT_EQ(3.14, element->value.as_double);
       }
@@ -2340,14 +2360,21 @@
       EXPECT_NOTNULL(root);
       EXPECT_EQ(Dart_CObject_kArray, root->type);
       EXPECT_EQ(kArrayLength, root->value.as_array.length);
-      for (int i = 0; i < kArrayLength; i++) {
+      Dart_CObject* element = root->value.as_array.values[0];
+      EXPECT_EQ(Dart_CObject_kString, element->type);
+      EXPECT_STREQ(".", element->value.as_string);
+      element = root->value.as_array.values[1];
+      EXPECT_EQ(Dart_CObject_kDouble, element->type);
+      EXPECT_STREQ(2.72, element->value.as_double);
+      for (int i = 2; i < kArrayLength; i++) {
         Dart_CObject* element = root->value.as_array.values[i];
         if ((i % 2) == 0) {
           EXPECT_EQ(root->value.as_array.values[0], element);
           EXPECT_EQ(Dart_CObject_kString, element->type);
           EXPECT_STREQ(".", element->value.as_string);
         } else {
-          EXPECT_EQ(root->value.as_array.values[1], element);
+          // Double values are expected to not be canonicalized in messages.
+          EXPECT_NE(root->value.as_array.values[1], element);
           EXPECT_EQ(Dart_CObject_kDouble, element->type);
           EXPECT_STREQ(2.72, element->value.as_double);
         }
@@ -2692,3 +2719,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/spaces.h b/runtime/vm/spaces.h
new file mode 100644
index 0000000..8d149b4
--- /dev/null
+++ b/runtime/vm/spaces.h
@@ -0,0 +1,26 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_SPACES_H_
+#define VM_SPACES_H_
+
+// This file contains utilities shared by old and new space.
+// TODO(koda): Create Space base class with Space::CurrentUsage().
+
+namespace dart {
+
+// Usage statistics for a space/generation at a particular moment in time.
+struct SpaceUsage {
+  SpaceUsage()
+    : capacity_in_words(0),
+      used_in_words(0),
+      external_in_words(0) {}
+  intptr_t capacity_in_words;
+  intptr_t used_in_words;
+  intptr_t external_in_words;
+};
+
+}  // namespace dart
+
+#endif  // VM_SPACES_H_
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 8de42f4..2727eee 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -15,6 +15,8 @@
 #include "vm/stack_frame_x64.h"
 #elif defined(TARGET_ARCH_ARM)
 #include "vm/stack_frame_arm.h"
+#elif defined(TARGET_ARCH_ARM64)
+#include "vm/stack_frame_arm64.h"
 #elif defined(TARGET_ARCH_MIPS)
 #include "vm/stack_frame_mips.h"
 #else
diff --git a/runtime/vm/stack_frame_arm64.h b/runtime/vm/stack_frame_arm64.h
new file mode 100644
index 0000000..49c7d29
--- /dev/null
+++ b/runtime/vm/stack_frame_arm64.h
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_STACK_FRAME_ARM64_H_
+#define VM_STACK_FRAME_ARM64_H_
+
+namespace dart {
+
+// TODO(zra):
+// These are the values for ARM. Fill in the values for ARM64 as they are
+// needed.
+
+static const int kDartFrameFixedSize = 4;  // PP, FP, LR, PC marker.
+static const int kSavedPcSlotFromSp = -2;
+
+static const int kFirstObjectSlotFromFp = -1;  // Used by GC to traverse stack.
+
+static const int kFirstLocalSlotFromFp = -2;
+static const int kSavedCallerPpSlotFromFp = -1;
+static const int kSavedCallerFpSlotFromFp = 0;
+static const int kSavedCallerPcSlotFromFp = 1;
+static const int kPcMarkerSlotFromFp = 2;
+static const int kParamEndSlotFromFp = 2;  // One slot past last parameter.
+static const int kCallerSpSlotFromFp = 3;
+
+// Entry and exit frame layout.
+static const int kSavedContextSlotFromEntryFp = -27;
+static const int kExitLinkSlotFromEntryFp = -26;
+static const int kSavedVMTagSlotFromEntryFp = -25;
+
+}  // namespace dart
+
+#endif  // VM_STACK_FRAME_ARM64_H_
diff --git a/runtime/vm/stack_frame_test.cc b/runtime/vm/stack_frame_test.cc
index 4a06610..ce45fce 100644
--- a/runtime/vm/stack_frame_test.cc
+++ b/runtime/vm/stack_frame_test.cc
@@ -2,6 +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.
 
+// TODO(zra): Remove when tests are ready to enable.
+#include "platform/globals.h"
+#if !defined(TARGET_ARCH_ARM64)
+
 #include "include/dart_api.h"
 #include "platform/assert.h"
 #include "vm/class_finalizer.h"
@@ -257,17 +261,15 @@
       "class StackFrame2Test {"
       "  StackFrame2Test() {}"
       "  noSuchMethod(Invocation im) {"
-      "    /* We should have 8 general frames and 3 dart frames as follows:"
+      "    /* We should have 6 general frames and 4 dart frames as follows:"
       "     * exit frame"
       "     * dart frame corresponding to StackFrame.frameCount"
       "     * dart frame corresponding to StackFrame2Test.noSuchMethod"
-      "     * entry frame"
-      "     * exit frame"
       "     * frame for instance function invocation stub calling noSuchMethod"
       "     * dart frame corresponding to StackFrame2Test.testMain"
       "     * entry frame"
       "     */"
-      "    StackFrame.equals(9, StackFrame.frameCount());"
+      "    StackFrame.equals(6, StackFrame.frameCount());"
       "    StackFrame.equals(4, StackFrame.dartFrameCount());"
       "    StackFrame.validateFrame(0, \"StackFrame_validateFrame\");"
       "    StackFrame.validateFrame(1, \"StackFrame2Test_noSuchMethod\");"
@@ -288,3 +290,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(TARGET_ARCH_ARM64)
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 70144e9..fd297de 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -5,6 +5,7 @@
 #include "vm/stub_code.h"
 
 #include "platform/assert.h"
+#include "platform/globals.h"
 #include "vm/assembler.h"
 #include "vm/disassembler.h"
 #include "vm/flags.h"
@@ -50,9 +51,12 @@
 
 
 void StubCode::InitOnce() {
+  // TODO(zra): ifndef to be removed when ARM64 port is ready.
+#if !defined(TARGET_ARCH_ARM64)
   // Generate all the stubs.
   Code& code = Code::Handle();
   VM_STUB_CODE_LIST(STUB_CODE_GENERATE);
+#endif
 }
 
 
@@ -66,9 +70,12 @@
 
 
 void StubCode::Init(Isolate* isolate) {
+  // TODO(zra): ifndef to be removed when ARM64 port is ready.
+#if !defined(TARGET_ARCH_ARM64)
   StubCode* stubs = new StubCode();
   isolate->set_stub_code(stubs);
   stubs->GenerateFor(isolate);
+#endif
 }
 
 
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 602253a..19f41a2 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -22,11 +22,11 @@
 #define VM_STUB_CODE_LIST(V)                                                   \
   V(PrintStopMessage)                                                          \
   V(CallToRuntime)                                                             \
+  V(LazyCompile)                                                               \
   V(CallBootstrapCFunction)                                                    \
   V(CallNativeCFunction)                                                       \
   V(AllocateArray)                                                             \
   V(CallNoSuchMethodFunction)                                                  \
-  V(InstanceFunctionLookup)                                                    \
   V(CallStaticFunction)                                                        \
   V(CallClosureFunction)                                                       \
   V(FixCallersTarget)                                                          \
@@ -41,7 +41,6 @@
   V(JumpToExceptionHandler)                                                    \
   V(UnoptimizedIdenticalWithNumberCheck)                                       \
   V(OptimizedIdenticalWithNumberCheck)                                         \
-  V(CompileFunctionRuntimeCall)                                                \
 
 // Is it permitted for the stubs above to refer to Object::null(), which is
 // allocated in the VM isolate and shared across all isolates.
@@ -76,6 +75,7 @@
 
   const ExternalLabel& label() const { return label_; }
   uword EntryPoint() const { return entry_point_; }
+  RawCode* code() const { return code_; }
   intptr_t Size() const { return size_; }
 
   // Visit all object pointers.
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 6b40a5c..ae9785e 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -437,40 +437,6 @@
 }
 
 
-// Input parameters:
-//   R5: ic-data.
-//   R4: arguments descriptor array.
-// Note: The receiver object is the first argument to the function being
-//       called, the stub accesses the receiver from this location directly
-//       when trying to resolve the call.
-void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
-  __ EnterStubFrame();
-
-  // Load the receiver.
-  __ ldr(R2, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
-  __ add(IP, FP, ShifterOperand(R2, LSL, 1));  // R2 is Smi.
-  __ ldr(R6, Address(IP, kParamEndSlotFromFp * kWordSize));
-
-  // Push space for the return value.
-  // Push the receiver.
-  // Push IC data object.
-  // Push arguments descriptor array.
-  __ LoadImmediate(IP, reinterpret_cast<intptr_t>(Object::null()));
-  __ PushList((1 << R4) | (1 << R5) | (1 << R6) | (1 << IP));
-
-  // R2: Smi-tagged arguments array length.
-  PushArgumentsArray(assembler);
-
-  __ CallRuntime(kInstanceFunctionLookupRuntimeEntry, 4);
-
-  // Remove arguments.
-  __ Drop(4);
-  __ Pop(R0);  // Get result into R0.
-  __ LeaveStubFrame();
-  __ Ret();
-}
-
-
 DECLARE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
                            intptr_t deopt_reason,
                            uword saved_registers_address);
@@ -615,17 +581,18 @@
   __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry, 3);
   // Remove arguments.
   __ Drop(3);
-  __ Pop(R0);  // Get result into R0.
+  __ Pop(R0);  // Get result into R0 (target function).
 
   // Restore IC data and arguments descriptor.
   __ PopList((1 << R4) | (1 << R5));
 
   __ LeaveStubFrame();
 
-  __ CompareImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
-  __ Branch(&StubCode::InstanceFunctionLookupLabel(), EQ);
-  __ AddImmediate(R0, Instructions::HeaderSize() - kHeapObjectTag);
-  __ bx(R0);
+  // Tail-call to target function.
+  __ ldr(R2, FieldAddress(R0, Function::code_offset()));
+  __ ldr(R2, FieldAddress(R2, Code::instructions_offset()));
+  __ AddImmediate(R2, Instructions::HeaderSize() - kHeapObjectTag);
+  __ bx(R2);
 }
 
 
@@ -793,38 +760,21 @@
   __ b(&not_closure, EQ);
 
   // R0 is just the signature function. Load the actual closure function.
-  __ ldr(R2, FieldAddress(R1, Closure::function_offset()));
+  __ ldr(R0, FieldAddress(R1, Closure::function_offset()));
 
   // Load closure context in CTX; note that CTX has already been preserved.
   __ ldr(CTX, FieldAddress(R1, Closure::context_offset()));
 
-  // Load closure function code in R0.
-  __ ldr(R0, FieldAddress(R2, Function::code_offset()));
-  __ cmp(R0, ShifterOperand(R8));  // R8 is raw null.
-  Label function_compiled;
-  __ b(&function_compiled, NE);
+  // R4: Arguments descriptor.
+  // R0: Function.
+  __ ldr(R2, FieldAddress(R0, Function::code_offset()));
 
-  // Create a stub frame as we are pushing some objects on the stack before
-  // calling into the runtime.
-  __ EnterStubFrame();
-
-  // Preserve arguments descriptor array and read-only function object argument.
-  __ PushList((1 << R2) | (1 << R4));
-  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
-  // Restore arguments descriptor array and read-only function object argument.
-  __ PopList((1 << R2) | (1 << R4));
-  // Restore R0.
-  __ ldr(R0, FieldAddress(R2, Function::code_offset()));
-
-  // Remove the stub frame as we are about to jump to the closure function.
-  __ LeaveStubFrame();
-
-  __ Bind(&function_compiled);
-  // R0: code.
-  // R4: arguments descriptor array.
-  __ ldr(R0, FieldAddress(R0, Code::instructions_offset()));
-  __ AddImmediate(R0, Instructions::HeaderSize() - kHeapObjectTag);
-  __ bx(R0);
+  // R2: code.
+  // R5: Smi 0 (no IC data; the lazy-compile stub expects a GC-safe value).
+  __ LoadImmediate(R5, 0);
+  __ ldr(R2, FieldAddress(R2, Code::instructions_offset()));
+  __ AddImmediate(R2, Instructions::HeaderSize() - kHeapObjectTag);
+  __ bx(R2);
 
   __ Bind(&not_closure);
   // Call runtime to attempt to resolve and invoke a call method on a
@@ -1484,19 +1434,12 @@
   __ CallRuntime(handle_ic_miss, num_args + 1);
   // Remove the call arguments pushed earlier, including the IC data object.
   __ Drop(num_args + 1);
-  // Pop returned code object into R0 (null if not found).
+  // Pop returned function object into R0.
   // Restore arguments descriptor array and IC data array.
   __ PopList((1 << R0) | (1 << R4) | (1 << R5));
   __ LeaveStubFrame();
   Label call_target_function;
-  __ CompareImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
-  __ b(&call_target_function, NE);
-  // NoSuchMethod or closure.
-  // Mark IC call that it may be a closure call that does not collect
-  // type feedback.
-  __ mov(IP, ShifterOperand(1));
-  __ strb(IP, FieldAddress(R5, ICData::is_closure_call_offset()));
-  __ Branch(&StubCode::InstanceFunctionLookupLabel());
+  __ b(&call_target_function);
 
   __ Bind(&found);
   // R6: pointer to an IC data check group.
@@ -1512,27 +1455,10 @@
 
   __ Bind(&call_target_function);
   // R0: target function.
-  __ ldr(R1, FieldAddress(R0, Function::code_offset()));
-  if (FLAG_collect_code) {
-    // If we are collecting code, the code object may be null.
-    Label is_compiled;
-    __ CompareImmediate(R1, reinterpret_cast<intptr_t>(Object::null()));
-    __ b(&is_compiled, NE);
-    __ EnterStubFrame();
-    // Preserve arg desc. and IC data object.
-    __ PushList((1 << R4) | (1 << R5));
-    __ Push(R0);  // Pass function.
-    __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
-    __ Pop(R0);  // Discard argument.
-    __ PopList((1 << R4) | (1 << R5));  // Restore arg desc. and IC data.
-    __ LeaveStubFrame();
-    // R0: target function.
-    __ ldr(R1, FieldAddress(R0, Function::code_offset()));
-    __ Bind(&is_compiled);
-  }
-  __ ldr(R0, FieldAddress(R1, Code::instructions_offset()));
-  __ AddImmediate(R0, Instructions::HeaderSize() - kHeapObjectTag);
-  __ bx(R0);
+  __ ldr(R2, FieldAddress(R0, Function::code_offset()));
+  __ ldr(R2, FieldAddress(R2, Code::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);
@@ -1662,32 +1588,18 @@
   __ StoreToOffset(kWord, R1, R6, count_offset);
   __ Bind(&increment_done);
 
-  Label target_is_compiled;
-  // Get function and call it, if possible.
-  __ LoadFromOffset(kWord, R1, R6, target_offset);
-  __ ldr(R0, FieldAddress(R1, Function::code_offset()));
-  __ CompareImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
-  __ b(&target_is_compiled, NE);
-  // R1: function.
-
-  __ EnterStubFrame();
-  // Preserve target function and IC data object.
-  __ PushList((1 << R1) | (1 << R5));
-  __ Push(R1);  // Pass function.
-  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
-  __ Drop(1);  // Discard argument.
-  __ PopList((1 << R1) | (1 << R5));  // Restore function and IC data.
-  __ LeaveStubFrame();
-  // R0: target function.
-  __ ldr(R0, FieldAddress(R1, Function::code_offset()));
-
-  __ Bind(&target_is_compiled);
-  // R0: target code.
-  __ ldr(R0, FieldAddress(R0, Code::instructions_offset()));
-  __ AddImmediate(R0, Instructions::HeaderSize() - kHeapObjectTag);
   // Load arguments descriptor into R4.
   __ ldr(R4, FieldAddress(R5, ICData::arguments_descriptor_offset()));
-  __ bx(R0);
+
+  // Get function and call it, if possible.
+  __ LoadFromOffset(kWord, R0, R6, target_offset);
+  __ ldr(R2, FieldAddress(R0, Function::code_offset()));
+
+  // R0: function.
+  // R2: target code.
+  __ ldr(R2, FieldAddress(R2, Code::instructions_offset()));
+  __ AddImmediate(R2, Instructions::HeaderSize() - kHeapObjectTag);
+  __ bx(R2);
 }
 
 
@@ -1698,11 +1610,11 @@
 }
 
 
-// Stub for calling the CompileFunction runtime call.
-// R5: IC-Data.
+// Stub for compiling a function and jumping to the compiled code.
+// R5: IC-Data (for methods).
 // R4: Arguments descriptor.
 // R0: Function.
-void StubCode::GenerateCompileFunctionRuntimeCallStub(Assembler* assembler) {
+void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
   // Preserve arg desc. and IC data object.
   __ EnterStubFrame();
   __ PushList((1 << R4) | (1 << R5));
@@ -1711,7 +1623,11 @@
   __ Pop(R0);  // Restore argument.
   __ PopList((1 << R4) | (1 << R5));  // Restore arg desc. and IC data.
   __ LeaveStubFrame();
-  __ Ret();
+
+  __ ldr(R2, FieldAddress(R0, Function::code_offset()));
+  __ ldr(R2, FieldAddress(R2, Code::instructions_offset()));
+  __ AddImmediate(R2, Instructions::HeaderSize() - kHeapObjectTag);
+  __ bx(R2);
 }
 
 
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
new file mode 100644
index 0000000..168e5ea
--- /dev/null
+++ b/runtime/vm/stub_code_arm64.cc
@@ -0,0 +1,244 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_ARM64)
+
+#include "vm/assembler.h"
+#include "vm/code_generator.h"
+#include "vm/compiler.h"
+#include "vm/dart_entry.h"
+#include "vm/flow_graph_compiler.h"
+#include "vm/heap.h"
+#include "vm/instructions.h"
+#include "vm/object_store.h"
+#include "vm/stack_frame.h"
+#include "vm/stub_code.h"
+#include "vm/tags.h"
+
+#define __ assembler->
+
+namespace dart {
+
+void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GeneratePrintStopMessageStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateDeoptimizeLazyStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateCallClosureFunctionStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
+                                              const Class& cls) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateCallNoSuchMethodFunctionStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateOptimizedUsageCounterIncrement(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateUsageCounterIncrement(Assembler* assembler,
+                                             Register temp_reg) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateNArgsCheckInlineCacheStub(
+    Assembler* assembler,
+    intptr_t num_args,
+    const RuntimeEntry& handle_ic_miss) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateThreeArgsCheckInlineCacheStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
+    Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
+    Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateThreeArgsOptimizedCheckInlineCacheStub(
+    Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateClosureCallInlineCacheStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateZeroArgsUnoptimizedStaticCallStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateSubtype1TestCacheStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateSubtype2TestCacheStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateSubtype3TestCacheStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateGetStackPointerStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateIdenticalWithNumberCheckStub(Assembler* assembler,
+                                                    const Register left,
+                                                    const Register right,
+                                                    const Register temp,
+                                                    const Register unused) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
+    Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+
+void StubCode::GenerateOptimizedIdenticalWithNumberCheckStub(
+    Assembler* assembler) {
+  UNIMPLEMENTED();
+}
+
+}  // namespace dart
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/stub_code_arm64_test.cc b/runtime/vm/stub_code_arm64_test.cc
new file mode 100644
index 0000000..7c2fe8f
--- /dev/null
+++ b/runtime/vm/stub_code_arm64_test.cc
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/globals.h"
+#if defined(TARGET_ARCH_ARM64)
+
+// TODO(zra): Port these tests.
+
+#endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index edc3f12..2c1b247 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -396,44 +396,6 @@
 }
 
 
-// Input parameters:
-//   ECX: ic-data.
-//   EDX: arguments descriptor array.
-// Note: The receiver object is the first argument to the function being
-//       called, the stub accesses the receiver from this location directly
-//       when trying to resolve the call.
-// Uses EDI.
-void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
-  __ EnterStubFrame();
-
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
-  __ pushl(raw_null);  // Space for the return value.
-
-  // Push the receiver as an argument.  Load the smi-tagged argument
-  // count into EDI to index the receiver in the stack.  There are
-  // three words (null, stub's pc marker, saved fp) above the return
-  // address.
-  __ movl(EDI, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
-  __ pushl(Address(ESP, EDI, TIMES_2, (3 * kWordSize)));
-
-  __ pushl(ECX);  // Pass IC data object.
-  __ pushl(EDX);  // Pass arguments descriptor array.
-
-  // Pass the call's arguments array.
-  __ movl(EDX, EDI);  // Smi-tagged arguments array length.
-  PushArgumentsArray(assembler);
-
-  __ CallRuntime(kInstanceFunctionLookupRuntimeEntry, 4);
-
-  // Remove arguments.
-  __ Drop(4);
-  __ popl(EAX);  // Get result into EAX.
-  __ LeaveFrame();
-  __ ret();
-}
-
-
 DECLARE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
                            intptr_t deopt_reason,
                            uword saved_registers_address);
@@ -583,19 +545,15 @@
   __ popl(EAX);
   __ popl(EAX);
   __ popl(EAX);
-  __ popl(EAX);  // Return value from the runtime call (instructions).
+  __ popl(EAX);  // Return value from the runtime call (function).
   __ popl(EDX);  // Restore arguments descriptor.
   __ popl(ECX);  // Restore IC data.
   __ LeaveFrame();
 
-  Label lookup;
-  __ cmpl(EAX, raw_null);
-  __ j(EQUAL, &lookup, Assembler::kNearJump);
-  __ addl(EAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
-  __ jmp(EAX);
-
-  __ Bind(&lookup);
-  __ jmp(&StubCode::InstanceFunctionLookupLabel());
+  __ movl(EBX, FieldAddress(EAX, Function::code_offset()));
+  __ movl(EBX, FieldAddress(EBX, Code::instructions_offset()));
+  __ addl(EBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
+  __ jmp(EBX);
 }
 
 
@@ -773,40 +731,21 @@
   __ j(EQUAL, &not_closure, Assembler::kNearJump);
 
   // EAX is just the signature function. Load the actual closure function.
-  __ movl(ECX, FieldAddress(EDI, Closure::function_offset()));
+  __ movl(EAX, FieldAddress(EDI, Closure::function_offset()));
 
   // Load closure context in CTX; note that CTX has already been preserved.
   __ movl(CTX, FieldAddress(EDI, Closure::context_offset()));
 
-  // Load closure function code in EAX.
-  __ movl(EAX, FieldAddress(ECX, Function::code_offset()));
-  __ cmpl(EAX, raw_null);
-  Label function_compiled;
-  __ j(NOT_EQUAL, &function_compiled, Assembler::kNearJump);
+  // EBX: Code (compiled code or lazy compile stub).
+  __ movl(EBX, FieldAddress(EAX, Function::code_offset()));
 
-  // Create a stub frame as we are pushing some objects on the stack before
-  // calling into the runtime.
-  __ EnterStubFrame();
-
-  __ pushl(EDX);  // Preserve arguments descriptor array.
-  __ pushl(ECX);  // Preserve read-only function object argument.
-  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
-  __ popl(ECX);  // Restore read-only function object argument in ECX.
-  __ popl(EDX);  // Restore arguments descriptor array.
-  // Restore EAX.
-  __ movl(EAX, FieldAddress(ECX, Function::code_offset()));
-
-  // Remove the stub frame as we are about to jump to the closure function.
-  __ LeaveFrame();
-
-  __ Bind(&function_compiled);
-  // EAX: Code.
-  // ECX: Function.
+  // EAX: Function.
   // EDX: Arguments descriptor array.
-
-  __ movl(ECX, FieldAddress(EAX, Code::instructions_offset()));
-  __ addl(ECX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
-  __ jmp(ECX);
+  // ECX: Smi 0 (no IC data; the lazy-compile stub expects a GC-safe value).
+  __ xorl(ECX, ECX);
+  __ movl(EBX, FieldAddress(EBX, Code::instructions_offset()));
+  __ addl(EBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
+  __ jmp(EBX);
 
   __ Bind(&not_closure);
   // Call runtime to attempt to resolve and invoke a call method on a
@@ -1483,18 +1422,12 @@
   for (intptr_t i = 0; i < num_args + 1; i++) {
     __ popl(EAX);
   }
-  __ popl(EAX);  // Pop returned code object into EAX (null if not found).
+  __ popl(EAX);  // Pop returned function object into EAX.
   __ popl(ECX);  // Restore IC data array.
   __ popl(EDX);  // Restore arguments descriptor array.
   __ LeaveFrame();
   Label call_target_function;
-  __ cmpl(EAX, raw_null);
-  __ j(NOT_EQUAL, &call_target_function, Assembler::kNearJump);
-  // NoSuchMethod or closure.
-  // Mark IC call that it may be a closure call that does not collect
-  // type feedback.
-  __ movb(FieldAddress(ECX, ICData::is_closure_call_offset()), Immediate(1));
-  __ jmp(&StubCode::InstanceFunctionLookupLabel());
+  __ jmp(&call_target_function);
 
   __ Bind(&found);
   // EBX: Pointer to an IC data check group.
@@ -1508,27 +1441,10 @@
 
   __ Bind(&call_target_function);
   // EAX: Target function.
-  Label is_compiled;
   __ movl(EBX, FieldAddress(EAX, Function::code_offset()));
-  if (FLAG_collect_code) {
-    // If code might be GC'd, then EBX might be null. If it is, recompile.
-    __ cmpl(EBX, raw_null);
-    __ j(NOT_EQUAL, &is_compiled, Assembler::kNearJump);
-    __ EnterStubFrame();
-    __ pushl(EDX);  // Preserve arguments descriptor array.
-    __ pushl(ECX);  // Preserve IC data object.
-    __ pushl(EAX);  // Pass function.
-    __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
-    __ popl(EAX);  // Restore function.
-    __ popl(ECX);  // Restore IC data array.
-    __ popl(EDX);  // Restore arguments descriptor array.
-    __ LeaveFrame();
-    __ movl(EBX, FieldAddress(EAX, Function::code_offset()));
-    __ Bind(&is_compiled);
-  }
-  __ movl(EAX, FieldAddress(EBX, Code::instructions_offset()));
-  __ addl(EAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
-  __ jmp(EAX);
+  __ movl(EBX, FieldAddress(EBX, Code::instructions_offset()));
+  __ addl(EBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
+  __ jmp(EBX);
 
   // Instance in EAX, return its class-id in EAX as Smi.
   __ Bind(&get_class_id_as_smi);
@@ -1672,32 +1588,17 @@
   __ movl(Address(EBX, count_offset), Immediate(Smi::RawValue(Smi::kMaxValue)));
   __ Bind(&increment_done);
 
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
-  Label target_is_compiled;
-  // Get function and call it, if possible.
-  __ movl(EDI, Address(EBX, target_offset));
-  __ movl(EAX, FieldAddress(EDI, Function::code_offset()));
-  __ cmpl(EAX, raw_null);
-  __ j(NOT_EQUAL, &target_is_compiled, Assembler::kNearJump);
-  __ EnterStubFrame();
-  __ pushl(EDI);  // Preserve target function.
-  __ pushl(ECX);  // Preserve IC data object.
-  __ pushl(EDI);  // Pass function.
-  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
-  __ popl(EAX);  // Discard argument.
-  __ popl(ECX);  // Restore IC data object.
-  __ popl(EDI);  // Restore target function.
-  __ LeaveFrame();
-  __ movl(EAX, FieldAddress(EDI, Function::code_offset()));
-
-  __ Bind(&target_is_compiled);
-  // EAX: Target code.
-  __ movl(EAX, FieldAddress(EAX, Code::instructions_offset()));
-  __ addl(EAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   // Load arguments descriptor into EDX.
   __ movl(EDX, FieldAddress(ECX, ICData::arguments_descriptor_offset()));
-  __ jmp(EAX);
+
+  // Get function and call it, if possible.
+  __ movl(EAX, Address(EBX, target_offset));
+  __ movl(EBX, FieldAddress(EAX, Function::code_offset()));
+
+  // EBX: Target code.
+  __ movl(EBX, FieldAddress(EBX, Code::instructions_offset()));
+  __ addl(EBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
+  __ jmp(EBX);
 }
 
 
@@ -1708,11 +1609,11 @@
 }
 
 
-// Stub for calling the CompileFunction runtime call.
-// ECX: IC-Data.
+// Stub for compiling a function and jumping to the compiled code.
+// ECX: IC-Data (for methods).
 // EDX: Arguments descriptor.
 // EAX: Function.
-void StubCode::GenerateCompileFunctionRuntimeCallStub(Assembler* assembler) {
+void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
   __ EnterStubFrame();
   __ pushl(EDX);  // Preserve arguments descriptor array.
   __ pushl(ECX);  // Preserve IC data object.
@@ -1722,7 +1623,11 @@
   __ popl(ECX);  // Restore IC data array.
   __ popl(EDX);  // Restore arguments descriptor array.
   __ LeaveFrame();
-  __ ret();
+
+  __ movl(EAX, FieldAddress(EAX, Function::code_offset()));
+  __ movl(EAX, FieldAddress(EAX, Code::instructions_offset()));
+  __ addl(EAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
+  __ jmp(EAX);
 }
 
 
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 17ed5e6..aec9159 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -492,46 +492,6 @@
 }
 
 
-// Input parameters:
-//   S5: ic-data.
-//   S4: arguments descriptor array.
-// Note: The receiver object is the first argument to the function being
-//       called, the stub accesses the receiver from this location directly
-//       when trying to resolve the call.
-void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
-  __ TraceSimMsg("InstanceFunctionLookupStub");
-  __ EnterStubFrame();
-
-  // Load the receiver.
-  __ lw(A1, FieldAddress(S4, ArgumentsDescriptor::count_offset()));
-  __ sll(TMP, A1, 1);  // A1 is Smi.
-  __ addu(TMP, FP, TMP);
-  __ lw(T1, Address(TMP, kParamEndSlotFromFp * kWordSize));
-
-  // Push space for the return value.
-  // Push the receiver.
-  // Push TMP data object.
-  // Push arguments descriptor array.
-  __ addiu(SP, SP, Immediate(-4 * kWordSize));
-  __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
-  __ sw(TMP, Address(SP, 3 * kWordSize));
-  __ sw(T1, Address(SP, 2 * kWordSize));
-  __ sw(S5, Address(SP, 1 * kWordSize));
-  __ sw(S4, Address(SP, 0 * kWordSize));
-
-  // A1: Smi-tagged arguments array length.
-  PushArgumentsArray(assembler);
-  __ TraceSimMsg("InstanceFunctionLookupStub return");
-
-  __ CallRuntime(kInstanceFunctionLookupRuntimeEntry, 4);
-
-  __ lw(V0, Address(SP, 4 * kWordSize));  // Get result into V0.
-  __ addiu(SP, SP, Immediate(5 * kWordSize));    // Remove arguments.
-
-  __ LeaveStubFrameAndReturn();
-}
-
-
 DECLARE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
                            intptr_t deopt_reason,
                            uword saved_registers_address);
@@ -708,19 +668,17 @@
 
   __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry, 3);
 
-  __ lw(T0, Address(SP, 3 * kWordSize));  // Get result.
+  __ lw(T0, Address(SP, 3 * kWordSize));  // Get result function.
   __ lw(S4, Address(SP, 4 * kWordSize));  // Restore argument descriptor.
   __ lw(S5, Address(SP, 5 * kWordSize));  // Restore IC data.
   __ addiu(SP, SP, Immediate(6 * kWordSize));
 
   __ LeaveStubFrame();
 
-  Label nonnull;
-  __ BranchNotEqual(T0, reinterpret_cast<int32_t>(Object::null()), &nonnull);
-  __ Branch(&StubCode::InstanceFunctionLookupLabel());
-  __ Bind(&nonnull);
-  __ AddImmediate(T0, Instructions::HeaderSize() - kHeapObjectTag);
-  __ jr(T0);
+  __ lw(T2, FieldAddress(T0, Function::code_offset()));
+  __ lw(T2, FieldAddress(T2, Code::instructions_offset()));
+  __ AddImmediate(T2, Instructions::HeaderSize() - kHeapObjectTag);
+  __ jr(T2);
 }
 
 
@@ -908,42 +866,19 @@
   __ beq(T0, T7, &not_closure);
 
   // T0 is just the signature function. Load the actual closure function.
-  __ lw(T2, FieldAddress(T1, Closure::function_offset()));
+  __ lw(T0, FieldAddress(T1, Closure::function_offset()));
 
   // Load closure context in CTX; note that CTX has already been preserved.
   __ lw(CTX, FieldAddress(T1, Closure::context_offset()));
 
-  Label function_compiled;
-  // Load closure function code in T0.
-  __ lw(T0, FieldAddress(T2, Function::code_offset()));
-  __ bne(T0, T7, &function_compiled);
-
-  // Create a stub frame as we are pushing some objects on the stack before
-  // calling into the runtime.
-  __ EnterStubFrame();
-
-  // Preserve arguments descriptor array and read-only function object argument.
-  __ addiu(SP, SP, Immediate(-2 * kWordSize));
-  __ sw(S4, Address(SP, 1 * kWordSize));
-  __ sw(T2, Address(SP, 0 * kWordSize));
-  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
-  __ TraceSimMsg("GenerateCallClosureFunctionStub return");
-  // Restore arguments descriptor array and read-only function object argument.
-  __ lw(T2, Address(SP, 0 * kWordSize));
-  __ lw(S4, Address(SP, 1 * kWordSize));
-  __ addiu(SP, SP, Immediate(2 * kWordSize));
-  // Restore T0.
-  __ lw(T0, FieldAddress(T2, Function::code_offset()));
-
-  // Remove the stub frame as we are about to jump to the closure function.
-  __ LeaveStubFrame();
-
-  __ Bind(&function_compiled);
-  // T0: Code.
-  // S4: Arguments descriptor array.
-  __ lw(T0, FieldAddress(T0, Code::instructions_offset()));
-  __ AddImmediate(T0, Instructions::HeaderSize() - kHeapObjectTag);
-  __ jr(T0);
+  // Load closure function code in T2.
+  // S4: arguments descriptor array.
+  // S5: Smi 0 (no IC data; the lazy-compile stub expects a GC-safe value).
+  __ LoadImmediate(S5, 0);
+  __ lw(T2, FieldAddress(T0, Function::code_offset()));
+  __ lw(T2, FieldAddress(T2, Code::instructions_offset()));
+  __ AddImmediate(T2, Instructions::HeaderSize() - kHeapObjectTag);
+  __ jr(T2);
 
   __ Bind(&not_closure);
   // Call runtime to attempt to resolve and invoke a call method on a
@@ -1702,7 +1637,7 @@
   __ sw(S5, Address(SP, (num_slots - num_args - 4) * kWordSize));
   __ CallRuntime(handle_ic_miss, num_args + 1);
   __ TraceSimMsg("NArgsCheckInlineCacheStub return");
-  // Pop returned code object into T3 (null if not found).
+  // Pop returned function object into T3.
   // Restore arguments descriptor array and IC data array.
   __ lw(T3, Address(SP, (num_slots - 3) * kWordSize));
   __ lw(S4, Address(SP, (num_slots - 2) * kWordSize));
@@ -1711,16 +1646,9 @@
   // and the arguments descriptor array.
   __ addiu(SP, SP, Immediate(num_slots * kWordSize));
   __ LeaveStubFrame();
-  Label call_target_function;
-  __ BranchNotEqual(T3, reinterpret_cast<int32_t>(Object::null()),
-                    &call_target_function);
 
-  // NoSuchMethod or closure.
-  // Mark IC call that it may be a closure call that does not collect
-  // type feedback.
-  __ LoadImmediate(T6, 1);
-  __ Branch(&StubCode::InstanceFunctionLookupLabel());
-  __ delay_slot()->sb(T6, FieldAddress(S5, ICData::is_closure_call_offset()));
+  Label call_target_function;
+  __ b(&call_target_function);
 
   __ Bind(&found);
   // T0: Pointer to an IC data check group.
@@ -1738,29 +1666,13 @@
   __ sw(T1, Address(T0, count_offset));
 
   __ Bind(&call_target_function);
-  // T3: Target function.
+  // T0 <- T3: Target function.
+  __ mov(T0, T3);
   Label is_compiled;
-  __ lw(T4, FieldAddress(T3, Function::code_offset()));
-  if (FLAG_collect_code) {
-    __ BranchNotEqual(T4, reinterpret_cast<int32_t>(Object::null()),
-                      &is_compiled);
-    __ EnterStubFrame();
-    __ addiu(SP, SP, Immediate(-3 * kWordSize));
-    __ sw(S5, Address(SP, 2 * kWordSize));  // Preserve IC data.
-    __ sw(S4, Address(SP, 1 * kWordSize));  // Preserve arg desc.
-    __ sw(T3, Address(SP, 0 * kWordSize));  // Function argument.
-    __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
-    __ lw(T3, Address(SP, 0 * kWordSize));  // Restore Function.
-    __ lw(S4, Address(SP, 1 * kWordSize));  // Restore arg desc.
-    __ lw(S5, Address(SP, 2 * kWordSize));  // Restore IC data.
-    __ addiu(SP, SP, Immediate(3 * kWordSize));
-    __ LeaveStubFrame();
-    __ lw(T4, FieldAddress(T3, Function::code_offset()));
-    __ Bind(&is_compiled);
-  }
-  __ lw(T3, FieldAddress(T4, Code::instructions_offset()));
-  __ AddImmediate(T3, Instructions::HeaderSize() - kHeapObjectTag);
-  __ jr(T3);
+  __ lw(T4, FieldAddress(T0, Function::code_offset()));
+  __ lw(T4, FieldAddress(T4, Code::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);
@@ -1900,36 +1812,17 @@
 
   __ Bind(&increment_done);
 
-  Label target_is_compiled;
-  // Get function and call it, if possible.
-  __ lw(T3, Address(T0, target_offset));
-  __ lw(T4, FieldAddress(T3, Function::code_offset()));
-  __ LoadImmediate(CMPRES1, reinterpret_cast<intptr_t>(Object::null()));
-  __ bne(T4, CMPRES1, &target_is_compiled);
-
-  __ EnterStubFrame();
-  // Preserve target function and IC data object.
-  // Two preserved registers, one argument (function) => 3 slots.
-  __ addiu(SP, SP, Immediate(-3 * kWordSize));
-  __ sw(S5, Address(SP, 2 * kWordSize));  // Preserve IC data.
-  __ sw(T3, Address(SP, 1 * kWordSize));  // Preserve function.
-  __ sw(T3, Address(SP, 0 * kWordSize));  // Function argument.
-  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
-  __ lw(T3, Address(SP, 1 * kWordSize));  // Restore function.
-  __ lw(S5, Address(SP, 2 * kWordSize));  // Restore IC data.
-  __ addiu(SP, SP, Immediate(3 * kWordSize));
-  // T3: target function.
-  __ lw(T4, FieldAddress(T3, Function::code_offset()));
-  __ LeaveStubFrame();
-
-  __ Bind(&target_is_compiled);
-  // T4: target code.
-  __ lw(T3, FieldAddress(T4, Code::instructions_offset()));
-  __ AddImmediate(T3, Instructions::HeaderSize() - kHeapObjectTag);
-  __ jr(T3);
   // Load arguments descriptor into S4.
-  __ delay_slot()->
-      lw(S4,  FieldAddress(S5, ICData::arguments_descriptor_offset()));
+  __ lw(S4,  FieldAddress(S5, ICData::arguments_descriptor_offset()));
+
+  // Get function and call it, if possible.
+  __ lw(T0, Address(T0, target_offset));
+  __ lw(T4, FieldAddress(T0, Function::code_offset()));
+
+  // T4: target code.
+  __ lw(T4, FieldAddress(T4, Code::instructions_offset()));
+  __ AddImmediate(T4, Instructions::HeaderSize() - kHeapObjectTag);
+  __ jr(T4);
 }
 
 
@@ -1940,11 +1833,11 @@
 }
 
 
-// Stub for calling the CompileFunction runtime call.
-// S5: IC-Data.
+// Stub for compiling a function and jumping to the compiled code.
+// S5: IC-Data (for methods).
 // S4: Arguments descriptor.
 // T0: Function.
-void StubCode::GenerateCompileFunctionRuntimeCallStub(Assembler* assembler) {
+void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
   __ EnterStubFrame();
   __ addiu(SP, SP, Immediate(-3 * kWordSize));
   __ sw(S5, Address(SP, 2 * kWordSize));  // Preserve IC data object.
@@ -1954,7 +1847,13 @@
   __ lw(T0, Address(SP, 0 * kWordSize));  // Restore function.
   __ lw(S4, Address(SP, 1 * kWordSize));  // Restore args descriptor array.
   __ lw(S5, Address(SP, 2 * kWordSize));  // Restore IC data array.
-  __ LeaveStubFrameAndReturn();
+  __ addiu(SP, SP, Immediate(3 * kWordSize));
+  __ LeaveStubFrame();
+
+  __ lw(T2, FieldAddress(T0, Function::code_offset()));
+  __ lw(T2, FieldAddress(T2, Code::instructions_offset()));
+  __ AddImmediate(T2, Instructions::HeaderSize() - kHeapObjectTag);
+  __ jr(T2);
 }
 
 
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 0580f513..d914e54 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -381,40 +381,6 @@
 }
 
 
-// Input parameters:
-//   RBX: ic-data.
-//   R10: arguments descriptor array.
-// Note: The receiver object is the first argument to the function being
-//       called, the stub accesses the receiver from this location directly
-//       when trying to resolve the call.
-void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
-  __ EnterStubFrame();
-  __ PushObject(Object::null_object(), PP);  // Space for the return value.
-
-  // Push the receiver as an argument.  Load the smi-tagged argument
-  // count into R13 to index the receiver in the stack.  There are
-  // four words (null, stub's pc marker, saved pp, saved fp) above the return
-  // address.
-  __ movq(R13, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-  __ pushq(Address(RSP, R13, TIMES_4, (4 * kWordSize)));
-
-  __ pushq(RBX);  // Pass IC data object.
-  __ pushq(R10);  // Pass arguments descriptor array.
-
-  // Pass the call's arguments array.
-  __ movq(R10, R13);  // Smi-tagged arguments array length.
-  PushArgumentsArray(assembler);
-
-  __ CallRuntime(kInstanceFunctionLookupRuntimeEntry, 4);
-
-  // Remove arguments.
-  __ Drop(4);
-  __ popq(RAX);  // Get result into RAX.
-  __ LeaveStubFrame();
-  __ ret();
-}
-
-
 DECLARE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
                            intptr_t deopt_reason,
                            uword saved_registers_address);
@@ -578,19 +544,15 @@
   __ popq(RAX);
   __ popq(RAX);
   __ popq(RAX);
-  __ popq(RAX);  // Return value from the runtime call (instructions).
+  __ popq(RAX);  // Return value from the runtime call (function).
   __ popq(R10);  // Restore arguments descriptor.
   __ popq(RBX);  // Restore IC data.
   __ LeaveStubFrame();
 
-  Label lookup;
-  __ CompareObject(RAX, Object::null_object(), PP);
-  __ j(EQUAL, &lookup, Assembler::kNearJump);
-  __ addq(RAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
-  __ jmp(RAX);
-
-  __ Bind(&lookup);
-  __ jmp(&StubCode::InstanceFunctionLookupLabel());
+  __ movq(RCX, FieldAddress(RAX, Function::code_offset()));
+  __ movq(RCX, FieldAddress(RCX, Code::instructions_offset()));
+  __ addq(RCX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
+  __ jmp(RCX);
 }
 
 
@@ -760,40 +722,21 @@
   __ j(EQUAL, &not_closure, Assembler::kNearJump);
 
   // RAX is just the signature function. Load the actual closure function.
-  __ movq(RBX, FieldAddress(R13, Closure::function_offset()));
+  __ movq(RAX, FieldAddress(R13, Closure::function_offset()));
 
   // Load closure context in CTX; note that CTX has already been preserved.
   __ movq(CTX, FieldAddress(R13, Closure::context_offset()));
 
   // Load closure function code in RAX.
-  __ movq(RAX, FieldAddress(RBX, Function::code_offset()));
-  __ cmpq(RAX, R12);
-  Label function_compiled;
-  __ j(NOT_EQUAL, &function_compiled, Assembler::kNearJump);
+  __ movq(RCX, FieldAddress(RAX, Function::code_offset()));
 
-  // Create a stub frame as we are pushing some objects on the stack before
-  // calling into the runtime.
-  __ EnterStubFrame();
-
-  __ pushq(R10);  // Preserve arguments descriptor array.
-  __ pushq(RBX);  // Preserve read-only function object argument.
-  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
-  __ popq(RBX);  // Restore read-only function object argument in RBX.
-  __ popq(R10);  // Restore arguments descriptor array.
-  // Restore RAX.
-  __ movq(RAX, FieldAddress(RBX, Function::code_offset()));
-
-  // Remove the stub frame as we are about to jump to the closure function.
-  __ LeaveStubFrame();
-
-  __ Bind(&function_compiled);
-  // RAX: Code.
-  // RBX: Function.
+  // RAX: Function.
   // R10: Arguments descriptor array.
-
-  __ movq(RBX, FieldAddress(RAX, Code::instructions_offset()));
-  __ addq(RBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
-  __ jmp(RBX);
+  // RBX: Smi 0 (no IC data; the lazy-compile stub expects a GC-safe value).
+  __ xorq(RBX, RBX);
+  __ movq(RCX, FieldAddress(RCX, Code::instructions_offset()));
+  __ addq(RCX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
+  __ jmp(RCX);
 
   __ Bind(&not_closure);
   // Call runtime to attempt to resolve and invoke a call method on a
@@ -1467,18 +1410,12 @@
   for (intptr_t i = 0; i < num_args + 1; i++) {
     __ popq(RAX);
   }
-  __ popq(RAX);  // Pop returned code object into RAX (null if not found).
+  __ popq(RAX);  // Pop returned function object into RAX.
   __ popq(RBX);  // Restore IC data array.
   __ popq(R10);  // Restore arguments descriptor array.
   __ LeaveStubFrame();
   Label call_target_function;
-  __ cmpq(RAX, R12);
-  __ j(NOT_EQUAL, &call_target_function, Assembler::kNearJump);
-  // NoSuchMethod or closure.
-  // Mark IC call that it may be a closure call that does not collect
-  // type feedback.
-  __ movb(FieldAddress(RBX, ICData::is_closure_call_offset()), Immediate(1));
-  __ jmp(&StubCode::InstanceFunctionLookupLabel());
+  __ jmp(&call_target_function);
 
   __ Bind(&found);
   // R12: Pointer to an IC data check group.
@@ -1494,25 +1431,9 @@
   // RAX: Target function.
   Label is_compiled;
   __ movq(RCX, FieldAddress(RAX, Function::code_offset()));
-  if (FLAG_collect_code) {
-    // If code might be GC'd, then RBX might be null. If it is, recompile.
-    __ CompareObject(RCX, Object::null_object(), PP);
-    __ j(NOT_EQUAL, &is_compiled, Assembler::kNearJump);
-    __ EnterStubFrame();
-    __ pushq(R10);  // Preserve arguments descriptor array.
-    __ pushq(RBX);  // Preserve IC data object.
-    __ pushq(RAX);  // Pass function.
-    __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
-    __ popq(RAX);  // Restore function.
-    __ popq(RBX);  // Restore IC data array.
-    __ popq(R10);  // Restore arguments descriptor array.
-    __ LeaveStubFrame();
-    __ movq(RCX, FieldAddress(RAX, Function::code_offset()));
-    __ Bind(&is_compiled);
-  }
-  __ movq(RAX, FieldAddress(RCX, Code::instructions_offset()));
-  __ addq(RAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
-  __ jmp(RAX);
+  __ movq(RCX, FieldAddress(RCX, Code::instructions_offset()));
+  __ addq(RCX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
+  __ jmp(RCX);
 
   __ Bind(&get_class_id_as_smi);
   Label not_smi;
@@ -1655,32 +1576,16 @@
           Immediate(Smi::RawValue(Smi::kMaxValue)));
   __ Bind(&increment_done);
 
-  Label target_is_compiled;
-  // Get function and call it, if possible.
-  __ movq(R13, Address(R12, target_offset));
-  __ movq(RAX, FieldAddress(R13, Function::code_offset()));
-  __ LoadObject(R12, Object::null_object(), PP);
-  __ cmpq(RAX, R12);
-  __ j(NOT_EQUAL, &target_is_compiled, Assembler::kNearJump);
-
-  __ EnterStubFrame();
-  __ pushq(R13);  // Preserve target function.
-  __ pushq(RBX);  // Preserve IC data object.
-  __ pushq(R13);  // Pass function.
-  __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
-  __ popq(RAX);  // Discard argument.
-  __ popq(RBX);  // Restore IC data object.
-  __ popq(R13);  // Restore target function.
-  __ LeaveStubFrame();
-  __ movq(RAX, FieldAddress(R13, Function::code_offset()));
-
-  __ Bind(&target_is_compiled);
-  // RAX: Target code.
-  __ movq(RAX, FieldAddress(RAX, Code::instructions_offset()));
-  __ addq(RAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   // Load arguments descriptor into R10.
   __ movq(R10, FieldAddress(RBX, ICData::arguments_descriptor_offset()));
-  __ jmp(RAX);
+
+  // Get function and call it, if possible.
+  __ movq(RAX, Address(R12, target_offset));
+  __ movq(RCX, FieldAddress(RAX, Function::code_offset()));
+  // RCX: Target code.
+  __ movq(RCX, FieldAddress(RCX, Code::instructions_offset()));
+  __ addq(RCX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
+  __ jmp(RCX);
 }
 
 
@@ -1691,21 +1596,25 @@
 }
 
 
-// Stub for calling the CompileFunction runtime call.
-// RCX: IC-Data.
-// RDX: Arguments descriptor.
+// Stub for compiling a function and jumping to the compiled code.
+// RCX: IC-Data (for methods).
+// R10: Arguments descriptor.
 // RAX: Function.
-void StubCode::GenerateCompileFunctionRuntimeCallStub(Assembler* assembler) {
+void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
   __ EnterStubFrame();
-  __ pushq(RDX);  // Preserve arguments descriptor array.
-  __ pushq(RCX);  // Preserve IC data object.
+  __ pushq(R10);  // Preserve arguments descriptor array.
+  __ pushq(RBX);  // Preserve IC data object.
   __ pushq(RAX);  // Pass function.
   __ CallRuntime(kCompileFunctionRuntimeEntry, 1);
   __ popq(RAX);  // Restore function.
-  __ popq(RCX);  // Restore IC data array.
-  __ popq(RDX);  // Restore arguments descriptor array.
+  __ popq(RBX);  // Restore IC data array.
+  __ popq(R10);  // Restore arguments descriptor array.
   __ LeaveStubFrame();
-  __ ret();
+
+  __ movq(RAX, FieldAddress(RAX, Function::code_offset()));
+  __ movq(RAX, FieldAddress(RAX, Code::instructions_offset()));
+  __ addq(RAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
+  __ jmp(RAX);
 }
 
 
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 865c77e..4d11dba 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -243,7 +243,7 @@
   V(DotCreate, "._create")                                                     \
   V(DotWithType, "._withType")                                                 \
   V(_id, "_id")                                                                \
-  V(_get_or_create, "_get_or_create")                                          \
+  V(_get, "_get")                                                              \
   V(RangeError, "RangeError")                                                  \
   V(ArgumentError, "ArgumentError")                                            \
   V(FormatException, "FormatException")                                        \
diff --git a/runtime/vm/timer.cc b/runtime/vm/timer.cc
index 840bd21..a0b8707c 100644
--- a/runtime/vm/timer.cc
+++ b/runtime/vm/timer.cc
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#include "platform/globals.h"
 #include "vm/timer.h"
 #include "vm/json_stream.h"
 
@@ -27,9 +28,10 @@
 
 #define TIMER_FIELD_REPORT(name, msg)                                          \
   if (name().report() && name().message() != NULL) {                           \
-    OS::Print("%s :  %" Pd64 " micros.\n",                                     \
+    OS::Print("%s :  %.3f ms total; %.3f ms max.\n",                           \
               name().message(),                                                \
-              name().TotalElapsedTime());                                      \
+              MicrosecondsToMilliseconds(name().TotalElapsedTime()),           \
+              MicrosecondsToMilliseconds(name().MaxContiguous()));             \
   }
 void TimerList::ReportTimers() {
   TIMER_LIST(TIMER_FIELD_REPORT);
@@ -41,9 +43,10 @@
   {                                                                            \
     JSONObject jsobj(&jsarr);                                                  \
     jsobj.AddProperty("name", #name);                                          \
-    double seconds = static_cast<double>(name().TotalElapsedTime()) /          \
-        static_cast<double>(kMicrosecondsPerSecond);                           \
-    jsobj.AddProperty("time", seconds);                                        \
+    jsobj.AddProperty("time",                                                  \
+                      MicrosecondsToSeconds(name().TotalElapsedTime()));       \
+    jsobj.AddProperty("max_contiguous",                                        \
+                      MicrosecondsToSeconds(name().MaxContiguous()));          \
   }
 void TimerList::PrintTimersToJSONProperty(JSONObject* jsobj) {
   JSONArray jsarr(jsobj, "timers");
diff --git a/runtime/vm/timer.h b/runtime/vm/timer.h
index 5775444..1e7ef1d 100644
--- a/runtime/vm/timer.h
+++ b/runtime/vm/timer.h
@@ -5,6 +5,7 @@
 #ifndef VM_TIMER_H_
 #define VM_TIMER_H_
 
+#include "platform/utils.h"
 #include "vm/allocation.h"
 #include "vm/flags.h"
 #include "vm/os.h"
@@ -17,8 +18,9 @@
 class Timer : public ValueObject {
  public:
   Timer(bool report, const char* message)
-      : start_(0), stop_(0), total_(0),
-        report_(report), running_(false), message_(message) {}
+      : report_(report), message_(message) {
+    Reset();
+  }
   ~Timer() {}
 
   // Start timer.
@@ -32,7 +34,9 @@
     ASSERT(start_ != 0);
     ASSERT(running());
     stop_ = OS::GetCurrentTimeMicros();
-    total_ += ElapsedMicros();
+    int64_t elapsed = ElapsedMicros();
+    max_contiguous_ = Utils::Maximum(max_contiguous_, elapsed);
+    total_ += elapsed;
     running_ = false;
   }
 
@@ -46,10 +50,20 @@
     return result;
   }
 
+  int64_t MaxContiguous() const {
+    int64_t result = max_contiguous_;
+    if (running_) {
+      int64_t now = OS::GetCurrentTimeMicros();
+      result = Utils::Maximum(result, now - start_);
+    }
+    return result;
+  }
+
   void Reset() {
     start_ = 0;
     stop_ = 0;
     total_ = 0;
+    max_contiguous_ = 0;
     running_ = false;
   }
 
@@ -68,6 +82,7 @@
   int64_t start_;
   int64_t stop_;
   int64_t total_;
+  int64_t max_contiguous_;
   bool report_;
   bool running_;
   const char* message_;
@@ -84,6 +99,7 @@
   V(time_bootstrap, "Bootstrap of core classes")                               \
   V(time_dart_execution, "Dart execution")                                     \
   V(time_total_runtime, "Total runtime for isolate")                           \
+  V(time_gc, "Garbage collection")                                             \
 
 // Maintains a list of timers per isolate.
 class TimerList : public ValueObject {
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 358ecbd..a800505 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -2,13 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include <stdio.h>
-
 #include "vm/unit_test.h"
 
+#include <stdio.h>
+
 #include "bin/builtin.h"
 #include "bin/dartutils.h"
 
+#include "platform/globals.h"
 #include "vm/assembler.h"
 #include "vm/ast_printer.h"
 #include "vm/compiler.h"
@@ -25,7 +26,6 @@
 
 DECLARE_FLAG(bool, disassemble);
 
-
 TestCaseBase* TestCaseBase::first_ = NULL;
 TestCaseBase* TestCaseBase::tail_ = NULL;
 
@@ -48,6 +48,8 @@
   }
 }
 
+// TODO(zra): Remove when tests that need these functions are ready to enable.
+#if !defined(TARGET_ARCH_ARM64)
 
 static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag,
                                      Dart_Handle library,
@@ -142,6 +144,7 @@
   return Api::Success();
 }
 
+#endif
 
 void AssemblerTest::Assemble() {
   const String& function_name = String::ZoneHandle(Symbols::New(name_));
@@ -166,6 +169,9 @@
 }
 
 
+// TODO(zra): Remove once supported.
+#if !defined(TARGET_ARCH_ARM64)
+
 CodeGenTest::CodeGenTest(const char* name)
   : function_(Function::ZoneHandle()),
     node_sequence_(new SequenceNode(Scanner::kNoSourcePos,
@@ -233,4 +239,6 @@
   return error.IsNull();
 }
 
+#endif  // !defined(TARGET_ARCH_ARM64)
+
 }  // namespace dart
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 2ca6293..8b4a317 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -7,6 +7,8 @@
 
 #include "include/dart_api.h"
 
+#include "platform/globals.h"
+
 #include "vm/ast.h"
 #include "vm/dart.h"
 #include "vm/globals.h"
@@ -130,8 +132,12 @@
   }
 
 
-#if defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS)
-#if defined(HOST_ARCH_ARM) || defined(HOST_ARCH_MIPS)
+#if defined(TARGET_ARCH_ARM) ||                                                \
+    defined(TARGET_ARCH_MIPS) ||                                               \
+    defined(TARGET_ARCH_ARM64)
+#if defined(HOST_ARCH_ARM) ||                                                  \
+    defined(HOST_ARCH_MIPS) ||                                                 \
+    defined(HOST_ARCH_ARM64)
 // Running on actual ARM or MIPS hardware, execute code natively.
 #define EXECUTE_TEST_CODE_INT32(name, entry) reinterpret_cast<name>(entry)()
 #define EXECUTE_TEST_CODE_INT64_LL(name, entry, long_arg0, long_arg1)          \
@@ -144,9 +150,16 @@
     reinterpret_cast<name>(entry)(double_arg)
 #else
 // Not running on ARM or MIPS hardware, call simulator to execute code.
+#if defined(ARCH_IS_64_BIT)
+// TODO(zra): Supply more macros for 64-bit as tests are added for ARM64.
+#define EXECUTE_TEST_CODE_INT64(name, entry)                                   \
+  static_cast<int64_t>(Simulator::Current()->Call(                             \
+      bit_cast<int64_t, uword>(entry), 0, 0, 0, 0))
+#else
 #define EXECUTE_TEST_CODE_INT32(name, entry)                                   \
   static_cast<int32_t>(Simulator::Current()->Call(                             \
       bit_cast<int32_t, uword>(entry), 0, 0, 0, 0))
+#endif
 #define EXECUTE_TEST_CODE_INT64_LL(name, entry, long_arg0, long_arg1)          \
   static_cast<int64_t>(Simulator::Current()->Call(                             \
       bit_cast<int32_t, uword>(entry),                                         \
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 94434e2..8d5736b 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -14,6 +14,9 @@
     'assembler_arm.cc',
     'assembler_arm.h',
     'assembler_arm_test.cc',
+    'assembler_arm64.cc',
+    'assembler_arm64.h',
+    'assembler_arm64_test.cc',
     'assembler_ia32.cc',
     'assembler_ia32.h',
     'assembler_ia32_test.cc',
@@ -77,6 +80,8 @@
     'code_patcher.h',
     'code_patcher_arm.cc',
     'code_patcher_arm_test.cc',
+    'code_patcher_arm64.cc',
+    'code_patcher_arm64_test.cc',
     'code_patcher_ia32.cc',
     'code_patcher_ia32_test.cc',
     'code_patcher_mips.cc',
@@ -89,6 +94,7 @@
     'compiler_stats.h',
     'compiler_test.cc',
     'constants_arm.h',
+    'constants_arm64.h',
     'constants_ia32.h',
     'constants_mips.h',
     'constants_x64.h',
@@ -96,6 +102,7 @@
     'coverage.h',
     'cpu.h',
     'cpu_arm.cc',
+    'cpu_arm64.cc',
     'cpu_ia32.cc',
     'cpu_mips.cc',
     'cpu_test.cc',
@@ -119,11 +126,13 @@
     'dart_entry.cc',
     'dart_entry.h',
     'dart_entry_test.cc',
+    'datastream.h',
     'debugger.cc',
     'debugger_test.cc',
     'debugger.h',
     'debugger_api_impl_test.cc',
     'debugger_arm.cc',
+    'debugger_arm64.cc',
     'debugger_ia32.cc',
     'debugger_mips.cc',
     'debugger_x64.cc',
@@ -137,6 +146,7 @@
     'disassembler.cc',
     'disassembler.h',
     'disassembler_arm.cc',
+    'disassembler_arm64.cc',
     'disassembler_ia32.cc',
     'disassembler_mips.cc',
     'disassembler_test.cc',
@@ -160,6 +170,7 @@
     'flow_graph_compiler.cc',
     'flow_graph_compiler.h',
     'flow_graph_compiler_arm.cc',
+    'flow_graph_compiler_arm64.cc',
     'flow_graph_compiler_ia32.cc',
     'flow_graph_compiler_mips.cc',
     'flow_graph_compiler_x64.cc',
@@ -199,6 +210,9 @@
     'instructions_arm.cc',
     'instructions_arm.h',
     'instructions_arm_test.cc',
+    'instructions_arm64.cc',
+    'instructions_arm64.h',
+    'instructions_arm64_test.cc',
     'instructions_ia32.cc',
     'instructions_ia32.h',
     'instructions_ia32_test.cc',
@@ -211,6 +225,7 @@
     'intermediate_language.cc',
     'intermediate_language.h',
     'intermediate_language_arm.cc',
+    'intermediate_language_arm64.cc',
     'intermediate_language_ia32.cc',
     'intermediate_language_mips.cc',
     'intermediate_language_test.cc',
@@ -218,6 +233,7 @@
     'intrinsifier.cc',
     'intrinsifier.h',
     'intrinsifier_arm.cc',
+    'intrinsifier_arm64.cc',
     'intrinsifier_ia32.cc',
     'intrinsifier_mips.cc',
     'intrinsifier_x64.cc',
@@ -258,6 +274,7 @@
     'object.cc',
     'object.h',
     'object_arm_test.cc',
+    'object_arm64_test.cc',
     'object_ia32_test.cc',
     'object_id_ring.cc',
     'object_id_ring.h',
@@ -300,6 +317,7 @@
     'reusable_handles.h',
     'runtime_entry.h',
     'runtime_entry_arm.cc',
+    'runtime_entry_arm64.cc',
     'runtime_entry_ia32.cc',
     'runtime_entry_mips.cc',
     'runtime_entry_test.cc',
@@ -323,15 +341,19 @@
     'simulator.h',
     'simulator_arm.cc',
     'simulator_arm.h',
+    'simulator_arm64.cc',
+    'simulator_arm64.h',
     'simulator_mips.cc',
     'simulator_mips.h',
     'snapshot.cc',
     'snapshot.h',
     'snapshot_ids.h',
     'snapshot_test.cc',
+    'spaces.h',
     'stack_frame.cc',
     'stack_frame.h',
     'stack_frame_arm.h',
+    'stack_frame_arm64.h',
     'stack_frame_ia32.h',
     'stack_frame_mips.h',
     'stack_frame_test.cc',
@@ -342,6 +364,8 @@
     'stub_code.h',
     'stub_code_arm.cc',
     'stub_code_arm_test.cc',
+    'stub_code_arm64.cc',
+    'stub_code_arm64_test.cc',
     'stub_code_ia32.cc',
     'stub_code_ia32_test.cc',
     'stub_code_mips.cc',
diff --git a/sdk/lib/_internal/compiler/implementation/apiimpl.dart b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
index bde352e..1e417ab 100644
--- a/sdk/lib/_internal/compiler/implementation/apiimpl.dart
+++ b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
@@ -65,7 +65,8 @@
                 options, '--build-id=',
                 "build number could not be determined"),
             showPackageWarnings:
-                hasOption(options, '--show-package-warnings')) {
+                hasOption(options, '--show-package-warnings'),
+            useContentSecurityPolicy: hasOption(options, '--csp')) {
     if (!libraryRoot.path.endsWith("/")) {
       throw new ArgumentError("libraryRoot must end with a /");
     }
diff --git a/sdk/lib/_internal/compiler/implementation/common.dart b/sdk/lib/_internal/compiler/implementation/common.dart
index 2826d9e..89130c7 100644
--- a/sdk/lib/_internal/compiler/implementation/common.dart
+++ b/sdk/lib/_internal/compiler/implementation/common.dart
@@ -8,7 +8,7 @@
     CompilerTask,
     Compiler,
     Constant,
-    ConstantHandler,
+    ConstantEnvironment,
     InterceptorConstant,
     MessageKind,
     NullConstant,
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index 121fe5b..cc0eac6 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -4,14 +4,77 @@
 
 part of dart2js;
 
+/// A [ConstantEnvironment] provides access for constants compiled for variable
+/// initializers.
+abstract class ConstantEnvironment {
+  /// Returns the constant for the initializer of [element].
+  Constant getConstantForVariable(VariableElement element);
+}
+
+/// A class that can compile and provide constants for variables, nodes and
+/// metadata.
+abstract class ConstantCompiler extends ConstantEnvironment {
+  /// Compiles the compile-time constant for the initializer of [element], or
+  /// reports an error if the initializer is not a compile-time constant.
+  ///
+  /// Depending on implementation, the constant compiler might also compute
+  /// the compile-time constant for the backend interpretation of constants.
+  ///
+  /// The returned constant is always of the frontend interpretation.
+  Constant compileConstant(VariableElement element);
+
+  /// Computes the compile-time constant for the variable initializer,
+  /// if possible.
+  void compileVariable(VariableElement element);
+
+  /// Compiles the compile-time constant for [node], or reports an error if
+  /// [node] is not a compile-time constant.
+  ///
+  /// Depending on implementation, the constant compiler might also compute
+  /// the compile-time constant for the backend interpretation of constants.
+  ///
+  /// The returned constant is always of the frontend interpretation.
+  Constant compileNode(Node node, TreeElements elements);
+
+  /// Compiles the compile-time constant for the value [metadata], or reports an
+  /// error if the value is not a compile-time constant.
+  ///
+  /// Depending on implementation, the constant compiler might also compute
+  /// the compile-time constant for the backend interpretation of constants.
+  ///
+  /// The returned constant is always of the frontend interpretation.
+  Constant compileMetadata(MetadataAnnotation metadata,
+                           Node node, TreeElements elements);
+}
+
+/// A [BackendConstantEnvironment] provides access to constants needed for
+/// backend implementation.
+abstract class BackendConstantEnvironment extends ConstantEnvironment {
+  /// Returns the compile-time constant associated with [node].
+  ///
+  /// Depending on implementation, the constant might be stored in [elements].
+  Constant getConstantForNode(Node node, TreeElements elements);
+
+  /// Returns the compile-time constant value of [metadata].
+  Constant getConstantForMetadata(MetadataAnnotation metadata);
+}
+
+/// Interface for the task that compiles the constant environments for the
+/// frontend and backend interpretation of compile-time constants.
+abstract class ConstantCompilerTask extends CompilerTask
+    implements ConstantCompiler {
+  ConstantCompilerTask(Compiler compiler) : super(compiler);
+}
+
 /**
- * The [ConstantHandler] keeps track of compile-time constants,
- * initializations of global and static fields, and default values of
- * optional parameters.
+ * The [ConstantCompilerBase] is provides base implementation for compilation of
+ * compile-time constants for both the Dart and JavaScript interpretation of
+ * constants. It keeps track of compile-time constants for initializations of
+ * global and static fields, and default values of optional parameters.
  */
-class ConstantHandler extends CompilerTask {
+abstract class ConstantCompilerBase implements ConstantCompiler {
+  final Compiler compiler;
   final ConstantSystem constantSystem;
-  final bool isMetadata;
 
   /**
    * Contains the initial value of fields. Must contain all static and global
@@ -20,66 +83,40 @@
    *
    * Invariant: The keys in this map are declarations.
    */
-  final Map<VariableElement, Constant> initialVariableValues;
-
-  /** Set of all registered compiled constants. */
-  final Set<Constant> compiledConstants;
+  final Map<VariableElement, Constant> initialVariableValues =
+      new Map<VariableElement, Constant>();
 
   /** The set of variable elements that are in the process of being computed. */
-  final Set<VariableElement> pendingVariables;
+  final Set<VariableElement> pendingVariables = new Set<VariableElement>();
 
-  /** Caches the statics where the initial value cannot be eagerly compiled. */
-  final Set<VariableElement> lazyStatics;
-
-  ConstantHandler(Compiler compiler, this.constantSystem,
-                  { bool this.isMetadata: false })
-      : initialVariableValues = new Map<VariableElement, dynamic>(),
-        compiledConstants = new Set<Constant>(),
-        pendingVariables = new Set<VariableElement>(),
-        lazyStatics = new Set<VariableElement>(),
-        super(compiler);
-
-  String get name => 'ConstantHandler';
-
-  void addCompileTimeConstantForEmission(Constant constant) {
-    compiledConstants.add(constant);
-  }
+  ConstantCompilerBase(this.compiler, this.constantSystem);
 
   Constant getConstantForVariable(VariableElement element) {
     return initialVariableValues[element.declaration];
   }
 
-  /**
-   * Returns a compile-time constant, or reports an error if the element is not
-   * a compile-time constant.
-   */
   Constant compileConstant(VariableElement element) {
     return compileVariable(element, isConst: true);
   }
 
-  /**
-   * Returns the a compile-time constant if the variable could be compiled
-   * eagerly. Otherwise returns `null`.
-   */
   Constant compileVariable(VariableElement element, {bool isConst: false}) {
-    return measure(() {
-      if (initialVariableValues.containsKey(element.declaration)) {
-        Constant result = initialVariableValues[element.declaration];
-        return result;
-      }
-      Element currentElement = element;
-      if (element.isParameter()
-          || element.isFieldParameter()
-          || element.isVariable()) {
-        currentElement = element.enclosingElement;
-      }
-      return compiler.withCurrentElement(currentElement, () {
-        TreeElements definitions =
-            compiler.analyzeElement(currentElement.declaration);
-        Constant constant = compileVariableWithDefinitions(
-            element, definitions, isConst: isConst);
-        return constant;
-      });
+
+    if (initialVariableValues.containsKey(element.declaration)) {
+      Constant result = initialVariableValues[element.declaration];
+      return result;
+    }
+    Element currentElement = element;
+    if (element.isParameter() ||
+        element.isFieldParameter() ||
+        element.isVariable()) {
+      currentElement = element.enclosingElement;
+    }
+    return compiler.withCurrentElement(currentElement, () {
+      TreeElements definitions =
+          compiler.analyzeElement(currentElement.declaration);
+      Constant constant = compileVariableWithDefinitions(
+          element, definitions, isConst: isConst);
+      return constant;
     });
   }
 
@@ -92,149 +129,116 @@
   Constant compileVariableWithDefinitions(VariableElement element,
                                           TreeElements definitions,
                                           {bool isConst: false}) {
-    return measure(() {
-      if (!isConst && lazyStatics.contains(element)) return null;
-
-      Node node = element.parseNode(compiler);
-      if (pendingVariables.contains(element)) {
-        if (isConst) {
-          compiler.reportFatalError(
-              node, MessageKind.CYCLIC_COMPILE_TIME_CONSTANTS);
-        } else {
-          lazyStatics.add(element);
-          return null;
-        }
+    Node node = element.parseNode(compiler);
+    if (pendingVariables.contains(element)) {
+      if (isConst) {
+        compiler.reportFatalError(
+            node, MessageKind.CYCLIC_COMPILE_TIME_CONSTANTS);
       }
-      pendingVariables.add(element);
+      return null;
+    }
+    pendingVariables.add(element);
 
-      Expression initializer = element.initializer;
-      Constant value;
-      if (initializer == null) {
-        // No initial value.
-        value = new NullConstant();
-      } else {
-        value = compileNodeWithDefinitions(
-            initializer, definitions, isConst: isConst);
-        if (compiler.enableTypeAssertions &&
-            value != null &&
-            element.isField()) {
-          DartType elementType = element.type;
-          if (elementType.kind == TypeKind.MALFORMED_TYPE && !value.isNull) {
-            if (isConst) {
-              ErroneousElement element = elementType.element;
-              compiler.reportFatalError(
-                  node, element.messageKind, element.messageArguments);
-            } else {
-              // We need to throw an exception at runtime.
-              value = null;
-            }
+    Expression initializer = element.initializer;
+    Constant value;
+    if (initializer == null) {
+      // No initial value.
+      value = new NullConstant();
+    } else {
+      value = compileNodeWithDefinitions(
+          initializer, definitions, isConst: isConst);
+      if (compiler.enableTypeAssertions &&
+          value != null &&
+          element.isField()) {
+        DartType elementType = element.type;
+        if (elementType.kind == TypeKind.MALFORMED_TYPE && !value.isNull) {
+          if (isConst) {
+            ErroneousElement element = elementType.element;
+            compiler.reportFatalError(
+                node, element.messageKind, element.messageArguments);
           } else {
-            DartType constantType = value.computeType(compiler);
-            if (!constantSystem.isSubtype(compiler,
-                                          constantType, elementType)) {
-              if (isConst) {
-                compiler.reportFatalError(
-                    node, MessageKind.NOT_ASSIGNABLE,
-                    {'fromType': constantType, 'toType': elementType});
-              } else {
-                // If the field cannot be lazily initialized, we will throw
-                // the exception at runtime.
-                value = null;
-              }
+            // We need to throw an exception at runtime.
+            value = null;
+          }
+        } else {
+          DartType constantType = value.computeType(compiler);
+          if (!constantSystem.isSubtype(compiler,
+                                        constantType, elementType)) {
+            if (isConst) {
+              compiler.reportFatalError(
+                  node, MessageKind.NOT_ASSIGNABLE,
+                  {'fromType': constantType, 'toType': elementType});
+            } else {
+              // If the field cannot be lazily initialized, we will throw
+              // the exception at runtime.
+              value = null;
             }
           }
         }
       }
-      if (value != null) {
-        initialVariableValues[element.declaration] = value;
-      } else {
-        assert(!isConst);
-        lazyStatics.add(element);
-      }
-      pendingVariables.remove(element);
-      return value;
-    });
+    }
+    if (value != null) {
+      initialVariableValues[element.declaration] = value;
+    } else {
+      assert(!isConst);
+    }
+    pendingVariables.remove(element);
+    return value;
   }
 
   Constant compileNodeWithDefinitions(Node node,
                                       TreeElements definitions,
-                                      {bool isConst: false}) {
-    return measure(() {
-      assert(node != null);
-      Constant constant = definitions.getConstant(node);
-      if (constant != null) {
-        return constant;
-      }
-      CompileTimeConstantEvaluator evaluator = new CompileTimeConstantEvaluator(
-          this, definitions, compiler, isConst: isConst);
-      constant = evaluator.evaluate(node);
-      if (constant != null) {
-        definitions.setConstant(node, constant);
-      }
+                                      {bool isConst: true}) {
+    assert(node != null);
+    CompileTimeConstantEvaluator evaluator = new CompileTimeConstantEvaluator(
+        this, definitions, compiler, isConst: isConst);
+    return evaluator.evaluate(node);
+  }
+
+  Constant compileNode(Node node, TreeElements elements) {
+    return compileNodeWithDefinitions(node, elements);
+  }
+
+  Constant compileMetadata(MetadataAnnotation metadata,
+                           Node node,
+                           TreeElements elements) {
+    return compileNodeWithDefinitions(node, elements);
+  }
+}
+
+/// [ConstantCompiler] that uses the Dart semantics for the compile-time
+/// constant evaluation.
+class DartConstantCompiler extends ConstantCompilerBase {
+  DartConstantCompiler(Compiler compiler)
+      : super(compiler, const DartConstantSystem());
+
+  Constant getConstantForNode(Node node, TreeElements definitions) {
+    return definitions.getConstant(node);
+  }
+
+  Constant getConstantForMetadata(MetadataAnnotation metadata) {
+    return metadata.value;
+  }
+
+  Constant compileNodeWithDefinitions(Node node,
+                                      TreeElements definitions,
+                                      {bool isConst: true}) {
+    Constant constant = definitions.getConstant(node);
+    if (constant != null) {
       return constant;
-    });
-  }
-
-  /**
-   * Returns an [Iterable] of static non final fields that need to be
-   * initialized. The fields list must be evaluated in order since they might
-   * depend on each other.
-   */
-  Iterable<VariableElement> getStaticNonFinalFieldsForEmission() {
-    return initialVariableValues.keys.where((element) {
-      return element.kind == ElementKind.FIELD
-          && !element.isInstanceMember()
-          && !element.modifiers.isFinal()
-          // The const fields are all either emitted elsewhere or inlined.
-          && !element.modifiers.isConst();
-    });
-  }
-
-  List<VariableElement> getLazilyInitializedFieldsForEmission() {
-    return new List<VariableElement>.from(lazyStatics);
-  }
-
-  /**
-   * Returns a list of constants topologically sorted so that dependencies
-   * appear before the dependent constant.  [preSortCompare] is a comparator
-   * function that gives the constants a consistent order prior to the
-   * topological sort which gives the constants an ordering that is less
-   * sensitive to perturbations in the source code.
-   */
-  List<Constant> getConstantsForEmission([preSortCompare]) {
-    // We must emit dependencies before their uses.
-    Set<Constant> seenConstants = new Set<Constant>();
-    List<Constant> result = new List<Constant>();
-
-    void addConstant(Constant constant) {
-      if (!seenConstants.contains(constant)) {
-        constant.getDependencies().forEach(addConstant);
-        assert(!seenConstants.contains(constant));
-        result.add(constant);
-        seenConstants.add(constant);
-      }
     }
-
-    List<Constant> sorted = compiledConstants.toList();
-    if (preSortCompare != null) {
-      sorted.sort(preSortCompare);
+    constant =
+        super.compileNodeWithDefinitions(node, definitions, isConst: isConst);
+    if (constant != null) {
+      definitions.setConstant(node, constant);
     }
-    sorted.forEach(addConstant);
-    return result;
-  }
-
-  Constant getInitialValueFor(VariableElement element) {
-    Constant initialValue = initialVariableValues[element.declaration];
-    if (initialValue == null) {
-      compiler.internalError(element, "No initial value for given element.");
-    }
-    return initialValue;
+    return constant;
   }
 }
 
 class CompileTimeConstantEvaluator extends Visitor {
   bool isEvaluatingConstant;
-  final ConstantHandler handler;
+  final ConstantCompilerBase handler;
   final TreeElements elements;
   final Compiler compiler;
 
@@ -440,6 +444,14 @@
     return false;
   }
 
+  Constant visitIdentifier(Identifier node) {
+    Element element = elements[node];
+    if (Elements.isClass(element) || Elements.isTypedef(element)) {
+      return makeTypeConstant(element);
+    }
+    return signalNotCompileTimeConstant(node);
+  }
+
   // TODO(floitsch): provide better error-messages.
   Constant visitSend(Send send) {
     Element element = elements[send];
@@ -477,11 +489,6 @@
         Constant right = evaluate(send.argumentsNode.nodes.tail.head);
         Constant result = constantSystem.identity.fold(left, right);
         if (result != null) return result;
-      } else if (Elements.isClass(element) || Elements.isTypedef(element)) {
-        // The node itself is not a constant but we register the selector (the
-        // identifier that refers to the class/typedef) as a constant.
-        Constant typeConstant = makeTypeConstant(element);
-        elements.setConstant(send.selector, typeConstant);
       }
       return signalNotCompileTimeConstant(send);
     } else if (send.isPrefix) {
@@ -799,26 +806,6 @@
   }
 }
 
-class TryCompileTimeConstantEvaluator extends CompileTimeConstantEvaluator {
-  TryCompileTimeConstantEvaluator(ConstantHandler handler,
-                                  TreeElements elements,
-                                  Compiler compiler)
-      : super(handler, elements, compiler, isConst: true);
-
-  error(Node node, MessageKind message) {
-    // Just fail without reporting it anywhere.
-    throw new CompileTimeConstantError(
-        message, const {}, compiler.terseDiagnostics);
-  }
-}
-
-class CompileTimeConstantError {
-  final Message message;
-  CompileTimeConstantError(MessageKind kind, Map arguments, bool terse)
-    : message = new Message(kind, arguments, terse);
-  String toString() => message.toString();
-}
-
 class ConstructorEvaluator extends CompileTimeConstantEvaluator {
   final FunctionElement constructor;
   final Map<Element, Constant> definitions;
@@ -830,7 +817,7 @@
    * Invariant: [constructor] must be an implementation element.
    */
   ConstructorEvaluator(FunctionElement constructor,
-                       ConstantHandler handler,
+                       ConstantCompiler handler,
                        Compiler compiler)
       : this.constructor = constructor,
         this.definitions = new Map<Element, Constant>(),
@@ -863,6 +850,8 @@
       // TODO(ngeoffray): Handle type parameters.
       if (elementType.element.isTypeVariable()) return;
       if (!constantSystem.isSubtype(compiler, constantType, elementType)) {
+        // TODO(johnniwinther): Provide better [node] values that point to the
+        // origin of the constant and not (just) the assignment.
         compiler.reportFatalError(
             node, MessageKind.NOT_ASSIGNABLE,
             {'fromType': elementType, 'toType': constantType});
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 64c6f71..824f203 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -74,11 +74,20 @@
 
 abstract class Backend {
   final Compiler compiler;
-  final ConstantSystem constantSystem;
 
-  Backend(this.compiler,
-          [ConstantSystem constantSystem = DART_CONSTANT_SYSTEM])
-      : this.constantSystem = constantSystem;
+  Backend(this.compiler);
+
+  /// The [ConstantSystem] used to interpret compile-time constants for this
+  /// backend.
+  ConstantSystem get constantSystem;
+
+  /// The constant environment for the backend interpretation of compile-time
+  /// constants.
+  BackendConstantEnvironment get constants;
+
+  /// The compiler task responsible for the compilation of constants for both
+  /// the frontend and the backend.
+  ConstantCompilerTask get constantCompilerTask;
 
   // Given a [FunctionElement], return a buffer with the code generated for it
   // or null if no code was generated.
@@ -352,6 +361,14 @@
    */
   final TreeElements globalDependencies = new TreeElementMapping(null);
 
+  /**
+   * Dependencies that are only included due to mirrors.
+   *
+   * We should get rid of this and ensure that all dependencies are
+   * associated with a particular element.
+   */
+  final TreeElements mirrorDependencies = new TreeElementMapping(null);
+
   final bool enableMinification;
   final bool enableTypeAssertions;
   final bool enableUserAssertions;
@@ -359,6 +376,7 @@
   final bool enableConcreteTypeInference;
   final bool disableTypeInferenceFlag;
   final bool dumpInfo;
+  final bool useContentSecurityPolicy;
 
   /**
    * The maximum size of a concrete type before it widens to dynamic during
@@ -557,7 +575,11 @@
   IrBuilderTask irBuilder;
   ti.TypesTask typesTask;
   Backend backend;
-  ConstantHandler constantHandler;
+
+  /// The constant environment for the frontend interpretation of compile-time
+  /// constants.
+  ConstantEnvironment constants;
+
   EnqueueTask enqueuer;
   DeferredLoadTask deferredLoadTask;
   MirrorUsageAnalyzerTask mirrorUsageAnalyzerTask;
@@ -638,6 +660,7 @@
             this.terseDiagnostics: false,
             this.dumpInfo: false,
             this.showPackageWarnings: false,
+            this.useContentSecurityPolicy: false,
             outputProvider,
             List<String> strips: const []})
       : this.analyzeOnly =
@@ -669,12 +692,12 @@
       dietParser = new DietParserTask(this),
       parser = new ParserTask(this),
       patchParser = new PatchParserTask(this),
-      resolver = new ResolverTask(this),
+      resolver = new ResolverTask(this, backend.constantCompilerTask),
       closureToClassMapper = new closureMapping.ClosureTask(this, closureNamer),
       checker = new TypeCheckerTask(this),
       irBuilder = new IrBuilderTask(this),
       typesTask = new ti.TypesTask(this),
-      constantHandler = new ConstantHandler(this, backend.constantSystem),
+      constants = backend.constantCompilerTask,
       deferredLoadTask = new DeferredLoadTask(this),
       mirrorUsageAnalyzerTask = new MirrorUsageAnalyzerTask(this),
       enqueuer = new EnqueueTask(this),
@@ -933,8 +956,8 @@
 
     dynamicClass.ensureResolved(this);
 
-    proxyConstant = constantHandler.compileVariable(
-        coreLibrary.find('proxy'), isConst: true);
+    proxyConstant =
+        resolver.constantCompiler.compileConstant(coreLibrary.find('proxy'));
   }
 
   Element _unnamedListConstructor;
@@ -1077,16 +1100,18 @@
       deferredLoadTask.ensureMetadataResolved(this);
     }
 
-    log('Resolving...');
     phase = PHASE_RESOLVING;
     if (analyzeAll) {
-      libraries.forEach(
-          (_, lib) => fullyEnqueueLibrary(lib, enqueuer.resolution));
+      libraries.forEach((uri, lib) {
+        log('Enqueuing $uri');
+        fullyEnqueueLibrary(lib, enqueuer.resolution);
+      });
     }
     // Elements required by enqueueHelpers are global dependencies
     // that are not pulled in by a particular element.
     backend.enqueueHelpers(enqueuer.resolution, globalDependencies);
     resolveLibraryMetadata();
+    log('Resolving...');
     processQueue(enqueuer.resolution, main);
     enqueuer.resolution.logSummary(log);
 
@@ -1372,11 +1397,6 @@
     reportDiagnosticInternal(node, messageKind, arguments, api.Diagnostic.HINT);
   }
 
-  /// For debugging only, print a message with a source location.
-  void reportHere(Spannable node, String debugMessage) {
-    reportInfo(node, MessageKind.GENERIC, {'text': 'HERE: $debugMessage'});
-  }
-
   void reportDiagnosticInternal(Spannable node,
                                 MessageKind messageKind,
                                 Map arguments,
@@ -1386,7 +1406,7 @@
       case api.Diagnostic.WARNING:
       case api.Diagnostic.HINT:
         Element element = elementFromSpannable(node);
-        if (!inUserCode(element)) {
+        if (!inUserCode(element, assumeInUserCode: true)) {
           Uri uri = getCanonicalUri(element);
           SuppressionInfo info =
               suppressedWarnings.putIfAbsent(uri, () => new SuppressionInfo());
@@ -1550,10 +1570,20 @@
       if (member.isFunction()) {
         if (!enqueuer.resolution.isLive(member)) {
           reportHint(member, MessageKind.UNUSED_METHOD,
-                     {'method_name': member.name});
+                     {'name': member.name});
         }
-      } else if (member.isClass() && !member.isMixinApplication) {
-        member.forEachLocalMember(checkLive);
+      } else if (member.isClass()) {
+        if (!member.isResolved) {
+          reportHint(member, MessageKind.UNUSED_CLASS,
+                     {'name': member.name});
+        } else {
+          member.forEachLocalMember(checkLive);
+        }
+      } else if (member.isTypedef()) {
+        if (!member.isResolved) {
+          reportHint(member, MessageKind.UNUSED_TYPEDEF,
+                     {'name': member.name});
+        }
       }
     }
     libraries.forEach((_, library) {
@@ -1589,7 +1619,10 @@
   /// with that scheme is in user code. For instance, an entry point URI is
   /// 'file:///foo.dart' then every library whose canonical URI scheme is
   /// 'file' is in user code.
-  bool inUserCode(Element element) {
+  ///
+  /// If [assumeInUserCode] is `true`, [element] is assumed to be in user code
+  /// if no entrypoints have been set.
+  bool inUserCode(Element element, {bool assumeInUserCode: false}) {
     List<Uri> entrypoints = <Uri>[];
     if (mainApp != null) {
       entrypoints.add(mainApp.canonicalUri);
@@ -1597,7 +1630,7 @@
     if (librariesToAnalyzeWhenRun != null) {
       entrypoints.addAll(librariesToAnalyzeWhenRun);
     }
-    if (entrypoints.isEmpty) {
+    if (entrypoints.isEmpty && assumeInUserCode) {
       // Assume in user code since [mainApp] has not been set yet.
       return true;
     }
diff --git a/sdk/lib/_internal/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart
index 6a0363a..5d2349d 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2js.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart
@@ -15,7 +15,7 @@
 import 'source_file_provider.dart';
 import 'filenames.dart';
 import 'util/uri_extras.dart';
-import 'util/util.dart';
+import 'util/util.dart' show stackTraceFilePrefix;
 import '../../libraries.dart';
 
 const String LIBRARY_ROOT = '../../../../..';
@@ -297,6 +297,7 @@
     new OptionHandler('--disallow-unsafe-eval',
                       (_) => hasDisallowUnsafeEval = true),
     new OptionHandler('--show-package-warnings', passThrough),
+    new OptionHandler('--csp', passThrough),
     new OptionHandler('-D.+=.*', addInEnvironment),
 
     // The following two options must come last.
@@ -575,6 +576,10 @@
   --show-package-warnings
     Show warnings and hints generated from packages.
 
+  --csp
+    Disables dynamic generation of code in the generated output. This is
+    necessary to satisfy CSP restrictions (see http://www.w3.org/TR/CSP/).
+
 The following options are only used for compiler development and may
 be removed in a future version:
 
diff --git a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
index 1e38278..008096f 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
@@ -39,6 +39,7 @@
 import 'deferred_load.dart' show DeferredLoadTask;
 import 'mirrors_used.dart' show MirrorUsageAnalyzerTask;
 import 'dump_info.dart';
+import 'helpers/helpers.dart';
 
 export 'resolution/resolution.dart' show TreeElements, TreeElementMapping;
 export 'scanner/scannerlib.dart' show isUserDefinableOperator,
@@ -51,6 +52,7 @@
     show Spannable,
          CURRENT_ELEMENT_SPANNABLE,
          NO_LOCATION_SPANNABLE;
+export 'helpers/helpers.dart';
 
 part 'code_buffer.dart';
 part 'compile_time_constants.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index 2e23daa..94bdc2d 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -45,6 +45,16 @@
   Map<Element, TreeElements> get resolvedElements =>
       compiler.enqueuer.resolution.resolvedElements;
 
+  ConstantSystem get constantSystem {
+    return constantCompilerTask.constantCompiler.constantSystem;
+  }
+
+  BackendConstantEnvironment get constants => constantCompilerTask;
+
+  DartConstantTask constantCompilerTask;
+
+  final Set<ClassElement> usedTypeLiterals = new Set<ClassElement>();
+
   /**
    * Tells whether it is safe to remove type declarations from variables,
    * functions parameters. It becomes not safe if:
@@ -96,6 +106,7 @@
         reexportingLibraries = <Element, LibraryElement>{},
         forceStripTypes = strips.indexOf('types') != -1,
         stripAsserts = strips.indexOf('asserts') != -1,
+        constantCompilerTask  = new DartConstantTask(compiler),
         super(compiler);
 
   bool classNeedsRti(ClassElement cls) => false;
@@ -226,6 +237,8 @@
         tree.Builder builder = new tree.Builder(compiler);
         tree.Expression expr = function.accept(builder);
         treeElements = new TreeElementMapping(element);
+        tree.Unnamer unnamer = new tree.Unnamer();
+        expr = unnamer.unname(expr);
         tree.Emitter emitter = new tree.Emitter();
         node = emitter.emit(element, treeElements, expr);
       }
@@ -239,11 +252,14 @@
     // Build all top level elements to emit and necessary class members.
     var newTypedefElementCallback, newClassElementCallback;
 
-    processElement(element, elementAst) {
-      new ReferencedElementCollector(
-          compiler,
-          element, elementAst.treeElements,
-          newTypedefElementCallback, newClassElementCallback).collect();
+    void processElement(Element element, ElementAst elementAst) {
+      ReferencedElementCollector collector =
+          new ReferencedElementCollector(compiler,
+                                         element,
+                                         elementAst,
+                                         newTypedefElementCallback,
+                                         newClassElementCallback);
+      collector.collect();
       elementAsts[element] = elementAst;
     }
 
@@ -292,6 +308,16 @@
         }
       }
     });
+    Set<ClassElement> emitNoMembersFor = new Set<ClassElement>();
+    usedTypeLiterals.forEach((ClassElement element) {
+      if (shouldOutput(element)) {
+        if (!topLevelElements.contains(element)) {
+          // The class is only referenced by type literals.
+          emitNoMembersFor.add(element);
+        }
+        addClass(element);
+      }
+    });
 
     // Add synthesized constructors to classes with no resolved constructors,
     // but which originally had any constructor.  That should prevent
@@ -301,6 +327,7 @@
 
     NextClassElement:
     for (ClassElement classElement in classMembers.keys) {
+      if (emitNoMembersFor.contains(classElement)) continue;
       for (Element member in classMembers[classElement]) {
         if (member.isConstructor()) continue NextClassElement;
       }
@@ -376,7 +403,7 @@
 
       // Emit XML for AST instead of the program.
       for (final topLevel in sortedTopLevels) {
-        if (topLevel.isClass()) {
+        if (topLevel.isClass() && !emitNoMembersFor.contains(topLevel)) {
           // TODO(antonm): add some class info.
           sortedClassMembers[topLevel].forEach(outputElement);
         } else {
@@ -448,6 +475,14 @@
     return new Future.value();
   }
 
+  void registerTypeLiteral(Element element,
+                           Enqueuer enqueuer,
+                           TreeElements elements) {
+    if (element.isClass()) {
+      usedTypeLiterals.add(element);
+    }
+  }
+
   void registerStaticSend(Element element, Node node) {
     if (useMirrorHelperLibrary) {
       mirrorRenamer.registerStaticSend(element, node);
@@ -506,14 +541,14 @@
  */
 class ReferencedElementCollector extends Visitor {
   final Compiler compiler;
-  final Element rootElement;
-  final TreeElements treeElements;
+  final Element element;
+  final ElementAst elementAst;
   final newTypedefElementCallback;
   final newClassElementCallback;
 
   ReferencedElementCollector(this.compiler,
-                             this.rootElement,
-                             this.treeElements,
+                             this.element,
+                             this.elementAst,
                              this.newTypedefElementCallback,
                              this.newClassElementCallback);
 
@@ -522,6 +557,7 @@
   }
 
   visitTypeAnnotation(TypeAnnotation typeAnnotation) {
+    TreeElements treeElements = elementAst.treeElements;
     final DartType type = treeElements.getType(typeAnnotation);
     assert(invariant(typeAnnotation, type != null,
         message: "Missing type for type annotation: $treeElements."));
@@ -532,8 +568,8 @@
   }
 
   void collect() {
-    compiler.withCurrentElement(rootElement, () {
-      rootElement.parseNode(compiler).accept(this);
+    compiler.withCurrentElement(element, () {
+      elementAst.ast.accept(this);
     });
   }
 }
@@ -554,3 +590,56 @@
 
 List<Element> sortElements(Iterable<Element> elements) =>
     sorted(elements, compareElements);
+
+/// [ConstantCompilerTask] for compilation of constants for the Dart backend.
+///
+/// Since this task needs no distinction between frontend and backend constants
+/// it also serves as the [BackendConstantEnvironment].
+class DartConstantTask extends ConstantCompilerTask
+    implements BackendConstantEnvironment {
+  final DartConstantCompiler constantCompiler;
+
+  DartConstantTask(Compiler compiler)
+    : this.constantCompiler = new DartConstantCompiler(compiler),
+      super(compiler);
+
+  String get name => 'ConstantHandler';
+
+  Constant getConstantForVariable(VariableElement element) {
+    return constantCompiler.getConstantForVariable(element);
+  }
+
+  Constant getConstantForNode(Node node, TreeElements elements) {
+    return constantCompiler.getConstantForNode(node, elements);
+  }
+
+  Constant getConstantForMetadata(MetadataAnnotation metadata) {
+    return metadata.value;
+  }
+
+  Constant compileConstant(VariableElement element) {
+    return measure(() {
+      return constantCompiler.compileConstant(element);
+    });
+  }
+
+  void compileVariable(VariableElement element) {
+    measure(() {
+      constantCompiler.compileVariable(element);
+    });
+  }
+
+  Constant compileNode(Node node, TreeElements elements) {
+    return measure(() {
+      return constantCompiler.compileNodeWithDefinitions(node, elements);
+    });
+  }
+
+  Constant compileMetadata(MetadataAnnotation metadata,
+                           Node node,
+                           TreeElements elements) {
+    return measure(() {
+      return constantCompiler.compileMetadata(metadata, node, elements);
+    });
+  }
+}
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 b90df7f..178f3bd 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
@@ -5,6 +5,7 @@
 library dart_tree;
 
 import '../dart2jslib.dart' as dart2js;
+import '../dart_types.dart';
 import '../util/util.dart';
 import '../elements/elements.dart' show FunctionElement, FunctionSignature;
 import '../ir/ir_nodes.dart' as ir;
@@ -36,7 +37,9 @@
 /**
  * The base class of [Expression]s.
  */
-abstract class Expression extends Node {}
+abstract class Expression extends Node {
+  bool get isPure;
+}
 
 /**
  * Variables are [Expression]s.
@@ -52,15 +55,29 @@
   ast.Identifier assignIdentifier() {
     assert(identifier == null);
     String name = _newName();
-    identifier = new ast.Identifier(
-        new StringToken.fromString(IDENTIFIER_INFO, name, -1));
+    identifier = Emitter.makeIdentifier(name);
     return identifier;
   }
 
+  final bool isPure = true;
+
   accept(Visitor visitor) => visitor.visitVariable(this);
 }
 
 /**
+ * A sequence of expressions.
+ */
+class Sequence extends Expression {
+  final List<Expression> expressions;
+
+  Sequence(this.expressions);
+
+  bool get isPure => expressions.every((e) => e.isPure);
+
+  accept(Visitor visitor) => visitor.visitSequence(this);
+}
+
+/**
  * A local binding of a [Variable] to an [Expression].
  *
  * In contrast to the CPS-based IR, non-primitive expressions can be named
@@ -73,6 +90,8 @@
 
   LetVal(this.variable, this.definition, this.body);
 
+  bool get isPure => definition.isPure && body.isPure;
+
   accept(Visitor visitor) => visitor.visitLetVal(this);
 }
 
@@ -87,6 +106,8 @@
 
   InvokeStatic(this.target, this.arguments);
 
+  final bool isPure = false;
+
   accept(Visitor visitor) => visitor.visitInvokeStatic(this);
 }
 
@@ -97,10 +118,12 @@
  * expression.
  */
 class Return extends Expression {
-  final Expression value;
+  Expression value;
 
   Return(this.value);
 
+  final bool isPure = true;
+
   accept(Visitor visitor) => visitor.visitReturn(this);
 }
 
@@ -112,6 +135,8 @@
 
   Constant(this.value);
 
+  final bool isPure = true;
+
   accept(Visitor visitor) => visitor.visitConstant(this);
 }
 
@@ -122,6 +147,7 @@
 
   // Concrete classes.
   T visitVariable(Variable node) => visitExpression(node);
+  T visitSequence(Sequence node) => visitExpression(node);
   T visitLetVal(LetVal node) => visitExpression(node);
   T visitInvokeStatic(InvokeStatic node) => visitExpression(node);
   T visitReturn(Return node) => visitExpression(node);
@@ -185,10 +211,14 @@
 
   Expression visitLetPrim(ir.LetPrim node) {
     // LetPrim is translated to LetVal.
-    Variable variable = new Variable();
     Expression definition = node.primitive.accept(this);
-    variables[node.primitive] = variable;
-    return new LetVal(variable, definition, node.body.accept(this));
+    if (node.primitive.hasAtLeastOneUse) {
+      Variable variable = new Variable();
+      variables[node.primitive] = variable;
+      return new LetVal(variable, definition, node.body.accept(this));
+    } else {
+      return new Sequence([definition, node.body.accept(this)]);
+    }
   }
 
   Expression visitLetCont(ir.LetCont node) {
@@ -208,9 +238,13 @@
       return new Return(invoke);
     } else {
       assert(cont.hasExactlyOneUse);
-      Variable variable = new Variable();
-      variables[cont.parameter] = variable;
-      return new LetVal(variable, invoke, cont.body.accept(this));
+      if (cont.parameter.hasAtLeastOneUse) {
+        Variable variable = new Variable();
+        variables[cont.parameter] = variable;
+        return new LetVal(variable, invoke, cont.body.accept(this));
+      } else {
+        return new Sequence([invoke, cont.body.accept(this)]);
+      }
     }
   }
 
@@ -241,6 +275,110 @@
 }
 
 /**
+ * Unnamer propagates single-use definitions to their use site when possible.
+ *
+ * After translating out of CPS, all intermediate values are bound by [LetVal].
+ * This transformation propagates such definitions to their uses when it is
+ * safe and profitable.  Bindings are processed "on demand" when their uses are
+ * seen, but are only processed once to keep this transformation linear in
+ * the size of the tree.
+ *
+ * The transformation builds an environment containing [LetVal] bindings that
+ * are in scope.  These bindings have yet-untranslated definitions.  When a use
+ * is encountered the transformation determines if it is safe and profitable
+ * to propagate the definition to its use.  If so, it is removed from the
+ * environment and the definition is recursively processed (in the
+ * new environment at the use site) before being propagated.
+ *
+ * See [visitVariable] for the implementation of the heuristic for propagating
+ * a definition.
+ */
+class Unnamer extends Visitor<Expression> {
+  // The binding environment.  The rightmost element of the list is the nearest
+  // enclosing binding.
+  List<LetVal> environment;
+
+  Expression unname(Expression body) {
+    environment = <LetVal>[];
+    body = body.accept(this);
+
+    // TODO(kmillikin):  Allow definitions that are not propagated.  Here,
+    // this means rebuilding the binding with a recursively unnamed definition,
+    // or else introducing a variable definition and an assignment.
+    assert(environment.isEmpty);
+    return body;
+  }
+
+  Expression visitVariable(Variable node) {
+    // Propagate a variable's definition to its use site if:
+    // 1.  It has a single use, to avoid code growth and potential duplication
+    //     of side effects, AND
+    // 2a. It is pure (i.e., does not have side effects that prevent it from
+    //     being moved), OR
+    // 2b. There are only pure expressions between the definition and use.
+
+    // TODO(kmillikin): It's not always beneficial to propagate pure
+    // definitions---it can prevent propagation of their inputs.  Implement
+    // a heuristic to avoid this.
+
+    // TODO(kmillikin): Replace linear search with something faster in
+    // practice.
+    bool seenImpure = false;
+    for (int i = environment.length - 1; i >= 0; --i) {
+      if (environment[i].variable == node) {
+        if (!seenImpure || environment[i].definition.isPure) {
+          // Use the definition if it is pure or if it is the first impure
+          // definition (i.e., propagating past only pure expressions).
+          return environment.removeAt(i).definition.accept(this);
+        }
+        break;
+      } else if (!environment[i].definition.isPure) {
+        // Once the first impure definition is seen, impure definitions should
+        // no longer be propagated.  Continue searching for a pure definition.
+        seenImpure = true;
+      }
+    }
+    // If the definition could not be propagated, leave the variable use.
+    return node;
+  }
+
+  Expression visitSequence(Sequence node) {
+    for (int i = 0; i < node.expressions.length; ++i) {
+      node.expressions[i] = node.expressions[i].accept(this);
+    }
+    return node;
+  }
+
+  Expression visitLetVal(LetVal node) {
+    environment.add(node);
+    Expression body = node.body.accept(this);
+
+    // TODO(kmillikin): Allow definitions that are not propagated.  Currently,
+    // the only bindings are anonymous intermediate values (which only have one
+    // use in the absence of optimizations) and they are not reordered.
+    assert(!environment.contains(node));
+    return body;
+  }
+
+  Expression visitInvokeStatic(InvokeStatic node) {
+    // Process arguments right-to-left, the opposite of evaluation order.
+    for (int i = node.arguments.length - 1; i >= 0; --i) {
+      node.arguments[i] = node.arguments[i].accept(this);
+    }
+    return node;
+  }
+
+  Expression visitReturn(Return node) {
+    node.value = node.value.accept(this);
+    return node;
+  }
+
+  visitConstant(Constant node) {
+    return node;
+  }
+}
+
+/**
  * [Emitter] translates Tree to a Dart AST.
  *
  * The AST is handed off to the Dart backend for renaming and to emit Dart
@@ -267,42 +405,29 @@
   // tree.
   dart2js.TreeElementMapping treeElements;
 
-  /**
-   * Translate the body of a function to an AST FunctionExpression.
-   */
-  ast.FunctionExpression emit(FunctionElement element,
-                              dart2js.TreeElementMapping treeElements,
-                              Expression expr) {
-    // Reset the variable index.  This function is not reentrant.
-    Variable.counter = 0;
-    this.treeElements = treeElements;
-    ast.Identifier name = new ast.Identifier(
-        new StringToken.fromString(IDENTIFIER_INFO, element.name, -1));
+  // Tokens needed in the AST.
+  final Token openParen = new BeginGroupToken(OPEN_PAREN_INFO, -1);
+  final Token closeParen = new SymbolToken(CLOSE_PAREN_INFO, -1);
+  final Token openBrace = new BeginGroupToken(OPEN_CURLY_BRACKET_INFO, -1);
+  final Token closeBrace = new SymbolToken(CLOSE_CURLY_BRACKET_INFO, -1);
+  final Token semicolon = new SymbolToken(SEMICOLON_INFO, -1);
 
-    ast.NodeList parameters = new ast.NodeList(
-        new BeginGroupToken(OPEN_PAREN_INFO, -1),
-        const Link<ast.Node>(),
-        new SymbolToken(CLOSE_PAREN_INFO, -1),
-        ',');
-    ast.Node body = expr.accept(this);
+  // Helper methods to construct ASTs.
+  static ast.Identifier makeIdentifier(String name) {
+    return new ast.Identifier(
+        new StringToken.fromString(IDENTIFIER_INFO, name, -1));
+  }
 
-    ast.Identifier modifier =
-        new ast.Identifier(new KeywordToken(Keyword.keywords['var'], -1));
-    ast.VariableDefinitions definitions = new ast.VariableDefinitions(
-        null,
-        new ast.Modifiers(new ast.NodeList(
-            null,
-            new Link<ast.Node>.fromList([modifier]),
-            null,
-            ' ')),
-        new ast.NodeList(
-            null,
-            new Link<ast.Node>.fromList(variables),
-            new SymbolToken(SEMICOLON_INFO, -1),
-            ','));
-    body = concatenate(definitions, body);
-    return new ast.FunctionExpression(name, parameters, body, null,
-        ast.Modifiers.EMPTY, null, null);
+  ast.NodeList makeArgumentList(List<ast.Node> arguments) {
+    return new ast.NodeList(openParen,
+                            new Link<ast.Node>.fromList(arguments),
+                            closeParen,
+                            ',');
+  }
+
+  ast.Block makeBlock(List<ast.Node> statements) {
+    return new ast.Block(new ast.NodeList(
+        openBrace, new Link<ast.Node>.fromList(statements), closeBrace));
   }
 
   static ast.SendSet makeAssignment(ast.Identifier identifier,
@@ -314,25 +439,109 @@
         new ast.NodeList.singleton(expression));
   }
 
+  /**
+   * Translate the body of a function to an AST FunctionExpression.
+   */
+  ast.FunctionExpression emit(FunctionElement element,
+                              dart2js.TreeElementMapping treeElements,
+                              Expression expr) {
+    // Reset the variable index.  This function is not reentrant.
+    Variable.counter = 0;
+    this.treeElements = treeElements;
+    ast.Identifier name = makeIdentifier(element.name);
+
+    TypeEmitter typeEmitter = new TypeEmitter();
+    FunctionSignature signature = element.functionSignature;
+    ast.TypeAnnotation returnType;
+    if (!signature.type.returnType.isDynamic) {
+      returnType =
+          signature.type.returnType.accept(typeEmitter, treeElements);
+    }
+
+    List<ast.VariableDefinitions> parameterList = <ast.VariableDefinitions>[];
+    signature.orderedForEachParameter((parameter) {
+      ast.TypeAnnotation type;
+      if (!parameter.type.isDynamic) {
+        type = parameter.type.accept(typeEmitter, treeElements);
+      }
+      parameterList.add(new ast.VariableDefinitions(
+          type,
+          ast.Modifiers.EMPTY,
+          new ast.NodeList.singleton(makeIdentifier(parameter.name))));
+    });
+    ast.NodeList parameters =
+        new ast.NodeList(openParen,
+                         new Link<ast.Node>.fromList(parameterList),
+                         closeParen,
+                         ',');
+
+    ast.Node body = expr.accept(this);
+
+    if (!variables.isEmpty) {
+      // Introduce hoisted definitions for all variables.
+      ast.Identifier modifier =
+          new ast.Identifier(new KeywordToken(Keyword.keywords['var'], -1));
+      ast.VariableDefinitions definitions = new ast.VariableDefinitions(
+          null,
+          new ast.Modifiers(new ast.NodeList(
+              null,
+              new Link<ast.Node>.fromList([modifier]),
+              null,
+              ' ')),
+          new ast.NodeList(
+              null,
+              new Link<ast.Node>.fromList(variables),
+              semicolon,
+              ','));
+      body = concatenate(definitions, body);
+    }
+
+    if (body is ast.Return) {
+      // Use a short form for bodies that are a single return.
+      ast.Expression value = (body as ast.Return).expression;
+      if (value is ast.LiteralNull) {
+        // '{ return null; }' is '{}'.
+        body = makeBlock([]);
+      } else {
+        // '{ return e; }' is '=> e;'.
+        body = new ast.Return(new SymbolToken(FUNCTION_INFO, -1),
+                              semicolon,
+                              value);
+      }
+    } else if (body is ast.Block) {
+      // Remove a final 'return null' that ends the body block.
+      Link<ast.Node> nodes = (body as ast.Block).statements.nodes;
+      ast.Node last;
+      for (var n in nodes) {
+        last = n;
+      }
+      if (last is ast.Return
+          && (last as ast.Return).expression is ast.LiteralNull) {
+        List<ast.Node> statements =
+            (body as ast.Block).statements.nodes.toList();
+        statements.removeLast();
+        body = makeBlock(statements);
+      }
+    }
+
+    return new ast.FunctionExpression(name, parameters, body, returnType,
+        ast.Modifiers.EMPTY, null, null);
+  }
 
   /**
    * Translate a list of arguments to an AST NodeList.
    */
-  ast.NodeList makeArgumentList(List<Expression> args) {
+  ast.NodeList translateArguments(List<Expression> args) {
     List<ast.Expression> arguments =
         args.map((e) => e.accept(this)).toList(growable: false);
-    return new ast.NodeList(
-        new BeginGroupToken(OPEN_PAREN_INFO, -1),
-        new Link.fromList(arguments),
-        new SymbolToken(CLOSE_PAREN_INFO, -1),
-        ',');
+    return makeArgumentList(arguments);
   }
 
   /**
    * Concatenate a pair of AST expressions or statements into a single Block
    * statement.
    */
-  static ast.Node concatenate(ast.Node first, ast.Node second) {
+  ast.Node concatenate(ast.Node first, ast.Node second) {
     // This is a convenient but very inefficient way to accumulate statements.
     // The Block and NodeList nodes are not mutable so we can't simply use a
     // Block or NodeList as an accumulator.  Using a List<Node> requires
@@ -340,36 +549,25 @@
     // distinction.
     // TODO(kmillikin): If we don't get rid of this Emitter, use a more
     // efficient way to accumulate nodes.
-    Link<ast.Node> statements;
-    if (second is ast.Block) {
-      statements = second.statements.nodes;
-    } else {
-      statements = new Link<ast.Node>();
-      if (second is ast.Expression) {
-        second = new ast.ExpressionStatement(second,
-            new SymbolToken(SEMICOLON_INFO, -1));
+    LinkBuilder<ast.Node> statements = new LinkBuilder<ast.Node>();
+
+    addStatements(ast.Node node) {
+      if (node is ast.Block) {
+        for (var n in node.statements.nodes) {
+          statements.addLast(n);
+        }
+      } else if (node is ast.Expression) {
+          statements.addLast(new ast.ExpressionStatement(node, semicolon));
+      } else {
+        statements.addLast(node);
       }
-      statements = statements.prepend(second);
     }
 
-    if (first is ast.Block) {
-      LinkBuilder<ast.Node> front = new LinkBuilder<ast.Node>();
-      for (var n in first.statements.nodes) {
-        front.addLast(n);
-      }
-      statements = front.toLink(statements);
-    } else {
-      if (first is ast.Expression) {
-        first = new ast.ExpressionStatement(first,
-            new SymbolToken(SEMICOLON_INFO, -1));
-      }
-      statements = statements.prepend(first);
-    }
+    addStatements(first);
+    addStatements(second);
 
-    return new ast.Block(new ast.NodeList(
-        new BeginGroupToken(OPEN_CURLY_BRACKET_INFO, -1),
-        statements,
-        new SymbolToken(CLOSE_CURLY_BRACKET_INFO, -1)));
+    return new ast.Block(
+        new ast.NodeList(openBrace, statements.toLink(), closeBrace));
   }
 
   ast.Node visitVariable(Variable node) {
@@ -379,6 +577,10 @@
     return new ast.Send(null, node.identifier);
   }
 
+  ast.Node visitSequence(Sequence node) {
+    return node.expressions.map((e) => e.accept(this)).reduce(concatenate);
+  }
+
   ast.Node visitLetVal(LetVal node) {
     // Let bindings translate into assignments.
     ast.Identifier identifier = node.variable.assignIdentifier();
@@ -392,10 +594,9 @@
   }
 
   ast.Node visitInvokeStatic(InvokeStatic node) {
-    ast.Identifier name = new ast.Identifier(
-        new StringToken.fromString(IDENTIFIER_INFO, node.target.name, -1));
+    ast.Identifier name = makeIdentifier(node.target.name);
     ast.Send send =
-        new ast.Send(null, name, makeArgumentList(node.arguments));
+        new ast.Send(null, name, translateArguments(node.arguments));
     treeElements[send] = node.target;
     return send;
   }
@@ -404,7 +605,7 @@
     ast.Expression expression = node.value.accept(this);
     return new ast.Return(
         new KeywordToken(Keyword.keywords['return'], -1),
-        new SymbolToken(SEMICOLON_INFO, -1),
+        semicolon,
         expression);
   }
 
@@ -413,6 +614,53 @@
   }
 }
 
+class TypeEmitter extends
+    DartTypeVisitor<ast.TypeAnnotation, dart2js.TreeElementMapping> {
+
+  // Supported types are verified at IR construction time.  The unimplemented
+  // emit methods should be unreachable.
+  ast.TypeAnnotation unimplemented() => throw new UnimplementedError();
+
+  ast.TypeAnnotation makeSimpleAnnotation(
+      DartType type,
+      dart2js.TreeElementMapping treeElements) {
+    ast.TypeAnnotation annotation =
+        new ast.TypeAnnotation(Emitter.makeIdentifier(type.toString()), null);
+    treeElements.setType(annotation, type);
+    return annotation;
+  }
+
+  ast.TypeAnnotation visitType(DartType type,
+                               dart2js.TreeElementMapping treeElements) {
+    return unimplemented();
+  }
+
+  ast.TypeAnnotation visitVoidType(VoidType type,
+                                   dart2js.TreeElementMapping treeElements) {
+    return makeSimpleAnnotation(type, treeElements);
+  }
+
+  ast.TypeAnnotation visitInterfaceType(
+      InterfaceType type,
+      dart2js.TreeElementMapping treeElements) {
+    assert(!type.isGeneric);
+    return makeSimpleAnnotation(type, treeElements);
+  }
+
+  ast.TypeAnnotation visitTypedefType(
+      TypedefType type,
+      dart2js.TreeElementMapping treeElements) {
+    assert(!type.isGeneric);
+    return makeSimpleAnnotation(type, treeElements);
+  }
+
+  ast.TypeAnnotation visitDynamicType(
+      DynamicType type,
+      dart2js.TreeElementMapping treeElements) {
+    return unimplemented();
+  }
+}
+
 class ConstantEmitter extends dart2js.ConstantVisitor<ast.Expression> {
   ast.Expression unimplemented() => throw new UnimplementedError();
 
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index 298c720..294fb34 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -5,6 +5,7 @@
 library deferred_load;
 
 import 'dart2jslib.dart' show
+    Backend,
     Compiler,
     CompilerTask,
     Constant,
@@ -150,6 +151,8 @@
 
   DeferredLoadTask(Compiler compiler) : super(compiler);
 
+  Backend get backend => compiler.backend;
+
   /// Returns the [OutputUnit] where [element] belongs.
   OutputUnit outputUnitForElement(Element element) {
     if (!splitProgram) return mainOutputUnit;
@@ -292,7 +295,11 @@
       if (dependency.isStatement()) continue;
       elementDependencies.add(dependency);
     }
-    constantDependencies.addAll(elements.allConstants);
+    elements.forEachConstantNode((Node n, _) {
+      // Explicitly depend on the backend constants.
+      constantDependencies.add(
+          backend.constants.getConstantForNode(n, elements));
+    });
     elementDependencies.addAll(elements.otherDependencies);
   }
 
@@ -303,11 +310,12 @@
   void _collectAllElementsAndConstantsResolvedFrom(Element element,
       Set<Element> elements,
       Set<Constant> constants) {
-    element = element.implementation;
+    // TODO(sigurdm): How is metadata on a patch-class handled?
     for (MetadataAnnotation metadata in element.metadata) {
-      if (metadata.value != null) {
-        constants.add(metadata.value);
-        elements.add(metadata.value.computeType(compiler).element);
+      Constant constant = backend.constants.getConstantForMetadata(metadata);
+      if (constant != null) {
+        constants.add(constant);
+        elements.add(constant.computeType(compiler).element);
       }
     }
     if (element.isClass()) {
@@ -419,15 +427,19 @@
         // TODO(sigurdm): The metadata should go to the right output unit.
         // For now they all go to the main output unit.
         for (MetadataAnnotation metadata in library.metadata) {
-          if (metadata.value != null) {
-            _mapDependencies(metadata.value.computeType(compiler).element,
+          Constant constant =
+              backend.constants.getConstantForMetadata(metadata);
+          if (constant != null) {
+            _mapDependencies(constant.computeType(compiler).element,
                 _fakeMainImport);
           }
         }
         for (LibraryTag tag in library.tags) {
           for (MetadataAnnotation metadata in tag.metadata) {
-            if (metadata.value != null) {
-              _mapDependencies(metadata.value.computeType(compiler).element,
+            Constant constant =
+                backend.constants.getConstantForMetadata(metadata);
+            if (constant != null) {
+              _mapDependencies(constant.computeType(compiler).element,
                   _fakeMainImport);
             }
           }
@@ -442,10 +454,26 @@
           // things to the output units for the library.
           List<MirrorUsage> mirrorUsages = mirrorsResult[library];
           if (mirrorUsages == null) continue;
+
+          void mapDependenciesIfResolved(Element element) {
+            // If there is a target for this class, but no use of mirrors the
+            // class will not be resolved. We just skip it.
+            if (element is ClassElement &&
+                !(element as ClassElement).isResolved) {
+              return;
+            }
+            _mapDependencies(element, deferredImport);
+          }
+
           for (MirrorUsage usage in mirrorUsages) {
             if (usage.targets != null) {
               for (Element dependency in usage.targets) {
-                _mapDependencies(dependency, deferredImport);
+                if (dependency.isLibrary()) {
+                  LibraryElement library = dependency;
+                  library.forEachLocalMember(mapDependenciesIfResolved);
+                } else {
+                  mapDependenciesIfResolved(dependency);
+                }
               }
             }
             if (usage.metaTargets != null) {
@@ -484,10 +512,14 @@
             }
           }
           if (usesMirrors) {
-            for (Link link in compiler.enqueuer.allElementsByName.values) {
-              for (Element dependency in link) {
-                _mapDependencies(dependency, deferredImport);
-              }
+            // Add all resolved elements to the output unit.
+            for (Element element in
+                compiler.enqueuer.resolution.resolvedElements.keys) {
+              _mapDependencies(element, deferredImport);
+            }
+            for (Element element in
+                compiler.mirrorDependencies.otherDependencies) {
+              _mapDependencies(element, deferredImport);
             }
           }
         }
@@ -576,8 +608,7 @@
         for (MetadataAnnotation metadata in metadatas) {
           metadata.ensureResolved(compiler);
           Element element = metadata.value.computeType(compiler).element;
-          if (metadata.value.computeType(compiler).element ==
-              deferredLibraryClass) {
+          if (element == deferredLibraryClass) {
             ConstructedConstant constant = metadata.value;
             StringConstant s = constant.fields[0];
             result = s.value.slowToString();
@@ -746,7 +777,7 @@
         }
       });
     }
-    if (splitProgram && compiler.backend is DartBackend) {
+    if (splitProgram && backend is DartBackend) {
       // TODO(sigurdm): Implement deferred loading for dart2dart.
       splitProgram = false;
       compiler.reportInfo(
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index d9bc5d6..d3dd030 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -761,8 +761,6 @@
   FunctionSignature get functionSignature;
   Link<DartType> get typeVariables;
 
-  bool get isResolved;
-
   // TODO(kasperl): Try to get rid of these setters.
   void set alias(DartType value);
   void set functionSignature(FunctionSignature value);
@@ -872,6 +870,8 @@
    * [computeType].
    */
   Link<DartType> get typeVariables;
+
+  bool get isResolved;
 }
 
 abstract class ClassElement extends TypeDeclarationElement
@@ -901,7 +901,6 @@
 
   int get supertypeLoadState;
   int get resolutionState;
-  bool get isResolved;
   String get nativeTagInfo;
 
   bool get isMixinApplication;
@@ -1041,6 +1040,7 @@
 }
 
 abstract class MetadataAnnotation implements Spannable {
+  /// The front-end constant of this metadata annotation.
   Constant get value;
   Element get annotatedElement;
   int get resolutionState;
@@ -1049,7 +1049,6 @@
 
   // TODO(kasperl): Try to get rid of these.
   void set annotatedElement(Element value);
-  void set resolutionState(int value);
 
   MetadataAnnotation ensureResolved(Compiler compiler);
 }
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index 47150a0..9e69584 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -365,7 +365,7 @@
     task.ensureAllElementsByName();
     for (Link link in task.allElementsByName.values) {
       for (Element element in link) {
-        pretendElementWasUsed(element, compiler.globalDependencies);
+        pretendElementWasUsed(element, compiler.mirrorDependencies);
       }
     }
     hasEnqueuedEverything = true;
@@ -378,7 +378,7 @@
     if (hasEnqueuedReflectiveStaticFields) return;
     hasEnqueuedReflectiveStaticFields = true;
     for (Element element in elements) {
-      pretendElementWasUsed(element, compiler.globalDependencies);
+      pretendElementWasUsed(element, compiler.mirrorDependencies);
     }
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/helpers/debug_collection.dart b/sdk/lib/_internal/compiler/implementation/helpers/debug_collection.dart
new file mode 100644
index 0000000..017e8de
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/helpers/debug_collection.dart
@@ -0,0 +1,67 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart2js.helpers;
+
+typedef void DebugCallback(String methodName, var arg1, var arg2);
+
+class DebugMap<K, V> implements Map<K, V> {
+  final Map<K, V> map;
+  DebugCallback indexSetCallBack;
+  DebugCallback putIfAbsentCallBack;
+
+  DebugMap(this.map, {DebugCallback addCallback}) {
+    if (addCallback != null) {
+      this.addCallback = addCallback;
+    }
+  }
+
+  void set addCallback(DebugCallback value) {
+    indexSetCallBack = value;
+    putIfAbsentCallBack = value;
+  }
+
+  bool containsValue(Object value) {
+    return map.containsValue(value);
+  }
+
+  bool containsKey(Object key) => map.containsKey(key);
+
+  V operator [](Object key) => map[key];
+
+  void operator []=(K key, V value) {
+    if (indexSetCallBack != null) {
+      indexSetCallBack('[]=', key, value);
+    }
+    map[key] = value;
+  }
+
+  V putIfAbsent(K key, V ifAbsent()) {
+    return map.putIfAbsent(key, () {
+      V v = ifAbsent();
+      if (putIfAbsentCallBack != null) {
+        putIfAbsentCallBack('putIfAbsent', key, v);
+      }
+      return v;
+    });
+  }
+
+  void addAll(Map<K, V> other) => map.addAll(other);
+
+  V remove(Object key) => map.remove(key);
+
+  void clear() => map.clear();
+
+  void forEach(void f(K key, V value)) => map.forEach(f);
+
+  Iterable<K> get keys => map.keys;
+
+  Iterable<V> get values => map.values;
+
+  int get length => map.length;
+
+  bool get isEmpty => map.isEmpty;
+
+  bool get isNotEmpty => map.isNotEmpty;
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/util/expensive_map.dart b/sdk/lib/_internal/compiler/implementation/helpers/expensive_map.dart
similarity index 98%
rename from sdk/lib/_internal/compiler/implementation/util/expensive_map.dart
rename to sdk/lib/_internal/compiler/implementation/helpers/expensive_map.dart
index d9c7659..1a6e5e8 100644
--- a/sdk/lib/_internal/compiler/implementation/util/expensive_map.dart
+++ b/sdk/lib/_internal/compiler/implementation/helpers/expensive_map.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of dart2js.util;
+part of dart2js.helpers;
 
 /**
  * The expensive map is a data structure useful for tracking down
diff --git a/sdk/lib/_internal/compiler/implementation/util/expensive_set.dart b/sdk/lib/_internal/compiler/implementation/helpers/expensive_set.dart
similarity index 98%
rename from sdk/lib/_internal/compiler/implementation/util/expensive_set.dart
rename to sdk/lib/_internal/compiler/implementation/helpers/expensive_set.dart
index 2daa9c9..61bad61 100644
--- a/sdk/lib/_internal/compiler/implementation/util/expensive_set.dart
+++ b/sdk/lib/_internal/compiler/implementation/helpers/expensive_set.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of dart2js.util;
+part of dart2js.helpers;
 
 /**
  * The expensive set is a data structure useful for tracking down
diff --git a/sdk/lib/_internal/compiler/implementation/helpers/helpers.dart b/sdk/lib/_internal/compiler/implementation/helpers/helpers.dart
new file mode 100644
index 0000000..a126630
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/helpers/helpers.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Library for debugging helpers. The unittest analyze_unused_test checks that
+/// the helper are not used in production code.
+
+library dart2js.helpers;
+
+import "dart:collection";
+import '../dart2jslib.dart';
+import '../util/util.dart';
+
+part 'debug_collection.dart';
+part 'trace.dart';
+part 'expensive_map.dart';
+part 'expensive_set.dart';
+
+/// Print [s].
+debugPrint(s) => print(s);
+
+/// Print a message with a source location.
+reportHere(Compiler compiler, Spannable node, String debugMessage) {
+  compiler.reportInfo(node,
+      MessageKind.GENERIC, {'text': 'HERE: $debugMessage'});
+}
diff --git a/sdk/lib/_internal/compiler/implementation/helpers/trace.dart b/sdk/lib/_internal/compiler/implementation/helpers/trace.dart
new file mode 100644
index 0000000..8fcb63b
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/helpers/trace.dart
@@ -0,0 +1,187 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart2js.helpers;
+
+/**
+ * Helper method for printing stack traces for debugging.
+ *
+ * [message] is printed as the header of the stack trace.
+ *
+ * If [condition] is provided, the stack trace is only printed if [condition]
+ * returns [:true:] on the stack trace text. This can be used to filter the
+ * printed stack traces based on their content. For instance only print stack
+ * traces that contain specific paths.
+ */
+void trace(String message, [bool condition(String stackTrace)]) {
+  try {
+    throw '';
+  } catch (e, s) {
+    String stackTrace = prettifyStackTrace(
+        s, rangeStart: 1, filePrefix: stackTraceFilePrefix);
+    if (condition != null) {
+      if (!condition(stackTrace)) return;
+    }
+    print('$message\n$stackTrace');
+  }
+}
+
+void traceAndReport(Compiler compiler, Spannable node,
+                    String message, [bool condition(String stackTrace)]) {
+
+  trace(message, (String stackTrace) {
+    bool result = condition != null ? condition(stackTrace) : true;
+    if (result) {
+      reportHere(compiler, node, message);
+    }
+    return result;
+  });
+}
+
+/// Helper class for the processing of stack traces in [prettifyStackTrace].
+class _StackTraceLine {
+  final int index;
+  final String file;
+  final String lineNo;
+  final String columnNo;
+  final String method;
+
+  _StackTraceLine(this.index, this.file, this.lineNo,
+                  this.columnNo, this.method);
+
+  String toString() {
+    return 'index=$index, file=$file, '
+           'lineNo=$lineNo, columnNo=$columnNo, method=$method';
+  }
+}
+
+// TODO(johnniwinther): Use this format for --throw-on-error.
+/**
+ * Converts the normal VM stack trace into a more compact and readable format.
+ *
+ * The output format is [: <file> . . . <lineNo>:<columnNo> <method> :] where
+ * [: <file> :] is file name, [: <lineNo> :] is the line number,
+ * [: <columnNo> :] is the column number, and [: <method> :] is the method name.
+ *
+ * If [rangeStart] and/or [rangeEnd] are provided, only the lines within the
+ * range are included.
+ * If [showColumnNo] is [:false:], the [: :<columnNo> :] part is omitted.
+ * If [showDots] is [:true:], the space between [: <file> :] and [: <lineNo> :]
+ * is padded with dots on every other line.
+ * If [filePrefix] is provided, then for  every file name thats starts with
+ * [filePrefix] only the remainder is printed.
+ * If [lambda] is non-null, anonymous closures are printed as [lambda].
+ */
+String prettifyStackTrace(StackTrace s,
+                          {int rangeStart,
+                           int rangeEnd,
+                           bool showColumnNo: false,
+                           bool showDots: true,
+                           String filePrefix,
+                           String lambda: r'?'}) {
+  int index = -1;
+  int maxFileLength = 0;
+  int maxLineNoLength = 0;
+  int maxColumnNoLength = 0;
+
+  String stackTrace = '$s';
+  List<_StackTraceLine> lines = <_StackTraceLine>[];
+  for (String line in stackTrace.split('\n')) {
+    try {
+      index++;
+      if (rangeStart != null && index < rangeStart) continue;
+      if (rangeEnd != null && index > rangeEnd) continue;
+      if (line.isEmpty) continue;
+
+      // Strip index.
+      line = line.replaceFirst(new RegExp(r'#\d+\s*'), '');
+
+      int leftParenPos = line.indexOf('(');
+      int rightParenPos = line.indexOf(')', leftParenPos);
+      int lastColon = line.lastIndexOf(':', rightParenPos);
+      int nextToLastColon = line.lastIndexOf(':', lastColon-1);
+
+      String lineNo;
+      String columnNo;
+      if (nextToLastColon != -1) {
+        lineNo = line.substring(nextToLastColon+1, lastColon);
+        columnNo = line.substring(lastColon+1, rightParenPos);
+        try {
+          int.parse(lineNo);
+        } on FormatException catch (e) {
+          lineNo = columnNo;
+          columnNo = '';
+          nextToLastColon = lastColon;
+        }
+      } else {
+        lineNo = line.substring(lastColon+1, rightParenPos);
+        columnNo = '';
+        nextToLastColon = lastColon;
+      }
+
+      if (lineNo.length > maxLineNoLength) {
+        maxLineNoLength = lineNo.length;
+      }
+      if (columnNo.length > maxColumnNoLength) {
+        maxColumnNoLength = columnNo.length;
+      }
+
+      String file = line.substring(leftParenPos+1, nextToLastColon);
+      if (filePrefix != null && file.startsWith(filePrefix)) {
+        file = file.substring(filePrefix.length);
+      }
+      if (file.length > maxFileLength) {
+        maxFileLength = file.length;
+      }
+      String method = line.substring(0, leftParenPos-1);
+      if (lambda != null) {
+        method = method.replaceAll('<anonymous closure>', lambda);
+      }
+      lines.add(new _StackTraceLine(index, file, lineNo, columnNo, method));
+    } catch (e) {
+      print('Error prettifying "$line": $e');
+      return stackTrace;
+    }
+  }
+
+  StringBuffer sb = new StringBuffer();
+  bool dots = true;
+  for (_StackTraceLine line in lines) {
+    String file = pad('${line.file} ', maxFileLength,
+                      dots: showDots && dots ? ' .' : ' ');
+    String lineNo = pad(line.lineNo, maxLineNoLength, padLeft: true);
+    String columnNo =
+        showColumnNo ? ':${pad(line.columnNo, maxColumnNoLength)}' : '';
+    String method = line.method;
+    sb.write('  $file $lineNo$columnNo $method\n');
+    dots = !dots;
+  }
+  return sb.toString();
+}
+
+/**
+ * Pads (or truncates) [text] to the [intendedLength].
+ *
+ * If [padLeft] is [:true:] the text is padding inserted to the left of [text].
+ * A repetition of the [dots] text is used for padding.
+ */
+String pad(String text, int intendedLength,
+           {bool padLeft: false, String dots: ' '}) {
+  if (text.length == intendedLength) return text;
+  if (text.length > intendedLength) return text.substring(0, intendedLength);
+  if (dots == null || dots.isEmpty) dots = ' ';
+  int dotsLength = dots.length;
+  StringBuffer sb = new StringBuffer();
+  if (!padLeft) {
+    sb.write(text);
+  }
+  for (int index = text.length ; index < intendedLength ; index ++) {
+    int dotsIndex = index % dotsLength;
+    sb.write(dots.substring(dotsIndex, dotsIndex + 1));
+  }
+  if (padLeft) {
+    sb.write(text);
+  }
+  return sb.toString();
+}
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart
index 73a81dc..b1ba510 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/node_tracer.dart
@@ -60,7 +60,10 @@
     'length',
     'clear',
     'containsKey',
-    'containsValue'
+    'containsValue',
+    '[]=',
+    // [keys] only allows key values to escape, which we do not track.
+    'keys'
   ]);
 
 abstract class TracerVisitor implements TypeInformationVisitor {
@@ -145,7 +148,8 @@
   }
 
   void visitKeyInMapTypeInformation(KeyInMapTypeInformation info) {
-    addNewEscapeInformation(info);
+    // We do not track the use of keys from a map, so we have to bail.
+    bailout('Used as key in Map');
   }
 
   void visitValueInMapTypeInformation(ValueInMapTypeInformation info) {
@@ -213,6 +217,11 @@
     }
   }
 
+  /**
+   * Checks whether this is a call to a list adding method. The definition
+   * of what list adding means has to stay in sync with
+   * [isParameterOfListAddingMethod].
+   */
   bool isAddedToContainer(DynamicCallSiteTypeInformation info) {
     if (info.arguments == null) return false;
     var receiverType = info.receiver.type;
@@ -224,13 +233,33 @@
         || (selectorName == 'add' && currentUser == arguments[0]);
   }
 
-  bool isValueAddedToMap(DynamicCallSiteTypeInformation info) {
+  bool isIndexSetOnMap(DynamicCallSiteTypeInformation info) {
     if (info.arguments == null) return false;
     var receiverType = info.receiver.type;
     if (!receiverType.isMap) return false;
     String selectorName = info.selector.name;
     List<TypeInformation> arguments = info.arguments.positional;
-    return selectorName == '[]=' && currentUser == arguments[1];
+    return selectorName == '[]=';
+  }
+
+  /**
+   * Checks whether this is a call to a map adding method for values. The
+   * definition of map adding method has to stay in sync with
+   * [isParameterOfMapAddingMethod].
+   */
+  bool isValueAddedToMap(DynamicCallSiteTypeInformation info) {
+     return isIndexSetOnMap(info) &&
+         currentUser == info.arguments.positional[1];
+  }
+
+  /**
+   * Checks whether this is a call to a map adding method for keys. The
+   * definition of map adding method has to stay in sync with
+   * [isParameterOfMapAddingMethod].
+   */
+  bool isKeyAddedToMap(DynamicCallSiteTypeInformation info) {
+    return isIndexSetOnMap(info) &&
+        currentUser == info.arguments.positional[0];
   }
 
   void visitDynamicCallSiteTypeInformation(
@@ -259,6 +288,9 @@
         // [ContainerTypeMask] above.
         bailout('Stored in too many maps');
       }
+    } else if (isKeyAddedToMap(info)) {
+      // We do not track the use of keys from a map, so we have to bail.
+      bailout('Used as key in Map');
     }
 
     Iterable<Element> inferredTargetTypes = info.targets.map((element) {
@@ -269,6 +301,11 @@
     }
   }
 
+  /**
+   * Check whether element is the parameter of a list adding method.
+   * The definition of what a list adding method is has to stay in sync with
+   * [isAddedToContainer].
+   */
   bool isParameterOfListAddingMethod(Element element) {
     if (!element.isParameter()) return false;
     if (element.getEnclosingClass() != compiler.backend.listImplementation) {
@@ -280,6 +317,20 @@
         || (method.name == 'insert');
   }
 
+  /**
+   * Check whether element is the parameter of a list adding method.
+   * The definition of what a list adding method is has to stay in sync with
+   * [isValueAddedToMap] and [isKeyAddedToMap].
+   */
+  bool isParameterOfMapAddingMethod(Element element) {
+    if (!element.isParameter()) return false;
+    if (element.getEnclosingClass() != compiler.backend.mapImplementation) {
+      return false;
+    }
+    Element method = element.enclosingElement;
+    return (method.name == '[]=');
+  }
+
   bool isClosure(Element element) {
     if (!element.isFunction()) return false;
     Element outermost = element.getOutermostEnclosingMemberOrTopLevel();
@@ -301,7 +352,8 @@
     if (compiler.backend.isNeededForReflection(info.element)) {
       bailout('Escape in reflection');
     }
-    if (isParameterOfListAddingMethod(info.element)) {
+    if (isParameterOfListAddingMethod(info.element) ||
+        isParameterOfMapAddingMethod(info.element)) {
       // These elements are being handled in
       // [visitDynamicCallSiteTypeInformation].
       return;
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
index 0cae963..ca1ef9a 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
@@ -946,7 +946,7 @@
                && Elements.isStaticOrTopLevelField(element)
                && compiler.world.fieldNeverChanges(element)) {
       var constant =
-          compiler.constantHandler.getConstantForVariable(element);
+          compiler.backend.constants.getConstantForVariable(element);
       if (constant != null && constant.isInt) {
         return constant.value;
       }
@@ -1027,7 +1027,8 @@
                || name == 'JS_NULL_CLASS_NAME'
                || name == 'JS_OBJECT_CLASS_NAME'
                || name == 'JS_OPERATOR_IS_PREFIX'
-               || name == 'JS_OPERATOR_AS_PREFIX') {
+               || name == 'JS_OPERATOR_AS_PREFIX'
+               || name == 'JS_STRING_CONCAT') {
       return types.stringType;
     } else {
       sideEffects.setAllSideEffects();
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
index cfe1661..ae3bf16 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -643,8 +643,8 @@
           if (type is! ListTypeInformation) {
             // For non-container types, the constant handler does
             // constant folding that could give more precise results.
-            Constant value =
-                compiler.constantHandler.getConstantForVariable(element);
+            Constant value = compiler.backend.constants
+                .getConstantForVariable(element);
             if (value != null) {
               if (value.isFunction) {
                 FunctionConstant functionConstant = value;
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
index 2c45b4a..a7e9501 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
@@ -1102,18 +1102,11 @@
   }
 
   TypeMask toTypeMask(TypeGraphInferrerEngine inferrer) {
-    Map<String, TypeMask> mappings;
     if (isDictionary) {
-      mappings = new Map<String, TypeMask>();
+      Map<String, TypeMask> mappings = new Map<String, TypeMask>();
       for (var key in typeInfoMap.keys) {
-        // We strip out entries that contain no information
-        if (!typeInfoMap[key].type.containsAll(inferrer.compiler) ||
-            !typeInfoMap[key].type.isNullable) {
-          mappings[key] = typeInfoMap[key].type;
-        }
+        mappings[key] = typeInfoMap[key].type;
       }
-    }
-    if (mappings != null && !mappings.isEmpty) {
       return new DictionaryTypeMask(initialType.forwardTo,
                                     initialType.allocationNode,
                                     initialType.allocationElement,
@@ -1130,9 +1123,9 @@
   }
 
   TypeMask refine(TypeGraphInferrerEngine inferrer) {
-    if (type.isDictionary != isDictionary) {
+    if (!bailedOut && type.isDictionary != isDictionary) {
       return toTypeMask(inferrer);
-    } else if (type.isDictionary) {
+    } else if (!bailedOut && type.isDictionary) {
       DictionaryTypeMask mask = type;
       for (var key in typeInfoMap.keys) {
         TypeInformation value = typeInfoMap[key];
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index 95c519b..fe1da9a 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -7,6 +7,7 @@
 import 'ir_nodes.dart' as ir;
 import '../elements/elements.dart';
 import '../dart2jslib.dart';
+import '../dart_types.dart';
 import '../source_file.dart';
 import '../tree/tree.dart' as ast;
 import '../scanner/scannerlib.dart' show Token;
@@ -93,7 +94,7 @@
         compiler.enableConcreteTypeInference) {
       return false;
     }
-    return const bool.fromEnvironment('enable_ir', defaultValue: false);
+    return const bool.fromEnvironment('enable_ir', defaultValue: true);
   }
 
   bool canBuild(Element element) {
@@ -101,13 +102,18 @@
     FunctionElement function = element.asFunctionElement();
     if (function == null) return false;
 
-    // TODO(lry): support functions with parameters.
+    // TODO(kmillikin): support functions with optional parameters.
     FunctionSignature signature = function.functionSignature;
-    if (signature.parameterCount > 0) return false;
+    if (signature.optionalParameterCount > 0) return false;
 
-    // TODO(kmillikin): support return types.  With the current Dart Tree
-    // emitter they require constructing an AST and tokens from a type element.
-    if (!signature.type.returnType.isDynamic) return false;
+    SupportedTypeVerifier typeVerifier = new SupportedTypeVerifier();
+    if (!signature.type.returnType.accept(typeVerifier, null)) return false;
+    bool parameters_ok = true;
+    signature.forEachParameter((parameter) {
+      parameters_ok =
+          parameters_ok && parameter.type.accept(typeVerifier, null);
+    });
+    if (!parameters_ok) return false;
 
     // TODO(kmillikin): support getters and setters and static class members.
     // With the current Dart Tree emitter they just require recognizing them
@@ -230,11 +236,14 @@
     current = null;
   }
 
+  // Build(EmptyStatement, C) = C
   ir.Definition visitEmptyStatement(ast.EmptyStatement node) {
     assert(isOpen);
     return null;
   }
 
+  // Build(Block(stamements), C) = C'
+  //   where C' = statements.fold(Build, C)
   ir.Definition visitBlock(ast.Block node) {
     assert(isOpen);
     for (var n in node.statements.nodes) {
@@ -244,9 +253,18 @@
     return null;
   }
 
-  // Build(Return)    = let val x = null in InvokeContinuation(return, x)
-  // Build(Return(e)) = C[InvokeContinuation(return, x)]
-  //   where (C, x) = Build(e)
+  // Build(ExpressionStatement(e), C) = C'
+  //   where (C', _) = Build(e, C)
+  ir.Definition visitExpressionStatement(ast.ExpressionStatement node) {
+    assert(isOpen);
+    node.expression.accept(this);
+    return null;
+  }
+
+  // Build(Return(e), C) = C'[InvokeContinuation(return, x)]
+  //   where (C', x) = Build(e, C)
+  //
+  // Return without a subexpression is translated as if it were return null.
   ir.Definition visitReturn(ast.Return node) {
     assert(isOpen);
     // TODO(lry): support native returns.
@@ -265,7 +283,7 @@
   }
 
   // For all simple literals:
-  // Build(Literal(c)) = (let val x = Constant(c) in [], x)
+  // Build(Literal(c), C) = C[let val x = Constant(c) in [], x]
   ir.Definition visitLiteralBool(ast.LiteralBool node) {
     assert(isOpen);
     ir.Constant constant =
@@ -326,13 +344,15 @@
     return giveup();
   }
 
-  // Build(StaticSend(f, a...)) = C[InvokeStatic(f, x...)]
-  //   where (C, x...) = BuildList(a...)
+  // Build(StaticSend(f, arguments), C) = C[C'[InvokeStatic(f, xs)]]
+  //   where (C', xs) = arguments.fold(Build, C)
   ir.Definition visitStaticSend(ast.Send node) {
     assert(isOpen);
     Element element = elements[node];
     // TODO(lry): support static fields. (separate IR instruction?)
     if (element.isField() || element.isGetter()) return giveup();
+    // TODO(kmillikin): support static setters.
+    if (element.isSetter()) return giveup();
     // TODO(lry): support constructors / factory calls.
     if (element.isConstructor()) return giveup();
     // TODO(lry): support foreign functions.
@@ -396,3 +416,14 @@
     giveup();
   }
 }
+
+// Verify that types are ones that can be reconstructed by the type emitter.
+class SupportedTypeVerifier extends DartTypeVisitor<bool, Null> {
+  bool visitType(DartType type, Null _) => false;
+
+  bool visitVoidType(VoidType type, Null _) => true;
+
+  // Currently, InterfaceType and TypedefType are supported so long as they
+  // do not have type parameters.  They are subclasses of GenericType.
+  bool visitGenericType(GenericType type, Null _) => !type.isGeneric;
+}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
index b0566e3..7235ecd 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
@@ -31,6 +31,7 @@
 
   bool get hasAtMostOneUse => firstRef == null || firstRef.nextRef == null;
   bool get hasExactlyOneUse => firstRef != null && firstRef.nextRef == null;
+  bool get hasAtLeastOneUse => firstRef != null;
 }
 
 abstract class Primitive extends Definition {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index 959cba9..2d0b7f5 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -52,7 +52,6 @@
   }
 }
 
-
 class JavaScriptBackend extends Backend {
   SsaBuilderTask builder;
   SsaOptimizerTask optimizer;
@@ -102,6 +101,8 @@
   ClassElement mapLiteralClass;
   ClassElement constMapLiteralClass;
   ClassElement typeVariableClass;
+  Element mapLiteralConstructor;
+  Element mapLiteralConstructorEmpty;
 
   ClassElement noSideEffectsClass;
   ClassElement noThrowsClass;
@@ -288,19 +289,30 @@
   /// constructors for custom elements.
   CustomElementsAnalysis customElementsAnalysis;
 
+  JavaScriptConstantTask constantCompilerTask;
+
   JavaScriptBackend(Compiler compiler, bool generateSourceMap)
       : namer = determineNamer(compiler),
         oneShotInterceptors = new Map<String, Selector>(),
         interceptedElements = new Map<String, Set<Element>>(),
         rti = new RuntimeTypes(compiler),
         specializedGetInterceptors = new Map<String, Set<ClassElement>>(),
-        super(compiler, JAVA_SCRIPT_CONSTANT_SYSTEM) {
+        super(compiler) {
     emitter = new CodeEmitterTask(compiler, namer, generateSourceMap);
     builder = new SsaBuilderTask(this);
     optimizer = new SsaOptimizerTask(this);
     generator = new SsaCodeGeneratorTask(this);
     typeVariableHandler = new TypeVariableHandler(this);
     customElementsAnalysis = new CustomElementsAnalysis(this);
+    constantCompilerTask = new JavaScriptConstantTask(compiler);
+  }
+
+  ConstantSystem get constantSystem => constants.constantSystem;
+
+  /// Returns constant environment for the JavaScript interpretation of the
+  /// constants.
+  JavaScriptConstantCompiler get constants {
+    return constantCompilerTask.jsConstantCompiler;
   }
 
   static Namer determineNamer(Compiler compiler) {
@@ -728,7 +740,6 @@
         // For map literals, the dependency between the implementation class
         // and [Map] is not visible, so we have to add it manually.
         rti.registerRtiDependency(mapLiteralClass, cls);
-        enqueueInResolution(getMapMaker(), elements);
       } else if (cls == compiler.boundClosureClass) {
         // TODO(ngeoffray): Move the bound closure class in the
         // backend.
@@ -737,6 +748,27 @@
         enqueue(enqueuer, getNativeInterceptorMethod, elements);
         enqueueClass(enqueuer, jsInterceptorClass, compiler.globalDependencies);
         enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, elements);
+      } else if (cls == mapLiteralClass) {
+        // For map literals, the dependency between the implementation class
+        // and [Map] is not visible, so we have to add it manually.
+        Element getFactory(String name, int arity) {
+          // The constructor is on the patch class, but dart2js unit tests don't
+          // have a patch class.
+          ClassElement implementation = cls.patch != null ? cls.patch : cls;
+          return implementation.lookupConstructor(
+            new Selector.callConstructor(
+                name, mapLiteralClass.getLibrary(), arity),
+            (element) {
+              compiler.internalError(mapLiteralClass,
+                  "Map literal class $mapLiteralClass missing "
+                  "'$name' constructor"
+                  "  ${mapLiteralClass.constructors}");
+            });
+        }
+        mapLiteralConstructor = getFactory('_literal', 1);
+        mapLiteralConstructorEmpty = getFactory('_empty', 0);
+        enqueueInResolution(mapLiteralConstructor, elements);
+        enqueueInResolution(mapLiteralConstructorEmpty, elements);
       }
     }
     if (cls == compiler.closureClass) {
@@ -1142,12 +1174,10 @@
       return;
     }
     if (kind.category == ElementCategory.VARIABLE) {
-      Constant initialValue =
-          compiler.constantHandler.getConstantForVariable(element);
+      Constant initialValue = constants.getConstantForVariable(element);
       if (initialValue != null) {
         registerCompileTimeConstant(initialValue, work.resolutionTree);
-        compiler.constantHandler.addCompileTimeConstantForEmission(
-            initialValue);
+        constants.addCompileTimeConstantForEmission(initialValue);
         // We don't need to generate code for static or top-level
         // variables. For instance variables, we may need to generate
         // the checked setter.
@@ -1448,10 +1478,6 @@
     return compiler.findHelper('getTraceFromException');
   }
 
-  Element getMapMaker() {
-    return compiler.findHelper('makeLiteralMap');
-  }
-
   Element getSetRuntimeTypeInfo() {
     return compiler.findHelper('setRuntimeTypeInfo');
   }
@@ -1607,8 +1633,8 @@
     if (mustRetainMetadata && isNeededForReflection(element)) {
       for (MetadataAnnotation metadata in element.metadata) {
         metadata.ensureResolved(compiler);
-        compiler.constantHandler.addCompileTimeConstantForEmission(
-            metadata.value);
+        Constant constant = constants.getConstantForMetadata(metadata);
+        constants.addCompileTimeConstantForEmission(constant);
       }
       return true;
     }
@@ -1834,7 +1860,9 @@
       if (cls == noInlineClass) {
         hasNoInline = true;
         if (VERBOSE_OPTIMIZER_HINTS) {
-          compiler.reportHere(element, "Cannot inline");
+          compiler.reportHint(element,
+              MessageKind.GENERIC,
+              {'text': "Cannot inline"});
         }
         inlineCache.markAsNonInlinable(element);
       } else if (cls == noThrowsClass) {
@@ -1845,13 +1873,17 @@
               " or static functions");
         }
         if (VERBOSE_OPTIMIZER_HINTS) {
-          compiler.reportHere(element, "Cannot throw");
+          compiler.reportHint(element,
+              MessageKind.GENERIC,
+              {'text': "Cannot throw"});
         }
         compiler.world.registerCannotThrow(element);
       } else if (cls == noSideEffectsClass) {
         hasNoSideEffects = true;
         if (VERBOSE_OPTIMIZER_HINTS) {
-          compiler.reportHere(element, "Has no side effects");
+          compiler.reportHint(element,
+              MessageKind.GENERIC,
+              {'text': "Has no side effects"});
         }
         compiler.world.registerSideEffectsFree(element);
       }
@@ -1880,54 +1912,3 @@
 
   const Dependency(this.constant, this.user);
 }
-
-/// Used to copy metadata to the the actual constant handler.
-class ConstantCopier implements ConstantVisitor {
-  final ConstantHandler target;
-
-  ConstantCopier(this.target);
-
-  void copy(/* Constant or List<Constant> */ value) {
-    if (value is Constant) {
-      target.compiledConstants.add(value);
-    } else {
-      target.compiledConstants.addAll(value);
-    }
-  }
-
-  void visitFunction(FunctionConstant constant) => copy(constant);
-
-  void visitNull(NullConstant constant) => copy(constant);
-
-  void visitInt(IntConstant constant) => copy(constant);
-
-  void visitDouble(DoubleConstant constant) => copy(constant);
-
-  void visitTrue(TrueConstant constant) => copy(constant);
-
-  void visitFalse(FalseConstant constant) => copy(constant);
-
-  void visitString(StringConstant constant) => copy(constant);
-
-  void visitType(TypeConstant constant) => copy(constant);
-
-  void visitInterceptor(InterceptorConstant constant) => copy(constant);
-
-  void visitDummy(DummyConstant constant) => copy(constant);
-
-  void visitList(ListConstant constant) {
-    copy(constant.entries);
-    copy(constant);
-  }
-  void visitMap(MapConstant constant) {
-    copy(constant.keys);
-    copy(constant.values);
-    copy(constant.protoValue);
-    copy(constant);
-  }
-
-  void visitConstructed(ConstructedConstant constant) {
-    copy(constant.fields);
-    copy(constant);
-  }
-}
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_handler_javascript.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_handler_javascript.dart
new file mode 100644
index 0000000..dab9bee
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_handler_javascript.dart
@@ -0,0 +1,209 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of js_backend;
+
+/// [ConstantCompilerTask] for compilation of constants for the JavaScript
+/// backend.
+///
+/// Since this task needs to distinguish between frontend and backend constants
+/// the actual compilation of the constants is forwarded to a
+/// [DartConstantCompiler] for the frontend interpretation of the constants and
+/// to a [JavaScriptConstantCompiler] for the backend interpretation.
+class JavaScriptConstantTask extends ConstantCompilerTask {
+  DartConstantCompiler dartConstantCompiler;
+  JavaScriptConstantCompiler jsConstantCompiler;
+
+  JavaScriptConstantTask(Compiler compiler)
+      : this.dartConstantCompiler = new DartConstantCompiler(compiler),
+        this.jsConstantCompiler =
+            new JavaScriptConstantCompiler(compiler),
+        super(compiler);
+
+  String get name => 'ConstantHandler';
+
+  Constant getConstantForVariable(VariableElement element) {
+    return dartConstantCompiler.getConstantForVariable(element);
+  }
+
+  Constant compileConstant(VariableElement element) {
+    return measure(() {
+      Constant result = dartConstantCompiler.compileConstant(element);
+      jsConstantCompiler.compileConstant(element);
+      return result;
+    });
+  }
+
+  void compileVariable(VariableElement element) {
+    measure(() {
+      jsConstantCompiler.compileVariable(element);
+    });
+  }
+
+  Constant compileNode(Node node, TreeElements elements) {
+    return measure(() {
+      Constant result =
+          dartConstantCompiler.compileNode(node, elements);
+      jsConstantCompiler.compileNode(node, elements);
+      return result;
+    });
+  }
+
+  Constant compileMetadata(MetadataAnnotation metadata,
+                           Node node,
+                           TreeElements elements) {
+    return measure(() {
+      Constant constant =
+          dartConstantCompiler.compileMetadata(metadata, node, elements);
+      jsConstantCompiler.compileMetadata(metadata, node, elements);
+      return constant;
+    });
+  }
+}
+
+/**
+ * The [JavaScriptConstantCompiler] is used to keep track of compile-time
+ * constants, initializations of global and static fields, and default values of
+ * optional parameters for the JavaScript interpretation of constants.
+ */
+class JavaScriptConstantCompiler extends ConstantCompilerBase
+    implements BackendConstantEnvironment {
+
+  /** Set of all registered compiled constants. */
+  final Set<Constant> compiledConstants = new Set<Constant>();
+
+  // TODO(johnniwinther): Move this to the backend constant handler.
+  /** Caches the statics where the initial value cannot be eagerly compiled. */
+  final Set<VariableElement> lazyStatics = new Set<VariableElement>();
+
+  // Constants computed for constant expressions.
+  final Map<Node, Constant> nodeConstantMap = new Map<Node, Constant>();
+
+  // Constants computed for metadata.
+  final Map<MetadataAnnotation, Constant> metadataConstantMap =
+      new Map<MetadataAnnotation, Constant>();
+
+  JavaScriptConstantCompiler(Compiler compiler)
+      : super(compiler, JAVA_SCRIPT_CONSTANT_SYSTEM);
+
+  Constant compileVariableWithDefinitions(VariableElement element,
+                                          TreeElements definitions,
+                                          {bool isConst: false}) {
+    if (!isConst && lazyStatics.contains(element)) {
+      return null;
+    }
+    Constant value = super.compileVariableWithDefinitions(
+        element, definitions, isConst: isConst);
+    if (!isConst && value == null) {
+      lazyStatics.add(element);
+    }
+    return value;
+  }
+
+  void addCompileTimeConstantForEmission(Constant constant) {
+    compiledConstants.add(constant);
+  }
+
+  /**
+   * Returns an [Iterable] of static non final fields that need to be
+   * initialized. The fields list must be evaluated in order since they might
+   * depend on each other.
+   */
+  Iterable<VariableElement> getStaticNonFinalFieldsForEmission() {
+    return initialVariableValues.keys.where((element) {
+      return element.kind == ElementKind.FIELD &&
+             !element.isInstanceMember() &&
+             !element.modifiers.isFinal() &&
+             // The const fields are all either emitted elsewhere or inlined.
+             !element.modifiers.isConst();
+    });
+  }
+
+  List<VariableElement> getLazilyInitializedFieldsForEmission() {
+    return new List<VariableElement>.from(lazyStatics);
+  }
+
+  /**
+   * Returns a list of constants topologically sorted so that dependencies
+   * appear before the dependent constant.  [preSortCompare] is a comparator
+   * function that gives the constants a consistent order prior to the
+   * topological sort which gives the constants an ordering that is less
+   * sensitive to perturbations in the source code.
+   */
+  List<Constant> getConstantsForEmission([preSortCompare]) {
+    // We must emit dependencies before their uses.
+    Set<Constant> seenConstants = new Set<Constant>();
+    List<Constant> result = new List<Constant>();
+
+    void addConstant(Constant constant) {
+      if (!seenConstants.contains(constant)) {
+        constant.getDependencies().forEach(addConstant);
+        assert(!seenConstants.contains(constant));
+        result.add(constant);
+        seenConstants.add(constant);
+      }
+    }
+
+    List<Constant> sorted = compiledConstants.toList();
+    if (preSortCompare != null) {
+      sorted.sort(preSortCompare);
+    }
+    sorted.forEach(addConstant);
+    return result;
+  }
+
+  Constant getInitialValueFor(VariableElement element) {
+    Constant initialValue = initialVariableValues[element.declaration];
+    if (initialValue == null) {
+      compiler.internalError(element, "No initial value for given element.");
+    }
+    return initialValue;
+  }
+
+  Constant compileNode(Node node, TreeElements elements) {
+    return compileNodeWithDefinitions(node, elements);
+  }
+
+  Constant compileNodeWithDefinitions(Node node,
+                                      TreeElements definitions,
+                                      {bool isConst: true}) {
+    Constant constant = nodeConstantMap[node];
+    if (constant != null) {
+      return constant;
+    }
+    constant =
+        super.compileNodeWithDefinitions(node, definitions, isConst: isConst);
+    if (constant != null) {
+      nodeConstantMap[node] = constant;
+    }
+    return constant;
+  }
+
+  Constant getConstantForNode(Node node, TreeElements definitions) {
+    Constant constant = nodeConstantMap[node];
+    if (constant != null) {
+      return constant;
+    }
+    return definitions.getConstant(node);
+  }
+
+  Constant getConstantForMetadata(MetadataAnnotation metadata) {
+    return metadataConstantMap[metadata];
+  }
+
+  Constant compileMetadata(MetadataAnnotation metadata,
+                           Node node,
+                           TreeElements elements) {
+    Constant constant = super.compileMetadata(metadata, node, elements);
+    metadataConstantMap[metadata] = constant;
+    return constant;
+  }
+
+  Constant createTypeConstant(TypeDeclarationElement element) {
+    DartType elementType = element.rawType;
+    DartType constantType =
+        compiler.backend.typeImplementation.computeType(compiler);
+    return new TypeConstant(elementType, constantType);
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart b/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
index 8fa9596..8b8d182 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
@@ -163,7 +163,7 @@
         Constant constant = makeTypeConstant(classElement);
         backend.registerCompileTimeConstant(
             constant, compiler.globalDependencies);
-        compiler.constantHandler.addCompileTimeConstantForEmission(constant);
+        backend.constants.addCompileTimeConstantForEmission(constant);
       }
     }
     activeClasses.addAll(newActiveClasses);
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
index 6ca4fc7..255f388 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
@@ -28,6 +28,7 @@
 part 'checked_mode_helpers.dart';
 part 'constant_emitter.dart';
 part 'constant_system_javascript.dart';
+part 'constant_handler_javascript.dart';
 part 'minify_namer.dart';
 part 'namer.dart';
 part 'native_emitter.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart
index 9b5c56e..a318279 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart
@@ -18,6 +18,7 @@
 
   final String getterPrefix = 'g';
   final String setterPrefix = 's';
+  final String callPrefix = ''; // this will create function names $<n>
 
   static const ALPHABET_CHARACTERS = 52;  // a-zA-Z.
   static const ALPHANUMERIC_CHARACTERS = 62;  // a-zA-Z0-9.
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index 00a0bdb..7a33d97 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -221,6 +221,7 @@
   final String getterPrefix = r'get$';
   final String setterPrefix = r'set$';
   final String metadataField = '@';
+  final String callPrefix = 'call';
   final String callCatchAllName = r'call$catchAll';
   final String reflectableField = r'$reflectable';
   final String defaultValuesField = r'$defaultValues';
@@ -290,6 +291,7 @@
     switch (name) {
       case 'GETTER_PREFIX': return getterPrefix;
       case 'SETTER_PREFIX': return setterPrefix;
+      case 'CALL_PREFIX': return callPrefix;
       case 'CALL_CATCH_ALL': return callCatchAllName;
       case 'REFLECTABLE': return reflectableField;
       case 'CLASS_DESCRIPTOR_PROPERTY': return classDescriptorProperty;
@@ -383,8 +385,16 @@
       name = Elements.reconstructConstructorNameSourceString(element);
     }
     FunctionSignature signature = element.functionSignature;
-    String methodName =
-        '${privateName(library, name)}\$${signature.parameterCount}';
+    // We don't mangle the closure invoking function name because it
+    // is generated by string concatenation in applyFunction from
+    // js_helper.dart. To keep code size down, we potentially shorten
+    // the prefix though.
+    String methodName;
+    if (name == closureInvocationSelectorName) {
+      methodName = '$callPrefix\$${signature.parameterCount}';
+    } else {
+      methodName = '${privateName(library, name)}\$${signature.parameterCount}';
+    }
     if (signature.optionalParametersAreNamed &&
         !signature.optionalParameters.isEmpty) {
       StringBuffer buffer = new StringBuffer();
@@ -403,10 +413,11 @@
     assert(!isPrivateName(name));
     // We don't mangle the closure invoking function name because it
     // is generated by string concatenation in applyFunction from
-    // js_helper.dart.
-    String proposedName = '$name\$$arity';
-    if (name == closureInvocationSelectorName) return proposedName;
-    return getMappedInstanceName(proposedName);
+    // js_helper.dart. To keep code size down, we potentially shorten
+    // the prefix though.
+    if (name == closureInvocationSelectorName) return '$callPrefix\$$arity';
+
+    return getMappedInstanceName('$name\$$arity');
   }
 
   String invocationName(Selector selector) {
@@ -432,9 +443,9 @@
       String suffix = '\$${selector.argumentCount}$buffer';
       // We don't mangle the closure invoking function name because it
       // is generated by string concatenation in applyFunction from
-      // js_helper.dart.
+      // js_helper.dart. We potentially shorten the prefix though.
       if (selector.isClosureCall()) {
-        return "$name$suffix";
+        return "$callPrefix$suffix";
       } else {
         String proposedName = privateName(selector.library, name);
         return getMappedInstanceName('$proposedName$suffix');
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart b/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
index 9c467ba..da4f781 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
@@ -66,7 +66,7 @@
       InterfaceType typeVariableType = typeVariableClass.thisType;
       List<int> constants = <int>[];
       evaluator = new CompileTimeConstantEvaluator(
-          compiler.constantHandler,
+          backend.constants,
           compiler.globalDependencies,
           compiler);
 
@@ -80,7 +80,7 @@
               new DartString.literal(currentTypeVariable.name));
           Constant bound = backend.constantSystem.createInt(
               emitter.reifyType(currentTypeVariable.element.bound));
-          Constant type = evaluator.makeTypeConstant(cls);
+          Constant type = backend.constants.createTypeConstant(cls);
           return [type, name, bound];
         }
 
@@ -88,7 +88,7 @@
             currentTypeVariable.element, typeVariableType,
             typeVariableConstructor, createArguments);
         backend.registerCompileTimeConstant(c, compiler.globalDependencies);
-        compiler.constantHandler.addCompileTimeConstantForEmission(c);
+        backend.constants.addCompileTimeConstantForEmission(c);
         constants.add(
             reifyTypeVariableConstant(c, currentTypeVariable.element));
       }
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
index 231035a..a419a7b 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
@@ -842,7 +842,7 @@
   }
 
   void emitStaticNonFinalFieldInitializations(CodeBuffer buffer) {
-    ConstantHandler handler = compiler.constantHandler;
+    JavaScriptConstantCompiler handler = backend.constants;
     Iterable<VariableElement> staticNonFinalFields =
         handler.getStaticNonFinalFieldsForEmission();
     for (Element element in Elements.sortedByPosition(staticNonFinalFields)) {
@@ -862,7 +862,7 @@
   }
 
   void emitLazilyInitializedStaticFields(CodeBuffer buffer) {
-    ConstantHandler handler = compiler.constantHandler;
+    JavaScriptConstantCompiler handler = backend.constants;
     List<VariableElement> lazyFields =
         handler.getLazilyInitializedFieldsForEmission();
     if (!lazyFields.isEmpty) {
@@ -901,7 +901,7 @@
   }
 
   void emitCompileTimeConstants(CodeBuffer buffer, OutputUnit outputUnit) {
-    ConstantHandler handler = compiler.constantHandler;
+    JavaScriptConstantCompiler handler = backend.constants;
     List<Constant> constants = handler.getConstantsForEmission(
         compareConstants);
     Set<Constant> outputUnitConstants = null;
@@ -1530,6 +1530,14 @@
       } else {
         mainBuffer.add('\n');
       }
+
+      if (compiler.useContentSecurityPolicy) {
+        mainBuffer.write(
+            jsAst.prettyPrint(
+                precompiledFunctionAst, compiler,
+                allowVariableMinification: false).getText());
+      }
+
       String assembledCode = mainBuffer.getText();
       String sourceMapTags = "";
       if (generateSourceMap) {
@@ -1544,15 +1552,31 @@
           ..close();
       compiler.assembledCode = assembledCode;
 
-      mainBuffer.write(
-          jsAst.prettyPrint(
-              precompiledFunctionAst, compiler,
-              allowVariableMinification: false).getText());
+      if (!compiler.useContentSecurityPolicy) {
+        mainBuffer.write("""
+{
+  var message = 
+      'Deprecation: Automatic generation of output for Content Security\\n' +
+      'Policy is deprecated and will be removed with the next development\\n' +
+      'release. Use the --csp option to generate CSP restricted output.';
+  if (typeof dartPrint == "function") {
+    dartPrint(message);
+  } else if (typeof console == "object" && typeof console.log == "function") {
+    console.log(message);
+  } else if (typeof print == "function") {
+    print(message);
+  }
+}\n""");
 
-      compiler.outputProvider('', 'precompiled.js')
-          ..add(mainBuffer.getText())
-          ..close();
+        mainBuffer.write(
+            jsAst.prettyPrint(
+                precompiledFunctionAst, compiler,
+                allowVariableMinification: false).getText());
 
+        compiler.outputProvider('', 'precompiled.js')
+            ..add(mainBuffer.getText())
+            ..close();
+      }
       emitDeferredCode();
 
     });
@@ -1672,9 +1696,9 @@
     // [:getLine:] to transform offsets to line numbers in [SourceMapBuilder].
     SourceFile compiledFile = new StringSourceFile(null, code);
     SourceMapBuilder sourceMapBuilder =
-            new SourceMapBuilder(sourceMapUri, fileUri);
+            new SourceMapBuilder(sourceMapUri, fileUri, compiledFile);
     buffer.forEachSourceLocation(sourceMapBuilder.addMapping);
-    String sourceMap = sourceMapBuilder.build(compiledFile);
+    String sourceMap = sourceMapBuilder.build();
     compiler.outputProvider(name, 'js.map')
         ..add(sourceMap)
         ..close();
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
index eeb19be..f48b741 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
@@ -43,7 +43,7 @@
       // directly.
       return;
     }
-    ConstantHandler handler = compiler.constantHandler;
+    JavaScriptConstantCompiler handler = backend.constants;
     List<String> names = selector.getOrderedNamedArguments();
 
     String invocationName = namer.invocationName(selector);
@@ -99,7 +99,7 @@
           parametersBuffer[optionalParameterStart + index] =
               new jsAst.Parameter(jsName);
         } else {
-          Constant value = handler.initialVariableValues[element];
+          Constant value = handler.getConstantForVariable(element);
           if (value == null) {
             argumentsBuffer[count] = task.constantReference(new NullConstant());
           } else {
@@ -505,9 +505,11 @@
         if (backend.mustRetainMetadata) {
           List<MetadataAnnotation> annotations = parameter.metadata.toList();
           Iterable<int> metadataIndices =
-              annotations.map((MetadataAnnotation a) {
-            compiler.constantHandler.addCompileTimeConstantForEmission(a.value);
-            return task.metadataEmitter.reifyMetadata(a);
+              annotations.map((MetadataAnnotation annotation) {
+            Constant constant =
+                backend.constants.getConstantForMetadata(annotation);
+            backend.constants.addCompileTimeConstantForEmission(constant);
+            return task.metadataEmitter.reifyMetadata(annotation);
           });
           expressions.add(metadataIndices.isNotEmpty ? metadataIndices.toList()
                                                      : js('[]'));
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/declarations.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/declarations.dart
index a370cd2..4175867 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/declarations.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/declarations.dart
@@ -46,9 +46,6 @@
 typedef void FunctionTypeSignatureEmitter(Element method,
                                           FunctionType methodType);
 
-// TODO(johnniwinther): Clean up terminology for rti in the emitter.
-typedef void FunctionTypeTestEmitter(FunctionType functionType);
-
 typedef void SubstitutionEmitter(Element element, {bool emitNull});
 
 const String GENERATED_BY = """
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart
index 94fe5e4..c57a42c 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/interceptor_emitter.dart
@@ -15,7 +15,7 @@
 
   Set<ClassElement> interceptorsReferencedFromConstants() {
     Set<ClassElement> classes = new Set<ClassElement>();
-    ConstantHandler handler = compiler.constantHandler;
+    JavaScriptConstantCompiler handler = backend.constants;
     List<Constant> constants = handler.getConstantsForEmission();
     for (Constant constant in constants) {
       if (constant is InterceptorConstant) {
@@ -442,7 +442,7 @@
     if (!analysis.needsTable) return;
 
     List<jsAst.Expression> elements = <jsAst.Expression>[];
-    ConstantHandler handler = compiler.constantHandler;
+    JavaScriptConstantCompiler handler = backend.constants;
     List<Constant> constants =
         handler.getConstantsForEmission(task.compareConstants);
     for (Constant constant in constants) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart
index 2881d91..3ee8ac0 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart
@@ -25,11 +25,10 @@
 
 import '../js_backend/js_backend.dart' show
     CheckedModeHelper,
-    CheckedModeHelper,
     ConstantEmitter,
     CustomElementsAnalysis,
     JavaScriptBackend,
-    JavaScriptBackend,
+    JavaScriptConstantCompiler,
     Namer,
     NativeEmitter,
     RuntimeTypes,
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
index 394ee95..b57a8e2 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
@@ -27,7 +27,8 @@
       if (link != null) {
         for (; !link.isEmpty; link = link.tail) {
           MetadataAnnotation annotation = link.head;
-          Constant value = annotation.value;
+          Constant value =
+              backend.constants.getConstantForMetadata(annotation);
           if (value == null) {
             compiler.internalError(annotation, 'Annotation value is null.');
           } else {
@@ -46,8 +47,7 @@
     if (signature.optionalParameterCount == 0) return const [];
     List<int> defaultValues = <int>[];
     for (Element element in signature.optionalParameters) {
-      Constant value =
-          compiler.constantHandler.initialVariableValues[element];
+      Constant value = backend.constants.getConstantForVariable(element);
       String stringRepresentation = (value == null)
           ? "null"
           : jsAst.prettyPrint(task.constantReference(value), compiler)
@@ -58,7 +58,7 @@
   }
 
   int reifyMetadata(MetadataAnnotation annotation) {
-    Constant value = annotation.value;
+    Constant value = backend.constants.getConstantForMetadata(annotation);
     if (value == null) {
       compiler.internalError(annotation, 'Annotation value is null.');
       return -1;
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart
index 1e7210f..ffe3b52 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/reflection_data_parser.dart
@@ -105,7 +105,8 @@
 
     if (getterStubName) {
       f = tearOff(funcs, array, isStatic, name, isIntercepted);
-      f.getterStub = true;
+      descriptor[name].\$getter = f;
+      f.\$getterStub = true;
 '''
       /* Used to create an isolate using spawnFunction.*/
 '''
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
index 2012604..7440372 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
@@ -236,7 +236,9 @@
 
   InstanceMirror get defaultValue {
     if (hasDefaultValue) {
-      Constant constant = mirrorSystem.compiler.constantHandler
+      // TODO(johnniwinther): Get the constant from the [TreeElements]
+      // associated with the enclosing method.
+      Constant constant = mirrorSystem.compiler.constants
           .getConstantForVariable(_element);
       assert(invariant(_element, constant != null,
           message: "Missing constant for parameter "
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
index 09703a6..a4f88c2 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
@@ -230,8 +230,8 @@
         _appendCommentTokens(
             mirrorSystem.compiler.commentMap[metadata.beginToken]);
         metadata.ensureResolved(mirrorSystem.compiler);
-        _metadata.add(
-            _convertConstantToInstanceMirror(mirrorSystem, metadata.value));
+        _metadata.add(_convertConstantToInstanceMirror(mirrorSystem,
+                                                       metadata.value));
       }
       _appendCommentTokens(mirrorSystem.compiler.commentMap[getBeginToken()]);
     }
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
index 034d209..276cab2 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
@@ -8,6 +8,7 @@
     Compiler,
     CompilerTask,
     Constant,
+    ConstantCompiler,
     ConstructedConstant,
     ListConstant,
     MessageKind,
@@ -133,17 +134,13 @@
     for (Node argument in node.send.arguments) {
       NamedArgument named = argument.asNamedArgument();
       if (named == null) continue;
-      Constant value = compiler.constantHandler.compileNodeWithDefinitions(
-          named.expression, mapping, isConst: true);
-
-      ConstantMapper mapper =
-          new ConstantMapper(compiler.constantHandler, mapping, compiler);
-      named.expression.accept(mapper);
+      ConstantCompiler constantCompiler = compiler.resolver.constantCompiler;
+      Constant value = constantCompiler.compileNode(named.expression, mapping);
 
       MirrorUsageBuilder builder =
           new MirrorUsageBuilder(
               analyzer, mapping.currentElement.getLibrary(), named.expression,
-              value, mapper.constantToNodeMap);
+              value, mapping);
 
       if (named.name.source == 'symbols') {
         analyzer.cachedStrings[value] =
@@ -374,14 +371,14 @@
   final LibraryElement enclosingLibrary;
   final Spannable spannable;
   final Constant constant;
-  final Map<Constant, Node> constantToNodeMap;
+  final TreeElements elements;
 
   MirrorUsageBuilder(
       this.analyzer,
       this.enclosingLibrary,
       this.spannable,
       this.constant,
-      this.constantToNodeMap);
+      this.elements);
 
   Compiler get compiler => analyzer.compiler;
 
@@ -566,7 +563,12 @@
 
   /// Attempt to find a [Spannable] corresponding to constant.
   Spannable positionOf(Constant constant) {
-    Node node = constantToNodeMap[constant];
+    Node node;
+    elements.forEachConstantNode((Node n, Constant c) {
+      if (node == null && c == constant) {
+        node = n;
+      }
+    });
     if (node == null) {
       // TODO(ahe): Returning [spannable] here leads to confusing error
       // messages.  For example, consider:
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 51a4689..d81eb38 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -11,7 +11,7 @@
   /// Iterables of the dependencies that this [TreeElement] records of
   /// [currentElement].
   Iterable<Element> get allElements;
-  Iterable<Constant> get allConstants;
+  void forEachConstantNode(f(Node n, Constant c));
 
   /// A set of additional dependencies.  See [registerDependency] below.
   Setlet<Element> get otherDependencies;
@@ -245,11 +245,13 @@
 
   Iterable<Element> get allElements => elements;
 
-  Iterable<Constant> get allConstants => constants.values;
+  void forEachConstantNode(f(Node n, Constant c)) => constants.forEach(f);
 }
 
 class ResolverTask extends CompilerTask {
-  ResolverTask(Compiler compiler) : super(compiler);
+  final ConstantCompiler constantCompiler;
+
+  ResolverTask(Compiler compiler, this.constantCompiler) : super(compiler);
 
   String get name => 'Resolver';
 
@@ -453,6 +455,7 @@
       }
       if (element.isSynthesized) {
         if (isConstructor) {
+          TreeElements elements = _ensureTreeElements(element);
           Element target = element.targetConstructor;
           // Ensure the signature of the synthesized element is
           // resolved. This is the only place where the resolver is
@@ -460,11 +463,13 @@
           element.computeSignature(compiler);
           if (!target.isErroneous()) {
             compiler.enqueuer.resolution.registerStaticUse(target);
+            compiler.world.registerImplicitSuperCall(elements, target);
           }
+          return elements;
         } else {
           assert(element.isDeferredLoaderGetter());
+          return _ensureTreeElements(element);
         }
-        return _ensureTreeElements(element);
       }
       element.parseNode(compiler);
       element.computeSignature(compiler);
@@ -580,8 +585,11 @@
 
     if (Elements.isStaticOrTopLevelField(element)) {
       visitor.addDeferredAction(element, () {
-        compiler.constantHandler.compileVariable(
-            element, isConst: element.modifiers.isConst());
+        if (element.modifiers.isConst()) {
+          constantCompiler.compileConstant(element);
+        } else {
+          constantCompiler.compileVariable(element);
+        }
       });
       if (initializer != null) {
         if (!element.modifiers.isConst()) {
@@ -654,8 +662,13 @@
     while (!seen.isEmpty) {
       FunctionElementX factory = seen.removeLast();
 
-      TreeElements treeElements =
-          compiler.enqueuer.resolution.getCachedElements(factory);
+      // [factory] must already be analyzed but the [TreeElements] might not
+      // have been stored in the enqueuer cache yet.
+      // TODO(johnniwinther): Store [TreeElements] in the cache before
+      // resolution of the element.
+      TreeElements treeElements = factory.treeElements;
+      assert(invariant(node, treeElements != null,
+          message: 'No TreeElements cached for $factory.'));
       FunctionExpression functionNode = factory.parseNode(compiler);
       Return redirectionNode = functionNode.body;
       InterfaceType factoryType =
@@ -1176,11 +1189,14 @@
       }
       ResolverVisitor visitor = visitorFor(context);
       node.accept(visitor);
-      annotation.value = compiler.constantHandler.compileNodeWithDefinitions(
-          node, visitor.mapping, isConst: true);
-      compiler.backend.registerMetadataConstant(annotation.value,
-                                                visitor.mapping);
-
+      annotation.value =
+          constantCompiler.compileMetadata(annotation, node, visitor.mapping);
+      // TODO(johnniwinther): Register the relation between the annotation
+      // and the annotated element instead. This will allow the backed to
+      // retrieve the backend constant and only registered metadata on the
+      // elements for which it is needed. (Issue 17732).
+      compiler.backend.registerMetadataConstant(
+          annotation.value, visitor.mapping);
       annotation.resolutionState = STATE_DONE;
     }));
   }
@@ -1204,23 +1220,6 @@
   }
 }
 
-class ConstantMapper extends Visitor {
-  final Map<Constant, Node> constantToNodeMap = new Map<Constant, Node>();
-  final CompileTimeConstantEvaluator evaluator;
-
-  ConstantMapper(ConstantHandler handler,
-                 TreeElements elements,
-                 Compiler compiler)
-      : evaluator = new CompileTimeConstantEvaluator(
-          handler, elements, compiler, isConst: false);
-
-  visitNode(Node node) {
-    Constant constant = evaluator.evaluate(node);
-    if (constant != null) constantToNodeMap[constant] = node;
-    node.visitChildren(this);
-  }
-}
-
 class InitializerResolver {
   final ResolverVisitor visitor;
   final Map<Element, Node> initialized;
@@ -1377,7 +1376,8 @@
                                        functionNode,
                                        className,
                                        constructorSelector);
-
+      visitor.compiler.world
+         .registerImplicitSuperCall(visitor.mapping, calledConstructor);
       visitor.world.registerStaticUse(calledConstructor);
     }
   }
@@ -2204,7 +2204,7 @@
     });
     addDeferredAction(enclosingElement, () {
       functionParameters.forEachOptionalParameter((Element parameter) {
-        compiler.constantHandler.compileConstant(parameter);
+        compiler.resolver.constantCompiler.compileConstant(parameter);
       });
     });
     if (inCheckContext) {
@@ -2584,7 +2584,13 @@
         world.registerTypeLiteral(target, mapping);
 
         // Don't try to make constants of calls to type literals.
-        analyzeConstant(node, isConst: !node.isCall);
+        if (!node.isCall) {
+          analyzeConstant(node);
+        } else {
+          // The node itself is not a constant but we register the selector (the
+          // identifier that refers to the class/typedef) as a constant.
+          analyzeConstant(node.selector);
+        }
       }
       if (isPotentiallyMutableTarget(target)) {
         if (enclosingElement != target.enclosingElement) {
@@ -3054,8 +3060,8 @@
     if (isSymbolConstructor) {
       if (node.isConst()) {
         Node argumentNode = node.send.arguments.head;
-        Constant name = compiler.constantHandler.compileNodeWithDefinitions(
-            argumentNode, mapping, isConst: true);
+        Constant name = compiler.resolver.constantCompiler.compileNode(
+            argumentNode, mapping);
         if (!name.isString) {
           DartType type = name.computeType(compiler);
           compiler.reportError(argumentNode, MessageKind.STRING_EXPECTED,
@@ -3103,12 +3109,12 @@
     }
   }
 
-  void analyzeConstant(Node node, {bool isConst: true}) {
+  void analyzeConstant(Node node) {
     addDeferredAction(enclosingElement, () {
-      Constant constant = compiler.constantHandler.compileNodeWithDefinitions(
-          node, mapping, isConst: isConst);
+      Constant constant =
+          compiler.resolver.constantCompiler.compileNode(node, mapping);
 
-      if (isConst && constant != null && constant.isMap) {
+      if (constant.isMap) {
         checkConstMapKeysDontOverrideEquals(node, constant);
       }
 
@@ -4458,7 +4464,7 @@
       resolver.defineElement(link.head, element);
       if (definitions.modifiers.isConst()) {
         compiler.enqueuer.resolution.addDeferredAction(element, () {
-          compiler.constantHandler.compileVariable(element, isConst: true);
+          compiler.resolver.constantCompiler.compileConstant(element);
         });
       }
     }
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
index 0b59263..6a103ed 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
@@ -28,6 +28,7 @@
          MetadataAnnotationX,
          ParameterMetadataAnnotation,
          MetadataContainer;
+import '../helpers/helpers.dart';
 import '../util/util.dart';
 
 import 'secret_tree_element.dart' show getTreeElement, setTreeElement;
diff --git a/sdk/lib/_internal/compiler/implementation/source_map_builder.dart b/sdk/lib/_internal/compiler/implementation/source_map_builder.dart
index 1f5e908..16697e9 100644
--- a/sdk/lib/_internal/compiler/implementation/source_map_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/source_map_builder.dart
@@ -4,7 +4,6 @@
 
 library source_map_builder;
 
-
 import 'util/util.dart';
 import 'scanner/scannerlib.dart' show Token;
 import 'source_file.dart';
@@ -21,6 +20,7 @@
   final Uri uri;
   final Uri fileUri;
 
+  SourceFile targetFile;
   List<SourceMapEntry> entries;
 
   Map<String, int> sourceUrlMap;
@@ -36,7 +36,7 @@
   int previousSourceNameIndex;
   bool firstEntryInLine;
 
-  SourceMapBuilder(this.uri, this.fileUri) {
+  SourceMapBuilder(this.uri, this.fileUri, this.targetFile) {
     entries = new List<SourceMapEntry>();
 
     sourceUrlMap = new Map<String, int>();
@@ -53,7 +53,59 @@
     firstEntryInLine = true;
   }
 
+  resetPreviousSourceLocation() {
+    previousSourceUrlIndex = 0;
+    previousSourceLine = 0;
+    previousSourceColumn = 0;
+    previousSourceNameIndex = 0;
+  }
+
+  updatePreviousSourceLocation(SourceFileLocation sourceLocation) {
+    previousSourceLine = sourceLocation.getLine();
+    previousSourceColumn = sourceLocation.getColumn();
+    String sourceUrl = sourceLocation.getSourceUrl();
+    previousSourceUrlIndex = indexOf(sourceUrlList, sourceUrl, sourceUrlMap);
+    String sourceName = sourceLocation.getSourceName();
+    if (sourceName != null) {
+      previousSourceNameIndex =
+          indexOf(sourceNameList, sourceName, sourceNameMap);
+    }
+  }
+
+  bool sameAsPreviousLocation(SourceFileLocation sourceLocation) {
+    if (sourceLocation == null) {
+      return true;
+    }
+    int sourceUrlIndex =
+        indexOf(sourceUrlList, sourceLocation.getSourceUrl(), sourceUrlMap);
+    return
+       sourceUrlIndex == previousSourceUrlIndex &&
+       sourceLocation.getLine() == previousSourceLine &&
+       sourceLocation.getColumn() == previousSourceColumn;
+  }
+
   void addMapping(int targetOffset, SourceFileLocation sourceLocation) {
+
+    bool sameLine(int position, otherPosition) {
+      return targetFile.getLine(position) == targetFile.getLine(otherPosition);
+    }
+
+    if (!entries.isEmpty && sameLine(targetOffset, entries.last.targetOffset)) {
+      if (sameAsPreviousLocation(sourceLocation)) {
+        // The entry points to the same source location as the previous entry in
+        // the same line, hence it is not needed for the source map.
+        //
+        // TODO(zarah): Remove this check and make sure that [addMapping] is not
+        // called for this position. Instead, when consecutive lines in the
+        // generated code point to the same source location, record this and use
+        // it to generate the entries of the source map.
+        return;
+      }
+    }
+
+    if (sourceLocation != null) {
+      updatePreviousSourceLocation(sourceLocation);
+    }
     entries.add(new SourceMapEntry(sourceLocation, targetOffset));
   }
 
@@ -70,7 +122,8 @@
     buffer.write(']');
   }
 
-  String build(SourceFile targetFile) {
+  String build() {
+    resetPreviousSourceLocation();
     StringBuffer mappingsBuffer = new StringBuffer();
     entries.forEach((SourceMapEntry entry) => writeEntry(entry, targetFile,
                                                          mappingsBuffer));
@@ -128,12 +181,9 @@
 
     int sourceUrlIndex = indexOf(sourceUrlList, sourceUrl, sourceUrlMap);
     encodeVLQ(output, sourceUrlIndex - previousSourceUrlIndex);
-    previousSourceUrlIndex = sourceUrlIndex;
-
     encodeVLQ(output, sourceLine - previousSourceLine);
-    previousSourceLine = sourceLine;
     encodeVLQ(output, sourceColumn - previousSourceColumn);
-    previousSourceColumn = sourceColumn;
+    updatePreviousSourceLocation(entry.sourceLocation);
 
     if (sourceName == null) {
       return;
@@ -141,7 +191,7 @@
 
     int sourceNameIndex = indexOf(sourceNameList, sourceName, sourceNameMap);
     encodeVLQ(output, sourceNameIndex - previousSourceNameIndex);
-    previousSourceNameIndex = sourceNameIndex;
+
   }
 
   int indexOf(List<String> list, String value, Map<String, int> map) {
@@ -215,12 +265,3 @@
     return null;
   }
 }
-
-class OffsetSourceFileLocation extends SourceFileLocation {
-  final int offset;
-  final String sourceName;
-  OffsetSourceFileLocation(SourceFile sourceFile, this.offset,
-      [this.sourceName]) : super(sourceFile);
-
-  String getSourceName() => sourceName;
-}
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index e2f2be3..1b78e3c 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -63,10 +63,9 @@
           signature.forEachOptionalParameter((Element parameter) {
             // This ensures the default value will be computed.
             Constant constant =
-                compiler.constantHandler.getConstantForVariable(parameter);
+                backend.constants.getConstantForVariable(parameter);
             backend.registerCompileTimeConstant(constant, work.resolutionTree);
-            compiler.constantHandler.addCompileTimeConstantForEmission(
-                constant);
+            backend.constants.addCompileTimeConstantForEmission(constant);
           });
         }
         if (compiler.tracer.enabled) {
@@ -924,9 +923,10 @@
   bool isReachable = true;
 
   /**
-   * True if we are visiting the expression of a throw statement.
+   * True if we are visiting the expression of a throw statement; we assume this
+   * is a slow path.
    */
-  bool inThrowExpression = false;
+  bool inExpressionOfThrow = false;
 
   /**
    * The loop nesting is consulted when inlining a function invocation in
@@ -1225,12 +1225,12 @@
         return false;
       }
 
+      if (inExpressionOfThrow) return false;
+
       if (element.isSynthesized) return true;
 
       if (cachedCanBeInlined == true) return cachedCanBeInlined;
 
-      if (inThrowExpression) return false;
-
       int numParameters = function.functionSignature.parameterCount;
       int maxInliningNodes;
       bool useMaxInliningNodes = true;
@@ -1309,7 +1309,7 @@
 
   HInstruction handleConstantForOptionalParameter(Element parameter) {
     Constant constant =
-        compiler.constantHandler.getConstantForVariable(parameter);
+        backend.constants.getConstantForVariable(parameter);
     assert(invariant(parameter, constant != null,
         message: 'No constant computed for $parameter'));
     return graph.addConstant(constant, compiler);
@@ -1348,7 +1348,8 @@
   bool inTryStatement = false;
 
   Constant getConstantForNode(ast.Node node) {
-    Constant constant = elements.getConstant(node);
+    Constant constant =
+        backend.constants.getConstantForNode(node, elements);
     assert(invariant(node, constant != null,
         message: 'No constant computed for $node'));
     return constant;
@@ -1360,7 +1361,7 @@
 
   bool isLazilyInitialized(VariableElement element) {
     Constant initialValue =
-        compiler.constantHandler.getConstantForVariable(element);
+        backend.constants.getConstantForVariable(element);
     return initialValue == null;
   }
 
@@ -2299,12 +2300,12 @@
   }
 
   visitThrowExpression(ast.Expression expression) {
-    bool old = inThrowExpression;
+    bool old = inExpressionOfThrow;
     try {
-      inThrowExpression = true;
+      inExpressionOfThrow = true;
       visit(expression);
     } finally {
-      inThrowExpression = old;
+      inExpressionOfThrow = old;
     }
   }
 
@@ -2936,7 +2937,7 @@
       if (element.isField() && !element.isAssignable()) {
         // A static final or const. Get its constant value and inline it if
         // the value can be compiled eagerly.
-        value = compiler.constantHandler.getConstantForVariable(element);
+        value = backend.constants.getConstantForVariable(element);
       }
       if (value != null) {
         HConstant instruction = graph.addConstant(value, compiler);
@@ -3319,7 +3320,15 @@
     push(new HForeign(nativeBehavior.codeAst, ssaType, inputs,
                       effects: nativeBehavior.sideEffects,
                       nativeBehavior: nativeBehavior));
-    return;
+  }
+
+  void handleJsStringConcat(ast.Send node) {
+    List<HInstruction> inputs = <HInstruction>[];
+    addGenericSendArgumentsToList(node.arguments, inputs);
+    if (inputs.length != 2) {
+      compiler.internalError(node.argumentsNode, 'Two arguments expected.');
+    }
+    push(new HStringConcat(inputs[0], inputs[1], node, backend.stringType));
   }
 
   void handleForeignJsCurrentIsolateContext(ast.Send node) {
@@ -3610,6 +3619,8 @@
       stack.add(graph.addConstantNull(compiler));
     } else if (name == 'JS_INTERCEPTOR_CONSTANT') {
       handleJsInterceptorConstant(node);
+    } else if (name == 'JS_STRING_CONCAT') {
+      handleJsStringConcat(node);
     } else {
       throw "Unknown foreign: ${selector}";
     }
@@ -4330,7 +4341,7 @@
     } else if (node.isConst()) {
       stack.add(addConstant(node));
       if (isSymbolConstructor) {
-        ConstructedConstant symbol = elements.getConstant(node);
+        ConstructedConstant symbol = getConstantForNode(node);
         StringConstant stringConstant = symbol.fields.single;
         String nameString = stringConstant.toDartString().slowToString();
         compiler.enqueuer.codegen.registerConstSymbol(nameString, elements);
@@ -5028,19 +5039,61 @@
       stack.add(addConstant(node));
       return;
     }
-    List<HInstruction> inputs = <HInstruction>[];
+    List<HInstruction> listInputs = <HInstruction>[];
     for (Link<ast.Node> link = node.entries.nodes;
          !link.isEmpty;
          link = link.tail) {
       visit(link.head);
-      inputs.add(pop());
-      inputs.add(pop());
+      listInputs.add(pop());
+      listInputs.add(pop());
     }
-    HLiteralList keyValuePairs = buildLiteralList(inputs);
-    add(keyValuePairs);
+
+    Element constructor;
+    List<HInstruction> inputs = <HInstruction>[];
+
+    if (listInputs.isEmpty) {
+      constructor = backend.mapLiteralConstructorEmpty;
+    } else {
+      constructor = backend.mapLiteralConstructor;
+      HLiteralList keyValuePairs = buildLiteralList(listInputs);
+      add(keyValuePairs);
+      inputs.add(keyValuePairs);
+    }
+
+    assert(constructor.isFactoryConstructor());
+
+    FunctionElement functionElement = constructor;
+    constructor = functionElement.redirectionTarget;
+
+    InterfaceType type = elements.getType(node);
+    InterfaceType expectedType = functionElement.computeTargetType(type);
+
+    if (constructor.isFactoryConstructor()) {
+      compiler.enqueuer.codegen.registerFactoryWithTypeArguments(elements);
+    }
+
+    ClassElement cls = constructor.getEnclosingClass();
+
+    if (backend.classNeedsRti(cls)) {
+      Link<DartType> typeVariable = cls.typeVariables;
+      expectedType.typeArguments.forEach((DartType argument) {
+            inputs.add(analyzeTypeArgument(argument));
+            typeVariable = typeVariable.tail;
+          });
+      assert(typeVariable.isEmpty);
+    }
+
+    // The instruction type will always be a subtype of the mapLiteralClass, but
+    // type inference might discover a more specific type, or find nothing (in
+    // dart2js unit tests).
     TypeMask mapType = new TypeMask.nonNullSubtype(backend.mapLiteralClass);
-    pushInvokeStatic(node, backend.getMapMaker(), [keyValuePairs], mapType);
-    stack.add(setRtiIfNeeded(pop(), node));
+    TypeMask returnTypeMask = TypeMaskFactory.inferredReturnTypeForElement(
+        constructor, compiler);
+    TypeMask instructionType = mapType.intersection(returnTypeMask, compiler);
+
+    addInlinedInstantiation(expectedType);
+    pushInvokeStatic(node, constructor, inputs, instructionType);
+    removeInlinedInstantiation(expectedType);
   }
 
   visitLiteralMapEntry(ast.LiteralMapEntry node) {
@@ -5661,8 +5714,6 @@
  * Visitor that handles generation of string literals (LiteralString,
  * StringInterpolation), and otherwise delegates to the given visitor for
  * non-literal subexpressions.
- * TODO(lrn): Consider whether to handle compile time constant int/boolean
- * expressions as well.
  */
 class StringBuilderVisitor extends ast.Visitor {
   final SsaBuilder builder;
@@ -5675,6 +5726,8 @@
 
   StringBuilderVisitor(this.builder, this.diagnosticNode);
 
+  Compiler get compiler => builder.compiler;
+
   void visit(ast.Node node) {
     node.accept(this);
   }
@@ -5686,11 +5739,31 @@
   void visitExpression(ast.Node node) {
     node.accept(builder);
     HInstruction expression = builder.pop();
-    if (!expression.isConstantString()) {
-      expression = new HStringify(expression, node, builder.backend.stringType);
-      builder.add(expression);
+
+    // We want to use HStringify when:
+    //   1. The value is known to be a primitive type, because it might get
+    //      constant-folded and codegen has some tricks with JavaScript
+    //      conversions.
+    //   2. The value can be primitive, because the library stringifier has
+    //      fast-path code for most primitives.
+    if (expression.canBePrimitive(compiler)) {
+      append(stringify(node, expression));
+      return;
     }
-    result = (result == null) ? expression : concat(result, expression);
+
+    // If the `toString` method is guaranteed to return a string we can call it
+    // directly.
+    Selector selector =
+        new TypedSelector(expression.instructionType,
+            new Selector.call('toString', null, 0));
+    TypeMask type = TypeMaskFactory.inferredTypeForSelector(selector, compiler);
+    if (type.containsOnlyString(compiler)) {
+      builder.pushInvokeDynamic(node, selector, <HInstruction>[expression]);
+      append(builder.pop());
+      return;
+    }
+
+    append(stringify(node, expression));
   }
 
   void visitStringInterpolation(ast.StringInterpolation node) {
@@ -5710,12 +5783,23 @@
      node.visitChildren(this);
   }
 
+  void append(HInstruction expression) {
+    result = (result == null) ? expression : concat(result, expression);
+  }
+
   HInstruction concat(HInstruction left, HInstruction right) {
     HInstruction instruction = new HStringConcat(
         left, right, diagnosticNode, builder.backend.stringType);
     builder.add(instruction);
     return instruction;
   }
+
+  HInstruction stringify(ast.Node node, HInstruction expression) {
+    HInstruction instruction =
+        new HStringify(expression, node, builder.backend.stringType);
+    builder.add(instruction);
+    return instruction;
+  }
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index b18b054..962348132 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -1492,9 +1492,6 @@
         // list class is instantiated.
         world.registerInstantiatedClass(
             compiler.listClass, work.resolutionTree);
-      } else if (target == backend.jsStringOperatorAdd) {
-        push(new js.Binary('+', object, arguments[0]), node);
-        return;
       } else if (target.isNative() && target.isFunction()
                  && !node.isInterceptedCall) {
         // A direct (i.e. non-interceptor) native call is the result of
@@ -1690,6 +1687,22 @@
         node);
   }
 
+  visitReadModifyWrite(HReadModifyWrite node) {
+    Element element = node.element;
+    world.registerFieldSetter(element);
+    String name = backend.namer.instanceFieldPropertyName(element);
+    use(node.receiver);
+    js.Expression fieldReference = new js.PropertyAccess.field(pop(), name);
+    if (node.isPreOp) {
+      push(new js.Prefix(node.jsOp, fieldReference), node);
+    } else if (node.isPostOp) {
+      push(new js.Postfix(node.jsOp, fieldReference), node);
+    } else {
+      use(node.value);
+      push(new js.Assignment.compound(fieldReference, node.jsOp, pop()), node);
+    }
+  }
+
   visitLocalGet(HLocalGet node) {
     use(node.receiver);
   }
@@ -1780,7 +1793,7 @@
     generateConstant(node.constant);
 
     backend.registerCompileTimeConstant(node.constant, work.resolutionTree);
-    compiler.constantHandler.addCompileTimeConstantForEmission(node.constant);
+    backend.constants.addCompileTimeConstantForEmission(node.constant);
   }
 
   visitNot(HNot node) {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
index f4c8950..2caf641 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
@@ -26,7 +26,7 @@
     while (instruction != null) {
       HInstruction next = instruction.next;
       HInstruction replacement = instruction.accept(this);
-      if (replacement != instruction) {
+      if (replacement != instruction && replacement != null) {
         block.rewrite(instruction, replacement);
 
         // If the replacement instruction does not know its source element, use
@@ -137,6 +137,118 @@
 
     return node;
   }
+
+  HInstruction visitFieldSet(HFieldSet setter) {
+    // Pattern match
+    //     t1 = x.f; t2 = t1 + 1; x.f = t2; use(t2)   -->  ++x.f
+    //     t1 = x.f; t2 = t1 op y; x.f = t2; use(t2)  -->  x.f op= y
+    //     t1 = x.f; t2 = t1 + 1; x.f = t2; use(t1)   -->  x.f++
+    HBasicBlock block = setter.block;
+    HInstruction op = setter.value;
+    HInstruction receiver = setter.receiver;
+
+    bool isMatchingRead(HInstruction candidate) {
+      if (candidate is HFieldGet) {
+        if (candidate.element != setter.element) return false;
+        if (candidate.receiver != setter.receiver) return false;
+        // Recognize only three instructions in sequence in the same block.  This
+        // could be broadened to allow non-interfering interleaved instructions.
+        if (op.block != block) return false;
+        if (candidate.block != block) return false;
+        if (setter.previous != op) return false;
+        if (op.previous != candidate) return false;
+        return true;
+      }
+      return false;
+    }
+
+    HInstruction noMatchingRead() {
+      // If we have other HFieldSet optimizations, they go here.
+      return null;
+    }
+
+    HInstruction replaceOp(HInstruction replacement, HInstruction getter) {
+      block.addBefore(setter, replacement);
+      block.remove(setter);
+      block.rewrite(op, replacement);
+      block.remove(op);
+      block.remove(getter);
+      return null;
+    }
+
+    HInstruction plusOrMinus(String assignOp, String incrementOp) {
+      HInvokeBinary binary = op;
+      HInstruction left = binary.left;
+      HInstruction right = binary.right;
+      if (isMatchingRead(left)) {
+        if (left.usedBy.length == 1) {
+          if (right is HConstant && right.constant.isOne) {
+            HInstruction rmw = new HReadModifyWrite.preOp(
+                setter.element, incrementOp, receiver, op.instructionType);
+            return replaceOp(rmw, left);
+          } else {
+            HInstruction rmw = new HReadModifyWrite.assignOp(
+                setter.element,
+                assignOp,
+                receiver, right, op.instructionType);
+            return replaceOp(rmw, left);
+          }
+        } else if (op.usedBy.length == 1 &&
+                   right is HConstant &&
+                   right.constant.isOne) {
+          HInstruction rmw = new HReadModifyWrite.postOp(
+              setter.element, incrementOp, receiver, op.instructionType);
+          block.addAfter(left, rmw);
+          block.remove(setter);
+          block.remove(op);
+          block.rewrite(left, rmw);
+          block.remove(left);
+          return null;
+        }
+      }
+      return noMatchingRead();
+    }
+
+    HInstruction simple(String assignOp,
+                        HInstruction left, HInstruction right) {
+      if (isMatchingRead(left)) {
+        if (left.usedBy.length == 1) {
+          HInstruction rmw = new HReadModifyWrite.assignOp(
+              setter.element,
+              assignOp,
+              receiver, right, op.instructionType);
+          return replaceOp(rmw, left);
+        }
+      }
+      return noMatchingRead();
+    }
+
+    HInstruction simpleBinary(String assignOp) {
+      HInvokeBinary binary = op;
+      return simple(assignOp, binary.left, binary.right);
+    }
+
+    HInstruction bitop(String assignOp) {
+      // HBitAnd, HBitOr etc. are more difficult because HBitAnd(a.x, y)
+      // sometimes needs to be forced to unsigned: a.x = (a.x & y) >>> 0.
+      if (op.isUInt31(compiler)) return simpleBinary(assignOp);
+      return noMatchingRead();
+    }
+
+    if (op is HAdd) return plusOrMinus('+', '++');
+    if (op is HSubtract) return plusOrMinus('-', '--');
+
+    if (op is HStringConcat) return simple('+', op.left, op.right);
+
+    if (op is HMultiply) return simpleBinary('*');
+    if (op is HDivide) return simpleBinary('/');
+
+    if (op is HBitAnd) return bitop('&');
+    if (op is HBitOr) return bitop('|');
+    if (op is HBitXor) return bitop('^');
+
+    return noMatchingRead();
+  }
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index fdedd2a..a40355b 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -54,6 +54,7 @@
   R visitParameterValue(HParameterValue node);
   R visitPhi(HPhi node);
   R visitRangeConversion(HRangeConversion node);
+  R visitReadModifyWrite(HReadModifyWrite node);
   R visitReturn(HReturn node);
   R visitShiftLeft(HShiftLeft node);
   R visitShiftRight(HShiftRight node);
@@ -321,6 +322,7 @@
   visitMultiply(HMultiply node) => visitBinaryArithmetic(node);
   visitParameterValue(HParameterValue node) => visitLocalValue(node);
   visitRangeConversion(HRangeConversion node) => visitCheck(node);
+  visitReadModifyWrite(HReadModifyWrite node) => visitInstruction(node);
   visitReturn(HReturn node) => visitControlFlow(node);
   visitShiftLeft(HShiftLeft node) => visitBinaryBitOp(node);
   visitShiftRight(HShiftRight node) => visitBinaryBitOp(node);
@@ -858,8 +860,13 @@
 
   bool canBePrimitiveNumber(Compiler compiler) {
     JavaScriptBackend backend = compiler.backend;
+    // TODO(sra): It should be possible to test only jsDoubleClass and
+    // jsUInt31Class, since all others are superclasses of these two.
     return instructionType.contains(backend.jsNumberClass, compiler)
         || instructionType.contains(backend.jsIntClass, compiler)
+        || instructionType.contains(backend.jsPositiveIntClass, compiler)
+        || instructionType.contains(backend.jsUInt32Class, compiler)
+        || instructionType.contains(backend.jsUInt31Class, compiler)
         || instructionType.contains(backend.jsDoubleClass, compiler);
   }
 
@@ -1557,6 +1564,58 @@
   String toString() => "FieldSet $element";
 }
 
+/**
+ * HReadModifyWrite is a late stage instruction for a field (property) update
+ * via an assignment operation or pre- or post-increment.
+ */
+class HReadModifyWrite extends HLateInstruction {
+  static const ASSIGN_OP = 0;
+  static const PRE_OP = 1;
+  static const POST_OP = 2;
+  final Element element;
+  final String jsOp;
+  final int opKind;
+
+   HReadModifyWrite._(Element this.element, this.jsOp, this.opKind,
+      List<HInstruction> inputs, TypeMask type)
+      : super(inputs, type) {
+    sideEffects.clearAllSideEffects();
+    sideEffects.clearAllDependencies();
+    sideEffects.setChangesInstanceProperty();
+    sideEffects.setDependsOnInstancePropertyStore();
+  }
+
+  HReadModifyWrite.assignOp(Element element, String jsOp,
+      HInstruction receiver, HInstruction operand, TypeMask type)
+      : this._(element, jsOp, ASSIGN_OP,
+               <HInstruction>[receiver, operand], type);
+
+  HReadModifyWrite.preOp(Element element, String jsOp,
+      HInstruction receiver, TypeMask type)
+      : this._(element, jsOp, PRE_OP, <HInstruction>[receiver], type);
+
+  HReadModifyWrite.postOp(Element element, String jsOp,
+      HInstruction receiver, TypeMask type)
+      : this._(element, jsOp, POST_OP, <HInstruction>[receiver], type);
+
+  HInstruction get receiver => inputs[0];
+
+  bool get isPreOp => opKind == PRE_OP;
+  bool get isPostOp => opKind == POST_OP;
+  bool get isAssignOp => opKind == ASSIGN_OP;
+
+  bool canThrow() => receiver.canBeNull();
+
+  HInstruction getDartReceiver(Compiler compiler) => receiver;
+  bool onlyThrowsNSM() => true;
+
+  HInstruction get value => inputs[1];
+  accept(HVisitor visitor) => visitor.visitReadModifyWrite(this);
+
+  bool isJsStatement() => isAssignOp;
+  String toString() => "ReadModifyWrite $jsOp $opKind $element";
+}
+
 class HLocalGet extends HFieldAccess {
   // No need to use GVN for a [HLocalGet], it is just a local
   // access.
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index 7068388..3cdfa57 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -109,6 +109,12 @@
  */
 class SsaInstructionSimplifier extends HBaseVisitor
     implements OptimizationPhase {
+
+  // We don't produce constant-folded strings longer than this unless they have
+  // a single use.  This protects against exponentially large constant folded
+  // strings.
+  static const MAX_SHARED_CONSTANT_FOLDED_STRING_LENGTH = 512;
+
   final String name = "SsaInstructionSimplifier";
   final JavaScriptBackend backend;
   final CodegenWorkItem work;
@@ -280,10 +286,12 @@
         } else if (selector.applies(backend.jsStringOperatorAdd, compiler)) {
           // `operator+` is turned into a JavaScript '+' so we need to
           // make sure the receiver and the argument are not null.
+          // TODO(sra): Do this via [node.specializer].
           HInstruction argument = node.inputs[2];
           if (argument.isString(compiler)
               && !input.canBeNull()) {
-            target = backend.jsStringOperatorAdd;
+            return new HStringConcat(input, argument, null,
+                                     node.instructionType);
           }
         } else if (selector.applies(backend.jsStringToString, compiler)
                    && !input.canBeNull()) {
@@ -812,6 +820,11 @@
       if (leftString == null) return node;
     }
 
+    if (leftString.value.length + rightString.value.length >
+        MAX_SHARED_CONSTANT_FOLDED_STRING_LENGTH) {
+      if (node.usedBy.length > 1) return node;
+    }
+
     HInstruction folded = graph.addConstant(
         constantSystem.createString(
             new ast.DartString.concat(leftString.value, rightString.value)),
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart b/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
index 4c86cb7..13056a6 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/tracer.dart
@@ -275,6 +275,20 @@
     return 'field set ${temporaryId(node.receiver)}.$fieldName to $valueId';
   }
 
+  String visitReadModifyWrite(HReadModifyWrite node) {
+    String fieldName = node.element.name;
+    String receiverId = temporaryId(node.receiver);
+    String op = node.jsOp;
+    if (node.isAssignOp) {
+      String valueId = temporaryId(node.value);
+      return 'field-update $receiverId.$fieldName $op= $valueId';
+    } else if (node.isPreOp) {
+      return 'field-update $op$receiverId.$fieldName';
+    } else {
+      return 'field-update $receiverId.$fieldName$op';
+    }
+  }
+
   String visitLocalGet(HLocalGet node) {
     String localName = node.element.name;
     return 'local get ${temporaryId(node.local)}.$localName';
diff --git a/sdk/lib/_internal/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart
index c52c9fe..f112668 100644
--- a/sdk/lib/_internal/compiler/implementation/typechecker.dart
+++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart
@@ -511,11 +511,6 @@
 
   DartType visitCascade(Cascade node) {
     analyze(node.expression);
-    if (node.expression.asCascadeReceiver() == null) {
-      // TODO(karlklose): bug: expressions of the form e..x = y do not have
-      // a CascadeReceiver as expression currently.
-      return types.dynamicType;
-    }
     return popCascadeType();
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
index abbcb91..aea9845 100644
--- a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
+++ b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
@@ -8,6 +8,8 @@
 
 library dart2js.use_unused_api;
 
+import '../compiler.dart' as api;
+
 import 'dart2js.dart' as dart2js;
 
 import 'dart2jslib.dart' as dart2jslib;
@@ -38,11 +40,16 @@
 
 import 'ssa/ssa.dart' as ssa;
 
+import 'ir/ir_nodes.dart' as ir_nodes;
+
+import 'ir/ir_builder.dart' as ir_builder;
+
 class ElementVisitor extends elements_visitor.ElementVisitor {
   visitElement(e) {}
 }
 
 void main(List<String> arguments) {
+  useApi();
   dart2js.main(arguments);
   useConstant(null, null);
   useNode(null);
@@ -58,6 +65,11 @@
   useCodeBuffer(null);
   usedByTests();
   useElements(null, null);
+  useIr(null, null);
+}
+
+useApi() {
+  api.ReadStringFromUri uri;
 }
 
 void useConstant(dart2jslib.Constant constant, dart2jslib.ConstantSystem cs) {
@@ -109,7 +121,6 @@
 
 void useUtil(util.Link link) {
   link.reversePrependAll(link);
-  util.trace("");
 }
 
 void useElementVisitor(ElementVisitor visitor) {
@@ -179,7 +190,6 @@
   dart2jslib.World world = null;
   dart2jslib.Compiler compiler = null;
   compiler.currentlyInUserCode();
-  compiler.inUserCode(null);
   type_graph_inferrer.TypeGraphInferrer typeGraphInferrer = null;
   source_file_provider.SourceFileProvider sourceFileProvider = null;
   world.hasAnyUserDefinedGetter(null);
@@ -196,4 +206,24 @@
   e.lookupClassMember(null);
   e.lookupInterfaceMember(null);
   n.isAccessibleFrom(null);
+}
+
+useIr(ir_nodes.SExpressionStringifier stringifier,
+      ir_builder.IrBuilderTask task) {
+  new ir_nodes.SExpressionStringifier();
+  stringifier
+    ..newContinuationName()
+    ..newValueName()
+    ..visitConstant(null)
+    ..visitContinuation(null)
+    ..visitDefinition(null)
+    ..visitExpression(null)
+    ..visitFunction(null)
+    ..visitInvokeStatic(null)
+    ..visitLetCont(null)
+    ..visitNode(null)
+    ..visitParameter(null);
+  task
+    ..hasIr(null)
+    ..getIr(null);
 }
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/util/util.dart b/sdk/lib/_internal/compiler/implementation/util/util.dart
index b24cc1f..95098d5 100644
--- a/sdk/lib/_internal/compiler/implementation/util/util.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/util.dart
@@ -4,15 +4,12 @@
 
 library dart2js.util;
 
-import "dart:collection";
 import 'util_implementation.dart';
 import 'characters.dart';
 
 export 'setlet.dart';
 
 part 'link.dart';
-part 'expensive_map.dart';
-part 'expensive_set.dart';
 
 /**
  * Tagging interface for classes from which source spans can be generated.
@@ -51,181 +48,11 @@
 }
 
 /**
- * Helper method for printing stack traces for debugging.
- *
- * [message] is printed as the header of the stack trace.
- *
- * If [condition] is provided, the stack trace is only printed if [condition]
- * returns [:true:] on the stack trace text. This can be used to filter the
- * printed stack traces based on their content. For instance only print stack
- * traces that contain specific paths.
- */
-void trace(String message, [bool condition(String stackTrace)]) {
-  try {
-    throw '';
-  } catch (e, s) {
-    String stackTrace = prettifyStackTrace(
-        s, rangeStart: 1, filePrefix: stackTraceFilePrefix);
-    if (condition != null) {
-      if (!condition(stackTrace)) return;
-    }
-    print('$message\n$stackTrace');
-  }
-}
-
-/**
  * File name prefix used to shorten the file name in stack traces printed by
  * [trace].
  */
 String stackTraceFilePrefix = null;
 
-/// Helper class for the processing of stack traces in [prettifyStackTrace].
-class _StackTraceLine {
-  final int index;
-  final String file;
-  final String lineNo;
-  final String columnNo;
-  final String method;
-
-  _StackTraceLine(this.index, this.file, this.lineNo,
-                  this.columnNo, this.method);
-
-  String toString() {
-    return 'index=$index, file=$file, '
-           'lineNo=$lineNo, columnNo=$columnNo, method=$method';
-  }
-}
-
-// TODO(johnniwinther): Use this format for --throw-on-error.
-/**
- * Converts the normal VM stack trace into a more compact and readable format.
- *
- * The output format is [: <file> . . . <lineNo>:<columnNo> <method> :] where
- * [: <file> :] is file name, [: <lineNo> :] is the line number,
- * [: <columnNo> :] is the column number, and [: <method> :] is the method name.
- *
- * If [rangeStart] and/or [rangeEnd] are provided, only the lines within the
- * range are included.
- * If [showColumnNo] is [:false:], the [: :<columnNo> :] part is omitted.
- * If [showDots] is [:true:], the space between [: <file> :] and [: <lineNo> :]
- * is padded with dots on every other line.
- * If [filePrefix] is provided, then for  every file name thats starts with
- * [filePrefix] only the remainder is printed.
- * If [lambda] is non-null, anonymous closures are printed as [lambda].
- */
-String prettifyStackTrace(StackTrace s,
-                          {int rangeStart,
-                           int rangeEnd,
-                           bool showColumnNo: false,
-                           bool showDots: true,
-                           String filePrefix,
-                           String lambda: r'?'}) {
-  int index = -1;
-  int maxFileLength = 0;
-  int maxLineNoLength = 0;
-  int maxColumnNoLength = 0;
-
-  String stackTrace = '$s';
-  List<_StackTraceLine> lines = <_StackTraceLine>[];
-  for (String line in stackTrace.split('\n')) {
-    try {
-      index++;
-      if (rangeStart != null && index < rangeStart) continue;
-      if (rangeEnd != null && index > rangeEnd) continue;
-      if (line.isEmpty) continue;
-
-      // Strip index.
-      line = line.replaceFirst(new RegExp(r'#\d+\s*'), '');
-
-      int leftParenPos = line.indexOf('(');
-      int rightParenPos = line.indexOf(')', leftParenPos);
-      int lastColon = line.lastIndexOf(':', rightParenPos);
-      int nextToLastColon = line.lastIndexOf(':', lastColon-1);
-
-      String lineNo;
-      String columnNo;
-      if (nextToLastColon != -1) {
-        lineNo = line.substring(nextToLastColon+1, lastColon);
-        columnNo = line.substring(lastColon+1, rightParenPos);
-        try {
-          int.parse(lineNo);
-        } on FormatException catch (e) {
-          lineNo = columnNo;
-          columnNo = '';
-          nextToLastColon = lastColon;
-        }
-      } else {
-        lineNo = line.substring(lastColon+1, rightParenPos);
-        columnNo = '';
-        nextToLastColon = lastColon;
-      }
-
-      if (lineNo.length > maxLineNoLength) {
-        maxLineNoLength = lineNo.length;
-      }
-      if (columnNo.length > maxColumnNoLength) {
-        maxColumnNoLength = columnNo.length;
-      }
-
-      String file = line.substring(leftParenPos+1, nextToLastColon);
-      if (filePrefix != null && file.startsWith(filePrefix)) {
-        file = file.substring(filePrefix.length);
-      }
-      if (file.length > maxFileLength) {
-        maxFileLength = file.length;
-      }
-      String method = line.substring(0, leftParenPos-1);
-      if (lambda != null) {
-        method = method.replaceAll('<anonymous closure>', lambda);
-      }
-      lines.add(new _StackTraceLine(index, file, lineNo, columnNo, method));
-    } catch (e) {
-      print('Error prettifying "$line": $e');
-      return stackTrace;
-    }
-  }
-
-  StringBuffer sb = new StringBuffer();
-  bool dots = true;
-  for (_StackTraceLine line in lines) {
-    String file = pad('${line.file} ', maxFileLength,
-                      dots: showDots && dots ? ' .' : ' ');
-    String lineNo = pad(line.lineNo, maxLineNoLength, padLeft: true);
-    String columnNo =
-        showColumnNo ? ':${pad(line.columnNo, maxColumnNoLength)}' : '';
-    String method = line.method;
-    sb.write('  $file $lineNo$columnNo $method\n');
-    dots = !dots;
-  }
-  return sb.toString();
-}
-
-/**
- * Pads (or truncates) [text] to the [intendedLength].
- *
- * If [padLeft] is [:true:] the text is padding inserted to the left of [text].
- * A repetition of the [dots] text is used for padding.
- */
-String pad(String text, int intendedLength,
-           {bool padLeft: false, String dots: ' '}) {
-  if (text.length == intendedLength) return text;
-  if (text.length > intendedLength) return text.substring(0, intendedLength);
-  if (dots == null || dots.isEmpty) dots = ' ';
-  int dotsLength = dots.length;
-  StringBuffer sb = new StringBuffer();
-  if (!padLeft) {
-    sb.write(text);
-  }
-  for (int index = text.length ; index < intendedLength ; index ++) {
-    int dotsIndex = index % dotsLength;
-    sb.write(dots.substring(dotsIndex, dotsIndex + 1));
-  }
-  if (padLeft) {
-    sb.write(text);
-  }
-  return sb.toString();
-}
-
 /// Writes the characters of [string] on [buffer].  The characters
 /// are escaped as suitable for JavaScript and JSON.  [buffer] is
 /// anything which supports [:write:] and [:writeCharCode:], for example,
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index f50505a..c9a98b5 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -1474,10 +1474,20 @@
           examples: const ["do() {} main() {}"]);
 
   static const MessageKind UNUSED_METHOD = const MessageKind(
-      "The method '#{method_name}' is never called.",
+      "The method '#{name}' is never called.",
       howToFix: "Consider deleting it.",
       examples: const ["deadCode() {} main() {}"]);
 
+  static const MessageKind UNUSED_CLASS = const MessageKind(
+      "The class '#{name}' is never used.",
+      howToFix: "Consider deleting it.",
+      examples: const ["class DeadCode {} main() {}"]);
+
+  static const MessageKind UNUSED_TYPEDEF = const MessageKind(
+      "The typedef '#{name}' is never used.",
+      howToFix: "Consider deleting it.",
+      examples: const ["typedef DeadCode(); main() {}"]);
+
   static const MessageKind ABSTRACT_METHOD = const MessageKind(
       "The method '#{name}' has no implementation in "
       "class '#{class}'.",
diff --git a/sdk/lib/_internal/compiler/implementation/world.dart b/sdk/lib/_internal/compiler/implementation/world.dart
index 91a95d2..033c95b 100644
--- a/sdk/lib/_internal/compiler/implementation/world.dart
+++ b/sdk/lib/_internal/compiler/implementation/world.dart
@@ -273,4 +273,9 @@
   bool getCannotThrow(Element element) {
     return elementsThatCannotThrow.contains(element);
   }
+
+  void registerImplicitSuperCall(TreeElements elements,
+                                 FunctionElement superConstructor) {
+    elements.otherDependencies.add(superConstructor);
+  }
 }
diff --git a/sdk/lib/_internal/compiler/samples/leap_server/leap_server.dart b/sdk/lib/_internal/compiler/samples/leap_server/leap_server.dart
deleted file mode 100644
index 2f741afa..0000000
--- a/sdk/lib/_internal/compiler/samples/leap_server/leap_server.dart
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library leap_server;
-
-import 'dart:io';
-
-import 'dart:convert' show JSON, HtmlEscape;
-
-/// Represents a "project" command. These commands are accessed from the URL
-/// "/project?name".
-class ProjectCommand {
-  final String name;
-
-  /// For each query parameter, this map describes rules for validating them.
-  final Map<String, String> rules;
-
-  final Function handle;
-
-  const ProjectCommand(this.name, this.rules, this.handle);
-}
-
-class Conversation {
-  HttpRequest request;
-  HttpResponse response;
-
-  static const String PROJECT_PATH = '/project';
-
-  static const String PACKAGES_PATH = '/packages';
-
-  static const String CONTENT_TYPE = HttpHeaders.CONTENT_TYPE;
-
-  static Uri documentRoot = Uri.base;
-
-  static Uri projectRoot = Uri.base.resolve('site/try/src/');
-
-  static Uri packageRoot = Uri.base.resolve('sdk/lib/_internal/');
-
-  static const List<ProjectCommand> COMMANDS = const <ProjectCommand>[
-      const ProjectCommand('list', const {'list': null}, handleProjectList),
-  ];
-
-  Conversation(this.request, this.response);
-
-  onClosed(_) {
-    if (response.statusCode == HttpStatus.OK) return;
-    print('Request for ${request.uri} ${response.statusCode}');
-  }
-
-  notFound(path) {
-    response.statusCode = HttpStatus.NOT_FOUND;
-    response.write(htmlInfo('Not Found',
-                            'The file "$path" could not be found.'));
-    response.close();
-  }
-
-  redirect(String location) {
-    response.statusCode = HttpStatus.FOUND;
-    response.headers.add(HttpHeaders.LOCATION, location);
-    response.close();
-  }
-
-  badRequest(String problem) {
-    response.statusCode = HttpStatus.BAD_REQUEST;
-    response.write(htmlInfo("Bad request",
-                            "Bad request '${request.uri}': $problem"));
-    response.close();
-  }
-
-  bool validate(Map<String, String> parameters, Map<String, String> rules) {
-    Iterable<String> problems = rules.keys
-        .where((name) => !parameters.containsKey(name))
-        .map((name) => "Missing parameter: '$name'.");
-    if (!problems.isEmpty) {
-      badRequest(problems.first);
-      return false;
-    }
-    Set extra = new Set.from(parameters.keys)..removeAll(rules.keys);
-    if (extra.isEmpty) return true;
-    String extraString = (extra.toList()..sort()).join("', '");
-    badRequest("Extra parameters: '$extraString'.");
-    return false;
-  }
-
-  static handleProjectList(Conversation self) {
-    String nativeDir = projectRoot.toFilePath();
-    Directory dir = new Directory(nativeDir);
-    var future = dir.list(recursive: true, followLinks: false).toList();
-    future.then((List<FileSystemEntity> entries) {
-      List<String> files = entries
-          .map((e) => e.path)
-          .where((p) => !p.endsWith('~') && p.startsWith(nativeDir))
-          .map((p) => p.substring(nativeDir.length))
-          .map((p) => new Uri.file(p).path).toList();
-      self.response
-          ..write(JSON.encode(files))
-          ..close();
-    });
-  }
-
-  handleProjectRequest() {
-    Map<String, String> parameters = request.uri.queryParameters;
-    for (ProjectCommand command in COMMANDS) {
-      if (parameters.containsKey(command.name)) {
-        if (validate(parameters, command.rules)) {
-          (command.handle)(this);
-        }
-        return;
-      }
-    }
-    String commands = COMMANDS.map((c) => c.name).join("', '");
-    badRequest("Valid commands are: '$commands'");
-  }
-
-  handle() {
-    response.done
-      .then(onClosed)
-      .catchError(onError);
-
-    Uri uri = request.uri;
-    if (uri.path == PROJECT_PATH) {
-      return handleProjectRequest();
-    }
-    if (uri.path.endsWith('/')) {
-      uri = uri.resolve('index.html');
-    }
-    if (uri.path == '/css/fonts/fontawesome-webfont.woff') {
-      uri = uri.resolve('/fontawesome-webfont.woff');
-    }
-    if (uri.path.contains('..') || uri.path.contains('%')) {
-      return notFound(uri.path);
-    }
-    String path = uri.path;
-    Uri root = documentRoot;
-    String dartType = 'application/dart';
-    if (path.startsWith('/project/packages/')) {
-      root = packageRoot;
-      path = path.substring('/project/packages'.length);
-    } else if (path.startsWith('${PROJECT_PATH}/')) {
-      root = projectRoot;
-      path = path.substring(PROJECT_PATH.length);
-      dartType = 'text/plain';
-    } else if (path.startsWith('${PACKAGES_PATH}/')) {
-      root = packageRoot;
-      path = path.substring(PACKAGES_PATH.length);
-    }
-    var f = new File(root.resolve('.$path').toFilePath());
-    f.exists().then((bool exists) {
-      if (!exists) return notFound(path);
-      if (path.endsWith('.html')) {
-        response.headers.set(CONTENT_TYPE, 'text/html');
-      } else if (path.endsWith('.dart')) {
-        response.headers.set(CONTENT_TYPE, dartType);
-      } else if (path.endsWith('.js')) {
-        response.headers.set(CONTENT_TYPE, 'application/javascript');
-      } else if (path.endsWith('.ico')) {
-        response.headers.set(CONTENT_TYPE, 'image/x-icon');
-      } else if (path.endsWith('.appcache')) {
-        response.headers.set(CONTENT_TYPE, 'text/cache-manifest');
-      }
-      f.openRead().pipe(response).catchError(onError);
-    });
-  }
-
-  static onRequest(HttpRequest request) {
-    new Conversation(request, request.response).handle();
-  }
-
-  static onError(error) {
-    if (error is HttpException) {
-      print('Error: ${error.message}');
-    } else {
-      print('Error: ${error}');
-    }
-  }
-
-  String htmlInfo(String title, String text) {
-    // No script injection, please.
-    title = const HtmlEscape().convert(title);
-    text = const HtmlEscape().convert(text);
-    return """
-<!DOCTYPE html>
-<html lang='en'>
-<head>
-<title>$title</title>
-</head>
-<body>
-<h1>$title</h1>
-<p>$text</p>
-</body>
-</html>
-""";
-  }
-}
-
-main(List<String> arguments) {
-  if (arguments.length > 0) {
-    Conversation.documentRoot = Uri.base.resolve(arguments[0]);
-  }
-  var host = '127.0.0.1';
-  if (arguments.length > 1) {
-    host = arguments[1];
-  }
-  int port = 0;
-  if (arguments.length > 2) {
-    port = int.parse(arguments[2]);
-  }
-  if (arguments.length > 3) {
-    Conversation.projectRoot = Uri.base.resolve(arguments[3]);
-  }
-  if (arguments.length > 4) {
-    Conversation.packageRoot = Uri.base.resolve(arguments[4]);
-  }
-  HttpServer.bind(host, port).then((HttpServer server) {
-    print('HTTP server started on http://$host:${server.port}/');
-    server.listen(Conversation.onRequest, onError: Conversation.onError);
-  }).catchError((e) {
-    print("HttpServer.bind error: $e");
-    exit(1);
-  });
-}
diff --git a/sdk/lib/_internal/lib/collection_patch.dart b/sdk/lib/_internal/lib/collection_patch.dart
index 192dfd3..a7e7ee2 100644
--- a/sdk/lib/_internal/lib/collection_patch.dart
+++ b/sdk/lib/_internal/lib/collection_patch.dart
@@ -4,6 +4,7 @@
 
 // Patch file for dart:collection classes.
 import 'dart:_foreign_helper' show JS;
+import 'dart:_js_helper' show fillLiteralMap, NoInline;
 
 patch class HashMap<K, V> {
   patch factory HashMap({ bool equals(K key1, K key2),
@@ -488,6 +489,18 @@
   }
 
   patch factory LinkedHashMap.identity() = _LinkedIdentityHashMap<K, V>;
+
+  // Private factory constructor called by generated code for map literals.
+  @NoInline()
+  factory LinkedHashMap._literal(List keyValuePairs) {
+    return fillLiteralMap(keyValuePairs, new _LinkedHashMap<K, V>());
+  }
+
+  // Private factory constructor called by generated code for map literals.
+  @NoInline()
+  factory LinkedHashMap._empty() {
+    return new _LinkedHashMap<K, V>();
+  }
 }
 
 class _LinkedHashMap<K, V> implements LinkedHashMap<K, V> {
diff --git a/sdk/lib/_internal/lib/core_patch.dart b/sdk/lib/_internal/lib/core_patch.dart
index 30aa9264..926b779 100644
--- a/sdk/lib/_internal/lib/core_patch.dart
+++ b/sdk/lib/_internal/lib/core_patch.dart
@@ -219,6 +219,10 @@
     return Primitives.stringFromCharCodes(charCodes);
   }
 
+  patch factory String.fromCharCode(int charCode) {
+    return Primitives.stringFromCharCode(charCode);
+  }
+
   patch factory String.fromEnvironment(String name, {String defaultValue}) {
     throw new UnsupportedError(
         'String.fromEnvironment can only be used as a const constructor');
diff --git a/sdk/lib/_internal/lib/foreign_helper.dart b/sdk/lib/_internal/lib/foreign_helper.dart
index cfaa701..febc75f 100644
--- a/sdk/lib/_internal/lib/foreign_helper.dart
+++ b/sdk/lib/_internal/lib/foreign_helper.dart
@@ -279,3 +279,12 @@
   final String code;
   const JS_CONST(this.code);
 }
+
+/**
+ * JavaScript string concatenation. Inputs must be Strings.  Corresponds to the
+ * HStringConcat SSA instruction and may be constant-folded.
+ */
+String JS_STRING_CONCAT(String a, String b) {
+  // This body is unused, only here for type analysis.
+  return JS('String', '# + #', a, b);
+}
diff --git a/sdk/lib/_internal/lib/interceptors.dart b/sdk/lib/_internal/lib/interceptors.dart
index 2823455..05af57e 100644
--- a/sdk/lib/_internal/lib/interceptors.dart
+++ b/sdk/lib/_internal/lib/interceptors.dart
@@ -30,7 +30,8 @@
                               StringMatch,
                               firstMatchAfter,
                               NoInline;
-import 'dart:_foreign_helper' show JS, JS_EFFECT, JS_INTERCEPTOR_CONSTANT;
+import 'dart:_foreign_helper' show
+    JS, JS_EFFECT, JS_INTERCEPTOR_CONSTANT, JS_STRING_CONCAT;
 import 'dart:math' show Random;
 
 part 'js_array.dart';
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index 1ee856e..58ab7a9 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -38,6 +38,7 @@
     JS_OPERATOR_AS_PREFIX,
     JS_OPERATOR_IS_PREFIX,
     JS_SIGNATURE_NAME,
+    JS_STRING_CONCAT,
     RAW_DART_FUNCTION_REF;
 
 import 'dart:_interceptors';
@@ -149,8 +150,7 @@
 
   List get positionalArguments {
     if (isGetter) return const [];
-    var argumentCount =
-        _arguments.length - _namedArgumentNames.length;
+    var argumentCount = _arguments.length - _namedArgumentNames.length;
     if (argumentCount == 0) return const [];
     var list = [];
     for (var index = 0 ; index < argumentCount ; index++) {
@@ -273,6 +273,7 @@
                    this.cachedInterceptor);
 
   bool get isNoSuchMethod => false;
+  bool get isGetterStub => JS("bool", "!!#.\$getterStub", jsFunction);
 
   /// Applies [jsFunction] to [victim] with [arguments].
   /// Users of this class must take care to check the arguments first.
@@ -298,6 +299,8 @@
       : info = new ReflectionInfo(jsFunction),
         super(name, jsFunction, isIntercepted, cachedInterceptor);
 
+  bool get isGetterStub => false;
+
   invokeOn(Object victim, List arguments) {
     var receiver = victim;
     int providedArgumentCount;
@@ -349,6 +352,7 @@
   CachedNoSuchMethodInvocation(this.interceptor);
 
   bool get isNoSuchMethod => true;
+  bool get isGetterStub => false;
 
   invokeOn(Object victim, Invocation invocation) {
     var receiver = (interceptor == null) ? victim : interceptor;
@@ -771,8 +775,23 @@
     return _fromCharCodeApply(charCodes);
   }
 
+  static String stringFromCharCode(charCode) {
+    if (0 <= charCode) {
+      if (charCode <= 0xffff) {
+        return JS('String', 'String.fromCharCode(#)', charCode);
+      }
+      if (charCode <= 0x10ffff) {
+        var bits = charCode - 0x10000;
+        var low = 0xDC00 | (bits & 0x3ff);
+        var high = 0xD800 | (bits >> 10);
+        return  JS('String', 'String.fromCharCode(#, #)', high, low);
+      }
+    }
+    throw new RangeError.range(charCode, 0, 0x10ffff);
+  }
+
   static String stringConcatUnchecked(String string1, String string2) {
-    return JS('String', r'# + #', string1, string2);
+    return JS_STRING_CONCAT(string1, string2);
   }
 
   static String getTimeZoneName(receiver) {
@@ -959,7 +978,8 @@
       });
     }
 
-    String selectorName = 'call\$$argumentCount$names';
+    String selectorName =
+      '${JS_GET_NAME("CALL_PREFIX")}\$$argumentCount$names';
 
     return function.noSuchMethod(
         createUnmangledInvocationMirror(
@@ -1032,7 +1052,7 @@
       arguments.addAll(positionalArguments);
     }
 
-    String selectorName = 'call\$$argumentCount';
+    String selectorName = '${JS_GET_NAME("CALL_PREFIX")}\$$argumentCount';
     var jsFunction = JS('var', '#[#]', function, selectorName);
     if (jsFunction == null) {
 
@@ -1184,6 +1204,7 @@
  * The code in [unwrapException] deals with getting the original Dart
  * object out of the wrapper again.
  */
+@NoInline()
 wrapException(ex) {
   if (ex == null) ex = new NullThrownError();
   var wrapper = JS('', 'new Error()');
@@ -1792,10 +1813,6 @@
  * Called by generated code to build a map literal. [keyValuePairs] is
  * a list of key, value, key, value, ..., etc.
  */
-makeLiteralMap(keyValuePairs) {
-  return fillLiteralMap(keyValuePairs, new LinkedHashMap());
-}
-
 fillLiteralMap(keyValuePairs, Map result) {
   // TODO(johnniwinther): Use JSArray to optimize this code instead of calling
   // [getLength] and [getIndex].
diff --git a/sdk/lib/_internal/lib/js_mirrors.dart b/sdk/lib/_internal/lib/js_mirrors.dart
index f42ea42..1036bfd 100644
--- a/sdk/lib/_internal/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/lib/js_mirrors.dart
@@ -341,7 +341,13 @@
       // TODO(ahe): What receiver to use?
       throw new NoSuchMethodError(this, fieldName, [], null);
     }
-    return reflect(mirror._getField(this));
+    if (mirror is! MethodMirror) return reflect(mirror._getField(this));
+    JsMethodMirror methodMirror = mirror;
+    if (methodMirror.isGetter) return reflect(mirror._getField(this));
+    assert(methodMirror.isRegularMethod);
+    var getter = JS("", "#['\$getter']", methodMirror._jsFunction);
+    if (getter == null) throw new UnimplementedError();
+    return reflect(JS("", "#()", getter));
   }
 
   InstanceMirror invoke(Symbol memberName,
@@ -351,15 +357,20 @@
       throw new UnsupportedError('Named arguments are not implemented.');
     }
     JsDeclarationMirror mirror = __members[memberName];
-    if (mirror == null) {
+
+    if (mirror is JsMethodMirror && !mirror.canInvokeReflectively()) {
+      throwInvalidReflectionError(n(memberName));
+    }
+    if (mirror == null || mirror is JsMethodMirror && mirror.isSetter) {
       // TODO(ahe): What receiver to use?
       throw new NoSuchMethodError(
           this, memberName, positionalArguments, namedArguments);
     }
-    if (mirror is JsMethodMirror && !mirror.canInvokeReflectively()) {
-      throwInvalidReflectionError(n(memberName));
+    if (mirror is JsMethodMirror && !mirror.isGetter) {
+      return reflect(mirror._invoke(positionalArguments, namedArguments));
     }
-    return reflect(mirror._invoke(positionalArguments, namedArguments));
+    return getField(memberName)
+        .invoke(#call, positionalArguments, namedArguments);
   }
 
   _loadField(String name) {
@@ -387,7 +398,7 @@
       var jsFunction = JS('', '#[#]', _globalObject, name);
       String unmangledName = mangledGlobalNames[name];
       if (unmangledName == null ||
-          JS('bool', "!!#['getterStub']", jsFunction)) {
+          JS('bool', "!!#['\$getterStub']", jsFunction)) {
         // If there is no unmangledName, [jsFunction] is either a synthetic
         // implementation detail, or something that is excluded
         // by @MirrorsUsed.
@@ -816,61 +827,61 @@
   InstanceMirror invoke(Symbol memberName,
                         List positionalArguments,
                         [Map<Symbol,dynamic> namedArguments]) {
-    String name = n(memberName);
-    String reflectiveName;
-    if (namedArguments != null && !namedArguments.isEmpty) {
-      var interceptor = getInterceptor(reflectee);
-
-      var jsFunction = JS('', '#[# + "*"]', interceptor, name);
-      if (jsFunction == null) {
-        // TODO(ahe): Invoke noSuchMethod.
-        throw new UnimplementedNoSuchMethodError(
-            'Invoking noSuchMethod with named arguments not implemented');
-      }
-      ReflectionInfo info = new ReflectionInfo(jsFunction);
-      if (jsFunction == null) {
-        // TODO(ahe): Invoke noSuchMethod.
-        throw new UnimplementedNoSuchMethodError(
-            'Invoking noSuchMethod with named arguments not implemented');
-      }
-
-      positionalArguments = new List.from(positionalArguments);
-      // Check the number of positional arguments is valid.
-      if (info.requiredParameterCount != positionalArguments.length) {
-        // TODO(ahe): Invoke noSuchMethod.
-        throw new UnimplementedNoSuchMethodError(
-            'Invoking noSuchMethod with named arguments not implemented');
-      }
-      var defaultArguments = new Map();
-      for (int i = 0; i < info.optionalParameterCount; i++) {
-        var parameterName = info.parameterName(i + info.requiredParameterCount);
-        var defaultValue =
-            getMetadata(info.defaultValue(i + info.requiredParameterCount));
-        defaultArguments[parameterName] = defaultValue;
-      }
-      namedArguments.forEach((Symbol symbol, value) {
-        String parameter = n(symbol);
-        if (defaultArguments.containsKey(parameter)) {
-          defaultArguments[parameter] = value;
-        } else {
-          // Extraneous named argument.
-          // TODO(ahe): Invoke noSuchMethod.
-          throw new UnimplementedNoSuchMethodError(
-              'Invoking noSuchMethod with named arguments not implemented');
-        }
-      });
-      positionalArguments.addAll(defaultArguments.values);
-      // TODO(ahe): Handle intercepted methods.
-      return reflect(
-          JS('', '#.apply(#, #)', jsFunction, reflectee, positionalArguments));
-    } else {
-      reflectiveName =
-          JS('String', '# + ":" + # + ":0"', name, positionalArguments.length);
-    }
+    if (namedArguments == null) namedArguments = const {};
     // We can safely pass positionalArguments to _invoke as it will wrap it in
     // a JSArray if needed.
-    return _invoke(memberName, JSInvocationMirror.METHOD, reflectiveName,
-                   positionalArguments);
+    return _invoke(memberName, JSInvocationMirror.METHOD,
+                   positionalArguments, namedArguments);
+  }
+
+  InstanceMirror _invokeMethodWithNamedArguments(
+      String reflectiveName,
+      List positionalArguments, Map<Symbol,dynamic> namedArguments) {
+    assert(namedArguments.isNotEmpty);
+    var interceptor = getInterceptor(reflectee);
+
+    var jsFunction = JS('', '#[#]', interceptor, reflectiveName);
+    if (jsFunction == null) {
+      // TODO(ahe): Invoke noSuchMethod.
+      throw new UnimplementedNoSuchMethodError(
+          'Invoking noSuchMethod with named arguments not implemented');
+    }
+    ReflectionInfo info = new ReflectionInfo(jsFunction);
+    if (jsFunction == null) {
+      // TODO(ahe): Invoke noSuchMethod.
+      throw new UnimplementedNoSuchMethodError(
+          'Invoking noSuchMethod with named arguments not implemented');
+    }
+
+    positionalArguments = new List.from(positionalArguments);
+    // Check the number of positional arguments is valid.
+    if (info.requiredParameterCount != positionalArguments.length) {
+      // TODO(ahe): Invoke noSuchMethod.
+      throw new UnimplementedNoSuchMethodError(
+          'Invoking noSuchMethod with named arguments not implemented');
+    }
+    var defaultArguments = new Map();
+    for (int i = 0; i < info.optionalParameterCount; i++) {
+      var parameterName = info.parameterName(i + info.requiredParameterCount);
+      var defaultValue =
+          getMetadata(info.defaultValue(i + info.requiredParameterCount));
+      defaultArguments[parameterName] = defaultValue;
+    }
+    namedArguments.forEach((Symbol symbol, value) {
+      String parameter = n(symbol);
+      if (defaultArguments.containsKey(parameter)) {
+        defaultArguments[parameter] = value;
+      } else {
+        // Extraneous named argument.
+        // TODO(ahe): Invoke noSuchMethod.
+        throw new UnimplementedNoSuchMethodError(
+            'Invoking noSuchMethod with named arguments not implemented');
+      }
+    });
+    positionalArguments.addAll(defaultArguments.values);
+    // TODO(ahe): Handle intercepted methods.
+    return reflect(
+        JS('', '#.apply(#, #)', jsFunction, reflectee, positionalArguments));
   }
 
   /// Grabs hold of the class-specific invocation cache for the reflectee.
@@ -888,55 +899,94 @@
     return cache;
   }
 
-  /// Invoke the member specified through name and type on the reflectee.
-  /// As a side-effect, this populates the class-specific invocation cache
-  /// for the reflectee.
-  InstanceMirror _invoke(Symbol name,
-                         int type,
-                         String reflectiveName,
-                         List arguments) {
+  String _computeReflectiveName(Symbol symbolName, int type,
+                                List positionalArguments,
+                                Map<Symbol, dynamic> namedArguments) {
+    String name = n(symbolName);
+    switch (type) {
+      case JSInvocationMirror.GETTER: return name;
+      case JSInvocationMirror.SETTER: return '$name=';
+      case JSInvocationMirror.METHOD:
+        if (namedArguments.isNotEmpty) return '$name*';
+        int nbArgs = positionalArguments.length as int;
+        return "$name:$nbArgs:0";
+    }
+    throw new RuntimeError("Could not compute reflective name for $name");
+  }
+
+  /**
+   * Returns a `CachedInvocation` or `CachedNoSuchMethodInvocation` for the
+   * given member.
+   *
+   * Caches the result.
+   */
+  _getCachedInvocation(Symbol name, int type, String reflectiveName,
+      List positionalArguments, Map<Symbol,dynamic> namedArguments) {
+
     var cache = _classInvocationCache;
     var cacheEntry = JsCache.fetch(cache, reflectiveName);
     var result;
-    Invocation invocation;
     if (cacheEntry == null) {
       disableTreeShaking();
       String mangledName = reflectiveNames[reflectiveName];
       List<String> argumentNames = const [];
-      if (type == JSInvocationMirror.METHOD) {
-        // Note: [argumentNames] are not what the user actually provided, it is
-        // always all the named parameters.
-        argumentNames = reflectiveName.split(':').skip(3).toList();
-      }
 
       // TODO(ahe): We don't need to create an invocation mirror here. The
       // logic from JSInvocationMirror.getCachedInvocation could easily be
       // inlined here.
-      invocation = createUnmangledInvocationMirror(
-          name, mangledName, type, arguments, argumentNames);
+      Invocation invocation = createUnmangledInvocationMirror(
+          name, mangledName, type, positionalArguments, argumentNames);
 
       cacheEntry =
           JSInvocationMirror.getCachedInvocation(invocation, reflectee);
       JsCache.update(cache, reflectiveName, cacheEntry);
     }
+    return cacheEntry;
+  }
+
+  /// Invoke the member specified through name and type on the reflectee.
+  /// As a side-effect, this populates the class-specific invocation cache
+  /// for the reflectee.
+  InstanceMirror _invoke(Symbol name,
+                         int type,
+                         List positionalArguments,
+                         Map<Symbol,dynamic> namedArguments) {
+    String reflectiveName =
+        _computeReflectiveName(name, type, positionalArguments, namedArguments);
+
+    if (namedArguments.isNotEmpty) {
+      // TODO(floitsch): first, make sure it's not a getter.
+      return _invokeMethodWithNamedArguments(
+          reflectiveName, positionalArguments, namedArguments);
+    }
+    var cacheEntry = _getCachedInvocation(
+        name, type, reflectiveName, positionalArguments, namedArguments);
+
     if (cacheEntry.isNoSuchMethod) {
-      if (invocation == null) {
-        String mangledName = reflectiveNames[reflectiveName];
-        // TODO(ahe): Get the argument names.
-        List<String> argumentNames = [];
-        invocation = createUnmangledInvocationMirror(
-            name, mangledName, type, arguments, argumentNames);
+      // Could be that we want to invoke a getter, or get a method.
+      if (type == JSInvocationMirror.METHOD && _instanceFieldExists(name)) {
+        return getField(name).invoke(
+            #call, positionalArguments, namedArguments);
       }
+
+      if (type == JSInvocationMirror.SETTER) {
+        // For setters we report the setter name "field=".
+        name = s("${n(name)}=");
+      }
+
+      String mangledName = reflectiveNames[reflectiveName];
+      // TODO(ahe): Get the argument names.
+      List<String> argumentNames = [];
+      Invocation invocation = createUnmangledInvocationMirror(
+          name, mangledName, type, positionalArguments, argumentNames);
       return reflect(cacheEntry.invokeOn(reflectee, invocation));
     } else {
-      return reflect(cacheEntry.invokeOn(reflectee, arguments));
+      return reflect(cacheEntry.invokeOn(reflectee, positionalArguments));
     }
   }
 
   InstanceMirror setField(Symbol fieldName, Object arg) {
-    String reflectiveName = '${n(fieldName)}=';
-    _invoke(
-        s(reflectiveName), JSInvocationMirror.SETTER, reflectiveName, [arg]);
+    _invoke(fieldName, JSInvocationMirror.SETTER, [arg], const {});
     return reflect(arg);
   }
 
@@ -964,6 +1014,15 @@
   /// engine to speed up cache probing.
   var _getterCache = 4;
 
+  bool _instanceFieldExists(Symbol name) {
+    int getterType = JSInvocationMirror.GETTER;
+    String getterName =
+        _computeReflectiveName(name, getterType, const [], const {});
+    var getterCacheEntry = _getCachedInvocation(
+        name, getterType, getterName, const [], const {});
+    return !getterCacheEntry.isNoSuchMethod && !getterCacheEntry.isGetterStub;
+  }
+
   InstanceMirror getField(Symbol fieldName) {
     // BUG(16400): This should be a labelled block, but that makes
     // dart2js crash when merging locals information in the type
@@ -996,8 +1055,9 @@
   InstanceMirror _getFieldSlow(Symbol fieldName) {
     // First do the slow-case getter invocation. As a side-effect of this,
     // the invocation cache is filled in so we can query it afterwards.
+    var result =
+        _invoke(fieldName, JSInvocationMirror.GETTER, const [], const {});
     String name = n(fieldName);
-    var result = _invoke(fieldName, JSInvocationMirror.GETTER, name, const []);
     var cacheEntry = JsCache.fetch(_classInvocationCache, name);
     if (cacheEntry.isNoSuchMethod) {
       return result;
@@ -1723,6 +1783,13 @@
     throw new NoSuchMethodError(this, setterSymbol(fieldName), [arg], null);
   }
 
+  bool _staticFieldExists(Symbol fieldName) {
+    JsVariableMirror mirror = __variables[fieldName];
+    if (mirror != null) return mirror.isStatic;
+    JsMethodMirror getter = __getters[fieldName];
+    return getter != null && getter.isStatic;
+  }
+
   InstanceMirror getField(Symbol fieldName) {
     JsVariableMirror mirror = __variables[fieldName];
     if (mirror != null && mirror.isStatic) {
@@ -1739,6 +1806,21 @@
         return reflect(JS('', '#[#]', JS_CURRENT_ISOLATE(), jsName));
       }
     }
+    JsMethodMirror getter = __getters[fieldName];
+    if (getter != null && getter.isStatic) {
+      return reflect(getter._invoke(const [], const {}));
+    }
+    // If the fieldName designates a static function we have to return
+    // its closure.
+    JsMethodMirror method = __methods[fieldName];
+    if (method != null && method.isStatic) {
+      // We invoke the same getter that Dart code would execute. During
+      // initialization we have stored that getter on the function (so that
+      // we can find it more easily here).
+      var getter = JS("", "#['\$getter']", method._jsFunction);
+      if (getter == null) throw new UnimplementedError();
+      return reflect(JS("", "#()", getter));
+    }
     // TODO(ahe): What receiver to use?
     throw new NoSuchMethodError(this, fieldName, null, null);
   }
@@ -1839,6 +1921,11 @@
       throw new UnsupportedError('Named arguments are not implemented.');
     }
     JsMethodMirror mirror = __methods[memberName];
+
+    if (mirror == null && _staticFieldExists(memberName)) {
+      return getField(memberName)
+          .invoke(#call, positionalArguments, namedArguments);
+    }
     if (mirror == null || !mirror.isStatic) {
       // TODO(ahe): What receiver to use?
       throw new NoSuchMethodError(
@@ -2048,14 +2135,17 @@
     if (cachedFunction != null) return cachedFunction;
     disableTreeShaking();
     // TODO(ahe): What about optional parameters (named or not).
+    String callPrefix = "${JS_GET_NAME("CALL_PREFIX")}\$";
     var extractCallName = JS('', r'''
 function(reflectee) {
   for (var property in reflectee) {
-    if ("call$" == property.substring(0, 5)) return property;
+    if (# == property.substring(0, #) &&
+        property[#] >= '0' &&
+        property[#] <= '9') return property;
   }
   return null;
 }
-''');
+''', callPrefix, callPrefix.length, callPrefix.length, callPrefix.length);
     String callName = JS('String|Null', '#(#)', extractCallName, reflectee);
     if (callName == null) {
       throw new RuntimeError('Cannot find callName on "$reflectee"');
@@ -2773,7 +2863,6 @@
 
   Iterable<V> get values => _source.values;
 
-
   void operator []=(K key, V value) => _throw();
 
   V putIfAbsent(K key, V ifAbsent()) { _throw(); }
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart b/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
index 608eaa7..e6e030d 100644
--- a/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
@@ -19,7 +19,7 @@
   port.listen((wrappedMessage) {
     respond(wrappedMessage, (message) {
       if (message['type'] == 'isPrimary') {
-        return transformer.isPrimary(deserializeAsset(message['asset']));
+        return transformer.isPrimary(deserializeId(message['id']));
       } else {
         assert(message['type'] == 'apply');
 
diff --git a/sdk/lib/_internal/pub/bin/pub.dart b/sdk/lib/_internal/pub/bin/pub.dart
index 8d06b80..4d19e8e 100644
--- a/sdk/lib/_internal/pub/bin/pub.dart
+++ b/sdk/lib/_internal/pub/bin/pub.dart
@@ -6,6 +6,7 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
+import 'package:http/http.dart' as http;
 import 'package:path/path.dart' as path;
 import 'package:stack_trace/stack_trace.dart';
 
@@ -136,7 +137,7 @@
 /// Returns the appropriate exit code for [exception], falling back on 1 if no
 /// appropriate exit code could be found.
 int chooseExitCode(exception) {
-  if (exception is HttpException || exception is HttpException ||
+  if (exception is HttpException || exception is http.ClientException ||
       exception is SocketException || exception is PubHttpException) {
     return exit_codes.UNAVAILABLE;
   } else if (exception is FormatException || exception is DataException) {
diff --git a/sdk/lib/_internal/pub/lib/src/ascii_tree.dart b/sdk/lib/_internal/pub/lib/src/ascii_tree.dart
new file mode 100644
index 0000000..d197df1
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/ascii_tree.dart
@@ -0,0 +1,168 @@
+// 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.
+
+/// A simple library for rendering tree-like structures in ASCII.
+library pub.ascii_tree;
+
+import 'package:path/path.dart' as path;
+
+import 'log.dart' as log;
+import 'utils.dart';
+
+/// Draws a tree for the given list of files. Given files like:
+///
+///     TODO
+///     example/console_example.dart
+///     example/main.dart
+///     example/web copy/web_example.dart
+///     test/absolute_test.dart
+///     test/basename_test.dart
+///     test/dirname_test.dart
+///     test/extension_test.dart
+///     test/is_absolute_test.dart
+///     test/is_relative_test.dart
+///     test/join_test.dart
+///     test/normalize_test.dart
+///     test/relative_test.dart
+///     test/split_test.dart
+///     .gitignore
+///     README.md
+///     lib/path.dart
+///     pubspec.yaml
+///     test/all_test.dart
+///     test/path_posix_test.dart
+///     test/path_windows_test.dart
+///
+/// this renders:
+///
+///     |-- .gitignore
+///     |-- README.md
+///     |-- TODO
+///     |-- example
+///     |   |-- console_example.dart
+///     |   |-- main.dart
+///     |   '-- web copy
+///     |       '-- web_example.dart
+///     |-- lib
+///     |   '-- path.dart
+///     |-- pubspec.yaml
+///     '-- test
+///         |-- absolute_test.dart
+///         |-- all_test.dart
+///         |-- basename_test.dart
+///         | (7 more...)
+///         |-- path_windows_test.dart
+///         |-- relative_test.dart
+///         '-- split_test.dart
+///
+/// If [baseDir] is passed, it will be used as the root of the tree.
+///
+/// If [showAllChildren] is `false`, then directories with more than ten items
+/// will have their contents truncated. Defaults to `false`.
+String fromFiles(List<String> files, {String baseDir, bool showAllChildren}) {
+  // Parse out the files into a tree of nested maps.
+  var root = {};
+  for (var file in files) {
+    if (baseDir != null) file = path.relative(file, from: baseDir);
+    var parts = path.split(file);
+    var directory = root;
+    for (var part in path.split(file)) {
+      directory = directory.putIfAbsent(part, () => {});
+    }
+  }
+
+  // Walk the map recursively and render to a string.
+  return fromMap(root, showAllChildren: showAllChildren);
+}
+
+/// Draws a tree from a nested map. Given a map like:
+///
+///     {
+///       "analyzer": {
+///         "args": {
+///           "collection": ""
+///         },
+///         "logging": {}
+///       },
+///       "barback": {}
+///     }
+///
+/// this renders:
+///
+///     analyzer
+///     |-- args
+///     |   '-- collection
+///     '---logging
+///     barback
+///
+/// Items with no children should have an empty map as the value.
+///
+/// If [showAllChildren] is `false`, then directories with more than ten items
+/// will have their contents truncated. Defaults to `false`.
+String fromMap(Map map, {bool showAllChildren}) {
+  var buffer = new StringBuffer();
+  _draw(buffer, "", null, map, showAllChildren: showAllChildren);
+  return buffer.toString();
+}
+
+void _drawLine(StringBuffer buffer, String prefix, bool isLastChild,
+               String name) {
+  // Print lines.
+  buffer.write(prefix);
+  if (name != null) {
+    if (isLastChild) {
+      buffer.write(log.gray("'-- "));
+    } else {
+      buffer.write(log.gray("|-- "));
+    }
+  }
+
+  // Print name.
+  buffer.writeln(name);
+}
+
+String _getPrefix(bool isRoot, bool isLast) {
+  if (isRoot) return "";
+  if (isLast) return "    ";
+  return log.gray("|   ");
+}
+
+void _draw(StringBuffer buffer, String prefix, String name, Map children,
+           {bool showAllChildren, bool isLast: false}) {
+  if (showAllChildren == null) showAllChildren = false;
+
+  // Don't draw a line for the root node.
+  if (name != null) _drawLine(buffer, prefix, isLast, name);
+
+  // Recurse to the children.
+  var childNames = ordered(children.keys);
+
+  drawChild(bool isLastChild, String child) {
+    var childPrefix = _getPrefix(name == null, isLast);
+    _draw(buffer, '$prefix$childPrefix', child, children[child],
+        showAllChildren: showAllChildren, isLast: isLastChild);
+  }
+
+  if (name == null || showAllChildren || childNames.length <= 10) {
+    // Not too many, so show all the children.
+    for (var i = 0; i < childNames.length; i++) {
+      drawChild(i == childNames.length - 1, childNames[i]);
+    }
+  } else {
+    // Show the first few.
+    drawChild(false, childNames[0]);
+    drawChild(false, childNames[1]);
+    drawChild(false, childNames[2]);
+
+    // Elide the middle ones.
+    buffer.write(prefix);
+    buffer.write(_getPrefix(name == null, isLast));
+    buffer.writeln(log.gray('| (${childNames.length - 6} more...)'));
+
+    // Show the last few.
+    drawChild(false, childNames[childNames.length - 3]);
+    drawChild(false, childNames[childNames.length - 2]);
+    drawChild(true, childNames[childNames.length - 1]);
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback.dart b/sdk/lib/_internal/pub/lib/src/barback.dart
index 1c70356..02cd3a1 100644
--- a/sdk/lib/_internal/pub/lib/src/barback.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback.dart
@@ -31,7 +31,7 @@
 ///
 /// Whenever a new non-patch version of barback is published, this *must* be
 /// incremented to synchronize with that.
-final supportedVersions = new VersionConstraint.parse(">=0.11.0 <0.13.0");
+final supportedVersions = new VersionConstraint.parse(">=0.13.0-dev <0.14.0");
 
 /// A list of the names of all built-in transformers that pub exposes.
 const _BUILT_IN_TRANSFORMERS = const ['\$dart2js'];
diff --git a/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart b/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart
index bae6e80..611d62f 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart
@@ -17,7 +17,6 @@
 import '../utils.dart';
 import 'base_server.dart';
 import 'build_environment.dart';
-import 'old_web_socket_api.dart';
 
 /// Callback for determining if an asset with [id] should be served or not.
 typedef bool AllowAsset(AssetId id);
@@ -95,13 +94,6 @@
 
   /// Handles an HTTP request.
   void handleRequest(HttpRequest request) {
-    // TODO(rnystrom): Remove this when the Editor is using the admin server.
-    // port. See #17640.
-    if (WebSocketTransformer.isUpgradeRequest(request)) {
-      _handleWebSocket(request);
-      return;
-    }
-
     if (request.method != "GET" && request.method != "HEAD") {
       methodNotAllowed(request);
       return;
@@ -113,13 +105,15 @@
     } on FormatException catch (ex) {
       // If we got here, we had a path like "/packages" which is a special
       // directory, but not a valid path since it lacks a following package name.
-      notFound(request, ex.message);
+      notFound(request, error: ex.message);
       return;
     }
 
     // See if the asset should be blocked.
     if (allowAsset != null && !allowAsset(id)) {
-      notFound(request, "Asset $id is not available in this configuration.");
+      notFound(request,
+          error: "Asset $id is not available in this configuration.",
+          asset: id);
       return;
     }
 
@@ -156,24 +150,10 @@
       }
 
       addResult(new BarbackServerResult._failure(request.uri, id, error));
-      notFound(request, error);
+      notFound(request, asset: id);
     });
   }
 
-  // TODO(rnystrom): Remove this when the Editor is using the admin server.
-  // port. See #17640.
-  /// Creates a web socket for [request] which should be an upgrade request.
-  void _handleWebSocket(HttpRequest request) {
-    Chain.track(WebSocketTransformer.upgrade(request)).then((socket) {
-      _webSockets.add(socket);
-      var api = new OldWebSocketApi(socket, environment);
-
-      return api.listen().whenComplete(() {
-        _webSockets.remove(api);
-      });
-    }).catchError(addError);
-  }
-
   /// Serves the body of [asset] on [request]'s response stream.
   ///
   /// Returns a future that completes when the response has been succesfully
@@ -200,7 +180,7 @@
       if (error is FileSystemException) {
         // Assume this means the asset was a file-backed source asset
         // and we couldn't read it, so treat it like a missing asset.
-        notFound(request, error);
+        notFound(request, error: error.toString(), asset: asset.id);
         return;
       }
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback/base_server.dart b/sdk/lib/_internal/pub/lib/src/barback/base_server.dart
index df9fef3..dcf739d 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/base_server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/base_server.dart
@@ -5,8 +5,10 @@
 library pub.barback.base_server;
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:io';
 
+import 'package:barback/barback.dart';
 import 'package:stack_trace/stack_trace.dart';
 
 import '../log.dart' as log;
@@ -65,17 +67,41 @@
   }
 
   /// Responds to [request] with a 404 response and closes it.
-  void notFound(HttpRequest request, message) {
-    logRequest(request, "404 Not Found");
+  ///
+  /// If [asset] is given, it is the ID of the asset that couldn't be found.
+  void notFound(HttpRequest request, {String error, AssetId asset}) {
+    logRequest(request, "Not Found");
 
     // Force a UTF-8 encoding so that error messages in non-English locales are
     // sent correctly.
     request.response.headers.contentType =
-        ContentType.parse("text/plain; charset=utf-8");
-
+        ContentType.parse("text/html; charset=utf-8");
     request.response.statusCode = 404;
     request.response.reasonPhrase = "Not Found";
-    request.response.write(message);
+
+    // TODO(rnystrom): Apply some styling to make it visually clear that this
+    // error is coming from pub serve itself.
+    request.response.writeln("""
+        <!DOCTYPE html>
+        <head>
+        <title>404 Not Found</title>
+        </head>
+        <body>
+        <h1>404 Not Found</h1>""");
+
+    if (asset != null) {
+      request.response.writeln("<p>Could not find asset "
+          "<code>${HTML_ESCAPE.convert(asset.path)}</code> in package "
+          "<code>${HTML_ESCAPE.convert(asset.package)}</code>.</p>");
+    }
+
+    if (error != null) {
+      request.response.writeln("<p>Error: ${HTML_ESCAPE.convert(error)}</p>");
+    }
+
+    request.response.writeln("""
+        </body>""");
+
     request.response.close();
   }
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback/build_directory.dart b/sdk/lib/_internal/pub/lib/src/barback/build_directory.dart
index 19fd2ed..c01da04 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/build_directory.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/build_directory.dart
@@ -21,9 +21,18 @@
   /// The relative directory path within the package.
   final String directory;
 
+  /// The hostname to serve this directory on.
+  final String hostname;
+
+  /// The port to serve this directory on.
+  final int port;
+
   /// The server bound to this directory.
-  BarbackServer get server => _server;
-  BarbackServer _server;
+  ///
+  /// This is a future that will complete once [serve] has been called and the
+  /// server has been successfully spun up.
+  Future<BarbackServer> get server => _serverCompleter.future;
+  final _serverCompleter = new Completer<BarbackServer>();
 
   /// The subscription to the [DirectoryWatcher] used to watch this directory
   /// for changes.
@@ -31,26 +40,31 @@
   /// If the directory is not being watched, this will be `null`.
   StreamSubscription<WatchEvent> watchSubscription;
 
-  BuildDirectory(this._environment, this.directory);
+  BuildDirectory(this._environment, this.directory, this.hostname, this.port);
 
   /// Binds a server running on [hostname]:[port] to this directory.
-  Future<BarbackServer> serve(String hostname, int port) {
+  Future<BarbackServer> serve() {
     return BarbackServer.bind(_environment, hostname, port, directory)
-        .then((server) => _server = server);
+        .then((server) {
+      _serverCompleter.complete(server);
+      return server;
+    });
   }
 
   /// Removes the build directory from the build environment.
   ///
   /// Closes the server, removes the assets from barback, and stops watching it.
   Future close() {
-    var futures = [server.close()];
+    return server.then((server) {
+      var futures = [server.close()];
 
-    // Stop watching the directory.
-    if (watchSubscription != null) {
-      var cancel = watchSubscription.cancel();
-      if (cancel != null) futures.add(cancel);
-    }
+      // Stop watching the directory.
+      if (watchSubscription != null) {
+        var cancel = watchSubscription.cancel();
+        if (cancel != null) futures.add(cancel);
+      }
 
-    return Future.wait(futures);
+      return Future.wait(futures);
+    });
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart b/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
index b8bc065..a332dd5 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
@@ -163,28 +163,41 @@
     // See if there is already a server bound to the directory.
     var directory = _directories[rootDirectory];
     if (directory != null) {
-      log.fine('Already serving $rootDirectory on ${directory.server.url}.');
-      return new Future.value(directory.server);
+      return directory.server.then((server) {
+        log.fine('Already serving $rootDirectory on ${server.url}.');
+        return server;
+      });
+    }
+
+    // See if the new directory overlaps any existing servers.
+    var overlapping = _directories.keys.where((directory) =>
+        path.isWithin(directory, rootDirectory) ||
+        path.isWithin(rootDirectory, directory)).toList();
+
+    if (overlapping.isNotEmpty) {
+      return new Future.error(
+          new OverlappingSourceDirectoryException(overlapping));
     }
 
     var port = _basePort;
 
     // If not using an ephemeral port, find the lowest-numbered available one.
     if (port != 0) {
-      var boundPorts = _directories.values
-          .map((directory) => directory.server.port).toSet();
+      var boundPorts = _directories.values.map((directory) => directory.port)
+          .toSet();
       while (boundPorts.contains(port)) {
         port++;
       }
     }
 
-    var buildDirectory = new BuildDirectory(this, rootDirectory);
+    var buildDirectory = new BuildDirectory(
+        this, rootDirectory, _hostname, port);
     _directories[rootDirectory] = buildDirectory;
 
     return _provideDirectorySources(rootPackage, rootDirectory)
         .then((subscription) {
       buildDirectory.watchSubscription = subscription;
-      return buildDirectory.serve(_hostname, port);
+      return buildDirectory.serve();
     });
   }
 
@@ -198,12 +211,14 @@
     var directory = _directories.remove(rootDirectory);
     if (directory == null) return new Future.value();
 
-    var url = directory.server.url;
-    return directory.close().then((_) {
-      // Remove the sources from barback, unless some other build directory
-      // includes them.
-      return _removeDirectorySources(rootDirectory);
-    }).then((_) => url);
+    return directory.server.then((server) {
+      var url = server.url;
+      return directory.close().then((_) {
+        // Remove the sources from barback, unless some other build directory
+        // includes them.
+        return _removeDirectorySources(rootDirectory);
+      }).then((_) => url);
+    });
   }
 
   /// Gets the build directory that contains [assetPath] within the entrypoint
@@ -217,39 +232,45 @@
           .directory;
 
   /// Return all URLs serving [assetPath] in this environment.
-  List<Uri> getUrlsForAssetPath(String assetPath) {
+  Future<List<Uri>> getUrlsForAssetPath(String assetPath) {
     // Check the three (mutually-exclusive) places the path could be pointing.
-    var urls = _lookUpPathInServerRoot(assetPath);
-    if (urls.isEmpty) urls = _lookUpPathInPackagesDirectory(assetPath);
-    if (urls.isEmpty) urls = _lookUpPathInDependency(assetPath);
-    return urls.toList();
+    return _lookUpPathInServerRoot(assetPath).then((urls) {
+      if (urls.isNotEmpty) return urls;
+      return _lookUpPathInPackagesDirectory(assetPath);
+    }).then((urls) {
+      if (urls.isNotEmpty) return urls;
+      return _lookUpPathInDependency(assetPath);
+    });
   }
 
   /// Look up [assetPath] in the root directories of servers running in the
   /// entrypoint package.
-  Iterable<Uri> _lookUpPathInServerRoot(String assetPath) {
+  Future<List<Uri>> _lookUpPathInServerRoot(String assetPath) {
     // Find all of the servers whose root directories contain the asset and
     // generate appropriate URLs for each.
-    return _directories.values
+    return Future.wait(_directories.values
         .where((dir) => path.isWithin(dir.directory, assetPath))
         .map((dir) {
       var relativePath = path.relative(assetPath, from: dir.directory);
-      return dir.server.url.resolveUri(path.toUri(relativePath));
-    });
+      return dir.server.then((server) =>
+          server.url.resolveUri(path.toUri(relativePath)));
+    }));
   }
 
   /// Look up [assetPath] in the "packages" directory in the entrypoint package.
-  Iterable<Uri> _lookUpPathInPackagesDirectory(String assetPath) {
+  Future<List<Uri>> _lookUpPathInPackagesDirectory(String assetPath) {
     var components = path.split(path.relative(assetPath));
-    if (components.first != "packages") return [];
-    if (!graph.packages.containsKey(components[1])) return [];
-    return _directories.values.map((dir) =>
-        dir.server.url.resolveUri(path.toUri(assetPath)));
+    if (components.first != "packages") return new Future.value([]);
+    if (!graph.packages.containsKey(components[1])) return new Future.value([]);
+    return Future.wait(_directories.values.map((dir) {
+      return dir.server.then((server) =>
+          server.url.resolveUri(path.toUri(assetPath)));
+    }));
   }
 
   /// Look up [assetPath] in the "lib" or "asset" directory of a dependency
   /// package.
-  Iterable<Uri> _lookUpPathInDependency(String assetPath) {
+  Future<List<Uri>> _lookUpPathInDependency(String assetPath) {
     for (var package in graph.packages.values) {
       var libDir = path.join(package.dir, 'lib');
       var assetDir = path.join(package.dir, 'asset');
@@ -265,24 +286,28 @@
         continue;
       }
 
-      return _directories.values.map((dir) => dir.server.url.resolveUri(uri));
+      return Future.wait(_directories.values.map((dir) {
+        return dir.server.then((server) => server.url.resolveUri(uri));
+      }));
     }
 
-    return [];
+    return new Future.value([]);
   }
 
   /// Given a URL to an asset served by this environment, returns the ID of the
   /// asset that would be accessed by that URL.
   ///
-  /// If no server can serve [url], returns `null`.
-  AssetId getAssetIdForUrl(Uri url) {
-    var directory = _directories.values.firstWhere(
-        (dir) => dir.server.address.host == url.host &&
-            dir.server.port == url.port,
-        orElse: () => null);
-    if (directory == null) return null;
-
-    return directory.server.urlToId(url);
+  /// If no server can serve [url], completes to `null`.
+  Future<AssetId> getAssetIdForUrl(Uri url) {
+    return Future.wait(_directories.values.map((dir) => dir.server))
+        .then((servers) {
+      var server = servers.firstWhere(
+          (server) => server.address.host == url.host &&
+              server.port == url.port,
+          orElse: () => null);
+      if (server == null) return null;
+      return server.urlToId(url);
+    });
   }
 
   /// Determines if [sourcePath] is contained within any of the directories in
@@ -653,6 +678,16 @@
   }
 }
 
+/// Exception thrown when trying to serve a new directory that overlaps one or
+/// more directories already being served.
+class OverlappingSourceDirectoryException implements Exception {
+  /// The relative paths of the directories that overlap the one that could not
+  /// be served.
+  final List<String> overlappingDirectories;
+
+  OverlappingSourceDirectoryException(this.overlappingDirectories);
+}
+
 /// An enum describing different modes of constructing a [DirectoryWatcher].
 abstract class WatcherType {
   /// A watcher that automatically chooses its type based on the operating
diff --git a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
index 989f50f..71944d9 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
@@ -57,14 +57,44 @@
       : this.withSettings(environment, new BarbackSettings({}, mode));
 
   /// Only ".dart" entrypoint files within a buildable directory are processed.
-  Future<bool> isPrimary(Asset asset) {
-    if (asset.id.extension != ".dart") return new Future.value(false);
+  Future<bool> isPrimary(AssetId id) {
+    if (id.extension != ".dart") return new Future.value(false);
 
-    if (!["benchmark", "example", "test", "web"]
-        .any((dir) => asset.id.path.startsWith("$dir/"))) {
-      return new Future.value(false);
-    }
+    // These should only contain libraries. For efficiency's sake, we don't
+    // look for entrypoints in there.
+    return new Future.value(!["asset/", "lib/"].any(id.path.startsWith));
+  }
 
+  Future apply(Transform transform) {
+    // TODO(nweiz): If/when barback starts reporting what assets were modified,
+    // don't re-run the entrypoint detection logic unless the primary input was
+    // actually modified. See issue 16817.
+    return _isEntrypoint(transform.primaryInput).then((isEntrypoint) {
+      if (!isEntrypoint) return null;
+
+      // Wait for any ongoing apply to finish first.
+      return _pool.withResource(() {
+        transform.logger.info("Compiling ${transform.primaryInput.id}...");
+        var stopwatch = new Stopwatch()..start();
+        return _doCompilation(transform).then((_) {
+          stopwatch.stop();
+          transform.logger.info("Took ${stopwatch.elapsed} to compile "
+              "${transform.primaryInput.id}.");
+        });
+      });
+    });
+  }
+
+  Future declareOutputs(DeclaringTransform transform) {
+    var primaryId = transform.primaryId;
+    transform.declareOutput(primaryId.addExtension(".js"));
+    transform.declareOutput(primaryId.addExtension(".js.map"));
+    transform.declareOutput(primaryId.addExtension(".precompiled.js"));
+    return new Future.value();
+  }
+
+  /// Returns whether or not [asset] might be an entrypoint.
+  Future<bool> _isEntrypoint(Asset asset) {
     return asset.readAsString().then((code) {
       try {
         var name = asset.id.path;
@@ -82,59 +112,39 @@
     });
   }
 
-  Future apply(Transform transform) {
-    var stopwatch = new Stopwatch();
+  /// Run the dart2js compiler.
+  Future _doCompilation(Transform transform) {
+    var provider = new _BarbackCompilerProvider(_environment, transform,
+        generateSourceMaps: _settings.mode != BarbackMode.RELEASE);
 
-    // Wait for any ongoing apply to finish first.
-    return _pool.withResource(() {
-      transform.logger.info("Compiling ${transform.primaryInput.id}...");
-      stopwatch.start();
+    // Create a "path" to the entrypoint script. The entrypoint may not actually
+    // be on disk, but this gives dart2js a root to resolve relative paths
+    // against.
+    var id = transform.primaryInput.id;
 
-      var provider = new _BarbackCompilerProvider(_environment, transform,
-          generateSourceMaps: _settings.mode != BarbackMode.RELEASE);
+    var entrypoint = path.join(_environment.graph.packages[id.package].dir,
+        id.path);
 
-      // Create a "path" to the entrypoint script. The entrypoint may not
-      // actually be on disk, but this gives dart2js a root to resolve relative
-      // paths against.
-      var id = transform.primaryInput.id;
-
-      var entrypoint = path.join(_environment.graph.packages[id.package].dir,
-          id.path);
-
-      // TODO(rnystrom): Should have more sophisticated error-handling here.
-      // Need to report compile errors to the user in an easily visible way.
-      // Need to make sure paths in errors are mapped to the original source
-      // path so they can understand them.
-      return Chain.track(dart.compile(
-          entrypoint, provider,
-          commandLineOptions: _configCommandLineOptions,
-          checked: _configBool('checked'),
-          minify: _configBool(
-              'minify', defaultsTo: _settings.mode == BarbackMode.RELEASE),
-          verbose: _configBool('verbose'),
-          environment: _configEnvironment,
-          packageRoot: path.join(_environment.rootPackage.dir,
-                                 "packages"),
-          analyzeAll: _configBool('analyzeAll'),
-          suppressWarnings: _configBool('suppressWarnings'),
-          suppressHints: _configBool('suppressHints'),
-          suppressPackageWarnings: _configBool(
-              'suppressPackageWarnings', defaultsTo: true),
-          terse: _configBool('terse'),
-          includeSourceMapUrls: _settings.mode != BarbackMode.RELEASE))
-          .then((_) {
-        stopwatch.stop();
-        transform.logger.info("Took ${stopwatch.elapsed} to compile $id.");
-      });
-    });
-  }
-
-  Future declareOutputs(DeclaringTransform transform) {
-    var primaryId = transform.primaryInput.id;
-    transform.declareOutput(primaryId.addExtension(".js"));
-    transform.declareOutput(primaryId.addExtension(".js.map"));
-    transform.declareOutput(primaryId.addExtension(".precompiled.js"));
-    return new Future.value();
+    // TODO(rnystrom): Should have more sophisticated error-handling here. Need
+    // to report compile errors to the user in an easily visible way. Need to
+    // make sure paths in errors are mapped to the original source path so they
+    // can understand them.
+    return Chain.track(dart.compile(
+        entrypoint, provider,
+        commandLineOptions: _configCommandLineOptions,
+        checked: _configBool('checked'),
+        minify: _configBool(
+            'minify', defaultsTo: _settings.mode == BarbackMode.RELEASE),
+        verbose: _configBool('verbose'),
+        environment: _configEnvironment,
+        packageRoot: path.join(_environment.rootPackage.dir, "packages"),
+        analyzeAll: _configBool('analyzeAll'),
+        suppressWarnings: _configBool('suppressWarnings'),
+        suppressHints: _configBool('suppressHints'),
+        suppressPackageWarnings: _configBool(
+            'suppressPackageWarnings', defaultsTo: true),
+        terse: _configBool('terse'),
+        includeSourceMapUrls: _settings.mode != BarbackMode.RELEASE));
   }
 
   /// Parses and returns the "commandLineOptions" configuration option.
@@ -335,7 +345,6 @@
 
     var fatal = (kind.ordinal & _FATAL) != 0;
     if (uri == null) {
-      assert(fatal);
       logFn(message);
     } else {
       SourceFile file = _sourceFiles[uri.toString()];
diff --git a/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart
index 03b485b..7ebd55b 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart
@@ -37,19 +37,19 @@
 
   ExcludingTransformer._(this._inner, this._includes, this._excludes);
 
-  Future<bool> isPrimary(Asset asset) {
+  Future<bool> isPrimary(AssetId id) {
     // TODO(rnystrom): Support globs in addition to paths. See #17093.
     if (_includes != null) {
       // If there are any includes, it must match one of them.
-      if (!_includes.contains(asset.id.path)) return new Future.value(false);
+      if (!_includes.contains(id.path)) return new Future.value(false);
     }
 
     // It must not be excluded.
-    if (_excludes != null && _excludes.contains(asset.id.path)) {
+    if (_excludes != null && _excludes.contains(id.path)) {
       return new Future.value(false);
     }
 
-    return _inner.isPrimary(asset);
+    return _inner.isPrimary(id);
   }
 
   Future apply(Transform transform) => _inner.apply(transform);
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
index 89859d6..c5cb4b9 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
@@ -91,10 +91,10 @@
       : _port = map['port'],
         _toString = map['toString'];
 
-  Future<bool> isPrimary(Asset asset) {
+  Future<bool> isPrimary(AssetId id) {
     return call(_port, {
       'type': 'isPrimary',
-      'asset': serializeAsset(asset)
+      'id': serializeId(id)
     });
   }
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback/old_web_socket_api.dart b/sdk/lib/_internal/pub/lib/src/barback/old_web_socket_api.dart
deleted file mode 100644
index 461e364..0000000
--- a/sdk/lib/_internal/pub/lib/src/barback/old_web_socket_api.dart
+++ /dev/null
@@ -1,442 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// TODO(nweiz): Remove this when the Editor is using the admin server port. See
-// issue 17640.
-library pub.barback.old_web_socket_api;
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:path/path.dart' as path;
-import 'package:stack_trace/stack_trace.dart';
-
-import '../log.dart' as log;
-import '../utils.dart';
-import 'build_environment.dart';
-
-
-/// Implements the [WebSocket] API for communicating with a running pub serve
-/// process, mainly for use by the Editor.
-///
-/// Requests must be string-encoded JSON maps. Each request is a command, and
-/// the map must have a command key:
-///
-///     {
-///       "command": "name"
-///     }
-///
-/// The request may also have an "id" key with any value. If present in the
-/// request, the response will include an "id" key with the same value. This
-/// can be used by the client to match requests to responses when multiple
-/// concurrent requests may be in flight.
-///
-///     {
-///       "command": "name",
-///       "id": "anything you want"
-///     }
-///
-/// The request may have other keys for parameters to the command. It's an
-/// error to invoke an unknown command.
-///
-/// All responses sent on the socket are string-encoded JSON maps. If an error
-/// occurs while processing the request, an error response will be sent like:
-///
-///     {
-///       "error": "Human-friendly error message."
-///       "code": "UNIQUE_IDENTIFIER"
-///     }
-///
-/// The code will be a short string that can be used to uniquely identify the
-/// category of error.
-///
-/// No successful response map will contain a key named "error".
-class OldWebSocketApi {
-  final WebSocket _socket;
-  final BuildEnvironment _environment;
-
-  Map<String, _CommandHandler> _commands;
-
-  OldWebSocketApi(this._socket, this._environment) {
-    _commands = {
-      "urlToAssetId": _urlToAssetId,
-      "pathToUrls": _pathToUrls,
-      "serveDirectory": _serveDirectory,
-      "unserveDirectory": _unserveDirectory
-    };
-  }
-
-  /// Listens on the socket.
-  ///
-  /// Returns a future that completes when the socket has closed. It will
-  /// complete with an error if the socket had an error, otherwise it will
-  /// complete to `null`.
-  Future listen() {
-    return _socket.listen((data) {
-      log.io("Web Socket command: $data");
-
-      var command;
-      return syncFuture(() {
-        try {
-          command = JSON.decode(data);
-        } on FormatException catch (ex) {
-          throw new _WebSocketException(_ErrorCode.BAD_COMMAND,
-              '"$data" is not valid JSON: ${ex.message}');
-        }
-
-        if (command is! Map) {
-          throw new _WebSocketException(_ErrorCode.BAD_COMMAND,
-              'Command must be a JSON map. Got $data.');
-        }
-
-        if (!command.containsKey("command")) {
-          throw new _WebSocketException(_ErrorCode.BAD_COMMAND,
-              'Missing command name. Got $data.');
-        }
-
-        var handler = _commands[command["command"]];
-        if (handler == null) {
-          throw new _WebSocketException(_ErrorCode.BAD_COMMAND,
-              'Unknown command "${command["command"]}".');
-        }
-
-        return handler(command);
-      }).then((response) {
-        // If the command has an ID, include it in the response.
-        if (command.containsKey("id")) {
-          response["id"] = command["id"];
-        }
-
-        _socket.add(JSON.encode(response));
-      }).catchError((error, [stackTrace]) {
-        var response;
-        if (error is _WebSocketException) {
-          response = {
-            "code": error.code,
-            "error": error.message
-          };
-        } else {
-          // Catch any other errors and pipe them through the web socket.
-          response = {
-            "code": _ErrorCode.UNEXPECTED_ERROR,
-            "error": error.toString(),
-            "stackTrace": new Chain.forTrace(stackTrace).toString()
-          };
-        }
-
-        // If the command has an ID, include it in the response.
-        if (command is Map && command.containsKey("id")) {
-          response["id"] = command["id"];
-        }
-
-        _socket.add(JSON.encode(response));
-      });
-    }, cancelOnError: true).asFuture();
-  }
-
-  /// Given a URL to an asset that is served by pub, returns the ID of the
-  /// asset that would be accessed by that URL.
-  ///
-  /// The command name is "urlToAssetId" and it takes a "url" key for the URL
-  /// being mapped:
-  ///
-  ///     {
-  ///       "command": "urlToAssetId",
-  ///       "url": "http://localhost:8080/index.html"
-  ///     }
-  ///
-  /// If successful, it returns a map containing the asset ID's package and
-  /// path:
-  ///
-  ///     {
-  ///       "package": "myapp",
-  ///       "path": "web/index.html"
-  ///     }
-  ///
-  /// The "path" key in the result is a URL path that's relative to the root
-  /// directory of the package identified by "package". The location of this
-  /// package may vary depending on which source it was installed from.
-  ///
-  /// An optional "line" key may be provided whose value must be an integer. If
-  /// given, the result will also include a "line" key that maps the line in
-  /// the served final file back to the corresponding source line in the asset
-  /// that was used to generate that file.
-  ///
-  /// Examples (where "myapp" is the root package and pub serve is being run
-  /// normally with "web" bound to port 8080 and "test" to 8081):
-  ///
-  ///     http://localhost:8080/index.html    -> myapp|web/index.html
-  ///     http://localhost:8081/sub/main.dart -> myapp|test/sub/main.dart
-  ///
-  /// If the URL is not a domain being served by pub, this returns an error:
-  ///
-  ///     http://localhost:1234/index.html    -> NOT_SERVED error
-  ///
-  /// This does *not* currently support the implicit index.html behavior that
-  /// pub serve provides for user-friendliness:
-  ///
-  ///     http://localhost:1234 -> NOT_SERVED error
-  ///
-  /// This does *not* currently check to ensure the asset actually exists. It
-  /// only maps what the corresponding asset *should* be for that URL.
-  Map _urlToAssetId(Map command) {
-    var urlString = _validateString(command, "url");
-    var url;
-    try {
-      url = Uri.parse(urlString);
-    } on FormatException catch(ex) {
-      print(ex);
-      throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
-          '"$urlString" is not a valid URL.');
-    }
-
-    // If a line number was given, map it to the output line.
-    var line = _validateOptionalInt(command, "line");
-
-    var id = _environment.getAssetIdForUrl(url);
-    if (id == null) {
-      throw new _WebSocketException(_ErrorCode.NOT_SERVED,
-          '"${url.host}:${url.port}" is not being served by pub.');
-    }
-
-    // TODO(rnystrom): When this is hooked up to actually talk to barback to
-    // see if assets exist, consider supporting implicit index.html at that
-    // point.
-
-    var result = {"package": id.package, "path": id.path};
-
-    // Map the line.
-    // TODO(rnystrom): Right now, source maps are not supported and it just
-    // passes through the original line. This lets the editor start using
-    // this API before we've fully implemented it. See #12339 and #16061.
-    if (line != null) result["line"] = line;
-
-    return result;
-  }
-
-  /// Given a path on the filesystem, returns the URLs served by pub that can be
-  /// used to access asset found at that path.
-  ///
-  /// The command name is "pathToUrls" and it takes a "path" key (a native OS
-  /// path which may be absolute or relative to the root directory of the
-  /// entrypoint package) for the path being mapped:
-  ///
-  ///     {
-  ///       "command": "pathToUrls",
-  ///       "path": "web/index.html"
-  ///     }
-  ///
-  /// If successful, it returns a map containing the list of URLs that can be
-  /// used to access that asset.
-  ///
-  ///     {
-  ///       "urls": ["http://localhost:8080/index.html"]
-  ///     }
-  ///
-  /// The "path" key may refer to a path in another package, either by referring
-  /// to its location within the top-level "packages" directory or by referring
-  /// to its location on disk. Only the "lib" and "asset" directories are
-  /// visible in other packages:
-  ///
-  ///     {
-  ///       "command": "assetIdToUrl",
-  ///       "path": "packages/http/http.dart"
-  ///     }
-  ///
-  /// Assets in the "lib" and "asset" directories will usually have one URL for
-  /// each server:
-  ///
-  ///     {
-  ///       "urls": [
-  ///         "http://localhost:8080/packages/http/http.dart",
-  ///         "http://localhost:8081/packages/http/http.dart"
-  ///       ]
-  ///     }
-  ///
-  /// An optional "line" key may be provided whose value must be an integer. If
-  /// given, the result will also include a "line" key that maps the line in
-  /// the source file to the corresponding output line in the resulting asset
-  /// served at the URL.
-  ///
-  /// Examples (where "myapp" is the root package and pub serve is being run
-  /// normally with "web" bound to port 8080 and "test" to 8081):
-  ///
-  ///     web/index.html      -> http://localhost:8080/index.html
-  ///     test/sub/main.dart  -> http://localhost:8081/sub/main.dart
-  ///
-  /// If the asset is not in a directory being served by pub, returns an error:
-  ///
-  ///     example/index.html  -> NOT_SERVED error
-  Map _pathToUrls(Map command) {
-    var assetPath = _validateString(command, "path");
-    var line = _validateOptionalInt(command, "line");
-
-    var urls = _environment.getUrlsForAssetPath(assetPath);
-    if (urls.isEmpty) {
-      throw new _WebSocketException(_ErrorCode.NOT_SERVED,
-          'Asset path "$assetPath" is not currently being served.');
-    }
-
-    var result = {"urls": urls.map((url) => url.toString()).toList()};
-
-    // Map the line.
-    // TODO(rnystrom): Right now, source maps are not supported and it just
-    // passes through the original line. This lets the editor start using
-    // this API before we've fully implemented it. See #12339 and #16061.
-    if (line != null) result["line"] = line;
-
-    return result;
-  }
-
-  /// Given a relative directory path within the entrypoint package, binds a
-  /// new port to serve from that path and returns its URL.
-  ///
-  /// The command name is "serveDirectory" and it takes a "path" key (a native
-  /// OS path relative to the root of the entrypoint package) for the directory
-  /// being served:
-  ///
-  ///     {
-  ///       "command": "serveDirectory",
-  ///       "path": "example/awesome"
-  ///     }
-  ///
-  /// If successful, it returns a map containing the URL that can be used to
-  /// access the directory.
-  ///
-  ///     {
-  ///       "url": "http://localhost:8083"
-  ///     }
-  ///
-  /// If the directory is already being served, returns the previous URL.
-  Future<Map> _serveDirectory(Map command) {
-    var rootDirectory = _validateRelativePath(command, "path");
-    return _environment.serveDirectory(rootDirectory).then((server) {
-      return {
-        "url": server.url.toString()
-      };
-    });
-  }
-
-  /// Given a relative directory path within the entrypoint package, unbinds
-  /// the server previously bound to that directory and returns its (now
-  /// unreachable) URL.
-  ///
-  /// The command name is "unserveDirectory" and it takes a "path" key (a
-  /// native OS path relative to the root of the entrypoint package) for the
-  /// directory being unserved:
-  ///
-  ///     {
-  ///       "command": "unserveDirectory",
-  ///       "path": "example/awesome"
-  ///     }
-  ///
-  /// If successful, it returns a map containing the URL that used to be used
-  /// to access the directory.
-  ///
-  ///     {
-  ///       "url": "http://localhost:8083"
-  ///     }
-  ///
-  /// If no server is bound to that directory, it returns a `NOT_SERVED` error.
-  Future<Map> _unserveDirectory(Map command) {
-    var rootDirectory = _validateRelativePath(command, "path");
-    return _environment.unserveDirectory(rootDirectory).then((url) {
-      if (url == null) {
-        throw new _WebSocketException(_ErrorCode.NOT_SERVED,
-            'Directory "$rootDirectory" is not bound to a server.');
-      }
-
-      return {"url": url.toString()};
-    });
-  }
-
-  /// Validates that [command] has a field named [key] whose value is a string.
-  ///
-  /// Returns the string if found, or throws a [_WebSocketException] if
-  /// validation failed.
-  String _validateString(Map command, String key, {bool optional: false}) {
-    if (!optional && !command.containsKey(key)) {
-      throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
-          'Missing "$key" argument.');
-    }
-
-    var field = command[key];
-    if (field is String) return field;
-    if (field == null && optional) return null;
-
-    throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
-        '"$key" must be a string. Got ${JSON.encode(field)}.');
-  }
-
-  /// Validates that [command] has a field named [key] whose value is a string
-  /// containing a relative path that doesn't reach out of the entrypoint
-  /// package's root directory.
-  ///
-  /// Returns the path if found, or throws a [_WebSocketException] if
-  /// validation failed.
-  String _validateRelativePath(Map command, String key) {
-    var pathString = _validateString(command, key);
-
-    if (!path.isRelative(pathString)) {
-      throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
-          '"$key" must be a relative path. Got "$pathString".');
-    }
-
-    if (!path.isWithin(".", pathString)) {
-      throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
-          '"$key" cannot reach out of its containing directory. '
-          'Got "$pathString".');
-    }
-
-    return pathString;
-  }
-
-  /// Validates that if [command] has a field named [key], then its value is a
-  /// number.
-  ///
-  /// Returns the number if found or `null` if not present. Throws an
-  /// [_WebSocketException] if the key is there but the field is the wrong type.
-  int _validateOptionalInt(Map command, String key) {
-    if (!command.containsKey(key)) return null;
-
-    var field = command[key];
-    if (field is int) return field;
-
-    throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
-        '"$key" must be an integer. Got ${JSON.encode(field)}.');
-  }
-}
-
-/// Function for processing a single web socket command.
-///
-/// It can return a [Map] or a [Future] that completes to one.
-typedef _CommandHandler(Map command);
-
-/// Web socket API error codenames.
-class _ErrorCode {
-  /// An error of an unknown type has occurred.
-  static const UNEXPECTED_ERROR = "UNEXPECTED_ERROR";
-
-  /// The format or name of the command is not valid.
-  static const BAD_COMMAND = "BAD_COMMAND";
-
-  /// An argument to the commant is the wrong type or has an invalid value.
-  static const BAD_ARGUMENT = "BAD_ARGUMENT";
-
-  /// The path or URL requested is not currently covered by any of the running
-  /// servers.
-  static const NOT_SERVED = "NOT_SERVED";
-}
-
-/// Exception thrown when an error occurs while processing a WebSocket command.
-///
-/// The top-level WebSocket API code will catch this and translate it to an
-/// appropriate error response.
-class _WebSocketException implements Exception {
-  final String code;
-  final String message;
-
-  _WebSocketException(this.code, this.message);
-}
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 6a2d6b0..beb8c11 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
@@ -10,11 +10,9 @@
 import 'package:path/path.dart' as path;
 import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
 
+import '../utils.dart';
 import 'build_environment.dart';
 
-/// The error code for a directory not being served.
-const _NOT_SERVED = 1;
-
 /// Implements the [WebSocket] API for communicating with a running pub serve
 /// process, mainly for use by the Editor.
 ///
@@ -89,31 +87,32 @@
   ///
   /// This does *not* currently check to ensure the asset actually exists. It
   /// only maps what the corresponding asset *should* be for that URL.
-  Map _urlToAssetId(json_rpc.Parameters params) {
+  Future<Map> _urlToAssetId(json_rpc.Parameters params) {
     var url = params["url"].asUri;
 
     // If a line number was given, map it to the output line.
     var line = params["line"].asIntOr(null);
 
-    var id = _environment.getAssetIdForUrl(url);
-    if (id == null) {
-      throw new json_rpc.RpcException(_NOT_SERVED,
-          '"${url.host}:${url.port}" is not being served by pub.');
-    }
+    return _environment.getAssetIdForUrl(url).then((id) {
+      if (id == null) {
+        throw new json_rpc.RpcException(_Error.NOT_SERVED,
+            '"${url.host}:${url.port}" is not being served by pub.');
+      }
 
-    // TODO(rnystrom): When this is hooked up to actually talk to barback to
-    // see if assets exist, consider supporting implicit index.html at that
-    // point.
+      // TODO(rnystrom): When this is hooked up to actually talk to barback to
+      // see if assets exist, consider supporting implicit index.html at that
+      // point.
 
-    var result = {"package": id.package, "path": id.path};
+      var result = {"package": id.package, "path": id.path};
 
-    // Map the line.
-    // TODO(rnystrom): Right now, source maps are not supported and it just
-    // passes through the original line. This lets the editor start using
-    // this API before we've fully implemented it. See #12339 and #16061.
-    if (line != null) result["line"] = line;
+      // Map the line.
+      // TODO(rnystrom): Right now, source maps are not supported and it just
+      // passes through the original line. This lets the editor start using
+      // this API before we've fully implemented it. See #12339 and #16061.
+      if (line != null) result["line"] = line;
 
-    return result;
+      return result;
+    });
   }
 
   /// Given a path on the filesystem, returns the URLs served by pub that can be
@@ -167,25 +166,26 @@
   /// If the asset is not in a directory being served by pub, returns an error:
   ///
   ///     example/index.html  -> NOT_SERVED error
-  Map _pathToUrls(json_rpc.Parameters params) {
+  Future<Map> _pathToUrls(json_rpc.Parameters params) {
     var assetPath = params["path"].asString;
     var line = params["line"].asIntOr(null);
 
-    var urls = _environment.getUrlsForAssetPath(assetPath);
-    if (urls.isEmpty) {
-      throw new json_rpc.RpcException(_NOT_SERVED,
-          'Asset path "$assetPath" is not currently being served.');
-    }
+    return _environment.getUrlsForAssetPath(assetPath).then((urls) {
+      if (urls.isEmpty) {
+        throw new json_rpc.RpcException(_Error.NOT_SERVED,
+            'Asset path "$assetPath" is not currently being served.');
+      }
 
-    var result = {"urls": urls.map((url) => url.toString()).toList()};
+      var result = {"urls": urls.map((url) => url.toString()).toList()};
 
-    // Map the line.
-    // TODO(rnystrom): Right now, source maps are not supported and it just
-    // passes through the original line. This lets the editor start using
-    // this API before we've fully implemented it. See #12339 and #16061.
-    if (line != null) result["line"] = line;
+      // Map the line.
+      // TODO(rnystrom): Right now, source maps are not supported and it just
+      // passes through the original line. This lets the editor start using
+      // this API before we've fully implemented it. See #12339 and #16061.
+      if (line != null) result["line"] = line;
 
-    return result;
+      return result;
+    });
   }
 
   /// Given a relative directory path within the entrypoint package, binds a
@@ -213,6 +213,19 @@
       return {
         "url": server.url.toString()
       };
+    }).catchError((error) {
+      if (error is! OverlappingSourceDirectoryException) throw error;
+
+      var dir = pluralize("directory", error.overlappingDirectories.length,
+          plural: "directories");
+      var overlapping = toSentence(error.overlappingDirectories.map(
+          (dir) => '"$dir"'));
+      print("data: ${error.overlappingDirectories}");
+      throw new json_rpc.RpcException(_Error.OVERLAPPING,
+          'Path "$rootDirectory" overlaps already served $dir $overlapping.',
+          data: {
+            "directories": error.overlappingDirectories
+          });
     });
   }
 
@@ -240,7 +253,7 @@
     var rootDirectory = _validateRelativePath(params, "path");
     return _environment.unserveDirectory(rootDirectory).then((url) {
       if (url == null) {
-        throw new json_rpc.RpcException(_NOT_SERVED,
+        throw new json_rpc.RpcException(_Error.NOT_SERVED,
             'Directory "$rootDirectory" is not bound to a server.');
       }
 
@@ -271,3 +284,13 @@
     return pathString;
   }
 }
+
+
+/// The pub-specific JSON RPC error codes.
+class _Error {
+  /// The specified directory is not being served.
+  static const NOT_SERVED = 1;
+
+  /// The specified directory overlaps one or more ones already being served.
+  static const OVERLAPPING = 2;
+}
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index 591704d..760d5fc 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -12,6 +12,7 @@
 
 import 'command/build.dart';
 import 'command/cache.dart';
+import 'command/deps.dart';
 import 'command/get.dart';
 import 'command/help.dart';
 import 'command/lish.dart';
@@ -22,7 +23,6 @@
 import 'command/version.dart';
 import 'entrypoint.dart';
 import 'exit_codes.dart' as exit_codes;
-import 'io.dart';
 import 'log.dart' as log;
 import 'system_cache.dart';
 import 'utils.dart';
@@ -243,6 +243,7 @@
     'cache': new CacheCommand(),
     'get': new GetCommand(),
     'help': new HelpCommand(),
+    'deps': new DepsCommand(),
     'list-package-dirs': new ListPackageDirsCommand(),
     'publish': new LishCommand(),
     'serve': new ServeCommand(),
diff --git a/sdk/lib/_internal/pub/lib/src/command/barback.dart b/sdk/lib/_internal/pub/lib/src/command/barback.dart
new file mode 100644
index 0000000..72a50ba
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/command/barback.dart
@@ -0,0 +1,200 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.command.barback;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
+
+import '../command.dart';
+import '../io.dart';
+import '../log.dart' as log;
+import '../utils.dart';
+
+final _arrow = getSpecial('\u2192', '=>');
+
+/// The set of top level directories in the entrypoint package that are built
+/// when the user does "--all".
+final _allSourceDirectories = new Set<String>.from([
+  "benchmark", "bin", "example", "test", "web"
+]);
+
+/// Shared base class for [BuildCommand] and [ServeCommand].
+abstract class BarbackCommand extends PubCommand {
+  final takesArguments = true;
+
+  /// The build mode.
+  BarbackMode get mode => new BarbackMode(commandOptions["mode"]);
+
+  /// The directories in the entrypoint package that should be added to the
+  /// build environment.
+  final sourceDirectories = new Set<String>();
+
+  /// Override this to specify the default build mode.
+  BarbackMode get defaultMode;
+
+  /// Override this to specify the default source directories if none are
+  /// provided on the command line.
+  List<String> get defaultSourceDirectories;
+
+  BarbackCommand() {
+    commandParser.addOption("mode", defaultsTo: defaultMode.toString(),
+        help: "Mode to run transformers in.");
+
+    commandParser.addFlag("all",
+        help: "Use all default source directories.",
+        defaultsTo: false, negatable: false);
+  }
+
+  Future onRun() {
+    // Switch to JSON output if specified. We need to do this before parsing
+    // the source directories so an error will be correctly reported in JSON
+    // format.
+    log.json.enabled = commandOptions.options.contains("format") &&
+        commandOptions["format"] == "json";
+
+    _parseSourceDirectories();
+    return onRunTransformerCommand();
+  }
+
+  /// Override this to run the actual command.
+  Future onRunTransformerCommand();
+
+  /// Parses the command-line arguments to determine the set of source
+  /// directories to add to the build environment.
+  ///
+  /// If there are no arguments, this will just be [defaultSourceDirectories].
+  ///
+  /// If the `--all` flag is set, then it will be all default directories
+  /// that exist.
+  ///
+  /// Otherwise, all arguments should be the paths of directories to include.
+  ///
+  /// Throws an exception if the arguments are invalid.
+  void _parseSourceDirectories() {
+    if (commandOptions["all"]) {
+      _addAllDefaultSources();
+      return;
+    }
+
+    // If no directories were specified, use the defaults.
+    if (commandOptions.rest.isEmpty) {
+      _addDefaultSources();
+      return;
+    }
+
+    sourceDirectories.addAll(commandOptions.rest);
+
+    // Prohibit "lib" and "asset".
+    var disallowed = sourceDirectories.where((dir) {
+      var parts = path.split(path.normalize(dir));
+      return parts.isNotEmpty && ["lib", "asset"].contains(parts.first);
+    });
+
+    if (disallowed.isNotEmpty) {
+      usageError(_directorySentence(disallowed, "is", "are", "not allowed"));
+    }
+
+    // Make sure the source directories don't reach out of the package.
+    var invalid = sourceDirectories.where((dir) => !path.isWithin('.', dir));
+    if (invalid.isNotEmpty) {
+      usageError(_directorySentence(invalid, "isn't", "aren't",
+          "in this package"));
+    }
+
+    // Make sure all of the source directories exist.
+    var missing = sourceDirectories.where(
+        (dir) => !dirExists(path.join(entrypoint.root.dir, dir)));
+
+    if (missing.isNotEmpty) {
+      dataError(_directorySentence(missing, "does", "do", "not exist"));
+    }
+
+    // Make sure the directories don't overlap.
+    var sources = sourceDirectories.toList();
+    var overlapping = new Set();
+    for (var i = 0; i < sources.length; i++) {
+      for (var j = i + 1; j < sources.length; j++) {
+        if (path.isWithin(sources[i], sources[j]) ||
+            path.isWithin(sources[j], sources[i])) {
+          overlapping.add(sources[i]);
+          overlapping.add(sources[j]);
+        }
+      }
+    }
+
+    if (overlapping.isNotEmpty) {
+      usageError(_directorySentence(overlapping, "cannot", "cannot",
+          "overlap"));
+    }
+  }
+
+  /// Handles "--all" by adding all default source directories that are
+  /// present.
+  void _addAllDefaultSources() {
+    if (commandOptions.rest.isNotEmpty) {
+      usageError(
+          'Directory names are not allowed if "--all" is passed.');
+    }
+
+    // Include every build directory that exists in the package.
+    var dirs = _allSourceDirectories.where(
+        (dir) => dirExists(path.join(entrypoint.root.dir, dir)));
+
+    if (dirs.isEmpty) {
+      var defaultDirs = toSentence(_allSourceDirectories.map(
+          (name) => '"$name"'));
+      dataError('There are no source directories present.\n'
+          'The default directories are $defaultDirs.');
+    }
+
+    sourceDirectories.addAll(dirs);
+  }
+
+  /// Adds the default sources that should be used if no directories are passed
+  /// on the command line.
+  void _addDefaultSources() {
+    sourceDirectories.addAll(defaultSourceDirectories.where(
+        (dir) => dirExists(path.join(entrypoint.root.dir, dir))));
+
+    // TODO(rnystrom): Hackish. Assumes there will only be one or two
+    // default sources. That's true for pub build and serve, but isn't as
+    // general as it could be.
+    if (sourceDirectories.isEmpty) {
+      var defaults;
+      if (defaultSourceDirectories.length == 1) {
+        defaults = 'a "${defaultSourceDirectories.first}" directory';
+      } else {
+        defaults = '"${defaultSourceDirectories[0]}" and/or '
+            '"${defaultSourceDirectories[1]}" directories';
+      }
+
+      dataError("Your package must have $defaults,\n"
+          "or you must specify the source directories.");
+    }
+  }
+
+  /// Converts a list of [directoryNames] to a sentence.
+  ///
+  /// After the list of directories, [singularVerb] will be used if there is
+  /// only one directory and [pluralVerb] will be used if there are more than
+  /// one. Then [suffix] is added to the end of the sentence, and, finally, a
+  /// period is added.
+  String _directorySentence(Iterable<String> directoryNames,
+      String singularVerb, String pluralVerb, String suffix) {
+    var directories = pluralize('Directory', directoryNames.length,
+        plural: 'Directories');
+    var names = toSentence(directoryNames.map((dir) => '"$dir"'));
+    var verb = pluralize(singularVerb, directoryNames.length,
+        plural: pluralVerb);
+
+    var result = "$directories $names $verb";
+    if (suffix != null) result += " $suffix";
+    result += ".";
+
+    return result;
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/command/build.dart b/sdk/lib/_internal/pub/lib/src/command/build.dart
index 2513d8b99..61e46ef 100644
--- a/sdk/lib/_internal/pub/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/build.dart
@@ -10,57 +10,42 @@
 import 'package:path/path.dart' as path;
 
 import '../barback/build_environment.dart';
-import '../command.dart';
 import '../exit_codes.dart' as exit_codes;
 import '../io.dart';
 import '../log.dart' as log;
 import '../utils.dart';
+import 'barback.dart';
 
 final _arrow = getSpecial('\u2192', '=>');
 
-/// The set of top level directories in the entrypoint package that can be
-/// built.
-final _allowedBuildDirectories = new Set<String>.from([
-  "benchmark", "bin", "example", "test", "web"
-]);
-
 /// Handles the `build` pub command.
-class BuildCommand extends PubCommand {
+class BuildCommand extends BarbackCommand {
   String get description => "Apply transformers to build a package.";
   String get usage => "pub build [options] [directories...]";
   List<String> get aliases => const ["deploy", "settle-up"];
-  bool get takesArguments => true;
 
-  // TODO(nweiz): make this configurable.
   /// The path to the application's build output directory.
-  String get target => 'build';
+  String get outputDirectory => commandOptions["output"];
 
-  /// The build mode.
-  BarbackMode get mode => new BarbackMode(commandOptions["mode"]);
+  BarbackMode get defaultMode => BarbackMode.RELEASE;
+
+  List<String> get defaultSourceDirectories => ["web"];
 
   /// The number of files that have been built and written to disc so far.
   int builtFiles = 0;
 
-  /// The names of the top-level build directories that will be built.
-  final buildDirectories = new Set<String>();
-
   BuildCommand() {
     commandParser.addOption("format",
         help: "How output should be displayed.",
         allowed: ["text", "json"], defaultsTo: "text");
 
-    commandParser.addOption("mode", defaultsTo: BarbackMode.RELEASE.toString(),
-        help: "Mode to run transformers in.");
-
-    commandParser.addFlag("all", help: "Build all buildable directories.",
-        defaultsTo: false, negatable: false);
+    commandParser.addOption("output", abbr: "o",
+        help: "Directory to write build outputs to.",
+        defaultsTo: "build");
   }
 
-  Future onRun() {
-    log.json.enabled = commandOptions["format"] == "json";
-
-    _parseBuildDirectories();
-    cleanDir(target);
+  Future onRunTransformerCommand() {
+    cleanDir(outputDirectory);
 
     var errorsJson = [];
     var logJson = [];
@@ -97,7 +82,7 @@
         // TODO(rnystrom): We don't actually need to bind servers for these, we
         // just need to add them to barback's sources. Add support to
         // BuildEnvironment for going the latter without the former.
-        return Future.wait(buildDirectories.map(
+        return Future.wait(sourceDirectories.map(
             (dir) => environment.serveDirectory(dir))).then((_) {
 
           return environment.barback.getAllAssets();
@@ -111,11 +96,11 @@
         return Future.wait(assets.map(_writeAsset)).then((_) {
           builtFiles += _copyBrowserJsFiles(dart2JSEntrypoints);
           log.message('Built $builtFiles ${pluralize('file', builtFiles)} '
-              'to "$target".');
+              'to "$outputDirectory".');
 
           log.json.message({
             "buildResult": "success",
-            "outputDirectory": target,
+            "outputDirectory": outputDirectory,
             "numFiles": builtFiles,
             "log": logJson
           });
@@ -137,71 +122,6 @@
     });
   }
 
-  /// Parses the command-line arguments to determine the set of top-level
-  /// directories to build.
-  ///
-  /// If there are no arguments to `pub build`, this will just be "web".
-  ///
-  /// If the `--all` flag is set, then it will be all buildable directories
-  /// that exist.
-  ///
-  /// Otherwise, all arguments should be the names of directories to include.
-  ///
-  /// Throws an exception if the arguments are invalid.
-  void _parseBuildDirectories() {
-    if (commandOptions["all"]) {
-      if (commandOptions.rest.isNotEmpty) {
-        usageError(
-            'Build directory names are not allowed if "--all" is passed.');
-      }
-
-      // Include every build directory that exists in the package.
-      var allowed = _allowedBuildDirectories.where(
-          (d) => dirExists(path.join(entrypoint.root.dir, d)));
-
-      if (allowed.isEmpty) {
-        var buildDirs = toSentence(ordered(_allowedBuildDirectories.map(
-            (name) => '"$name"')));
-        dataError('There are no buildable directories.\n'
-                  'The supported directories are $buildDirs.');
-      }
-
-      buildDirectories.addAll(allowed);
-      return;
-    }
-
-    buildDirectories.addAll(commandOptions.rest);
-
-    // If no directory were specified, default to "web".
-    if (buildDirectories.isEmpty) {
-      buildDirectories.add("web");
-    }
-
-    // Make sure the arguments are known directories.
-    var disallowed = buildDirectories.where(
-        (dir) => !_allowedBuildDirectories.contains(dir));
-    if (disallowed.isNotEmpty) {
-      var dirs = pluralize("directory", disallowed.length,
-          plural: "directories");
-      var names = toSentence(ordered(disallowed).map((name) => '"$name"'));
-      var allowed = toSentence(ordered(_allowedBuildDirectories.map(
-          (name) => '"$name"')));
-      usageError('Unsupported build $dirs $names.\n'
-                 'The allowed directories are $allowed.');
-    }
-
-    // Make sure all of the build directories exist.
-    var missing = buildDirectories.where(
-        (dir) => !dirExists(path.join(entrypoint.root.dir, dir)));
-
-    if (missing.length == 1) {
-      dataError('Directory "${missing.single}" does not exist.');
-    } else if (missing.isNotEmpty) {
-      var names = toSentence(ordered(missing).map((name) => '"$name"'));
-      dataError('Directories $names do not exist.');
-    }
-  }
-
   /// Writes [asset] to the appropriate build directory.
   ///
   /// If [asset] is in the special "assets" directory, writes it to every
@@ -219,7 +139,7 @@
     // top-level build directories.
     if (path.isWithin("assets", destPath) ||
         path.isWithin("packages", destPath)) {
-      return Future.wait(buildDirectories.map((buildDir) =>
+      return Future.wait(sourceDirectories.map((buildDir) =>
           _writeOutputFile(asset, path.join(buildDir, destPath))));
     }
 
@@ -272,7 +192,7 @@
   /// directory.
   Future _writeOutputFile(Asset asset, String relativePath) {
     builtFiles++;
-    var destPath = path.join(target, relativePath);
+    var destPath = path.join(outputDirectory, relativePath);
     ensureDir(path.dirname(destPath));
     return createFileFromStream(asset.read(), destPath);
   }
@@ -315,7 +235,7 @@
   /// under `packages/browser/`.
   void _addBrowserJs(String directory, String name) {
     var jsPath = path.join(entrypoint.root.dir,
-        target, directory, 'packages', 'browser', '$name.js');
+        outputDirectory, directory, 'packages', 'browser', '$name.js');
     ensureDir(path.dirname(jsPath));
 
     // TODO(rnystrom): This won't work if we get rid of symlinks and the top
diff --git a/sdk/lib/_internal/pub/lib/src/command/deps.dart b/sdk/lib/_internal/pub/lib/src/command/deps.dart
new file mode 100644
index 0000000..1848306
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/command/deps.dart
@@ -0,0 +1,187 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.command.list;
+
+import 'dart:async';
+import 'dart:collection';
+
+import '../ascii_tree.dart' as tree;
+import '../command.dart';
+import '../log.dart' as log;
+import '../package.dart';
+import '../package_graph.dart';
+import '../utils.dart';
+
+/// Handles the `deps` pub command.
+class DepsCommand extends PubCommand {
+  String get description => "Print package dependencies.";
+  List<String> get aliases => const ["dependencies", "tab"];
+  String get usage => "pub deps";
+
+  /// The loaded package graph.
+  PackageGraph _graph;
+
+  /// The [StringBuffer] used to accumulate the output.
+  StringBuffer _buffer;
+
+  DepsCommand() {
+    commandParser.addOption("style", abbr: "s",
+        help: "How output should be displayed.",
+        allowed: ["compact", "tree", "list"],
+        defaultsTo: "tree");
+  }
+
+  Future onRun() {
+    return entrypoint.loadPackageGraph().then((graph) {
+      _graph = graph;
+      _buffer = new StringBuffer();
+
+      _buffer.writeln(_labelPackage(entrypoint.root));
+
+      switch (commandOptions["style"]) {
+        case "compact": _outputCompact(); break;
+        case "list": _outputList(); break;
+        case "tree": _outputTree(); break;
+      }
+
+      log.message(_buffer);
+    });
+  }
+
+  /// Outputs a list of all of the package's immediate, dev, override, and
+  /// transitive dependencies.
+  ///
+  /// For each dependency listed, *that* package's immediate dependencies are
+  /// shown. Unlike [_outputList], this prints all of these dependencies on one
+  /// line.
+  void _outputCompact() {
+    var root = entrypoint.root;
+    _outputCompactPackages("dependencies",
+        root.dependencies.map((dep) => dep.name));
+    _outputCompactPackages("dev dependencies",
+        root.devDependencies.map((dep) => dep.name));
+    _outputCompactPackages("dependency overrides",
+        root.dependencyOverrides.map((dep) => dep.name));
+
+    var transitive = _getTransitiveDependencies();
+    _outputCompactPackages("transitive dependencies", transitive);
+  }
+
+  /// Outputs one section of packages in the compact output.
+  _outputCompactPackages(String section, Iterable<String> names) {
+    if (names.isEmpty) return;
+
+    _buffer.writeln();
+    _buffer.writeln("$section:");
+    for (var name in ordered(names)) {
+      var package = _graph.packages[name];
+
+      _buffer.write("- ${_labelPackage(package)}");
+      if (package.dependencies.isEmpty) {
+        _buffer.writeln();
+      } else {
+        var depNames = package.dependencies.map((dep) => dep.name);
+        var depsList = "[${depNames.join(' ')}]";
+        _buffer.writeln(" ${log.gray(depsList)}");
+      }
+    }
+  }
+
+  /// Outputs a list of all of the package's immediate, dev, override, and
+  /// transitive dependencies.
+  ///
+  /// For each dependency listed, *that* package's immediate dependencies are
+  /// shown.
+  void _outputList() {
+    var root = entrypoint.root;
+    _outputListSection("dependencies",
+        root.dependencies.map((dep) => dep.name));
+    _outputListSection("dev dependencies",
+        root.devDependencies.map((dep) => dep.name));
+    _outputListSection("dependency overrides",
+        root.dependencyOverrides.map((dep) => dep.name));
+
+    var transitive = _getTransitiveDependencies();
+    if (transitive.isEmpty) return;
+
+    _outputListSection("transitive dependencies", ordered(transitive));
+  }
+
+  /// Outputs one section of packages in the list output.
+  _outputListSection(String name, Iterable<String> deps) {
+    if (deps.isEmpty) return;
+
+    _buffer.writeln();
+    _buffer.writeln("$name:");
+
+    for (var name in deps) {
+      var package = _graph.packages[name];
+      _buffer.writeln("- ${_labelPackage(package)}");
+
+      for (var dep in package.dependencies) {
+        _buffer.writeln(
+            "  - ${log.bold(dep.name)} ${log.gray(dep.constraint)}");
+      }
+    }
+  }
+
+  /// Generates a dependency tree for the root package.
+  ///
+  /// If a package is encountered more than once (i.e. a shared or circular
+  /// dependency), later ones are not traversed. This is done in breadth-first
+  /// fashion so that a package will always be expanded at the shallowest
+  /// depth that it appears at.
+  void _outputTree() {
+    // The work list for the breadth-first traversal. It contains the package
+    // being added to the tree, and the parent map that will receive that
+    // package.
+    var toWalk = new Queue<Pair<Package, Map>>();
+    var visited = new Set<String>();
+
+    // Start with the root dependencies.
+    var packageTree = {};
+    for (var dep in entrypoint.root.immediateDependencies) {
+      toWalk.add(new Pair(_graph.packages[dep.name], packageTree));
+    }
+
+    // Do a breadth-first walk to the dependency graph.
+    while (toWalk.isNotEmpty) {
+      var pair = toWalk.removeFirst();
+      var package = pair.first;
+      var map = pair.last;
+
+      if (visited.contains(package.name)) {
+        map[log.gray('${package.name}...')] = {};
+        continue;
+      }
+
+      visited.add(package.name);
+
+      // Populate the map with this package's dependencies.
+      var childMap = {};
+      map[_labelPackage(package)] = childMap;
+
+      for (var dep in package.dependencies) {
+        toWalk.add(new Pair(_graph.packages[dep.name], childMap));
+      }
+    }
+
+    _buffer.write(tree.fromMap(packageTree, showAllChildren: true));
+  }
+
+  String _labelPackage(Package package) =>
+      "${log.bold(package.name)} ${package.version}";
+
+  /// Gets the names of the non-immediate dependencies of the root package.
+  Set<String> _getTransitiveDependencies() {
+    var transitive = _graph.packages.keys.toSet();
+    var root = entrypoint.root;
+    transitive.remove(root.name);
+    transitive.removeAll(root.dependencies.map((dep) => dep.name));
+    transitive.removeAll(root.devDependencies.map((dep) => dep.name));
+    transitive.removeAll(root.dependencyOverrides.map((dep) => dep.name));
+    return transitive;
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/command/lish.dart b/sdk/lib/_internal/pub/lib/src/command/lish.dart
index d5e4676..91bfacf 100644
--- a/sdk/lib/_internal/pub/lib/src/command/lish.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/lish.dart
@@ -9,7 +9,7 @@
 import 'package:http/http.dart' as http;
 
 import '../command.dart';
-import '../directory_tree.dart';
+import '../ascii_tree.dart' as tree;
 import '../http.dart';
 import '../io.dart';
 import '../log.dart' as log;
@@ -103,7 +103,7 @@
       var package = entrypoint.root;
       log.message(
           'Publishing ${package.name} ${package.version} to $server:\n'
-          '${generateTree(files, baseDir: entrypoint.root.dir)}');
+          '${tree.fromFiles(files, baseDir: entrypoint.root.dir)}');
 
       return createTarGz(files, baseDir: entrypoint.root.dir);
     }).then((stream) => stream.toBytes());
diff --git a/sdk/lib/_internal/pub/lib/src/command/serve.dart b/sdk/lib/_internal/pub/lib/src/command/serve.dart
index f7c140a..a2cc64e 100644
--- a/sdk/lib/_internal/pub/lib/src/command/serve.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/serve.dart
@@ -8,25 +8,22 @@
 import 'dart:math' as math;
 
 import 'package:barback/barback.dart';
-import 'package:path/path.dart' as p;
 
 import '../barback/build_environment.dart';
 import '../barback/pub_package_provider.dart';
-import '../command.dart';
-import '../io.dart';
 import '../log.dart' as log;
 import '../utils.dart';
+import 'barback.dart';
 
 final _arrow = getSpecial('\u2192', '=>');
 
 /// Handles the `serve` pub command.
-class ServeCommand extends PubCommand {
+class ServeCommand extends BarbackCommand {
   String get description =>
       'Run a local web development server.\n\n'
       'By default, this serves "web/" and "test/", but an explicit list of \n'
       'directories to serve can be provided as well.';
   String get usage => "pub serve [directories...]";
-  final takesArguments = true;
 
   PubPackageProvider _provider;
 
@@ -51,8 +48,9 @@
   /// `true` if the admin server URL should be displayed on startup.
   bool get logAdminUrl => commandOptions['log-admin-url'];
 
-  /// The build mode.
-  BarbackMode get mode => new BarbackMode(commandOptions['mode']);
+  BarbackMode get defaultMode => BarbackMode.DEBUG;
+
+  List<String> get defaultSourceDirectories => ["web", "test"];
 
   /// This completer is used to keep pub running (by not completing) and to
   /// pipe fatal errors to pub's top-level error-handling machinery.
@@ -78,24 +76,20 @@
         help: 'Compile Dart to JavaScript.');
     commandParser.addFlag('force-poll', defaultsTo: false,
         help: 'Force the use of a polling filesystem watcher.');
-    commandParser.addOption('mode', defaultsTo: BarbackMode.DEBUG.toString(),
-        help: 'Mode to run transformers in.');
   }
 
-  Future onRun() {
+  Future onRunTransformerCommand() {
     var port = parseInt(commandOptions['port'], 'port');
     var adminPort = commandOptions['admin-port'] == null ? null :
         parseInt(commandOptions['admin-port'], 'admin port');
 
-    var directories = _parseDirectoriesToServe();
-
     var watcherType = commandOptions['force-poll'] ?
         WatcherType.POLLING : WatcherType.AUTO;
 
     return BuildEnvironment.create(entrypoint, hostname, port, mode,
         watcherType, useDart2JS: useDart2JS).then((environment) {
 
-      var directoryLength = directories.map((dir) => dir.length)
+      var directoryLength = sourceDirectories.map((dir) => dir.length)
           .reduce(math.max);
 
       return environment.startAdminServer(adminPort).then((server) {
@@ -113,7 +107,7 @@
         // that we don't log spurious build results in the middle of listing
         // out the bound servers.
         environment.pauseUpdates();
-        return Future.forEach(directories, (directory) {
+        return Future.forEach(sourceDirectories, (directory) {
           return _startServer(environment, directory, directoryLength);
         });
       }).then((_) {
@@ -178,50 +172,6 @@
     });
   }
 
-  /// Returns the set of directories that will be served from servers exposed
-  /// to the user.
-  ///
-  /// Throws a [UsageException] if the command-line arguments are invalid.
-  List<String> _parseDirectoriesToServe() {
-    if (commandOptions.rest.isEmpty) {
-      var directories = ['web', 'test'].where(dirExists).toList();
-      if (directories.isNotEmpty) return directories;
-      usageError(
-          'Your package must have "web" and/or "test" directories to serve,\n'
-          'or you must pass in directories to serve explicitly.');
-    }
-
-    var directories = commandOptions.rest.map(p.normalize).toList();
-    var invalid = directories.where((dir) => !p.isWithin('.', dir));
-    if (invalid.isNotEmpty) {
-      usageError("${_directorySentence(invalid, "isn't", "aren't")} in this "
-          "package.");
-    }
-
-    var nonExistent = directories.where((dir) => !dirExists(dir));
-    if (nonExistent.isNotEmpty) {
-      usageError("${_directorySentence(nonExistent, "doesn't", "don't")} "
-          "exist.");
-    }
-
-    return directories;
-  }
-
-  /// Converts a list of [directoryNames] to a sentence.
-  ///
-  /// After the list of directories, [singularVerb] will be used if there is
-  /// only one directory and [pluralVerb] will be used if there are more than
-  /// one.
-  String _directorySentence(Iterable<String> directoryNames,
-      String singularVerb, String pluralVerb) {
-    var directories = pluralize('Directory', directoryNames.length,
-        plural: 'Directories');
-    var names = toSentence(ordered(directoryNames).map((dir) => '"$dir"'));
-    var verb = pluralize(singularVerb, directoryNames.length,
-        plural: pluralVerb);
-    return "$directories $names $verb";
-  }
-
   /// Reports [error] and exits the server.
   void _fatalError(error, [stackTrace]) {
     if (_completer.isCompleted) return;
diff --git a/sdk/lib/_internal/pub/lib/src/directory_tree.dart b/sdk/lib/_internal/pub/lib/src/directory_tree.dart
deleted file mode 100644
index b0d0710..0000000
--- a/sdk/lib/_internal/pub/lib/src/directory_tree.dart
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// A simple library for rendering a list of files as a directory tree.
-library pub.directory_tree;
-
-import 'package:path/path.dart' as path;
-
-import 'utils.dart';
-
-/// Draws a directory tree for the given list of files. Given a list of files
-/// like:
-///
-///     TODO
-///     example/console_example.dart
-///     example/main.dart
-///     example/web copy/web_example.dart
-///     test/absolute_test.dart
-///     test/basename_test.dart
-///     test/dirname_test.dart
-///     test/extension_test.dart
-///     test/is_absolute_test.dart
-///     test/is_relative_test.dart
-///     test/join_test.dart
-///     test/normalize_test.dart
-///     test/relative_test.dart
-///     test/split_test.dart
-///     .gitignore
-///     README.md
-///     lib/path.dart
-///     pubspec.yaml
-///     test/all_test.dart
-///     test/path_posix_test.dart
-///     test/path_windows_test.dart
-///
-/// this will render:
-///
-///     |-- .gitignore
-///     |-- README.md
-///     |-- TODO
-///     |-- example
-///     |   |-- console_example.dart
-///     |   |-- main.dart
-///     |   '-- web copy
-///     |       '-- web_example.dart
-///     |-- lib
-///     |   '-- path.dart
-///     |-- pubspec.yaml
-///     '-- test
-///         |-- absolute_test.dart
-///         |-- all_test.dart
-///         |-- basename_test.dart
-///         | (7 more...)
-///         |-- path_windows_test.dart
-///         |-- relative_test.dart
-///         '-- split_test.dart
-///
-/// If [baseDir] is passed, it will be used as the root of the tree.
-String generateTree(List<String> files, {String baseDir}) {
-  // Parse out the files into a tree of nested maps.
-  var root = {};
-  for (var file in files) {
-    if (baseDir != null) file = path.relative(file, from: baseDir);
-    var parts = path.split(file);
-    var directory = root;
-    for (var part in path.split(file)) {
-      directory = directory.putIfAbsent(part, () => {});
-    }
-  }
-
-  // Walk the map recursively and render to a string.
-  var buffer = new StringBuffer();
-  _draw(buffer, '', false, null, root);
-  return buffer.toString();
-}
-
-void _drawLine(StringBuffer buffer, String prefix, bool isLastChild,
-               String name) {
-  // Print lines.
-  buffer.write(prefix);
-  if (name != null) {
-    if (isLastChild) {
-      buffer.write("'-- ");
-    } else {
-      buffer.write("|-- ");
-    }
-  }
-
-  // Print name.
-  buffer.writeln(name);
-}
-
-String _getPrefix(bool isRoot, bool isLast) {
-  if (isRoot) return "";
-  if (isLast) return "    ";
-  return "|   ";
-}
-
-void _draw(StringBuffer buffer, String prefix, bool isLast,
-                 String name, Map children) {
-  // Don't draw a line for the root node.
-  if (name != null) _drawLine(buffer, prefix, isLast, name);
-
-  // Recurse to the children.
-  var childNames = ordered(children.keys);
-
-  _drawChild(bool isLastChild, String child) {
-    var childPrefix = _getPrefix(name == null, isLast);
-    _draw(buffer, '$prefix$childPrefix', isLastChild, child, children[child]);
-  }
-
-  if (name == null || childNames.length <= 10) {
-    // Not too many, so show all the children.
-    for (var i = 0; i < childNames.length; i++) {
-      _drawChild(i == childNames.length - 1, childNames[i]);
-    }
-  } else {
-    // Show the first few.
-    _drawChild(false, childNames[0]);
-    _drawChild(false, childNames[1]);
-    _drawChild(false, childNames[2]);
-
-    // Elide the middle ones.
-    buffer.write(prefix);
-    buffer.write(_getPrefix(name == null, isLast));
-    buffer.writeln('| (${childNames.length - 6} more...)');
-
-    // Show the last few.
-    _drawChild(false, childNames[childNames.length - 3]);
-    _drawChild(false, childNames[childNames.length - 2]);
-    _drawChild(true, childNames[childNames.length - 1]);
-  }
-}
diff --git a/sdk/lib/_internal/pub/lib/src/git.dart b/sdk/lib/_internal/pub/lib/src/git.dart
index 3f61dc1..510ca7e 100644
--- a/sdk/lib/_internal/pub/lib/src/git.dart
+++ b/sdk/lib/_internal/pub/lib/src/git.dart
@@ -11,6 +11,22 @@
 import 'io.dart';
 import 'log.dart' as log;
 
+/// An exception thrown because a git command failed.
+class GitException implements Exception {
+  /// The arguments to the git command.
+  final List<String> args;
+
+  /// The standard error emitted by git.
+  final String stderr;
+
+  String get message => 'Git error. Command: git ${args.join(" ")}\n$stderr';
+
+  GitException(Iterable<String> args, this.stderr)
+      : args = args.toList();
+
+  String toString() => message;
+}
+
 /// Tests whether or not the git command-line app is available for use.
 Future<bool> get isInstalled {
   if (_isGitInstalledCache != null) {
@@ -28,10 +44,7 @@
     return runProcess(git, args, workingDir: workingDir,
         environment: environment);
   }).then((result) {
-    if (!result.success) throw new Exception(
-        'Git error. Command: git ${args.join(" ")}\n'
-        '${result.stderr.join("\n")}');
-
+    if (!result.success) throw new GitException(args, result.stderr.join("\n"));
     return result.stdout;
   });
 }
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index b054a77..09cbea8 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -318,7 +318,7 @@
 /// new empty directory will be created.
 void cleanDir(String dir) {
   if (entryExists(dir)) deleteEntry(dir);
-  createDir(dir);
+  ensureDir(dir);
 }
 
 /// Renames (i.e. moves) the directory [from] to [to].
diff --git a/sdk/lib/_internal/pub/lib/src/oauth2.dart b/sdk/lib/_internal/pub/lib/src/oauth2.dart
index f3b1c27..b1edba0 100644
--- a/sdk/lib/_internal/pub/lib/src/oauth2.dart
+++ b/sdk/lib/_internal/pub/lib/src/oauth2.dart
@@ -9,6 +9,8 @@
 
 import 'package:oauth2/oauth2.dart';
 import 'package:path/path.dart' as path;
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as shelf_io;
 
 import 'http.dart';
 import 'io.dart';
@@ -167,7 +169,27 @@
   // Spin up a one-shot HTTP server to receive the authorization code from the
   // Google OAuth2 server via redirect. This server will close itself as soon as
   // the code is received.
-  return HttpServer.bind('127.0.0.1', 0).then((server) {
+  var server;
+  var completer = new Completer();
+  shelf_io.serve((request) {
+    if (request.url.path != "/") {
+      return new shelf.Response.notFound('Invalid URI.');
+    }
+
+    log.message('Authorization received, processing...');
+    var queryString = request.url.query;
+    if (queryString == null) queryString = '';
+
+    // Closing the server here is safe, since it will wait until the response is
+    // sent to actually shut down.
+    server.close();
+    chainToCompleter(grant.handleAuthorizationResponse(queryToMap(queryString)),
+        completer);
+
+    return new shelf.Response.found('http://pub.dartlang.org/authorized');
+  }, '127.0.0.1', 0).then((server_) {
+    server = server_;
+
     var authUrl = grant.getAuthorizationUrl(
         Uri.parse('http://127.0.0.1:${server.port}'), scopes: _scopes);
 
@@ -176,28 +198,9 @@
         'In a web browser, go to $authUrl\n'
         'Then click "Allow access".\n\n'
         'Waiting for your authorization...');
-    return server.first.then((request) {
-      var response = request.response;
-      if (request.uri.path == "/") {
-        log.message('Authorization received, processing...');
-        var queryString = request.uri.query;
-        if (queryString == null) queryString = '';
-        response.statusCode = 302;
-        response.headers.set('location',
-                             'http://pub.dartlang.org/authorized');
-        response.close();
-        return grant.handleAuthorizationResponse(queryToMap(queryString))
-        .then((client) {
-          server.close();
-          return client;
-        });
-      } else {
-        response.statusCode = 404;
-        response.close();
-      }
-    });
-  })
-  .then((client) {
+  });
+
+  return completer.future.then((client) {
     log.message('Successfully authorized.\n');
     return client;
   });
diff --git a/sdk/lib/_internal/pub/lib/src/source/git.dart b/sdk/lib/_internal/pub/lib/src/source/git.dart
index 2981ebe..3b47cb4 100644
--- a/sdk/lib/_internal/pub/lib/src/source/git.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/git.dart
@@ -20,6 +20,10 @@
 
   final bool shouldCache = true;
 
+  /// The paths to the canonical clones of repositories for which "git fetch"
+  /// has already been run during this run of pub.
+  final _updatedRepos = new Set<String>();
+
   GitSource();
 
   /// Clones a Git repo to the local filesystem.
@@ -45,7 +49,7 @@
       }
 
       ensureDir(path.join(systemCacheRoot, 'cache'));
-      return _ensureRepoCache(id);
+      return _ensureRevision(id);
     }).then((_) => systemCacheDirectory(id)).then((path) {
       revisionCachePath = path;
       if (entryExists(revisionCachePath)) return null;
@@ -61,7 +65,7 @@
 
   /// Returns the path to the revision-specific cache of [id].
   Future<String> systemCacheDirectory(PackageId id) {
-    return _revisionAt(id).then((rev) {
+    return _ensureRevision(id).then((rev) {
       var revisionCacheName = '${id.name}-$rev';
       return path.join(systemCacheRoot, revisionCacheName);
     });
@@ -107,7 +111,7 @@
 
   /// Attaches a specific commit to [id] to disambiguate it.
   Future<PackageId> resolveId(PackageId id) {
-    return _revisionAt(id).then((revision) {
+    return _ensureRevision(id).then((revision) {
       var description = {'url': _getUrl(id), 'ref': _getRef(id)};
       description['resolved-ref'] = revision;
       return new PackageId(id.name, name, id.version, description);
@@ -117,22 +121,55 @@
   // TODO(keertip): Implement getCachedPackages().
 
   /// Ensure that the canonical clone of the repository referred to by [id] (the
-  /// one in `<system cache>/git/cache`) exists and is up-to-date. Returns a
-  /// future that completes once this is finished and throws an exception if it
-  /// fails.
-  Future _ensureRepoCache(PackageId id) {
+  /// one in `<system cache>/git/cache`) exists and contains the revision
+  /// referred to by [id].
+  ///
+  /// Returns a future that completes to the hash of the revision identified by
+  /// [id].
+  Future<String> _ensureRevision(PackageId id) {
     return syncFuture(() {
       var path = _repoCachePath(id);
-      if (!entryExists(path)) return _clone(_getUrl(id), path, mirror: true);
-      return git.run(["fetch"], workingDir: path).then((result) => null);
+      if (!entryExists(path)) {
+        return _clone(_getUrl(id), path, mirror: true)
+            .then((_) => _revParse(id));
+      }
+
+      // If [id] didn't come from a lockfile, it may be using a symbolic
+      // reference. We want to get the latest version of that reference.
+      var description = id.description;
+      if (description is! Map || !description.containsKey('resolved-ref')) {
+        return _updateRepoCache(id).then((_) => _revParse(id));
+      }
+
+      // If [id] did come from a lockfile, then we want to avoid running "git
+      // fetch" if possible to avoid networking time and errors. See if the
+      // revision exists in the repo cache before updating it.
+      return _revParse(id).catchError((error) {
+        if (error is! git.GitException) throw error;
+        return _updateRepoCache(id).then((_) => _revParse(id));
+      });
     });
   }
 
-  /// Returns a future that completes to the revision hash of [id].
-  Future<String> _revisionAt(PackageId id) {
-    return _ensureRepoCache(id).then((_) =>
-        git.run(["rev-parse", _getEffectiveRef(id)],
-            workingDir: _repoCachePath(id)).then((result) => result[0]));
+  /// Runs "git fetch" in the canonical clone of the repository referred to by
+  /// [id].
+  ///
+  /// This assumes that the canonical clone already exists.
+  Future _updateRepoCache(PackageId id) {
+    var path = _repoCachePath(id);
+    if (_updatedRepos.contains(path)) return new Future.value();
+    return git.run(["fetch"], workingDir: path).then((_) {
+      _updatedRepos.add(path);
+    });
+  }
+
+  /// Runs "git rev-parse" in the canonical clone of the repository referred to
+  /// by [id] on the effective ref of [id].
+  ///
+  /// This assumes that the canonical clone already exists.
+  Future<String> _revParse(PackageId id) {
+    return git.run(["rev-parse", _getEffectiveRef(id)],
+        workingDir: _repoCachePath(id)).then((result) => result.first);
   }
 
   /// Clones the repo at the URI [from] to the path [to] on the local
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index f5727a4..2dec803 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -15,6 +15,7 @@
 
 import "package:analyzer/analyzer.dart";
 import "package:crypto/crypto.dart";
+import "package:http/http.dart" as http;
 import 'package:path/path.dart' as path;
 import "package:stack_trace/stack_trace.dart";
 
@@ -687,9 +688,9 @@
   return lines.join('\n');
 }
 
-/// Whether pub is running as a subprocess in an integration test.
-bool get runningAsTest =>
-  Platform.environment.containsKey('_PUB_TESTING');
+/// Whether pub is running as a subprocess in an integration test or in a unit
+/// test that has explicitly set this.
+bool runningAsTest = Platform.environment.containsKey('_PUB_TESTING');
 
 /// Wraps [fn] to guard against several different kinds of stack overflow
 /// exceptions:
@@ -833,6 +834,8 @@
 /// All the names of user-facing exceptions.
 final _userFacingExceptions = new Set<String>.from([
   'ApplicationException',
+  // This refers to http.ClientException.
+  'ClientException',
   // Errors coming from the Dart analyzer are probably caused by syntax errors
   // in user code, so they're user-facing.
   'AnalyzerError', 'AnalyzerErrorGroup',
@@ -840,7 +843,7 @@
   // invalid import.
   'IsolateSpawnException',
   // TODO(nweiz): clean up the dart:io errors when issue 9955 is fixed.
-  'FileSystemException', 'HttpException', 'HttpException', 'OSError',
+  'FileSystemException', 'HttpException', 'OSError',
   'ProcessException', 'SocketException', 'WebSocketException'
 ]);
 
@@ -859,7 +862,7 @@
     error is IsolateSpawnException ||
     error is FileSystemException ||
     error is HttpException ||
-    error is HttpException ||
+    error is http.ClientException ||
     error is OSError ||
     error is ProcessException ||
     error is SocketException ||
diff --git a/sdk/lib/_internal/pub/test/ascii_tree_test.dart b/sdk/lib/_internal/pub/test/ascii_tree_test.dart
new file mode 100644
index 0000000..96d81ee
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/ascii_tree_test.dart
@@ -0,0 +1,248 @@
+// 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 lock_file_test;
+
+import 'package:unittest/unittest.dart';
+
+import '../lib/src/ascii_tree.dart' as tree;
+import '../lib/src/utils.dart';
+
+main() {
+  runningAsTest = true;
+
+  group('tree.fromFiles', () {
+    test('no files', () {
+      expect(tree.fromFiles([]), equals(""));
+    });
+
+    test('up to ten files in one directory are shown', () {
+      var files = [
+        "dir/a.dart",
+        "dir/b.dart",
+        "dir/c.dart",
+        "dir/d.dart",
+        "dir/e.dart",
+        "dir/f.dart",
+        "dir/g.dart",
+        "dir/h.dart",
+        "dir/i.dart",
+        "dir/j.dart"
+      ];
+      expect(tree.fromFiles(files), equals("""
+'-- dir
+    |-- a.dart
+    |-- b.dart
+    |-- c.dart
+    |-- d.dart
+    |-- e.dart
+    |-- f.dart
+    |-- g.dart
+    |-- h.dart
+    |-- i.dart
+    '-- j.dart
+"""));
+    });
+
+    test('files are elided if there are more than ten', () {
+      var files = [
+        "dir/a.dart",
+        "dir/b.dart",
+        "dir/c.dart",
+        "dir/d.dart",
+        "dir/e.dart",
+        "dir/f.dart",
+        "dir/g.dart",
+        "dir/h.dart",
+        "dir/i.dart",
+        "dir/j.dart",
+        "dir/k.dart"
+      ];
+      expect(tree.fromFiles(files), equals("""
+'-- dir
+    |-- a.dart
+    |-- b.dart
+    |-- c.dart
+    | (5 more...)
+    |-- i.dart
+    |-- j.dart
+    '-- k.dart
+"""));
+    });
+
+    test('files are not elided at the top level', () {
+      var files = [
+        "a.dart",
+        "b.dart",
+        "c.dart",
+        "d.dart",
+        "e.dart",
+        "f.dart",
+        "g.dart",
+        "h.dart",
+        "i.dart",
+        "j.dart",
+        "k.dart"
+      ];
+      expect(tree.fromFiles(files), equals("""
+|-- a.dart
+|-- b.dart
+|-- c.dart
+|-- d.dart
+|-- e.dart
+|-- f.dart
+|-- g.dart
+|-- h.dart
+|-- i.dart
+|-- j.dart
+'-- k.dart
+"""));
+    });
+
+    test('a complex example', () {
+      var files = [
+        "TODO",
+        "example/console_example.dart",
+        "example/main.dart",
+        "example/web copy/web_example.dart",
+        "test/absolute_test.dart",
+        "test/basename_test.dart",
+        "test/dirname_test.dart",
+        "test/extension_test.dart",
+        "test/is_absolute_test.dart",
+        "test/is_relative_test.dart",
+        "test/join_test.dart",
+        "test/normalize_test.dart",
+        "test/relative_test.dart",
+        "test/split_test.dart",
+        ".gitignore",
+        "README.md",
+        "lib/path.dart",
+        "pubspec.yaml",
+        "test/all_test.dart",
+        "test/path_posix_test.dart",
+        "test/path_windows_test.dart"
+      ];
+
+      expect(tree.fromFiles(files), equals("""
+|-- .gitignore
+|-- README.md
+|-- TODO
+|-- example
+|   |-- console_example.dart
+|   |-- main.dart
+|   '-- web copy
+|       '-- web_example.dart
+|-- lib
+|   '-- path.dart
+|-- pubspec.yaml
+'-- test
+    |-- absolute_test.dart
+    |-- all_test.dart
+    |-- basename_test.dart
+    | (7 more...)
+    |-- path_windows_test.dart
+    |-- relative_test.dart
+    '-- split_test.dart
+"""));
+    });
+  });
+
+  group('treeFromMap', () {
+    test('empty map', () {
+      expect(tree.fromMap({}), equals(""));
+    });
+
+    test('a complex example', () {
+      var map = {
+        ".gitignore": {},
+        "README.md": {},
+        "TODO": {},
+        "example": {
+          "console_example.dart": {},
+          "main.dart": {},
+          "web copy": {
+            "web_example.dart": {}
+          },
+        },
+        "lib": {
+          "path.dart": {}
+        },
+        "pubspec.yaml": {},
+        "test": {
+          "absolute_test.dart": {},
+          "basename_test.dart": {},
+          "dirname_test.dart": {},
+          "extension_test.dart": {},
+          "is_absolute_test.dart": {},
+          "is_relative_test.dart": {},
+          "join_test.dart": {},
+          "normalize_test.dart": {},
+          "relative_test.dart": {},
+          "split_test.dart": {}
+        }
+      };
+
+      expect(tree.fromMap(map), equals("""
+|-- .gitignore
+|-- README.md
+|-- TODO
+|-- example
+|   |-- console_example.dart
+|   |-- main.dart
+|   '-- web copy
+|       '-- web_example.dart
+|-- lib
+|   '-- path.dart
+|-- pubspec.yaml
+'-- test
+    |-- absolute_test.dart
+    |-- basename_test.dart
+    |-- dirname_test.dart
+    |-- extension_test.dart
+    |-- is_absolute_test.dart
+    |-- is_relative_test.dart
+    |-- join_test.dart
+    |-- normalize_test.dart
+    |-- relative_test.dart
+    '-- split_test.dart
+"""));
+    });
+  });
+
+  test('does not elide children if showAllChildren is true', () {
+    var map = {
+      'dir': {
+        'a.dart': {},
+        'b.dart': {},
+        'c.dart': {},
+        'd.dart': {},
+        'e.dart': {},
+        'f.dart': {},
+        'g.dart': {},
+        'h.dart': {},
+        'i.dart': {},
+        'j.dart': {},
+        'k.dart': {},
+        'l.dart': {},
+      }
+    };
+    expect(tree.fromMap(map, showAllChildren: true), equals("""
+'-- dir
+    |-- a.dart
+    |-- b.dart
+    |-- c.dart
+    |-- d.dart
+    |-- e.dart
+    |-- f.dart
+    |-- g.dart
+    |-- h.dart
+    |-- i.dart
+    |-- j.dart
+    |-- k.dart
+    '-- l.dart
+"""));
+  });
+
+}
diff --git a/sdk/lib/_internal/pub/test/barback/all_includes_all_default_directories_test.dart b/sdk/lib/_internal/pub/test/barback/all_includes_all_default_directories_test.dart
new file mode 100644
index 0000000..bc214e4
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/barback/all_includes_all_default_directories_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../serve/utils.dart';
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir('benchmark', [d.file('file.txt', 'benchmark')]),
+      d.dir('bin',       [d.file('file.txt', 'bin')]),
+      d.dir('example',   [d.file('file.txt', 'example')]),
+      d.dir('test',      [d.file('file.txt', 'test')]),
+      d.dir('web',       [d.file('file.txt', 'web')]),
+      d.dir('unknown',   [d.file('file.txt', 'unknown')])
+    ]).create();
+  });
+
+  integration("build --all finds assets in default source directories", () {
+    schedulePub(args: ["build", "--all"],
+        output: new RegExp(r'Built 5 files to "build".'));
+
+    d.dir(appPath, [
+      d.dir('build', [
+        d.dir('benchmark', [
+          d.file('file.txt', 'benchmark')
+        ]),
+        d.dir('bin', [
+          d.file('file.txt', 'bin')
+        ]),
+        d.dir('example', [
+          d.file('file.txt', 'example')
+        ]),
+        d.dir('test', [
+          d.file('file.txt', 'test')
+        ]),
+        d.dir('web', [
+          d.file('file.txt', 'web')
+        ]),
+        // Only includes default source directories.
+        d.nothing('unknown')
+      ])
+    ]).validate();
+  });
+
+  integration("serve --all finds assets in default source directories", () {
+    pubServe(args: ["--all"]);
+
+    requestShouldSucceed("file.txt", "benchmark", root: "benchmark");
+    requestShouldSucceed("file.txt", "bin", root: "bin");
+    requestShouldSucceed("file.txt", "example", root: "example");
+    requestShouldSucceed("file.txt", "test", root: "test");
+    requestShouldSucceed("file.txt", "web", root: "web");
+
+    expectNotServed("unknown");
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/barback/directory_args_test.dart b/sdk/lib/_internal/pub/test/barback/directory_args_test.dart
new file mode 100644
index 0000000..59ce17e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/barback/directory_args_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir('asset', [d.file('file.txt', 'asset')]),
+      d.dir('bar', [d.file('file.txt', 'bar')]),
+      d.dir('foo', [d.file('file.txt', 'foo')]),
+      d.dir('test', [d.file('file.txt', 'test')]),
+      d.dir('web', [d.file('file.txt', 'web')])
+    ]).create();
+  });
+
+  integration("builds only the given directories", () {
+    schedulePub(args: ["build", "foo", "bar"],
+        output: new RegExp(r'Built 4 files to "build".'));
+
+    d.dir(appPath, [
+      d.dir('build', [
+        d.dir('bar', [
+          d.file('file.txt', 'bar'),
+          d.dir('assets', [
+            d.dir('myapp', [
+              d.file('file.txt', 'asset')
+            ])
+          ])
+        ]),
+        d.dir('foo', [
+          d.file('file.txt', 'foo'),
+          d.dir('assets', [
+            d.dir('myapp', [
+              d.file('file.txt', 'asset')
+            ])
+          ])
+        ]),
+        d.nothing('test'),
+        d.nothing('web')
+      ])
+    ]).validate();
+  });
+
+  integration("serves only the given directories", () {
+    pubServe(args: ["foo", "bar"]);
+
+    requestShouldSucceed("file.txt", "bar", root: "bar");
+    requestShouldSucceed("file.txt", "foo", root: "foo");
+    expectNotServed("test");
+    expectNotServed("web");
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/barback/fails_if_args_with_all_test.dart b/sdk/lib/_internal/pub/test/barback/fails_if_args_with_all_test.dart
new file mode 100644
index 0000000..42f7943
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/barback/fails_if_args_with_all_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    d.appDir().create();
+  });
+
+  pubBuildAndServeShouldFail("if a directory is passed with --all",
+      args: ["example", "--all"],
+      error: 'Directory names are not allowed if "--all" is passed.',
+      exitCode: exit_codes.USAGE);
+}
diff --git a/sdk/lib/_internal/pub/test/barback/fails_if_dir_arg_does_not_exist_test.dart b/sdk/lib/_internal/pub/test/barback/fails_if_dir_arg_does_not_exist_test.dart
new file mode 100644
index 0000000..2f5d56e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/barback/fails_if_dir_arg_does_not_exist_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("bar", [
+        d.file("file.txt", "contents")
+      ])
+    ]).create();
+  });
+
+  pubBuildAndServeShouldFail("if a specified directory doesn't exist",
+      args: ["foo", "bar", "baz"],
+      error: 'Directories "foo" and "baz" do not exist.',
+      exitCode: exit_codes.DATA);
+}
diff --git a/sdk/lib/_internal/pub/test/barback/fails_if_dir_outside_package_test.dart b/sdk/lib/_internal/pub/test/barback/fails_if_dir_outside_package_test.dart
new file mode 100644
index 0000000..7e66218
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/barback/fails_if_dir_outside_package_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    d.appDir().create();
+  });
+
+  pubBuildAndServeShouldFail("if source directory reaches outside the package",
+      args: [".."],
+      error: 'Directory ".." isn\'t in this package.',
+      exitCode: exit_codes.USAGE);
+}
diff --git a/sdk/lib/_internal/pub/test/barback/fails_if_no_default_dirs_test.dart b/sdk/lib/_internal/pub/test/barback/fails_if_no_default_dirs_test.dart
new file mode 100644
index 0000000..3b0aa97
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/barback/fails_if_no_default_dirs_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    d.appDir().create();
+  });
+
+  pubBuildAndServeShouldFail("if no directories were passed and no default "
+          "ones exist",
+      args: [],
+      buildError: 'Your package must have a "web" directory,\n'
+          'or you must specify the source directories.',
+      serveError: 'Your package must have "web" and/or "test" directories,\n'
+          'or you must specify the source directories.',
+      exitCode: exit_codes.DATA);
+}
diff --git a/sdk/lib/_internal/pub/test/barback/fails_on_all_with_no_buildable_directories_test.dart b/sdk/lib/_internal/pub/test/barback/fails_on_all_with_no_buildable_directories_test.dart
new file mode 100644
index 0000000..8c0a06f
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/barback/fails_on_all_with_no_buildable_directories_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    d.appDir().create();
+  });
+
+  pubBuildAndServeShouldFail("on --all with no default source directories",
+      args: ["--all"],
+      error: 'There are no source directories present.\n'
+        'The default directories are "benchmark", "bin", "example", '
+        '"test" and "web".',
+      exitCode: exit_codes.DATA);
+}
diff --git a/sdk/lib/_internal/pub/test/barback/fails_on_disallowed_directories_test.dart b/sdk/lib/_internal/pub/test/barback/fails_on_disallowed_directories_test.dart
new file mode 100644
index 0000000..11cf657
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/barback/fails_on_disallowed_directories_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as path;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    d.appDir().create();
+  });
+
+  var libSub = path.join("lib", "sub");
+  pubBuildAndServeShouldFail("if given directories are not allowed",
+      args: [libSub, "asset"],
+      error: 'Directories "$libSub" and "asset" are not allowed.',
+      exitCode: exit_codes.USAGE);
+}
diff --git a/sdk/lib/_internal/pub/test/barback/fails_on_overlapping_directories_test.dart b/sdk/lib/_internal/pub/test/barback/fails_on_overlapping_directories_test.dart
new file mode 100644
index 0000000..8e98b86
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/barback/fails_on_overlapping_directories_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as path;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.dir("sub1", [
+          d.file("file.txt", "contents"),
+          d.dir("sub2", [
+            d.file("file.txt", "contents")
+          ]),
+          d.dir("sub3", [
+            d.file("file.txt", "contents")
+          ])
+        ])
+      ])
+    ]).create();
+  });
+
+  var webSub1 = path.join("web", "sub1");
+  var webSub1Sub2 = path.join("web", "sub1", "sub2");
+  var webSub1Sub3 = path.join("web", "sub1", "sub3");
+
+  pubBuildAndServeShouldFail("if a superdirectory follows a subdirectory",
+      args: [webSub1Sub2, webSub1],
+      error: 'Directories "$webSub1Sub2" and "$webSub1" cannot overlap.',
+      exitCode: exit_codes.USAGE);
+
+  pubBuildAndServeShouldFail("if a subdirectory follows a superdirectory",
+      args: [webSub1, webSub1Sub2],
+      error: 'Directories "$webSub1" and "$webSub1Sub2" cannot overlap.',
+      exitCode: exit_codes.USAGE);
+
+  pubBuildAndServeShouldFail("if multiple directories overlap",
+      args: [webSub1, webSub1Sub2, webSub1Sub3],
+      error: 'Directories "$webSub1", "$webSub1Sub2" and "$webSub1Sub3" '
+             'cannot overlap.',
+      exitCode: exit_codes.USAGE);
+}
diff --git a/sdk/lib/_internal/pub/test/barback/subdirectories_test.dart b/sdk/lib/_internal/pub/test/barback/subdirectories_test.dart
new file mode 100644
index 0000000..92d8a95
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/barback/subdirectories_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../serve/utils.dart';
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.dir("one", [
+          d.dir("inner", [d.file("file.txt", "one")])
+        ]),
+        d.dir("two", [
+          d.dir("inner", [d.file("file.txt", "two")])
+        ]),
+        d.dir("nope", [
+          d.dir("inner", [d.file("file.txt", "nope")])
+        ])
+      ])
+    ]).create();
+  });
+
+  var webOne = p.join("web", "one");
+  var webTwoInner = p.join("web", "two", "inner");
+
+  integration("builds subdirectories", () {
+    schedulePub(args: ["build", webOne, webTwoInner],
+        output: new RegExp(r'Built 2 files to "build".'));
+
+    d.dir(appPath, [
+      d.dir("build", [
+        d.dir("web", [
+          d.dir("one", [
+            d.dir("inner", [d.file("file.txt", "one")])
+          ]),
+          d.dir("two", [
+            d.dir("inner", [d.file("file.txt", "two")])
+          ]),
+          d.nothing("nope")
+        ])
+      ])
+    ]).validate();
+  });
+
+  integration("serves subdirectories", () {
+    pubServe(args: [webOne, webTwoInner]);
+
+    requestShouldSucceed("inner/file.txt", "one", root: webOne);
+    requestShouldSucceed("file.txt", "two", root: webTwoInner);
+    expectNotServed("web");
+    expectNotServed(p.join("web", "three"));
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/barback/utils.dart b/sdk/lib/_internal/pub/test/barback/utils.dart
new file mode 100644
index 0000000..e4d9efe
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/barback/utils.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../test_pub.dart';
+
+/// Runs separate integration tests for "pub build", "pub serve", and
+/// "pub build --format json" and validates that in all cases, it fails with
+/// an expected error message and exits with [exitCode].
+///
+/// The integrations assume set up is already done, so you will likely want to
+/// call [setUp] before this.
+///
+/// If [error] is provided, then both pub build and pub serve should exit with
+/// that message. Otherwise, [buildError] is the expected error from pub build
+/// and [serveError] from pub serve.
+void pubBuildAndServeShouldFail(String description, {List<String> args,
+    String error, String buildError, String serveError, int exitCode}) {
+
+  if (error != null) {
+    assert(buildError == null);
+    buildError = error;
+
+    assert(serveError == null);
+    serveError = error;
+  }
+
+  // Usage errors also print the usage, so validate that.
+  var buildExpectation = buildError;
+  var serveExpectation = serveError;
+  if (exitCode == exit_codes.USAGE) {
+    buildExpectation = allOf(
+        startsWith(buildExpectation), contains("Usage: pub build"));
+    serveExpectation = allOf(
+        startsWith(serveExpectation), contains("Usage: pub serve"));
+  }
+
+  integration("build fails $description", () {
+    schedulePub(args: ["build"]..addAll(args),
+        error: buildExpectation,
+        exitCode: exitCode);
+  });
+
+  integration("build --format json fails $description", () {
+    schedulePub(args: ["build", "--format", "json"]..addAll(args),
+        outputJson: {
+          "error": buildError // No usage in JSON output.
+        },
+        exitCode: exitCode);
+  });
+
+  integration("serve fails $description", () {
+    schedulePub(args: ["serve"]..addAll(args),
+        error: serveExpectation,
+        exitCode: exitCode);
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/build/all_includes_all_buildable_directories_test.dart b/sdk/lib/_internal/pub/test/build/all_includes_all_buildable_directories_test.dart
deleted file mode 100644
index 86171da..0000000
--- a/sdk/lib/_internal/pub/test/build/all_includes_all_buildable_directories_test.dart
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("build --all finds assets in all buildable directories", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('benchmark', [
-        d.file('file.txt', 'benchmark')
-      ]),
-      d.dir('bin', [
-        d.file('file.txt', 'bin')
-      ]),
-      d.dir('example', [
-        d.file('file.txt', 'example')
-      ]),
-      d.dir('test', [
-        d.file('file.txt', 'test')
-      ]),
-      d.dir('web', [
-        d.file('file.txt', 'web')
-      ]),
-      d.dir('unknown', [
-        d.file('file.txt', 'unknown')
-      ])
-    ]).create();
-
-    schedulePub(args: ["build", "--all"],
-        output: new RegExp(r'Built 5 files to "build".'));
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.dir('benchmark', [
-          d.file('file.txt', 'benchmark')
-        ]),
-        d.dir('bin', [
-          d.file('file.txt', 'bin')
-        ]),
-        d.dir('example', [
-          d.file('file.txt', 'example')
-        ]),
-        d.dir('test', [
-          d.file('file.txt', 'test')
-        ]),
-        d.dir('web', [
-          d.file('file.txt', 'web')
-        ]),
-        // Only includes known buildable directories.
-        d.nothing('unknown')
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/all_with_no_buildable_directories_test.dart b/sdk/lib/_internal/pub/test/build/all_with_no_buildable_directories_test.dart
deleted file mode 100644
index 32ee191..0000000
--- a/sdk/lib/_internal/pub/test/build/all_with_no_buildable_directories_test.dart
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../../lib/src/exit_codes.dart' as exit_codes;
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("build --all with no buildable directories", () {
-    d.appDir().create();
-
-    schedulePub(args: ["build", "--all"],
-        error: 'There are no buildable directories.\n'
-               'The supported directories are "benchmark", "bin", "example", '
-               '"test" and "web".',
-        exitCode: exit_codes.DATA);
-  });
-
-  integration("build --all --format json with no buildable directories", () {
-    d.appDir().create();
-
-    schedulePub(args: ["build", "--all", "--format", "json"],
-        outputJson: {'error':
-          'There are no buildable directories.\n'
-          'The supported directories are "benchmark", "bin", "example", '
-          '"test" and "web".'
-        },
-        exitCode: exit_codes.DATA);
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/allows_multiple_dir_name_args_test.dart b/sdk/lib/_internal/pub/test/build/allows_multiple_dir_name_args_test.dart
deleted file mode 100644
index c6f9531..0000000
--- a/sdk/lib/_internal/pub/test/build/allows_multiple_dir_name_args_test.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("allows multiple directory name arguments", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('example', [
-        d.file('file.txt', 'example')
-      ]),
-      d.dir('test', [
-        d.file('file.txt', 'test')
-      ]),
-      d.dir('web', [
-        d.file('file.txt', 'web')
-      ])
-    ]).create();
-
-    schedulePub(args: ["build", "example", "test"],
-        output: new RegExp(r'Built 2 files to "build".'));
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.dir('example', [
-          d.file('file.txt', 'example')
-        ]),
-        d.dir('test', [
-          d.file('file.txt', 'test')
-        ]),
-        d.nothing('web')
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/can_specify_output_directory_test.dart b/sdk/lib/_internal/pub/test/build/can_specify_output_directory_test.dart
new file mode 100644
index 0000000..9264ea7
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/build/can_specify_output_directory_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as path;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("can specify the output directory to build into", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir('web', [
+        d.file('file.txt', 'web')
+      ])
+    ]).create();
+
+    var outDir = path.join("out", "dir");
+    schedulePub(args: ["build", "-o", outDir],
+        output: contains('Built 1 file to "$outDir".'));
+
+    d.dir(appPath, [
+      d.dir("out", [
+        d.dir("dir", [
+          d.dir("web", [
+            d.file("file.txt", "web")
+          ]),
+        ])
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_benchmark_test.dart b/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_benchmark_test.dart
deleted file mode 100644
index 0b1632e..0000000
--- a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_benchmark_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("compiles Dart entrypoints in benchmark/ to JS", () {
-    // Dart2js can take a long time to compile dart code, so we increase the
-    // timeout to cope with that.
-    currentSchedule.timeout *= 3;
-
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('benchmark', [
-        d.file('file.dart', 'void main() => print("hello");'),
-        d.file('lib.dart', 'void foo() => print("hello");'),
-        d.dir('subdir', [
-          d.file('subfile.dart', 'void main() => print("ping");')
-        ])
-      ])
-    ]).create();
-
-    schedulePub(args: ["build", "benchmark"],
-        output: new RegExp(r'Built 4 files to "build".'));
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.dir('benchmark', [
-          d.matcherFile('file.dart.js', isNot(isEmpty)),
-          d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
-          d.nothing('file.dart'),
-          d.nothing('lib.dart'),
-          d.dir('subdir', [
-            d.matcherFile('subfile.dart.js', isNot(isEmpty)),
-            d.matcherFile('subfile.dart.precompiled.js', isNot(isEmpty)),
-            d.nothing('subfile.dart')
-          ])
-        ])
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_example_test.dart b/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_example_test.dart
deleted file mode 100644
index 0ced048..0000000
--- a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_example_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("compiles Dart entrypoints in example/ to JS", () {
-    // Dart2js can take a long time to compile dart code, so we increase the
-    // timeout to cope with that.
-    currentSchedule.timeout *= 3;
-
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('example', [
-        d.file('file.dart', 'void main() => print("hello");'),
-        d.file('lib.dart', 'void foo() => print("hello");'),
-        d.dir('subdir', [
-          d.file('subfile.dart', 'void main() => print("ping");')
-        ])
-      ])
-    ]).create();
-
-    schedulePub(args: ["build", "example"],
-        output: new RegExp(r'Built 4 files to "build".'));
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.dir('example', [
-          d.matcherFile('file.dart.js', isNot(isEmpty)),
-          d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
-          d.nothing('file.dart'),
-          d.nothing('lib.dart'),
-          d.dir('subdir', [
-            d.matcherFile('subfile.dart.js', isNot(isEmpty)),
-            d.matcherFile('subfile.dart.precompiled.js', isNot(isEmpty)),
-            d.nothing('subfile.dart')
-          ])
-        ])
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_test_test.dart b/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_test_test.dart
deleted file mode 100644
index 8d03346..0000000
--- a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_test_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("compiles Dart entrypoints in test/ to JS", () {
-    // Dart2js can take a long time to compile dart code, so we increase the
-    // timeout to cope with that.
-    currentSchedule.timeout *= 3;
-
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('test', [
-        d.file('file.dart', 'void main() => print("hello");'),
-        d.file('lib.dart', 'void foo() => print("hello");'),
-        d.dir('subdir', [
-          d.file('subfile.dart', 'void main() => print("ping");')
-        ])
-      ])
-    ]).create();
-
-    schedulePub(args: ["build", "test"],
-        output: new RegExp(r'Built 4 files to "build".'));
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.dir('test', [
-          d.matcherFile('file.dart.js', isNot(isEmpty)),
-          d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
-          d.nothing('file.dart'),
-          d.nothing('lib.dart'),
-          d.dir('subdir', [
-            d.matcherFile('subfile.dart.js', isNot(isEmpty)),
-            d.matcherFile('subfile.dart.precompiled.js', isNot(isEmpty)),
-            d.nothing('subfile.dart')
-          ])
-        ])
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_web_test.dart b/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_web_test.dart
deleted file mode 100644
index 9ceaead..0000000
--- a/sdk/lib/_internal/pub/test/build/compiles_entrypoints_in_web_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("compiles Dart entrypoints in web/ to JS", () {
-    // Dart2js can take a long time to compile dart code, so we increase the
-    // timeout to cope with that.
-    currentSchedule.timeout *= 3;
-
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('web', [
-        d.file('file.dart', 'void main() => print("hello");'),
-        d.file('lib.dart', 'void foo() => print("hello");'),
-        d.dir('subdir', [
-          d.file('subfile.dart', 'void main() => print("ping");')
-        ])
-      ])
-    ]).create();
-
-    schedulePub(args: ["build"],
-        output: new RegExp(r'Built 4 files to "build".'));
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.dir('web', [
-          d.matcherFile('file.dart.js', isNot(isEmpty)),
-          d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
-          d.nothing('file.dart'),
-          d.nothing('lib.dart'),
-          d.dir('subdir', [
-            d.matcherFile('subfile.dart.js', isNot(isEmpty)),
-            d.matcherFile('subfile.dart.precompiled.js', isNot(isEmpty)),
-            d.nothing('subfile.dart')
-          ])
-        ])
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/copies_browser_js_next_to_entrypoints_test.dart b/sdk/lib/_internal/pub/test/build/copies_browser_js_next_to_entrypoints_test.dart
index 80c1f55..fd2a853 100644
--- a/sdk/lib/_internal/pub/test/build/copies_browser_js_next_to_entrypoints_test.dart
+++ b/sdk/lib/_internal/pub/test/build/copies_browser_js_next_to_entrypoints_test.dart
@@ -20,7 +20,7 @@
 
     d.dir(appPath, [
       d.appPubspec({"browser": "1.0.0"}),
-      d.dir('example', [
+      d.dir('foo', [
         d.file('file.dart', 'void main() => print("hello");'),
         d.dir('subdir', [
           d.file('subfile.dart', 'void main() => print("subhello");')
@@ -36,12 +36,12 @@
 
     pubGet();
 
-    schedulePub(args: ["build", "--all"],
+    schedulePub(args: ["build", "foo", "web"],
         output: new RegExp(r'Built 16 files to "build".'));
 
     d.dir(appPath, [
       d.dir('build', [
-        d.dir('example', [
+        d.dir('foo', [
           d.matcherFile('file.dart.js', isNot(isEmpty)),
           d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
           d.dir('packages', [d.dir('browser', [
diff --git a/sdk/lib/_internal/pub/test/build/dart2js_finds_imports_across_packages_test.dart b/sdk/lib/_internal/pub/test/build/dart2js_finds_imports_across_packages_test.dart
deleted file mode 100644
index 3218499..0000000
--- a/sdk/lib/_internal/pub/test/build/dart2js_finds_imports_across_packages_test.dart
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  // This is a regression test for https://dartbug.com/15183. The code that
-  // stripped .dart files from release builds was in the forwarding transformer,
-  // and that transformer was applied to all loaded packages. That meant that
-  // if the root package imported a .dart file from another package, the
-  // forwarding transformer in that package would remove the file before
-  // dart2js could find it when compiling the entrypoint in the root package.
-
-  integration("dart2js can find imports across packages", () {
-    // Dart2js can take a long time to compile dart code, so we increase the
-    // timeout to cope with that.
-    currentSchedule.timeout *= 3;
-
-    d.dir("foo", [
-      d.libPubspec("foo", "0.0.1"),
-      d.dir("lib", [
-        d.file("foo.dart",
-            """
-            library foo;
-            foo() => 'foo';
-            """)
-      ])
-    ]).create();
-
-    d.dir(appPath, [
-      d.appPubspec({
-        "foo": {"path": "../foo"}
-      }),
-      d.dir("web", [
-        d.file("main.dart",
-            """
-            import 'package:foo/foo.dart';
-            main() => print(foo());
-            """)
-      ])
-    ]).create();
-
-    schedulePub(args: ["build"],
-        output: new RegExp(r'Built 2 files to "build".'));
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.dir('web', [
-          d.matcherFile('main.dart.js', isNot(isEmpty)),
-          d.matcherFile('main.dart.precompiled.js', isNot(isEmpty))
-        ])
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart b/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart
deleted file mode 100644
index 37413b5..0000000
--- a/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-import '../../lib/src/exit_codes.dart' as exit_codes;
-
-main() {
-  initConfig();
-
-  integration("does not allow directory names with --all", () {
-    d.dir(appPath, [
-      d.appPubspec()
-    ]).create();
-
-    schedulePub(args: ["build", "example", "--all"],
-        error: '''
-            Build directory names are not allowed if "--all" is passed.
-
-            Usage: pub build [options] [directories...]
-            -h, --help      Print usage information for this command.
-                --format    How output should be displayed.
-                            [text (default), json]
-
-                --mode      Mode to run transformers in.
-                            (defaults to "release")
-
-                --all       Build all buildable directories.''',
-        exitCode: exit_codes.USAGE);
-  });
-
-  integration("does not allow directory names with --all with JSON output", () {
-    d.dir(appPath, [
-      d.appPubspec()
-    ]).create();
-
-    schedulePub(args: ["build", "example", "--all", "--format", "json"],
-        outputJson: {
-          "error": 'Build directory names are not allowed if "--all" is passed.'
-        },
-        exitCode: exit_codes.USAGE);
-  });
-
-}
diff --git a/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_asset_test.dart b/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_asset_test.dart
deleted file mode 100644
index 0f41ae1..0000000
--- a/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_asset_test.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("ignores entrypoint Dart files in asset/", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('asset', [
-        d.file('file.dart', 'void main() => print("hello");'),
-      ]),
-      d.dir('web', [
-        d.file('index.html', 'html'),
-      ])
-    ]).create();
-
-    schedulePub(args: ["build", "--all"],
-        output: new RegExp(r'Built 1 file to "build".'));
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.nothing('asset'),
-        d.dir('web', [
-          d.file('index.html', 'html')
-        ])
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_bin_test.dart b/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_bin_test.dart
deleted file mode 100644
index 0ec7d0e..0000000
--- a/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_bin_test.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("ignores entrypoint Dart files in bin/", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('bin', [
-        d.file('file.dart', 'void main() => print("hello");'),
-      ]),
-      d.dir('web', [
-        d.file('index.html', 'html'),
-      ])
-    ]).create();
-
-    schedulePub(args: ["build", "--all"],
-        output: new RegExp(r'Built 1 file to "build".'));
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.nothing('bin'),
-        d.dir('web', [
-          d.file('index.html', 'html')
-        ])
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_lib_test.dart b/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_lib_test.dart
deleted file mode 100644
index cc543f4..0000000
--- a/sdk/lib/_internal/pub/test/build/ignores_entrypoints_in_lib_test.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("ignores entrypoint Dart files in lib/", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('lib', [
-        d.file('file.dart', 'void main() => print("hello");'),
-      ]),
-      d.dir('web', [
-        d.file('index.html', 'html'),
-      ])
-    ]).create();
-
-    schedulePub(args: ["build", "--all"],
-        output: new RegExp(r'Built 1 file to "build".'));
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.nothing('lib'),
-        d.dir('web', [
-          d.file('index.html', 'html')
-        ])
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/missing_build_directories_test.dart b/sdk/lib/_internal/pub/test/build/missing_build_directories_test.dart
deleted file mode 100644
index ee64895..0000000
--- a/sdk/lib/_internal/pub/test/build/missing_build_directories_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../../lib/src/exit_codes.dart' as exit_codes;
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("fails if any specified build directories don't exist", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('example', [
-        d.file('file.txt', 'example')
-      ]),
-      d.dir('web', [
-        d.file('file.txt', 'test')
-      ])
-    ]).create();
-
-    schedulePub(args: ["build", "benchmark", "example", "test", "web"],
-        error: 'Directories "benchmark" and "test" do not exist.',
-        exitCode: exit_codes.DATA);
-  });
-
-  integration("fails if any specified build directories don't exist with JSON "
-      "output", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('example', [
-        d.file('file.txt', 'example')
-      ]),
-      d.dir('web', [
-        d.file('file.txt', 'test')
-      ])
-    ]).create();
-
-    schedulePub(args: ["build", "benchmark", "example", "test", "web",
-                       "--format", "json"],
-        outputJson: {
-          "error": 'Directories "benchmark" and "test" do not exist.'
-        },
-        exitCode: exit_codes.DATA);
-  });
-
-}
diff --git a/sdk/lib/_internal/pub/test/build/missing_web_directory_test.dart b/sdk/lib/_internal/pub/test/build/missing_web_directory_test.dart
deleted file mode 100644
index 953ee74..0000000
--- a/sdk/lib/_internal/pub/test/build/missing_web_directory_test.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../../lib/src/exit_codes.dart' as exit_codes;
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("fails if 'web' doesn't exist and no directory is specified", () {
-    d.appDir().create();
-
-    schedulePub(args: ["build"],
-        error: 'Directory "web" does not exist.',
-        exitCode: exit_codes.DATA);
-  });
-
-  integration("fails if 'web' doesn't exist and no directory is specified "
-      "with JSON output", () {
-    d.appDir().create();
-
-    schedulePub(args: ["build", "--format", "json"],
-        outputJson: {
-          "error": 'Directory "web" does not exist.'
-        },
-        exitCode: exit_codes.DATA);
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/name_arg_builds_only_that_directory_test.dart b/sdk/lib/_internal/pub/test/build/name_arg_builds_only_that_directory_test.dart
deleted file mode 100644
index 55badf8..0000000
--- a/sdk/lib/_internal/pub/test/build/name_arg_builds_only_that_directory_test.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("if a dir name is given, only includes that dir", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir('asset', [
-        d.file('file.txt', 'asset')
-      ]),
-      d.dir('example', [
-        d.file('file.txt', 'example')
-      ]),
-      d.dir('web', [
-        d.file('file.txt', 'test')
-      ])
-    ]).create();
-
-    schedulePub(args: ["build", "example"],
-        output: new RegExp(r'Built 2 files to "build".'));
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.dir('example', [
-          d.file('file.txt', 'example'),
-          d.dir('assets', [
-            d.dir('myapp', [
-              d.file('file.txt', 'asset')
-            ])
-          ])
-        ]),
-        // Only example should be built.
-        d.nothing('web')
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart b/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart
deleted file mode 100644
index 8ecc742..0000000
--- a/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../../lib/src/exit_codes.dart' as exit_codes;
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-main() {
-  initConfig();
-
-  integration("fails if given directories are not buildable", () {
-    d.appDir().create();
-
-    schedulePub(args: ["build", "foo", "bar"],
-        error: '''
-            Unsupported build directories "bar" and "foo".
-            The allowed directories are "benchmark", "bin", "example", "test" and "web".
-
-            Usage: pub build [options] [directories...]
-            -h, --help      Print usage information for this command.
-                --format    How output should be displayed.
-                            [text (default), json]
-
-                --mode      Mode to run transformers in.
-                            (defaults to "release")
-
-                --all       Build all buildable directories.''',
-        exitCode: exit_codes.USAGE);
-  });
-
-  integration("fails if given directories are not buildable with json "
-      "output", () {
-    d.appDir().create();
-
-    schedulePub(args: ["build", "foo", "bar", "--format", "json"],
-        outputJson: {
-          "error":
-            'Unsupported build directories "bar" and "foo".\n'
-            'The allowed directories are "benchmark", "bin", "example", '
-                '"test" and "web".'
-        },
-        exitCode: exit_codes.USAGE);
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/allows_import_in_dart_code_test.dart b/sdk/lib/_internal/pub/test/dart2js/allows_import_in_dart_code_test.dart
similarity index 89%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/allows_import_in_dart_code_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/allows_import_in_dart_code_test.dart
index eb95620..cc6f4fa 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/allows_import_in_dart_code_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/allows_import_in_dart_code_test.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 pub_tests;
-
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/dart2js/compiles_entrypoints_in_root_package_test.dart b/sdk/lib/_internal/pub/test/dart2js/compiles_entrypoints_in_root_package_test.dart
new file mode 100644
index 0000000..0d93ce9
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/dart2js/compiles_entrypoints_in_root_package_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("compiles Dart entrypoints in root package to JS", () {
+    // Dart2js can take a long time to compile dart code, so we increase the
+    // timeout to cope with that.
+    currentSchedule.timeout *= 3;
+
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir('benchmark', [
+        d.file('file.dart', 'void main() => print("hello");'),
+        d.file('lib.dart', 'void foo() => print("hello");'),
+        d.dir('subdir', [
+          d.file('subfile.dart', 'void main() => print("ping");')
+        ])
+      ]),
+      d.dir('foo', [
+        d.file('file.dart', 'void main() => print("hello");'),
+        d.file('lib.dart', 'void foo() => print("hello");'),
+        d.dir('subdir', [
+          d.file('subfile.dart', 'void main() => print("ping");')
+        ])
+      ]),
+      d.dir('web', [
+        d.file('file.dart', 'void main() => print("hello");'),
+        d.file('lib.dart', 'void foo() => print("hello");'),
+        d.dir('subdir', [
+          d.file('subfile.dart', 'void main() => print("ping");')
+        ])
+      ])
+    ]).create();
+
+    schedulePub(args: ["build", "benchmark", "foo", "web"],
+        output: new RegExp(r'Built 12 files to "build".'));
+
+    d.dir(appPath, [
+      d.dir('build', [
+        d.dir('benchmark', [
+          d.matcherFile('file.dart.js', isNot(isEmpty)),
+          d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
+          d.nothing('file.dart'),
+          d.nothing('lib.dart'),
+          d.dir('subdir', [
+            d.matcherFile('subfile.dart.js', isNot(isEmpty)),
+            d.matcherFile('subfile.dart.precompiled.js', isNot(isEmpty)),
+            d.nothing('subfile.dart')
+          ])
+        ]),
+        d.dir('foo', [
+          d.matcherFile('file.dart.js', isNot(isEmpty)),
+          d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
+          d.nothing('file.dart'),
+          d.nothing('lib.dart'),
+          d.dir('subdir', [
+            d.matcherFile('subfile.dart.js', isNot(isEmpty)),
+            d.matcherFile('subfile.dart.precompiled.js', isNot(isEmpty)),
+            d.nothing('subfile.dart')
+          ])
+        ]),
+        d.dir('web', [
+          d.matcherFile('file.dart.js', isNot(isEmpty)),
+          d.matcherFile('file.dart.precompiled.js', isNot(isEmpty)),
+          d.nothing('file.dart'),
+          d.nothing('lib.dart'),
+          d.dir('subdir', [
+            d.matcherFile('subfile.dart.js', isNot(isEmpty)),
+            d.matcherFile('subfile.dart.precompiled.js', isNot(isEmpty)),
+            d.nothing('subfile.dart')
+          ])
+        ])
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_dart_file_test.dart b/sdk/lib/_internal/pub/test/dart2js/compiles_generated_dart_file_test.dart
similarity index 88%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_dart_file_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/compiles_generated_dart_file_test.dart
index 9d73a05..1c9c3a6 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_dart_file_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/compiles_generated_dart_file_test.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 pub_tests;
-
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_file_from_dependency_outside_web_test.dart b/sdk/lib/_internal/pub/test/dart2js/compiles_generated_file_from_dependency_outside_web_test.dart
similarity index 83%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_file_from_dependency_outside_web_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/compiles_generated_file_from_dependency_outside_web_test.dart
index b41e0ca..e66023d 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_file_from_dependency_outside_web_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/compiles_generated_file_from_dependency_outside_web_test.dart
@@ -2,16 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library pub_tests;
-
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
-  // This is a regression test for issue 17198.
+  // This is a regression test for issue #17198.
   initConfig();
   integration("compiles a Dart file that imports a generated file to JS "
       "outside web/", () {
@@ -29,7 +27,7 @@
 import "other.dart";
 void main() => print(TOKEN);
 """),
-d.file("other.dart", """
+        d.file("other.dart", """
 library other;
 const TOKEN = "before";
 """)
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_file_from_dependency_test.dart b/sdk/lib/_internal/pub/test/dart2js/compiles_generated_file_from_dependency_test.dart
similarity index 90%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_file_from_dependency_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/compiles_generated_file_from_dependency_test.dart
index 20793a0..82ef94f 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_generated_file_from_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/compiles_generated_file_from_dependency_test.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 pub_tests;
-
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_imported_generated_file_test.dart b/sdk/lib/_internal/pub/test/dart2js/compiles_imported_generated_file_test.dart
similarity index 86%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/compiles_imported_generated_file_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/compiles_imported_generated_file_test.dart
index 17c6dff..63191d2 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/compiles_imported_generated_file_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/compiles_imported_generated_file_test.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 pub_tests;
-
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
@@ -27,7 +25,7 @@
 import "other.dart";
 void main() => print(TOKEN);
 """),
-d.file("other.dart", """
+        d.file("other.dart", """
 library other;
 const TOKEN = "before";
 """)
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/converts_isolate_entrypoint_in_web_test.dart b/sdk/lib/_internal/pub/test/dart2js/converts_isolate_entrypoint_in_web_test.dart
similarity index 87%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/converts_isolate_entrypoint_in_web_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/converts_isolate_entrypoint_in_web_test.dart
index 087e9f2..8d908cb 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/converts_isolate_entrypoint_in_web_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/converts_isolate_entrypoint_in_web_test.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 pub_tests;
-
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_compile_if_disabled_test.dart b/sdk/lib/_internal/pub/test/dart2js/does_not_compile_if_disabled_test.dart
similarity index 82%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/does_not_compile_if_disabled_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/does_not_compile_if_disabled_test.dart
index a86135a..2be40d6 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_compile_if_disabled_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/does_not_compile_if_disabled_test.dart
@@ -2,11 +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 pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_compile_until_its_output_is_requested_test.dart b/sdk/lib/_internal/pub/test/dart2js/does_not_compile_until_its_output_is_requested_test.dart
similarity index 89%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/does_not_compile_until_its_output_is_requested_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/does_not_compile_until_its_output_is_requested_test.dart
index 28e9acf..03897e0 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_compile_until_its_output_is_requested_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/does_not_compile_until_its_output_is_requested_test.dart
@@ -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 pub_tests;
-
 import 'package:scheduled_test/scheduled_stream.dart';
 
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_support_invalid_command_line_options_type_test.dart b/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_command_line_options_type_test.dart
similarity index 90%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/does_not_support_invalid_command_line_options_type_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_command_line_options_type_test.dart
index 833e961..e722cf5 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_support_invalid_command_line_options_type_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_command_line_options_type_test.dart
@@ -2,15 +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 pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
-
   integration("doesn't support invalid commandLineOptions type", () {
     d.dir(appPath, [
       d.pubspec({
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_support_invalid_environment_type_test.dart b/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_environment_type_test.dart
similarity index 90%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/does_not_support_invalid_environment_type_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_environment_type_test.dart
index c79af33..4e4f8df 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_support_invalid_environment_type_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_environment_type_test.dart
@@ -2,15 +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 pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
-
   integration("doesn't support invalid environment type", () {
     d.dir(appPath, [
       d.pubspec({
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_support_invalid_option_test.dart b/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_option_test.dart
similarity index 87%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/does_not_support_invalid_option_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_option_test.dart
index 2c3afa2..7d60191 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/does_not_support_invalid_option_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/does_not_support_invalid_option_test.dart
@@ -2,15 +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 pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
-
   integration("doesn't support an invalid dart2js option", () {
     d.dir(appPath, [
       d.pubspec({
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/doesnt_support_invalid_type_for_boolean_option_test.dart b/sdk/lib/_internal/pub/test/dart2js/doesnt_support_invalid_type_for_boolean_option_test.dart
similarity index 89%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/doesnt_support_invalid_type_for_boolean_option_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/doesnt_support_invalid_type_for_boolean_option_test.dart
index 71aabca..e6283c1 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/doesnt_support_invalid_type_for_boolean_option_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/doesnt_support_invalid_type_for_boolean_option_test.dart
@@ -2,15 +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 pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
-
   integration("doesn't support invalid type for boolean option", () {
     d.dir(appPath, [
       d.pubspec({
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_entrypoint_in_dependency_test.dart b/sdk/lib/_internal/pub/test/dart2js/ignores_entrypoint_in_dependency_test.dart
similarity index 84%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/ignores_entrypoint_in_dependency_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/ignores_entrypoint_in_dependency_test.dart
index 2b86335..0d7b02b 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_entrypoint_in_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/ignores_entrypoint_in_dependency_test.dart
@@ -2,11 +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 pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/dart2js/ignores_entrypoints_in_lib_and_asset_test.dart b/sdk/lib/_internal/pub/test/dart2js/ignores_entrypoints_in_lib_and_asset_test.dart
new file mode 100644
index 0000000..e09dd7f
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/dart2js/ignores_entrypoints_in_lib_and_asset_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+main() {
+  initConfig();
+  setUp(() {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir('asset', [
+        d.file('file.dart', 'void main() => print("hello");'),
+      ]),
+      d.dir('lib', [
+        d.file('file.dart', 'void main() => print("hello");'),
+      ]),
+      d.dir('web', [
+        d.file('index.html', 'html'),
+      ])
+    ]).create();
+  });
+
+  integration("build ignores Dart entrypoints in lib and asset", () {
+    schedulePub(args: ["build", "--all"],
+        output: new RegExp(r'Built 1 file to "build".'));
+
+    d.dir(appPath, [
+      d.dir('build', [
+        d.nothing('asset'),
+        d.nothing('lib')
+      ])
+    ]).validate();
+  });
+
+  integration("serve ignores Dart entrypoints in lib and asset", () {
+    pubServe();
+    requestShould404("assets/myapp/main.dart.js");
+    requestShould404("packages/myapp/main.dart.js");
+    endPubServe();
+  });
+
+}
diff --git a/sdk/lib/_internal/pub/test/build/ignores_non_entrypoint_dart_files_test.dart b/sdk/lib/_internal/pub/test/dart2js/ignores_non_entrypoint_dart_files_test.dart
similarity index 66%
rename from sdk/lib/_internal/pub/test/build/ignores_non_entrypoint_dart_files_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/ignores_non_entrypoint_dart_files_test.dart
index fea77a6..6dc92cf 100644
--- a/sdk/lib/_internal/pub/test/build/ignores_non_entrypoint_dart_files_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/ignores_non_entrypoint_dart_files_test.dart
@@ -2,13 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:scheduled_test/scheduled_test.dart';
+
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
-
-  integration("ignores non-entrypoint Dart files", () {
+  setUp(() {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir('web', [
@@ -18,7 +20,9 @@
         d.file('file4.dart', 'var foo;')
       ])
     ]).create();
+  });
 
+  integration("build ignores non-entrypoint Dart files", () {
     schedulePub(args: ["build"],
         output: new RegExp(r'Built 0 files to "build".'));
 
@@ -28,4 +32,14 @@
       ])
     ]).validate();
   });
+
+  integration("serve ignores non-entrypoint Dart files", () {
+    pubServe();
+    requestShould404("file1.dart.js");
+    requestShould404("file2.dart.js");
+    requestShould404("file3.dart.js");
+    requestShould404("file4.dart.js");
+    endPubServe();
+  });
+
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/includes_source_maps_in_debug_test.dart b/sdk/lib/_internal/pub/test/dart2js/includes_source_maps_in_debug_test.dart
similarity index 91%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/includes_source_maps_in_debug_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/includes_source_maps_in_debug_test.dart
index 45a2ccf..69ff7a1 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/includes_source_maps_in_debug_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/includes_source_maps_in_debug_test.dart
@@ -2,12 +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.
 
-library pub_tests;
-
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/minifies_in_release_mode_test.dart b/sdk/lib/_internal/pub/test/dart2js/minifies_in_release_mode_test.dart
similarity index 83%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/minifies_in_release_mode_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/minifies_in_release_mode_test.dart
index d2fc5e6c..b4694064 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/minifies_in_release_mode_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/minifies_in_release_mode_test.dart
@@ -2,11 +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 pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/minify_configuration_overrides_mode_test.dart b/sdk/lib/_internal/pub/test/dart2js/minify_configuration_overrides_mode_test.dart
similarity index 85%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/minify_configuration_overrides_mode_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/minify_configuration_overrides_mode_test.dart
index 646d624..46e0261 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/minify_configuration_overrides_mode_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/minify_configuration_overrides_mode_test.dart
@@ -2,15 +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 pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
-
   integration("minify configuration overrides the mode", () {
     d.dir(appPath, [
       d.pubspec({
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/omits_source_map_in_release_test.dart b/sdk/lib/_internal/pub/test/dart2js/omits_source_map_in_release_test.dart
similarity index 89%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/omits_source_map_in_release_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/omits_source_map_in_release_test.dart
index e4548d6..d4dbeaf 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/omits_source_map_in_release_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/omits_source_map_in_release_test.dart
@@ -2,10 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/output_can_be_consumed_by_successive_phases.dart b/sdk/lib/_internal/pub/test/dart2js/output_can_be_consumed_by_successive_phases.dart
similarity index 91%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/output_can_be_consumed_by_successive_phases.dart
rename to sdk/lib/_internal/pub/test/dart2js/output_can_be_consumed_by_successive_phases.dart
index f44eb90..0dd5c17 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/output_can_be_consumed_by_successive_phases.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/output_can_be_consumed_by_successive_phases.dart
@@ -2,11 +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 pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 /// The code for a transformer that renames ".js" files to ".out".
 const JS_REWRITE_TRANSFORMER = """
@@ -30,7 +28,6 @@
 
 main() {
   initConfig();
-
   integration("output can be consumed by successive phases", () {
     d.dir(appPath, [
       d.pubspec({
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/passes_along_environment_constants_test.dart b/sdk/lib/_internal/pub/test/dart2js/passes_along_environment_constants_test.dart
similarity index 86%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/passes_along_environment_constants_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/passes_along_environment_constants_test.dart
index 89c6862..e6d569d 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/passes_along_environment_constants_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/passes_along_environment_constants_test.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 pub_tests;
-
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart b/sdk/lib/_internal/pub/test/dart2js/reports_dart_parse_errors_test.dart
similarity index 99%
rename from sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/reports_dart_parse_errors_test.dart
index e899b41..0821b86 100644
--- a/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/reports_dart_parse_errors_test.dart
@@ -12,7 +12,6 @@
 
 main() {
   initConfig();
-
   integration("reports Dart parse errors", () {
     // Dart2js can take a long time to compile dart code, so we increase the
     // timeout to cope with that.
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/source_maps_include_core_libs_in_subdirectory_test.dart b/sdk/lib/_internal/pub/test/dart2js/source_maps_include_core_libs_in_subdirectory_test.dart
similarity index 91%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/source_maps_include_core_libs_in_subdirectory_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/source_maps_include_core_libs_in_subdirectory_test.dart
index d5d02cb..b48c99e 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/source_maps_include_core_libs_in_subdirectory_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/source_maps_include_core_libs_in_subdirectory_test.dart
@@ -2,14 +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 pub_tests;
-
 import 'package:path/path.dart' as path;
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../../descriptor.dart' as d;
-import '../../serve/utils.dart';
-import '../../test_pub.dart';
+import '../descriptor.dart' as d;
+import '../serve/utils.dart';
+import '../test_pub.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/source_maps_include_core_libs_test.dart b/sdk/lib/_internal/pub/test/dart2js/source_maps_include_core_libs_test.dart
similarity index 95%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/source_maps_include_core_libs_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/source_maps_include_core_libs_test.dart
index bf076c8..b8efddd 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/source_maps_include_core_libs_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/source_maps_include_core_libs_test.dart
@@ -2,12 +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.
 
-library pub_tests;
-
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/supports_configuration_with_build_test.dart b/sdk/lib/_internal/pub/test/dart2js/supports_configuration_with_build_test.dart
similarity index 96%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/supports_configuration_with_build_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/supports_configuration_with_build_test.dart
index c85d023..c76a40e 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/supports_configuration_with_build_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/supports_configuration_with_build_test.dart
@@ -6,12 +6,11 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
 
 main() {
   initConfig();
-
   integration("compiles dart.js and interop.js next to entrypoints when "
               "dartjs is explicitly configured", () {
     // Dart2js can take a long time to compile dart code, so we increase the
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/supports_valid_options_test.dart b/sdk/lib/_internal/pub/test/dart2js/supports_valid_options_test.dart
similarity index 90%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/supports_valid_options_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/supports_valid_options_test.dart
index 9bac1fb..3f50b21 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/supports_valid_options_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/supports_valid_options_test.dart
@@ -2,17 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library pub_tests;
-
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
-
   integration("supports most dart2js command-line options", () {
     d.dir(appPath, [
       d.pubspec({
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/unminified_in_nonrelease_mode_test.dart b/sdk/lib/_internal/pub/test/dart2js/unminified_in_nonrelease_mode_test.dart
similarity index 83%
rename from sdk/lib/_internal/pub/test/transformer/dart2js/unminified_in_nonrelease_mode_test.dart
rename to sdk/lib/_internal/pub/test/dart2js/unminified_in_nonrelease_mode_test.dart
index dfffa2f..3171bdd 100644
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/unminified_in_nonrelease_mode_test.dart
+++ b/sdk/lib/_internal/pub/test/dart2js/unminified_in_nonrelease_mode_test.dart
@@ -2,11 +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 pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/deps_test.dart b/sdk/lib/_internal/pub/test/deps_test.dart
new file mode 100644
index 0000000..3015362
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/deps_test.dart
@@ -0,0 +1,141 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import 'descriptor.dart' as d;
+import 'test_pub.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    servePackages([
+      packageMap("normal", "1.2.3", {
+        "transitive": "any",
+        "circular_a": "any"
+      }),
+      packageMap("transitive", "1.2.3", {
+        "shared": "any"
+      }),
+      packageMap("shared", "1.2.3", {
+        "other": "any"
+      }),
+      packageMap("unittest", "1.2.3", {
+        "shared": "any"
+      }),
+      packageMap("other", "1.0.0"),
+      packageMap("overridden", "1.0.0"),
+      packageMap("overridden", "2.0.0"),
+      packageMap("override_only", "1.2.3"),
+      packageMap("circular_a", "1.2.3", {
+        "circular_b": "any"
+      }),
+      packageMap("circular_b", "1.2.3", {
+        "circular_a": "any"
+      })
+    ]);
+
+    d.dir("from_path", [
+      d.libDir("from_path"),
+      d.libPubspec("from_path", "1.2.3")
+    ]).create();
+
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "normal": "any",
+          "overridden": "1.0.0",
+          "from_path": {"path": "../from_path"}
+        },
+        "dev_dependencies": {
+          "unittest": "any"
+        },
+        "dependency_overrides": {
+          "overridden": "2.0.0",
+          "override_only": "any"
+        }
+      })
+    ]).create();
+  });
+
+  integration("lists dependencies in compact form", () {
+    pubGet();
+    schedulePub(args: ['deps', '-s', 'compact'], output: '''
+        myapp 0.0.0
+
+        dependencies:
+        - from_path 1.2.3
+        - normal 1.2.3 [circular_a transitive]
+        - overridden 2.0.0
+
+        dev dependencies:
+        - unittest 1.2.3 [shared]
+
+        dependency overrides:
+        - overridden 2.0.0
+        - override_only 1.2.3
+
+        transitive dependencies:
+        - circular_a 1.2.3 [circular_b]
+        - circular_b 1.2.3 [circular_a]
+        - other 1.0.0
+        - shared 1.2.3 [other]
+        - transitive 1.2.3 [shared]
+        ''');
+  });
+
+  integration("lists dependencies in list form", () {
+    pubGet();
+    schedulePub(args: ['deps', '--style', 'list'], output: '''
+        myapp 0.0.0
+
+        dependencies:
+        - from_path 1.2.3
+        - overridden 2.0.0
+        - normal 1.2.3
+          - circular_a any
+          - transitive any
+
+        dev dependencies:
+        - unittest 1.2.3
+          - shared any
+
+        dependency overrides:
+        - override_only 1.2.3
+        - overridden 2.0.0
+
+        transitive dependencies:
+        - circular_a 1.2.3
+          - circular_b any
+        - circular_b 1.2.3
+          - circular_a any
+        - other 1.0.0
+        - shared 1.2.3
+          - other any
+        - transitive 1.2.3
+          - shared any
+        ''');
+  });
+
+  integration("lists dependencies in tree form", () {
+    pubGet();
+    schedulePub(args: ['deps'], output: '''
+        myapp 0.0.0
+        |-- from_path 1.2.3
+        |-- normal 1.2.3
+        |   |-- circular_a 1.2.3
+        |   |   '-- circular_b 1.2.3
+        |   |       '-- circular_a...
+        |   '-- transitive 1.2.3
+        |       '-- shared...
+        |-- overridden 2.0.0
+        |-- override_only 1.2.3
+        '-- unittest 1.2.3
+            '-- shared 1.2.3
+                '-- other 1.0.0
+        ''');
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/directory_tree_test.dart b/sdk/lib/_internal/pub/test/directory_tree_test.dart
deleted file mode 100644
index 0009f8e..0000000
--- a/sdk/lib/_internal/pub/test/directory_tree_test.dart
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library lock_file_test;
-
-import 'package:unittest/unittest.dart';
-
-import '../lib/src/directory_tree.dart';
-
-main() {
-  test('no files', () {
-    expect(generateTree([]), equals(""));
-  });
-
-  test('up to ten files in one directory are shown', () {
-    var files = [
-      "dir/a.dart",
-      "dir/b.dart",
-      "dir/c.dart",
-      "dir/d.dart",
-      "dir/e.dart",
-      "dir/f.dart",
-      "dir/g.dart",
-      "dir/h.dart",
-      "dir/i.dart",
-      "dir/j.dart"
-    ];
-    expect(generateTree(files), equals("""
-'-- dir
-    |-- a.dart
-    |-- b.dart
-    |-- c.dart
-    |-- d.dart
-    |-- e.dart
-    |-- f.dart
-    |-- g.dart
-    |-- h.dart
-    |-- i.dart
-    '-- j.dart
-"""));
-  });
-
-  test('files are elided if there are more than ten', () {
-    var files = [
-      "dir/a.dart",
-      "dir/b.dart",
-      "dir/c.dart",
-      "dir/d.dart",
-      "dir/e.dart",
-      "dir/f.dart",
-      "dir/g.dart",
-      "dir/h.dart",
-      "dir/i.dart",
-      "dir/j.dart",
-      "dir/k.dart"
-    ];
-    expect(generateTree(files), equals("""
-'-- dir
-    |-- a.dart
-    |-- b.dart
-    |-- c.dart
-    | (5 more...)
-    |-- i.dart
-    |-- j.dart
-    '-- k.dart
-"""));
-  });
-
-  test('files are not elided at the top level', () {
-    var files = [
-      "a.dart",
-      "b.dart",
-      "c.dart",
-      "d.dart",
-      "e.dart",
-      "f.dart",
-      "g.dart",
-      "h.dart",
-      "i.dart",
-      "j.dart",
-      "k.dart"
-    ];
-    expect(generateTree(files), equals("""
-|-- a.dart
-|-- b.dart
-|-- c.dart
-|-- d.dart
-|-- e.dart
-|-- f.dart
-|-- g.dart
-|-- h.dart
-|-- i.dart
-|-- j.dart
-'-- k.dart
-"""));
-  });
-
-  test('a complex example', () {
-    var files = [
-      "TODO",
-      "example/console_example.dart",
-      "example/main.dart",
-      "example/web copy/web_example.dart",
-      "test/absolute_test.dart",
-      "test/basename_test.dart",
-      "test/dirname_test.dart",
-      "test/extension_test.dart",
-      "test/is_absolute_test.dart",
-      "test/is_relative_test.dart",
-      "test/join_test.dart",
-      "test/normalize_test.dart",
-      "test/relative_test.dart",
-      "test/split_test.dart",
-      ".gitignore",
-      "README.md",
-      "lib/path.dart",
-      "pubspec.yaml",
-      "test/all_test.dart",
-      "test/path_posix_test.dart",
-      "test/path_windows_test.dart"
-    ];
-
-    expect(generateTree(files), equals("""
-|-- .gitignore
-|-- README.md
-|-- TODO
-|-- example
-|   |-- console_example.dart
-|   |-- main.dart
-|   '-- web copy
-|       '-- web_example.dart
-|-- lib
-|   '-- path.dart
-|-- pubspec.yaml
-'-- test
-    |-- absolute_test.dart
-    |-- all_test.dart
-    |-- basename_test.dart
-    | (7 more...)
-    |-- path_windows_test.dart
-    |-- relative_test.dart
-    '-- split_test.dart
-"""));
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/get/git/doesnt_fetch_if_nothing_changes_test.dart b/sdk/lib/_internal/pub/test/get/git/doesnt_fetch_if_nothing_changes_test.dart
new file mode 100644
index 0000000..54cd98c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/get/git/doesnt_fetch_if_nothing_changes_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../../lib/src/io.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("doesn't re-fetch a repository if nothing changes", () {
+    ensureGit();
+
+    var repo = d.git('foo.git', [
+      d.libDir('foo'),
+      d.libPubspec('foo', '1.0.0')
+    ]);
+    repo.create();
+
+    d.appDir({
+      "foo": {"git": {"url": "../foo.git"}}
+    }).create();
+
+    pubGet();
+
+    d.dir(packagesPath, [
+      d.dir('foo', [
+        d.file('foo.dart', 'main() => "foo";')
+      ])
+    ]).validate();
+
+    // Delete the repo. This will cause "pub get" to fail if it tries to
+    // re-fetch.
+    schedule(() => deleteEntry(p.join(sandboxDir, 'foo.git')));
+
+    pubGet();
+
+    d.dir(packagesPath, [
+      d.dir('foo', [
+        d.file('foo.dart', 'main() => "foo";')
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart b/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart
index 4be7a4a..b9ca6bd 100644
--- a/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart
+++ b/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:scheduled_test/scheduled_server.dart';
 import 'package:scheduled_test/scheduled_test.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -29,7 +30,9 @@
       var pub = startPub(args: [command.name]);
 
       server.handle('GET', '/api/packages/foo', (request) {
-        expect(request.headers['Accept'], ['application/vnd.pub.v2+json']);
+        expect(request.headers['accept'],
+            equals('application/vnd.pub.v2+json'));
+        return new shelf.Response(200);
       });
 
       pub.kill();
@@ -49,16 +52,12 @@
 
       var pub = startPub(args: [command.name]);
 
-      server.handle('GET', '/api/packages/foo', (request) {
-        request.response.statusCode = 406;
-        request.response.close();
-      });
+      server.handle('GET', '/api/packages/foo',
+          (request) => new shelf.Response(406));
 
       // TODO(nweiz): this shouldn't request the versions twice (issue 11077).
-      server.handle('GET', '/api/packages/foo', (request) {
-        request.response.statusCode = 406;
-        request.response.close();
-      });
+      server.handle('GET', '/api/packages/foo',
+          (request) => new shelf.Response(406));
 
       pub.shouldExit(1);
 
diff --git a/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart b/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
index 76d00e9..114159f 100644
--- a/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
@@ -26,10 +27,9 @@
     handleUpload(server);
 
     server.handle('GET', '/create', (request) {
-      request.response.write(JSON.encode({
+      return new shelf.Response.ok(JSON.encode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
-      request.response.close();
     });
 
     pub.stdout.expect(startsWith('Uploading...'));
diff --git a/sdk/lib/_internal/pub/test/lish/cloud_storage_upload_doesnt_redirect_test.dart b/sdk/lib/_internal/pub/test/lish/cloud_storage_upload_doesnt_redirect_test.dart
index 5bcc120..faef7ca 100644
--- a/sdk/lib/_internal/pub/test/lish/cloud_storage_upload_doesnt_redirect_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/cloud_storage_upload_doesnt_redirect_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../../lib/src/io.dart';
 import '../descriptor.dart' as d;
@@ -23,10 +24,7 @@
     handleUploadForm(server);
 
     server.handle('POST', '/upload', (request) {
-      return drainStream(request).then((_) {
-        // Don't set the location header.
-        request.response.close();
-      });
+      return drainStream(request.read()).then((_) => new shelf.Response(200));
     });
 
     pub.stderr.expect('Failed to upload the package.');
diff --git a/sdk/lib/_internal/pub/test/lish/cloud_storage_upload_provides_an_error_test.dart b/sdk/lib/_internal/pub/test/lish/cloud_storage_upload_provides_an_error_test.dart
index 496abcf..efd4ab4 100644
--- a/sdk/lib/_internal/pub/test/lish/cloud_storage_upload_provides_an_error_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/cloud_storage_upload_provides_an_error_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../../lib/src/io.dart';
 import '../descriptor.dart' as d;
@@ -25,13 +26,10 @@
     handleUploadForm(server);
 
     server.handle('POST', '/upload', (request) {
-      return drainStream(request).then((_) {
-        request.response.statusCode = 400;
-        request.response.headers.contentType =
-            new ContentType('application', 'xml');
-        request.response.write('<Error><Message>Your request sucked.'
-            '</Message></Error>');
-        request.response.close();
+      return drainStream(request.read()).then((_) {
+        return new shelf.Response.notFound(
+            '<Error><Message>Your request sucked.</Message></Error>',
+            headers: {'content-type': 'application/xml'});
       });
     });
 
diff --git a/sdk/lib/_internal/pub/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart b/sdk/lib/_internal/pub/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
index 9ccccf4..c0a1575 100644
--- a/sdk/lib/_internal/pub/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart
@@ -7,6 +7,7 @@
 import 'package:scheduled_test/scheduled_server.dart';
 import 'package:scheduled_test/scheduled_stream.dart';
 import 'package:scheduled_test/scheduled_test.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
@@ -26,10 +27,9 @@
     handleUpload(server);
 
     server.handle('GET', '/create', (request) {
-      request.response.write(JSON.encode({
+      return new shelf.Response.ok(JSON.encode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
-      request.response.close();
     });
 
     pub.shouldExit(exit_codes.SUCCESS);
diff --git a/sdk/lib/_internal/pub/test/lish/force_publishes_if_there_are_warnings_test.dart b/sdk/lib/_internal/pub/test/lish/force_publishes_if_there_are_warnings_test.dart
index 85ce297..c6e19ca 100644
--- a/sdk/lib/_internal/pub/test/lish/force_publishes_if_there_are_warnings_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/force_publishes_if_there_are_warnings_test.dart
@@ -7,6 +7,7 @@
 import 'package:scheduled_test/scheduled_server.dart';
 import 'package:scheduled_test/scheduled_stream.dart';
 import 'package:scheduled_test/scheduled_test.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
@@ -30,10 +31,9 @@
     handleUpload(server);
 
     server.handle('GET', '/create', (request) {
-      request.response.write(JSON.encode({
+      return new shelf.Response.ok(JSON.encode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
-      request.response.close();
     });
 
     pub.shouldExit(exit_codes.SUCCESS);
diff --git a/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_error_test.dart b/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_error_test.dart
index 90432da..6be2b76 100644
--- a/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_error_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_error_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -26,9 +27,7 @@
 
     var body = {'error': 'Your package was too boring.'};
     server.handle('GET', '/create', (request) {
-      request.response.statusCode = 400;
-      request.response.write(JSON.encode(body));
-      request.response.close();
+      return new shelf.Response.notFound(JSON.encode(body));
     });
 
     pub.stderr.expect('Invalid server response:');
diff --git a/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_success_test.dart b/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_success_test.dart
index 16c34470..4f99dfb 100644
--- a/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_success_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_success_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -26,8 +27,7 @@
 
     var body = {'success': 'Your package was awesome.'};
     server.handle('GET', '/create', (request) {
-      request.response.write(JSON.encode(body));
-      request.response.close();
+      return new shelf.Response.ok(JSON.encode(body));
     });
 
     pub.stderr.expect('Invalid server response:');
diff --git a/sdk/lib/_internal/pub/test/lish/package_creation_provides_an_error_test.dart b/sdk/lib/_internal/pub/test/lish/package_creation_provides_an_error_test.dart
index 33a5e08..1a1d1b8 100644
--- a/sdk/lib/_internal/pub/test/lish/package_creation_provides_an_error_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/package_creation_provides_an_error_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -25,11 +26,9 @@
     handleUpload(server);
 
     server.handle('GET', '/create', (request) {
-      request.response.statusCode = 400;
-      request.response.write(JSON.encode({
+      return new shelf.Response.notFound(JSON.encode({
         'error': {'message': 'Your package was too boring.'}
       }));
-      request.response.close();
     });
 
     pub.stderr.expect('Your package was too boring.');
diff --git a/sdk/lib/_internal/pub/test/lish/package_creation_provides_invalid_json_test.dart b/sdk/lib/_internal/pub/test/lish/package_creation_provides_invalid_json_test.dart
index 25d187f..822eaa0 100644
--- a/sdk/lib/_internal/pub/test/lish/package_creation_provides_invalid_json_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/package_creation_provides_invalid_json_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -23,8 +24,7 @@
     handleUpload(server);
 
     server.handle('GET', '/create', (request) {
-      request.response.write('{not json');
-      request.response.close();
+      return new shelf.Response.ok('{not json');
     });
 
     pub.stderr.expect(emitsLines(
diff --git a/sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_continues_test.dart b/sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_continues_test.dart
index 6d4972f..13af22b 100644
--- a/sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_continues_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_continues_test.dart
@@ -7,6 +7,7 @@
 import 'package:scheduled_test/scheduled_server.dart';
 import 'package:scheduled_test/scheduled_stream.dart';
 import 'package:scheduled_test/scheduled_test.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
@@ -30,10 +31,9 @@
     handleUpload(server);
 
     server.handle('GET', '/create', (request) {
-      request.response.write(JSON.encode({
+      return new shelf.Response.ok(JSON.encode({
         'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
       }));
-      request.response.close();
     });
 
     pub.shouldExit(exit_codes.SUCCESS);
diff --git a/sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart b/sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart
index c4f69a0..4df0129 100644
--- a/sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -22,11 +23,9 @@
     confirmPublish(pub);
 
     server.handle('GET', '/api/packages/versions/new', (request) {
-      request.response.statusCode = 400;
-      request.response.write(JSON.encode({
+      return new shelf.Response.notFound(JSON.encode({
         'error': {'message': 'your request sucked'}
       }));
-      request.response.close();
     });
 
     pub.stderr.expect('your request sucked');
diff --git a/sdk/lib/_internal/pub/test/lish/upload_form_provides_invalid_json_test.dart b/sdk/lib/_internal/pub/test/lish/upload_form_provides_invalid_json_test.dart
index 4a993e7..60b1f14 100644
--- a/sdk/lib/_internal/pub/test/lish/upload_form_provides_invalid_json_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/upload_form_provides_invalid_json_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -19,10 +20,8 @@
 
     confirmPublish(pub);
 
-    server.handle('GET', '/api/packages/versions/new', (request) {
-      request.response.write('{not json');
-      request.response.close();
-    });
+    server.handle('GET', '/api/packages/versions/new',
+        (request) => new shelf.Response.ok('{not json'));
 
     pub.stderr.expect(emitsLines(
         'Invalid server response:\n'
diff --git a/sdk/lib/_internal/pub/test/lish/utils.dart b/sdk/lib/_internal/pub/test/lish/utils.dart
index 8279281..ccd998d 100644
--- a/sdk/lib/_internal/pub/test/lish/utils.dart
+++ b/sdk/lib/_internal/pub/test/lish/utils.dart
@@ -9,14 +9,15 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../../lib/src/io.dart';
 
 void handleUploadForm(ScheduledServer server, [Map body]) {
   server.handle('GET', '/api/packages/versions/new', (request) {
     return server.url.then((url) {
-      expect(request.headers.value('authorization'),
-          equals('Bearer access token'));
+      expect(request.headers,
+          containsPair('authorization', 'Bearer access token'));
 
       if (body == null) {
         body = {
@@ -28,10 +29,8 @@
         };
       }
 
-      request.response.headers.contentType =
-          new ContentType("application", "json");
-      request.response.write(JSON.encode(body));
-      request.response.close();
+      return new shelf.Response.ok(JSON.encode(body),
+          headers: {'content-type': 'application/json'});
     });
   });
 }
@@ -40,14 +39,9 @@
   server.handle('POST', '/upload', (request) {
     // TODO(nweiz): Once a multipart/form-data parser in Dart exists, validate
     // that the request body is correctly formatted. See issue 6952.
-    return drainStream(request).then((_) {
-      return server.url;
-    }).then((url) {
-      request.response.statusCode = 302;
-      request.response.headers.set(
-          'location', url.resolve('/create').toString());
-      request.response.close();
-    });
+    return drainStream(request.read())
+        .then((_) => server.url)
+        .then((url) => new shelf.Response.found(url.resolve('/create')));
   });
 }
 
diff --git a/sdk/lib/_internal/pub/test/oauth2/utils.dart b/sdk/lib/_internal/pub/test/oauth2/utils.dart
index 5144dad..fc9b4c5 100644
--- a/sdk/lib/_internal/pub/test/oauth2/utils.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/utils.dart
@@ -11,6 +11,7 @@
 import 'package:scheduled_test/scheduled_process.dart';
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../../lib/src/io.dart';
 import '../../lib/src/utils.dart';
@@ -41,17 +42,13 @@
 
 void handleAccessTokenRequest(ScheduledServer server, String accessToken) {
   server.handle('POST', '/token', (request) {
-    return new ByteStream(request).toBytes().then((bytes) {
-      var body = new String.fromCharCodes(bytes);
+    return request.readAsString().then((body) {
       expect(body, matches(new RegExp(r'(^|&)code=access\+code(&|$)')));
 
-      request.response.headers.contentType =
-          new ContentType("application", "json");
-      request.response.write(JSON.encode({
+      return new shelf.Response.ok(JSON.encode({
         "access_token": accessToken,
         "token_type": "bearer"
-      }));
-      request.response.close();
+      }), headers: {'content-type': 'application/json'});
     });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
index 4977cdd..c0b2d53 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -25,10 +26,10 @@
     authorizePub(pub, server, "new access token");
 
     server.handle('GET', '/api/packages/versions/new', (request) {
-      expect(request.headers.value('authorization'),
-          equals('Bearer new access token'));
+      expect(request.headers,
+          containsPair('authorization', 'Bearer new access token'));
 
-      request.response.close();
+      return new shelf.Response(200);
     });
 
     // After we give pub an invalid response, it should crash. We wait for it to
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
index d83570a..fc39458 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -19,10 +20,10 @@
     confirmPublish(pub);
 
     server.handle('GET', '/api/packages/versions/new', (request) {
-      expect(request.headers.value('authorization'),
-          equals('Bearer access token'));
+      expect(request.headers,
+          containsPair('authorization', 'Bearer access token'));
 
-      request.response.close();
+      return new shelf.Response(200);
     });
 
     pub.kill();
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
index d4a81d4..e36f97d 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
@@ -7,6 +7,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../../lib/src/io.dart';
 import '../descriptor.dart' as d;
@@ -31,13 +32,10 @@
     confirmPublish(pub);
 
     server.handle('POST', '/token', (request) {
-      return new ByteStream(request).toBytes().then((bytes) {
-        var response = request.response;
-        response.statusCode = 400;
-        response.reasonPhrase = 'Bad request';
-        response.headers.contentType = new ContentType("application", "json");
-        response.write(JSON.encode({"error": "invalid_request"}));
-        response.close();
+      return drainStream(request.read()).then((_) {
+        return new shelf.Response(400,
+            body: JSON.encode({"error": "invalid_request"}),
+            headers: {'content-type': 'application/json'});
       });
     });
 
@@ -45,10 +43,10 @@
     authorizePub(pub, server, 'new access token');
 
     server.handle('GET', '/api/packages/versions/new', (request) {
-      expect(request.headers.value('authorization'),
-          equals('Bearer new access token'));
+      expect(request.headers,
+          containsPair('authorization', 'Bearer new access token'));
 
-      request.response.close();
+      return new shelf.Response(200);
     });
 
     pub.kill();
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
index ac6fc55..b2627b6 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
@@ -7,6 +7,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../../lib/src/io.dart';
 import '../descriptor.dart' as d;
@@ -28,26 +29,22 @@
     confirmPublish(pub);
 
     server.handle('POST', '/token', (request) {
-      return new ByteStream(request).toBytes().then((bytes) {
-        var body = new String.fromCharCodes(bytes);
+      return request.readAsString().then((body) {
         expect(body, matches(
             new RegExp(r'(^|&)refresh_token=refresh\+token(&|$)')));
 
-        request.response.headers.contentType =
-            new ContentType("application", "json");
-        request.response.write(JSON.encode({
+        return new shelf.Response.ok(JSON.encode({
           "access_token": "new access token",
           "token_type": "bearer"
-        }));
-        request.response.close();
+        }), headers: {'content-type': 'application/json'});
       });
     });
 
     server.handle('GET', '/api/packages/versions/new', (request) {
-      expect(request.headers.value('authorization'),
-          equals('Bearer new access token'));
+      expect(request.headers,
+          containsPair('authorization', 'Bearer new access token'));
 
-      request.response.close();
+      return new shelf.Response(200);
     });
 
     pub.shouldExit();
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
index d35b87f..18e4089 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -28,10 +29,10 @@
     authorizePub(pub, server, "new access token");
 
     server.handle('GET', '/api/packages/versions/new', (request) {
-      expect(request.headers.value('authorization'),
-          equals('Bearer new access token'));
+      expect(request.headers,
+          containsPair('authorization', 'Bearer new access token'));
 
-      request.response.close();
+      return new shelf.Response(200);
     });
 
     // After we give pub an invalid response, it should crash. We wait for it to
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
index 3eea90e..aac2261 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -21,10 +22,10 @@
     authorizePub(pub, server);
 
     server.handle('GET', '/api/packages/versions/new', (request) {
-      expect(request.headers.value('authorization'),
-          equals('Bearer access token'));
+      expect(request.headers,
+          containsPair('authorization', 'Bearer access token'));
 
-      request.response.close();
+      return new shelf.Response(200);
     });
 
     // After we give pub an invalid response, it should crash. We wait for it to
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
index e127999..94479f7 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:scheduled_test/scheduled_server.dart';
 import 'package:scheduled_test/scheduled_test.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -22,14 +23,12 @@
     confirmPublish(pub);
 
     server.handle('GET', '/api/packages/versions/new', (request) {
-      var response = request.response;
-      response.statusCode = 401;
-      response.headers.set('www-authenticate', 'Bearer error="invalid_token",'
-          ' error_description="your token sucks"');
-      response.write(JSON.encode({
-        'error': {'message': 'your token sucks'}
-      }));
-      response.close();
+      return new shelf.Response(401,
+          body: JSON.encode({'error': {'message': 'your token sucks'}}),
+          headers: {
+        'www-authenticate': 'Bearer error="invalid_token",'
+            ' error_description="your token sucks"'
+      });
     });
 
     pub.stderr.expect('OAuth2 authorization failed (your token sucks).');
diff --git a/sdk/lib/_internal/pub/test/pub_test.dart b/sdk/lib/_internal/pub/test/pub_test.dart
index 34b3a04..a7af4aa 100644
--- a/sdk/lib/_internal/pub/test/pub_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_test.dart
@@ -30,6 +30,7 @@
     Available commands:
       build      Apply transformers to build a package.
       cache      Work with the system cache.
+      deps       Print package dependencies.
       get        Get the current package's dependencies.
       help       Display help information for Pub.
       publish    Publish the current package to pub.dartlang.org.
@@ -87,10 +88,10 @@
     schedulePub(args: ['cache', '--help'],
         output: '''
           Work with the system cache.
-          
+
           Usage: pub cache <subcommand>
           -h, --help    Print usage information for this command.
-          
+
           Available subcommands:
             add   Install a package.
      ''');
@@ -105,10 +106,11 @@
     schedulePub(args: ['quylthulg'],
         error: '''
         Could not find a command named "quylthulg".
-   
+
         Available commands:
           build      Apply transformers to build a package.
           cache      Work with the system cache.
+          deps       Print package dependencies.
           get        Get the current package's dependencies.
           help       Display help information for Pub.
           publish    Publish the current package to pub.dartlang.org.
@@ -124,7 +126,7 @@
     schedulePub(args: ['cache', 'quylthulg'],
         error: '''
         Could not find a subcommand named "quylthulg" for "pub cache".
-   
+
         Usage: pub cache <subcommand>
         -h, --help    Print usage information for this command.
 
@@ -214,11 +216,15 @@
           output: '''
             Run a local web development server.
 
-            By default, this serves "web/" and "test/", but an explicit list of 
+            By default, this serves "web/" and "test/", but an explicit list of
             directories to serve can be provided as well.
 
             Usage: pub serve [directories...]
             -h, --help               Print usage information for this command.
+                --mode               Mode to run transformers in.
+                                     (defaults to "debug")
+
+                --all                Use all default source directories.
                 --hostname           The hostname to listen on.
                                      (defaults to "localhost")
 
@@ -229,8 +235,6 @@
                                      (defaults to on)
 
                 --[no-]force-poll    Force the use of a polling filesystem watcher.
-                --mode               Mode to run transformers in.
-                                     (defaults to "debug")
             ''');
     });
 
@@ -252,6 +256,7 @@
             Available commands:
               build      Apply transformers to build a package.
               cache      Work with the system cache.
+              deps       Print package dependencies.
               get        Get the current package's dependencies.
               help       Display help information for Pub.
               publish    Publish the current package to pub.dartlang.org.
@@ -270,7 +275,7 @@
 
             Usage: pub cache <subcommand>
             -h, --help    Print usage information for this command.
-    
+
             Available subcommands:
               add   Install a package.
             ''',
diff --git a/sdk/lib/_internal/pub/test/pub_uploader_test.dart b/sdk/lib/_internal/pub/test/pub_uploader_test.dart
index 7898a63..d195bde 100644
--- a/sdk/lib/_internal/pub/test/pub_uploader_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_uploader_test.dart
@@ -10,6 +10,7 @@
 import 'package:scheduled_test/scheduled_process.dart';
 import 'package:scheduled_test/scheduled_server.dart';
 import 'package:scheduled_test/scheduled_test.dart';
+import 'package:shelf/shelf.dart' as shelf;
 
 import '../lib/src/exit_codes.dart' as exit_codes;
 import '../lib/src/io.dart';
@@ -61,16 +62,13 @@
     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']);
 
     server.handle('POST', '/api/packages/pkg/uploaders', (request) {
-      expect(new ByteStream(request).toBytes().then((bodyBytes) {
-        expect(new String.fromCharCodes(bodyBytes), equals('email=email'));
+      return request.readAsString().then((body) {
+        expect(body, equals('email=email'));
 
-        request.response.headers.contentType =
-            new ContentType("application", "json");
-        request.response.write(JSON.encode({
+        return new shelf.Response.ok(JSON.encode({
           'success': {'message': 'Good job!'}
-        }));
-        request.response.close();
-      }), completes);
+        }), headers: {'content-type': 'application/json'});
+      });
     });
 
     pub.stdout.expect('Good job!');
@@ -83,12 +81,9 @@
     var pub = startPubUploader(server, ['--package', 'pkg', 'remove', 'email']);
 
     server.handle('DELETE', '/api/packages/pkg/uploaders/email', (request) {
-      request.response.headers.contentType =
-          new ContentType("application", "json");
-      request.response.write(JSON.encode({
+      return new shelf.Response.ok(JSON.encode({
         'success': {'message': 'Good job!'}
-      }));
-      request.response.close();
+      }), headers: {'content-type': 'application/json'});
     });
 
     pub.stdout.expect('Good job!');
@@ -103,11 +98,9 @@
     var pub = startPubUploader(server, ['add', 'email']);
 
     server.handle('POST', '/api/packages/test_pkg/uploaders', (request) {
-      request.response.headers.contentType =
-          new ContentType("application", "json");
-      request.response.write(JSON.encode({
+      return new shelf.Response.ok(JSON.encode({
         'success': {'message': 'Good job!'}
-      }));
+      }), headers: {'content-type': 'application/json'});
       request.response.close();
     });
 
@@ -121,13 +114,9 @@
     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']);
 
     server.handle('POST', '/api/packages/pkg/uploaders', (request) {
-      request.response.statusCode = 400;
-      request.response.headers.contentType =
-          new ContentType("application", "json");
-      request.response.write(JSON.encode({
-        'error': {'message': 'Bad job!'}
-      }));
-      request.response.close();
+      return new shelf.Response(400,
+          body: JSON.encode({'error': {'message': 'Bad job!'}}),
+          headers: {'content-type': 'application/json'});
     });
 
     pub.stderr.expect('Bad job!');
@@ -141,13 +130,9 @@
         ['--package', 'pkg', 'remove', 'e/mail']);
 
     server.handle('DELETE', '/api/packages/pkg/uploaders/e%2Fmail', (request) {
-      request.response.statusCode = 400;
-      request.response.headers.contentType =
-          new ContentType("application", "json");
-      request.response.write(JSON.encode({
-        'error': {'message': 'Bad job!'}
-      }));
-      request.response.close();
+      return new shelf.Response(400,
+          body: JSON.encode({'error': {'message': 'Bad job!'}}),
+          headers: {'content-type': 'application/json'});
     });
 
     pub.stderr.expect('Bad job!');
@@ -159,10 +144,8 @@
     d.credentialsFile(server, 'access token').create();
     var pub = startPubUploader(server, ['--package', 'pkg', 'add', 'email']);
 
-    server.handle('POST', '/api/packages/pkg/uploaders', (request) {
-      request.response.write("{not json");
-      request.response.close();
-    });
+    server.handle('POST', '/api/packages/pkg/uploaders',
+        (request) => new shelf.Response.ok("{not json"));
 
     pub.stderr.expect(emitsLines(
         'Invalid server response:\n'
@@ -175,10 +158,8 @@
     d.credentialsFile(server, 'access token').create();
     var pub = startPubUploader(server, ['--package', 'pkg', 'remove', 'email']);
 
-    server.handle('DELETE', '/api/packages/pkg/uploaders/email', (request) {
-      request.response.write("{not json");
-      request.response.close();
-    });
+    server.handle('DELETE', '/api/packages/pkg/uploaders/email',
+        (request) => new shelf.Response.ok("{not json"));
 
     pub.stderr.expect(emitsLines(
         'Invalid server response:\n'
diff --git a/sdk/lib/_internal/pub/test/serve/404_page_test.dart b/sdk/lib/_internal/pub/test/serve/404_page_test.dart
new file mode 100644
index 0000000..d37c387
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/404_page_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  setUp(() {
+    d.dir(appPath, [
+      d.appPubspec()
+    ]).create();
+  });
+
+  integration("the 404 page describes the missing asset", () {
+    pubServe();
+
+    scheduleRequest("packages/foo/missing.txt").then((response) {
+      expect(response.statusCode, equals(404));
+
+      // Should mention the asset that can't be found.
+      expect(response.body, contains("foo"));
+      expect(response.body, contains("missing.txt"));
+    });
+
+    endPubServe();
+  });
+
+  integration("the 404 page describes the error", () {
+    pubServe();
+
+    scheduleRequest("packages").then((response) {
+      expect(response.statusCode, equals(404));
+
+      // Should mention the asset that can't be found.
+      expect(response.body, contains('&quot;&#x2F;packages&quot;'));
+    });
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/roots/serves_urls_from_custom_roots_test.dart b/sdk/lib/_internal/pub/test/serve/roots/serves_urls_from_custom_roots_test.dart
deleted file mode 100644
index 885d3e6..0000000
--- a/sdk/lib/_internal/pub/test/serve/roots/serves_urls_from_custom_roots_test.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import 'package:path/path.dart' as p;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
-  initConfig();
-  integration("serves URLs from custom roots", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("example", [
-        d.dir("foo", [d.file("bar", "contents")])
-      ]),
-      d.dir("dir", [d.file("baz", "contents")]),
-      d.dir("web", [d.file("bang", "contents")])
-    ]).create();
-
-    pubServe(args: [p.join("example", "foo"), "dir"]);
-    requestShouldSucceed("bar", "contents", root: p.join("example", "foo"));
-    requestShouldSucceed("baz", "contents", root: "dir");
-    requestShould404("bang", root: "dir");
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/roots/throws_an_error_by_default_if_web_and_test_dont_exist_test.dart b/sdk/lib/_internal/pub/test/serve/roots/throws_an_error_by_default_if_web_and_test_dont_exist_test.dart
deleted file mode 100644
index dfea16b..0000000
--- a/sdk/lib/_internal/pub/test/serve/roots/throws_an_error_by_default_if_web_and_test_dont_exist_test.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import '../../../lib/src/exit_codes.dart' as exit_codes;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
-  initConfig();
-  integration("throws an error by default if web and test don't exist", () {
-    d.dir(appPath, [
-      d.appPubspec()
-    ]).create();
-
-    var server = startPubServe(createWebDir: false);
-    server.stderr.expect(emitsLines(
-        'Your package must have "web" and/or "test" directories to serve,\n'
-        'or you must pass in directories to serve explicitly.'));
-    server.shouldExit(exit_codes.USAGE);
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/roots/throws_an_error_if_custom_roots_are_outside_package_test.dart b/sdk/lib/_internal/pub/test/serve/roots/throws_an_error_if_custom_roots_are_outside_package_test.dart
deleted file mode 100644
index d628af8..0000000
--- a/sdk/lib/_internal/pub/test/serve/roots/throws_an_error_if_custom_roots_are_outside_package_test.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import '../../../lib/src/exit_codes.dart' as exit_codes;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
-  initConfig();
-  integration("throws an error if custom roots are outside the package", () {
-    d.dir(appPath, [
-      d.appPubspec()
-    ]).create();
-
-    var server = startPubServe(args: [".."]);
-    server.stderr.expect('Directory ".." isn\'t in this package.');
-    server.shouldExit(exit_codes.USAGE);
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/roots/throws_an_error_if_custom_roots_dont_exist_test.dart b/sdk/lib/_internal/pub/test/serve/roots/throws_an_error_if_custom_roots_dont_exist_test.dart
deleted file mode 100644
index fac152f..0000000
--- a/sdk/lib/_internal/pub/test/serve/roots/throws_an_error_if_custom_roots_dont_exist_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import '../../../lib/src/exit_codes.dart' as exit_codes;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
-  initConfig();
-  integration("throws an error if custom roots don't exist", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("baz")
-    ]).create();
-
-    var server = startPubServe(args: ["foo", "bar", "baz"]);
-    server.stderr.expect('Directories "bar" and "foo" don\'t exist.');
-    server.shouldExit(exit_codes.USAGE);
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/roots/serves_web_and_test_dirs_by_default_test.dart b/sdk/lib/_internal/pub/test/serve/serves_web_and_test_dirs_by_default_test.dart
similarity index 88%
rename from sdk/lib/_internal/pub/test/serve/roots/serves_web_and_test_dirs_by_default_test.dart
rename to sdk/lib/_internal/pub/test/serve/serves_web_and_test_dirs_by_default_test.dart
index c53e8ba..eabca23 100644
--- a/sdk/lib/_internal/pub/test/serve/roots/serves_web_and_test_dirs_by_default_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/serves_web_and_test_dirs_by_default_test.dart
@@ -4,9 +4,9 @@
 
 library pub_tests;
 
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/serve/utils.dart b/sdk/lib/_internal/pub/test/serve/utils.dart
index 1f968df..0b74fc8 100644
--- a/sdk/lib/_internal/pub/test/serve/utils.dart
+++ b/sdk/lib/_internal/pub/test/serve/utils.dart
@@ -204,18 +204,26 @@
 }
 
 /// Schedules an HTTP request to the running pub server with [urlPath] and
+/// invokes [callback] with the response.
+///
+/// [root] indicates which server should be accessed, and defaults to "web".
+Future<http.Response> scheduleRequest(String urlPath, {String root}) {
+  return schedule(() {
+    return http.get(_getServerUrlSync(root, urlPath));
+  }, "request $urlPath");
+}
+
+/// Schedules an HTTP request to the running pub server with [urlPath] and
 /// verifies that it responds with a body that matches [expectation].
 ///
 /// [expectation] may either be a [Matcher] or a string to match an exact body.
 /// [root] indicates which server should be accessed, and defaults to "web".
 /// [headers] may be either a [Matcher] or a map to match an exact headers map.
 void requestShouldSucceed(String urlPath, expectation, {String root, headers}) {
-  schedule(() {
-    return http.get(_getServerUrlSync(root, urlPath)).then((response) {
-      if (expectation != null) expect(response.body, expectation);
-      if (headers != null) expect(response.headers, headers);
-    });
-  }, "request $urlPath");
+  scheduleRequest(urlPath, root: root).then((response) {
+    if (expectation != null) expect(response.body, expectation);
+    if (headers != null) expect(response.headers, headers);
+  });
 }
 
 /// Schedules an HTTP request to the running pub server with [urlPath] and
@@ -223,11 +231,9 @@
 ///
 /// [root] indicates which server should be accessed, and defaults to "web".
 void requestShould404(String urlPath, {String root}) {
-  schedule(() {
-    return http.get(_getServerUrlSync(root, urlPath)).then((response) {
-      expect(response.statusCode, equals(404));
-    });
-  }, "request $urlPath");
+  scheduleRequest(urlPath, root: root).then((response) {
+    expect(response.statusCode, equals(404));
+  });
 }
 
 /// Schedules an HTTP request to the running pub server with [urlPath] and
@@ -243,7 +249,6 @@
     request.followRedirects = false;
     return request.send().then((response) {
       expect(response.statusCode ~/ 100, equals(3));
-
       expect(response.headers, containsPair('location', redirectTarget));
     });
   }, "request $urlPath");
@@ -293,11 +298,36 @@
   return WebSocket.connect("ws://127.0.0.1:$_adminPort").then((socket) {
     _webSocket = socket;
     // TODO(rnystrom): Works around #13913.
-    _webSocketBroadcastStream = _webSocket.asBroadcastStream();
+    _webSocketBroadcastStream = _webSocket.map(JSON.decode).asBroadcastStream();
   });
 }
 
 /// Sends a JSON RPC 2.0 request to the running pub serve's web socket
+/// connection.
+///
+/// This calls a method named [method] with the given [params]. [params] may
+/// contain Futures, in which case this will wait until they've completed before
+/// sending the request.
+///
+/// This schedules the request, but doesn't block the schedule on the response.
+/// It returns the response as a [Future].
+Future<Map> webSocketRequest(String method, Map params) {
+  var completer = new Completer();
+  schedule(() {
+    return Future.wait([
+      _ensureWebSocket(),
+      awaitObject(params),
+    ]).then((results) {
+      var resolvedParams = results[1];
+      chainToCompleter(
+          currentSchedule.wrapFuture(_jsonRpcRequest(method, resolvedParams)),
+          completer);
+    });
+  }, "send $method with $params to web socket");
+  return completer.future;
+}
+
+/// Sends a JSON RPC 2.0 request to the running pub serve's web socket
 /// connection, waits for a reply, then verifies the result.
 ///
 /// This calls a method named [method] with the given [params]. [params] may
@@ -312,17 +342,13 @@
 Future<Map> expectWebSocketResult(String method, Map params, result) {
   return schedule(() {
     return Future.wait([
-      _ensureWebSocket(),
-      awaitObject(params),
+      webSocketRequest(method, params),
       awaitObject(result)
     ]).then((results) {
-      var resolvedParams = results[1];
-      var resolvedResult = results[2];
-
-      return _jsonRpcRequest(method, resolvedParams).then((response) {
-        expect(response["result"], resolvedResult);
-        return response["result"];
-      });
+      var response = results[0];
+      var resolvedResult = results[1];
+      expect(response["result"], resolvedResult);
+      return response["result"];
     });
   }, "send $method with $params to web socket and expect $result");
 }
@@ -339,25 +365,33 @@
 /// the error message is checked against [errorMessage]. Either of these may be
 /// matchers.
 ///
+/// If [data] is provided, it is a JSON value or matcher used to validate the
+/// "data" value of the error response.
+///
 /// Returns a [Future] that completes to the error's [data] field.
 Future expectWebSocketError(String method, Map params, errorCode,
-    errorMessage) {
+    errorMessage, {data}) {
   return schedule(() {
-    return Future.wait([
-      _ensureWebSocket(),
-      awaitObject(params)
-    ]).then((results) {
-      var resolvedParams = results[1];
-      return _jsonRpcRequest(method, resolvedParams);
-    }).then((response) {
+    return webSocketRequest(method, params).then((response) {
       expect(response["error"]["code"], errorCode);
       expect(response["error"]["message"], errorMessage);
 
+      if (data != null) {
+        expect(response["error"]["data"], data);
+      }
+
       return response["error"]["data"];
     });
   }, "send $method with $params to web socket and expect error $errorCode");
 }
 
+/// Validates that [root] was not bound to a port when pub serve started.
+Future expectNotServed(String root) {
+  return schedule(() {
+    expect(_ports.containsKey(root), isFalse);
+  });
+}
+
 /// The next id to use for a JSON-RPC 2.0 request.
 var _rpcId = 0;
 
@@ -373,8 +407,8 @@
     "id": id
   }));
 
-  return _webSocketBroadcastStream.first.then((value) {
-    value = JSON.decode(value);
+  return _webSocketBroadcastStream
+      .firstWhere((response) => response["id"] == id).then((value) {
     currentSchedule.addDebugInfo(
         "Web Socket request $method with params $params\n"
         "Result: $value");
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_multiple_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_multiple_test.dart
deleted file mode 100644
index b8b4110..0000000
--- a/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_multiple_test.dart
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import 'package:path/path.dart' as path;
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
-  // TODO(rnystrom): Split into independent tests.
-  initConfig();
-  integration("pathToUrls returns multiple urls if servers overlap", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("test", [
-        d.file("index.html", "<body>")
-      ]),
-      d.dir("web", [
-        d.file("index.html", "<body>"),
-        d.dir("sub", [
-          d.file("bar.html", "bar"),
-        ])
-      ])
-    ]).create();
-
-    pubServe(args: ["web", path.join("web", "sub"), "test"]);
-
-    expectWebSocketResult("pathToUrls", {
-      "path": path.join("web", "index.html")
-    }, {
-      "urls": [getServerUrl("web", "index.html")]
-    });
-
-    expectWebSocketResult("pathToUrls", {
-      "path": path.join("web", "sub", "bar.html")
-    }, {
-      "urls": [
-        getServerUrl("web", "sub/bar.html"),
-        getServerUrl(path.join("web", "sub"), "bar.html")
-      ]
-    });
-
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_request_asset_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_request_asset_test.dart
new file mode 100644
index 0000000..cc6ecd4
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_request_asset_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("binds a directory to a new port and immediately requests an "
+      "asset URL from that server", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("test", [
+        d.file("index.html", "<test body>")
+      ]),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    pubServe(args: ["web"]);
+
+    // Bind the new directory.
+    expect(webSocketRequest("serveDirectory", {"path": "test"}), completes);
+
+    expectWebSocketResult("pathToUrls", {"path": "test/index.html"}, {
+      "urls": [endsWith("/index.html")]
+    });
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_serve_again_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_serve_again_test.dart
new file mode 100644
index 0000000..dc7f3e3
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_serve_again_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'dart:async';
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("binds a directory to a new port and immediately binds that "
+      "directory again", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("test", [
+        d.file("index.html", "<test body>")
+      ]),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    pubServe(args: ["web"]);
+
+    schedule(() {
+      return Future.wait([
+        webSocketRequest("serveDirectory", {"path": "test"}),
+        webSocketRequest("serveDirectory", {"path": "test"})
+      ]).then((results) {
+        expect(results[0], contains("result"));
+        expect(results[1], contains("result"));
+        expect(results[0]["result"], equals(results[1]["result"]));
+      });
+    });
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_unserve_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_unserve_test.dart
new file mode 100644
index 0000000..d8f60e4
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_unserve_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'dart:async';
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("binds a directory to a new port and immediately unbinds that "
+      "directory", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("test", [
+        d.file("index.html", "<test body>")
+      ]),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    pubServe(args: ["web"]);
+
+    // We call [webSocketRequest] outside of the [schedule] call below because
+    // we need it to schedule the sending of the request to guarantee that the
+    // serve is sent before the unserve.
+    var serveRequest = webSocketRequest("serveDirectory", {"path": "test"});
+    var unserveRequest = webSocketRequest("unserveDirectory", {"path": "test"});
+
+    schedule(() {
+      return Future.wait([serveRequest, unserveRequest]).then((results) {
+        expect(results[0], contains("result"));
+        expect(results[1], contains("result"));
+        // These results should be equal since "serveDirectory" returns the URL
+        // of the new server and "unserveDirectory" returns the URL of the
+        // server that was turned off. We're asserting that the same server was
+        // both started and stopped.
+        expect(results[0]["result"]["url"],
+            matches(r"http://127\.0\.0\.1:\d+"));
+        expect(results[0]["result"], equals(results[1]["result"]));
+      });
+    });
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_overlapping_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_overlapping_test.dart
new file mode 100644
index 0000000..143e531
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_overlapping_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as path;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("fails if the directory overlaps one already being served", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "<body>"),
+        d.dir("sub", [
+          d.file("index.html", "<sub>"),
+        ])
+      ])
+    ]).create();
+
+    pubServe();
+
+    var webSub = path.join("web", "sub");
+    expectWebSocketError("serveDirectory", {"path": webSub}, 2,
+        'Path "$webSub" overlaps already served directory "web".',
+        data: containsPair("directories", ["web"]));
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_subdirectory_still_watched_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_subdirectory_still_watched_test.dart
deleted file mode 100644
index eb7aed4..0000000
--- a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_subdirectory_still_watched_test.dart
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import 'package:path/path.dart' as p;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
-  initConfig();
-  integration("when a subdirectory is unbound it is still watched because the "
-      "superdirectory is watching it", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("example", [
-        d.dir("one", [
-          d.file("foo.txt", "before")
-        ])
-      ])
-    ]).create();
-
-    var exampleOne = p.join("example", "one");
-    pubServe(args: ["example", exampleOne]);
-
-    requestShouldSucceed("one/foo.txt", "before", root: "example");
-    requestShouldSucceed("foo.txt", "before", root: exampleOne);
-
-    // Unbind the subdirectory.
-    expectWebSocketResult("unserveDirectory", {"path": exampleOne}, {
-      "url": getServerUrl(exampleOne)
-    });
-
-    // "example/one" should not be served now.
-    requestShouldNotConnect("foo.txt", root: exampleOne);
-
-    // "example" is still fine.
-    requestShouldSucceed("one/foo.txt", "before", root: "example");
-
-    // And still being watched.
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("example", [
-        d.dir("one", [
-          d.file("foo.txt", "after")
-        ])
-      ])
-    ]).create();
-
-    waitForBuildSuccess();
-    requestShouldSucceed("one/foo.txt", "after", root: "example");
-
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_superdirectory_still_watched_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_superdirectory_still_watched_test.dart
deleted file mode 100644
index b9bf04c..0000000
--- a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_superdirectory_still_watched_test.dart
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import 'package:path/path.dart' as p;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
-  initConfig();
-  integration("when a superdirectory is unbound it is still watched because "
-      "the subdirectory is watching it", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("example", [
-        d.dir("one", [
-          d.file("foo.txt", "before")
-        ])
-      ])
-    ]).create();
-
-    var exampleOne = p.join("example", "one");
-    pubServe(args: [exampleOne, "example"]);
-
-    requestShouldSucceed("one/foo.txt", "before", root: "example");
-    requestShouldSucceed("foo.txt", "before", root: exampleOne);
-
-    // Unbind the subdirectory.
-    expectWebSocketResult("unserveDirectory", {"path": "example"}, {
-      "url": getServerUrl("example")
-    });
-
-    // "example" should not be served now.
-    requestShouldNotConnect("one/foo.txt", root: "example");
-
-    // "example/one" is still fine.
-    requestShouldSucceed("foo.txt", "before", root: exampleOne);
-
-    // And still being watched.
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("example", [
-        d.dir("one", [
-          d.file("foo.txt", "after")
-        ])
-      ])
-    ]).create();
-
-    waitForBuildSuccess();
-    requestShouldSucceed("foo.txt", "after", root: exampleOne);
-
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_errors_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_errors_test.dart
new file mode 100644
index 0000000..4fef6a2
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_errors_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  setUp(() {
+    d.dir(appPath, [
+      d.appPubspec()
+    ]).create();
+  });
+
+  integration("responds with NOT_SERVED for an unknown domain", () {
+    pubServe();
+    expectWebSocketError("urlToAssetId", {
+      "url": "http://example.com:80/index.html"
+    }, NOT_SERVED, '"example.com:80" is not being served by pub.');
+    endPubServe();
+  });
+
+  integration("responds with NOT_SERVED for an unknown port", () {
+    pubServe();
+    expectWebSocketError("urlToAssetId", {
+      "url": "http://localhost:80/index.html"
+    }, NOT_SERVED, '"localhost:80" is not being served by pub.');
+    endPubServe();
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_test.dart
new file mode 100644
index 0000000..74726bf
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_test.dart
@@ -0,0 +1,122 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  // TODO(rnystrom): Split into independent tests.
+  initConfig();
+  setUp(() {
+    d.dir("foo", [
+      d.libPubspec("foo", "0.0.1"),
+      d.dir("asset", [
+        d.file("foo.txt", "foo"),
+        d.dir("sub", [
+          d.file("bar.txt", "bar"),
+        ])
+      ]),
+      d.dir("lib", [
+        d.file("foo.dart", "foo")
+      ])
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({
+        "foo": {"path": "../foo"}
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", "myapp"),
+      ]),
+      d.dir("test", [
+        d.file("index.html", "<body>"),
+        d.dir("sub", [
+          d.file("bar.html", "bar"),
+        ])
+      ]),
+      d.dir("web", [
+        d.file("index.html", "<body>"),
+        d.dir("sub", [
+          d.file("bar.html", "bar"),
+        ])
+      ])
+    ]).create();
+  });
+
+  integration("converts URLs to matching asset ids in web/", () {
+    pubServe(shouldGetFirst: true);
+    expectWebSocketResult("urlToAssetId", {
+      "url": getServerUrl("web", "index.html")
+    }, {"package": "myapp", "path": "web/index.html"});
+    endPubServe();
+  });
+
+  integration("converts URLs to matching asset ids in subdirectories of web/",
+      () {
+    pubServe(shouldGetFirst: true);
+    expectWebSocketResult("urlToAssetId", {
+      "url": getServerUrl("web", "sub/bar.html")
+    }, {"package": "myapp", "path": "web/sub/bar.html"});
+    endPubServe();
+  });
+
+  integration("converts URLs to matching asset ids in test/", () {
+    pubServe(shouldGetFirst: true);
+    expectWebSocketResult("urlToAssetId", {
+      "url": getServerUrl("test", "index.html")
+    }, {"package": "myapp", "path": "test/index.html"});
+    endPubServe();
+  });
+
+  integration("converts URLs to matching asset ids in subdirectories of test/",
+      () {
+    pubServe(shouldGetFirst: true);
+    expectWebSocketResult("urlToAssetId", {
+      "url": getServerUrl("test", "sub/bar.html")
+    }, {"package": "myapp", "path": "test/sub/bar.html"});
+    endPubServe();
+  });
+
+  integration("converts URLs to matching asset ids in the entrypoint's lib/",
+      () {
+    // Path in root package's lib/.
+    pubServe(shouldGetFirst: true);
+    expectWebSocketResult("urlToAssetId", {
+      "url": getServerUrl("web", "packages/myapp/myapp.dart")
+    }, {"package": "myapp", "path": "lib/myapp.dart"});
+    endPubServe();
+  });
+
+  integration("converts URLs to matching asset ids in a dependency's lib/", () {
+    // Path in lib/.
+    pubServe(shouldGetFirst: true);
+    expectWebSocketResult("urlToAssetId", {
+      "url": getServerUrl("web", "packages/foo/foo.dart")
+    }, {"package": "foo", "path": "lib/foo.dart"});
+    endPubServe();
+  });
+
+  integration("converts URLs to matching asset ids in the entrypoint's asset/",
+      () {
+    // Paths in asset/.
+    pubServe(shouldGetFirst: true);
+    expectWebSocketResult("urlToAssetId", {
+      "url": getServerUrl("web", "assets/foo/foo.txt")
+    }, {"package": "foo", "path": "asset/foo.txt"});
+    endPubServe();
+  });
+
+  integration("converts URLs to matching asset ids in a dependency's of asset/",
+      () {
+    pubServe(shouldGetFirst: true);
+    expectWebSocketResult("urlToAssetId", {
+      "url": getServerUrl("web", "assets/foo/sub/bar.txt")
+    }, {"package": "foo", "path": "asset/sub/bar.txt"});
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_with_line_test.dart
new file mode 100644
index 0000000..4c5cb4d
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_with_line_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("provides output line number if given source one", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("main.dart", "main")
+      ])
+    ]).create();
+
+    pubServe();
+
+    // Paths in web/.
+    expectWebSocketResult("urlToAssetId", {
+      "url": getServerUrl("web", "main.dart"),
+      "line": 12345
+    }, {
+      "package": "myapp",
+      "path": "web/main.dart",
+      "line": 12345
+    });
+
+    endPubServe();
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index 2ed23a9..42d0aa0 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -19,6 +19,8 @@
 import 'package:scheduled_test/scheduled_server.dart';
 import 'package:scheduled_test/scheduled_stream.dart';
 import 'package:scheduled_test/scheduled_test.dart';
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart' as shelf_io;
 import 'package:unittest/compact_vm_config.dart';
 import 'package:yaml/yaml.dart';
 
@@ -104,39 +106,20 @@
 
   schedule(() {
     return _closeServer().then((_) {
-      return HttpServer.bind("127.0.0.1", 0).then((server) {
-        _server = server;
-        server.listen((request) {
-          currentSchedule.heartbeat();
-          var response = request.response;
-          try {
-            var path = request.uri.path.replaceFirst("/", "");
-            _requestedPaths.add(path);
+      return shelf_io.serve((request) {
+        currentSchedule.heartbeat();
+        var path = request.url.path.replaceFirst("/", "");
+        _requestedPaths.add(path);
 
-            response.persistentConnection = false;
-            var stream = baseDir.load(path);
-
-            new ByteStream(stream).toBytes().then((data) {
-              currentSchedule.heartbeat();
-              response.statusCode = 200;
-              response.contentLength = data.length;
-              response.add(data);
-              response.close();
-            }).catchError((e) {
-              response.statusCode = 404;
-              response.contentLength = 0;
-              response.close();
-            });
-          } catch (e) {
-            currentSchedule.signalError(e);
-            response.statusCode = 500;
-            response.close();
-            return;
-          }
+        return validateStream(baseDir.load(path))
+            .then((stream) => new shelf.Response.ok(stream))
+            .catchError((error) {
+          return new shelf.Response.notFound('File "$path" not found.');
         });
+      }, '127.0.0.1', 0).then((server) {
+        _server = server;
         _portCompleter.complete(_server.port);
         currentSchedule.onComplete.schedule(_closeServer);
-        return null;
       });
     });
   }, 'starting a server serving:\n${baseDir.describe()}');
@@ -383,10 +366,12 @@
 /// Runs Pub with [args] and validates that its results match [output] (or
 /// [outputJson]), [error], and [exitCode].
 ///
+/// [output] and [error] can be [String]s, [RegExp]s, or [Matcher]s.
+///
 /// If [outputJson] is given, validates that pub outputs stringified JSON
 /// matching that object, which can be a literal JSON object or any other
 /// [Matcher].
-void schedulePub({List args, Pattern output, Pattern error, outputJson,
+void schedulePub({List args, output, error, outputJson,
     Future<Uri> tokenEndpoint, int exitCode: exit_codes.SUCCESS}) {
   // Cannot pass both output and outputJson.
   assert(output == null || outputJson == null);
@@ -737,71 +722,61 @@
   return map;
 }
 
-/// Compares the [actual] output from running pub with [expected]. For [String]
-/// patterns, ignores leading and trailing whitespace differences and tries to
-/// report the offending difference in a nice way. For other [Pattern]s, just
-/// reports whether the output contained the pattern.
-void _validateOutput(List<String> failures, String pipe, Pattern expected,
+/// Compares the [actual] output from running pub with [expected].
+///
+/// If [expected] is a [String], ignores leading and trailing whitespace
+/// differences and tries to report the offending difference in a nice way.
+///
+/// If it's a [RegExp] or [Matcher], just reports whether the output matches.
+void _validateOutput(List<String> failures, String pipe, expected,
                      String actual) {
   if (expected == null) return;
 
-  var actualLines = actual.split("\n");
-  if (expected is RegExp) {
-    _validateOutputRegex(failures, pipe, expected, actualLines);
+  if (expected is String) {
+    _validateOutputString(failures, pipe, expected, actual);
   } else {
-    _validateOutputString(failures, pipe, expected, actualLines);
-  }
-}
-
-void _validateOutputRegex(List<String> failures, String pipe,
-                          RegExp expected, List<String> actual) {
-  var actualText = actual.join('\n');
-  if (actualText.contains(expected)) return;
-
-  if (actual.length == 0) {
-    failures.add('Expected $pipe to match "${expected.pattern}" but got none.');
-  } else {
-    failures.add('Expected $pipe to match "${expected.pattern}" but got:');
-    failures.addAll(actual.map((line) => '| $line'));
+    if (expected is RegExp) expected = matches(expected);
+    expect(actual, expected);
   }
 }
 
 void _validateOutputString(List<String> failures, String pipe,
-                           String expectedText, List<String> actual) {
-  final expected = expectedText.split('\n');
+                           String expected, String actual) {
+  var actualLines = actual.split("\n");
+  var expectedLines = expected.split("\n");
 
   // Strip off the last line. This lets us have expected multiline strings
   // where the closing ''' is on its own line. It also fixes '' expected output
   // to expect zero lines of output, not a single empty line.
-  if (expected.last.trim() == '') {
-    expected.removeLast();
+  if (expectedLines.last.trim() == '') {
+    expectedLines.removeLast();
   }
 
   var results = [];
   var failed = false;
 
   // Compare them line by line to see which ones match.
-  var length = max(expected.length, actual.length);
+  var length = max(expectedLines.length, actualLines.length);
   for (var i = 0; i < length; i++) {
-    if (i >= actual.length) {
+    if (i >= actualLines.length) {
       // Missing output.
       failed = true;
-      results.add('? ${expected[i]}');
-    } else if (i >= expected.length) {
+      results.add('? ${expectedLines[i]}');
+    } else if (i >= expectedLines.length) {
       // Unexpected extra output.
       failed = true;
-      results.add('X ${actual[i]}');
+      results.add('X ${actualLines[i]}');
     } else {
-      var expectedLine = expected[i].trim();
-      var actualLine = actual[i].trim();
+      var expectedLine = expectedLines[i].trim();
+      var actualLine = actualLines[i].trim();
 
       if (expectedLine != actualLine) {
         // Mismatched lines.
         failed = true;
-        results.add('X ${actual[i]}');
+        results.add('X ${actualLines[i]}');
       } else {
         // Output is OK, but include it in case other lines are wrong.
-        results.add('| ${actual[i]}');
+        results.add('| ${actualLines[i]}');
       }
     }
   }
@@ -809,7 +784,7 @@
   // If any lines mismatched, show the expected and actual.
   if (failed) {
     failures.add('Expected $pipe:');
-    failures.addAll(expected.map((line) => '| $line'));
+    failures.addAll(expectedLines.map((line) => '| $line'));
     failures.add('Got:');
     failures.addAll(results);
   }
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/converts_entrypoint_in_web_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/converts_entrypoint_in_web_test.dart
deleted file mode 100644
index 90ad051..0000000
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/converts_entrypoint_in_web_test.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
-
-main() {
-  initConfig();
-  integration("converts a Dart entrypoint in web to JS", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("web", [
-        d.file("main.dart", "void main() => print('hello');")
-      ])
-    ]).create();
-
-    pubServe();
-    requestShouldSucceed("main.dart.js", contains("hello"));
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_entrypoint_outside_web_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_entrypoint_outside_web_test.dart
deleted file mode 100644
index 1ad02a3..0000000
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_entrypoint_outside_web_test.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
-
-main() {
-  initConfig();
-  integration("ignores a Dart entrypoint outside web", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("lib", [
-        d.file("main.dart", "void main() => print('hello');")
-      ])
-    ]).create();
-
-    pubServe();
-    requestShould404("packages/myapp/main.dart.js");
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_nonentrypoint_in_web_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_nonentrypoint_in_web_test.dart
deleted file mode 100644
index 29a079d..0000000
--- a/sdk/lib/_internal/pub/test/transformer/dart2js/ignores_nonentrypoint_in_web_test.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../../serve/utils.dart';
-
-main() {
-  initConfig();
-  integration("ignores a non-entrypoint library in web", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("web", [
-        d.file("notmain.dart", "foo() => print('hello');")
-      ])
-    ]).create();
-
-    pubServe();
-    waitForBuildSuccess();
-    requestShouldSucceed("notmain.dart", "foo() => print('hello');");
-    requestShould404("notmain.dart.js");
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/transformer/mode_defaults_to_debug_in_serve_test.dart b/sdk/lib/_internal/pub/test/transformer/mode_defaults_to_debug_in_serve_test.dart
deleted file mode 100644
index a20d75a..0000000
--- a/sdk/lib/_internal/pub/test/transformer/mode_defaults_to_debug_in_serve_test.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-import '../serve/utils.dart';
-
-final transformer = """
-import 'dart:async';
-import 'dart:convert';
-
-import 'package:barback/barback.dart';
-
-class ModeTransformer extends Transformer {
-  final BarbackSettings settings;
-
-  ModeTransformer.asPlugin(this.settings);
-
-  String get allowedExtensions => '.txt';
-
-  Future apply(Transform transform) {
-    return transform.primaryInput.readAsString().then((contents) {
-      transform.addOutput(
-          new Asset.fromString(transform.primaryInput.id, settings.mode.name));
-    });
-  }
-}
-""";
-
-main() {
-  initConfig();
-  integration("mode defaults to 'debug' in pub serve", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp/src/transformer"]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", transformer)
-      ])]),
-      d.dir("web", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
-
-    createLockFile('myapp', pkg: ['barback']);
-
-    var server = pubServe();
-    requestShouldSucceed("foo.txt", "debug");
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/transformer/mode_defaults_to_release_in_build_test.dart b/sdk/lib/_internal/pub/test/transformer/mode_defaults_to_release_in_build_test.dart
deleted file mode 100644
index 6fbc0b0..0000000
--- a/sdk/lib/_internal/pub/test/transformer/mode_defaults_to_release_in_build_test.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub_tests;
-
-import '../descriptor.dart' as d;
-import '../test_pub.dart';
-
-final transformer = """
-import 'dart:async';
-
-import 'package:barback/barback.dart';
-
-class ModeTransformer extends Transformer {
-  final BarbackSettings settings;
-
-  ModeTransformer.asPlugin(this.settings);
-
-  String get allowedExtensions => '.txt';
-
-  Future apply(Transform transform) {
-    return transform.primaryInput.readAsString().then((contents) {
-      transform.addOutput(
-          new Asset.fromString(transform.primaryInput.id, settings.mode.name));
-    });
-  }
-}
-""";
-
-main() {
-  initConfig();
-  integration("mode defaults to 'release' in pub build", () {
-    d.dir(appPath, [
-      d.pubspec({
-        "name": "myapp",
-        "transformers": ["myapp/src/transformer"]
-      }),
-      d.dir("lib", [d.dir("src", [
-        d.file("transformer.dart", transformer)
-      ])]),
-      d.dir("web", [
-        d.file("foo.txt", "foo")
-      ])
-    ]).create();
-
-    createLockFile('myapp', pkg: ['barback']);
-
-    schedulePub(args: ["build"],
-        output: new RegExp(r'Built 1 file to "build".'));
-
-    d.dir(appPath, [
-      d.dir('build', [
-        d.dir('web', [
-          d.file('foo.txt', 'release')
-        ])
-      ])
-    ]).validate();
-  });
-}
diff --git a/sdk/lib/async/schedule_microtask.dart b/sdk/lib/async/schedule_microtask.dart
index bd5312a..02114d4 100644
--- a/sdk/lib/async/schedule_microtask.dart
+++ b/sdk/lib/async/schedule_microtask.dart
@@ -30,7 +30,14 @@
 void _asyncRunCallback() {
   try {
     _asyncRunCallbackLoop();
-  } catch (e) {
+  } catch (e, s) {
+    // TODO(efortuna): Remove these debugging statements.
+    if (e is Error) {
+      print('microtask error ${e.stackTrace}');
+    } else {
+      print('microtask error $e');
+    }
+    print('microtask error stack trace: $s');
     _AsyncRun._scheduleImmediate(_asyncRunCallback);
     _nextCallback = _nextCallback.next;
     rethrow;
diff --git a/sdk/lib/collection/maps.dart b/sdk/lib/collection/maps.dart
index 2d605e8..ef937b3 100644
--- a/sdk/lib/collection/maps.dart
+++ b/sdk/lib/collection/maps.dart
@@ -5,6 +5,196 @@
 part of dart.collection;
 
 /**
+ * Base class for implementing a [Map].
+ *
+ * This class has a basic implementation of all but five of the members of
+ * [Map].
+ * A basic `Map` class can be implemented by extending this class and
+ * implementing `keys`, `operator[]`, `operator[]=`, `remove` and `clear`.
+ * The remaining operations are implemented in terms of these five.
+ *
+ * The `keys` iterable should have efficient [length] and [contains]
+ * operations, and it should catch concurrent modifications of the keys
+ * while iterating.
+ *
+ * A more efficient implementation is usually possible by overriding
+ * some of the other members as well.
+ */
+abstract class MapBase<K, V> implements Map<K, V> {
+  MapBase();  // Prevents use as mixin.
+
+  Iterable<K> get keys;
+  V operator[](Object key);
+  operator []=(K key, V value);
+  V remove(Object key);
+  // The `clear` operation should not be based on `remove`.
+  // It should clear the map even if some keys are not equal to themselves.
+  void clear();
+
+  void forEach(void action(K key, V value)) {
+    for (K key in keys) {
+      action(key, this[key]);
+    }
+  }
+
+  void addAll(Map<K, V> other) {
+    for (K key in other.keys) {
+      this[key] = other[key];
+    }
+  }
+
+  bool containsValue(V value) {
+    for (K key in keys) {
+      if (this[key] == value) return true;
+    }
+    return false;
+  }
+
+  V putIfAbsent(K key, V ifAbsent()) {
+    if (keys.contains(key)) {
+      return this[key];
+    }
+    return this[key] = ifAbsent();
+  }
+
+  bool containsKey(Object key) => keys.contains(key);
+  int get length => keys.length;
+  bool get isEmpty => keys.isEmpty;
+  bool get isNotEmpty => keys.isNotEmpty;
+  Iterable<V> get values => new _MapBaseValueIterable<V>(this);
+  String toString() => Maps.mapToString(this);
+}
+
+/**
+ * Basic implementation of an unmodifiable [Map].
+ *
+ * This class has a basic implementation of all but two of the members of
+ * an umodifiable [Map].
+ * A simple unmodifiable `Map` class can be implemented by extending this
+ * class and implementing `keys` and `operator[]`.
+ *
+ * Modifying operations throw when used.
+ * The remaining non-modifying operations are implemented in terms of `keys`
+ * and `operator[]`.
+ *
+ * The `keys` iterable should have efficient [length] and [contains]
+ * operations, and it should catch concurrent modifications of the keys
+ * while iterating.
+ *
+ * A more efficient implementation is usually possible by overriding
+ * some of the other members as well.
+ */
+abstract class UnmodifiableMapBase<K, V> =
+    MapBase<K, V> with _UnmodifiableMapMixin<K, V>;
+
+/**
+ * Implementation of [Map.values] based on the map and its [Map.keys] iterable.
+ *
+ * Iterable that iterates over the values of a `Map`.
+ * It accesses the values by iterating over the keys of the map, and using the
+ * map's `operator[]` to lookup the keys.
+ */
+class _MapBaseValueIterable<V> extends IterableBase<V>
+                               implements EfficientLength {
+  final Map _map;
+  _MapBaseValueIterable(this._map);
+
+  int get length => _map.length;
+  bool get isEmpty => _map.isEmpty;
+  bool get isNotEmpty => _map.isNotEmpty;
+  V get first => _map[_map.keys.first];
+  V get single => _map[_map.keys.single];
+  V get last => _map[_map.keys.last];
+
+  Iterator<V> get iterator => new _MapBaseValueIterator<V>(_map);
+}
+
+/**
+ * Iterator created by [_MapBaseValueIterable].
+ *
+ * Iterates over the values of a map by iterating its keys and lookup up the
+ * values.
+ */
+class _MapBaseValueIterator<V> implements Iterator<V> {
+  final Iterator _keys;
+  final Map _map;
+  V _current = null;
+
+  _MapBaseValueIterator(Map map) : _map = map, _keys = map.keys.iterator;
+
+  bool moveNext() {
+    if (_keys.moveNext()) {
+      _current = _map[_keys.current];
+      return true;
+    }
+    _current = null;
+    return false;
+  }
+
+  V get current => _current;
+}
+
+/**
+ * Mixin that overrides mutating map operations with implementations that throw.
+ */
+abstract class _UnmodifiableMapMixin<K, V> implements Map<K, V> {
+  void operator[]=(K key, V value) {
+    throw new UnsupportedError("Cannot modify unmodifiable map");
+  }
+  void addAll(Map<K, V> other) {
+    throw new UnsupportedError("Cannot modify unmodifiable map");
+  }
+  void clear() {
+    throw new UnsupportedError("Cannot modify unmodifiable map");
+  }
+  V remove(Object key) {
+    throw new UnsupportedError("Cannot modify unmodifiable map");
+  }
+  V putIfAbsent(K key, V ifAbsent()) {
+    throw new UnsupportedError("Cannot modify unmodifiable map");
+  }
+}
+
+/**
+ * Wrapper around a class that implements [Map] that only exposes `Map` members.
+ *
+ * A simple wrapper that delegates all `Map` members to the map provided in the
+ * constructor.
+ *
+ * Base for delegating map implementations like [UnmodifiableMapView].
+ */
+class MapView<K, V> implements Map<K, V> {
+  final Map<K, V> _map;
+  MapView(Map<K, V> map) : _map = map;
+
+  V operator[](Object key) => _map[key];
+  void operator[]=(K key, V value) { _map[key] = value; }
+  void addAll(Map<K, V> other) { _map.addAll(other); }
+  void clear() { _map.clear(); }
+  V putIfAbsent(K key, V ifAbsent()) => _map.putIfAbsent(key, ifAbsent);
+  bool containsKey(Object key) => _map.containsKey(key);
+  bool containsValue(Object value) => _map.containsValue(value);
+  void forEach(void action(K key, V value)) { _map.forEach(action); }
+  bool get isEmpty => _map.isEmpty;
+  bool get isNotEmpty => _map.isNotEmpty;
+  int get length => _map.length;
+  Iterable<K> get keys => _map.keys;
+  V remove(Object key) => _map.remove(key);
+  String toString() => _map.toString();
+  Iterable<V> get values => _map.values;
+}
+
+/**
+ * View of a [Map] that disallow modifying the map.
+ *
+ * A wrapper around a `Map` that forwards all members to the map provided in
+ * the constructor, except for operations that modify the map.
+ * Modifying operations throw instead.
+ */
+class UnmodifiableMapView<K, V> =
+    MapView<K, V> with _UnmodifiableMapMixin<K, V>;
+
+/**
  * Helper class which implements complex [Map] operations
  * in term of basic ones ([Map.keys], [Map.operator []],
  * [Map.operator []=] and [Map.remove].)  Not all methods are
diff --git a/sdk/lib/convert/convert.dart b/sdk/lib/convert/convert.dart
index e493ec0..93f1063 100644
--- a/sdk/lib/convert/convert.dart
+++ b/sdk/lib/convert/convert.dart
@@ -55,7 +55,6 @@
 library dart.convert;
 
 import 'dart:async';
-import "dart:collection" show HashSet;
 
 part 'ascii.dart';
 part 'byte_conversion.dart';
diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart
index 07de8f4..8e4bc2e 100644
--- a/sdk/lib/convert/json.dart
+++ b/sdk/lib/convert/json.dart
@@ -157,6 +157,16 @@
  * This class converts JSON objects to strings.
  */
 class JsonEncoder extends Converter<Object, String> {
+  /**
+   * The string used for indention.
+   *
+   * When generating multi-line output, this string is inserted once at the
+   * beginning of each indented line for each level of indentation.
+   *
+   * If `null`, the output is encoded as a single line.
+   */
+  final String indent;
+
   final _toEncodableFunction;
 
   /**
@@ -172,10 +182,33 @@
    * the object.
    */
   const JsonEncoder([Object toEncodable(Object nonSerializable)])
+      : this.indent = null,
+        this._toEncodableFunction = toEncodable;
+
+  /**
+   * Creates a JSON encoder that creates multi-line JSON.
+   *
+   * The encoding of elements of lists and maps are indented and put on separate
+   * lines. The [indent] string is prepended to these elements, once for each
+   * level of indentation.
+   *
+   * If [indent] is `null`, the output is encoded as a single line.
+   *
+   * The JSON encoder handles numbers, strings, booleans, null, lists and
+   * maps directly.
+   *
+   * Any other object is attempted converted by [toEncodable] to an
+   * object that is of one of the convertible types.
+   *
+   * If [toEncodable] is omitted, it defaults to calling `.toJson()` on
+   * the object.
+   */
+  const JsonEncoder.withIndent(this.indent,
+      [Object toEncodable(Object nonSerializable)])
       : this._toEncodableFunction = toEncodable;
 
   /**
-   * Converts the given object [o] to its JSON representation.
+   * Converts [object] to a JSON [String].
    *
    * Directly serializable values are [num], [String], [bool], and [Null], as
    * well as some [List] and [Map] values.
@@ -196,13 +229,14 @@
    * other lists or maps, it cannot be serialized and a [JsonCyclicError] is
    * thrown.
    *
-   * Json Objects should not change during serialization.
-   * If an object is serialized more than once, [stringify] is allowed to cache
-   * the JSON text for it. I.e., if an object changes after it is first
-   * serialized, the new values may or may not be reflected in the result.
+   * [object] should not change during serialization.
+   *
+   * If an object is serialized more than once, [convert] may cache the text
+   * for it. In other words, if the content of an object changes after it is
+   * first serialized, the new values may not be reflected in the result.
    */
-  String convert(Object o) =>
-      _JsonStringifier.stringify(o, _toEncodableFunction);
+  String convert(Object object) =>
+      _JsonStringifier.stringify(object, _toEncodableFunction, indent);
 
   /**
    * Starts a chunked conversion.
@@ -217,7 +251,7 @@
     if (sink is! StringConversionSink) {
       sink = new StringConversionSink.from(sink);
     }
-    return new _JsonEncoderSink(sink, _toEncodableFunction);
+    return new _JsonEncoderSink(sink, _toEncodableFunction, indent);
   }
 
   // Override the base-classes bind, to provide a better type.
@@ -230,11 +264,12 @@
  * The sink only accepts one value, but will produce output in a chunked way.
  */
 class _JsonEncoderSink extends ChunkedConversionSink<Object> {
+  final String _indent;
   final Function _toEncodableFunction;
   final StringConversionSink _sink;
   bool _isDone = false;
 
-  _JsonEncoderSink(this._sink, this._toEncodableFunction);
+  _JsonEncoderSink(this._sink, this._toEncodableFunction, this._indent);
 
   /**
    * Encodes the given object [o].
@@ -249,7 +284,7 @@
     }
     _isDone = true;
     ClosableStringSink stringSink = _sink.asStringSink();
-    _JsonStringifier.printOn(o, stringSink, _toEncodableFunction);
+    _JsonStringifier.printOn(o, stringSink, _toEncodableFunction, _indent);
     stringSink.close();
   }
 
@@ -353,19 +388,25 @@
   final StringSink _sink;
   final List _seen;
 
-  _JsonStringifier(this._sink, this._toEncodable)
+  factory _JsonStringifier(StringSink sink, Function toEncodable,
+      String indent) {
+    if (indent == null) return new _JsonStringifier._(sink, toEncodable);
+    return new _JsonStringifierPretty(sink, toEncodable, indent);
+  }
+
+  _JsonStringifier._(this._sink, this._toEncodable)
       : this._seen = new List();
 
-  static String stringify(object, toEncodable(object)) {
+  static String stringify(object, toEncodable(object), String indent) {
     if (toEncodable == null) toEncodable = _defaultToEncodable;
     StringBuffer output = new StringBuffer();
-    printOn(object, output, toEncodable);
+    printOn(object, output, toEncodable, indent);
     return output.toString();
   }
 
-  static void printOn(object, StringSink output, toEncodable(object)) {
-    _JsonStringifier stringifier = new _JsonStringifier(output, toEncodable);
-    stringifier.stringifyValue(object);
+  static void printOn(object, StringSink output, toEncodable(object),
+      String indent) {
+    new _JsonStringifier(output, toEncodable, indent).stringifyValue(object);
   }
 
   static String numberToString(num x) {
@@ -515,3 +556,79 @@
     _seen.removeLast();
   }
 }
+
+/**
+ * A subclass of [_JsonStringifier] which indents the contents of [List] and
+ * [Map] objects using the specified indent value.
+ */
+class _JsonStringifierPretty extends _JsonStringifier {
+  final String _indent;
+
+  int _indentLevel = 0;
+
+  _JsonStringifierPretty(_sink, _toEncodable, this._indent)
+      : super._(_sink, _toEncodable);
+
+  void _write([String value = '']) {
+    _sink.write(_indent * _indentLevel);
+    _sink.write(value);
+  }
+
+  /**
+   * Serializes a [num], [String], [bool], [Null], [List] or [Map] value.
+   *
+   * Returns true if the value is one of these types, and false if not.
+   * If a value is both a [List] and a [Map], it's serialized as a [List].
+   */
+  bool stringifyJsonValue(final object) {
+    if (object is List) {
+      checkCycle(object);
+      List a = object;
+      if (a.isEmpty) {
+        _sink.write('[]');
+      } else {
+        _sink.writeln('[');
+        _indentLevel++;
+        _write();
+        stringifyValue(a[0]);
+        for (int i = 1; i < a.length; i++) {
+          _sink.writeln(',');
+          _write();
+          stringifyValue(a[i]);
+        }
+        _sink.writeln();
+        _indentLevel--;
+        _write(']');
+      }
+      _seen.remove(object);
+      return true;
+    } else if (object is Map) {
+      checkCycle(object);
+      Map<String, Object> m = object;
+      if (m.isEmpty) {
+        _sink.write('{}');
+      } else {
+        _sink.write('{');
+        _sink.writeln();
+        _indentLevel++;
+        bool first = true;
+        m.forEach((String key, Object value) {
+          if (!first) {
+            _sink.writeln(',');
+          }
+          _write('"');
+          escape(key);
+          _sink.write('": ');
+          stringifyValue(value);
+          first = false;
+        });
+        _sink.writeln();
+        _indentLevel--;
+        _write('}');
+      }
+      _seen.remove(object);
+      return true;
+    }
+    return super.stringifyJsonValue(object);
+  }
+}
diff --git a/sdk/lib/core/string.dart b/sdk/lib/core/string.dart
index 5488a2f..1de01c6 100644
--- a/sdk/lib/core/string.dart
+++ b/sdk/lib/core/string.dart
@@ -116,13 +116,9 @@
    * the code units form a surrogate pair. See documentation for
    * [fromCharCodes].
    *
-   * Creating a String with half of a surrogate pair is legal but generally
-   * discouraged.
+   * Creating a String with half of a surrogate pair is allowed.
    */
-  factory String.fromCharCode(int charCode) {
-    List<int> charCodes = new List<int>.filled(1, charCode);
-    return new String.fromCharCodes(charCodes);
-  }
+  external factory String.fromCharCode(int charCode);
 
   /**
    * Returns the string value of the environment declaration [name].
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 654e26f..1bc1d73 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -6298,7 +6298,9 @@
 
   @DomName('HTMLDataListElement.options')
   @DocsEditable()
-  final HtmlCollection options;
+  @Returns('HtmlCollection')
+  @Creates('HtmlCollection')
+  final List<Node> options;
 }
 // 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
@@ -7314,7 +7316,9 @@
 
   @DomName('Document.getElementsByClassName')
   @DocsEditable()
-  HtmlCollection getElementsByClassName(String classNames) native;
+  @Creates('NodeList|HtmlCollection')
+  @Returns('NodeList|HtmlCollection')
+  List<Node> getElementsByClassName(String classNames) native;
 
   @DomName('Document.getElementsByName')
   @DocsEditable()
@@ -7324,7 +7328,9 @@
 
   @DomName('Document.getElementsByTagName')
   @DocsEditable()
-  HtmlCollection getElementsByTagName(String localName) native;
+  @Creates('NodeList|HtmlCollection')
+  @Returns('NodeList|HtmlCollection')
+  List<Node> getElementsByTagName(String localName) native;
 
   @DomName('Document.importNode')
   @DocsEditable()
@@ -7406,7 +7412,9 @@
   @JSName('children')
   @DomName('Document.children')
   @DocsEditable()
-  final HtmlCollection _children;
+  @Returns('HtmlCollection')
+  @Creates('HtmlCollection')
+  final List<Node> _children;
 
   @JSName('firstElementChild')
   @DomName('Document.firstElementChild')
@@ -8313,8 +8321,7 @@
   }
 
   void clear() {
-    // It is unclear if we want to keep non element nodes?
-    _element.text = '';
+    _element._clearChildren();
   }
 
   Element removeAt(int index) {
@@ -11120,12 +11127,16 @@
    */
   @DomName('Element.getElementsByClassName')
   @DocsEditable()
-  HtmlCollection getElementsByClassName(String classNames) native;
+  @Creates('NodeList|HtmlCollection')
+  @Returns('NodeList|HtmlCollection')
+  List<Node> getElementsByClassName(String classNames) native;
 
   @JSName('getElementsByTagName')
   @DomName('Element.getElementsByTagName')
   @DocsEditable()
-  HtmlCollection _getElementsByTagName(String name) native;
+  @Creates('NodeList|HtmlCollection')
+  @Returns('NodeList|HtmlCollection')
+  List<Node> _getElementsByTagName(String name) native;
 
   @JSName('hasAttribute')
   @DomName('Element.hasAttribute')
@@ -11279,7 +11290,9 @@
   @JSName('children')
   @DomName('Element.children')
   @DocsEditable()
-  final HtmlCollection _children;
+  @Returns('HtmlCollection')
+  @Creates('HtmlCollection')
+  final List<Node> _children;
 
   @JSName('firstElementChild')
   @DomName('Element.firstElementChild')
@@ -12391,7 +12404,9 @@
 
   @DomName('HTMLFieldSetElement.elements')
   @DocsEditable()
-  final HtmlCollection elements;
+  @Returns('HtmlCollection')
+  @Creates('HtmlCollection')
+  final List<Node> elements;
 
   @DomName('HTMLFieldSetElement.form')
   @DocsEditable()
@@ -16396,6 +16411,40 @@
 
 
 @DocsEditable()
+@DomName('InstallEvent')
+@Experimental() // untriaged
+class InstallEvent extends InstallPhaseEvent native "InstallEvent" {
+  // To suppress missing implicit constructor warnings.
+  factory InstallEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('InstallEvent.replace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void replace() native;
+}
+// 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.
+
+
+@DocsEditable()
+@DomName('InstallPhaseEvent')
+@Experimental() // untriaged
+class InstallPhaseEvent extends Event native "InstallPhaseEvent" {
+  // To suppress missing implicit constructor warnings.
+  factory InstallPhaseEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('InstallPhaseEvent.waitUntil')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void waitUntil(Object value) native;
+}
+// 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.
+
+
+@DocsEditable()
 @DomName('KeyPair')
 @Experimental() // untriaged
 class KeyPair extends Interceptor native "KeyPair" {
@@ -16904,7 +16953,9 @@
 
   @DomName('HTMLMapElement.areas')
   @DocsEditable()
-  final HtmlCollection areas;
+  @Returns('HtmlCollection')
+  @Creates('HtmlCollection')
+  final List<Node> areas;
 
   @DomName('HTMLMapElement.name')
   @DocsEditable()
@@ -19667,7 +19718,7 @@
   }
 
   void clear() {
-    _this.text = '';
+    _this._clearChildren();
   }
 
   void operator []=(int index, Node value) {
@@ -19789,6 +19840,12 @@
     }
   }
 
+  void _clearChildren() {
+    while (firstChild != null) {
+      _removeChild(firstChild);
+    }
+  }
+
   /**
    * Print out a String representation of this Node.
    */
@@ -20861,7 +20918,7 @@
 
   final int _childElementCount;
 
-  final HtmlCollection _children;
+  final List<Node> _children;
 
   final Element _firstElementChild;
 
@@ -23272,11 +23329,15 @@
 
   @DomName('ShadowRoot.getElementsByClassName')
   @DocsEditable()
-  HtmlCollection getElementsByClassName(String className) native;
+  @Creates('NodeList|HtmlCollection')
+  @Returns('NodeList|HtmlCollection')
+  List<Node> getElementsByClassName(String className) native;
 
   @DomName('ShadowRoot.getElementsByTagName')
   @DocsEditable()
-  HtmlCollection getElementsByTagName(String tagName) native;
+  @Creates('NodeList|HtmlCollection')
+  @Returns('NodeList|HtmlCollection')
+  List<Node> getElementsByTagName(String tagName) native;
 
   @DomName('ShadowRoot.getSelection')
   @DocsEditable()
@@ -24830,12 +24891,16 @@
   @JSName('rows')
   @DomName('HTMLTableElement.rows')
   @DocsEditable()
-  final HtmlCollection _rows;
+  @Returns('HtmlCollection')
+  @Creates('HtmlCollection')
+  final List<Node> _rows;
 
   @JSName('tBodies')
   @DomName('HTMLTableElement.tBodies')
   @DocsEditable()
-  final HtmlCollection _tBodies;
+  @Returns('HtmlCollection')
+  @Creates('HtmlCollection')
+  final List<Node> _tBodies;
 
   @DomName('HTMLTableElement.tFoot')
   @DocsEditable()
@@ -24931,7 +24996,9 @@
   @JSName('cells')
   @DomName('HTMLTableRowElement.cells')
   @DocsEditable()
-  final HtmlCollection _cells;
+  @Returns('HtmlCollection')
+  @Creates('HtmlCollection')
+  final List<Node> _cells;
 
   @DomName('HTMLTableRowElement.rowIndex')
   @DocsEditable()
@@ -24995,7 +25062,9 @@
   @JSName('rows')
   @DomName('HTMLTableSectionElement.rows')
   @DocsEditable()
-  final HtmlCollection _rows;
+  @Returns('HtmlCollection')
+  @Creates('HtmlCollection')
+  final List<Node> _rows;
 
   @DomName('HTMLTableSectionElement.deleteRow')
   @DocsEditable()
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index d259672..1a2f68a 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -6761,7 +6761,7 @@
 
   @DomName('HTMLDataListElement.options')
   @DocsEditable()
-  HtmlCollection get options native "HTMLDataListElement_options_Getter";
+  List<Node> get options native "HTMLDataListElement_options_Getter";
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7777,7 +7777,7 @@
 
   @DomName('Document.getElementsByClassName')
   @DocsEditable()
-  HtmlCollection getElementsByClassName(String classNames) native "Document_getElementsByClassName_Callback";
+  List<Node> getElementsByClassName(String classNames) native "Document_getElementsByClassName_Callback";
 
   @DomName('Document.getElementsByName')
   @DocsEditable()
@@ -7785,7 +7785,7 @@
 
   @DomName('Document.getElementsByTagName')
   @DocsEditable()
-  HtmlCollection getElementsByTagName(String localName) native "Document_getElementsByTagName_Callback";
+  List<Node> getElementsByTagName(String localName) native "Document_getElementsByTagName_Callback";
 
   Node importNode(Node node, [bool deep]) {
     if (deep != null) {
@@ -7865,7 +7865,7 @@
 
   @DomName('Document.children')
   @DocsEditable()
-  HtmlCollection get _children native "Document_children_Getter";
+  List<Node> get _children native "Document_children_Getter";
 
   @DomName('Document.firstElementChild')
   @DocsEditable()
@@ -8818,8 +8818,7 @@
   }
 
   void clear() {
-    // It is unclear if we want to keep non element nodes?
-    _element.text = '';
+    _element._clearChildren();
   }
 
   Element removeAt(int index) {
@@ -11375,11 +11374,11 @@
    */
   @DomName('Element.getElementsByClassName')
   @DocsEditable()
-  HtmlCollection getElementsByClassName(String classNames) native "Element_getElementsByClassName_Callback";
+  List<Node> getElementsByClassName(String classNames) native "Element_getElementsByClassName_Callback";
 
   @DomName('Element.getElementsByTagName')
   @DocsEditable()
-  HtmlCollection _getElementsByTagName(String name) native "Element_getElementsByTagName_Callback";
+  List<Node> _getElementsByTagName(String name) native "Element_getElementsByTagName_Callback";
 
   @DomName('Element.hasAttribute')
   @DocsEditable()
@@ -11556,7 +11555,7 @@
 
   @DomName('Element.children')
   @DocsEditable()
-  HtmlCollection get _children native "Element_children_Getter";
+  List<Node> get _children native "Element_children_Getter";
 
   @DomName('Element.firstElementChild')
   @DocsEditable()
@@ -12679,7 +12678,7 @@
 
   @DomName('HTMLFieldSetElement.elements')
   @DocsEditable()
-  HtmlCollection get elements native "HTMLFieldSetElement_elements_Getter";
+  List<Node> get elements native "HTMLFieldSetElement_elements_Getter";
 
   @DomName('HTMLFieldSetElement.form')
   @DocsEditable()
@@ -17768,6 +17767,46 @@
 
 
 @DocsEditable()
+@DomName('InstallEvent')
+@Experimental() // untriaged
+class InstallEvent extends InstallPhaseEvent {
+  // To suppress missing implicit constructor warnings.
+  factory InstallEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('InstallEvent.replace')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void replace() native "InstallEvent_replace_Callback";
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
+@DomName('InstallPhaseEvent')
+@Experimental() // untriaged
+class InstallPhaseEvent extends Event {
+  // To suppress missing implicit constructor warnings.
+  factory InstallPhaseEvent._() { throw new UnsupportedError("Not supported"); }
+
+  @DomName('InstallPhaseEvent.waitUntil')
+  @DocsEditable()
+  @Experimental() // untriaged
+  void waitUntil(Object value) native "InstallPhaseEvent_waitUntil_Callback";
+
+}
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('KeyPair')
 @Experimental() // untriaged
 class KeyPair extends NativeFieldWrapperClass2 {
@@ -18339,7 +18378,7 @@
 
   @DomName('HTMLMapElement.areas')
   @DocsEditable()
-  HtmlCollection get areas native "HTMLMapElement_areas_Getter";
+  List<Node> get areas native "HTMLMapElement_areas_Getter";
 
   @DomName('HTMLMapElement.name')
   @DocsEditable()
@@ -21407,7 +21446,7 @@
   }
 
   void clear() {
-    _this.text = '';
+    _this._clearChildren();
   }
 
   void operator []=(int index, Node value) {
@@ -21529,6 +21568,12 @@
     }
   }
 
+  void _clearChildren() {
+    while (firstChild != null) {
+      _removeChild(firstChild);
+    }
+  }
+
   /**
    * Print out a String representation of this Node.
    */
@@ -22725,7 +22770,7 @@
   @DomName('ParentNode.children')
   @DocsEditable()
   @Experimental() // untriaged
-  HtmlCollection get _children native "ParentNode_children_Getter";
+  List<Node> get _children native "ParentNode_children_Getter";
 
   @DomName('ParentNode.firstElementChild')
   @DocsEditable()
@@ -25322,11 +25367,11 @@
 
   @DomName('ShadowRoot.getElementsByClassName')
   @DocsEditable()
-  HtmlCollection getElementsByClassName(String className) native "ShadowRoot_getElementsByClassName_Callback";
+  List<Node> getElementsByClassName(String className) native "ShadowRoot_getElementsByClassName_Callback";
 
   @DomName('ShadowRoot.getElementsByTagName')
   @DocsEditable()
-  HtmlCollection getElementsByTagName(String tagName) native "ShadowRoot_getElementsByTagName_Callback";
+  List<Node> getElementsByTagName(String tagName) native "ShadowRoot_getElementsByTagName_Callback";
 
   @DomName('ShadowRoot.getSelection')
   @DocsEditable()
@@ -27193,11 +27238,11 @@
 
   @DomName('HTMLTableElement.rows')
   @DocsEditable()
-  HtmlCollection get _rows native "HTMLTableElement_rows_Getter";
+  List<Node> get _rows native "HTMLTableElement_rows_Getter";
 
   @DomName('HTMLTableElement.tBodies')
   @DocsEditable()
-  HtmlCollection get _tBodies native "HTMLTableElement_tBodies_Getter";
+  List<Node> get _tBodies native "HTMLTableElement_tBodies_Getter";
 
   @DomName('HTMLTableElement.tFoot')
   @DocsEditable()
@@ -27286,7 +27331,7 @@
 
   @DomName('HTMLTableRowElement.cells')
   @DocsEditable()
-  HtmlCollection get _cells native "HTMLTableRowElement_cells_Getter";
+  List<Node> get _cells native "HTMLTableRowElement_cells_Getter";
 
   @DomName('HTMLTableRowElement.rowIndex')
   @DocsEditable()
@@ -27335,7 +27380,7 @@
 
   @DomName('HTMLTableSectionElement.rows')
   @DocsEditable()
-  HtmlCollection get _rows native "HTMLTableSectionElement_rows_Getter";
+  List<Node> get _rows native "HTMLTableSectionElement_rows_Getter";
 
   @DomName('HTMLTableSectionElement.deleteRow')
   @DocsEditable()
diff --git a/sdk/lib/io/bytes_builder.dart b/sdk/lib/io/bytes_builder.dart
index e26ae89..610c50a 100644
--- a/sdk/lib/io/bytes_builder.dart
+++ b/sdk/lib/io/bytes_builder.dart
@@ -8,20 +8,24 @@
  * Builds a list of bytes, allowing bytes and lists of bytes to be added at the
  * end.
  *
- * Used to efficiently collect bytes and lists of bytes, using an internal
- * buffer. Note that it's optimized for IO, using an initial buffer of 1K bytes.
+ * Used to efficiently collect bytes and lists of bytes.
  */
-class BytesBuilder {
-  // Start with 1024 bytes.
-  static const int _INIT_SIZE = 1024;
-
-  int _length = 0;
-  Uint8List _buffer;
-
+abstract class BytesBuilder {
   /**
    * Construct a new empty [BytesBuilder].
+   *
+   * If [copy] is true, the data is always copied when added to the list. If
+   * it [copy] is false, the data is only copied if needed. That means that if
+   * the lists are changed after added to the [BytesBuilder], it may effect the
+   * output. Default is `true`.
    */
-  BytesBuilder();
+  factory BytesBuilder({bool copy: true}) {
+    if (copy) {
+      return new _CopyingBytesBuilder();
+    } else {
+      return new _BytesBuilder();
+    }
+  }
 
   /**
    * Appends [bytes] to the current contents of the builder.
@@ -29,6 +33,59 @@
    * Each value of [bytes] will be bit-representation truncated to the range
    * 0 .. 255.
    */
+  void add(List<int> bytes);
+
+  /**
+   * Append [byte] to the current contents of the builder.
+   *
+   * The [byte] will be bit-representation truncated to the range 0 .. 255.
+   */
+  void addByte(int byte);
+
+  /**
+   * Returns the contents of `this` and clears `this`.
+   *
+   * The list returned is a view of the the internal buffer, limited to the
+   * [length].
+   */
+  List<int> takeBytes();
+
+  /**
+   * Returns a copy of the current contents of the builder.
+   *
+   * Leaves the contents of the builder intact.
+   */
+  List<int> toBytes();
+
+  /**
+   * The number of bytes in the builder.
+   */
+  int get length;
+
+  /**
+   * Returns `true` if the buffer is empty.
+   */
+  bool get isEmpty;
+
+  /**
+   * Returns `true` if the buffer is not empty.
+   */
+  bool get isNotEmpty;
+
+  /**
+   * Clear the contents of the builder.
+   */
+  void clear();
+}
+
+
+class _CopyingBytesBuilder implements BytesBuilder {
+  // Start with 1024 bytes.
+  static const int _INIT_SIZE = 1024;
+
+  int _length = 0;
+  Uint8List _buffer;
+
   void add(List<int> bytes) {
     int bytesLength = bytes.length;
     if (bytesLength == 0) return;
@@ -56,19 +113,8 @@
     _length = required;
   }
 
-  /**
-   * Append [byte] to the current contents of the builder.
-   *
-   * The [byte] will be bit-representation truncated to the range 0 .. 255.
-   */
   void addByte(int byte) => add([byte]);
 
-  /**
-   * Returns the contents of `this` and clears `this`.
-   *
-   * The list returned is a view of the the internal buffer, limited to the
-   * [length].
-   */
   List<int> takeBytes() {
     if (_buffer == null) return new Uint8List(0);
     var buffer = new Uint8List.view(_buffer.buffer, 0, _length);
@@ -76,35 +122,18 @@
     return buffer;
   }
 
-  /**
-   * Returns a copy of the current contents of the builder.
-   *
-   * Leaves the contents of the builder intact.
-   */
   List<int> toBytes() {
     if (_buffer == null) return new Uint8List(0);
     return new Uint8List.fromList(
         new Uint8List.view(_buffer.buffer, 0, _length));
   }
 
-  /**
-   * The number of bytes in the builder.
-   */
   int get length => _length;
 
-  /**
-   * Returns `true` if the buffer is empty.
-   */
   bool get isEmpty => _length == 0;
 
-  /**
-   * Returns `true` if the buffer is not empty.
-   */
   bool get isNotEmpty => _length != 0;
 
-  /**
-   * Clear the contents of the builder.
-   */
   void clear() {
     _length = 0;
     _buffer = null;
@@ -120,3 +149,58 @@
     return x + 1;
   }
 }
+
+
+class _BytesBuilder implements BytesBuilder {
+  int _length = 0;
+  final List _chunks = [];
+
+  void add(List<int> bytes) {
+    if (bytes is! Uint8List) {
+      bytes = new Uint8List.fromList(bytes);
+    }
+    _chunks.add(bytes);
+    _length += bytes.length;
+  }
+
+  void addByte(int byte) => add([byte]);
+
+  List<int> takeBytes() {
+    if (_chunks.length == 0) return new Uint8List(0);
+    if (_chunks.length == 1) {
+      var buffer = _chunks.single;
+      clear();
+      return buffer;
+    }
+    var buffer = new Uint8List(_length);
+    int offset = 0;
+    for (var chunk in _chunks) {
+      buffer.setRange(offset, offset + chunk.length, chunk);
+      offset += chunk.length;
+    }
+    clear();
+    return buffer;
+  }
+
+  List<int> toBytes() {
+    if (_chunks.length == 0) return new Uint8List(0);
+    var buffer = new Uint8List(_length);
+    int offset = 0;
+    for (var chunk in _chunks) {
+      buffer.setRange(offset, offset + chunk.length, chunk);
+      offset += chunk.length;
+    }
+    return buffer;
+  }
+
+  int get length => _length;
+
+  bool get isEmpty => _length == 0;
+
+  bool get isNotEmpty => _length != 0;
+
+  void clear() {
+    _length = 0;
+    _chunks.clear();
+  }
+}
diff --git a/sdk/lib/io/data_transformer.dart b/sdk/lib/io/data_transformer.dart
index a745460..eff2757 100644
--- a/sdk/lib/io/data_transformer.dart
+++ b/sdk/lib/io/data_transformer.dart
@@ -434,7 +434,7 @@
 
 
 class _BufferSink extends ByteConversionSink {
-  final BytesBuilder builder = new BytesBuilder();
+  final BytesBuilder builder = new BytesBuilder(copy: false);
 
   void add(List<int> chunk) {
     builder.add(chunk);
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index 71e3ffe..05c33f6 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -20,28 +20,25 @@
   final Completer _closeCompleter = new Completer();
 
   // Has the stream been paused or unsubscribed?
-  bool _paused = false;
   bool _unsubscribed = false;
 
   // Is there a read currently in progress?
-  bool _readInProgress = false;
+  bool _readInProgress = true;
   bool _closed = false;
 
-  // Block read but not yet send because stream is paused.
-  List<int> _currentBlock;
+  bool _atEnd = false;
 
   _FileStream(this._path, this._position, this._end) {
-    _setupController();
+    if (_position == null) _position = 0;
   }
 
-  _FileStream.forStdin() : _position = 0 {
-    _setupController();
-  }
+  _FileStream.forStdin() : _position = 0;
 
   StreamSubscription<List<int>> listen(void onData(List<int> event),
                                        {Function onError,
                                         void onDone(),
                                         bool cancelOnError}) {
+    _setupController();
     return _controller.stream.listen(onData,
                                      onError: onError,
                                      onDone: onDone,
@@ -51,8 +48,7 @@
   void _setupController() {
     _controller = new StreamController<List<int>>(sync: true,
         onListen: _start,
-        onPause: () => _paused = true,
-        onResume: _resume,
+        onResume: _readBlock,
         onCancel: () {
           _unsubscribed = true;
           return _closeFile();
@@ -64,24 +60,25 @@
       return _closeCompleter.future;
     }
     _closed = true;
+
     void done() {
       _closeCompleter.complete();
       _controller.close();
     }
-    if (_openedFile != null) {
-      _openedFile.close()
-          .catchError(_controller.addError)
-          .whenComplete(done);
-      _openedFile = null;
-    } else {
-      done();
-    }
+
+    _openedFile.close()
+        .catchError(_controller.addError)
+        .whenComplete(done);
     return _closeCompleter.future;
   }
 
   void _readBlock() {
     // Don't start a new read if one is already in progress.
     if (_readInProgress) return;
+    if (_atEnd) {
+      _closeFile();
+      return;
+    }
     _readInProgress = true;
     int readBytes = _BLOCK_SIZE;
     if (_end != null) {
@@ -97,32 +94,28 @@
       }
     }
     _openedFile.read(readBytes)
-      .whenComplete(() {
-        _readInProgress = false;
-      })
       .then((block) {
+        _readInProgress = false;
         if (_unsubscribed) {
           _closeFile();
           return;
         }
-        if (block.length == 0) {
-          if (!_unsubscribed) {
-            _closeFile();
-            _unsubscribed = true;
-          }
-          return;
-        }
         _position += block.length;
-        if (_paused) {
-          _currentBlock = block;
-        } else {
-          _controller.add(block);
+        if (block.length < readBytes ||
+            (_end != null && _position == _end)) {
+          _atEnd = true;
+        }
+        if (!_atEnd && !_controller.isPaused) {
           _readBlock();
         }
+        _controller.add(block);
+        if (_atEnd) {
+          _closeFile();
+        }
       })
-      .catchError((e) {
+      .catchError((e, s) {
         if (!_unsubscribed) {
-          _controller.addError(e);
+          _controller.addError(e, s);
           _closeFile();
           _unsubscribed = true;
         }
@@ -130,61 +123,63 @@
   }
 
   void _start() {
-    if (_position == null) {
-      _position = 0;
-    } else if (_position < 0) {
+    if (_position < 0) {
       _controller.addError(new RangeError("Bad start position: $_position"));
       _controller.close();
       return;
     }
-    Future<RandomAccessFile> openFuture;
-    if (_path != null) {
-      openFuture = new File(_path).open(mode: FileMode.READ);
-    } else {
-      openFuture = new Future.value(_File._openStdioSync(0));
-    }
-    _readInProgress = true;
-    openFuture
-      .then((RandomAccessFile opened) {
-        _openedFile = opened;
-        if (_position > 0) {
-          return opened.setPosition(_position);
-        }
-      })
-      .whenComplete(() {
-        _readInProgress = false;
-      })
-      .then((_) => _readBlock())
-      .catchError((e) {
-        _controller.addError(e);
-        _closeFile();
-      });
-  }
 
-  void _resume() {
-    _paused = false;
-    if (_currentBlock != null) {
-      _controller.add(_currentBlock);
-      _currentBlock = null;
+    void onReady(RandomAccessFile file) {
+      _openedFile = file;
+      _readInProgress = false;
+      _readBlock();
     }
-    // Resume reading unless we are already done.
-    if (_openedFile != null) _readBlock();
+
+    void onOpenFile(RandomAccessFile file) {
+      if (_position > 0) {
+        file.setPosition(_position)
+            .then(onReady, onError: (e, s) {
+              _controller.addError(e, s);
+              _readInProgress = false;
+              _closeFile();
+            });
+      } else {
+        onReady(file);
+      }
+    }
+
+    void openFailed(error, stackTrace) {
+      _controller.addError(error, stackTrace);
+      _controller.close();
+      _closeCompleter.complete();
+    }
+
+    if (_path != null) {
+      new File(_path).open(mode: FileMode.READ)
+          .then(onOpenFile, onError: openFailed);
+    } else {
+      try {
+        onOpenFile(_File._openStdioSync(0));
+      } catch (e, s) {
+        openFailed(e, s);
+      }
+    }
   }
 }
 
 class _FileStreamConsumer extends StreamConsumer<List<int>> {
   File _file;
   Future<RandomAccessFile> _openFuture;
-  StreamSubscription _subscription;
 
   _FileStreamConsumer(File this._file, FileMode mode) {
     _openFuture = _file.open(mode: mode);
   }
 
   Future<File> addStream(Stream<List<int>> stream) {
-    Completer<File> completer = new Completer<File>();
+    Completer<File> completer = new Completer<File>.sync();
     _openFuture
       .then((openedFile) {
+        var _subscription;
         void error(e, [StackTrace stackTrace]) {
           _subscription.cancel();
           openedFile.close();
@@ -436,29 +431,51 @@
   }
 
   Future<List<int>> readAsBytes() {
-    Completer<List<int>> completer = new Completer<List<int>>();
-    var builder = new BytesBuilder();
-    openRead().listen(
-      (d) => builder.add(d),
-      onDone: () {
-        completer.complete(builder.takeBytes());
-      },
-      onError: (e, StackTrace stackTrace) {
-        completer.completeError(e, stackTrace);
-      },
-      cancelOnError: true);
-    return completer.future;
+    Future<List<int>> readDataChunked(file) {
+      var builder = new BytesBuilder(copy: false);
+      var completer = new Completer();
+      void read() {
+        file.read(_BLOCK_SIZE).then((data) {
+          if (data.length > 0) builder.add(data);
+          if (data.length == _BLOCK_SIZE) {
+            read();
+          } else {
+            completer.complete(builder.takeBytes());
+          }
+        }, onError: completer.completeError);
+      }
+      read();
+      return completer.future;
+    }
+
+    return open().then((file) {
+      return file.length().then((length) {
+        if (length == 0) {
+          // May be character device, try to read it in chunks.
+          return readDataChunked(file);
+        }
+        return file.read(length);
+      }).whenComplete(file.close);
+    });
   }
 
   List<int> readAsBytesSync() {
     var opened = openSync();
-    var builder = new BytesBuilder();
     var data;
-    while ((data = opened.readSync(_BLOCK_SIZE)).length > 0) {
-      builder.add(data);
+    var length = opened.lengthSync();
+    if (length == 0) {
+      // May be character device, try to read it in chunks.
+      var builder = new BytesBuilder(copy: false);
+      do {
+        data = opened.readSync(_BLOCK_SIZE);
+        if (data.length > 0) builder.add(data);
+      } while (data.length == _BLOCK_SIZE);
+      data = builder.takeBytes();
+    } else {
+      data = opened.readSync(length);
     }
     opened.closeSync();
-    return builder.takeBytes();
+    return data;
   }
 
   String _tryDecode(List<int> bytes, Encoding encoding) {
@@ -508,18 +525,14 @@
   Future<File> writeAsBytes(List<int> bytes,
                             {FileMode mode: FileMode.WRITE,
                              bool flush: false}) {
-    try {
-      IOSink sink = openWrite(mode: mode);
-      sink.add(bytes);
-      if (flush) {
-        sink.flush().then((_) => sink.close());
-      } else {
-        sink.close();
-      }
-      return sink.done.then((_) => this);
-    } catch (e) {
-      return new Future.error(e);
-    }
+    return open(mode: mode).then((file) {
+      return file.writeFrom(bytes, 0, bytes.length)
+          .then((_) {
+            if (flush) return file.flush().then((_) => this);
+            return this;
+          })
+          .whenComplete(file.close);
+    });
   }
 
   void writeAsBytesSync(List<int> bytes,
@@ -901,7 +914,8 @@
 
   void _checkAvailable() {
     if (_asyncDispatched) {
-      throw new FileSystemException("An async operation is currently pending", path);
+      throw new FileSystemException("An async operation is currently pending",
+                                    path);
     }
     if (closed) {
       throw new FileSystemException("File closed", path);
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index dee31ab..765f583 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -175,6 +175,7 @@
    */
   Duration idleTimeout;
 
+
   /**
    * Starts listening for HTTP requests on the specified [address] and
    * [port].
@@ -924,6 +925,8 @@
 
   /**
    * The request headers.
+   *
+   * The returned [HttpHeaders] are immutable.
    */
   HttpHeaders get headers;
 
@@ -1044,12 +1047,20 @@
    * the official HTTP status codes use the fields from
    * [HttpStatus]. If no status code is explicitly set the default
    * value [HttpStatus.OK] is used.
+   *
+   * The status code must be set before the body is written
+   * to. Setting the status code after writing to the response body or
+   * closing the response will throw a `StateError`.
    */
   int statusCode;
 
   /**
    * Gets and sets the reason phrase. If no reason phrase is explicitly
    * set a default reason phrase is provided.
+   *
+   * The reason phrase must be set before the body is written
+   * to. Setting the reason phrase after writing to the response body
+   * or closing the response will throw a `StateError`.
    */
   String reasonPhrase;
 
@@ -1073,7 +1084,20 @@
   Duration deadline;
 
   /**
+   * Get or set if the [HttpResponse] should buffer output.
+   *
+   * Default value is `true`.
+   *
+   * __Note__: Disabling buffering of the output can result in very poor
+   * performance, when writing many small chunks.
+   */
+  bool bufferOutput;
+
+  /**
    * Returns the response headers.
+   *
+   * The response headers can be modified until the response body is
+   * written to or closed. After that they become immutable.
    */
   HttpHeaders get headers;
 
@@ -1551,7 +1575,21 @@
   int contentLength;
 
   /**
-   * Returns the request headers.
+   * Get or set if the [HttpClientRequest] should buffer output.
+   *
+   * Default value is `true`.
+   *
+   * __Note__: Disabling buffering of the output can result in very poor
+   * performance, when writing many small chunks.
+   */
+  bool bufferOutput;
+
+  /**
+   * Returns the client request headers.
+   *
+   * The client request headers can be modified until the client
+   * request body is written to or closed. After that they become
+   * immutable.
    */
   HttpHeaders get headers;
 
@@ -1588,7 +1626,7 @@
  * the data and be notified when the entire body is received.
  *
  *     new HttpClient().get('localhost', 80, '/file.txt')
- *          .then((HttpClientRequeset request) => request.close())
+ *          .then((HttpClientRequest request) => request.close())
  *          .then((HttpClientResponse response) {
  *            response.transform(UTF8.decoder).listen((contents) {
  *              // handle data
@@ -1598,22 +1636,38 @@
 abstract class HttpClientResponse implements Stream<List<int>> {
   /**
    * Returns the status code.
+   *
+   * The status code must be set before the body is written
+   * to. Setting the status code after writing to the body will throw
+   * a `StateError`.
    */
   int get statusCode;
 
   /**
    * Returns the reason phrase associated with the status code.
+   *
+   * The reason phrase must be set before the body is written
+   * to. Setting the reason phrase after writing to the body will throw
+   * a `StateError`.
    */
   String get reasonPhrase;
 
   /**
    * Returns the content length of the response body. Returns -1 if the size of
    * the response body is not known in advance.
+   *
+   * If the content length needs to be set, it must be set before the
+   * body is written to. Setting the reason phrase after writing to
+   * the body will throw a `StateError`.
    */
   int get contentLength;
 
   /**
    * Gets the persistent connection state returned by the server.
+   *
+   * if the persistent connection state needs to be set, it must be
+   * set before the body is written to. Setting the reason phrase
+   * after writing to the body will throw a `StateError`.
    */
   bool get persistentConnection;
 
@@ -1654,7 +1708,9 @@
 
 
   /**
-   * Returns the response headers.
+   * Returns the client response headers.
+   *
+   * The client response headers are immutable.
    */
   HttpHeaders get headers;
 
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index 207c08d..5d13f54 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -310,7 +310,8 @@
     }
 
     _Credentials findCredentials(_AuthenticationScheme scheme) {
-      return proxyAuth ? _httpClient._findProxyCredentials(_httpRequest._proxy, scheme)
+      return proxyAuth ? _httpClient._findProxyCredentials(_httpRequest._proxy,
+                                                           scheme)
                        : _httpClient._findCredentials(_httpRequest.uri, scheme);
     }
 
@@ -411,6 +412,8 @@
   // requests and in error handling.
   bool _encodingSet = false;
 
+  bool _bufferOutput = true;
+
   final Uri _uri;
   final _HttpOutgoing _outgoing;
 
@@ -441,6 +444,13 @@
     headers.persistentConnection = p;
   }
 
+  bool get bufferOutput => _bufferOutput;
+  void set bufferOutput(bool bufferOutput) {
+    if (_outgoing.headersWritten) throw new StateError("Header already sent");
+    _bufferOutput = bufferOutput;
+  }
+
+
   Encoding get encoding {
     if (_encodingSet && _outgoing.headersWritten) {
       return _encoding;
@@ -468,6 +478,8 @@
   }
 
   void _writeHeader();
+
+  bool get _isConnectionClosed => false;
 }
 
 
@@ -488,6 +500,8 @@
     if (serverHeader != null) headers._add('server', serverHeader);
   }
 
+  bool get _isConnectionClosed => _httpRequest._httpConnection._isClosing;
+
   List<Cookie> get cookies {
     if (_cookies == null) _cookies = new List<Cookie>();
     return _cookies;
@@ -538,8 +552,7 @@
 
     if (_deadline == null) return;
     _deadlineTimer = new Timer(_deadline, () {
-      _outgoing._socketError = true;
-      _outgoing.socket.destroy();
+      _httpRequest._httpConnection.destroy();
     });
   }
 
@@ -919,7 +932,7 @@
     bool gzip = false;
     if (isServerSide) {
       var response = outbound;
-      if (outbound.headers.chunkedTransferEncoding) {
+      if (outbound.bufferOutput && outbound.headers.chunkedTransferEncoding) {
         List acceptEncodings =
             response._httpRequest.headers[HttpHeaders.ACCEPT_ENCODING];
         List contentEncoding = outbound.headers[HttpHeaders.CONTENT_ENCODING];
@@ -1043,6 +1056,7 @@
     // If we earlier saw an error, return immediate. The notification to
     // _Http*Connection is already done.
     if (_socketError) return new Future.value(outbound);
+    if (outbound._isConnectionClosed) return new Future.value(outbound);
     if (!headersWritten && !ignoreBody) {
       if (outbound.headers.contentLength == -1) {
         // If no body was written, ignoreBody is false (it's not a HEAD
@@ -1149,6 +1163,10 @@
        outbound is HttpResponse;
 
   void _addGZipChunk(chunk, void add(List<int> data)) {
+    if (!outbound.bufferOutput) {
+      add(chunk);
+      return;
+    }
     if (chunk.length > _gzipBuffer.length - _gzipBufferLength) {
       add(new Uint8List.view(
           _gzipBuffer.buffer, 0, _gzipBufferLength));
@@ -1166,6 +1184,17 @@
   }
 
   void _addChunk(chunk, void add(List<int> data)) {
+    if (!outbound.bufferOutput) {
+      if (_buffer != null) {
+        // If _buffer is not null, we have not written the header yet. Write
+        // it now.
+        add(new Uint8List.view(_buffer.buffer, 0, _length));
+        _buffer = null;
+        _length = 0;
+      }
+      add(chunk);
+      return;
+    }
     if (chunk.length > _buffer.length - _length) {
       add(new Uint8List.view(_buffer.buffer, 0, _length));
       _buffer = new Uint8List(_OUTGOING_BUFFER_SIZE);
diff --git a/sdk/lib/io/websocket_impl.dart b/sdk/lib/io/websocket_impl.dart
index ee56378..3e01210 100644
--- a/sdk/lib/io/websocket_impl.dart
+++ b/sdk/lib/io/websocket_impl.dart
@@ -69,7 +69,7 @@
 
   final bool _serverSide;
   final List _maskingBytes = new List(4);
-  final List<Uint8List> _payloads = new List<Uint8List>();
+  final BytesBuilder _payload = new BytesBuilder(copy: false);
 
   _WebSocketProtocolTransformer([this._serverSide = false]);
 
@@ -90,27 +90,6 @@
 
   void close() => _eventSink.close();
 
-  Uint8List _takePayload() {
-    if (_payloads.length == 0) return new Uint8List(0);
-    if (_payloads.length == 1) {
-      Uint8List result = _payloads.single;
-      _payloads.clear();
-      return result;
-    }
-    int length = 0;
-    for (Uint8List payload in _payloads) {
-      length += payload.length;
-    }
-    Uint8List result = new Uint8List(length);
-    int offset = 0;
-    for (Uint8List payload in _payloads) {
-      result.setRange(offset, offset + payload.length, payload);
-      offset += payload.length;
-    }
-    _payloads.clear();
-    return result;
-  }
-
   /**
    * Process data received from the underlying communication channel.
    */
@@ -197,7 +176,7 @@
             _unmask(index, payloadLength, buffer);
           }
           // Control frame and data frame share _payloads.
-          _payloads.add(
+          _payload.add(
               new Uint8List.view(buffer.buffer, index, payloadLength));
           index += payloadLength;
           if (_isControlFrame()) {
@@ -307,10 +286,10 @@
     if (_fin) {
       switch (_currentMessageType) {
         case _WebSocketMessageType.TEXT:
-          _eventSink.add(UTF8.decode(_takePayload()));
+          _eventSink.add(UTF8.decode(_payload.takeBytes()));
           break;
         case _WebSocketMessageType.BINARY:
-          _eventSink.add(_takePayload());
+          _eventSink.add(_payload.takeBytes());
           break;
       }
       _currentMessageType = _WebSocketMessageType.NONE;
@@ -322,7 +301,7 @@
     switch (_opcode) {
       case _WebSocketOpcode.CLOSE:
         closeCode = WebSocketStatus.NO_STATUS_RECEIVED;
-        var payload = _takePayload();
+        var payload = _payload.takeBytes();
         if (payload.length > 0) {
           if (payload.length == 1) {
             throw new WebSocketException("Protocol error");
@@ -340,11 +319,11 @@
         break;
 
       case _WebSocketOpcode.PING:
-        _eventSink.add(new _WebSocketPing(_takePayload()));
+        _eventSink.add(new _WebSocketPing(_payload.takeBytes()));
         break;
 
       case _WebSocketOpcode.PONG:
-        _eventSink.add(new _WebSocketPong(_takePayload()));
+        _eventSink.add(new _WebSocketPong(_payload.takeBytes()));
         break;
     }
     _prepareForNextFrame();
diff --git a/sdk/lib/js/dart2js/js_dart2js.dart b/sdk/lib/js/dart2js/js_dart2js.dart
index cda541d..84ec8f3 100644
--- a/sdk/lib/js/dart2js/js_dart2js.dart
+++ b/sdk/lib/js/dart2js/js_dart2js.dart
@@ -370,12 +370,12 @@
     }
   }
 
-  _checkRange(int start, int end) {
-    if (start < 0 || start > this.length) {
-      throw new RangeError.range(start, 0, this.length);
+  static _checkRange(int start, int end, int length) {
+    if (start < 0 || start > length) {
+      throw new RangeError.range(start, 0, length);
     }
-    if (end < start || end > this.length) {
-      throw new RangeError.range(end, start, this.length);
+    if (end < start || end > length) {
+      throw new RangeError.range(end, start, length);
     }
   }
 
@@ -399,7 +399,15 @@
     super[index] = value;
   }
 
-  int get length => super['length'];
+  int get length {
+    // Check the length honours the List contract.
+    var len = JS('', '#.length', _jsObject);
+    // JavaScript arrays have lengths which are unsigned 32-bit integers.
+    if (JS('bool', 'typeof # === "number" && (# >>> 0) === #', len, len, len)) {
+      return JS('int', '#', len);
+    }
+    throw new StateError('Bad JsArray length');
+  }
 
   void set length(int length) { super['length'] = length; }
 
@@ -433,12 +441,12 @@
   }
 
   void removeRange(int start, int end) {
-    _checkRange(start, end);
+    _checkRange(start, end, length);
     callMethod('splice', [start, end - start]);
   }
 
   void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
-    _checkRange(start, end);
+    _checkRange(start, end, length);
     int length = end - start;
     if (length == 0) return;
     if (skipCount < 0) throw new ArgumentError(skipCount);
@@ -489,8 +497,9 @@
 dynamic _convertToJS(dynamic o) {
   if (o == null) {
     return null;
-  } else if (o is String || o is num || o is bool
-      || o is Blob || o is Event || o is KeyRange || o is ImageData
+  } else if (o is String || o is num || o is bool) {
+    return o;
+  } else if (o is Blob || o is Event || o is KeyRange || o is ImageData
       || o is Node || o is TypedData || o is Window) {
     return o;
   } else if (o is DateTime) {
diff --git a/sdk/lib/math/rectangle.dart b/sdk/lib/math/rectangle.dart
index 6c7bbb4..1ab292a 100644
--- a/sdk/lib/math/rectangle.dart
+++ b/sdk/lib/math/rectangle.dart
@@ -148,8 +148,8 @@
    * point `(left, top)`.
    */
   const Rectangle(this.left, this.top, T width, T height)
-      : this.width = (width >= 0) ? width : -width * 0,  // Inline _clampToZero.
-        this.height = (height >= 0) ? height : -height * 0;
+      : this.width = (width < 0) ? -width * 0 : width,  // Inline _clampToZero.
+        this.height = (height < 0) ?  -height * 0 : height;
 
   /**
    * Create a rectangle spanned by the points [a] and [b];
@@ -209,8 +209,8 @@
    * point `(left, top)`.
    */
   MutableRectangle(this.left, this.top, T width, T height)
-      : this._width = (width >= 0) ? width : _clampToZero(width),
-        this._height = (height >= 0) ? height : _clampToZero(height);
+      : this._width = (width < 0) ? _clampToZero(width) : width,
+        this._height = (height < 0) ? _clampToZero(height) : height;
 
   /**
    * Create a mutable rectangle spanned by the points [a] and [b];
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index 69077f0..4de5e85 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -361,17 +361,6 @@
   @DocsEditable()
   void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native;
 
-  @JSName('decodeAudioData')
-  @DomName('AudioContext.decodeAudioData')
-  @DocsEditable()
-  Future<AudioBuffer> decodeAudioData(ByteBuffer audioData) {
-    var completer = new Completer<AudioBuffer>();
-    _decodeAudioData(audioData,
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
-    return completer.future;
-  }
-
   @DomName('AudioContext.startRendering')
   @DocsEditable()
   void startRendering() native;
@@ -407,6 +396,20 @@
           bufferSize);
     }
   }
+  @DomName('AudioContext.decodeAudioData')
+  Future<AudioBuffer> decodeAudioData(ByteBuffer audioData) {
+    var completer = new Completer<AudioBuffer>();
+    _decodeAudioData(audioData,
+        (value) { completer.complete(value); },
+        (error) {
+          if (error == null) {
+            completer.completeError('');
+          } else {
+            completer.completeError(error);
+          }
+        });
+    return completer.future;
+  }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index 8e581b0..aa737b5 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -479,14 +479,6 @@
   @DocsEditable()
   void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native "AudioContext_decodeAudioData_Callback";
 
-  Future<AudioBuffer> decodeAudioData(ByteBuffer audioData) {
-    var completer = new Completer<AudioBuffer>();
-    _decodeAudioData(audioData,
-        (value) { completer.complete(value); },
-        (error) { completer.completeError(error); });
-    return completer.future;
-  }
-
   @DomName('AudioContext.startRendering')
   @DocsEditable()
   void startRendering() native "AudioContext_startRendering_Callback";
@@ -511,6 +503,20 @@
   @DocsEditable()
   Stream<Event> get onComplete => completeEvent.forTarget(this);
 
+  @DomName('AudioContext.decodeAudioData')
+  Future<AudioBuffer> decodeAudioData(ByteBuffer audioData) {
+    var completer = new Completer<AudioBuffer>();
+    _decodeAudioData(audioData,
+        (value) { completer.complete(value); },
+        (error) {
+          if (error == null) {
+            completer.completeError('');
+          } else {
+            completer.completeError(error);
+          }
+        });
+    return completer.future;
+  }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
diff --git a/site/try/build_try.gyp b/site/try/build_try.gyp
index 302b3d3..b62178e 100644
--- a/site/try/build_try.gyp
+++ b/site/try/build_try.gyp
@@ -3,14 +3,23 @@
 # BSD-style license that can be found in the LICENSE
 
 {
+  'variables' : {
+    'script_suffix%': '',
+  },
+  'conditions' : [
+    ['OS=="win"', {
+      'variables' : {
+        'script_suffix': '.bat',
+      },
+    }],
+  ],
   'targets': [
     {
       'target_name': 'try_site',
       'type': 'none',
       'dependencies': [
         '../../runtime/dart-runtime.gyp:dart',
-        # Concern: there should really be a dependency on
-        # ../../dart.gyp:create_sdk, but this is reported as a cycle by GYP.
+        '../../create_sdk.gyp:create_sdk_internal',
       ],
       'variables': {
         'try_dart_static_files': [
@@ -75,7 +84,7 @@
             '<(SHARED_INTERMEDIATE_DIR)/leap.dart.js',
           ],
           'action': [
-            '<(PRODUCT_DIR)/dart-sdk/bin/dart2js',
+            '<(PRODUCT_DIR)/dart-sdk/bin/dart2js<(script_suffix)',
             '-p../../sdk/lib/_internal/',
             '-Denable_ir=false',
             'src/leap.dart',
diff --git a/site/try/project_server.dart b/site/try/project_server.dart
new file mode 100644
index 0000000..d71d870
--- /dev/null
+++ b/site/try/project_server.dart
@@ -0,0 +1,460 @@
+// 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 trydart.projectServer;
+
+import 'dart:io';
+
+import 'dart:async' show
+    Future;
+
+import 'dart:convert' show
+    HtmlEscape,
+    JSON,
+    UTF8;
+
+class WatchHandler {
+  final WebSocket socket;
+
+  final Set<String> watchedFiles;
+
+  static final Set<WatchHandler> handlers = new Set<WatchHandler>();
+
+  static const Map<int, String> fsEventNames = const <int, String>{
+    FileSystemEvent.CREATE: 'create',
+    FileSystemEvent.DELETE: 'delete',
+    FileSystemEvent.MODIFY: 'modify',
+    FileSystemEvent.MOVE: 'move',
+  };
+
+  WatchHandler(this.socket, Iterable<String> watchedFiles)
+      : this.watchedFiles = watchedFiles.toSet();
+
+  handleFileSystemEvent(FileSystemEvent event) {
+    if (event.isDirectory) return;
+    String type = fsEventNames[event.type];
+    if (type == null) type = 'unknown';
+    String path = new Uri.file(event.path).pathSegments.last;
+    shouldIgnore(type, path).then((bool ignored) {
+      if (ignored) return;
+      socket.add(JSON.encode({type: [path]}));
+    });
+  }
+
+  Future<bool> shouldIgnore(String type, String path) {
+    switch (type) {
+      case 'create':
+        return new Future<bool>.value(!watchedFiles.contains(path));
+      case 'delete':
+        return Conversation.listProjectFiles().then((List<String> files) {
+          watchedFiles
+              ..retainAll(files)
+              ..addAll(files);
+          return watchedFiles.contains(path);
+        });
+      case 'modify':
+        return new Future<bool>.value(false);
+      default:
+        print('Unhandled fs-event for $path ($type).');
+        return new Future<bool>.value(true);
+    }
+  }
+
+  onData(_) {
+    // TODO(ahe): Move POST code here?
+  }
+
+  onDone() {
+    handlers.remove(this);
+  }
+
+  static handleWebSocket(WebSocket socket) {
+    Conversation.ensureProjectWatcher();
+    Conversation.listProjectFiles().then((List<String> files) {
+      socket.add(JSON.encode({'create': files}));
+      WatchHandler handler = new WatchHandler(socket, files);
+      handlers.add(handler);
+      socket.listen(
+          handler.onData, cancelOnError: true, onDone: handler.onDone);
+    });
+  }
+
+  static onFileSystemEvent(FileSystemEvent event) {
+    for (WatchHandler handler in handlers) {
+      handler.handleFileSystemEvent(event);
+    }
+  }
+}
+
+/// Represents a "project" command. These commands are accessed from the URL
+/// "/project?name".
+class ProjectCommand {
+  final String name;
+
+  /// For each query parameter, this map describes rules for validating them.
+  final Map<String, String> rules;
+
+  final Function handle;
+
+  const ProjectCommand(this.name, this.rules, this.handle);
+}
+
+class Conversation {
+  HttpRequest request;
+  HttpResponse response;
+
+  static const String PROJECT_PATH = '/project';
+
+  static const String PACKAGES_PATH = '/packages';
+
+  static const String CONTENT_TYPE = HttpHeaders.CONTENT_TYPE;
+
+  static const String GIT_TAG = 'try_dart_backup';
+
+  static const String COMMIT_MESSAGE = """
+Automated backup.
+
+It is safe to delete tag '$GIT_TAG' if you don't need the backup.""";
+
+  static Uri documentRoot = Uri.base;
+
+  static Uri projectRoot = Uri.base.resolve('site/try/src/');
+
+  static Uri packageRoot = Uri.base.resolve('sdk/lib/_internal/');
+
+  static const List<ProjectCommand> COMMANDS = const <ProjectCommand>[
+      const ProjectCommand('list', const {'list': null}, handleProjectList),
+  ];
+
+  static Stream<FileSystemEvent> projectChanges;
+
+  static final Map<String, String> gitEnv = computeGitEnv();
+
+  Conversation(this.request, this.response);
+
+  onClosed(_) {
+    if (response.statusCode == HttpStatus.OK) return;
+    print('Request for ${request.uri} ${response.statusCode}');
+  }
+
+  notFound(path) {
+    response.statusCode = HttpStatus.NOT_FOUND;
+    response.write(htmlInfo('Not Found',
+                            'The file "$path" could not be found.'));
+    response.close();
+  }
+
+  redirect(String location) {
+    response.statusCode = HttpStatus.FOUND;
+    response.headers.add(HttpHeaders.LOCATION, location);
+    response.close();
+  }
+
+  badRequest(String problem) {
+    response.statusCode = HttpStatus.BAD_REQUEST;
+    response.write(htmlInfo("Bad request",
+                            "Bad request '${request.uri}': $problem"));
+    response.close();
+  }
+
+  internalError(error, stack) {
+    print(error);
+    if (stack != null) print(stack);
+    response.statusCode = HttpStatus.INTERNAL_SERVER_ERROR;
+    response.write(htmlInfo("Internal Server Error",
+                            "Internal Server Error: $error\n$stack"));
+    response.close();
+  }
+
+  bool validate(Map<String, String> parameters, Map<String, String> rules) {
+    Iterable<String> problems = rules.keys
+        .where((name) => !parameters.containsKey(name))
+        .map((name) => "Missing parameter: '$name'.");
+    if (!problems.isEmpty) {
+      badRequest(problems.first);
+      return false;
+    }
+    Set extra = new Set.from(parameters.keys)..removeAll(rules.keys);
+    if (extra.isEmpty) return true;
+    String extraString = (extra.toList()..sort()).join("', '");
+    badRequest("Extra parameters: '$extraString'.");
+    return false;
+  }
+
+  static Future<List<String>> listProjectFiles() {
+    String nativeDir = projectRoot.toFilePath();
+    Directory dir = new Directory(nativeDir);
+    var future = dir.list(recursive: true, followLinks: false).toList();
+    return future.then((List<FileSystemEntity> entries) {
+      return entries
+          .map((e) => e.path)
+          .where((p) => p.endsWith('.dart') && p.startsWith(nativeDir))
+          .map((p) => p.substring(nativeDir.length))
+          .map((p) => new Uri.file(p).path).toList();
+    });
+  }
+
+  static handleProjectList(Conversation self) {
+    listProjectFiles().then((List<String> files) {
+      self.response
+          ..write(JSON.encode(files))
+          ..close();
+    });
+  }
+
+  handleProjectRequest() {
+    Map<String, String> parameters = request.uri.queryParameters;
+    for (ProjectCommand command in COMMANDS) {
+      if (parameters.containsKey(command.name)) {
+        if (validate(parameters, command.rules)) {
+          (command.handle)(this);
+        }
+        return;
+      }
+    }
+    String commands = COMMANDS.map((c) => c.name).join("', '");
+    badRequest("Valid commands are: '$commands'");
+  }
+
+  handleSocket() {
+    if (request.uri.path == '/ws/watch') {
+      WebSocketTransformer.upgrade(request).then(WatchHandler.handleWebSocket);
+    } else {
+      response.done
+          .then(onClosed)
+          .catchError(onError);
+      notFound(request.uri.path);
+    }
+  }
+
+  handle() {
+    response.done
+      .then(onClosed)
+      .catchError(onError);
+
+    Uri uri = request.uri;
+    if (uri.path == PROJECT_PATH) {
+      return handleProjectRequest();
+    }
+    if (uri.path.endsWith('/')) {
+      uri = uri.resolve('index.html');
+    }
+    if (uri.path == '/css/fonts/fontawesome-webfont.woff') {
+      uri = uri.resolve('/fontawesome-webfont.woff');
+    }
+    if (uri.path.contains('..') || uri.path.contains('%')) {
+      return notFound(uri.path);
+    }
+    String path = uri.path;
+    Uri root = documentRoot;
+    String dartType = 'application/dart';
+    if (path.startsWith('/project/packages/')) {
+      root = packageRoot;
+      path = path.substring('/project/packages'.length);
+    } else if (path.startsWith('${PROJECT_PATH}/')) {
+      root = projectRoot;
+      path = path.substring(PROJECT_PATH.length);
+      dartType = 'text/plain';
+    } else if (path.startsWith('${PACKAGES_PATH}/')) {
+      root = packageRoot;
+      path = path.substring(PACKAGES_PATH.length);
+    }
+
+    String filePath = root.resolve('.$path').toFilePath();
+    switch (request.method) {
+      case 'GET':
+        return handleGet(filePath, dartType);
+      case 'POST':
+        return handlePost(filePath);
+      default:
+        String method = const HtmlEscape().convert(request.method);
+        return badRequest("Unsupported method: '$method'");
+    }
+  }
+
+  void handleGet(String path, String dartType) {
+    var f = new File(path);
+    f.exists().then((bool exists) {
+      if (!exists) return notFound(request.uri);
+      if (path.endsWith('.html')) {
+        response.headers.set(CONTENT_TYPE, 'text/html');
+      } else if (path.endsWith('.dart')) {
+        response.headers.set(CONTENT_TYPE, dartType);
+      } else if (path.endsWith('.js')) {
+        response.headers.set(CONTENT_TYPE, 'application/javascript');
+      } else if (path.endsWith('.ico')) {
+        response.headers.set(CONTENT_TYPE, 'image/x-icon');
+      } else if (path.endsWith('.appcache')) {
+        response.headers.set(CONTENT_TYPE, 'text/cache-manifest');
+      }
+      f.openRead().pipe(response).catchError(onError);
+    });
+  }
+
+  handlePost(String path) {
+    // The data is sent using a dart:html HttpRequest (aka XMLHttpRequest).
+    // According to http://xhr.spec.whatwg.org/, strings are always encoded as
+    // UTF-8.
+    request.transform(UTF8.decoder).join().then((String data) {
+      // The rest of this method is synchronous. This guarantees that we don't
+      // make conflicting git changes in response to multiple POST requests.
+      try {
+        backup(path);
+      } catch (e, stack) {
+        return internalError(e, stack);
+      }
+
+      new File(path).writeAsStringSync(data);
+
+      response
+          ..statusCode = HttpStatus.OK
+          ..close();
+    });
+  }
+
+  // Back up the file [path] using git.
+  static void backup(String path) {
+    // Reset the index.
+    git('read-tree', ['HEAD']);
+
+    // Save modifications in index.
+    git('update-index', ['--add', path]);
+
+    // If the file isn't modified, don't back it up.
+    if (checkGit('diff', ['--cached', '--quiet'])) return;
+
+    String localModifications = git('write-tree');
+
+    String tag = 'refs/tags/$GIT_TAG';
+    var arguments = ['-m', COMMIT_MESSAGE, localModifications];
+
+    if (checkGit('rev-parse',  ['-q', '--verify', tag])) {
+      // The tag already exists.
+
+      if (checkGit('diff-tree', ['--quiet', localModifications, tag])) {
+        // localModifications are identical to the last backup.
+        return;
+      }
+
+      // Use the tag as a parent.
+      arguments = ['-p', tag]..addAll(arguments);
+
+      String headCommit = git('rev-parse', ['HEAD']);
+      String mergeBase = git('merge-base', [tag, 'HEAD']);
+      if (headCommit != mergeBase) {
+        arguments = ['-p', 'HEAD']..addAll(arguments);
+      }
+    } else {
+      arguments = ['-p', 'HEAD']..addAll(arguments);
+    }
+
+    // Commit the local modifcations.
+    String commit = git('commit-tree', arguments);
+
+    // Create or update the tag.
+    git('tag', ['-f', GIT_TAG, commit]);
+  }
+
+  static String git(String command,
+                    [List<String> arguments = const <String> []]) {
+    ProcessResult result =
+        run('git', <String>[command]..addAll(arguments), gitEnv);
+    if (result.exitCode != 0) {
+      throw 'git error: ${result.stdout}\n${result.stderr}';
+    }
+    return result.stdout.trim();
+  }
+
+  static bool checkGit(String command,
+                       [List<String> arguments = const <String> []]) {
+    return
+        run('git', <String>[command]..addAll(arguments), gitEnv).exitCode == 0;
+  }
+
+  static Map<String, String> computeGitEnv() {
+    ProcessResult result = run('git', ['rev-parse', '--git-dir'], null);
+    if (result.exitCode != 0) {
+      throw 'git error: ${result.stdout}\n${result.stderr}';
+    }
+    String gitDir = result.stdout.trim();
+    return <String, String>{ 'GIT_INDEX_FILE': '$gitDir/try_dart_backup' };
+  }
+
+  static ProcessResult run(String executable,
+                           List<String> arguments,
+                           Map<String, String> environment) {
+    // print('Running $executable ${arguments.join(" ")}');
+    return Process.runSync(executable, arguments, environment: environment);
+  }
+
+  static onRequest(HttpRequest request) {
+    Conversation conversation = new Conversation(request, request.response);
+    if (WebSocketTransformer.isUpgradeRequest(request)) {
+      conversation.handleSocket();
+    } else {
+      conversation.handle();
+    }
+  }
+
+  static ensureProjectWatcher() {
+    if (projectChanges != null) return;
+    String nativeDir = projectRoot.toFilePath();
+    Directory dir = new Directory(nativeDir);
+    projectChanges = dir.watch();
+    projectChanges.listen(WatchHandler.onFileSystemEvent);
+  }
+
+  static onError(error) {
+    if (error is HttpException) {
+      print('Error: ${error.message}');
+    } else {
+      print('Error: ${error}');
+    }
+  }
+
+  String htmlInfo(String title, String text) {
+    // No script injection, please.
+    title = const HtmlEscape().convert(title);
+    text = const HtmlEscape().convert(text);
+    return """
+<!DOCTYPE html>
+<html lang='en'>
+<head>
+<title>$title</title>
+</head>
+<body>
+<h1>$title</h1>
+<p style='white-space:pre'>$text</p>
+</body>
+</html>
+""";
+  }
+}
+
+main(List<String> arguments) {
+  if (arguments.length > 0) {
+    Conversation.documentRoot = Uri.base.resolve(arguments[0]);
+  }
+  var host = '127.0.0.1';
+  if (arguments.length > 1) {
+    host = arguments[1];
+  }
+  int port = 0;
+  if (arguments.length > 2) {
+    port = int.parse(arguments[2]);
+  }
+  if (arguments.length > 3) {
+    Conversation.projectRoot = Uri.base.resolve(arguments[3]);
+  }
+  if (arguments.length > 4) {
+    Conversation.packageRoot = Uri.base.resolve(arguments[4]);
+  }
+  HttpServer.bind(host, port).then((HttpServer server) {
+    print('HTTP server started on http://$host:${server.port}/');
+    server.listen(Conversation.onRequest, onError: Conversation.onError);
+  }).catchError((e) {
+    print("HttpServer.bind error: $e");
+    exit(1);
+  });
+}
diff --git a/site/try/src/Makefile b/site/try/src/Makefile
index 173a1ba..a7f64a6 100644
--- a/site/try/src/Makefile
+++ b/site/try/src/Makefile
@@ -7,4 +7,5 @@
 
 all:
 	$(SDK_DIR)/bin/dartanalyzer -p $(PACKAGE_ROOT) leap.dart --machine 2>&1\
+	| sed -e "s,$(PWD)/,," \
 	| awk -F'|' '{print $$4 ":" $$5 ":" $$6 ": " $$8}'
diff --git a/site/try/src/caching_compiler.dart b/site/try/src/caching_compiler.dart
index e94bc45..0fdd619 100644
--- a/site/try/src/caching_compiler.dart
+++ b/site/try/src/caching_compiler.dart
@@ -4,6 +4,8 @@
 
 library trydart.caching_compiler;
 
+import 'dart:async' show EventSink;
+
 import 'package:compiler/compiler.dart' show
     CompilerOutputProvider,
     Diagnostic,
@@ -28,11 +30,13 @@
   var memorySourceFiles;
   MemorySourceFileProvider(a);
 }
-class NullSink extends EventSink {
+class NullSink extends EventSink<String> {
   NullSink(a);
+  add(a) {}
+  addError(a, [b]) {}
+  close() {}
 }
 var expando;
-abstract class EventSink<T> {}
 
 DiagnosticHandler createDiagnosticHandler(DiagnosticHandler diagnosticHandler,
                                           SourceFileProvider provider,
diff --git a/site/try/src/compilation.dart b/site/try/src/compilation.dart
index e977e2a..3f6fbaf 100644
--- a/site/try/src/compilation.dart
+++ b/site/try/src/compilation.dart
@@ -11,7 +11,8 @@
     IFrameElement,
     MessageEvent,
     Url,
-    Worker;
+    Worker,
+    window;
 
 import 'dart:async' show
     Timer;
@@ -22,7 +23,6 @@
 
 import 'editor.dart' show
     addDiagnostic,
-    currentSource,
     isMalformedInput;
 
 import 'run.dart' show
@@ -63,6 +63,13 @@
 SendPort compilerPort;
 Timer compilerTimer;
 
+// TODO(ahe): Remove this.
+String get currentSource => window.localStorage['currentSource'];
+
+void set currentSource(String text) {
+  window.localStorage['currentSource'] = text;
+}
+
 void scheduleCompilation() {
   if (compilationPaused) return;
   if (compilerTimer != null) {
@@ -212,8 +219,7 @@
       var frame = new IFrameElement()
           ..src = 'iframe.html'
           ..style.width = '100%'
-          ..style.height = '0px'
-          ..seamless = false;
+          ..style.height = '0px';
       frame.onLoad.listen((_) {
         frame.contentWindow.postMessage(['source', code], '*');
       });
@@ -285,6 +291,10 @@
   }
 
   void consolePrint(message) {
+    if (window.parent != window) {
+      // Test support.
+      window.parent.postMessage('$message\n', '/');
+    }
     console.appendText('$message\n');
   }
 }
@@ -302,5 +312,8 @@
       port.send('$exception\n$stack');
     }
   });
-  // cacheCompiler.compilerFor(null);
+  var notTrue = false; // Confuse the analyzer.
+  if (notTrue) {
+    cacheCompiler.compilerFor(null);
+  }
 }
diff --git a/site/try/src/compilation_unit.dart b/site/try/src/compilation_unit.dart
new file mode 100644
index 0000000..728db2f
--- /dev/null
+++ b/site/try/src/compilation_unit.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library trydart.compilationUnit;
+
+import 'dart:async' show
+    Stream,
+    StreamController;
+
+class CompilationUnitData {
+  final String name;
+  String content;
+
+  CompilationUnitData(this.name, this.content);
+}
+
+class CompilationUnit extends CompilationUnitData {
+  // Extending [CompilationUnitData] allows this class to hide the storage
+  // allocated for [content] without introducing new names. The conventional
+  // way of acheiving this is to introduce a library-private field, but library
+  // privacy isn't without problems.
+
+  static StreamController<CompilationUnit> controller =
+      new StreamController<CompilationUnit>(sync: false);
+
+  static Stream<CompilationUnit> get onChanged => controller.stream;
+
+  CompilationUnit(String name, String content)
+      : super(name, content);
+
+  void set content(String newContent) {
+    if (content != newContent) {
+      super.content = newContent;
+      controller.add(this);
+    }
+  }
+}
diff --git a/site/try/src/decoration.dart b/site/try/src/decoration.dart
index 20c05ea..381057f 100644
--- a/site/try/src/decoration.dart
+++ b/site/try/src/decoration.dart
@@ -122,8 +122,7 @@
   Element applyTo(text) {
     var codeCompletion = new DivElement()
         ..contentEditable = 'false'
-        ..classes.add('dart-code-completion')
-        ..appendText('Completion goes here');
+        ..classes.add('dart-code-completion');
     return super.applyTo(text)
         ..classes.add('dart-code-completion-holder')
         ..nodes.add(codeCompletion);
diff --git a/site/try/src/editor.dart b/site/try/src/editor.dart
index f360e76..bc80134 100644
--- a/site/try/src/editor.dart
+++ b/site/try/src/editor.dart
@@ -15,7 +15,7 @@
 import 'ui.dart' show
     currentTheme,
     hackDiv,
-    inputPre,
+    mainEditorPane,
     observer,
     outputDiv;
 
@@ -108,19 +108,18 @@
   Selection selection = window.getSelection();
   if (!selection.isCollapsed) return null;
   var anchorNode = selection.anchorNode;
-  if (!inputPre.contains(anchorNode)) return null;
-  if (inputPre == anchorNode) return null;
+  if (!mainEditorPane.contains(anchorNode)) return null;
+  if (mainEditorPane == anchorNode) return null;
   int type = anchorNode.nodeType;
   if (type != Node.TEXT_NODE) return null;
   Text text = anchorNode;
   var parent = text.parent;
   if (parent is! Element) return null;
-  if (inputPre == parent) return null;
+  if (mainEditorPane == parent) return null;
   return parent;
 }
 
 bool isMalformedInput = false;
-String currentSource = "";
 
 addDiagnostic(String kind, String message, int begin, int end) {
   observer.disconnect();
@@ -178,7 +177,7 @@
       child = child.nextNode;
     }
   }
-  walk4(inputPre);
+  walk4(mainEditorPane);
 
   if (!foundNode) {
     outputDiv.appendText('$message\n');
@@ -186,7 +185,7 @@
 
   observer.takeRecords();
   observer.observe(
-      inputPre, childList: true, characterData: true, subtree: true);
+      mainEditorPane, childList: true, characterData: true, subtree: true);
 }
 
 void inlineChildren(Element element) {
diff --git a/site/try/src/html_to_text.dart b/site/try/src/html_to_text.dart
new file mode 100644
index 0000000..f90ded6
--- /dev/null
+++ b/site/try/src/html_to_text.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library trydart.htmlToText;
+
+import 'dart:math' show
+    max;
+
+import 'dart:html' show
+    Element,
+    Node,
+    NodeFilter,
+    Text,
+    TreeWalker;
+
+import 'selection.dart' show
+    TrySelection;
+
+/// Returns true if [node] is a block element, that is, not inline.
+bool isBlockElement(Node node) {
+  if (node is! Element) return false;
+  Element element = node;
+  return element.getComputedStyle().display != 'inline';
+}
+
+/// Position [walker] at the last predecessor (that is, child of child of
+/// child...) of [node]. The next call to walker.nextNode will return the first
+/// node after [node].
+void skip(Node node, TreeWalker walker) {
+  if (walker.nextSibling() != null) {
+    walker.previousNode();
+    return;
+  }
+  for (Node current = walker.nextNode();
+       current != null;
+       current = walker.nextNode()) {
+    if (!node.contains(current)) {
+      walker.previousNode();
+      return;
+    }
+  }
+}
+
+/// Writes the text of [root] to [buffer]. Keeps track of [selection] and
+/// returns the new anchorOffset from beginning of [buffer] or -1 if the
+/// selection isn't in [root].
+int htmlToText(Node root, StringBuffer buffer, TrySelection selection) {
+  int selectionOffset = -1;
+  TreeWalker walker = new TreeWalker(root, NodeFilter.SHOW_ALL);
+
+  for (Node node = root; node != null; node = walker.nextNode()) {
+    switch (node.nodeType) {
+      case Node.CDATA_SECTION_NODE:
+      case Node.TEXT_NODE:
+        if (selection.anchorNode == node) {
+          selectionOffset = selection.anchorOffset + buffer.length;
+        }
+        Text text = node;
+        buffer.write(text.data.replaceAll('\xA0', ' '));
+        break;
+
+      default:
+        if (node.nodeName == 'BR') {
+          buffer.write('\n');
+        } else if (node != root && isBlockElement(node)) {
+          selectionOffset =
+              max(selectionOffset, htmlToText(node, buffer, selection));
+          skip(node, walker);
+        }
+        break;
+    }
+  }
+
+  if (isBlockElement(root)) {
+    buffer.write('\n');
+  }
+
+  return selectionOffset;
+}
diff --git a/site/try/src/interaction_manager.dart b/site/try/src/interaction_manager.dart
index b00d121..88986cc 100644
--- a/site/try/src/interaction_manager.dart
+++ b/site/try/src/interaction_manager.dart
@@ -13,6 +13,9 @@
     max,
     min;
 
+import 'dart:async' show
+    Future;
+
 import 'package:compiler/implementation/scanner/scannerlib.dart'
   show
     EOF_TOKEN,
@@ -23,14 +26,16 @@
     StringSourceFile;
 
 import 'compilation.dart' show
+    currentSource,
     scheduleCompilation;
 
 import 'ui.dart' show
     currentTheme,
     hackDiv,
-    inputPre,
+    mainEditorPane,
     observer,
-    outputDiv;
+    outputDiv,
+    statusDiv;
 
 import 'decoration.dart' show
     CodeCompletionDecoration,
@@ -40,6 +45,15 @@
     info,
     warning;
 
+import 'html_to_text.dart' show
+    htmlToText;
+
+import 'compilation_unit.dart' show
+    CompilationUnit;
+
+import 'selection.dart' show
+    TrySelection;
+
 import 'editor.dart' as editor;
 
 import 'mock.dart' as mock;
@@ -75,6 +89,17 @@
   void onMutation(List<MutationRecord> mutations, MutationObserver observer);
 
   void onSelectionChange(Event event);
+
+  /// Called when the content of a CompilationUnit changed.
+  void onCompilationUnitChanged(CompilationUnit unit);
+
+  Future<List<String>> projectFileNames();
+
+  /// Called when the user selected a new project file.
+  void onProjectFileSelected(String projectFile);
+
+  /// Called when notified about a project file changed (on the server).
+  void onProjectFileFsEvent(MessageEvent e);
 }
 
 /**
@@ -83,6 +108,14 @@
 class InteractionContext extends InteractionManager {
   InteractionState state;
 
+  final Map<String, CompilationUnit> projectFiles = <String, CompilationUnit>{};
+
+  CompilationUnit currentCompilationUnit =
+      // TODO(ahe): Don't use a fake unit.
+      new CompilationUnit('fake', '');
+
+  CompilationUnit lastSaved;
+
   InteractionContext()
       : super.internal() {
     state = new InitialState(this);
@@ -97,12 +130,34 @@
   }
 
   void onSelectionChange(Event event) => state.onSelectionChange(event);
+
+  void onCompilationUnitChanged(CompilationUnit unit) {
+    return state.onCompilationUnitChanged(unit);
+  }
+
+  Future<List<String>> projectFileNames() => state.projectFileNames();
+
+  void onProjectFileSelected(String projectFile) {
+    return state.onProjectFileSelected(projectFile);
+  }
+
+  void onProjectFileFsEvent(MessageEvent e) {
+    return state.onProjectFileFsEvent(e);
+  }
 }
 
 abstract class InteractionState implements InteractionManager {
+  InteractionContext get context;
+
+  void set state(InteractionState newState);
+
   void onStateChanged(InteractionState previous) {
     print('State change ${previous.runtimeType} -> ${runtimeType}.');
   }
+
+  void transitionToInitialState() {
+    state = new InitialState(context);
+  }
 }
 
 class InitialState extends InteractionState {
@@ -161,170 +216,39 @@
     hackDiv = newDiv;
   }
 
-  // TODO(ahe): This method should be cleaned up. It is too large.
   void onMutation(List<MutationRecord> mutations, MutationObserver observer) {
     print('onMutation');
 
-    for (String query in const ['a.diagnostic>span',
-                                '.dart-code-completion',
-                                '.hazed-suggestion']) {
-      for (Element element in inputPre.querySelectorAll(query)) {
-        element.remove();
-      }
+    List<Node> highlighting = mainEditorPane.querySelectorAll(
+        'a.diagnostic>span, .dart-code-completion, .hazed-suggestion');
+    for (Element element in highlighting) {
+      element.remove();
     }
 
-    // Discard clean-up mutations.
-    observer.takeRecords();
-
     Selection selection = window.getSelection();
+    TrySelection trySelection = new TrySelection(mainEditorPane, selection);
 
-    while (!mutations.isEmpty) {
-      for (MutationRecord record in mutations) {
-        String type = record.type;
-        switch (type) {
-
-          case 'characterData':
-            bool hasSelection = false;
-            int offset = selection.anchorOffset;
-            if (selection.isCollapsed &&
-                selection.anchorNode == record.target) {
-              hasSelection = true;
-            }
-            var parent = record.target.parentNode;
-            if (parent != inputPre) {
-              editor.inlineChildren(parent);
-            }
-            if (hasSelection) {
-              selection.collapse(record.target, offset);
-            }
-            break;
-
-          default:
-            if (!record.addedNodes.isEmpty) {
-              for (var node in record.addedNodes) {
-
-                if (node.nodeType != Node.ELEMENT_NODE) continue;
-
-                if (node is BRElement) {
-                  if (selection.anchorNode != node) {
-                    node.replaceWith(new Text('\n'));
-                  }
-                } else {
-                  var parent = node.parentNode;
-                  if (parent == null) continue;
-                  var nodes = new List.from(node.nodes);
-                  var style = node.getComputedStyle();
-                  if (style.display != 'inline') {
-                    var previous = node.previousNode;
-                    if (previous is Text) {
-                      previous.appendData('\n');
-                    } else {
-                      parent.insertBefore(new Text('\n'), node);
-                    }
-                  }
-                  for (Node child in nodes) {
-                    child.remove();
-                    parent.insertBefore(child, node);
-                  }
-                  node.remove();
-                }
-              }
-            }
-        }
-      }
-      mutations = observer.takeRecords();
+    for (MutationRecord record in mutations) {
+      normalizeMutationRecord(record, trySelection);
     }
 
-    if (!inputPre.nodes.isEmpty && inputPre.nodes.last is Text) {
-      Text text = inputPre.nodes.last;
-      if (!text.text.endsWith('\n')) {
-        text.appendData('\n');
-      }
-    }
+    String currentText = mainEditorPane.text;
+    trySelection.updateText(currentText);
 
-    int offset = 0;
-    int anchorOffset = 0;
-    bool hasSelection = false;
-    Node anchorNode = selection.anchorNode;
-    // TODO(ahe): Try to share walk4 methods.
-    void walk4(Node node) {
-      // TODO(ahe): Use TreeWalker when that is exposed.
-      // function textNodesUnder(root){
-      //   var n, a=[], walk=document.createTreeWalker(
-      //       root,NodeFilter.SHOW_TEXT,null,false);
-      //   while(n=walk.nextNode()) a.push(n);
-      //   return a;
-      // }
-      int type = node.nodeType;
-      if (type == Node.TEXT_NODE || type == Node.CDATA_SECTION_NODE) {
-        CharacterData text = node;
-        if (anchorNode == node) {
-          hasSelection = true;
-          anchorOffset = selection.anchorOffset + offset;
-          return;
-        }
-        offset += text.length;
-      }
+    context.currentCompilationUnit.content = currentText;
 
-      var child = node.firstChild;
-      while (child != null) {
-        walk4(child);
-        if (hasSelection) return;
-        child = child.nextNode;
-      }
-    }
-    if (selection.isCollapsed) {
-      walk4(inputPre);
-    }
-
-    editor.currentSource = inputPre.text;
-    inputPre.nodes.clear();
-    inputPre.appendText(editor.currentSource);
-    if (hasSelection) {
-      selection.collapse(inputPre.firstChild, anchorOffset);
-    }
+    editor.seenIdentifiers = new Set<String>.from(mock.identifiers);
 
     editor.isMalformedInput = false;
-    for (var n in new List.from(inputPre.nodes)) {
-      if (n is! Text) continue;
-      Text node = n;
-      String text = node.text;
+    int offset = 0;
+    List<Node> nodes = <Node>[];
 
-      Token token = tokenize(text);
-      int offset = 0;
-      editor.seenIdentifiers = new Set<String>.from(mock.identifiers);
-      for (; token.kind != EOF_TOKEN; token = token.next) {
-        Decoration decoration = editor.getDecoration(token);
-        if (decoration == null) continue;
-        bool hasSelection = false;
-        int selectionOffset = selection.anchorOffset;
+    tokenizeAndHighlight(currentText, offset, trySelection, nodes);
 
-        if (selection.isCollapsed && selection.anchorNode == node) {
-          hasSelection = true;
-          selectionOffset = selection.anchorOffset;
-        }
-        int splitPoint = token.charOffset - offset;
-        Text str = node.splitText(splitPoint);
-        Text after = str.splitText(token.charCount);
-        offset += splitPoint + token.charCount;
-        inputPre.insertBefore(after, node.nextNode);
-        inputPre.insertBefore(decoration.applyTo(str), after);
-
-        if (hasSelection && selectionOffset > node.length) {
-          selectionOffset -= node.length;
-          if (selectionOffset > str.length) {
-            selectionOffset -= str.length;
-            selection.collapse(after, selectionOffset);
-          } else {
-            selection.collapse(str, selectionOffset);
-          }
-        }
-        node = after;
-      }
-    }
-
-    window.localStorage['currentSource'] = editor.currentSource;
-    print('Saved source');
+    mainEditorPane
+        ..nodes.clear()
+        ..nodes.addAll(nodes);
+    trySelection.adjust(selection);
 
     // Discard highlighting mutations.
     observer.takeRecords();
@@ -337,6 +261,103 @@
     super.onStateChanged(previous);
     scheduleCompilation();
   }
+
+  void onCompilationUnitChanged(CompilationUnit unit) {
+    if (unit == context.currentCompilationUnit) {
+      currentSource = unit.content;
+      print("Saved source of '${unit.name}'");
+      if (context.projectFiles.containsKey(unit.name)) {
+        postProjectFileUpdate(unit);
+      }
+      scheduleCompilation();
+    } else {
+      print("Unexpected change to compilation unit '${unit.name}'.");
+    }
+  }
+
+  void postProjectFileUpdate(CompilationUnit unit) {
+    context.lastSaved = unit;
+    onError(ProgressEvent event) {
+      HttpRequest request = event.target;
+      statusDiv.text = "Couldn't save '${unit.name}': ${request.responseText}";
+      context.lastSaved = null;
+    }
+    new HttpRequest()
+        ..open("POST", "/project/${unit.name}")
+        ..onError.listen(onError)
+        ..send(unit.content);
+  }
+
+  Future<List<String>> projectFileNames() {
+    return getString('project?list').then((String response) {
+      WebSocket socket = new WebSocket('ws://127.0.0.1:9090/ws/watch');
+      socket.onMessage.listen(context.onProjectFileFsEvent);
+      return new List<String>.from(JSON.decode(response));
+    });
+  }
+
+  void onProjectFileSelected(String projectFile) {
+    // Disable editing whilst fetching data.
+    mainEditorPane.contentEditable = 'false';
+
+    CompilationUnit unit = context.projectFiles[projectFile];
+    Future<CompilationUnit> future;
+    if (unit != null) {
+      // This project file had been fetched already.
+      future = new Future<CompilationUnit>.value(unit);
+
+      // TODO(ahe): Probably better to fetch the sources again.
+    } else {
+      // This project file has to be fetched.
+      future = getString('project/$projectFile').then((String text) {
+        CompilationUnit unit = context.projectFiles[projectFile];
+        if (unit == null) {
+          // Only create a new unit if the value hadn't arrived already.
+          unit = new CompilationUnit(projectFile, text);
+          context.projectFiles[projectFile] = unit;
+        } else {
+          // TODO(ahe): Probably better to overwrite sources. Create a new
+          // unit?
+          // The server should push updates to the client.
+        }
+        return unit;
+      });
+    }
+    future.then((CompilationUnit unit) {
+      mainEditorPane
+          ..contentEditable = 'true'
+          ..nodes.clear();
+      observer.takeRecords(); // Discard mutations.
+
+      transitionToInitialState();
+      context.currentCompilationUnit = unit;
+
+      // Install the code, which will trigger a call to onMutation.
+      mainEditorPane.appendText(unit.content);
+    });
+  }
+
+  void transitionToInitialState() {}
+
+  void onProjectFileFsEvent(MessageEvent e) {
+    Map map = JSON.decode(e.data);
+    List modified = map['modify'];
+    if (modified == null) return;
+    for (String name in modified) {
+      if (context.lastSaved != null && context.lastSaved.name == name) {
+        context.lastSaved = null;
+        continue;
+      }
+      if (context.currentCompilationUnit.name == name) {
+        mainEditorPane.contentEditable = 'false';
+        statusDiv.text = 'Modified on disk';
+      }
+    }
+  }
+}
+
+Future<String> getString(uri) {
+  return new Future<String>.sync(() => HttpRequest.getString('$uri'));
 }
 
 class PendingInputState extends InitialState {
@@ -431,7 +452,8 @@
       suggestionAccepted();
     }
     activeCompletion.classes.remove('active');
-    inputPre.querySelectorAll('.hazed-suggestion').forEach((e) => e.remove());
+    mainEditorPane.querySelectorAll('.hazed-suggestion')
+        .forEach((e) => e.remove());
     // The above changes create mutation records. This implicitly fire mutation
     // events that result in saving the source code in local storage.
     // TODO(ahe): Consider making this more explicit.
@@ -619,6 +641,10 @@
         ..classes.add('dart-entry')
         ..appendText(completion);
   }
+
+  void transitionToInitialState() {
+    endCompletion();
+  }
 }
 
 Token tokenize(String text) {
@@ -642,3 +668,55 @@
       event.getModifierState("SymbolLock") ||
       event.getModifierState("OS");
 }
+
+void tokenizeAndHighlight(String currentText,
+                          int offset,
+                          TrySelection trySelection,
+                          List<Node> nodes) {
+  //   + offset  + charOffset  + globalOffset   + (charOffset + charCount)
+  //   v         v             v                v
+  // do          identifier_abcdefghijklmnopqrst
+  for (Token token = tokenize(currentText);
+       token.kind != EOF_TOKEN;
+       token = token.next) {
+    int charOffset = token.charOffset;
+    int charCount = token.charCount;
+
+    if (charOffset < offset) continue; // Happens for scanner errors.
+
+    Decoration decoration = editor.getDecoration(token);
+    if (decoration == null) continue;
+
+    // Add a node for text before current token.
+    trySelection.addNodeFromSubstring(offset, charOffset, nodes);
+
+    // Add a node for current token.
+    trySelection.addNodeFromSubstring(
+        charOffset, charOffset + charCount, nodes, decoration);
+
+    offset = charOffset + charCount;
+  }
+
+  // Add a node for anything after the last (decorated) token.
+  trySelection.addNodeFromSubstring(offset, currentText.length, nodes);
+
+  // Ensure text always ends with a newline.
+  if (!currentText.endsWith('\n')) {
+    nodes.add(new Text('\n'));
+  }
+}
+
+void normalizeMutationRecord(MutationRecord record, TrySelection selection) {
+  if (record.addedNodes.isEmpty) return;
+  for (Node node in record.addedNodes) {
+    if (node.parent == null) continue;
+    StringBuffer buffer = new StringBuffer();
+    int selectionOffset = htmlToText(node, buffer, selection);
+    Text newNode = new Text('$buffer');
+    node.replaceWith(newNode);
+    if (selectionOffset != -1) {
+      selection.anchorNode = newNode;
+      selection.anchorOffset = selectionOffset;
+    }
+  }
+}
diff --git a/site/try/src/leap.dart b/site/try/src/leap.dart
index f9ef7c4..1504c6e 100644
--- a/site/try/src/leap.dart
+++ b/site/try/src/leap.dart
@@ -16,7 +16,8 @@
 
 import 'compilation.dart' show
     compilerIsolate,
-    compilerPort;
+    compilerPort,
+    currentSource;
 
 import 'isolate_legacy.dart' show
     spawnDomFunction,
@@ -50,8 +51,8 @@
 
 main() {
   UserOption.storage = window.localStorage;
-  if (window.localStorage['currentSource'] == null) {
-    window.localStorage['currentSource'] = EXAMPLE_HELLO;
+  if (currentSource == null) {
+    currentSource = EXAMPLE_HELLO;
   }
 
   buildUI();
diff --git a/site/try/src/run.dart b/site/try/src/run.dart
index 3a27804..3eae698 100644
--- a/site/try/src/run.dart
+++ b/site/try/src/run.dart
@@ -27,8 +27,7 @@
   return new IFrameElement()
       ..src = Url.createObjectUrl(new Blob([outputHtml], "text/html"))
       ..style.width = '100%'
-      ..style.height = '0px'
-      ..seamless = false;
+      ..style.height = '0px';
 }
 
 final String outputHelper =
diff --git a/site/try/src/selection.dart b/site/try/src/selection.dart
new file mode 100644
index 0000000..35e17a8
--- /dev/null
+++ b/site/try/src/selection.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library trydart.selection;
+
+import 'dart:html' show
+    CharacterData,
+    Node,
+    NodeFilter,
+    Selection,
+    Text,
+    TreeWalker;
+
+import 'decoration.dart';
+
+class TrySelection {
+  final Node root;
+  Node anchorNode;
+  int anchorOffset;
+
+  String text;
+  int globalOffset = -1;
+
+  TrySelection(this.root, Selection selection)
+      : this.anchorNode = selection.isCollapsed ? selection.anchorNode : null,
+        this.anchorOffset = selection.isCollapsed ? selection.anchorOffset : -1;
+
+  Text addNodeFromSubstring(int start,
+                            int end,
+                            List<Node> nodes,
+                            [Decoration decoration]) {
+    if (start == end) return null;
+
+    Text textNode = new Text(text.substring(start, end));
+
+    if (start <= globalOffset && globalOffset < end) {
+      anchorNode = textNode;
+      anchorOffset = globalOffset - start;
+    }
+
+    nodes.add(decoration == null ? textNode : decoration.applyTo(textNode));
+
+    return textNode;
+  }
+
+  void adjust(Selection selection) {
+    if (anchorOffset >= 0) {
+      selection.collapse(anchorNode, anchorOffset);
+    }
+  }
+
+  void updateText(String newText) {
+    text = newText;
+    globalOffset = computeGlobalOffset(root, anchorNode, anchorOffset);
+  }
+
+  /// Computes the global offset, that is, the offset from [root].
+  static int computeGlobalOffset(Node root, Node anchorNode, int anchorOffset) {
+    if (anchorOffset == -1) return -1;
+
+    int offset = 0;
+    TreeWalker walker = new TreeWalker(root, NodeFilter.SHOW_TEXT);
+    for (Node node = walker.nextNode();
+         node != null;
+         node = walker.nextNode()) {
+      CharacterData text = node;
+      if (anchorNode == text) {
+        return anchorOffset + offset;
+      }
+      offset += text.data.length;
+    }
+
+    return -1;
+  }
+}
diff --git a/site/try/src/ui.dart b/site/try/src/ui.dart
index d954d182..e9b66d6 100644
--- a/site/try/src/ui.dart
+++ b/site/try/src/ui.dart
@@ -11,8 +11,6 @@
     Timer,
     scheduleMicrotask;
 
-import 'dart:convert' show JSON;
-
 import 'cache.dart' show
     onLoad,
     updateCacheStatus;
@@ -39,11 +37,18 @@
 
 import 'messages.dart' show messages;
 
+import 'compilation_unit.dart' show
+    CompilationUnit;
+
+import 'compilation.dart' show
+    currentSource;
+
 // TODO(ahe): Make internal to buildUI once all interactions have been moved to
 // the manager.
 InteractionManager interaction;
 
-DivElement inputPre;
+DivElement mainEditorPane;
+DivElement statusDiv;
 PreElement outputDiv;
 DivElement hackDiv;
 IFrameElement outputFrame;
@@ -92,11 +97,13 @@
 buildUI() {
   interaction = new InteractionManager();
 
+  CompilationUnit.onChanged.listen(interaction.onCompilationUnitChanged);
+
   window.localStorage['currentSample'] = '$currentSample';
 
   buildCode(interaction);
 
-  (inputPre = new DivElement())
+  (mainEditorPane = new DivElement())
       ..classes.add('well')
       ..style.backgroundColor = currentTheme.background.color
       ..style.color = currentTheme.foreground.color
@@ -105,7 +112,7 @@
       ..style.font = codeFont
       ..spellcheck = false;
 
-  inputPre
+  mainEditorPane
       ..contentEditable = 'true'
       ..onKeyDown.listen(interaction.onKeyUp)
       ..onInput.listen(interaction.onInput);
@@ -113,7 +120,7 @@
   document.onSelectionChange.listen(interaction.onSelectionChange);
 
   var inputWrapper = new DivElement()
-      ..append(inputPre)
+      ..append(mainEditorPane)
       ..style.position = 'relative';
 
   var inputHeader = new DivElement()..appendText('Code');
@@ -124,6 +131,13 @@
       ..position = 'absolute';
   inputWrapper.append(inputHeader);
 
+  statusDiv = new DivElement();
+  statusDiv.style
+      ..left = '0px'
+      ..top = '0px'
+      ..position = 'absolute';
+  inputWrapper.append(statusDiv);
+
   outputFrame =
       makeOutputFrame(
           Url.createObjectUrl(new Blob([''], 'application/javascript')));
@@ -154,7 +168,7 @@
   var saveButton = new ButtonElement()
       ..onClick.listen((_) {
         var blobUrl =
-            Url.createObjectUrl(new Blob([inputPre.text], 'text/plain'));
+            Url.createObjectUrl(new Blob([mainEditorPane.text], 'text/plain'));
         var save = new AnchorElement(href: blobUrl);
         save.target = '_blank';
         save.download = 'untitled.dart';
@@ -204,10 +218,11 @@
   });
 
   observer = new MutationObserver(interaction.onMutation)
-      ..observe(inputPre, childList: true, characterData: true, subtree: true);
+      ..observe(
+          mainEditorPane, childList: true, characterData: true, subtree: true);
 
   scheduleMicrotask(() {
-    inputPre.appendText(window.localStorage['currentSource']);
+    mainEditorPane.appendText(currentSource);
   });
 
   // You cannot install event handlers on window.applicationCache
@@ -228,27 +243,21 @@
   var htmlGroup = new OptGroupElement()..label = 'HTML';
   var benchmarkGroup = new OptGroupElement()..label = 'Benchmarks';
 
-  new Future(() => HttpRequest.getString('project?list').then(
-  (String response) {
+  interaction.projectFileNames().then((List<String> names) {
     OptionElement none = new OptionElement()
         ..appendText('--')
         ..disabled = true;
-    codePicker.append(none);
-    for (String projectFile in JSON.decode(response)) {
-      codePicker.append(buildTab(projectFile, projectFile, (_) {
-        inputPre.contentEditable = 'false';
-        HttpRequest.getString('project/$projectFile').then((String text) {
-          inputPre
-              ..contentEditable = 'true'
-              ..nodes.clear();
-          observer.takeRecords();
-          inputPre.appendText(text);
-        });
+    codePicker
+        ..append(none)
+        ..style.visibility = 'visible'
+        ..selectedIndex = 0;
+
+    for (String name in names) {
+      codePicker.append(buildTab(name, name, (event) {
+        interaction.onProjectFileSelected(name);
       }));
     }
-    codePicker.style.visibility = 'visible';
-    codePicker.selectedIndex = 0;
-  })).catchError((error) {
+  }).catchError((error) {
     codePicker.style.visibility = 'visible';
     print(error);
     OptionElement none = new OptionElement()
@@ -258,12 +267,12 @@
 
     // codePicker.classes.addAll(['nav', 'nav-tabs']);
     codePicker.append(buildTab('Hello, World!', 'EXAMPLE_HELLO', (_) {
-      inputPre
+      mainEditorPane
           ..nodes.clear()
           ..appendText(EXAMPLE_HELLO);
     }));
     codePicker.append(buildTab('Fibonacci', 'EXAMPLE_FIBONACCI', (_) {
-      inputPre
+      mainEditorPane
           ..nodes.clear()
           ..appendText(EXAMPLE_FIBONACCI);
     }));
@@ -273,24 +282,24 @@
 
     htmlGroup.append(
         buildTab('Hello, World!', 'EXAMPLE_HELLO_HTML', (_) {
-      inputPre
+      mainEditorPane
           ..nodes.clear()
           ..appendText(EXAMPLE_HELLO_HTML);
     }));
     htmlGroup.append(
         buildTab('Fibonacci', 'EXAMPLE_FIBONACCI_HTML', (_) {
-      inputPre
+      mainEditorPane
           ..nodes.clear()
           ..appendText(EXAMPLE_FIBONACCI_HTML);
     }));
     htmlGroup.append(buildTab('Sunflower', 'EXAMPLE_SUNFLOWER', (_) {
-      inputPre
+      mainEditorPane
           ..nodes.clear()
           ..appendText(EXAMPLE_SUNFLOWER);
     }));
 
     benchmarkGroup.append(buildTab('DeltaBlue', 'BENCHMARK_DELTA_BLUE', (_) {
-      inputPre.contentEditable = 'false';
+      mainEditorPane.contentEditable = 'false';
       LinkElement link = querySelector('link[rel="benchmark-DeltaBlue"]');
       String deltaBlueUri = link.href;
       link = querySelector('link[rel="benchmark-base"]');
@@ -302,7 +311,7 @@
           deltaBlue = deltaBlue.replaceFirst(
               "import 'package:benchmark_harness/benchmark_harness.dart';",
               benchmarkBase);
-          inputPre
+          mainEditorPane
               ..nodes.clear()
               ..appendText(deltaBlue)
               ..contentEditable = 'true';
@@ -311,7 +320,7 @@
     }));
 
     benchmarkGroup.append(buildTab('Richards', 'BENCHMARK_RICHARDS', (_) {
-      inputPre.contentEditable = 'false';
+      mainEditorPane.contentEditable = 'false';
       LinkElement link = querySelector('link[rel="benchmark-Richards"]');
       String richardsUri = link.href;
       link = querySelector('link[rel="benchmark-base"]');
@@ -323,7 +332,7 @@
           richards = richards.replaceFirst(
               "import 'package:benchmark_harness/benchmark_harness.dart';",
               benchmarkBase);
-          inputPre
+          mainEditorPane
               ..nodes.clear()
               ..appendText(richards)
               ..contentEditable = 'true';
@@ -353,7 +362,7 @@
   void updateCodeFont(Event e) {
     TextInputElement target = e.target;
     codeFont = target.value;
-    inputPre.style.font = codeFont;
+    mainEditorPane.style.font = codeFont;
   }
 
   void updateTheme(Event e) {
@@ -362,7 +371,7 @@
     window.localStorage['theme'] = theme;
     currentTheme = Theme.named(theme);
 
-    inputPre.style
+    mainEditorPane.style
         ..backgroundColor = currentTheme.background.color
         ..color = currentTheme.foreground.color;
 
diff --git a/tests/benchmark_smoke/benchmark_smoke_test.dart b/tests/benchmark_smoke/benchmark_smoke_test.dart
index 53b1dac..c79275a 100644
--- a/tests/benchmark_smoke/benchmark_smoke_test.dart
+++ b/tests/benchmark_smoke/benchmark_smoke_test.dart
@@ -17,7 +17,7 @@
 
   test('performanceTesting', () {
     Timer.run(BENCHMARK_SUITE.runBenchmarks);
-    Timer.run(expectAsync0(testForCompletion));
+    Timer.run(expectAsync(testForCompletion));
   });
 }
 
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index f953d50..34d3e3e 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -50,43 +50,35 @@
 # co19 issue #615: Expect import missing
 LibTest/collection/LinkedList/LinkedList_A01_t01: Fail, OK
 
-# co19 issue 639.
-LibTest/isolate/IsolateStream/any_A01_t01: Fail
-LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail
-LibTest/isolate/IsolateStream/contains_A01_t01: Fail
-LibTest/isolate/IsolateStream/first_A01_t01: Fail
-LibTest/isolate/IsolateStream/first_A02_t01: Fail
-LibTest/isolate/IsolateStream/first_A02_t02: Fail
-LibTest/isolate/IsolateStream/isBroadcast_A01_t01: Fail
-LibTest/isolate/IsolateStream/isBroadcast_A01_t02: Fail
-LibTest/isolate/IsolateStream/isEmpty_A01_t01: Fail
-LibTest/isolate/IsolateStream/last_A01_t01: Fail
-LibTest/isolate/IsolateStream/last_A02_t01: Fail
-LibTest/isolate/IsolateStream/length_A01_t01: Fail
-LibTest/isolate/IsolateStream/single_A01_t01: Fail
-LibTest/isolate/IsolateStream/single_A02_t01: Fail
-LibTest/isolate/ReceivePort/close_A01_t01: Fail
-LibTest/isolate/ReceivePort/close_A02_t01: Fail
-LibTest/isolate/ReceivePort/receive_A01_t01: Fail
-LibTest/isolate/ReceivePort/receive_A01_t03: Fail
-LibTest/isolate/ReceivePort/toSendPort_A01_t01: Fail
-LibTest/isolate/ReceivePort/toSendPort_A01_t03: Fail
-LibTest/isolate/SendPort/call_A01_t01: Fail
-LibTest/isolate/SendPort/hashCode_A01_t01: Fail
-LibTest/isolate/SendPort/operator_equality_A01_t01: Fail
-LibTest/isolate/SendPort/send_A01_t01: StaticWarning
-LibTest/isolate/SendPort/send_A02_t01: Fail
-LibTest/isolate/SendPort/send_A02_t04: Fail
-LibTest/isolate/SendPort/send_A02_t05: Fail
-LibTest/isolate/SendPort/send_A02_t06: Fail
-LibTest/isolate/SendPort/send_A03_t01: Fail
-LibTest/isolate/SendPort/send_A03_t02: Fail
-LibTest/isolate/IsolateStream/any_A02_t01: Fail
-LibTest/isolate/IsolateStream/contains_A02_t01: Fail
-LibTest/isolate/ReceivePort/receive_A01_t02: Fail
-LibTest/isolate/ReceivePort/toSendPort_A01_t02: Fail
-LibTest/isolate/SendPort/send_A02_t02: Fail
-LibTest/isolate/SendPort/send_A02_t03: Fail
+LibTest/isolate/IsolateStream/any_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/contains_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/first_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/first_A02_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/first_A02_t02: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/isBroadcast_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/isBroadcast_A01_t02: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/isEmpty_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/last_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/last_A02_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/length_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/single_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/single_A02_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/ReceivePort/receive_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/ReceivePort/receive_A01_t03: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/ReceivePort/toSendPort_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/ReceivePort/toSendPort_A01_t03: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/call_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/send_A02_t04: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/send_A02_t03: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/send_A02_t05: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/send_A02_t06: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/send_A03_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/send_A03_t02: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/any_A02_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/contains_A02_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/ReceivePort/receive_A01_t02: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/ReceivePort/toSendPort_A01_t02: Fail # co19-roll r706: Please triage this failure.
 
 # co19 issue 642, The argument type 'int' cannot be assigned to the parameter type 'Iterable'
 LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Fail, OK
@@ -138,3 +130,57 @@
 LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
+
+WebPlatformTest1/shadow-dom/*: CompileTimeError # co19 issue 677
+WebPlatformTest1/html-templates/*: CompileTimeError # co19 issue 677
+WebPlatformTest1/custom-elements/*: Pass, StaticWarning # Issue 18095.
+
+# co19 roll to r706: Please triage all these issues.
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t03: StaticWarning # co19-roll r706: Please triage this failure.
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t04: StaticWarning # co19-roll r706: Please triage this failure.
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t05: StaticWarning # co19-roll r706: Please triage this failure.
+Language/14_Libraries_and_Scripts/3_Parts_A02_t04: CompileTimeError # co19-roll r706: Please triage this failure.
+Language/14_Libraries_and_Scripts/3_Parts_A04_t01: CompileTimeError # co19-roll r706: Please triage this failure.
+Language/14_Libraries_and_Scripts/4_Scripts_A01_t16: CompileTimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/DOMImplementation/createDocumentType-err_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Element/scrollWidth_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/article-element_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/aside-element_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/imports/import-events_t01: CompileTimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/text-field-input-types_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Document/adoptNode_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Document/childNodes_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Document/importNode_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Document/securityPolicy_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/readyStateChangeEvent_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/request_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/responseText_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/responseText_A01_t02: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/responseType_A01_t03: CompileTimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/statusText_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/status_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/attributeChanged_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/contentWindow_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/enteredView_A01_t01: CompileTimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/document_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/moveBy_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/moveTo_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/moveTo_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/postMessage_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/postMessage_A01_t02: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/requestFileSystem_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/requestFileSystem_A01_t02: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/requestFileSystem_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/resizeBy_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/resizeTo_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/isolate/ReceivePort/sendPort_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/math/Point/operator_addition_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/math/Point/operator_mult_A03_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/math/Point/operator_subtraction_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
+WebPlatformTest/dom/events/event_constants/constants_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+WebPlatformTest/dom/events/event_constructors/Event_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+WebPlatformTest/dom/events/event_constructors/Event_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 6076680..7020203a 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -50,43 +50,35 @@
 # co19 issue #615: Expect import missing
 LibTest/collection/LinkedList/LinkedList_A01_t01: Fail, OK
 
-# co19 issue 639.
-LibTest/isolate/IsolateStream/any_A01_t01: Fail
-LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail
-LibTest/isolate/IsolateStream/contains_A01_t01: Fail
-LibTest/isolate/IsolateStream/first_A01_t01: Fail
-LibTest/isolate/IsolateStream/first_A02_t01: Fail
-LibTest/isolate/IsolateStream/first_A02_t02: Fail
-LibTest/isolate/IsolateStream/isBroadcast_A01_t01: Fail
-LibTest/isolate/IsolateStream/isBroadcast_A01_t02: Fail
-LibTest/isolate/IsolateStream/isEmpty_A01_t01: Fail
-LibTest/isolate/IsolateStream/last_A01_t01: Fail
-LibTest/isolate/IsolateStream/last_A02_t01: Fail
-LibTest/isolate/IsolateStream/length_A01_t01: Fail
-LibTest/isolate/IsolateStream/single_A01_t01: Fail
-LibTest/isolate/IsolateStream/single_A02_t01: Fail
-LibTest/isolate/ReceivePort/close_A01_t01: Fail
-LibTest/isolate/ReceivePort/close_A02_t01: Fail
-LibTest/isolate/ReceivePort/receive_A01_t01: Fail
-LibTest/isolate/ReceivePort/receive_A01_t03: Fail
-LibTest/isolate/ReceivePort/toSendPort_A01_t01: Fail
-LibTest/isolate/ReceivePort/toSendPort_A01_t03: Fail
-LibTest/isolate/SendPort/call_A01_t01: Fail
-LibTest/isolate/SendPort/hashCode_A01_t01: Fail
-LibTest/isolate/SendPort/operator_equality_A01_t01: Fail
-LibTest/isolate/SendPort/send_A01_t01: StaticWarning
-LibTest/isolate/SendPort/send_A02_t01: Fail
-LibTest/isolate/SendPort/send_A02_t04: Fail
-LibTest/isolate/SendPort/send_A02_t05: Fail
-LibTest/isolate/SendPort/send_A02_t06: Fail
-LibTest/isolate/SendPort/send_A03_t01: Fail
-LibTest/isolate/SendPort/send_A03_t02: Fail
-LibTest/isolate/IsolateStream/any_A02_t01: Fail
-LibTest/isolate/IsolateStream/contains_A02_t01: Fail
-LibTest/isolate/ReceivePort/receive_A01_t02: Fail
-LibTest/isolate/ReceivePort/toSendPort_A01_t02: Fail
-LibTest/isolate/SendPort/send_A02_t02: Fail
-LibTest/isolate/SendPort/send_A02_t03: Fail
+LibTest/isolate/IsolateStream/any_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/contains_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/first_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/first_A02_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/first_A02_t02: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/isBroadcast_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/isBroadcast_A01_t02: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/isEmpty_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/last_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/last_A02_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/length_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/single_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/single_A02_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/ReceivePort/receive_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/ReceivePort/receive_A01_t03: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/ReceivePort/toSendPort_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/ReceivePort/toSendPort_A01_t03: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/call_A01_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/send_A02_t03: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/send_A02_t04: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/send_A02_t05: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/send_A02_t06: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/send_A03_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/SendPort/send_A03_t02: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/any_A02_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/IsolateStream/contains_A02_t01: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/ReceivePort/receive_A01_t02: Fail # co19-roll r706: Please triage this failure.
+LibTest/isolate/ReceivePort/toSendPort_A01_t02: Fail # co19-roll r706: Please triage this failure.
 
 # co19 issue 642, The argument type 'int' cannot be assigned to the parameter type 'Iterable'
 LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Fail, OK
@@ -138,3 +130,57 @@
 LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
+
+#co19 issue 677
+WebPlatformTest1/shadow-dom/*: CompileTimeError # co19 issue 677
+WebPlatformTest1/html-templates/*: CompileTimeError # co19 issue 677
+
+# co19 roll to r706: Please triage all these issues.
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t03: StaticWarning # co19-roll r706: Please triage this failure.
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t04: StaticWarning # co19-roll r706: Please triage this failure.
+Language/12_Expressions/15_Method_Invocation/4_Super_Invocation_A06_t05: StaticWarning # co19-roll r706: Please triage this failure.
+Language/14_Libraries_and_Scripts/3_Parts_A02_t04: CompileTimeError # co19-roll r706: Please triage this failure.
+Language/14_Libraries_and_Scripts/3_Parts_A04_t01: CompileTimeError # co19-roll r706: Please triage this failure.
+Language/14_Libraries_and_Scripts/4_Scripts_A01_t16: CompileTimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/DOMImplementation/createDocumentType-err_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Element/scrollWidth_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/article-element_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/aside-element_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/imports/import-events_t01: CompileTimeError # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/text-field-input-types_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Document/adoptNode_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Document/childNodes_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Document/importNode_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Document/securityPolicy_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/readyStateChangeEvent_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/request_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/responseText_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/responseText_A01_t02: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/responseType_A01_t03: CompileTimeError # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/statusText_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/HttpRequest/status_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/attributeChanged_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/contentWindow_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/enteredView_A01_t01: CompileTimeError # co19-roll r706: Please triage this failure.
+LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/document_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/moveBy_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/moveTo_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/moveTo_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/postMessage_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/postMessage_A01_t02: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/requestFileSystem_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/requestFileSystem_A01_t02: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/requestFileSystem_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/resizeBy_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/html/Window/resizeTo_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/isolate/ReceivePort/sendPort_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/math/Point/operator_addition_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/math/Point/operator_mult_A03_t01: StaticWarning # co19-roll r706: Please triage this failure.
+LibTest/math/Point/operator_subtraction_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
+WebPlatformTest/dom/events/event_constants/constants_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+WebPlatformTest/dom/events/event_constructors/Event_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
+WebPlatformTest/dom/events/event_constructors/Event_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index c23582d..b0b68fc 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -16,23 +16,17 @@
 LibTest/isolate/IsolateStream/contains_A02_t01: Fail # co19 issue 668
 
 [ $compiler != dartanalyzer && $compiler != dart2analyzer ]
+# Tests that fail on every runtime, but not on the analyzer.
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t02: fail # co19-roll r587: Please triage this failure
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A20_t02: fail # co19-roll r587: Please triage this failure
 
-LibTest/collection/LinkedList/forEach_A02_t01: RuntimeError, OK # co19 issue 662 (fixed in r673)
-
 LibTest/core/Invocation/namedArguments_A01_t01: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/core/Symbol/Symbol_A01_t04: RuntimeError # co19-roll r607: Please triage this failure
-LibTest/core/Set/intersection_A02_t01: Fail, OK # Issue 659 (fixed in r675)
 
 Language/07_Classes/07_Classes_A13_t01: Pass, MissingCompileTimeError, Fail # co19-roll r623: Please triage this failure
 Language/07_Classes/07_Classes_A13_t04: Pass, MissingCompileTimeError, Fail # co19-roll r623: Please triage this failure
 Language/07_Classes/07_Classes_A13_t07: Pass, MissingCompileTimeError, Fail # co19-roll r623: Please triage this failure
 
-LibTest/collection/HashSet/HashSet_class_A01_t01: RuntimeError, OK # co19 issue 663 (fixed in r675)
-LibTest/collection/LinkedHashSet/LinkedHashSet_class_A01_t01: RuntimeError, OK # co19 issue 663
-LibTest/core/Set/IterableBase_A01_t01: RuntimeError, OK # co19 issue 663
-
 LibTest/math/acos_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/asin_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/atan_A01_t01: PASS, FAIL, OK # co19 issue 44
@@ -40,12 +34,13 @@
 LibTest/math/cos_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/tan_A01_t01: PASS, FAIL, OK  # co19 issue 44
 
-LibTest/core/double/ceil_A01_t03: FAIL, OK # co19 issue 389 (not fixed in r672)
-LibTest/core/double/ceil_A01_t04: FAIL, OK # co19 issue 389
-LibTest/core/double/floor_A01_t03: FAIL, OK # co19 issue 389
-LibTest/core/double/floor_A01_t04: FAIL, OK # co19 issue 389
-LibTest/core/double/round_A01_t02: FAIL, OK # co19 issue 389
-LibTest/core/double/round_A01_t04: FAIL, OK # co19 issue 389
+LibTest/math/MutableRectangle/MutableRectangle_A01_t01: RuntimeError # co19 issue 674
+LibTest/math/Rectangle/Rectangle_A01_t01: RuntimeError # co19 issue 674
+
+LibTest/core/Expando/Expando_A03_t01: RuntimeError # Issue 17735
+LibTest/core/Expando/Expando_A03_t03: RuntimeError # Issue 17735
+LibTest/core/Expando/Expando_A03_t04: RuntimeError # Issue 17735
+LibTest/core/Expando/Expando_A03_t05: RuntimeError # Issue 17735
 
 LibTest/isolate/SendPort/send_A02_t02: SKIP # co19 issue 493 (not fixed in r672)
 LibTest/isolate/SendPort/send_A02_t03: SKIP # co19 issue 495 (not fixed in r672)
@@ -64,22 +59,17 @@
 LibTest/isolate/IsolateStream/length_A01_t01: Fail # Co19 issue 639
 LibTest/isolate/IsolateStream/single_A01_t01: Fail # Co19 issue 639
 LibTest/isolate/IsolateStream/single_A02_t01: Fail # Co19 issue 639
-LibTest/isolate/ReceivePort/close_A01_t01: Fail # Co19 issue 639
-LibTest/isolate/ReceivePort/close_A02_t01: Fail # Co19 issue 639
 LibTest/isolate/ReceivePort/receive_A01_t01: Fail # Co19 issue 639
 LibTest/isolate/ReceivePort/receive_A01_t03: Fail # Co19 issue 639
-LibTest/isolate/ReceivePort/toSendPort_A01_t01: Fail # Co19 issue 639
-LibTest/isolate/ReceivePort/toSendPort_A01_t03: Fail # Co19 issue 639
+LibTest/isolate/ReceivePort/sendPort_A01_t01: Fail # Co19 issue 639
 LibTest/isolate/SendPort/call_A01_t01: Fail # Co19 issue 639
-LibTest/isolate/SendPort/hashCode_A01_t01: Fail # Co19 issue 639
-LibTest/isolate/SendPort/operator_equality_A01_t01: Fail # Co19 issue 639
-LibTest/isolate/SendPort/send_A02_t01: Fail # Co19 issue 639
 LibTest/isolate/SendPort/send_A02_t04: Fail # Co19 issue 639
 LibTest/isolate/SendPort/send_A02_t05: Fail # Co19 issue 639
 LibTest/isolate/SendPort/send_A02_t06: Fail # Co19 issue 639
 LibTest/isolate/SendPort/send_A03_t01: Fail # Co19 issue 639
 LibTest/isolate/SendPort/send_A03_t02: Fail # Co19 issue 639
 
+LibTest/isolate/ReceivePort/any_A01_t02: RuntimeError # co19 issue 676
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: MissingRuntimeError, OK # co19 issue 638
 
 [ $runtime == dartium || $compiler == dart2js ]
@@ -90,3 +80,7 @@
 [ $compiler != dartanalyzer && $compiler != dart2analyzer && $checked ]
 LibTest/collection/DoubleLinkedQueue/removeFirst_A01_t01: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/collection/LinkedList/LinkedList_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
+LibTest/math/MutableRectangle/boundingBox_A01_t01: RuntimeError # co19 issue 675
+LibTest/math/MutableRectangle/boundingBox_A01_t02: RuntimeError # co19 issue 675
+LibTest/math/MutableRectangle/intersection_A01_t01: RuntimeError # co19 issue 675
+
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 228667a..8e70936 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -21,7 +21,6 @@
 LibTest/core/Symbol/Symbol_A01_t03: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/core/Symbol/Symbol_A01_t05: RuntimeError # co19-roll r607: Please triage this failure
 
-Language/12_Expressions/01_Constants_A20_t05: CompileTimeError # co19-roll r667: Please triage this failure
 Language/12_Expressions/18_Assignment_A04_t09: RuntimeError # co19-roll r667: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A07_t02: RuntimeError # co19-roll r667: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A07_t03: RuntimeError # co19-roll r667: Please triage this failure
@@ -57,7 +56,6 @@
 LibTest/core/int/operator_left_shift_A01_t02: Fail, OK # co19 issue 129
 LibTest/core/int/toRadixString_A01_t01: Fail # inherited from VM
 LibTest/isolate/ReceivePort/receive_A01_t02: Fail, OK # co19 issue 276
-LibTest/isolate/SendPort/send_A02_t01: CompileTimeError # Issue 13683
 LibTest/math/tan_A01_t01: Fail # Issue co19 - 44
 LibTest/typed_data/Float32x4/equal_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/notEqual_A01_t01: Skip # co19 issue 656
@@ -77,14 +75,6 @@
 LibTest/math/asin_A01_t01: Fail, OK # co19 issue 44
 LibTest/math/atan_A01_t01: Fail, OK # co19 issue 44
 
-[ $compiler == dart2dart ]
-LibTest/core/double/ceil_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
-LibTest/core/double/ceil_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
-LibTest/core/double/floor_A01_t03: Fail # truncate/ceil/floor/round returns ints, issue 389
-LibTest/core/double/floor_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
-LibTest/core/double/round_A01_t02: Fail # truncate/ceil/floor/round returns ints, issue 389
-LibTest/core/double/round_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
-
 
 [ $compiler == dart2dart ]
 Language/03_Overview/1_Scoping_A02_t28: Fail # co19-roll r559: Please triage this failure
@@ -93,7 +83,6 @@
 Language/05_Variables/05_Variables_A11_t01: fail
 Language/07_Classes/6_Constructors/2_Factories_A10_t01: crash # co19-roll r587: Please triage this failure
 Language/07_Classes/6_Constructors/2_Factories_A10_t04: crash # co19-roll r587: Please triage this failure
-Language/12_Expressions/01_Constants_A20_t02: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t06: fail # co19-roll r546: Please triage this failure
@@ -105,8 +94,6 @@
 Language/12_Expressions/12_Instance_Creation/1_New_A06_t05: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A06_t06: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/22_Equality_A01_t01: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/22_Equality_A01_t19: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/22_Equality_A01_t20: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/22_Equality_A05_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/27_Unary_Expressions_A01_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/30_Identifier_Reference_A02_t01: fail # co19-roll r546: Please triage this failure
@@ -137,6 +124,9 @@
 Language/12_Expressions/15_Method_Invocation/3_Static_Invocation_A04_t09: RuntimeError # co19-roll r623: Please triage this failure
 LibTest/core/Function/Function_class_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
 Language/13_Statements/04_Local_Function_Declaration_A04_t03: MissingCompileTimeError # co19-roll r667: Please triage this failure
+LibTest/isolate/SendPort/send_A01_t01: CompileTimeError # co19-roll r706: Please triage this failure
+LibTest/isolate/SendPort/send_A01_t02: CompileTimeError # co19-roll r706: Please triage this failure
+LibTest/isolate/SendPort/send_A01_t03: CompileTimeError # co19-roll r706: Please triage this failure
 
 LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError # Dart issue 15617
 LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError # Dart issue 15617
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 294a984..03414b4 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -10,10 +10,13 @@
 LibTest/core/Uri/encodeFull_A01_t02: Skip
 LibTest/core/Uri/encodeQueryComponent_A01_t02: Skip
 
-
 # Crashes first, please. Then untriaged bugs. There is a section below
 # for co19 bugs.
 [ $compiler == dart2js ]
+LibTest/core/List/removeAt_A02_t01: RuntimeError # Issue 1533
+LibTest/isolate/ReceivePort/receive_A01_t02: RuntimeError # Issue 6750
+Language/05_Variables/05_Variables_A11_t01: fail # Please triage this issue.
+
 Language/13_Statements/04_Local_Function_Declaration_A04_t01: MissingCompileTimeError # co19-roll r607: Please triage this failure
 Language/13_Statements/04_Local_Function_Declaration_A04_t03: MissingCompileTimeError # co19-roll r667: Please triage this failure
 Language/07_Classes/07_Classes_A13_t02: Fail # Missing CT error on member with same name a type parameter
@@ -24,10 +27,8 @@
 Language/07_Classes/07_Classes_A13_t09: Fail # Missing CT error on member with same name a type parameter
 Language/03_Overview/1_Scoping_A02_t05: CompileTimeError # TODO(ahe): Please triage this failure.
 Language/03_Overview/1_Scoping_A02_t06: CompileTimeError # TODO(ahe): Please triage this failure.
-Language/05_Variables/05_Variables_A11_t01: fail
 LibTest/core/double/INFINITY_A01_t04: RuntimeError # TODO(ahe): Please triage this failure.
 LibTest/core/double/NEGATIVE_INFINITY_A01_t04: RuntimeError # TODO(ahe): Please triage this failure.
-
 LibTest/typed_data/ByteData/getFloat32_A02_t02: fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/getFloat64_A02_t02: fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/getInt16_A02_t02: fail # co19-roll r569: Please triage this failure
@@ -61,22 +62,24 @@
 LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
 
-LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError # Dart issue 15617
-LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError # Dart issue 15617
+LayoutTests/fast/html/imports/import-events_t01: CompileTimeError # co19-roll r706: Please triage this failure
+LibTest/html/HttpRequest/responseType_A01_t03: CompileTimeError # co19-roll r706: Please triage this failure
+LibTest/html/IFrameElement/enteredView_A01_t01: CompileTimeError # co19-roll r706: Please triage this failure
+Language/12_Expressions/07_Maps_A11_t01: CompileTimeError # Maybe ok. Issue 17207
+LibTest/isolate/SendPort/send_A01_t01: CompileTimeError # co19-roll r706: Please triage this failure
+LibTest/isolate/SendPort/send_A01_t02: CompileTimeError # co19-roll r706: Please triage this failure
+LibTest/isolate/SendPort/send_A01_t03: CompileTimeError # co19-roll r706: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError, Pass # Dart issue 15617
 
 [ $compiler == dart2js && $runtime != ie9 ]
 LibTest/typed_data/ByteData/ByteData_A02_t01: fail # co19-roll r576: Please triage this failure
+LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError, Pass # Dart issue 15617
 
 [ $compiler == dart2js && $runtime == jsshell ]
 LibTest/isolate/SendPort/send_A02_t05: RuntimeError # TODO(ahe): Please triage this failure.
 LibTest/isolate/SendPort/send_A02_t06: RuntimeError # TODO(ahe): Please triage this failure.
 LibTest/core/Uri/Uri_A06_t03: Pass, Slow
 
-[ $compiler == dart2js ]
-
-LibTest/core/List/removeAt_A02_t01: RuntimeError # Issue 1533
-
-LibTest/isolate/ReceivePort/receive_A01_t02: RuntimeError # Issue 6750
 
 [ $compiler == dart2js && $runtime == ie9 ]
 LibTest/core/double/round_A01_t01: Fail # Issue: 8920
@@ -97,16 +100,359 @@
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t06: Fail # Issue: 8920
 LibTest/isolate/ReceivePort/toSendPort_A01_t01: RuntimeError # Issue: 8920
 LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: Skip # http://dartbug.com/12635
-LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Pass, Timeout # co19-roll r651: Please triage this failure
 LibTest/async/Stream/Stream.periodic_A01_t01: Fail, Pass # Issue 16106
 LibTest/core/Stopwatch/elapsedTicks_A01_t01: Fail, Pass # Issue 16106
 LibTest/async/Timer/Timer.periodic_A01_t01: Fail, Pass # Issue 16110
 LibTest/async/Timer/Timer_A01_t01: Fail, Pass # Issue 16110
+LibTest/collection/LinkedList/add_A01_t01: Pass, Slow, Timeout # Slow tests that needs extra time to finish.
+LibTest/core/Uri/Uri_A06_t03: Timeout, Pass # Issue 13511
+LibTest/math/cos_A01_t01: Fail # co19 issue 44
+
+
+# co19 roll untriaged failures.  Please triage these.
+Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # co19-roll r607: Please triage this failure
+Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # co19-roll r607: Please triage this failure
+LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Pass, Timeout # co19-roll r651: Please triage this failure
+LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/DOMException/dispatch-event-exception_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/DOMException/prototype-object_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/DOMImplementation/createDocumentType-err_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Document/createElement-invalid-names_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Document/createElement-valid-names_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Document/title-property-creates-title-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Document/title-property-set-multiple-times_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Document/title-with-multiple-children_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Element/class-name_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Element/client-rect-list-argument_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError, Timeout # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Element/hostname-host_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Element/id-in-insert-hr_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/dom/Element/offsetTop-table-cell_t01: Timeout # co19-roll r607: Please triage this failure
+LayoutTests/fast/dom/Element/scrollWidth_t01: Timeout # co19-roll r607: Please triage this failure
+LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/adjacent-html-context-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/article-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/aside-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/details-add-child-1_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/details-add-child-2_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/details-add-details-child-1_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/details-add-details-child-2_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/details-click-controls_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/details-mouse-click_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/disable-style-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/draggable_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/figcaption-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/figure-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/footer-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/header-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/hgroup-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/hidden-attr-dom_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/hidden-attr_t01: RuntimeError, Timeout # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/imports/import-element-removed-flag_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/main-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/mark-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/range-point-in-range-for-different-documents_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/section-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/text-field-input-types_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/html/unknown-tag_t01: Timeout # co19-roll r607: Please triage this failure
+LayoutTests/fast/innerHTML/innerHTML-case_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/innerHTML/innerHTML-custom-tag_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/innerHTML/innerHTML-svg-write_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/innerHTML/innerHTML-uri-resolution_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError, Timeout # co19-roll 706: Please triage this failure.
+LibTest/core/double/roundToDouble_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Document/childNodes_A01_t01: Pass, RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Document/clone_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Document/clone_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Document/contains_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Document/getElementsByName_A01_t01: Pass, RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Document/importNode_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/Element.tag_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/appendHtml_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/appendText_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/attributeChanged_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/blur_A01_t01: Pass, Timeout # co19-roll r607: Please triage this failure
+LibTest/html/Element/contentEditable_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/dataset_A02_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/draggable_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/draggable_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/enteredView_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/getBoundingClientRect_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/hidden_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/isTagSupported_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/leftView_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/ownerDocument_A01_t05: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/replaceWith_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/spellcheck_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/spellcheck_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/tagName_A01_t03: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Element/translate_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequest/getResponseHeader_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequest/getString_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequest/onAbort_A01_t01: Timeout # co19-roll r607: Please triage this failure
+LibTest/html/HttpRequest/onError_A01_t02: Timeout # co19-roll r607: Please triage this failure
+LibTest/html/HttpRequest/onLoadEnd_A01_t01: Timeout # co19-roll r607: Please triage this failure
+LibTest/html/HttpRequest/onLoadStart_A01_t01: Timeout # co19-roll r607: Please triage this failure
+LibTest/html/HttpRequest/overrideMimeType_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequest/readyStateChangeEvent_A01_t01: Pass, RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequest/request_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequest/responseText_A01_t01: Pass, RuntimeError # co19-roll r706: Please triage this failure
+LibTest/html/HttpRequest/responseText_A01_t02: Timeout # co19-roll r607: Please triage this failure
+LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequest/setRequestHeader_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequest/status_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequestUpload/onAbort_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequestUpload/onError_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoad_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/IFrameElement.created_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/appendHtml_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/appendHtml_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/appendText_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/contains_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/contentEdge_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/draggable_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/draggable_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/getBoundingClientRect_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/hidden_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/IFrameElement/onClick_A01_t01: Timeout # co19-roll r607: Please triage this failure
+LibTest/html/Window/close_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/document_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/find_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/find_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/find_A02_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/find_A03_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/find_A03_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/find_A04_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/find_A05_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/find_A06_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/find_A07_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/moveBy_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/moveTo_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/moveTo_A02_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/open_A01_t01: Pass, RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/postMessage_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/postMessage_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/requestFileSystem_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/requestFileSystem_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/requestFileSystem_A02_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/resizeBy_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/html/Window/resizeTo_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/isolate/Isolate/spawnUri_A02_t02: RuntimeError, Pass # co19-roll 706: Please triage this failure.
+LibTest/isolate/Isolate/spawnUri_A02_t03: RuntimeError, Pass # co19-roll 706: Please triage this failure.
+LibTest/isolate/Isolate/spawnUri_A02_t04: RuntimeError, Pass # co19-roll 706: Please triage this failure.
+LibTest/isolate/Isolate/spawn_A02_t01: RuntimeError, Pass # co19-roll 706: Please triage this failure.
+LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError, Pass # co19-roll 706: Please triage this failure.
+LibTest/math/MutableRectangle/MutableRectangle_A01_t01: Pass
+LibTest/math/MutableRectangle/boundingBox_A01_t02: RuntimeError, Pass # co19-roll 706: Please triage this failure.
+LibTest/math/Rectangle/Rectangle_A01_t01: Pass
+LibTest/math/Rectangle/boundingBox_A01_t02: RuntimeError, Pass # co19-roll 706: Please triage this failure.
+WebPlatformTest/dom/events/event_constants/constants_A01_t01: Timeout # co19-roll r607: Please triage this failure
+WebPlatformTest/dom/events/event_constructors/Event_A01_t01: Timeout # co19-roll r607: Please triage this failure
+WebPlatformTest/dom/events/event_constructors/Event_A02_t01: Timeout # co19-roll r607: Please triage this failure
+WebPlatformTest1/custom-elements/concepts/type_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/concepts/type_A04_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/concepts/type_A05_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/concepts/type_A06_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/concepts/type_A07_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/concepts/type_A08_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElementNS_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElement_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElement_A02_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElement_A03_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElement_A04_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElement_A05_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/isAttribute_A02_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/isAttribute_A03_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/localName_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/namespace_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/additions-to-the-steps-to-clone-a-node/template-clone-children_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/additions-to-the-steps-to-clone-a-node/templates-copy-document-owner_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/definitions/template-contents-owner-document-type_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/definitions/template-contents-owner-test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/definitions/template-contents_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-a-foster-parent-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-not-a-foster-parent-element_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-body-token_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-frameset-token_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-head-token_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-html-token_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/start-tag-body_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-table-insertion-mode/end-tag-table_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/appending-to-a-template/template-child-nodes_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/creating-an-element-for-the-token/template-owner-document_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/serializing-html-templates/outerhtml_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/template-element/content-attribute_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/template-element/node-document-changes_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/template-element/template-as-a-descendant_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/template-element/template-content-node-document_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/html-templates/template-element/template-content_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-004_t02: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-006_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-007_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-008_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-009_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-010_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-011_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-012_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-013_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-007_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-010_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t02: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/event-retargeting/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-006_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-007_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-008_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/events-that-are-always-stopped/test-009_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t02: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t03: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t04: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t05: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t06: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/html-elements-in-shadow-trees/html-forms/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/html-elements-in-shadow-trees/html-forms/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/html-elements-in-shadow-trees/inert-html-elements/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/composition/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/lower-boundary-encapsulation/distribution-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/nested-shadow-trees/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/rendering-shadow-trees/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-003_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-004_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-007_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-008_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-009_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-010_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-011_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-012_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-013_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-014_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-015_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-016_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-017_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-018_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-019_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-020_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-002_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/shadow-root-001_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-007_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # co19-roll 706: Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-011_t01: RuntimeError # co19-roll 706: Please triage this failure.
+
 
 [ $compiler == dart2js && $runtime == jsshell ]
 LibTest/core/Map/Map_class_A01_t04: Pass, Slow # Issue 8096
-LibTest/core/double/round_A01_t01: Fail # TODO(ngeoaffray): Please triage these failure.
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail # TODO(ngeoaffray): Please triage these failure.
+LibTest/core/double/round_A01_t01: RuntimeError # co19-roll 706: Please triage this failure
+LibTest/core/double/roundToDouble_A01_t01: RuntimeError # co19-roll 706: Please triage this failure.
+LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: Fail # co19-roll 706: Please triage this failure.
 
 [ $compiler == dart2js && $checked ]
 Language/13_Statements/09_Switch_A05_t01: Fail # Missing type check in switch expression
@@ -117,6 +463,12 @@
 LibTest/core/Map/Map_class_A01_t04: Slow, Pass
 LibTest/core/Uri/Uri_A06_t03: Slow, Pass
 Language/13_Statements/09_Switch_A09_t01: RuntimeError # Issue 16089
+LibTest/math/Point/operator_mult_A02_t01: RuntimeError # Issue 1533
+
+[ $compiler == dart2js && $checked && $runtime == jsshell]
+LibTest/core/Map/Map_class_A01_t04: Skip # Issue 18093, timeout.
+LibTest/core/Uri/Uri_A06_t03: Skip # Issue 18093, timeout.
+LibTest/core/Uri/encodeQueryComponent_A01_t02: Skip # Issue 18093, timeout.
 
 [ $compiler == dart2js ]
 LibTest/core/int/operator_GT_A01_t01: RuntimeError, OK # co19 issue 200
@@ -140,8 +492,6 @@
 LibTest/core/int/isEven_A01_t01: RuntimeError, OK # co19 issue 277
 
 [ $compiler == dart2js ]
-LibTest/isolate/SendPort/send_A02_t01: CompileTimeError # Issue 13683
-
 LibTest/isolate/SendPort/send_A02_t04: RuntimeError # Runtime error: TypeError: Cannot call method 'toSendPort$0' of undefined.
 
 LibTest/core/int/operator_NOT_A01_t01: RuntimeError, OK # Expects negative result from bit-operation.
@@ -151,8 +501,6 @@
 LibTest/core/int/operator_OR_A01_t01: RuntimeError, OK # Requires bigints.
 LibTest/core/int/operator_remainder_A01_t01: RuntimeError, OK # Requires bigints.
 
-Language/13_Statements/09_Switch_A03_t03: MissingCompileTimeError # Issue 17235
-
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A04_t01: RuntimeError, OK # co19 issue 212
 
 #
@@ -246,13 +594,6 @@
 LibTest/core/int/toDouble_A01_t01: RuntimeError, OK # Requires big int.
 LibTest/core/int/toRadixString_A01_t01: RuntimeError, OK # Bad test: uses Expect.fail, Expect.throws, assumes case of result, and uses unsupported radixes.
 
-[ $compiler == dart2js && $runtime == ie9 ]
-LibTest/collection/LinkedList/add_A01_t01: Pass, Slow, Timeout # Slow tests that needs extra time to finish.
-Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # co19-roll r607: Please triage this failure
-Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # co19-roll r607: Please triage this failure
-LibTest/core/Uri/Uri_A06_t03: Timeout # Issue 13511
-LibTest/math/cos_A01_t01: Fail # co19 issue 44
-
 #
 # The following tests are failing. Please add the error message
 # (either a compiler error or exception message). The error messages
@@ -261,7 +602,6 @@
 [ $compiler == dart2js ]
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A13_t01: RuntimeError # compiler cancelled: cannot resolve type T
 Language/07_Classes/3_Setters_A04_t03: RuntimeError # http://dartbug.com/5023
-Language/12_Expressions/07_Maps_A11_t01: CompileTimeError # Maybe ok. Issue 17207
 
 [ $compiler == dart2js && $jscl ]
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: RuntimeError # IllegalJSRegExpException: '\c(' 'SyntaxError: Invalid regular expression: /\c(/: Unterminated group'
@@ -564,53 +904,54 @@
 LibTest/typed_data/Uint8List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint8List/toList_A01_t01: fail, timeout # co19-roll r559: Please triage this failure
 
-# Could this be dart issue 7728?
 [ $compiler == dart2js && ($runtime == d8 || $runtime == jsshell) ]
-LibTest/async/Future/Future.delayed_A01_t01: RuntimeError # co19-roll r546: Please triage this failure
-LibTest/async/Future/Future.delayed_A03_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Future/Future.delayed_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/async/Future/Future.delayed_A03_t01: fail # Issue 7728, timer not supported in d8/jsshell
 LibTest/async/Stream/first_A01_t01: fail # co19-roll r546: Please triage this failure
 LibTest/async/Stream/first_A02_t02: fail # co19-roll r546: Please triage this failure
-LibTest/async/Stream/Stream.periodic_A02_t01: fail # co19-roll r546: Please triage this failure
-LibTest/async/Timer/cancel_A01_t01: fail # co19-roll r546: Please triage this failure
-LibTest/async/Timer/Timer_A01_t01: fail # co19-roll r546: Please triage this failure
+LibTest/async/Stream/Stream.periodic_A02_t01: fail # Issue 7728, timer not supported in d8/jsshell
+LibTest/async/Timer/cancel_A01_t01: fail # Issue 7728, timer not supported in d8/jsshell
+LibTest/async/Timer/Timer_A01_t01: fail # Issue 7728, timer not supported in d8/jsshell
+
 LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: fail # co19-roll r587: Please triage this failure
 Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # co19-roll r607: Please triage this failure
 Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # co19-roll r607: Please triage this failure
-LibTest/async/Stream/asBroadcastStream_A04_t03: RuntimeError # co19-roll r641: Please triage this failure
-LibTest/async/Stream/asBroadcastStream_A03_t01: RuntimeError # co19-roll r641: Please triage this failure
-LibTest/async/Timer/isActive_A01_t01: RuntimeError # co19-roll r641: Please triage this failure
-LibTest/async/Future/wait_A01_t07: RuntimeError # co19-roll r641: Please triage this failure
-LibTest/async/Timer/isActive_A01_t02: RuntimeError # co19-roll r641: Please triage this failure
-LibTest/async/Zone/createPeriodicTimer_A01_t01: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/async/Zone/createTimer_A01_t01: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/elapsedInMs_A01_t01: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/elapsedInUs_A01_t01: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/elapsedTicks_A01_t02: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/elapsedTicks_A01_t03: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/elapsed_A01_t01: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/elapsed_A01_t02: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/elapsed_A01_t03: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/start_A01_t03: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/stop_A01_t01: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # co19-roll r672: Please triage this failure
+LibTest/isolate/ReceivePort/asBroadcastStream_A04_t03: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/async/Stream/asBroadcastStream_A04_t03: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/async/Stream/asBroadcastStream_A03_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/async/Timer/isActive_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/async/Future/wait_A01_t07: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/async/Timer/isActive_A01_t02: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/async/Zone/createPeriodicTimer_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/async/Zone/createTimer_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/elapsedInMs_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/elapsedInUs_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/elapsedTicks_A01_t02: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/elapsedTicks_A01_t03: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/elapsed_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/elapsed_A01_t02: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/elapsed_A01_t03: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/start_A01_t03: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/stop_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
 LibTest/core/Stopwatch/start_A01_t01: RuntimeError # Please triage this failure
 LibTest/core/Stopwatch/start_A01_t02: RuntimeError # Please triage this failure
 LibTest/core/Stopwatch/elapsedTicks_A01_t01: RuntimeError # Please triage this failure
 
-LibTest/async/Stream/Stream.periodic_A01_t01: RuntimeError # No Periodic timer
-LibTest/async/Stream/Stream.periodic_A03_t01: RuntimeError # No Periodic timer
-LibTest/async/Timer/Timer.periodic_A01_t01: RuntimeError # No Periodic timer
-LibTest/async/Timer/Timer.periodic_A02_t01: RuntimeError # No Periodic timer
+LibTest/async/Stream/Stream.periodic_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/async/Stream/Stream.periodic_A03_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/async/Timer/Timer.periodic_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/async/Timer/Timer.periodic_A02_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
 
 [ $compiler == dart2js && $runtime == d8 ]
-LibTest/core/Stopwatch/elapsedInMs_A01_t01: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/elapsedInUs_A01_t01: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/elapsedTicks_A01_t02: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/elapsedTicks_A01_t03: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/elapsed_A01_t01: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/elapsed_A01_t02: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/elapsed_A01_t03: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/core/Stopwatch/stop_A01_t01: RuntimeError # co19-roll r672: Please triage this failure
+LibTest/core/Stopwatch/elapsedInMs_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/elapsedInUs_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/elapsedTicks_A01_t02: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/elapsedTicks_A01_t03: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/elapsed_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/elapsed_A01_t02: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/elapsed_A01_t03: RuntimeError # Issue 7728, timer not supported in d8/jsshell
+LibTest/core/Stopwatch/stop_A01_t01: RuntimeError # Issue 7728, timer not supported in d8/jsshell
 LibTest/math/sin_A01_t02: RuntimeError # V8 issue 3006, https://code.google.com/p/v8/issues/detail?id=3006
 
 [ $compiler == dart2js && $minified ]
@@ -670,3 +1011,8 @@
 
 [ $compiler == dart2js && $runtime == d8 && $system == windows ]
 LibTest/async/DeferredLibrary/*: Skip # Issue 17458
+
+[ $compiler == dart2js && $mode == debug ]
+LibTest/collection/ListBase/ListBase_class_A01_t01: Pass, Timeout
+LibTest/collection/ListMixin/ListMixin_class_A01_t01: Pass, Timeout
+LibTest/core/List/List_class_A01_t01: Pass, Timeout
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 9a29b8e..ae27ff4 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -11,7 +11,6 @@
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: Pass # Issue 14478: This should break.
 LibTest/async/Completer/completeError_A02_t01: Pass, Fail # Issue 13719: Please triage this failure.
 LibTest/core/int/operator_left_shift_A01_t02: Pass, Fail # Issue 13719: Please triage this failure.
-LibTest/isolate/ReceivePort/toSendPort_A01_t02: Pass, Fail # Issue 13719: Please triage this failure.
 LibTest/isolate/SendPort/send_A02_t01: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t04: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t05: Fail # Issue 13921
@@ -23,10 +22,207 @@
 LibTest/isolate/Isolate/spawnUri_A01_t05: RuntimeError # co19-roll r672: Please triage this failure
 LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError # co19-roll r672: Please triage this failure
 LibTest/isolate/Isolate/spawnUri_A02_t04: Pass, Timeout # Please triage this failure
-LibTest/isolate/RawReceivePort/RawReceivePort_A01_t01: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/isolate/RawReceivePort/RawReceivePort_A01_t02: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/isolate/RawReceivePort/close_A01_t01: RuntimeError # co19-roll r672: Please triage this failure
 
+LibTest/isolate/RawReceivePort/RawReceivePort_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/RawReceivePort/RawReceivePort_A01_t02: RuntimeError # Issue 13921
+LibTest/isolate/RawReceivePort/close_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/RawReceivePort/handler_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/RawReceivePort/sendPort_A01_t01: RuntimeError # Issue 13921
+
+LibTest/isolate/ReceivePort/any_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/any_A01_t02: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/asBroadcastStream_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/asBroadcastStream_A01_t02: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/asBroadcastStream_A01_t03: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/asBroadcastStream_A01_t04: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/asBroadcastStream_A02_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/asBroadcastStream_A03_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/asBroadcastStream_A03_t02: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/asBroadcastStream_A03_t03: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/asBroadcastStream_A04_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/asBroadcastStream_A04_t02: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/asBroadcastStream_A04_t03: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/close_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/close_A02_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/contains_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/distinct_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/distinct_A01_t02: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/drain_A02_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/drain_A02_t02: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/elementAt_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/elementAt_A03_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/every_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/expand_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/firstWhere_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/firstWhere_A02_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/firstWhere_A03_t02: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/first_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/first_A02_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/first_A02_t02: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/fold_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/fold_A01_t02: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/forEach_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/isEmpty_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/join_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/join_A01_t02: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/lastWhere_A02_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/lastWhere_A04_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/last_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/last_A02_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/length_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/listen_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/map_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/pipe_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/reduce_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/reduce_A01_t02: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/reduce_A01_t03: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/sendPort_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/singleWhere_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/singleWhere_A02_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/single_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/single_A02_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/skipWhile_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/skip_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/takeWhile_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/take_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/take_A01_t02: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/take_A01_t03: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/toList_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/toSet_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/transform_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/transform_A01_t02: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/where_A01_t01: RuntimeError # Issue 13921
+LibTest/isolate/ReceivePort/where_A01_t02: RuntimeError # Issue 13921
+
+# New Dartium failures on new co19 browser tests in co19 revision 706.
+
+LibTest/html/Element/blur_A01_t01: Timeout, Pass # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/blur_A01_t01: Timeout, Pass # Issue 17758.  Please triage this failure.
+LibTest/html/Element/focus_A01_t01: Timeout, Pass # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/focus_A01_t01: Timeout, Pass # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/enteredView_A01_t01: Timeout # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/leftView_A01_t01: Timeout, RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequest/onError_A01_t02: Timeout # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequest/responseText_A01_t02: Timeout # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequestUpload/onError_A01_t02: Timeout # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Timeout # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Timeout # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoad_A01_t01: Timeout # Issue 17758.  Please triage this failure.
+WebPlatformTest/dom/events/event_constants/constants_A01_t01: Timeout # Issue 17758.  Please triage this failure.
+WebPlatformTest/dom/events/event_constructors/Event_A01_t01: Timeout # Issue 17758.  Please triage this failure.
+WebPlatformTest/dom/events/event_constructors/Event_A02_t01: Timeout # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t01: Timeout, RuntimeError, Pass # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t02: Timeout, Pass # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t05: Timeout, RuntimeError, Pass # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-001_t06: Timeout, Pass # Issue 17758.  Please triage this failure.
+
+LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/html/hidden-attr_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/html/imports/import-element-removed-flag_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/html/imports/import-events_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/async/Stream/Stream.periodic_A01_t01: Pass, RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Document/childNodes_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Document/clone_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Document/clone_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Document/securityPolicy_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Element/Element.tag_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Element/borderEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Element/contentEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Element/dataset_A02_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Element/isContentEditable_A02_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Element/marginEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Element/paddingEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Element/replaceWith_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequest/responseType_A01_t03: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/IFrameElement.created_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/appendHtml_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/appendHtml_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/createFragment_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/createFragment_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/createFragment_A01_t03: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/getClientRects_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/setInnerHtml_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Window/close_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Window/find_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Window/find_A03_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Window/find_A06_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Window/moveTo_A01_t01: RuntimeError, Pass # Issue 17758.  Please triage this failure.
+LibTest/html/Window/moveTo_A02_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Window/postMessage_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Window/requestFileSystem_A02_t01: RuntimeError, Pass # Issue 17758.  Please triage this failure.
+LibTest/html/Window/resizeBy_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/Window/resizeTo_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/isolate/SendPort/send_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/isolate/SendPort/send_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/isolate/SendPort/send_A01_t03: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/isolate/SendPort/send_A01_t04: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/custom-elements/concepts/type_A05_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/custom-elements/concepts/type_A06_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElement_A02_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElement_A03_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElement_A04_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/creating-an-element-for-the-token/template-owner-document_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/html-templates/template-element/node-document-changes_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/html-templates/template-element/template-as-a-descendant_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError, Pass # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError, Pass # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/satisfying-matching-criteria/test-007_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # Issue 17758.  Please triage this failure.
 
 Language/12_Expressions/13_Spawning_an_Isolate_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
 LibTest/isolate/Isolate/spawn_A01_t01: RuntimeError # co19-roll r667: Please triage this failure
@@ -40,5 +236,20 @@
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid ) && $checked ]
 LibTest/core/List/removeAt_A02_t01: Fail # co19-roll r641: Please triage this failure
 
+# New Dartium checked failures on new co19 browser tests in co19 revision 706.
+LayoutTests/fast/html/article-element_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/html/aside-element_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequest/readyStateChangeEvent_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequest/request_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequest/responseText_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequest/status_A01_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/custom-elements/instantiating/createElement_A05_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError # Issue 17758.  Please triage this failure.
+WebPlatformTest1/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # Issue 17758.  Please triage this failure.
+
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
 LibTest/math/log_A01_t01: Pass, Fail # co19 issue 44.
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index bb3ef50..a325b82 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -49,6 +49,11 @@
 LibTest/typed_data/Float32x4/reciprocalSqrt_A01_t01: Pass, Fail # co19 issue 599
 LibTest/typed_data/Float32x4/reciprocal_A01_t01: Pass, Fail # co19 issue 599
 
+[ $runtime == vm ]
+# These flaky tests also fail with dart2dart.
+LibTest/math/Rectangle/boundingBox_A01_t01: Pass, RuntimeError # co19-roll r607: Please triage this failure
+LibTest/math/MutableRectangle/MutableRectangle.fromPoints_A01_t01: Pass, RuntimeError # co19-roll r607: Please triage this failure
+
 [ $compiler == none && $runtime == vm && $checked ]
 LibTest/core/List/removeAt_A02_t01: Fail # co19 issue 670
 
@@ -79,3 +84,10 @@
 
 [ $runtime == vm ]
 LibTest/isolate/Isolate/spawn_A02_t01: Skip # co19 issue 667
+LibTest/html/*: SkipByDesign # dart:html not supported on VM.
+LayoutTests/fast/*: SkipByDesign # DOM not supported on VM.
+WebPlatformTest/*: SkipByDesign # dart:html not supported on VM.
+WebPlatformTest1/*: SkipByDesign # dart:html not supported on VM.
+
+[ $compiler == none && $runtime == vm && $arch == simarm64 ]
+*: Skip
diff --git a/tests/compiler/dart2js/analyze_helper.dart b/tests/compiler/dart2js/analyze_helper.dart
index 585468a..c9a80ee 100644
--- a/tests/compiler/dart2js/analyze_helper.dart
+++ b/tests/compiler/dart2js/analyze_helper.dart
@@ -83,7 +83,7 @@
     }
     String path = uri.path;
     for (String file in whiteListMap.keys) {
-      if (path.endsWith(file)) {
+      if (path.contains(file)) {
         for (String messagePart in whiteListMap[file].keys) {
           if (message.contains(messagePart)) {
             whiteListMap[file][messagePart]++;
@@ -129,9 +129,13 @@
   }
 }
 
+typedef bool CheckResults(Compiler compiler,
+                          CollectingDiagnosticHandler handler);
+
 Future analyze(List<Uri> uriList,
                Map<String, List<String>> whiteList,
-               {bool analyzeAll: true}) {
+               {bool analyzeAll: true,
+                CheckResults checkResults}) {
   String testFileName =
       relativize(Uri.base, Platform.script, Platform.isWindows);
 
@@ -168,7 +172,12 @@
 """;
 
   void onCompletion(_) {
-    bool result = handler.checkResults();
+    bool result;
+    if (checkResults != null) {
+      result = checkResults(compiler, handler);
+    } else {
+      result = handler.checkResults();
+    }
     if (!result) {
       print(MESSAGE);
       exit(1);
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
index ce5da9f..05f227e 100644
--- a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
@@ -6,16 +6,50 @@
 
 import 'package:async_helper/async_helper.dart';
 
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
 
 import 'analyze_helper.dart';
 
 // Do not remove WHITE_LIST even if it's empty.  The error message for
 // unused members refers to WHITE_LIST by name.
-const Map<String, List<String>> WHITE_LIST = const {};
+const Map<String, List<String>> WHITE_LIST = const {
+  // TODO(johnniwinther): Explicitly check that we use no helpers, both methods
+  // and classes, are used in production code.*/
+  // Helper methods for debugging should never be called from production code:
+  "implementation/helpers/": const [" is never "],
+};
 
 void main() {
   var uri = currentDirectory.resolve(
       'sdk/lib/_internal/compiler/implementation/use_unused_api.dart');
-  asyncTest(() => analyze([uri], WHITE_LIST, analyzeAll: false));
+  asyncTest(() => analyze([uri], WHITE_LIST,
+      analyzeAll: false, checkResults: checkResults));
+}
+
+bool checkResults(Compiler compiler, CollectingDiagnosticHandler handler) {
+  var helperUri = currentDirectory.resolve(
+      'sdk/lib/_internal/compiler/implementation/helpers/helpers.dart');
+  void checkLive(member) {
+    if (member.isFunction()) {
+      if (compiler.enqueuer.resolution.isLive(member)) {
+        compiler.reportHint(member, MessageKind.GENERIC,
+            {'text': "Helper function in production code '$member'."});
+      }
+    } else if (member.isClass()) {
+      if (member.isResolved) {
+        compiler.reportHint(member, MessageKind.GENERIC,
+            {'text': "Helper class in production code '$member'."});
+      } else {
+        member.forEachLocalMember(checkLive);
+      }
+    } else if (member.isTypedef()) {
+      if (member.isResolved) {
+        compiler.reportHint(member, MessageKind.GENERIC,
+            {'text': "Helper typedef in production code '$member'."});
+      }
+    }
+  }
+  compiler.libraries['$helperUri'].forEachLocalMember(checkLive);
+  return handler.checkResults();
 }
diff --git a/tests/compiler/dart2js/closure_codegen_test.dart b/tests/compiler/dart2js/closure_codegen_test.dart
index 0474b02..e3f9f4a 100644
--- a/tests/compiler/dart2js/closure_codegen_test.dart
+++ b/tests/compiler/dart2js/closure_codegen_test.dart
@@ -32,35 +32,38 @@
 const String TEST_BAILOUT = r"""
 class A {
   var x;
-  foo() {
+  foo(_) { // make sure only g has no arguments
     var f = function g() { return 499;  };
     return 499 + x + f();
   }
 }
 
-main() { new A().foo(); }
+main() { new A().foo(1); }
 """;
 
-closureInvocation() {
-  String generated = compile(TEST_INVOCATION0);
-  Expect.isTrue(generated.contains(r".call$0()"));
-  generated = compile(TEST_INVOCATION1);
-  Expect.isTrue(generated.contains(r".call$1(1)"));
-  generated = compile(TEST_INVOCATION2);
-  Expect.isTrue(generated.contains(r".call$2(1, 2)"));
+closureInvocation(bool minify, String prefix) {
+  String generated = compile(TEST_INVOCATION0, minify: minify);
+  Expect.isTrue(generated.contains(".$prefix\$0()"));
+  generated = compile(TEST_INVOCATION1, minify: minify);
+  Expect.isTrue(generated.contains(".$prefix\$1(1)"));
+  generated = compile(TEST_INVOCATION2, minify: minify);
+  Expect.isTrue(generated.contains(".$prefix\$2(1,${minify ? "" : " "}2)"));
 }
 
 // Make sure that the bailout version does not introduce a second version of
 // the closure.
-closureBailout() {
-  asyncTest(() => compileAll(TEST_BAILOUT).then((generated) {
-    RegExp regexp = new RegExp(r'call\$0: function');
+closureBailout(bool minify, String prefix) {
+  asyncTest(() => compileAll(TEST_BAILOUT, minify: minify)
+      .then((generated) {
+    RegExp regexp = new RegExp("$prefix\\\$0:${minify ? "" : " "}function");
     Iterator<Match> matches = regexp.allMatches(generated).iterator;
     checkNumberOfMatches(matches, 1);
   }));
 }
 
 main() {
-  closureInvocation();
-  closureBailout();
+  closureInvocation(false, "call");
+  closureInvocation(true, "");
+  closureBailout(false, "call");
+  closureBailout(true, "");
 }
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index 790f3cc..5353bcf 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -89,6 +89,7 @@
                           bool analyzeOnly: false,
                           String coreSource: DEFAULT_CORELIB,
                           bool disableInlining: true,
+                          bool minify: false,
                           int expectedErrors,
                           int expectedWarnings}) {
   MockCompiler compiler = new MockCompiler(
@@ -96,6 +97,7 @@
       analyzeOnly: analyzeOnly,
       coreSource: coreSource,
       disableInlining: disableInlining,
+      enableMinification: minify,
       expectedErrors: expectedErrors,
       expectedWarnings: expectedWarnings);
   compiler.sourceFiles[uri.toString()] =
@@ -106,12 +108,14 @@
 Future<String> compileAll(String code,
                           {String coreSource: DEFAULT_CORELIB,
                           bool disableInlining: true,
+                          bool minify: false,
                           int expectedErrors,
                           int expectedWarnings}) {
   Uri uri = new Uri(scheme: 'source');
   MockCompiler compiler = compilerFor(
       code, uri, coreSource: coreSource, disableInlining: disableInlining,
-      expectedErrors: expectedErrors, expectedWarnings: expectedWarnings);
+      minify: minify, expectedErrors: expectedErrors,
+      expectedWarnings: expectedWarnings);
   return compiler.runCompiler(uri).then((_) {
     Expect.isFalse(compiler.compilationFailed,
                    'Unexpected compilation error');
diff --git a/tests/compiler/dart2js/dart_backend_test.dart b/tests/compiler/dart2js/dart_backend_test.dart
index 9e52599..48ba841 100644
--- a/tests/compiler/dart2js/dart_backend_test.dart
+++ b/tests/compiler/dart2js/dart_backend_test.dart
@@ -33,7 +33,10 @@
 class TypeError {}
 class Type {}
 class StackTrace {}
-class LinkedHashMap {}
+class LinkedHashMap {
+  factory LinkedHashMap._empty() => null;
+  factory LinkedHashMap._literal(elements) => null;
+}
 class Math {
   static double parseDouble(String s) => 1.0;
 }
@@ -387,7 +390,7 @@
     'class A{foo(){}}'
     'A_topfoo(){var x=5;}'
     'class A_A{num foo(){}A_A.fromFoo(){}A myliba;List<A_A> mylist;}'
-    'A getA()=>null;'
+    'A getA(){}'
     'main(){var a=new A();a.foo();var b=new A_A.fromFoo();b.foo();'
         'var GREATVAR=b.myliba;b.mylist;a=getA();A_topfoo();topfoo();}';
   testDart2DartWithLibrary(mainSrc, librarySrc,
diff --git a/tests/compiler/dart2js/deferred_follow_implicit_super_regression_test.dart b/tests/compiler/dart2js/deferred_follow_implicit_super_regression_test.dart
new file mode 100644
index 0000000..0d47ce1
--- /dev/null
+++ b/tests/compiler/dart2js/deferred_follow_implicit_super_regression_test.dart
@@ -0,0 +1,116 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+import 'memory_source_file_helper.dart';
+import "memory_compiler.dart";
+import "dart:async";
+
+import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+       as dart2js;
+
+runTest(String mainScript, test) {
+  Compiler compiler = compilerFor(MEMORY_SOURCE_FILES,
+      outputProvider: new OutputCollector());
+  asyncTest(() => compiler.run(Uri.parse(mainScript))
+      .then((_) => test(compiler)));
+}
+
+void main() {
+  runTest('memory:main.dart', (compiler) {
+    var main = compiler.mainApp.find(dart2js.Compiler.MAIN);
+    Expect.isNotNull(main, "Could not find 'main'");
+    compiler.deferredLoadTask.onResolutionComplete(main);
+
+    var outputUnitForElement = compiler.deferredLoadTask.outputUnitForElement;
+
+    var lib = compiler.libraries["memory:lib.dart"];
+    var a = lib.find("a");
+    var b = lib.find("b");
+    var c = lib.find("c");
+    var d = lib.find("d");
+    Expect.equals(outputUnitForElement(a), outputUnitForElement(b));
+    Expect.equals(outputUnitForElement(a), outputUnitForElement(c));
+    Expect.equals(outputUnitForElement(a), outputUnitForElement(d));
+  });
+}
+
+// Make sure that the implicit references to supers are found by the deferred
+// loading dependency mechanism.
+const Map MEMORY_SOURCE_FILES = const {
+  "main.dart":"""
+import "lib.dart" deferred as lib;
+
+void main() {
+  lib.loadLibrary().then((_) {
+    new lib.A2();
+    new lib.B2();
+    new lib.C3();
+    new lib.D3(10);
+  });
+}
+""",
+  "lib.dart":"""
+a() => print("123");
+
+b() => print("123");
+
+c() => print("123");
+
+d() => print("123");
+
+class B {
+  B() {
+    b();
+  }
+}
+
+class B2 extends B {
+  // No constructor creates a synthetic constructor that has an implicit
+  // super-call.
+}
+
+class A {
+  A() {
+    a();
+  }
+}
+
+class A2 extends A {
+  // Implicit super call.
+  A2();
+}
+
+class C1 {}
+
+class C2 {
+  C2() {
+    c();
+  }
+}
+
+class C2p {
+  C2() {
+    c();
+  }
+}
+
+class C3 extends C2 with C1 {
+  // Implicit redirecting "super" call via mixin.
+}
+
+class D1 {
+}
+
+class D2 {
+  D2(x) {
+    d();
+  }
+}
+
+// Implicit redirecting "super" call with a parameter via mixin.
+class D3 = D2 with D1;
+""",
+};
diff --git a/tests/compiler/dart2js/deferred_mirrors_test.dart b/tests/compiler/dart2js/deferred_mirrors_test.dart
index 2f18a84..12e2b7d 100644
--- a/tests/compiler/dart2js/deferred_mirrors_test.dart
+++ b/tests/compiler/dart2js/deferred_mirrors_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -10,69 +10,73 @@
 import "package:async_helper/async_helper.dart";
 import 'memory_source_file_helper.dart';
 import "dart:async";
+import "memory_compiler.dart";
 
 import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
        as dart2js;
 
-class FakeOutputStream<T> extends EventSink<T> {
-  void add(T event) {}
-  void addError(T event, [StackTrace stackTrace]) {}
-  void close() {}
+runTest(String mainScript, test) {
+  Compiler compiler = compilerFor(MEMORY_SOURCE_FILES,
+      outputProvider: new OutputCollector());
+  asyncTest(() => compiler.run(Uri.parse(mainScript))
+      .then((_) => test(compiler)));
 }
 
 void main() {
-  Uri script = currentDirectory.resolveUri(Platform.script);
-  Uri libraryRoot = script.resolve('../../../sdk/');
-  Uri packageRoot = script.resolve('./packages/');
-
-  var provider = new MemorySourceFileProvider(MEMORY_SOURCE_FILES);
-  var handler = new FormattingDiagnosticHandler(provider);
-
-  Compiler compiler = new Compiler(provider.readStringFromUri,
-                                   (name, extension) => new FakeOutputStream(),
-                                   handler.diagnosticHandler,
-                                   libraryRoot,
-                                   packageRoot,
-                                   [],
-                                   {});
-  asyncTest(() => compiler.run(Uri.parse('memory:main.dart')).then((_) {
+  runTest('memory:main.dart', (compiler) {
     var main = compiler.mainApp.find(dart2js.Compiler.MAIN);
+    Expect.isNotNull(main, "Could not find 'main'");
+    compiler.deferredLoadTask.onResolutionComplete(main);
     var outputUnitForElement = compiler.deferredLoadTask.outputUnitForElement;
 
-    var mainOutputUnit = compiler.deferredLoadTask.mainOutputUnit;
-    var classes = compiler.backend.emitter.neededClasses;
     var lib1 = compiler.libraries["memory:lib1.dart"];
     var lib2 = compiler.libraries["memory:lib2.dart"];
     var mathLib = compiler.libraries["dart:math"];
     var sin = mathLib.find('sin');
     var foo1 = lib1.find("foo1");
     var foo2 = lib2.find("foo2");
+    var field2 = lib2.find("field2");
 
-    var outputClassLists = compiler.backend.emitter.outputClassLists;
-
-    Expect.notEquals(mainOutputUnit, outputUnitForElement(foo1));
+    Expect.notEquals(outputUnitForElement(main), outputUnitForElement(foo1));
     Expect.equals(outputUnitForElement(foo1), outputUnitForElement(sin));
-  }));
+    Expect.equals(outputUnitForElement(foo2), outputUnitForElement(sin));
+    Expect.equals(outputUnitForElement(foo2), outputUnitForElement(field2));
+  });
+  runTest('memory:main2.dart', (compiler) {
+    // Just check that the compile runs.
+    // This is a regression test.
+    Expect.isTrue(true);
+  });
+  runTest('memory:main3.dart', (compiler) {
+    var main = compiler.mainApp.find(dart2js.Compiler.MAIN);
+    Expect.isNotNull(main, "Could not find 'main'");
+    compiler.deferredLoadTask.onResolutionComplete(main);
+    var outputUnitForElement = compiler.deferredLoadTask.outputUnitForElement;
+
+    var mainLib = compiler.libraries["memory:main3.dart"];
+    var lib3 = compiler.libraries["memory:lib3.dart"];
+    var C = mainLib.find("C");
+    var foo = lib3.find("foo");
+
+    Expect.notEquals(outputUnitForElement(main), outputUnitForElement(foo));
+    Expect.equals(outputUnitForElement(foo), outputUnitForElement(C));
+  });
 }
 
 // "lib1.dart" uses mirrors without a MirrorsUsed annotation, so everything
 // should be put in the "lib1" output unit.
 const Map MEMORY_SOURCE_FILES = const {
-  "main.dart":"""
-import "dart:async";
+  "main.dart": """
 import "dart:math";
 
-@def1 import 'lib1.dart' as lib1;
-@def2 import 'lib2.dart' as lib2;
-
-const def1 = const DeferredLibrary("lib1");
-const def2 = const DeferredLibrary("lib2");
+import 'lib1.dart' deferred as lib1;
+import 'lib2.dart' deferred as lib2;
 
 void main() {
-  def1.load().then((_) {
+  lib1.loadLibrary().then((_) {
     lib1.foo1();
   });
-  def2.load().then((_) {
+  lib2.loadLibrary().then((_) {
     lib2.foo2();
   });
 }
@@ -99,4 +103,48 @@
   mirror.invoke(null, null);
 }
 """,
+// The elements C and f are named as targets, but there is no actual use of
+// mirrors.
+"main2.dart": """
+import "lib.dart" deferred as lib;
+
+@MirrorsUsed(targets: const ["C", "f"])
+import "dart:mirrors";
+
+class C {}
+
+var f = 3;
+
+void main() {
+
+}
+""",
+"lib.dart": """ """,
+// Lib3 has a MirrorsUsed annotation with a library.
+// Check that that is handled correctly.
+"main3.dart": """
+library main3;
+
+import "lib3.dart" deferred as lib;
+
+class C {}
+
+class D {}
+
+f() {}
+
+void main() {
+  lib.loadLibrary().then((_) {
+    lib.foo();
+  });
+}
+""",
+"lib3.dart": """
+@MirrorsUsed(targets: const ["main3.C"])
+import "dart:mirrors";
+
+foo() {
+  currentMirrorSystem().findLibrary(#main3);
+}
+""",
 };
diff --git a/tests/compiler/dart2js/exit_code_test.dart b/tests/compiler/dart2js/exit_code_test.dart
index f1192f01..074e33d 100644
--- a/tests/compiler/dart2js/exit_code_test.dart
+++ b/tests/compiler/dart2js/exit_code_test.dart
@@ -39,7 +39,7 @@
       : super(inputProvider, outputProvider, handler, libraryRoot,

               packageRoot, options, environment) {

     scanner = new TestScanner(this);

-    resolver = new TestResolver(this);

+    resolver = new TestResolver(this, backend.constantCompilerTask);

     test('Compiler');

   }

 

@@ -129,7 +129,8 @@
 }

 

 class TestResolver extends ResolverTask {

-  TestResolver(TestCompiler compiler) : super(compiler);

+  TestResolver(TestCompiler compiler, ConstantCompiler constantCompiler)

+      : super(compiler, constantCompiler);

 

   TestCompiler get compiler => super.compiler;

 

diff --git a/tests/compiler/dart2js/field_update_test.dart b/tests/compiler/dart2js/field_update_test.dart
new file mode 100644
index 0000000..f5a93ba
--- /dev/null
+++ b/tests/compiler/dart2js/field_update_test.dart
@@ -0,0 +1,97 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import 'compiler_helper.dart';
+
+// Test for emitting JavaScript pre- and post-increment and assignment ops.
+
+const String TEST_1 = """
+class A {
+  var a = 42;
+  int foo() { var r = a; a = a + 1; return r; }  // this.a++
+}
+
+void main() {
+  var a = new A();
+  print(a.foo());
+}
+""";
+
+const String TEST_2 = """
+class A {
+  var a = 42;
+  int foo() { var r = a; a = a + 1; return a; }  // ++this.a
+}
+
+void main() {
+  var a = new A();
+  print(a.foo());
+}
+""";
+
+const String TEST_3 = """
+class A {
+  var a = 42;
+  int foo() { var r = a; a = a - 1; return r; }  // this.a--
+}
+
+void main() {
+  var a = new A();
+  print(a.foo());
+}
+""";
+
+const String TEST_4 = """
+class A {
+  var a = 42;
+  int foo() { var r = a; a = a - 1; return a; }  // --this.a
+}
+
+void main() {
+  var a = new A();
+  print(a.foo());
+}
+""";
+
+const String TEST_5 = """
+class A {
+  var a = 42;
+  int foo() { var r = a; a = a - 2; return a; }  // this.a -= 2
+}
+
+void main() {
+  var a = new A();
+  print(a.foo());
+}
+""";
+
+const String TEST_6 = """
+class A {
+  var a = 42;
+  int foo() { var r = a; a = a * 2; return a; }  // this.a *= 2
+}
+
+void main() {
+  var a = new A();
+  print(a.foo());
+}
+""";
+
+
+main() {
+  test(String code, Function f) {
+    asyncTest(() => compileAll(code, disableInlining: true).then((generated) {
+      Expect.isTrue(f(generated));
+    }));
+  }
+
+  test(TEST_1, (generated) => generated.contains(r'return this.a++;'));
+  test(TEST_2, (generated) => generated.contains(r'return ++this.a;'));
+  test(TEST_3, (generated) => generated.contains(r'return this.a--;'));
+  test(TEST_4, (generated) => generated.contains(r'return --this.a;'));
+  test(TEST_5, (generated) => generated.contains(r' this.a -= 2;'));
+  test(TEST_6, (generated) => generated.contains(r' this.a *= 2;'));
+}
diff --git a/tests/compiler/dart2js/map_tracer_keys_test.dart b/tests/compiler/dart2js/map_tracer_keys_test.dart
new file mode 100644
index 0000000..cec1c29
--- /dev/null
+++ b/tests/compiler/dart2js/map_tracer_keys_test.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import "package:async_helper/async_helper.dart";
+import
+    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+    show ContainerTypeMask, TypeMask;
+
+import 'compiler_helper.dart';
+import 'parser_helper.dart';
+import 'type_mask_test_helper.dart';
+
+
+String generateTest(String key, String value, bool initial) {
+  return """
+double aDouble = 42.5;
+List aList = [42];
+
+consume(x) => x;
+
+main() {
+""" + (initial ?
+"""
+  var theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4, $key: $value};
+""" :
+"""
+  var theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4};
+  theMap[$key] = $value;
+""") +
+"""
+  for (var key in theMap.keys) {
+    aDouble = theMap[key];
+  }
+  // We have to reference it somewhere, so that it always gets resolved.
+  consume(aList);
+}
+""";
+}
+
+void main() {
+  // Test using keys without the list floating in
+  doTest();
+  // Test using keys with the list floating in as key
+  doTest(key: "aList", bail: true);
+  // Test using keys with the list floating in as value
+  doTest(value: "aList");
+  // And the above where we add the list as part of the map literal.
+  doTest(initial: true);
+  doTest(key: "aList", bail: true, initial: true);
+  doTest(value: "aList", initial: true);
+}
+
+void doTest({String key: "'d'", String value: "5.5", bool bail: false,
+             bool initial: false}) {
+  Uri uri = new Uri(scheme: 'source');
+  var compiler = compilerFor(generateTest(key, value, initial), uri,
+      expectedErrors: 0, expectedWarnings: 0);
+  asyncTest(() => compiler.runCompiler(uri).then((_) {
+    var typesTask = compiler.typesTask;
+    var typesInferrer = typesTask.typesInferrer;
+    var aDoubleType =
+        typesInferrer.getTypeOfElement(findElement(compiler, 'aDouble'));
+    var aListType =
+        typesInferrer.getTypeOfElement(findElement(compiler, 'aList'));
+
+    Expect.equals(aDoubleType, typesTask.doubleType);
+    Expect.isTrue(aListType is ContainerTypeMask);
+    ContainerTypeMask container = aListType;
+    TypeMask elementType = container.elementType;
+    if (bail) {
+      Expect.equals(elementType, typesTask.dynamicType);
+    } else {
+      Expect.equals(elementType, typesTask.uint31Type);
+    }
+  }));
+}
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index 846c7f9..20e16cf 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -101,19 +101,19 @@
     // 1. The constructed constant for 'MirrorsUsed'.
     Expect.isTrue(compiler.backend.metadataConstants.length >= 1);
 
+    Set<Constant> compiledConstants =
+        compiler.backend.constants.compiledConstants;
     // Make sure that most of the metadata constants aren't included in the
     // generated code.
     for (var dependency in compiler.backend.metadataConstants) {
       Constant constant = dependency.constant;
-      Expect.isFalse(
-          compiler.constantHandler.compiledConstants.contains(constant),
-          '$constant');
+      Expect.isFalse(compiledConstants.contains(constant), '$constant');
     }
 
     // The type literal 'Foo' is both used as metadata, and as a plain value in
     // the program. Make sure that it isn't duplicated.
     int fooConstantCount = 0;
-    for (Constant constant in compiler.constantHandler.compiledConstants) {
+    for (Constant constant in compiledConstants) {
       if (constant is TypeConstant && '${constant.representedType}' == 'Foo') {
         fooConstantCount++;
       }
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index d2a7cd1..f0b586f 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -61,7 +61,10 @@
   class Closure implements Function {}
   class Null {}
   class Dynamic_ {}
-  class LinkedHashMap {}
+  class LinkedHashMap {
+    factory LinkedHashMap._empty() => null;
+    factory LinkedHashMap._literal(elements) => null;
+  }
   class ConstantMap {}
   class TypeImpl {}
   S() {}
diff --git a/tests/compiler/dart2js/source_map_d2js_validity_test.dart b/tests/compiler/dart2js/source_map_d2js_validity_test.dart
new file mode 100644
index 0000000..cbc5ed8
--- /dev/null
+++ b/tests/compiler/dart2js/source_map_d2js_validity_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:async_helper/async_helper.dart';
+
+import 'source_map_validator_helper.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/dart2js.dart' as entry;
+
+void main() {
+  asyncTest(() => createTempDir().then((Directory tmpDir) {
+    print('Compiling tests/compiler/dart2js/exit_code_helper.dart');
+    Future result =
+          entry.internalMain(['tests/compiler/dart2js/exit_code_helper.dart',
+                              '-o${tmpDir.path}/out.js',
+                              '--library-root=sdk']);
+      return result.then((_) {
+        Uri uri =
+            new Uri.file('${tmpDir.path}/out.js', windows: Platform.isWindows);
+        validateSourceMap(uri);
+
+        print("Deleting '${tmpDir.path}'.");
+        tmpDir.deleteSync(recursive: true);
+      });
+  }));
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/source_map_pub_build_validity_test.dart b/tests/compiler/dart2js/source_map_pub_build_validity_test.dart
new file mode 100644
index 0000000..8aabf5d
--- /dev/null
+++ b/tests/compiler/dart2js/source_map_pub_build_validity_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+import 'package:async_helper/async_helper.dart';
+
+import 'source_map_validator_helper.dart';
+
+void main() {
+  asyncTest(() => createTempDir().then((Directory tmpDir) {
+    Directory sunflowerDir = new Directory.fromUri(
+        Platform.script.resolve('../../../samples/sunflower'));
+
+    print("Copying '${sunflowerDir.path}' to '${tmpDir.path}'.");
+    copyDirectory(sunflowerDir, tmpDir);
+    String ext = Platform.isWindows ? '.bat' : '';
+    String command = path.normalize(path.join(path.fromUri(Platform.script),
+                                              '../../../../sdk/bin/pub${ext}'));
+    String file = path.join(tmpDir.path, 'build/web/sunflower.dart.js');
+    print("Running '$command build --mode=debug' from '${tmpDir}'.");
+    return Process.run(command, ['build','--mode=debug'],
+        workingDirectory: tmpDir.path).then((process) {
+      print(process.stdout);
+      validateSourceMap(new Uri.file(file, windows: Platform.isWindows));
+      print("Deleting '${tmpDir.path}'.");
+      tmpDir.deleteSync(recursive: true);
+    });
+  }));
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/source_map_validator_helper.dart b/tests/compiler/dart2js/source_map_validator_helper.dart
new file mode 100644
index 0000000..934a63c
--- /dev/null
+++ b/tests/compiler/dart2js/source_map_validator_helper.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'dart:convert';
+import 'dart:async';
+
+import 'package:path/path.dart' as path;
+import 'package:expect/expect.dart';
+import 'package:source_maps/source_maps.dart';
+
+validateSourceMap(Uri targetUri) {
+  Uri mapUri = getMapUri(targetUri);
+  SingleMapping sourceMap = getSourceMap(mapUri);
+  checkFileReferences(targetUri, mapUri, sourceMap);
+  checkRedundancy(sourceMap);
+}
+
+checkFileReferences(Uri targetUri, Uri mapUri, SingleMapping sourceMap) {
+  Expect.equals(targetUri, mapUri.resolve(sourceMap.targetUrl));
+  print('Checking sources');
+  sourceMap.urls.forEach((String url) {
+    Expect.isTrue(new File.fromUri(mapUri.resolve(url)).existsSync());
+  });
+}
+
+checkRedundancy(SingleMapping sourceMap) {
+  sourceMap.lines.forEach((TargetLineEntry line) {
+    TargetEntry previous = null;
+    for (TargetEntry next in line.entries) {
+      if (previous != null) {
+        Expect.isFalse(sameSourcePoint(previous, next),
+            '$previous and $next are consecutive entries on line $line in the '
+            'source map but point to same source locations');
+      }
+      previous = next;
+    }
+  });
+}
+
+sameSourcePoint(TargetEntry entry, TargetEntry otherEntry) {
+  return
+      (entry.sourceUrlId == otherEntry.sourceUrlId) &&
+      (entry.sourceLine == otherEntry.sourceLine) &&
+      (entry.sourceColumn == otherEntry.sourceColumn) &&
+      (entry.sourceNameId == otherEntry.sourceNameId);
+}
+
+Uri getMapUri(Uri targetUri) {
+  print('Accessing $targetUri');
+  File targetFile = new File.fromUri(targetUri);
+  Expect.isTrue(targetFile.existsSync());
+  List<String> target = targetFile.readAsStringSync().split('\n');
+  String mapReference = target[target.length - 3]; // #sourceMappingURL=<url>
+  Expect.isTrue(mapReference.startsWith('//# sourceMappingURL='));
+  String mapName = mapReference.substring(mapReference.indexOf('=') + 1);
+  return targetUri.resolve(mapName);
+}
+
+SingleMapping getSourceMap(Uri mapUri) {
+  print('Accessing $mapUri');
+  File mapFile = new File.fromUri(mapUri);
+  Expect.isTrue(mapFile.existsSync());
+  return new SingleMapping.fromJson(
+      JSON.decode(mapFile.readAsStringSync()));
+}
+
+copyDirectory(Directory sourceDir, Directory destinationDir) {
+  sourceDir.listSync().forEach((FileSystemEntity element) {
+    String newPath = path.join(destinationDir.path,
+                               path.basename(element.path));
+    if (element is File) {
+      element.copySync(newPath);
+    } else if (element is Directory) {
+      Directory newDestinationDir = new Directory(newPath);
+      newDestinationDir.createSync();
+      copyDirectory(element, newDestinationDir);
+    }
+  });
+}
+
+Future<Directory> createTempDir() {
+  return Directory.systemTemp
+      .createTemp('sourceMap_test-')
+      .then((Directory dir) {
+    return dir;
+  });
+}
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index fb14e82..9ef843f 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -58,7 +58,8 @@
                 testTypeLiteral,
                 testInitializers,
                 testTypePromotionHints,
-                testFunctionCall];
+                testFunctionCall,
+                testCascade];
   for (Function test in tests) {
     setup();
     test();
@@ -1716,6 +1717,172 @@
       infos: []);
 }
 
+void testCascade() {
+  compiler.parseScript(r'''typedef A AFunc();
+                           typedef Function FuncFunc();
+                           class A {
+                             A a;
+                             B b;
+                             C c;
+                             AFunc afunc() => null;
+                             FuncFunc funcfunc() => null;
+                             C operator [](_) => null;
+                             void operator []=(_, C c) {}
+                           }
+                           class B {
+                             B b;
+                             C c;
+                           }
+                           class C {
+                             C c;
+                             AFunc afunc() => null;
+                           }
+                           ''');
+
+  check(String text, {warnings, hints, infos}) {
+    analyze('{ $text }', warnings: warnings, hints: hints, infos: infos);
+  }
+
+  check('A a = new A()..a;');
+
+  check('A a = new A()..b;');
+
+  check('A a = new A()..a..b;');
+
+  check('A a = new A()..b..c..a;');
+
+  check('B b = new A()..a;',
+        warnings: NOT_ASSIGNABLE);
+
+  check('B b = new A()..b;',
+        warnings: NOT_ASSIGNABLE);
+
+  check('B b = new A().b;');
+
+  check('new A().b..b;');
+
+  check('new A().b..a;',
+        warnings: MEMBER_NOT_FOUND);
+
+  check('B b = new A().b..c;');
+
+  check('C c = new A().b..c;',
+        warnings: NOT_ASSIGNABLE);
+
+  check('A a = new A()..a = new A();');
+
+  check('A a = new A()..b = new B();');
+
+  check('B b = new A()..b = new B();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('A a = new A()..b = new A();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('AFunc a = new C().afunc();');
+
+  check('AFunc a = new C()..afunc();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('C c = new C()..afunc();');
+
+  check('A a = new C().afunc()();');
+
+  check('A a = new C()..afunc()();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('AFunc a = new C()..afunc()();',
+        warnings: NOT_ASSIGNABLE);
+
+
+  check('FuncFunc f = new A().funcfunc();');
+
+  check('A a = new A().funcfunc();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('FuncFunc f = new A()..funcfunc();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('A a = new A()..funcfunc();');
+
+  check('FuncFunc f = new A()..funcfunc()();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('A a = new A()..funcfunc()();');
+
+  check('FuncFunc f = new A()..funcfunc()()();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('A a = new A()..funcfunc()()();');
+
+
+  check('''A a;
+           a = new A()..a = a = new A()..c.afunc();''');
+
+  check('''A a = new A()..b = new B()..c.afunc();''');
+
+  check('''A a = new A()..b = new A()..c.afunc();''',
+           warnings: NOT_ASSIGNABLE);
+
+  check('''A a = new A()..b = new A()..c.afunc()();''',
+           warnings: NOT_ASSIGNABLE);
+
+  check('''A a = new A()..b = new A()..c.afunc()().b;''',
+           warnings: NOT_ASSIGNABLE);
+
+  check('A a = new A().afunc()()[0].afunc();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('C c = new A().afunc()()[0].afunc();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('AFunc a = new A().afunc()()[0].afunc();');
+
+  check('A a = new A()..afunc()()[0].afunc();');
+
+  check('C c = new A()..afunc()()[0].afunc();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('AFunc a = new A()..afunc()()[0].afunc();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('A a = new A().afunc()()[0]..afunc();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('C c = new A().afunc()()[0]..afunc();');
+
+  check('AFunc a = new A().afunc()()[0]..afunc();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('A a = new A()..afunc()()[0]..afunc();');
+
+  check('C c = new A()..afunc()()[0]..afunc();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('AFunc a = new A()..afunc()()[0]..afunc();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('new A()[0] = new A();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('new A()[0] = new C();');
+
+  check('new A().a[0] = new A();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('new A().a[0] = new C();');
+
+  check('new A()..a[0] = new A();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('new A()..a[0] = new C();');
+
+  check('new A()..afunc()()[0] = new A();',
+        warnings: NOT_ASSIGNABLE);
+
+  check('new A()..afunc()()[0] = new C();');
+}
+
 const CLASS_WITH_METHODS = '''
 typedef int String2Int(String s);
 
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
index 49dcb36..98bce8f 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
@@ -11,10 +11,10 @@
 const z = x - y;
 
 const a = 1.0;
-const b = a << 3;  // This would not be valid with Dart semantics.
+const b = a << 3;  /// 01: compile-time error
 
 const c = -0.0;
-const d = c << 1;  // This would not be valid with Dart semantics.
+const d = c << 1;  /// 02: compile-time error
 
 foo() => 12345678901234567891 - 12345678901234567890;
 
@@ -24,11 +24,11 @@
   Expect.equals(0, foo());
   Expect.isTrue(x is double);
   Expect.isTrue(x is int);
-  Expect.equals(8, b);
-  Expect.equals(8, 1.0 << 3);  // This would not be valid with Dart semantics.
+  Expect.equals(8, b);  /// 01: continued
+  Expect.equals(8, 1.0 << 3);  /// 03: static type warning
   Expect.isTrue(1 == 1.0);
-  Expect.equals(0, d);
-  Expect.equals(0, -0.0 << 1);  // This would not be valid with Dart semantics.
+  Expect.equals(0, d);  /// 02: continued
+  Expect.equals(0, -0.0 << 1);  /// 04: static type warning
   // Make sure the 1 is not shifted into the 32 bit range.
   Expect.equals(0, 0x100000000 >> 3);
   // The dynamic int-check also allows -0.0.
diff --git a/tests/compiler/dart2js_extra/minus_zero_test.dart b/tests/compiler/dart2js_extra/minus_zero_test.dart
index a9d4722..9ef7432 100644
--- a/tests/compiler/dart2js_extra/minus_zero_test.dart
+++ b/tests/compiler/dart2js_extra/minus_zero_test.dart
@@ -6,13 +6,13 @@
 
 import "package:expect/expect.dart";
 
-const double MINUS_ZERO = -0;
+const double MINUS_ZERO = -0; /// 01: static type warning, checked mode compile-time error
 
 void main() {
   // Dart2js must not infer that the type-intersection of int and -0.0 is empty.
   // It must get an interceptor for the addition (`i += 3`), or use the native
   // JS + operation.
-  int i = MINUS_ZERO;
-  i += 3;
-  Expect.equals(3, i);
+  int i = MINUS_ZERO;  /// 01: continued
+  i += 3;              /// 01: continued
+  Expect.equals(3, i); /// 01: continued
 }
diff --git a/tests/compiler/dart2js_extra/type_error_message_test.dart b/tests/compiler/dart2js_extra/type_error_message_test.dart
index 220550b..1f44f6f 100644
--- a/tests/compiler/dart2js_extra/type_error_message_test.dart
+++ b/tests/compiler/dart2js_extra/type_error_message_test.dart
@@ -2,6 +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.
 
+// Test that the error message for a failing subtype test includes type
+// arguments.
+
 import 'package:expect/expect.dart';
 
 class C<T, S> {}
@@ -21,7 +24,10 @@
     try {
       C<String, String> x = new C<C<int, String>, String>();
     } catch (e) {
-      String expected = 'C<C<int, String>, String>';
+      String nameOfC = (C).toString();
+      String nameOfInt = (int).toString();
+      String nameOfString = (String).toString();
+      String expected = '$nameOfC<$nameOfC<$nameOfInt, $nameOfString>, $nameOfString>';
       Expect.isTrue(e.toString().contains(expected),
                     'Expected "$expected" in the message');
       caught = true;
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index c2b831e..4b2c4fa 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -59,6 +59,7 @@
 [ $compiler == none || $compiler == dart2dart ]
 symbol_test/none: Fail # bug 11669
 symbol_operator_test/03: Fail # bug 11669
+string_case_test/01: Fail # Bug 18061
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 main_test: Fail  # Dartium needs to check for both main() and main(args).
@@ -111,6 +112,26 @@
 [ $compiler == dart2js && ($runtime == d8 || $runtime == chrome || $runtime == drt || $runtime == safari) ]
 string_trimlr_test/none: Fail # Bug in v8. Fixed in v8 r19222, 2014-02-10.
 
+[ $compiler == dart2js && ($runtime == d8 || $runtime == drt) ]
+string_case_test/02: Fail, OK  # Bug in our version of V8.
+
+[ $compiler == dart2js && ($runtime == ie9 || $runtime == ie10) ]
+string_case_test/01: Fail, OK  # Bug in IE.
+string_case_test/02: Fail, OK  # Bug in IE.
+
+[ $compiler == dart2js && ($runtime == ff || $runtime == jsshell) ]
+string_case_test/01: Fail, OK  # Bug in Firefox.
+
+[ $compiler == dart2js && $runtime == dartium ]
+string_case_test/02: Fail, OK  # Bug in dartium version of V8.
+string_case_test/03: Fail, OK  # Bug in dartium version of V8.
+
+[ $compiler == dart2js && $runtime == chrome ]
+string_case_test/02: Fail, OK  # Bug in Chrome.  Please file issue.
+
+[ $compiler == dart2js && $checked ]
+map_test: Crash # Issue 17829
+
 [ $compiler == dart2dart ]
 compare_to2_test: Fail # inherited from VM
 unicode_test: Fail # inherited from VM
@@ -140,6 +161,9 @@
 [ $arch == simarm && $checked ]
 num_parse_test: Pass, Timeout
 
+[ $arch == simarm64 ]
+*: Skip
+
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 error_stack_trace_test: StaticWarning, OK # Test generates errors on purpose.
 iterable_element_at_test: StaticWarning, OK # Test generates errors on purpose.
diff --git a/tests/corelib/integer_to_string_test.dart b/tests/corelib/integer_to_string_test.dart
index 8b7061a..e6f94ed 100644
--- a/tests/corelib/integer_to_string_test.dart
+++ b/tests/corelib/integer_to_string_test.dart
@@ -19,7 +19,7 @@
     Expect.equals(expect, (new StringBuffer()..write(value)).toString());
   }
 
-  // Null.
+  // Very simple tests.
   test(0, "0");
   test(1, "1");
   test(2, "2");
diff --git a/tests/corelib/map_test.dart b/tests/corelib/map_test.dart
index d782bcd..a432b48 100644
--- a/tests/corelib/map_test.dart
+++ b/tests/corelib/map_test.dart
@@ -11,6 +11,9 @@
   test(new LinkedHashMap());
   test(new SplayTreeMap());
   test(new SplayTreeMap(Comparable.compare));
+  test(new MapView(new HashMap()));
+  test(new MapView(new SplayTreeMap()));
+  test(new MapBaseMap());
   testLinkedHashMap();
   testMapLiteral();
   testNullValue();
@@ -24,6 +27,7 @@
   testWeirdStringKeys(new LinkedHashMap<String, String>());
   testWeirdStringKeys(new SplayTreeMap());
   testWeirdStringKeys(new SplayTreeMap<String, String>());
+  testWeirdStringKeys(new MapBaseMap<String, String>());
 
   testNumericKeys(new Map());
   testNumericKeys(new Map<num, String>());
@@ -35,6 +39,7 @@
   testNumericKeys(new LinkedHashMap<num, String>());
   testNumericKeys(new LinkedHashMap.identity());
   testNumericKeys(new LinkedHashMap<num, String>.identity());
+  testNumericKeys(new MapBaseMap<num, String>());
 
   testNaNKeys(new Map());
   testNaNKeys(new Map<num, String>());
@@ -42,6 +47,7 @@
   testNaNKeys(new HashMap<num, String>());
   testNaNKeys(new LinkedHashMap());
   testNaNKeys(new LinkedHashMap<num, String>());
+  testNaNKeys(new MapBaseMap<num, String>());
   // Identity maps fail the NaN-keys tests because the test assumes that
   // NaN is not equal to NaN.
 
@@ -89,6 +95,11 @@
   testOtherKeys(new LinkedHashMap(equals: (int x, int y) => x == y,
                                   hashCode: (int v) => v.hashCode,
                                   isValidKey: (v) => v is int));
+  testOtherKeys(new MapBaseMap<int, int>());
+
+  testUnmodifiableMap(const {1 : 37});
+  testUnmodifiableMap(new UnmodifiableMapView({1 : 37}));
+  testUnmodifiableMap(new UnmodifiableMapBaseMap([1, 37]));
 }
 
 
@@ -704,6 +715,18 @@
   testLength(0, map);
 }
 
+void testUnmodifiableMap(Map map) {
+  Expect.isTrue(map.containsKey(1));
+  testLength(1, map);
+  Expect.equals(1, map.keys.first);
+  Expect.equals(37, map.values.first);
+
+  Expect.throws(map.clear);
+  Expect.throws(() { map.remove(1); });
+  Expect.throws(() { map[2] = 42; });
+  Expect.throws(() { map.addAll({2 : 42}); });
+}
+
 class Customer {
   final int id;
   final int secondId;
@@ -749,3 +772,103 @@
   int get hashCode => id;
   bool operator==(other) => other is Mutable && other.id == id;
 }
+
+
+// Slow implementation of Map based on MapBase.
+class MapBaseMap<K, V> extends MapBase<K, V> {
+  final List _keys = <K>[];
+  final List _values = <V>[];
+  int _modCount = 0;
+
+  V operator[](Object key) {
+    int index = _keys.indexOf(key);
+    if (index < 0) return null;
+    return _values[index];
+  }
+
+  Iterable<K> get keys => new TestKeyIterable<K>(this);
+
+  void operator[]=(K key, V value) {
+    int index = _keys.indexOf(key);
+    if (index >= 0) {
+      _values[index] = value;
+    } else {
+      _modCount++;
+      _keys.add(key);
+      _values.add(value);
+    }
+  }
+
+  V remove(Object key) {
+    int index = _keys.indexOf(key);
+    if (index >= 0) {
+      var result = _values[index];
+      key = _keys.removeLast();
+      var value = _values.removeLast();
+      if (index != _keys.length) {
+        _keys[index] = key;
+        _values[index] = value;
+      }
+      _modCount++;
+      return result;
+    }
+    return null;
+  }
+
+  void clear() {
+    // Clear cannot be based on remove, since remove won't remove keys that
+    // are not equal to themselves. It will fail the testNaNKeys test.
+    _keys.clear();
+    _values.clear();
+    _modCount++;
+  }
+}
+
+class TestKeyIterable<K> extends IterableBase<K> {
+  final _map;
+  TestKeyIterable(this._map);
+  int get length => _map._keys.length;
+  Iterator<K> get iterator => new TestKeyIterator<K>(_map);
+}
+
+class TestKeyIterator<K> implements Iterator<K> {
+  final _map;
+  final int _modCount;
+  int _index = 0;
+  var _current;
+  TestKeyIterator(map) : _map = map, _modCount = map._modCount;
+  bool moveNext() {
+    if (_modCount != _map._modCount) {
+      throw new ConcurrentModificationError(_map);
+    }
+    if (_index == _map._keys.length) {
+      _current = null;
+      return false;
+    }
+    _current = _map._keys[_index++];
+    return true;
+  }
+  K get current => _current;
+}
+
+// Slow implementation of Map based on MapBase.
+class UnmodifiableMapBaseMap<K, V> extends UnmodifiableMapBase<K, V> {
+  final List _keys = <K>[];
+  final List _values = <V>[];
+  UnmodifiableMapBaseMap(List pairs) {
+    for (int i = 0; i < pairs.length; i += 2) {
+      _keys.add(pairs[i]);
+      _values.add(pairs[i + 1]);
+    }
+  }
+
+  int get _modCount => 0;
+
+  V operator[](K key) {
+    int index = _keys.indexOf(key);
+    if (index < 0) return null;
+    return _values[index];
+  }
+
+  Iterable<K> get keys => _keys.skip(0);
+}
diff --git a/tests/corelib/string_case_test.dart b/tests/corelib/string_case_test.dart
index 6ba535c..d6c140d 100644
--- a/tests/corelib/string_case_test.dart
+++ b/tests/corelib/string_case_test.dart
@@ -4,21 +4,52 @@
 
 import "package:expect/expect.dart";
 
-class StringCaseTest {
-
-  static testMain() {
-    testLowerUpper();
-  }
-
-  static testLowerUpper() {
-    var a = "Stop! Smell the Roses.";
-    var allLower = "stop! smell the roses.";
-    var allUpper = "STOP! SMELL THE ROSES.";
-    Expect.equals(allUpper, a.toUpperCase());
-    Expect.equals(allLower, a.toLowerCase());
-  }
+main() {
+  testLowerUpper();
+  testSpecialCases();
 }
 
-main() {
-  StringCaseTest.testMain();
+void testLowerUpper() {
+  var a = "Stop! Smell the Roses.";
+  var allLower = "stop! smell the roses.";
+  var allUpper = "STOP! SMELL THE ROSES.";
+  Expect.equals(allUpper, a.toUpperCase());
+  Expect.equals(allLower, a.toLowerCase());
+}
+
+void testSpecialCases() {
+  // Letters in Latin-1 where the upper case is not in Latin-1.
+
+  // German sharp s. Upper case variant is "SS".
+  Expect.equals("SS", "\xdf".toUpperCase());                  /// 01: ok
+  Expect.equals("\xdf", "\xdf".toLowerCase());
+  Expect.equals("ss", "\xdf".toUpperCase().toLowerCase());    /// 01: continued
+  // Micro sign (not same as lower-case Greek letter mu, U+03BC).
+  Expect.equals("\u039c", "\xb5".toUpperCase());              /// 02: ok
+  Expect.equals("\xb5", "\xb5".toLowerCase());
+  Expect.equals("\u03Bc",                                     /// 02: continued
+                "\xb5".toUpperCase().toLowerCase());          /// 02: continued
+  // Small letter y diaresis.
+  Expect.equals("\u0178", "\xff".toUpperCase());              /// 03: ok
+  Expect.equals("\xff", "\xff".toLowerCase());
+  Expect.equals("\xff", "\xff".toUpperCase().toLowerCase());  /// 03: continued
+  // Zero.
+  Expect.equals("\x00", "\x00".toLowerCase());
+  Expect.equals("\x00", "\x00".toUpperCase());
+
+  // Test all combinations of ordering of lower-case, upper-case and
+  // special-when-upper-cased characters.
+  Expect.equals("AA\u0178", "Aa\xff".toUpperCase());          /// 03: continued
+  Expect.equals("AA\u0178", "aA\xff".toUpperCase());          /// 03: continued
+  Expect.equals("A\u0178A", "A\xffa".toUpperCase());          /// 03: continued
+  Expect.equals("A\u0178A", "a\xffA".toUpperCase());          /// 03: continued
+  Expect.equals("\u0178AA", "\xffAa".toUpperCase());          /// 03: continued
+  Expect.equals("\u0178AA", "\xffaA".toUpperCase());          /// 03: continued
+
+  Expect.equals("aa\xff", "Aa\xff".toLowerCase());
+  Expect.equals("aa\xff", "aA\xff".toLowerCase());
+  Expect.equals("a\xffa", "A\xffa".toLowerCase());
+  Expect.equals("a\xffa", "a\xffA".toLowerCase());
+  Expect.equals("\xffaa", "\xffAa".toLowerCase());
+  Expect.equals("\xffaa", "\xffaA".toLowerCase());
 }
diff --git a/tests/html/canvas_test.dart b/tests/html/canvas_test.dart
index 2888cb5..307be78 100644
--- a/tests/html/canvas_test.dart
+++ b/tests/html/canvas_test.dart
@@ -37,13 +37,11 @@
     var url = canvas.toDataUrl();
 
     var img = new ImageElement();
-    img.onLoad.listen(expectAsync1((_) {
+    img.onLoad.listen(expectAsync((_) {
       expect(img.complete, true);
     }));
     img.onError.listen((_) {
-      guardAsync(() {
-        expect(true, isFalse, reason: 'URL failed to load.');
-      });
+      fail('URL failed to load.');
     });
     img.src = url;
   });
diff --git a/tests/html/canvasrenderingcontext2d_test.dart b/tests/html/canvasrenderingcontext2d_test.dart
index 3f17dc9..fa4402f 100644
--- a/tests/html/canvasrenderingcontext2d_test.dart
+++ b/tests/html/canvasrenderingcontext2d_test.dart
@@ -339,7 +339,7 @@
       var dataUrl = otherCanvas.toDataUrl('image/gif');
       var img = new ImageElement();
 
-      img.onLoad.listen(expectAsync1((_) {
+      img.onLoad.listen(expectAsync((_) {
         context.drawImage(img, 50, 50);
 
         expectPixelFilled(50, 50);
@@ -350,9 +350,7 @@
         expectPixelUnfilled(70, 70);
       }));
       img.onError.listen((_) {
-        guardAsync(() {
-          fail('URL failed to load.');
-        });
+        fail('URL failed to load.');
       });
       img.src = dataUrl;
     });
@@ -362,7 +360,7 @@
       var dataUrl = otherCanvas.toDataUrl('image/gif');
       var img = new ImageElement();
 
-      img.onLoad.listen(expectAsync1((_) {
+      img.onLoad.listen(expectAsync((_) {
         context.drawImageToRect(img, new Rectangle(50, 50, 20, 20));
 
         expectPixelFilled(50, 50);
@@ -375,9 +373,7 @@
         expectPixelUnfilled(80, 80);
       }));
       img.onError.listen((_) {
-        guardAsync(() {
-          fail('URL failed to load.');
-        });
+        fail('URL failed to load.');
       });
       img.src = dataUrl;
     });
@@ -389,7 +385,7 @@
       var dataUrl = otherCanvas.toDataUrl('image/gif');
       var img = new ImageElement();
 
-      img.onLoad.listen(expectAsync1((_) {
+      img.onLoad.listen(expectAsync((_) {
         // This will take a 6x6 square from the first canvas from position 2,2
         // and then scale it to a 20x20 square and place it to the second
         // canvas at 50,50.
@@ -412,9 +408,7 @@
         expectPixelUnfilled(80, 80);
       }));
       img.onError.listen((_) {
-        guardAsync(() {
-          fail('URL failed to load.');
-        });
+        fail('URL failed to load.');
       });
       img.src = dataUrl;
     });
@@ -482,7 +476,7 @@
     tearDown(tearDownFunc);
 
     test('with 3 params', () {
-      video.onCanPlay.listen(expectAsync1((_) {
+      video.onCanPlay.listen(expectAsync((_) {
         context.drawImage(video, 50, 50);
 
         expectPixelFilled(50, 50);
@@ -494,9 +488,7 @@
       }));
 
       video.onError.listen((_) {
-        guardAsync(() {
-          fail('URL failed to load.');
-        });
+        fail('URL failed to load.');
       });
 
       if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') {
@@ -510,7 +502,7 @@
     });
 
     test('with 5 params', () {
-      video.onCanPlay.listen(expectAsync1((_) {
+      video.onCanPlay.listen(expectAsync((_) {
         context.drawImageToRect(video, new Rectangle(50, 50, 20, 20));
 
         expectPixelFilled(50, 50);
@@ -523,9 +515,7 @@
         expectPixelUnfilled(80, 80);
       }));
       video.onError.listen((_) {
-        guardAsync(() {
-          fail('URL failed to load.');
-        });
+        fail('URL failed to load.');
       });
 
       if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') {
@@ -540,7 +530,7 @@
     });
 
     test('with 9 params', () {
-      video.onCanPlay.listen(expectAsync1((_) {
+      video.onCanPlay.listen(expectAsync((_) {
         context.drawImageToRect(video, new Rectangle(50, 50, 20, 20),
           sourceRect: new Rectangle(2, 2, 6, 6));
 
@@ -554,9 +544,7 @@
         expectPixelUnfilled(80, 80);
       }));
       video.onError.listen((_) {
-        guardAsync(() {
-          fail('URL failed to load.');
-        });
+        fail('URL failed to load.');
       });
 
       if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') {
@@ -578,7 +566,7 @@
     test('with 9 params', () {
       video = new VideoElement();
       canvas = new CanvasElement();
-      video.onCanPlay.listen(expectAsync1((_) {
+      video.onCanPlay.listen(expectAsync((_) {
         context.drawImageToRect(video, new Rectangle(50, 50, 20, 20),
           sourceRect: new Rectangle(2, 2, 6, 6));
 
@@ -592,9 +580,7 @@
         expectPixelUnfilled(80, 80);
       }));
       video.onError.listen((_) {
-        guardAsync(() {
-          fail('URL failed to load.');
-        });
+        fail('URL failed to load.');
       });
 
       if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') {
diff --git a/tests/html/cssstyledeclaration_test.dart b/tests/html/cssstyledeclaration_test.dart
index 0634b34..12a5f15 100644
--- a/tests/html/cssstyledeclaration_test.dart
+++ b/tests/html/cssstyledeclaration_test.dart
@@ -86,7 +86,7 @@
     document.body.children.add(element);
 
     // Need to wait one tick after the element has been added to the page.
-    new Timer(const Duration(milliseconds: 10), expectAsync0(() {
+    new Timer(const Duration(milliseconds: 10), expectAsync(() {
       element.style.textDecoration = 'underline';
       var style = element.getComputedStyle();
       expect(style.textDecoration, contains('underline'));
diff --git a/tests/html/custom/regress_194523002_test.dart b/tests/html/custom/regress_194523002_test.dart
new file mode 100644
index 0000000..f7a5ae1
--- /dev/null
+++ b/tests/html/custom/regress_194523002_test.dart
@@ -0,0 +1,35 @@
+// 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.
+
+// Regression test for CL 194523002.
+
+library js_custom_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'dart:html';
+import '../utils.dart';
+
+class A extends HtmlElement {
+  static final tag = 'x-a';
+  factory A() => new Element.tag(tag);
+  A.created() : super.created();
+}
+
+main() {
+  useHtmlConfiguration();
+
+  // Adapted from Blink's
+  // fast/dom/custom/constructor-calls-created-synchronously test.
+
+  var registered = false;
+  setUp(() {
+    return customElementsReady.then((_) {
+      if (!registered) {
+        registered = true;
+        document.register(A.tag, A);
+      }
+    });
+  });
+}
diff --git a/tests/html/dromaeo_smoke_test.dart b/tests/html/dromaeo_smoke_test.dart
index 1334954..51ebf35 100644
--- a/tests/html/dromaeo_smoke_test.dart
+++ b/tests/html/dromaeo_smoke_test.dart
@@ -46,7 +46,7 @@
 
   test('dromaeo runs', () {
     new Timer.periodic(new Duration(milliseconds: 500),
-                       expectAsyncUntil1((timer) {
+                       expectAsyncUntil((timer) {
       if (document.query('.alldone') != null) {
         timer.cancel();
         isDone = true;
diff --git a/tests/html/element_test.dart b/tests/html/element_test.dart
index 3d6c8ee..936eb68 100644
--- a/tests/html/element_test.dart
+++ b/tests/html/element_test.dart
@@ -774,14 +774,14 @@
       document.body.append(selectorOne);
       document.body.append(selectorTwo);
 
-      document.body.onClick.matches('.selector').listen(expectAsync1(
+      document.body.onClick.matches('.selector').listen(expectAsync(
           (Event event) {
         expect(event.currentTarget, document.body);
         expect(event.target, clickOne);
         expect(event.matchingTarget, selectorOne);
       }));
 
-      selectorOne.onClick.matches('.selector').listen(expectAsync1(
+      selectorOne.onClick.matches('.selector').listen(expectAsync(
           (Event event) {
         expect(event.currentTarget, selectorOne);
         expect(event.target, clickOne);
diff --git a/tests/html/event_test.dart b/tests/html/event_test.dart
index 6f135ba..e8f743b 100644
--- a/tests/html/event_test.dart
+++ b/tests/html/event_test.dart
@@ -143,7 +143,7 @@
 
   test('DOMMutationEvent', () {
     var div = new DivElement();
-    div.on['DOMSubtreeModified'].add(expectAsync1((DOMMutationEvent e) {}));
+    div.on['DOMSubtreeModified'].add(expectAsync((DOMMutationEvent e) {}));
     div.append(new SpanElement());
   });
 
diff --git a/tests/html/events_test.dart b/tests/html/events_test.dart
index 3b87540..b2c448a 100644
--- a/tests/html/events_test.dart
+++ b/tests/html/events_test.dart
@@ -96,8 +96,8 @@
     document.body.append(element);
 
     // runZoned executes the function synchronously, but we don't want to
-    // rely on this. We therefore wrap it into an expectAsync0.
-    runZoned(expectAsync0(() {
+    // rely on this. We therefore wrap it into an expectAsync.
+    runZoned(expectAsync(() {
       Zone zone = Zone.current;
       expect(zone, isNot(equals(Zone.ROOT)));
 
@@ -106,13 +106,13 @@
       void handler(Event e) {
         expect(Zone.current, equals(zone));
 
-        scheduleMicrotask(expectAsync0(() {
+        scheduleMicrotask(expectAsync(() {
           expect(Zone.current, equals(zone));
           sub.cancel();
         }));
       }
 
-      sub = element.on['test'].listen(expectAsync1(handler));
+      sub = element.on['test'].listen(expectAsync(handler));
     }));
     element.dispatchEvent(new Event('test'));
   });
diff --git a/tests/html/filereader_test.dart b/tests/html/filereader_test.dart
index 9eb8a23..07d5a58 100644
--- a/tests/html/filereader_test.dart
+++ b/tests/html/filereader_test.dart
@@ -13,7 +13,7 @@
 
   test('readAsText', () {
       var reader = new FileReader();
-      reader.onLoad.listen(expectAsync1((event) {
+      reader.onLoad.listen(expectAsync((event) {
         var result = reader.result;
         expect(result, equals('hello world'));
       }));
@@ -22,7 +22,7 @@
 
   test('readAsArrayBuffer', () {
       var reader = new FileReader();
-      reader.onLoad.listen(expectAsync1((event) {
+      reader.onLoad.listen(expectAsync((event) {
         var result = reader.result;
         expect(result is Uint8List, isTrue);
         expect(result, orderedEquals([65, 66, 67]));
@@ -32,7 +32,7 @@
 
   test('readDataUrl', () {
       var reader = new FileReader();
-      reader.onLoad.listen(expectAsync1((event) {
+      reader.onLoad.listen(expectAsync((event) {
         var result = reader.result;
         expect(result is String, isTrue);
         expect(result.startsWith('data:'), isTrue);
diff --git a/tests/html/form_data_test.dart b/tests/html/form_data_test.dart
index 140c253..0435f86 100644
--- a/tests/html/form_data_test.dart
+++ b/tests/html/form_data_test.dart
@@ -8,12 +8,6 @@
 import '../../pkg/unittest/lib/html_individual_config.dart';
 import 'dart:html';
 
-void fail(message) {
-  guardAsync(() {
-    expect(false, isTrue, reason: message);
-  });
-}
-
 void main() {
   // TODO(efortuna): This is a bad test. Revisit when we have tests that can run
   // both a server and fire up a browser.
@@ -78,8 +72,8 @@
         xhr.open('POST',
             '${window.location.protocol}//${window.location.host}/echo');
 
-        xhr.onLoad.listen(expectAsync1((e) {
-          expect(xhr.responseText.contains(blobString), true);
+        xhr.onLoad.listen(expectAsync((e) {
+          expect(xhr.responseText, contains(blobString));
         }));
         xhr.onError.listen((e) {
           fail('$e');
diff --git a/tests/html/history_test.dart b/tests/html/history_test.dart
index 7ee08ce..f8fd547 100644
--- a/tests/html/history_test.dart
+++ b/tests/html/history_test.dart
@@ -43,8 +43,8 @@
         expect(window.location.href.endsWith('dummy2'), isTrue);
 
         // Need to wait a frame or two to let the pushState events occur.
-        new Timer(const Duration(milliseconds: 100), expectAsync0(() {
-          window.onPopState.first.then(expectAsync1((_){
+        new Timer(const Duration(milliseconds: 100), expectAsync(() {
+          window.onPopState.first.then(expectAsync((_){
             expect(window.history.length, length);
             expect(window.location.href.endsWith('dummy1'), isTrue);
           }));
diff --git a/tests/html/html.status b/tests/html/html.status
index 49cc606..2f7368c 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -22,13 +22,15 @@
 [ $compiler == none && ($runtime == drt || $runtime == dartium) && $mode == debug && $system == macos]
 audiobuffersourcenode_test: Pass, Fail, Crash # http://crbug.com/256601
 
+[ $compiler == none && ($runtime == drt || $runtime == dartium) && $checked ]
+xhr_test/xhr: Pass, RuntimeError # Issue 18049
+
 [ $compiler == none && $runtime == dartium && $system == macos]
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Pass,Fail # Issue 11834
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellInAndroid) ]
 # postMessage in dartium always transfers the typed array buffer, never a view
 postmessage_structured_test/typed_arrays: Fail
-xhr_test: Pass, Fail # Issue 12648
 xhr_test/json: Fail # Issue 13069
 async_test: Fail # Background timers not implemented.
 keyboard_event_test: Fail # Issue 13902
@@ -147,6 +149,7 @@
 
 [ $runtime == ie11 ]
 custom/document_register_type_extensions_test/single-parameter: Fail # Issue 13193.
+canvasrenderingcontext2d_test/arc: Pass, Fail # Pixel unexpected value. Please triage this failure.
 
 # IE11 Feature support statuses-
 # These results not yet noted in platform support annotations.
diff --git a/tests/html/indexeddb_2_test.dart b/tests/html/indexeddb_2_test.dart
index 028dc8b..efd4d80 100644
--- a/tests/html/indexeddb_2_test.dart
+++ b/tests/html/indexeddb_2_test.dart
@@ -23,19 +23,19 @@
 
   var db;
   // Delete any existing DBs.
-  return html.window.indexedDB.deleteDatabase(dbName).then(expectAsync1((_) {
+  return html.window.indexedDB.deleteDatabase(dbName).then(expectAsync((_) {
       return html.window.indexedDB.open(dbName, version: version,
         onUpgradeNeeded: createObjectStore);
-    })).then(expectAsync1((result) {
+    })).then(expectAsync((result) {
       db = result;
       var transaction = db.transactionList([storeName], 'readwrite');
       transaction.objectStore(storeName).put(value, key);
 
       return transaction.completed;
-    })).then(expectAsync1((db) {
+    })).then(expectAsync((db) {
       var transaction = db.transaction(storeName, 'readonly');
       return transaction.objectStore(storeName).getObject(key);
-    })).then(expectAsync1((object) {
+    })).then(expectAsync((object) {
       db.close();
       check(value, object);
     })).catchError((e) {
diff --git a/tests/html/isolates_test.dart b/tests/html/isolates_test.dart
index f0da5f0..fa703d2 100644
--- a/tests/html/isolates_test.dart
+++ b/tests/html/isolates_test.dart
@@ -47,21 +47,17 @@
     port.close();
   });
   test('NonDOMIsolates', () {
-    var callback = expectAsync0((){});
+    var callback = expectAsync((){});
     var response = new isolate.ReceivePort();
     var remote = isolate.Isolate.spawn(isolateEntry, response.sendPort);
     response.first.then((port) {
       final msg1 = 'foo';
       final msg2 = 'bar';
       sendReceive(port, msg1).then((response) {
-        guardAsync(() {
-          expect(response, equals(responseFor(msg1)));
-          sendReceive(port, msg2).then((response) {
-            guardAsync(() {
-              expect(response, equals(responseFor(msg2)));
-              callback();
-            });
-          });
+        expect(response, equals(responseFor(msg1)));
+        sendReceive(port, msg2).then((response) {
+          expect(response, equals(responseFor(msg2)));
+          callback();
         });
       });
     });
diff --git a/tests/html/js_interop_1_test.dart b/tests/html/js_interop_1_test.dart
index 7439992..7ba954d 100644
--- a/tests/html/js_interop_1_test.dart
+++ b/tests/html/js_interop_1_test.dart
@@ -21,7 +21,7 @@
   test('js-to-dart-post-message', () {
     var subscription = null;
     var complete = false;
-    subscription = window.onMessage.listen(expectAsyncUntil1(
+    subscription = window.onMessage.listen(expectAsyncUntil(
         (e) {
           if (e.data == 'hello') {
             subscription.cancel();
diff --git a/tests/html/keyboard_event_test.dart b/tests/html/keyboard_event_test.dart
index 01aff76..a29f02f 100644
--- a/tests/html/keyboard_event_test.dart
+++ b/tests/html/keyboard_event_test.dart
@@ -31,7 +31,7 @@
 
   test('constructKeyEvent', () {
     var stream = KeyEvent.keyPressEvent.forTarget(document.body);
-    var subscription = stream.listen(expectAsync1((keyEvent) {
+    var subscription = stream.listen(expectAsync((keyEvent) {
       expect(keyEvent.charCode, 97);
       expect(keyEvent.keyCode, 65);
     }));
@@ -41,7 +41,7 @@
     // Capital "A":
     stream.add(new KeyEvent('keydown', keyCode: 16, charCode: 0));
 
-    subscription = stream.listen(expectAsync1((keyEvent) {
+    subscription = stream.listen(expectAsync((keyEvent) {
       expect(keyEvent.charCode, 65);
       expect(keyEvent.keyCode, 65);
     }));
@@ -56,17 +56,17 @@
     var streamPress = KeyEvent.keyPressEvent.forTarget(document.body);
     var streamUp = KeyEvent.keyUpEvent.forTarget(document.body);
 
-    var subscription = streamDown.listen(expectAsync1((keyEvent) {
+    var subscription = streamDown.listen(expectAsync((keyEvent) {
       expect(keyEvent.keyCode, isIn([16, 191]));
       expect(keyEvent.charCode, 0);
     }, count: 2));
 
-    var subscription2 = streamPress.listen(expectAsync1((keyEvent) {
+    var subscription2 = streamPress.listen(expectAsync((keyEvent) {
       expect(keyEvent.keyCode, 23);
       expect(keyEvent.charCode, 63);
     }));
 
-    var subscription3 = streamUp.listen(expectAsync1((keyEvent) {
+    var subscription3 = streamUp.listen(expectAsync((keyEvent) {
       expect(keyEvent.keyCode, isIn([16, 191]));
       expect(keyEvent.charCode, 0);
     }, count: 2));
@@ -84,7 +84,7 @@
   });
 
   test('KeyEventKeyboardEvent', () {
-    window.onKeyDown.listen(expectAsync1((KeyboardEvent event) {
+    window.onKeyDown.listen(expectAsync((KeyboardEvent event) {
       expect(event.keyCode, 16);
     }));
     var streamDown = KeyEvent.keyDownEvent.forTarget(document.body);
diff --git a/tests/html/mutationobserver_test.dart b/tests/html/mutationobserver_test.dart
index 582f084..8804ab6 100644
--- a/tests/html/mutationobserver_test.dart
+++ b/tests/html/mutationobserver_test.dart
@@ -51,7 +51,7 @@
         return () => done;
       }
 
-      return expectAsyncUntil2(callback, () => done);
+      return expectAsyncUntil(callback, () => done);
     }
 
     test('empty options is syntax error', () {
diff --git a/tests/html/native_gc_test.dart b/tests/html/native_gc_test.dart
index 14ad75d..9aaf72e 100644
--- a/tests/html/native_gc_test.dart
+++ b/tests/html/native_gc_test.dart
@@ -47,7 +47,7 @@
       triggerMajorGC();
     }
 
-    testDiv.onClick.listen(expectAsync1((e) {}));
+    testDiv.onClick.listen(expectAsync((e) {}));
     window.postMessage(message, '*');
   });
 }
diff --git a/tests/html/postmessage_structured_test.dart b/tests/html/postmessage_structured_test.dart
index c41c335..c586fd9 100644
--- a/tests/html/postmessage_structured_test.dart
+++ b/tests/html/postmessage_structured_test.dart
@@ -38,7 +38,7 @@
             """;
           var completed = false;
           var subscription = null;
-          subscription = window.onMessage.listen(expectAsyncUntil1(
+          subscription = window.onMessage.listen(expectAsyncUntil(
             (e) {
               var data = e.data;
               if (data is String) return; // Messages from unit test protocol.
@@ -65,7 +65,7 @@
         """;
       var completed = false;
       var subscription = null;
-      subscription = window.onMessage.listen(expectAsyncUntil1(
+      subscription = window.onMessage.listen(expectAsyncUntil(
         (e) {
           var data = e.data;
           if (data is String) return;    // Messages from unit test protocol.
@@ -95,7 +95,7 @@
         """;
       var completed = false;
       var subscription = null;
-      subscription = window.onMessage.listen(expectAsyncUntil1(
+      subscription = window.onMessage.listen(expectAsyncUntil(
         (e) {
           var data = e.data;
           if (data is String) return;    // Messages from unit test protocol.
diff --git a/tests/html/request_animation_frame_test.dart b/tests/html/request_animation_frame_test.dart
index 2bf8a0c..f240b70 100644
--- a/tests/html/request_animation_frame_test.dart
+++ b/tests/html/request_animation_frame_test.dart
@@ -12,14 +12,14 @@
 
   test('oneShot', () {
       var frame = window.requestAnimationFrame(
-          expectAsync1((timestamp) { }));
+          expectAsync((timestamp) { }));
     });
 
   test('twoShot', () {
       var frame = window.requestAnimationFrame(
-          expectAsync1((timestamp1) {
+          expectAsync((timestamp1) {
             window.requestAnimationFrame(
-                expectAsync1((timestamp2) {
+                expectAsync((timestamp2) {
                     // Not monotonic on Safari and IE.
                     // expect(timestamp2, greaterThan(timestamp1),
                     //    reason: 'timestamps ordered');
@@ -29,7 +29,7 @@
 
 
   // How do we test that a callback is never called?  We can't wrap the uncalled
-  // callback with 'expectAsync1'.  Will request several frames and try
+  // callback with 'expectAsync'.  Will request several frames and try
   // cancelling the one that is not the last.
   test('cancel1', () {
       var frame1 = window.requestAnimationFrame(
@@ -37,19 +37,19 @@
             throw new Exception('Should have been cancelled');
           });
       var frame2 = window.requestAnimationFrame(
-          expectAsync1((timestamp2) { }));
+          expectAsync((timestamp2) { }));
       window.cancelAnimationFrame(frame1);
     });
 
   test('cancel2', () {
       var frame1 = window.requestAnimationFrame(
-          expectAsync1((timestamp1) { }));
+          expectAsync((timestamp1) { }));
       var frame2 = window.requestAnimationFrame(
           (timestamp2) {
             throw new Exception('Should have been cancelled');
           });
       var frame3 = window.requestAnimationFrame(
-          expectAsync1((timestamp3) { }));
+          expectAsync((timestamp3) { }));
       window.cancelAnimationFrame(frame2);
     });
 }
diff --git a/tests/html/transition_event_test.dart b/tests/html/transition_event_test.dart
index 8e04110..646061f 100644
--- a/tests/html/transition_event_test.dart
+++ b/tests/html/transition_event_test.dart
@@ -29,8 +29,8 @@
         element.style.background = 'red';
         element.style.transition = 'opacity .1s';
 
-        new Timer(const Duration(milliseconds: 100), expectAsync0(() {
-          element.onTransitionEnd.first.then(expectAsync1((e) {
+        new Timer(const Duration(milliseconds: 100), expectAsync(() {
+          element.onTransitionEnd.first.then(expectAsync((e) {
             expect(e is TransitionEvent, isTrue);
             expect(e.propertyName, 'opacity');
           }));
diff --git a/tests/html/url_test.dart b/tests/html/url_test.dart
index c9bd374..6852fc6 100644
--- a/tests/html/url_test.dart
+++ b/tests/html/url_test.dart
@@ -42,13 +42,11 @@
       expect(url, startsWith('blob:'));
 
       var img = new ImageElement();
-      img.onLoad.listen(expectAsync1((_) {
+      img.onLoad.listen(expectAsync((_) {
         expect(img.complete, true);
       }));
       img.onError.listen((_) {
-        guardAsync(() {
-          expect(true, isFalse, reason: 'URL failed to load.');
-        });
+        fail('URL failed to load.');
       });
       img.src = url;
     });
@@ -61,12 +59,10 @@
 
       var img = new ImageElement();
       // Image should fail to load since the URL was revoked.
-      img.onError.listen(expectAsync1((_) {
+      img.onError.listen(expectAsync((_) {
       }));
       img.onLoad.listen((_) {
-        guardAsync(() {
-          expect(true, isFalse, reason: 'URL should not have loaded.');
-        });
+        fail('URL should not have loaded.');
       });
       img.src = url;
     });
diff --git a/tests/html/websql_test.dart b/tests/html/websql_test.dart
index 2c77b6a..b67d0aa 100644
--- a/tests/html/websql_test.dart
+++ b/tests/html/websql_test.dart
@@ -5,12 +5,6 @@
 import '../../pkg/unittest/lib/unittest.dart';
 import '../../pkg/unittest/lib/html_individual_config.dart';
 
-void fail(message) {
-  guardAsync(() {
-      expect(false, isTrue, reason: message);
-    });
-}
-
 Future<SqlTransaction> transaction(SqlDatabase db) {
   final completer = new Completer<SqlTransaction>.sync();
 
diff --git a/tests/html/wheelevent_test.dart b/tests/html/wheelevent_test.dart
index 4acb908..d733a94 100644
--- a/tests/html/wheelevent_test.dart
+++ b/tests/html/wheelevent_test.dart
@@ -16,7 +16,7 @@
     var element = new DivElement();
     var eventType = Element.mouseWheelEvent.getEventType(element);
 
-    element.onMouseWheel.listen(expectAsync1((e) {
+    element.onMouseWheel.listen(expectAsync((e) {
       expect(e.screen.x, 100);
       expect(e.deltaX, 0);
       expect(e.deltaY.toDouble(), 240.0);
@@ -33,7 +33,7 @@
     var element = new DivElement();
     var eventType = Element.mouseWheelEvent.getEventType(element);
 
-    element.onMouseWheel.listen(expectAsync1((e) {
+    element.onMouseWheel.listen(expectAsync((e) {
       expect(e.screen.x, 100);
       expect(e.deltaX, 0);
       expect(e.deltaY.toDouble(), 240.0);
diff --git a/tests/html/worker_api_test.dart b/tests/html/worker_api_test.dart
index e1ab1a4..7dd829c 100644
--- a/tests/html/worker_api_test.dart
+++ b/tests/html/worker_api_test.dart
@@ -27,6 +27,6 @@
     var response = new ReceivePort();
     var remote = Isolate.spawn(worker, ['', response.sendPort]);
     remote.then((_) => response.first)
-        .then(expectAsync1((reply) => expect(reply, equals('Hello from Worker'))));
+        .then(expectAsync((reply) => expect(reply, equals('Hello from Worker'))));
   });
 }
diff --git a/tests/html/worker_test.dart b/tests/html/worker_test.dart
index d24394b..018d7fc 100644
--- a/tests/html/worker_test.dart
+++ b/tests/html/worker_test.dart
@@ -37,7 +37,7 @@
       var blob = new Blob([workerScript], 'text/javascript');
       var url = Url.createObjectUrl(blob);
       var worker = new Worker(url);
-      var test = expectAsync1((e) {
+      var test = expectAsync((e) {
         expect(e.data, 'WorkerMessage');
       });
       worker.onMessage.first.then(test);
diff --git a/tests/html/xhr_cross_origin_test.dart b/tests/html/xhr_cross_origin_test.dart
index 5a0f6cb..16e35cd 100644
--- a/tests/html/xhr_cross_origin_test.dart
+++ b/tests/html/xhr_cross_origin_test.dart
@@ -84,17 +84,15 @@
       var url =  '$host/root_dart/tests/html/xhr_cross_origin_data.txt';
       var xhr = new HttpRequest();
       xhr.open('GET', url, async: true);
-      var validate = expectAsync1((data) {
+      var validate = expectAsync((data) {
         expect(data, contains('feed'));
         expect(data['feed'], contains('entry'));
         expect(data, isMap);
       });
       xhr.onReadyStateChange.listen((e) {
-        guardAsync(() {
-          if (xhr.readyState == HttpRequest.DONE) {
-            validate(JSON.decode(xhr.response));
-          }
-        });
+        if (xhr.readyState == HttpRequest.DONE) {
+          validate(JSON.decode(xhr.response));
+        }
       });
       xhr.send();
     });
diff --git a/tests/html/xhr_test.dart b/tests/html/xhr_test.dart
index 78b8c5a..d475529 100644
--- a/tests/html/xhr_test.dart
+++ b/tests/html/xhr_test.dart
@@ -10,12 +10,6 @@
 import 'package:unittest/html_individual_config.dart';
 import 'package:unittest/unittest.dart';
 
-void fail(message) {
-  guardAsync(() {
-    expect(false, isTrue, reason: message);
-  });
-}
-
 main() {
   useHtmlIndividualConfiguration();
   // Cache blocker is a workaround for:
@@ -59,7 +53,7 @@
     test('XHR No file', () {
       HttpRequest xhr = new HttpRequest();
       xhr.open("GET", "NonExistingFile", async: true);
-      xhr.onReadyStateChange.listen(expectAsyncUntil1((event) {
+      xhr.onReadyStateChange.listen(expectAsyncUntil((event) {
         if (xhr.readyState == HttpRequest.DONE) {
           validate404(xhr);
         }
@@ -72,11 +66,11 @@
 
       var xhr = new HttpRequest();
       xhr.open('GET', url, async: true);
-      xhr.onReadyStateChange.listen(expectAsyncUntil1((e) {
+      xhr.onReadyStateChange.listen(expectAsyncUntil((e) {
         if (xhr.readyState == HttpRequest.DONE) {
           validate200Response(xhr);
 
-          Timer.run(expectAsync0(() {
+          Timer.run(expectAsync(() {
             expect(loadEndCalled, HttpRequest.supportsLoadEndEvent);
           }));
         }
@@ -91,7 +85,7 @@
     test('XHR.request No file', () {
       HttpRequest.request('NonExistingFile').then(
         (_) { fail('Request should not have succeeded.'); },
-        onError: expectAsync1((error) {
+        onError: expectAsync((error) {
           var xhr = error.target;
           expect(xhr.readyState, equals(HttpRequest.DONE));
           validate404(xhr);
@@ -99,7 +93,7 @@
     });
 
     test('XHR.request file', () {
-      HttpRequest.request(url).then(expectAsync1((xhr) {
+      HttpRequest.request(url).then(expectAsync((xhr) {
         expect(xhr.readyState, equals(HttpRequest.DONE));
         validate200Response(xhr);
       }));
@@ -110,7 +104,7 @@
       HttpRequest.request(url,
         onProgress: (_) {
           progressCalled = true;
-        }).then(expectAsync1(
+        }).then(expectAsync(
           (xhr) {
             expect(xhr.readyState, equals(HttpRequest.DONE));
             expect(progressCalled, HttpRequest.supportsProgressEvent);
@@ -121,7 +115,7 @@
     test('XHR.request withCredentials No file', () {
       HttpRequest.request('NonExistingFile', withCredentials: true).then(
         (_) { fail('Request should not have succeeded.'); },
-        onError: expectAsync1((error) {
+        onError: expectAsync((error) {
           var xhr = error.target;
           expect(xhr.readyState, equals(HttpRequest.DONE));
           validate404(xhr);
@@ -129,20 +123,20 @@
     });
 
     test('XHR.request withCredentials file', () {
-      HttpRequest.request(url, withCredentials: true).then(expectAsync1((xhr) {
+      HttpRequest.request(url, withCredentials: true).then(expectAsync((xhr) {
         expect(xhr.readyState, equals(HttpRequest.DONE));
         validate200Response(xhr);
       }));
     });
 
     test('XHR.getString file', () {
-      HttpRequest.getString(url).then(expectAsync1((str) {}));
+      HttpRequest.getString(url).then(expectAsync((str) {}));
     });
 
     test('XHR.getString No file', () {
       HttpRequest.getString('NonExistingFile').then(
         (_) { fail('Succeeded for non-existing file.'); },
-        onError: expectAsync1((error) {
+        onError: expectAsync((error) {
           validate404(error.target);
         }));
     });
@@ -151,7 +145,7 @@
       if (Platform.supportsTypedData) {
         HttpRequest.request(url, responseType: 'arraybuffer',
           requestHeaders: {'Content-Type': 'text/xml'}).then(
-          expectAsync1((xhr) {
+          expectAsync((xhr) {
             expect(xhr.status, equals(200));
             var byteBuffer = xhr.response;
             expect(byteBuffer, new isInstanceOf<ByteBuffer>());
@@ -189,7 +183,7 @@
         xhr.send(new Uint8List.view(data.buffer));
 
         return xhr.onLoad.first.then((_) {
-          expect(progressCalled, isTrue);
+          expect(progressCalled, isTrue, reason: 'onProgress should be fired');
         });
       });
     }
@@ -239,7 +233,7 @@
           method: 'POST',
           sendData: JSON.encode(data),
           responseType: 'json').then(
-          expectAsync1((xhr) {
+          expectAsync((xhr) {
             expect(xhr.status, equals(200));
             var json = xhr.response;
             expect(json, equals(data));
diff --git a/tests/isolate/browser/compute_this_script_browser_test.dart b/tests/isolate/browser/compute_this_script_browser_test.dart
index 63a886d..b7464fc 100644
--- a/tests/isolate/browser/compute_this_script_browser_test.dart
+++ b/tests/isolate/browser/compute_this_script_browser_test.dart
@@ -26,7 +26,7 @@
   document.body.append(script);
   test('spawn with other script tags in page', () {
     ReceivePort port = new ReceivePort();
-    port.listen(expectAsync1((msg) {
+    port.listen(expectAsync((msg) {
       expect(msg, equals('re: hi'));
       port.close();
     }));
diff --git a/tests/isolate/browser/typed_data_message_test.dart b/tests/isolate/browser/typed_data_message_test.dart
index 61954b9..d23c7ff 100644
--- a/tests/isolate/browser/typed_data_message_test.dart
+++ b/tests/isolate/browser/typed_data_message_test.dart
@@ -98,13 +98,13 @@
       for (int i = 0; i < elements.length; i++) {
         var sentObject = elements[i];
         var idx = i;
-        sendReceive(remote, sentObject).then(expectAsync1((var receivedObject) {
+        sendReceive(remote, sentObject).then(expectAsync((var receivedObject) {
           VerifyObject(idx, receivedObject);
         }));
       }
 
       // Shutdown the MessageServer.
-      sendReceive(remote, -1).then(expectAsync1((int message) {
+      sendReceive(remote, -1).then(expectAsync((int message) {
           expect(message, elements.length);
         }));
     });
diff --git a/tests/isolate/count_test.dart b/tests/isolate/count_test.dart
index 881ac6b..b6f1780 100644
--- a/tests/isolate/count_test.dart
+++ b/tests/isolate/count_test.dart
@@ -31,7 +31,7 @@
     Isolate.spawn(countMessages, local.sendPort);
     SendPort remote;
     int count = 0;
-    var done = expectAsync0((){});
+    var done = expectAsync((){});
     local.listen((msg) {
       switch (msg[0]) {
         case "init":
diff --git a/tests/isolate/cross_isolate_message_test.dart b/tests/isolate/cross_isolate_message_test.dart
index 56181c8..a68dedb 100644
--- a/tests/isolate/cross_isolate_message_test.dart
+++ b/tests/isolate/cross_isolate_message_test.dart
@@ -40,7 +40,7 @@
   test("send message cross isolates ", () {
     ReceivePort fromIsolate1 = new ReceivePort();
     Isolate.spawn(crossIsolate1, fromIsolate1.sendPort);
-    var done = expectAsync0((){});
+    var done = expectAsync((){});
     fromIsolate1.listen((msg) {
       switch (msg[0]) {
         case "ready1":
diff --git a/tests/isolate/illegal_msg_function_test.dart b/tests/isolate/illegal_msg_function_test.dart
index 8767994..5493abe 100644
--- a/tests/isolate/illegal_msg_function_test.dart
+++ b/tests/isolate/illegal_msg_function_test.dart
@@ -27,7 +27,7 @@
     Future spawn = Isolate.spawn(echo, port.sendPort);
     var caught_exception = false;
     var stream = port.asBroadcastStream();
-    stream.first.then(expectAsync1((snd) {
+    stream.first.then(expectAsync((snd) {
       try {
         snd.send(function);
       } catch (e) {
@@ -37,7 +37,7 @@
       if (caught_exception) {
         port.close();
       } else {
-        stream.first.then(expectAsync1((msg) {
+        stream.first.then(expectAsync((msg) {
           print("from worker ${msg}");
         }));
       }
diff --git a/tests/isolate/illegal_msg_mirror_test.dart b/tests/isolate/illegal_msg_mirror_test.dart
index dcf80a01..c739256 100644
--- a/tests/isolate/illegal_msg_mirror_test.dart
+++ b/tests/isolate/illegal_msg_mirror_test.dart
@@ -32,7 +32,7 @@
     Future spawn = Isolate.spawn(echo, port.sendPort);
     var caught_exception = false;
     var stream = port.asBroadcastStream();
-    stream.first.then(expectAsync1((snd) {
+    stream.first.then(expectAsync((snd) {
       try {
         snd.send(methodMirror);
       } catch (e) {
@@ -42,7 +42,7 @@
       if (caught_exception) {
         port.close();
       } else {
-        stream.first.then(expectAsync1((msg) {
+        stream.first.then(expectAsync((msg) {
           print("from worker ${msg}");
         }));
       }
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 60c52fe..eb5f276 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -9,6 +9,9 @@
 [ $runtime == vm && $arch == mips && $mode == debug ]
 mandel_isolate_test: Skip # Uses 600 MB Ram on our 1 GB test device.
 
+[ $runtime == vm && $arch == simarm64 ]
+*: Skip
+
 [ $compiler == none || $compiler == dart2dart ]
 serialization_test: SkipByDesign # Tests dart2js-specific serialization code
 isolate_throws_test/01: Skip # Issue 12587
@@ -69,10 +72,6 @@
 isolate_stress_test: Skip # Issue 14463
 spawn_uri_nested_vm_test: Skip # Issue 14463
 
-[ $csp ]
-spawn_uri_multi_test/none: Fail # http://dartbug.com/13454
-spawn_uri_test: Fail # http://dartbug.com/13454
-
 [ $jscl || $runtime == ie9 ]
 spawn_uri_multi_test/none: RuntimeError # http://dartbug.com/13544
 
diff --git a/tests/isolate/isolate_complex_messages_test.dart b/tests/isolate/isolate_complex_messages_test.dart
index 92c26d9..eda4e90 100644
--- a/tests/isolate/isolate_complex_messages_test.dart
+++ b/tests/isolate/isolate_complex_messages_test.dart
@@ -15,8 +15,8 @@
   test("complex messages are serialized correctly", () {
     ReceivePort local = new ReceivePort();
     Isolate.spawn(logMessages, local.sendPort);
-    var done = expectAsync0((){});
-    local.listen(expectAsync1((msg) {
+    var done = expectAsync((){});
+    local.listen(expectAsync((msg) {
       switch (msg[0]) {
         case "init":
           var remote = msg[1];
diff --git a/tests/isolate/mandel_isolate_test.dart b/tests/isolate/mandel_isolate_test.dart
index 7099abe..2cd3cb5 100644
--- a/tests/isolate/mandel_isolate_test.dart
+++ b/tests/isolate/mandel_isolate_test.dart
@@ -20,7 +20,7 @@
   configuration.timeout = const Duration(seconds: 480);
   test("Render Mandelbrot in parallel", () {
     final state = new MandelbrotState();
-    state._validated.future.then(expectAsync1((result) {
+    state._validated.future.then(expectAsync((result) {
       expect(result, isTrue);
     }));
     for (int i = 0; i < min(ISOLATES, N); i++) state.startClient(i);
diff --git a/tests/isolate/message2_test.dart b/tests/isolate/message2_test.dart
index eaa5c956..3b84e59 100644
--- a/tests/isolate/message2_test.dart
+++ b/tests/isolate/message2_test.dart
@@ -61,7 +61,7 @@
   test("map is equal after it is sent back and forth", () {
     ReceivePort port = new ReceivePort();
     Isolate.spawn(pingPong, port.sendPort);
-    port.first.then(expectAsync1((remote) {
+    port.first.then(expectAsync((remote) {
       Map m = new Map();
       m[1] = "eins";
       m[2] = "deux";
@@ -69,7 +69,7 @@
       m[4] = "four";
       ReceivePort replyPort = new ReceivePort();
       remote.send([m, replyPort.sendPort]);
-      replyPort.first.then(expectAsync1((var received) {
+      replyPort.first.then(expectAsync((var received) {
         MessageTest.mapEqualsDeep(m, received);
         remote.send(null);
       }));
diff --git a/tests/isolate/message_test.dart b/tests/isolate/message_test.dart
index ead8cfe..d687784 100644
--- a/tests/isolate/message_test.dart
+++ b/tests/isolate/message_test.dart
@@ -99,11 +99,11 @@
   test("send objects and receive them back", () {
     ReceivePort port = new ReceivePort();
     Isolate.spawn(pingPong, port.sendPort);
-    port.first.then(expectAsync1((remote) {
+    port.first.then(expectAsync((remote) {
       // Send objects and receive them back.
       for (int i = 0; i < MessageTest.elms.length; i++) {
         var sentObject = MessageTest.elms[i];
-        remoteCall(remote, sentObject).then(expectAsync1((var receivedObject) {
+        remoteCall(remote, sentObject).then(expectAsync((var receivedObject) {
           MessageTest.VerifyObject(i, receivedObject);
         }));
       }
@@ -133,7 +133,7 @@
       });
 
       // Shutdown the MessageServer.
-      remoteCall(remote, -1).then(expectAsync1((int message) {
+      remoteCall(remote, -1).then(expectAsync((int message) {
           expect(message, MessageTest.elms.length + 1);
       }));
     }));
diff --git a/tests/isolate/mint_maker_test.dart b/tests/isolate/mint_maker_test.dart
index 60b430f..fa200fc 100644
--- a/tests/isolate/mint_maker_test.dart
+++ b/tests/isolate/mint_maker_test.dart
@@ -150,7 +150,7 @@
 }
 
 _checkBalance(PurseWrapper wrapper, expected) {
-  wrapper.queryBalance(expectAsync1((int balance) {
+  wrapper.queryBalance(expectAsync((int balance) {
     expect(balance, equals(expected));
   }));
 }
@@ -158,11 +158,11 @@
 void main([args, port]) {
   if (testRemote(main, port)) return;
   test("creating purse, deposit, and query balance", () {
-    MintMakerWrapper.create().then(expectAsync1((mintMaker) {
-      mintMaker.makeMint(expectAsync1((MintWrapper mint) {
-        mint.createPurse(100, expectAsync1((PurseWrapper purse) {
+    MintMakerWrapper.create().then(expectAsync((mintMaker) {
+      mintMaker.makeMint(expectAsync((MintWrapper mint) {
+        mint.createPurse(100, expectAsync((PurseWrapper purse) {
           _checkBalance(purse, 100);
-          purse.sproutPurse(expectAsync1((PurseWrapper sprouted) {
+          purse.sproutPurse(expectAsync((PurseWrapper sprouted) {
             _checkBalance(sprouted, 0);
             _checkBalance(purse, 100);
 
diff --git a/tests/isolate/nested_spawn2_test.dart b/tests/isolate/nested_spawn2_test.dart
index ea6331e..fbeaeef 100644
--- a/tests/isolate/nested_spawn2_test.dart
+++ b/tests/isolate/nested_spawn2_test.dart
@@ -57,14 +57,14 @@
   test("spawned isolate can spawn other isolates", () {
     ReceivePort init = new ReceivePort();
     Isolate.spawn(isolateA, init.sendPort);
-    init.first.then(expectAsync1((port) {
-      _call(port, "launch nested!", expectAsync2((msg, replyTo) {
+    init.first.then(expectAsync((port) {
+      _call(port, "launch nested!", expectAsync((msg, replyTo) {
         expect(msg[0], "0");
-        _call(replyTo, msg1, expectAsync2((msg, replyTo) {
+        _call(replyTo, msg1, expectAsync((msg, replyTo) {
           expect(msg[0], "2");
-          _call(replyTo, msg3, expectAsync2((msg, replyTo) {
+          _call(replyTo, msg3, expectAsync((msg, replyTo) {
             expect(msg[0], "4");
-            _call(replyTo, msg5, expectAsync2((msg, _) {
+            _call(replyTo, msg5, expectAsync((msg, _) {
               expect(msg[0], "6");
             }));
           }));
diff --git a/tests/isolate/port_test.dart b/tests/isolate/port_test.dart
index c61e75d..e04b29c 100644
--- a/tests/isolate/port_test.dart
+++ b/tests/isolate/port_test.dart
@@ -9,7 +9,7 @@
 library PortTest;
 import "package:expect/expect.dart";
 import 'dart:isolate';
-import '../../pkg/unittest/lib/matcher.dart';
+import '../../pkg/matcher/lib/matcher.dart';
 
 main() {
   testHashCode();
diff --git a/tests/isolate/raw_port_test.dart b/tests/isolate/raw_port_test.dart
index a7cd2fb..1da1484 100644
--- a/tests/isolate/raw_port_test.dart
+++ b/tests/isolate/raw_port_test.dart
@@ -25,7 +25,7 @@
   test("raw receive", () {
     RawReceivePort port = new RawReceivePort();
     Isolate.spawn(remote, port.sendPort);
-    port.handler = expectAsync1((v) {
+    port.handler = expectAsync((v) {
       expect(v, "reply");
       port.close();
     });
@@ -34,9 +34,9 @@
   test("raw receive twice - change handler", () {
     RawReceivePort port = new RawReceivePort();
     Isolate.spawn(remote2, port.sendPort);
-    port.handler = expectAsync1((v) {
+    port.handler = expectAsync((v) {
       expect(v, "reply 1");
-      port.handler = expectAsync1((v) {
+      port.handler = expectAsync((v) {
         expect(v, "reply 2");
         port.close();
       });
@@ -46,18 +46,18 @@
   test("from-raw-port", () {
     RawReceivePort rawPort = new RawReceivePort();
     Isolate.spawn(remote, rawPort.sendPort);
-    rawPort.handler = expectAsync1((v) {
+    rawPort.handler = expectAsync((v) {
       expect(v, "reply");
       ReceivePort port = new ReceivePort.fromRawReceivePort(rawPort);
       Isolate.spawn(remote, rawPort.sendPort);
       Isolate.spawn(remote, port.sendPort);
       int ctr = 2;
-      port.listen(expectAsync1((v) {
+      port.listen(expectAsync((v) {
                     expect(v, "reply");
                     ctr--;
                     if (ctr == 0) port.close();
                   }, count: 2),
-                  onDone: expectAsync0((){}));
+                  onDone: expectAsync((){}));
     });
   });
 }
diff --git a/tests/isolate/request_reply_test.dart b/tests/isolate/request_reply_test.dart
index 713f7bb..caeba64 100644
--- a/tests/isolate/request_reply_test.dart
+++ b/tests/isolate/request_reply_test.dart
@@ -24,10 +24,10 @@
   test("send", () {
     ReceivePort init = new ReceivePort();
     Isolate.spawn(entry, init.sendPort);
-    init.first.then(expectAsync1((port) {
+    init.first.then(expectAsync((port) {
       ReceivePort reply = new ReceivePort();
       port.send([99, reply.sendPort]);
-      reply.listen(expectAsync1((message) {
+      reply.listen(expectAsync((message) {
         expect(message, 99 + 87);
         reply.close();
       }));
diff --git a/tests/isolate/spawn_function_test.dart b/tests/isolate/spawn_function_test.dart
index 54cfb5a..307c04e 100644
--- a/tests/isolate/spawn_function_test.dart
+++ b/tests/isolate/spawn_function_test.dart
@@ -19,7 +19,7 @@
   test('message - reply chain', () {
     ReceivePort port = new ReceivePort();
     Isolate.spawn(child, ['hi', port.sendPort]);
-    port.listen(expectAsync1((msg) {
+    port.listen(expectAsync((msg) {
       port.close();
       expect(msg, equals('re: hi'));
     }));
diff --git a/tests/isolate/spawn_uri_multi_test.dart b/tests/isolate/spawn_uri_multi_test.dart
index 5815ec8..feb3cac 100644
--- a/tests/isolate/spawn_uri_multi_test.dart
+++ b/tests/isolate/spawn_uri_multi_test.dart
@@ -17,7 +17,7 @@
 main() {
   test('isolate fromUri - negative test', () {
     ReceivePort port = new ReceivePort();
-    port.first.then(expectAsync1((msg) {
+    port.first.then(expectAsync((msg) {
       String expectedMessage = 're: hi';
       // Should be hi, not hello.
       expectedMessage = 're: hello'; /// 01: runtime error
diff --git a/tests/isolate/spawn_uri_nested_vm_test.dart b/tests/isolate/spawn_uri_nested_vm_test.dart
index 07deb9a..c1b084d 100644
--- a/tests/isolate/spawn_uri_nested_vm_test.dart
+++ b/tests/isolate/spawn_uri_nested_vm_test.dart
@@ -15,6 +15,6 @@
     ReceivePort port = new ReceivePort();
     Isolate.spawnUri(Uri.parse('spawn_uri_nested_child1_vm_isolate.dart'),
                      [], [[1, 2], port.sendPort]);
-    port.first.then(expectAsync1((result) => print(result)));
+    port.first.then(expectAsync((result) => print(result)));
   });
 }
diff --git a/tests/isolate/spawn_uri_test.dart b/tests/isolate/spawn_uri_test.dart
index ddc5c17..340170e5 100644
--- a/tests/isolate/spawn_uri_test.dart
+++ b/tests/isolate/spawn_uri_test.dart
@@ -13,7 +13,7 @@
 main() {
   test('isolate fromUri - send and reply', () {
     ReceivePort port = new ReceivePort();
-    port.listen(expectAsync1((msg) {
+    port.listen(expectAsync((msg) {
       expect(msg, equals('re: hi'));
       port.close();
     }));
diff --git a/tests/isolate/spawn_uri_vm_test.dart b/tests/isolate/spawn_uri_vm_test.dart
index f72c3d8..7fbb20c 100644
--- a/tests/isolate/spawn_uri_vm_test.dart
+++ b/tests/isolate/spawn_uri_vm_test.dart
@@ -13,7 +13,7 @@
 main() {
   test('isolate fromUri - send and reply', () {
     ReceivePort port = new ReceivePort();
-    port.first.then(expectAsync1((msg) {
+    port.first.then(expectAsync((msg) {
       expect(msg, equals('re: hi'));
     }));
 
diff --git a/tests/isolate/stacktrace_message_test.dart b/tests/isolate/stacktrace_message_test.dart
index c22fa01..baddf77 100644
--- a/tests/isolate/stacktrace_message_test.dart
+++ b/tests/isolate/stacktrace_message_test.dart
@@ -11,7 +11,7 @@
   test("stacktrace_message", () {
     ReceivePort reply = new ReceivePort();
     Isolate.spawn(runTest, reply.sendPort);
-    reply.first.then(expectAsync1((StackTrace stack) {
+    reply.first.then(expectAsync((StackTrace stack) {
       print(stack);
     }));
   });
diff --git a/tests/isolate/static_function_test.dart b/tests/isolate/static_function_test.dart
index 28e06b4..130c07b 100644
--- a/tests/isolate/static_function_test.dart
+++ b/tests/isolate/static_function_test.dart
@@ -63,7 +63,7 @@
   test(name, () {
     ReceivePort r = new ReceivePort();
       Isolate.spawn(function, r.sendPort);
-      r.listen(expectAsync1((v) {
+      r.listen(expectAsync((v) {
         expect(v, response);
         r.close();
       }));
@@ -72,7 +72,7 @@
 
 void functionFailTest(name, function) {
   test("throws on $name", () {
-    Isolate.spawn(function, null).catchError(expectAsync1((e) {
+    Isolate.spawn(function, null).catchError(expectAsync((e) {
       /* do nothing */
     }));
   });
diff --git a/tests/isolate/unresolved_ports_test.dart b/tests/isolate/unresolved_ports_test.dart
index 8fe11c9..2ffa633 100644
--- a/tests/isolate/unresolved_ports_test.dart
+++ b/tests/isolate/unresolved_ports_test.dart
@@ -18,7 +18,7 @@
 
 bethIsolate(init) {
   ReceivePort port = initIsolate(init);
-  // TODO(sigmund): use expectAsync2 when it is OK to use it within an isolate
+  // TODO(sigmund): use expectAsync when it is OK to use it within an isolate
   // (issue #6856)
   port.first.then((msg) => msg[1].send([
         '${msg[0]}\nBeth says: Tim are you coming? And Bob?', msg[2]]));
@@ -54,7 +54,7 @@
 baseTest({bool failForNegativeTest: false}) {
   test('Message chain with unresolved ports', () {
     ReceivePort port = new ReceivePort();
-    port.listen(expectAsync1((msg) {
+    port.listen(expectAsync((msg) {
       expect(msg, equals('main says: Beth, find out if Tim is coming.'
         '\nBeth says: Tim are you coming? And Bob?'
         '\nTim says: Can you tell "main" that we are all coming?'
diff --git a/tests/json/json.status b/tests/json/json.status
deleted file mode 100644
index ebf041d..0000000
--- a/tests/json/json.status
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-[ $runtime == vm ]
-*: Skip
-
-[ $compiler == dart2js && $runtime == none ]
-*: Fail, Pass # TODO(ahe): Triage these tests.
diff --git a/tests/json/json_test.dart b/tests/json/json_test.dart
deleted file mode 100644
index 1c7e444..0000000
--- a/tests/json/json_test.dart
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library json_tests;
-import "package:expect/expect.dart";
-import "dart:convert";
-import 'dart:html';
-import '../../pkg/unittest/lib/unittest.dart';
-import '../../pkg/unittest/lib/html_config.dart';
-
-main() {
-  useHtmlConfiguration();
-  test('Parse', () {
-    // Scalars.
-    expect(JSON.decode(' 5 '), equals(5));
-    expect(JSON.decode(' -42 '), equals(-42));
-    expect(JSON.decode(' 3e0 '), equals(3));
-    expect(JSON.decode(' 3.14 '), equals(3.14));
-    expect(JSON.decode('true '), isTrue);
-    expect(JSON.decode(' false'), isFalse);
-    expect(JSON.decode(' null '), isNull);
-    expect(JSON.decode('\n\rnull\t'), isNull);
-    expect(JSON.decode(' "hi there\\" bob" '), equals('hi there" bob'));
-    expect(JSON.decode(' "" '), isEmpty);
-
-    // Lists.
-    expect(JSON.decode(' [] '), isEmpty);
-    expect(JSON.decode('[ ]'), isEmpty);
-    expect(JSON.decode(' [3, -4.5, true, "hi", false] '),
-      equals([3, -4.5, true, 'hi', false]));
-    // Nulls are tricky.
-    expect(JSON.decode('[null]'), orderedEquals([null]));
-    expect(JSON.decode(' [3, -4.5, null, true, "hi", false] '),
-      equals([3, -4.5, null, true, 'hi', false]));
-    expect(JSON.decode('[[null]]'), equals([[null]]));
-    expect(JSON.decode(' [ [3], [], [null], ["hi", true]] '),
-      equals([[3], [], [null], ['hi', true]]));
-
-    // Maps.
-    expect(JSON.decode(' {} '), isEmpty);
-    expect(JSON.decode('{ }'), isEmpty);
-
-    expect(JSON.decode(
-        ' {"x":3, "y": -4.5,  "z" : "hi","u" : true, "v": false } '),
-        equals({"x":3, "y": -4.5,  "z" : "hi", "u" : true, "v": false }));
-
-    expect(JSON.decode(' {"x":3, "y": -4.5,  "z" : "hi" } '),
-        equals({"x":3, "y": -4.5,  "z" : "hi" }));
-
-    expect(JSON.decode(' {"y": -4.5,  "z" : "hi" ,"x":3 } '),
-        equals({"y": -4.5,  "z" : "hi" ,"x":3 }));
-
-    expect(JSON.decode('{ " hi bob " :3, "": 4.5}'),
-        equals({ " hi bob " :3, "": 4.5}));
-
-    expect(JSON.decode(' { "x" : { } } '), equals({ 'x' : {}}));
-    expect(JSON.decode('{"x":{}}'), equals({ 'x' : {}}));
-
-    // Nulls are tricky.
-    expect(JSON.decode('{"w":null}'), equals({ 'w' : null}));
-
-    expect(JSON.decode('{"x":{"w":null}}'), equals({"x":{"w":null}}));
-
-    expect(JSON.decode(' {"x":3, "y": -4.5,  "z" : "hi",'
-                   '"w":null, "u" : true, "v": false } '),
-        equals({"x":3, "y": -4.5,  "z" : "hi",
-                   "w":null, "u" : true, "v": false }));
-
-    expect(JSON.decode('{"x": {"a":3, "b": -4.5}, "y":[{}], '
-                   '"z":"hi","w":{"c":null,"d":true}, "v":null}'),
-        equals({"x": {"a":3, "b": -4.5}, "y":[{}],
-                   "z":"hi","w":{"c":null,"d":true}, "v":null}));
-  });
-
-  test('stringify', () {
-    // Scalars.
-    expect(JSON.encode(5), equals('5'));
-    expect(JSON.encode(-42), equals('-42'));
-    // Dart does not guarantee a formatting for doubles,
-    // so reparse and compare to the original.
-    validateRoundTrip(3.14);
-    expect(JSON.encode(true), equals('true'));
-    expect(JSON.encode(false), equals('false'));
-    expect(JSON.encode(null), equals('null'));
-    expect(JSON.encode(' hi there" bob '), equals('" hi there\\" bob "'));
-    expect(JSON.encode('hi\\there'), equals('"hi\\\\there"'));
-    // TODO(devoncarew): these tests break the dartium build
-    //expect(JSON.encode('hi\nthere'), equals('"hi\\nthere"'));
-    //expect(JSON.encode('hi\r\nthere'), equals('"hi\\r\\nthere"'));
-    expect(JSON.encode(''), equals('""'));
-
-    // Lists.
-    expect(JSON.encode([]), equals('[]'));
-    expect(JSON.encode(new List(0)), equals('[]'));
-    expect(JSON.encode(new List(3)), equals('[null,null,null]'));
-    validateRoundTrip([3, -4.5, null, true, 'hi', false]);
-    expect(JSON.encode([[3], [], [null], ['hi', true]]),
-      equals('[[3],[],[null],["hi",true]]'));
-
-    // Maps.
-    expect(JSON.encode({}), equals('{}'));
-    expect(JSON.encode(new Map()), equals('{}'));
-    expect(JSON.encode({'x':{}}), equals('{"x":{}}'));
-    expect(JSON.encode({'x':{'a':3}}), equals('{"x":{"a":3}}'));
-
-    // Dart does not guarantee an order on the keys
-    // of a map literal, so reparse and compare to the original Map.
-    validateRoundTrip(
-        {'x':3, 'y':-4.5, 'z':'hi', 'w':null, 'u':true, 'v':false});
-    validateRoundTrip({"x":3, "y":-4.5, "z":'hi'});
-    validateRoundTrip({' hi bob ':3, '':4.5});
-    validateRoundTrip(
-        {'x':{'a':3, 'b':-4.5}, 'y':[{}], 'z':'hi', 'w':{'c':null, 'd':true},
-                  'v':null});
-
-    expect(JSON.encode(new ToJson(4)), "4");
-    expect(JSON.encode(new ToJson([4, "a"])), '[4,"a"]');
-    expect(JSON.encode(new ToJson([4, new ToJson({"x":42})])),
-           '[4,{"x":42}]');
-
-    Expect.throws(() {
-      JSON.encode([new ToJson(new ToJson(4))]);
-    });
-
-    Expect.throws(() {
-      JSON.encode([new Object()]);
-    });
-
-  });
-
-  test('stringify throws if argument cannot be converted', () {
-    /**
-     * Checks that we get an exception (rather than silently returning null) if
-     * we try to stringify something that cannot be converted to json.
-     */
-    expect(() => JSON.encode(new TestClass()), throws);
-  });
-
-  test('stringify custom converter', () {
-    List l = [const C(0), const C(1)];
-    expect(JSON.encode(l, toEncodable: (x) => "C(${x.id})"),
-           equals('["C(0)","C(1)"]'));
-    expect(JSON.encode(l), equals('["C/0","C/1"]'));
-  });
-}
-
-class C {
-  final int id;
-  const C(this.id);
-  toJson() => "C/$id";
-}
-
-class TestClass {
-  int x;
-  String y;
-
-  TestClass() : x = 3, y = 'joe' { }
-}
-
-class ToJson {
-  final object;
-  const ToJson(this.object);
-  toJson() => object;
-}
-
-/**
- * Checks that the argument can be converted to a JSON string and
- * back, and produce something equivalent to the argument.
- */
-validateRoundTrip(expected) {
-  expect(JSON.decode(JSON.encode(expected)), equals(expected));
-}
diff --git a/tests/language/abstract_method_test.dart b/tests/language/abstract_method_test.dart
new file mode 100644
index 0000000..cb52fcb
--- /dev/null
+++ b/tests/language/abstract_method_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// Checks that abstract instance methods are correctly resolved.
+
+int get length => throw "error: top-level getter called";
+set height(x) { throw "error: top-level setter called"; }
+width() { throw "error: top-level function called"; }
+
+abstract class A {
+  int get length;     // Abstract instance getter.
+  set height(x);      // Abstract instance setter.
+  int width();        // Abstract instance method.
+
+  // Must resolve to non-abstract length getter in subclass.
+  get useLength => length;
+  // Must resolve to non-abstract height setter in subclass.
+  setHeight(x) => height = x;
+  // Must resolve to non-abstract width() method in subclass.
+  useWidth() => width();
+}
+
+class A1 extends A {
+  int length;  // Implies a length getter.
+  int height;  // Implies a height setter.
+  int width() => 345;
+  A1(this.length);
+}
+
+main() {
+  var a = new A1(123);
+  Expect.equals(123, a.useLength);
+  a.setHeight(234);
+  Expect.equals(234, a.height);
+  Expect.equals(345, a.useWidth());
+  print([a.useLength, a.height, a.useWidth()]);
+}
+
diff --git a/tests/language/compile_time_constant_checked2_test.dart b/tests/language/compile_time_constant_checked2_test.dart
index 517dfc0..52cfc41 100644
--- a/tests/language/compile_time_constant_checked2_test.dart
+++ b/tests/language/compile_time_constant_checked2_test.dart
@@ -12,12 +12,12 @@
   const A.a6(int x) : this.x = x;
 }
 
-const a1 = const A.a1(); /// 01: static type warning, compile-time error
-const a2 = const A.a2('foo'); /// 02: static type warning, compile-time error
-const a3 = const A.a3(); /// 03: static type warning, compile-time error
-const a4 = const A.a4('foo'); /// 04: static type warning, compile-time error
-const a5 = const A.a5('foo'); /// 05: static type warning, compile-time error
-const a6 = const A.a6('foo'); /// 06: static type warning, compile-time error
+const a1 = const A.a1(); /// 01: static type warning, checked mode compile-time error
+const a2 = const A.a2('foo'); /// 02: static type warning, checked mode compile-time error
+const a3 = const A.a3(); /// 03: static type warning, checked mode compile-time error
+const a4 = const A.a4('foo'); /// 04: static type warning, checked mode compile-time error
+const a5 = const A.a5('foo'); /// 05: static type warning, checked mode compile-time error
+const a6 = const A.a6('foo'); /// 06: static type warning, checked mode compile-time error
 
 main() {
   print(a1); /// 01: continued
diff --git a/tests/language/compile_time_constant_checked3_test.dart b/tests/language/compile_time_constant_checked3_test.dart
index 6aeecd1..336da46 100644
--- a/tests/language/compile_time_constant_checked3_test.dart
+++ b/tests/language/compile_time_constant_checked3_test.dart
@@ -12,12 +12,12 @@
   const A.a6(int x) : this.x = x;
 }
 
-var a1 = const A.a1(); /// 01: static type warning, compile-time error
-var a2 = const A.a2('foo'); /// 02: static type warning, compile-time error
-var a3 = const A.a3(); /// 03: static type warning, compile-time error
-var a4 = const A.a4('foo'); /// 04: static type warning, compile-time error
-var a5 = const A.a5('foo'); /// 05: static type warning, compile-time error
-var a6 = const A.a6('foo'); /// 06: static type warning, compile-time error
+var a1 = const A.a1(); /// 01: static type warning, checked mode compile-time error
+var a2 = const A.a2('foo'); /// 02: static type warning, checked mode compile-time error
+var a3 = const A.a3(); /// 03: static type warning, checked mode compile-time error
+var a4 = const A.a4('foo'); /// 04: static type warning, checked mode compile-time error
+var a5 = const A.a5('foo'); /// 05: static type warning, checked mode compile-time error
+var a6 = const A.a6('foo'); /// 06: static type warning, checked mode compile-time error
 
 main() {
   print(a1); /// 01: continued
diff --git a/tests/language/compile_time_constant_checked_test.dart b/tests/language/compile_time_constant_checked_test.dart
index f995774..26c0ecc 100644
--- a/tests/language/compile_time_constant_checked_test.dart
+++ b/tests/language/compile_time_constant_checked_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 final int x = 'foo'; /// 01: static type warning, dynamic type error
-const int y = 'foo'; /// 02: static type warning, compile-time error
+const int y = 'foo'; /// 02: static type warning, checked mode compile-time error
 int z = 'foo'; /// 03: static type warning, dynamic type error
 
 main() {
diff --git a/tests/language/const_constructor3_test.dart b/tests/language/const_constructor3_test.dart
new file mode 100644
index 0000000..2f1353a
--- /dev/null
+++ b/tests/language/const_constructor3_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class C {
+  final double d;
+  const C(this.d);
+}
+
+class D extends C {
+  const D(var d) : super(d);
+}
+
+const c = const C(0.0); /// 01: ok
+const d = const C(0); /// 02: static type warning, checked mode compile-time error
+const e = const D(0.0); /// 03: ok
+const f = const D(0); /// 04: checked mode compile-time error
+
+main() {
+  print(c); /// 01: continued
+  print(d); /// 02: continued
+  print(e); /// 03: continued
+  print(f); /// 04: continued
+}
\ No newline at end of file
diff --git a/tests/language/const_evaluation_test.dart b/tests/language/const_evaluation_test.dart
new file mode 100644
index 0000000..8157e21
--- /dev/null
+++ b/tests/language/const_evaluation_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Check that compile-time evaluation of constants is consistent with runtime
+// evaluation.
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+const top_const = identical(-0.0, 0);
+final top_final = identical(-0.0, 0);
+var top_var = identical(-0.0, 0);
+
+@top_const
+class C {
+  static const static_const = identical(-0.0, 0);
+  static final static_final = identical(-0.0, 0);
+  static var static_var = identical(-0.0, 0);
+
+  final instance_final = identical(-0.0, 0);
+  var instance_var = identical(-0.0, 0);
+
+  void test() {
+    const local_const = identical(-0.0, 0);
+    final local_final = identical(-0.0, 0);
+    var local_var = identical(-0.0, 0);
+
+    Expect.equals(identical(-0.0, 0), top_const);
+    Expect.equals(top_const, top_final);
+    Expect.equals(top_final, top_var);
+    Expect.equals(top_var, static_const);
+    Expect.equals(static_const, static_final);
+    Expect.equals(static_final, static_var);
+    Expect.equals(static_var, instance_final);
+    Expect.equals(instance_final, instance_var);
+    Expect.equals(instance_var, local_const);
+    Expect.equals(local_const, local_final);
+    Expect.equals(local_final, local_var);
+    var metadata = reflectClass(C).metadata[0].reflectee; /// 01: ok
+    Expect.equals(top_const, metadata);                   /// 01: continued
+    Expect.equals(local_var, metadata);                   /// 01: continued
+  }
+}
+
+void main() {
+  new C().test();
+}
diff --git a/tests/language/const_init2_test.dart b/tests/language/const_init2_test.dart
new file mode 100644
index 0000000..e6e1c4e
--- /dev/null
+++ b/tests/language/const_init2_test.dart
@@ -0,0 +1,11 @@
+// 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.
+
+const double c = 0.0; /// 01: ok
+const double d = 0; /// 02: static type warning, checked mode compile-time error
+
+main() {
+  print(c); /// 01: continued
+  print(d); /// 02: continued
+}
\ No newline at end of file
diff --git a/tests/language/const_switch2_test.dart b/tests/language/const_switch2_test.dart
new file mode 100644
index 0000000..7372899
--- /dev/null
+++ b/tests/language/const_switch2_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+int main() {
+  var a = [1,2,3][2];
+  switch (a) {
+    case 0.0:            /// 01: compile-time error
+      print("illegal");  /// 01: continued
+    case 1:
+      print("OK");
+  }
+}
\ No newline at end of file
diff --git a/tests/language/const_switch_test.dart b/tests/language/const_switch_test.dart
new file mode 100644
index 0000000..cfa9151
--- /dev/null
+++ b/tests/language/const_switch_test.dart
@@ -0,0 +1,32 @@
+  // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+class C {
+  final field;
+  const C(this.field);
+}
+
+const c1 = const C(0.0);
+const c2 = const C(0);
+const c3 = const C(0.5 + 0.5);
+const c4 = const C(1);
+
+main() {
+  Expect.equals('0.0', test(c1)); /// 01: ok
+  Expect.equals('0', test(c2));   /// 02: ok
+  Expect.equals('1.0', test(c3)); /// 03: ok
+  Expect.equals('1', test(c4));   /// 04: ok
+}
+
+String test(C c) {
+  switch (c) {
+    case const C(0.0): return '0.0';
+    case const C(0): return '0';
+    case const C(1.0): return '1.0';
+    case const C(1): return '1';
+  }
+  return null;
+}
\ No newline at end of file
diff --git a/tests/language/cyclic_type_test.dart b/tests/language/cyclic_type_test.dart
index 4c5820c..4de75d9 100644
--- a/tests/language/cyclic_type_test.dart
+++ b/tests/language/cyclic_type_test.dart
@@ -10,23 +10,57 @@
   get t => T;
 }
 
-class Derived<T> extends Base<Derived<Derived<T>>> {}
+// Derived<T> is contractive.
+class Derived<T> extends Base<Derived<T>> {}  /// 00: ok
 
-class Derived1<T> extends Base<Derived2<T>> {}
+// Derived<T> is contractive.
+class Derived<T> extends Base<Derived<Derived<int>>> {}  /// 01: ok
 
-class Derived2<T> extends Base<Derived1<Derived2<T>>> {}
+// Derived<T> is non-contractive.
+class Derived<T> extends Base<Derived<Derived<T>>> {}  /// 02: ok
+
+// Derived1<U> and Derived2<V> are contractive.
+class Derived1<U> extends Base<Derived2<U>> {}   /// 03: ok
+class Derived2<V> extends Base<Derived1<V>> {}   /// 03: ok
+
+// Derived1<U> and Derived2<V> are non-contractive.
+class Derived1<U> extends Base<Derived2<U>> {}   /// 04: ok
+class Derived2<V> extends Base<Derived1<Derived2<V>>> {}   /// 04: ok
 
 main() {
-  var d = new Derived();
-  Expect.equals("Derived<Derived>", d.t.toString());
-  d = new Derived<bool>();
-  Expect.equals("Derived<Derived<bool>>", d.t.toString());
-  d = new Derived<Derived>();
-  Expect.equals("Derived<Derived<Derived>>", d.t.toString());
-  d = new Derived1();
-  Expect.equals("Derived2", d.t.toString());
-  d = new Derived2();
-  Expect.equals("Derived1<Derived2>", d.t.toString());
-  d = new Derived2<Derived1<int>>();
-  Expect.equals("Derived1<Derived2<Derived1<int>>>", d.t.toString());
+  var d;
+  d = new Derived();  /// 00: continued
+  Expect.equals("Derived", d.t.toString());  /// 00: continued
+  d = new Derived<bool>();  /// 00: continued
+  Expect.equals("Derived<bool>", d.t.toString());  /// 00: continued
+  d = new Derived<Derived>();  /// 00: continued
+  Expect.equals("Derived<Derived>", d.t.toString());  /// 00: continued
+
+  d = new Derived();  /// 01: continued
+  Expect.equals("Derived<Derived<int>>", d.t.toString());  /// 01: continued
+  d = new Derived<bool>();  /// 01: continued
+  Expect.equals("Derived<Derived<int>>", d.t.toString());  /// 01: continued
+  d = new Derived<Derived>();  /// 01: continued
+  Expect.equals("Derived<Derived<int>>", d.t.toString());  /// 01: continued
+
+  d = new Derived();  /// 02: continued
+  Expect.equals("Derived<Derived>", d.t.toString());  /// 02: continued
+  d = new Derived<bool>();  /// 02: continued
+  Expect.equals("Derived<Derived<bool>>", d.t.toString());  /// 02: continued
+  d = new Derived<Derived>();  /// 02: continued
+  Expect.equals("Derived<Derived<Derived>>", d.t.toString());  /// 02: continued
+
+  d = new Derived1();  /// 03: continued
+  Expect.equals("Derived2", d.t.toString());  /// 03: continued
+  d = new Derived2();  /// 03: continued
+  Expect.equals("Derived1", d.t.toString());  /// 03: continued
+  d = new Derived2<Derived1<int>>();  /// 03: continued
+  Expect.equals("Derived1<Derived1<int>>", d.t.toString());  /// 03: continued
+
+  d = new Derived1();  /// 04: continued
+  Expect.equals("Derived2", d.t.toString());  /// 04: continued
+  d = new Derived2();  /// 04: continued
+  Expect.equals("Derived1<Derived2>", d.t.toString());  /// 04: continued
+  d = new Derived2<Derived1<int>>();  /// 04: continued
+  Expect.equals("Derived1<Derived2<Derived1<int>>>", d.t.toString());  /// 04: continued
 }
diff --git a/tests/language/deferred_constraints_constants_test.dart b/tests/language/deferred_constraints_constants_test.dart
index cbeb102..f0d95ef 100644
--- a/tests/language/deferred_constraints_constants_test.dart
+++ b/tests/language/deferred_constraints_constants_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
+import 'dart:mirrors';
 
 import "deferred_constraints_constants_lib.dart" deferred as lib;
 
@@ -54,6 +55,12 @@
     var h1 = new H1();
     var h2 = new H2();
     var h3 = new H3();
+
+    // Need to access the metadata to trigger the expected compilation error.
+    reflectClass(H1).metadata;  // metadata1: continued
+    reflectClass(H2).metadata;  // metadata2: continued
+    reflectClass(H3).metadata;  // metadata3: continued
+
     asyncEnd();
   });
 }
diff --git a/tests/language/deferred_load_inval_code_lib.dart b/tests/language/deferred_load_inval_code_lib.dart
new file mode 100644
index 0000000..579395f
--- /dev/null
+++ b/tests/language/deferred_load_inval_code_lib.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+foo() {
+  return "foo from library";
+}
\ No newline at end of file
diff --git a/tests/language/deferred_load_inval_code_test.dart b/tests/language/deferred_load_inval_code_test.dart
new file mode 100644
index 0000000..88a3159
--- /dev/null
+++ b/tests/language/deferred_load_inval_code_test.dart
@@ -0,0 +1,39 @@
+
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// VMOptions=--optimization-counter-threshold=100
+
+import "deferred_load_inval_code_lib.dart" deferred as d;
+
+bool loaded = false;
+
+var x = 0;
+
+bla() {
+  if (loaded) {
+    // Loading the library should have invalidated the optimized
+    // code containing the NSME. Now expect this call to succeed.
+    d.foo();
+  } else {
+    // Do some "busy work" to trigger optimization.
+    for (var i = 0; i < 100; i++) {
+      x++;
+    }
+  }
+}
+
+warmup() {
+  for (int i = 1; i < 1000; i++) {
+    bla();
+  }
+}
+
+main() {
+  warmup();
+  d.loadLibrary().then((_) {
+    loaded = true;
+    bla();
+  });
+}
diff --git a/tests/language/first_class_types_literals_test.dart b/tests/language/first_class_types_literals_test.dart
index 422628a..2f32cfe 100644
--- a/tests/language/first_class_types_literals_test.dart
+++ b/tests/language/first_class_types_literals_test.dart
@@ -41,8 +41,8 @@
   Expect.equals(String, 'hest'.runtimeType);
   Expect.equals(double, (0.5).runtimeType);
   Expect.equals(bool, true.runtimeType);
-  Expect.equals(C, new C().runtimeType);
-  Expect.equals(D, new D().runtimeType);
+  Expect.equals(C, new C().runtimeType);  /// 01: ok
+  Expect.equals(D, new D().runtimeType);  /// 02: ok
 
   // runtimeType on type is idempotent.
   Expect.equals((D).runtimeType, (D).runtimeType.runtimeType);
diff --git a/tests/language/language.status b/tests/language/language.status
index d505b7d..c57acaa 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -20,18 +20,7 @@
 duplicate_export_negative_test: Fail # Issue 6134
 mixin_forwarding_constructor2_test: Fail # Issue 13641
 
-# Issue 17521
-deferred_constraints_constants_test/default_argument2: Fail
-deferred_constraints_constants_test/metadata1: Fail
-deferred_constraints_constants_test/metadata3: Fail
-deferred_constraints_constants_test/metadata2: Fail
-
-
 # These test use the old syntax, and will be phased out.
-deferred_constraints_type_annotation_old_syntax_test/as_operation: Fail, Ok
-deferred_constraints_type_annotation_old_syntax_test/is_check: Fail, Ok
-deferred_constraints_type_annotation_old_syntax_test/catch_check: Fail, Ok
-deferred_constraints_type_annotation_old_syntax_test/new_before_load: Fail, Ok
 deferred_constraints_constants_old_syntax_test/reference1: Fail, Ok
 deferred_constraints_constants_old_syntax_test/reference2: Fail, Ok
 deferred_constraints_constants_old_syntax_test/metadata1: Fail, Ok
@@ -42,31 +31,28 @@
 deferred_constraints_constants_old_syntax_test/constructor1: Fail, Ok
 deferred_constraints_constants_old_syntax_test/constructor2: Fail, Ok
 
-cyclic_type_test: Fail, Pass # Issue 17629
-cyclic_type2_test: Fail, Pass # Issue 17629
-least_upper_bound_expansive_test/*: Fail, Pass # Issue 17629
-
-[ ($compiler == dart2dart)]
+[ $compiler == dart2dart]
 # Issue 17523
-deferred_constraints_type_annotation_test/as_operation: Fail
-deferred_constraints_type_annotation_test/is_check: Fail
-deferred_constraints_type_annotation_test/catch_check: Fail
-deferred_constraints_type_annotation_test/new_before_load: Fail
 deferred_load_library_wrong_args_test/none: Fail
-
-cyclic_type_test: Fail, OK # Issue 17629
-
-[ ($compiler == dart2dart)]
-# Issue 17523
+deferred_load_inval_code_test: Fail # dartbug.com/17933
 deferred_constraints_type_annotation_test/*: Fail, Pass
 deferred_constraints_constants_test/*: Fail, Pass
-deferred_constraints_type_annotation_old_syntax_test/as_operation: Fail
-deferred_constraints_type_annotation_old_syntax_test/is_check: Fail
-deferred_constraints_type_annotation_old_syntax_test/catch_check: Fail
-deferred_constraints_type_annotation_old_syntax_test/new_before_load: Fail
 deferred_shadow_load_library_test: Fail
 deferred_closurize_load_library_test: Fail
 
+[ $compiler == none || $compiler == dart2dart]
+# These test use the old syntax, and will be phased out.
+deferred_constraints_type_annotation_old_syntax_test/as_operation: Fail, Ok
+deferred_constraints_type_annotation_old_syntax_test/is_check: Fail, Ok
+deferred_constraints_type_annotation_old_syntax_test/catch_check: Fail, Ok
+deferred_constraints_type_annotation_old_syntax_test/new_before_load: Fail, Ok
+
+# Non-contractive types are not supported in the vm.
+cyclic_type_test/02: Fail, OK
+cyclic_type_test/04: Fail, OK
+cyclic_type2_test: Fail, OK
+least_upper_bound_expansive_test/*: Fail, OK
+
 [ ($compiler == none || $compiler == dart2dart) && $checked ]
 # Issue 17521, 17523
 # Dart2dart does not support deferred loading.
@@ -94,21 +80,7 @@
 [ $compiler == none && $unchecked ]
 # Only checked mode reports an error on type assignment
 # problems in compile time constants.
-compile_time_constant_checked_test/02: Fail, OK
-compile_time_constant_checked2_test/01: Fail, OK
-compile_time_constant_checked2_test/02: Fail, OK
-compile_time_constant_checked2_test/03: Fail, OK
-compile_time_constant_checked2_test/04: Fail, OK
-compile_time_constant_checked2_test/05: Fail, OK
-compile_time_constant_checked2_test/06: Fail, OK
-compile_time_constant_checked3_test/01: Fail, OK
-compile_time_constant_checked3_test/02: Fail, OK
-compile_time_constant_checked3_test/03: Fail, OK
-compile_time_constant_checked3_test/04: Fail, OK
-compile_time_constant_checked3_test/05: Fail, OK
-compile_time_constant_checked3_test/06: Fail, OK
 type_check_const_function_typedef2_test/00: Fail, OK
-malformed2_test/01: Fail, OK
 
 [ ($compiler == none || $compiler == dart2dart) && $runtime != none ]
 dynamic_prefix_core_test/01: Fail # Issue 12478
@@ -121,16 +93,14 @@
 lazy_static3_test: Fail # Issue 13469
 
 [ $compiler == none && $runtime == dartium && $unchecked ]
-named_parameters_type_test/01: Fail # Issue 17561.
-named_parameters_type_test/02: Fail # Issue 17561.
-named_parameters_type_test/03: Fail # Issue 17561.
-positional_parameters_type_test/01: Fail # Issue 17561.
-positional_parameters_type_test/02: Fail # Issue 17561.
-assertion_test: Fail # Issue 17561.
-generic_test: Fail # Issue 17561.
-list_literal1_test/01: Fail # Issue 13719: Please triage this failure.
+named_parameters_type_test/01: Fail # Issue 13719: Please triage this failure.
+named_parameters_type_test/02: Fail # Issue 13719: Please triage this failure.
+named_parameters_type_test/03: Fail # Issue 13719: Please triage this failure.
+positional_parameters_type_test/01: Fail # Issue 13719: Please triage this failure.
+positional_parameters_type_test/02: Fail # Issue 13719: Please triage this failure.
+assertion_test: Fail # Issue 13719: Please triage this failure.
+generic_test: Fail # Issue 13719: Please triage this failure.
 list_literal4_test: Fail # Issue 13719: Please triage this failure.
-map_literal1_test/01: Fail # Issue 13719: Please triage this failure.
 map_literal4_test: Fail # Issue 13719: Please triage this failure.
 type_checks_in_factory_method_test: Fail # Issue 13719: Please triage this failure.
 vm/type_vm_test: Fail # Issue 13719: Please triage this failure.
@@ -151,3 +121,6 @@
 [ $compiler == none && $runtime == vm && $arch == mips && $mode == debug ]
 stack_overflow_test: Skip # Crashes. Issue 17440.
 stack_overflow_stacktrace_test: Skip # Crashes. Issue 17440.
+
+[ $compiler == none && $runtime == vm && $arch == simarm64 ]
+*: Skip
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index c62abfe..6f90409 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -179,19 +179,19 @@
 # test issue 15467
 proxy_test/05: StaticWarning # Issue 15467
 proxy_test/06: StaticWarning # Issue 15467
+proxy3_test/03: StaticWarning # Issue 15467
+proxy3_test/04: StaticWarning # Issue 15467
 
 # analyzer does not handle @proxy and noSuchMethod correctly
 override_inheritance_no_such_method_test/03: StaticWarning # Issue 16132
 override_inheritance_no_such_method_test/04: StaticWarning # Issue 16132
 override_inheritance_no_such_method_test/05: StaticWarning # Issue 16132
 
-# missing warning for unimplemented getter/setter
-override_inheritance_abstract_test/13: MissingStaticWarning # Issue 16133
-override_inheritance_abstract_test/26: MissingStaticWarning # Issue 16133
-
-# unexpected warning for override
-override_inheritance_abstract_test/27: StaticWarning # Issue 16134
-override_inheritance_generic_test/03: StaticWarning # Issue 16134
+# 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
+override_inheritance_abstract_test/27: StaticWarning # Issue 17983
 
 # missing warning for override
 override_inheritance_generic_test/04: MissingStaticWarning # Issue 16135
@@ -221,15 +221,6 @@
 bad_initializer1_negative_test: CompileTimeError
 bad_named_constructor_negative_test: CompileTimeError
 body_less_constructor_wrong_arg_negative_test: CompileTimeError
-compile_time_constant_checked2_test/02: MissingCompileTimeError
-compile_time_constant_checked2_test/03: MissingCompileTimeError
-compile_time_constant_checked2_test/04: MissingCompileTimeError
-compile_time_constant_checked2_test/06: MissingCompileTimeError
-compile_time_constant_checked3_test/02: MissingCompileTimeError
-compile_time_constant_checked3_test/03: MissingCompileTimeError
-compile_time_constant_checked3_test/04: MissingCompileTimeError
-compile_time_constant_checked3_test/06: MissingCompileTimeError
-compile_time_constant_checked_test/02: MissingCompileTimeError
 const_counter_negative_test: CompileTimeError
 const_optional_args_negative_test: CompileTimeError
 constructor_redirect1_negative_test: CompileTimeError
@@ -324,7 +315,6 @@
 malbounded_type_cast_test: StaticWarning
 malbounded_type_literal_test: StaticWarning
 malformed_type_test: StaticWarning
-malformed2_test/01: MissingCompileTimeError
 map_literal2_negative_test: CompileTimeError
 map_literal3_test: StaticWarning
 map_literal4_test: StaticWarning
@@ -475,6 +465,21 @@
 vm/type_cast_vm_test: StaticWarning
 vm/type_vm_test: StaticWarning
 void_type_test: StaticWarning
+
+# Issue 16392.
+const_constructor2_test/20: MissingStaticWarning # Issue 16392.
+const_constructor2_test/22: MissingStaticWarning # Issue 16392.
+const_constructor2_test/24: MissingStaticWarning # Issue 16392.
+
+# Issue 16391. The analyzer handle compile-time error in checked only in these
+# cases:
+compile_time_constant_checked2_test/01: CompileTimeError # Issue 16391
+compile_time_constant_checked2_test/05: CompileTimeError # Issue 16391
+compile_time_constant_checked3_test/01: CompileTimeError # Issue 16391
+compile_time_constant_checked3_test/05: CompileTimeError # Issue 16391
+list_literal1_test/01: CompileTimeError # Issue 16391
+map_literal1_test/01: CompileTimeError # Issue 16391
+
 # Issue 17522
 deferred_constraints_type_annotation_test/*: Pass, Fail
 deferred_constraints_constants_test/*: Pass, Fail
@@ -484,3 +489,5 @@
 deferred_closurize_load_library_test: Fail
 deferred_load_library_wrong_args_test/01: Fail
 deferred_load_library_wrong_args_test/none: Fail
+deferred_load_inval_code_test: Fail
+
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 4c5ce65..2cd04c7 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -179,16 +179,14 @@
 # test issue 15467
 proxy_test/05: StaticWarning # Issue 15467
 proxy_test/06: StaticWarning # Issue 15467
+proxy3_test/03: StaticWarning # Issue 15467
+proxy3_test/04: StaticWarning # Issue 15467
 
 # analyzer does not handle @proxy and noSuchMethod correctly
 override_inheritance_no_such_method_test/03: StaticWarning # Issue 16132
 override_inheritance_no_such_method_test/04: StaticWarning # Issue 16132
 override_inheritance_no_such_method_test/05: StaticWarning # Issue 16132
 
-# missing warning for unimplemented getter/setter
-override_inheritance_abstract_test/13: MissingStaticWarning # Issue 16133
-override_inheritance_abstract_test/26: MissingStaticWarning # Issue 16133
-
 # unexpected warning for override
 override_inheritance_abstract_test/27: StaticWarning # Issue 16134
 override_inheritance_generic_test/03: StaticWarning # Issue 16134
@@ -221,15 +219,6 @@
 bad_initializer1_negative_test: CompileTimeError
 bad_named_constructor_negative_test: CompileTimeError
 body_less_constructor_wrong_arg_negative_test: CompileTimeError
-compile_time_constant_checked2_test/02: MissingCompileTimeError
-compile_time_constant_checked2_test/03: MissingCompileTimeError
-compile_time_constant_checked2_test/04: MissingCompileTimeError
-compile_time_constant_checked2_test/06: MissingCompileTimeError
-compile_time_constant_checked3_test/02: MissingCompileTimeError
-compile_time_constant_checked3_test/03: MissingCompileTimeError
-compile_time_constant_checked3_test/04: MissingCompileTimeError
-compile_time_constant_checked3_test/06: MissingCompileTimeError
-compile_time_constant_checked_test/02: MissingCompileTimeError
 const_counter_negative_test: CompileTimeError
 const_optional_args_negative_test: CompileTimeError
 constructor_redirect1_negative_test: CompileTimeError
@@ -324,7 +313,6 @@
 malbounded_type_cast_test: StaticWarning
 malbounded_type_literal_test: StaticWarning
 malformed_type_test: StaticWarning
-malformed2_test/01: MissingCompileTimeError
 map_literal2_negative_test: CompileTimeError
 map_literal3_test: StaticWarning
 map_literal4_test: StaticWarning
@@ -475,6 +463,21 @@
 vm/type_cast_vm_test: StaticWarning
 vm/type_vm_test: StaticWarning
 void_type_test: StaticWarning
+
+# Issue 16392.
+const_constructor2_test/20: MissingStaticWarning # Issue 16392.
+const_constructor2_test/22: MissingStaticWarning # Issue 16392.
+const_constructor2_test/24: MissingStaticWarning # Issue 16392.
+
+# Issue 16391. The analyzer handle compile-time error in checked only in these
+# cases:
+compile_time_constant_checked2_test/01: CompileTimeError # Issue 16391
+compile_time_constant_checked2_test/05: CompileTimeError # Issue 16391
+compile_time_constant_checked3_test/01: CompileTimeError # Issue 16391
+compile_time_constant_checked3_test/05: CompileTimeError # Issue 16391
+list_literal1_test/01: CompileTimeError # Issue 16391
+map_literal1_test/01: CompileTimeError # Issue 16391
+
 # Issue 17522
 deferred_constraints_type_annotation_test/*: Pass, Fail
 deferred_constraints_constants_test/*: Pass, Fail
@@ -484,3 +487,5 @@
 deferred_closurize_load_library_test: Fail
 deferred_load_library_wrong_args_test/01: Fail
 deferred_load_library_wrong_args_test/none: Fail
+deferred_load_inval_code_test: Fail
+
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 9b9e08e..4b30660 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -63,24 +63,8 @@
 double_to_string_as_exponential2_test: RuntimeError # Issue 12749
 double_to_string_as_fixed2_test: RuntimeError # Issue 12749
 double_to_string_as_precision2_test: RuntimeError # Issue 12749
-list_literal1_test/01: MissingCompileTimeError, OK # Checked mode test.
-map_literal1_test/01: MissingCompileTimeError, OK # Checked mode test.
-compile_time_constant_checked_test/02: MissingCompileTimeError, OK
-compile_time_constant_checked2_test/01: MissingCompileTimeError, OK
-compile_time_constant_checked2_test/02: MissingCompileTimeError, OK
-compile_time_constant_checked2_test/03: MissingCompileTimeError, OK
-compile_time_constant_checked2_test/04: MissingCompileTimeError, OK
-compile_time_constant_checked2_test/05: MissingCompileTimeError, OK
-compile_time_constant_checked2_test/06: MissingCompileTimeError, OK
-compile_time_constant_checked3_test/01: MissingCompileTimeError, OK
-compile_time_constant_checked3_test/02: MissingCompileTimeError, OK
-compile_time_constant_checked3_test/03: MissingCompileTimeError, OK
-compile_time_constant_checked3_test/04: MissingCompileTimeError, OK
-compile_time_constant_checked3_test/05: MissingCompileTimeError, OK
-compile_time_constant_checked3_test/06: MissingCompileTimeError, OK
-type_check_const_function_typedef2_test/00: MissingCompileTimeError, OK
-malformed2_test/01: MissingCompileTimeError, OK
 generic_test: RuntimeError, OK
+map_literal4_test: RuntimeError, OK # Checked mode required.
 named_parameters_type_test/01: MissingRuntimeError, OK
 named_parameters_type_test/02: MissingRuntimeError, OK
 named_parameters_type_test/03: MissingRuntimeError, OK
@@ -89,7 +73,7 @@
 issue13474_test: RuntimeError, OK
 
 [ $compiler == dart2js && $minified ]
-cyclic_type_test: Fail # Issue 12605
+cyclic_type_test/0*: Fail # Issue 12605
 cyclic_type2_test: Fail # Issue 12605
 f_bounded_quantification4_test: Fail # Issue 12605
 f_bounded_quantification5_test: Fail # Issue 12605
@@ -137,6 +121,8 @@
 invocation_mirror2_test: RuntimeError # Issue 6490 (wrong retval).
 generic_closure_test: RuntimeError # Issue 12605
 call_closurization_test: RuntimeError # Issue 17474
+const_switch_test/02: RuntimeError # Issue 17960
+const_switch_test/04: RuntimeError # Issue 17960
 
 # Compilation errors.
 const_var_test: CompileTimeError # Issue 12793
@@ -144,7 +130,6 @@
 method_override5_test: RuntimeError # Issue 12809
 external_test/13: CompileTimeError # Issue 12887
 list_literal4_test: RuntimeError # Issue 12890
-map_literal4_test: RuntimeError # Issue 12891
 built_in_identifier_test/01: CompileTimeError # Issue 13022
 
 scope_variable_test/01: MissingCompileTimeError # Issue 13016
@@ -222,12 +207,11 @@
 not_enough_positional_arguments_test/05: Fail # Issue 12839
 
 metadata_test: Fail # Issue 12762
+const_evaluation_test/01: Fail # Issue 12762
 const_var_test: CompileTimeError # Issue 12794
 map_literal3_test: Fail # Issue 12794
 external_test/13: Fail # Issue 12888
 built_in_identifier_test/01: Fail # Issue 13022
-list_literal1_test/01: Fail # Issue 12993
-map_literal1_test/01: Fail # Issue 12993
 method_override4_test: Fail # Issue 12810
 method_override5_test: Fail # Issue 12810
 scope_variable_test/01: Fail # Issue 13016
@@ -236,8 +220,6 @@
 factory_redirection_test/03: Crash # Issue 12753
 factory_redirection_test/09: Fail # Issue 12753
 
-malbounded_type_literal_test: Fail # Issue 13960
-
 # DartVM problem.
 constructor5_test: Fail
 constructor6_test: Fail
@@ -248,23 +230,6 @@
 new_expression_type_args_test/00: Fail # Wrongly reports compile-time error.
 new_expression_type_args_test/01: Fail # Wrongly reports compile-time error.
 
-# Only checked mode reports an error on type assignment
-# problems in compile time constants.
-compile_time_constant_checked_test/02: Fail, OK
-compile_time_constant_checked2_test/01: Fail, OK
-compile_time_constant_checked2_test/02: Fail, OK
-compile_time_constant_checked2_test/03: Fail, OK
-compile_time_constant_checked2_test/04: Fail, OK
-compile_time_constant_checked2_test/05: Fail, OK
-compile_time_constant_checked2_test/06: Fail, OK
-compile_time_constant_checked3_test/01: Fail, OK
-compile_time_constant_checked3_test/02: Fail, OK
-compile_time_constant_checked3_test/03: Fail, OK
-compile_time_constant_checked3_test/04: Fail, OK
-compile_time_constant_checked3_test/05: Fail, OK
-compile_time_constant_checked3_test/06: Fail, OK
-malformed2_test/01: Fail, OK
-
 [ $compiler == dart2dart && $checked ]
 # Dart VM problems
 malbounded_type_cast_test: Fail # Issue 14123
@@ -272,7 +237,7 @@
 malbounded_instantiation_test/01: Fail # Issue 14132
 
 [ $compiler == dart2dart && $minified ]
-cyclic_type_test: Fail # Issue 12605.
+cyclic_type_test/0*: Fail # Issue 12605.
 cyclic_type2_test: Fail # Issue 12605.
 super_getter_setter_test: Fail # Issue 11065.
 f_bounded_quantification4_test: Fail # Issue 12605.
diff --git a/tests/language/list_literal1_test.dart b/tests/language/list_literal1_test.dart
index e029a79..7d9c2ca 100644
--- a/tests/language/list_literal1_test.dart
+++ b/tests/language/list_literal1_test.dart
@@ -1,12 +1,11 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--enable_type_checks
 //
 // When type checks are enabled, a type mismatch in a list literal is a compile-time error
 
 main() {
   var m = const
-      <String>  /// 01: compile-time error
+      <String>  /// 01: checked mode compile-time error
       [0, 1];
 }
diff --git a/tests/language/malformed2_test.dart b/tests/language/malformed2_test.dart
index cab3aba..84011c4 100644
--- a/tests/language/malformed2_test.dart
+++ b/tests/language/malformed2_test.dart
@@ -49,7 +49,7 @@
   }
 }
 
-const Unresolved c1 = 0; /// 01: static type warning, compile-time error
+const Unresolved c1 = 0; /// 01: static type warning, checked mode compile-time error
 
 void main() {
   print(c1); /// 01: continued
diff --git a/tests/language/map_literal1_test.dart b/tests/language/map_literal1_test.dart
index af75129..c6a55eb 100644
--- a/tests/language/map_literal1_test.dart
+++ b/tests/language/map_literal1_test.dart
@@ -1,13 +1,12 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--enable_type_checks
 //
 // When type checks are enabled, a type mismatch in a map literal is a compile-time error
 
 main() {
   var m = const
-      <String, String>  /// 01: compile-time error
+      <String, String>  /// 01: checked mode compile-time error
       {"a": 0};
 }
 
diff --git a/tests/language/map_literal4_test.dart b/tests/language/map_literal4_test.dart
index ce922fe..3b51d82 100644
--- a/tests/language/map_literal4_test.dart
+++ b/tests/language/map_literal4_test.dart
@@ -51,5 +51,3 @@
   var t = new MapLiteral4Test<int>();
   Expect.equals(110111, t.test());
 }
-
-
diff --git a/tests/language/mixin_bound_test.dart b/tests/language/mixin_bound_test.dart
index a4d7d46..3bef029 100644
--- a/tests/language/mixin_bound_test.dart
+++ b/tests/language/mixin_bound_test.dart
@@ -101,7 +101,7 @@
 // import 'multiplicationEvaluator.dart';
 // import 'stringConverter.dart';
 
-class Expression =
+abstract class Expression =
   AbstractExpression with ExpressionWithEval, ExpressionWithStringConversion;
 
 class Addition =
diff --git a/tests/language/proxy3_test.dart b/tests/language/proxy3_test.dart
new file mode 100644
index 0000000..600f133
--- /dev/null
+++ b/tests/language/proxy3_test.dart
@@ -0,0 +1,24 @@
+// 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 for static warnings for member access on classes with @proxy annotation.
+
+const isFalse = identical(-0.0, 0);
+
+const validProxy = isFalse ? null : proxy;
+const invalidProxy = isFalse ? proxy : null;
+
+@validProxy
+class ValidProxy {}
+
+@invalidProxy
+class InvalidProxy {}
+
+main() {
+  try { new InvalidProxy().foo; } catch (e) {}  /// 01: static type warning
+  try { new InvalidProxy().foo(); } catch (e) {}  /// 02: static type warning
+
+  try { new ValidProxy().foo; } catch (e) {} /// 03: ok
+  try { new ValidProxy().foo(); } catch (e) {} /// 04: ok
+}
diff --git a/tests/lib/async/deferred/deferred_fail_to_load_test.dart b/tests/lib/async/deferred/deferred_fail_to_load_test.dart
index 6ac1406..31ecee3 100644
--- a/tests/lib/async/deferred/deferred_fail_to_load_test.dart
+++ b/tests/lib/async/deferred/deferred_fail_to_load_test.dart
@@ -1,7 +1,7 @@
 import 'dart:isolate';
 import 'dart:async';
 import 'dart:html';
-import '../../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 @a import 'deferred_in_isolate_lib.dart' as lib1;
 @b import 'deferred_api_library.dart' as lib2;
diff --git a/tests/lib/async/deferred/deferred_in_isolate_test.dart b/tests/lib/async/deferred/deferred_in_isolate_test.dart
index cfeaabe..bdd8b06 100644
--- a/tests/lib/async/deferred/deferred_in_isolate_test.dart
+++ b/tests/lib/async/deferred/deferred_in_isolate_test.dart
@@ -1,6 +1,6 @@
 import 'dart:isolate';
 import 'dart:async';
-import '../../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 @a import 'deferred_in_isolate_lib.dart' as lib1;
 @b import 'deferred_api_library.dart' as lib2;
diff --git a/tests/lib/async/first_regression_test.dart b/tests/lib/async/first_regression_test.dart
index 69e18ed..71d190a 100644
--- a/tests/lib/async/first_regression_test.dart
+++ b/tests/lib/async/first_regression_test.dart
@@ -6,7 +6,7 @@
 
 library first_regression_test;
 import 'dart:async';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 class DoubleTransformer<T> implements StreamTransformer<T, T> {
   Stream<T> bind(Stream<T> stream) {
@@ -26,6 +26,6 @@
     new Stream.fromIterable([1, 2])
         .transform(new DoubleTransformer())
         .first
-        .then(expectAsync1((e) {}));
+        .then(expectAsync((e) {}));
   });
 }
diff --git a/tests/lib/async/future_timeout_test.dart b/tests/lib/async/future_timeout_test.dart
index d81c87f..8209b8b 100644
--- a/tests/lib/async/future_timeout_test.dart
+++ b/tests/lib/async/future_timeout_test.dart
@@ -5,14 +5,14 @@
 library future_timeout_test;
 
 import 'dart:async';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 main() {
   test("timeoutNoComplete", () {
     Completer completer = new Completer();
     Future timedOut = completer.future.timeout(
         const Duration(milliseconds: 5), onTimeout: () => 42);
-    timedOut.then(expectAsync1((v) {
+    timedOut.then(expectAsync((v) {
       expect(v, 42);
     }));
   });
@@ -24,7 +24,7 @@
     Timer timer = new Timer(const Duration(seconds: 1), () {
       completer.complete(-1);
     });
-    timedOut.then(expectAsync1((v) {
+    timedOut.then(expectAsync((v) {
       expect(v, 42);
     }));
   });
@@ -36,7 +36,7 @@
     });
     Future timedOut = completer.future.timeout(
         const Duration(seconds: 1), onTimeout: () => -1);
-    timedOut.then(expectAsync1((v) {
+    timedOut.then(expectAsync((v) {
       expect(v, 42);
     }));
   });
@@ -46,7 +46,7 @@
     completer.complete(42);
     Future timedOut = completer.future.timeout(
         const Duration(milliseconds: 5), onTimeout: () => -1);
-    timedOut.then(expectAsync1((v) {
+    timedOut.then(expectAsync((v) {
       expect(v, 42);
     }));
   });
@@ -55,7 +55,7 @@
     Completer completer = new Completer();
     Future timedOut = completer.future.timeout(
         const Duration(milliseconds: 5), onTimeout: () { throw "EXN1"; });
-    timedOut.catchError(expectAsync2((e, s) {
+    timedOut.catchError(expectAsync((e, s) {
       expect(e, "EXN1");
     }));
   });
@@ -67,7 +67,7 @@
     Timer timer = new Timer(const Duration(seconds: 1), () {
       completer.completeError("EXN2");
     });
-    timedOut.then(expectAsync1((v) {
+    timedOut.then(expectAsync((v) {
       expect(v, 42);
     }));
   });
@@ -79,7 +79,7 @@
     });
     Future timedOut = completer.future.timeout(
         const Duration(seconds: 1), onTimeout: () => -1);
-    timedOut.catchError(expectAsync2((e, s) {
+    timedOut.catchError(expectAsync((e, s) {
       expect(e, "EXN3");
     }));
   });
@@ -90,7 +90,7 @@
     completer.completeError("EXN4");
     Future timedOut = completer.future.timeout(
         const Duration(milliseconds: 5), onTimeout: () => -1);
-    timedOut.catchError(expectAsync2((e, s) {
+    timedOut.catchError(expectAsync((e, s) {
       expect(e, "EXN4");
     }));
   });
@@ -100,7 +100,7 @@
     Completer completer = new Completer();
     Future timedOut = completer.future.timeout(
         const Duration(milliseconds: 5), onTimeout: () => result);
-    timedOut.then(expectAsync1((v) {
+    timedOut.then(expectAsync((v) {
       expect(v, 42);
     }));
   });
@@ -110,7 +110,7 @@
     Completer completer = new Completer();
     Future timedOut = completer.future.timeout(
         const Duration(milliseconds: 5), onTimeout: () => result);
-    timedOut.catchError(expectAsync2((e, s) {
+    timedOut.catchError(expectAsync((e, s) {
       expect(e, "EXN5");
     }));
   });
@@ -123,7 +123,7 @@
       result.complete(42);
       return result.future;
     });
-    timedOut.then(expectAsync1((v) {
+    timedOut.then(expectAsync((v) {
       expect(v, 42);
     }));
   });
@@ -136,7 +136,7 @@
       result.completeError("EXN6");
       return result.future;
     });
-    timedOut.catchError(expectAsync2((e, s) {
+    timedOut.catchError(expectAsync((e, s) {
       expect(e, "EXN6");
     }));
   });
@@ -158,7 +158,7 @@
           registerCallDelta++;  // Increment calls to register.
           expect(origin, forked);
           expect(self, forked);
-          return expectAsync0(() { registerCallDelta--; return f(); });
+          return expectAsync(() { registerCallDelta--; return f(); });
         }
     ));
     Completer completer = new Completer();
@@ -167,7 +167,7 @@
       timedOut = completer.future.timeout(const Duration(milliseconds: 5),
                                           onTimeout: callback);
     });
-    timedOut.then(expectAsync1((v) {
+    timedOut.then(expectAsync((v) {
       expect(callbackCalled, true);
       expect(registerCallDelta, 0);
       expect(Zone.current, initialZone);
@@ -179,7 +179,7 @@
     Completer completer = new Completer();
     Future timedOut = completer.future.timeout(
         const Duration(milliseconds: 5));
-    timedOut.catchError(expectAsync2((e, s) {
+    timedOut.catchError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
       expect(e.duration, const Duration(milliseconds: 5));
       expect(s, null);
diff --git a/tests/lib/async/multiple_timer_test.dart b/tests/lib/async/multiple_timer_test.dart
index 6310813..00580b9 100644
--- a/tests/lib/async/multiple_timer_test.dart
+++ b/tests/lib/async/multiple_timer_test.dart
@@ -5,7 +5,7 @@
 library multiple_timer_test;
 
 import 'dart:async';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 const Duration TIMEOUT1 = const Duration(seconds: 1);
 const Duration TIMEOUT2 = const Duration(seconds: 2);
@@ -63,12 +63,12 @@
     _message = 0;
 
     _stopwatch1.start();
-    new Timer(TIMEOUT1, expectAsync0(timeoutHandler1));
+    new Timer(TIMEOUT1, expectAsync(timeoutHandler1));
     _stopwatch2.start();
-    new Timer(TIMEOUT2, expectAsync0(timeoutHandler2));
+    new Timer(TIMEOUT2, expectAsync(timeoutHandler2));
     _stopwatch3.start();
-    new Timer(TIMEOUT3, expectAsync0(timeoutHandler3));
+    new Timer(TIMEOUT3, expectAsync(timeoutHandler3));
     _stopwatch4.start();
-    new Timer(TIMEOUT4, expectAsync0(timeoutHandler4));
+    new Timer(TIMEOUT4, expectAsync(timeoutHandler4));
   });
 }
diff --git a/tests/lib/async/schedule_microtask2_test.dart b/tests/lib/async/schedule_microtask2_test.dart
index fa55f5c..5620333 100644
--- a/tests/lib/async/schedule_microtask2_test.dart
+++ b/tests/lib/async/schedule_microtask2_test.dart
@@ -6,14 +6,14 @@
 
 import 'package:expect/expect.dart';
 import 'dart:async';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 main() {
   // Check that the callbacks are executed in order.
   test("run async in order test", () {
     int lastCallback = -1;
     for (int i = 0; i < 100; i++) {
-      scheduleMicrotask(expectAsync0(() {
+      scheduleMicrotask(expectAsync(() {
         Expect.equals(lastCallback, i - 1);
         lastCallback = i;
       }));
diff --git a/tests/lib/async/schedule_microtask3_test.dart b/tests/lib/async/schedule_microtask3_test.dart
index a93e52b..f7cb0b8 100644
--- a/tests/lib/async/schedule_microtask3_test.dart
+++ b/tests/lib/async/schedule_microtask3_test.dart
@@ -13,13 +13,13 @@
     // Check that Timers don't run before the async callbacks.
     bool timerCallbackExecuted = false;
 
-    Timer.run(expectAsync0(() { timerCallbackExecuted = true; }));
+    Timer.run(expectAsync(() { timerCallbackExecuted = true; }));
 
-    scheduleMicrotask(expectAsync0(() {
+    scheduleMicrotask(expectAsync(() {
       Expect.isFalse(timerCallbackExecuted);
     }));
 
-    scheduleMicrotask(expectAsync0(() {
+    scheduleMicrotask(expectAsync(() {
       // Busy loop.
       var sum = 1;
       var sw = new Stopwatch()..start();
@@ -27,12 +27,12 @@
         sum++;
       }
       if (sum == 0) throw "bad";  // Just to use the result.
-      scheduleMicrotask(expectAsync0(() {
+      scheduleMicrotask(expectAsync(() {
         Expect.isFalse(timerCallbackExecuted);
       }));
     }));
 
-    scheduleMicrotask(expectAsync0(() {
+    scheduleMicrotask(expectAsync(() {
       Expect.isFalse(timerCallbackExecuted);
     }));
   });
diff --git a/tests/lib/async/schedule_microtask5_test.dart b/tests/lib/async/schedule_microtask5_test.dart
index 8e068b4..09a0934 100644
--- a/tests/lib/async/schedule_microtask5_test.dart
+++ b/tests/lib/async/schedule_microtask5_test.dart
@@ -6,24 +6,24 @@
 
 import "package:expect/expect.dart";
 import 'dart:async';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 main() {
   test("run async timer after async test", () {
     // Check that Timers don't run before the async callbacks.
     bool timerCallbackExecuted = false;
 
-    scheduleMicrotask(expectAsync0(() {
+    scheduleMicrotask(expectAsync(() {
       Expect.isFalse(timerCallbackExecuted);
     }));
 
-    Timer.run(expectAsync0(() { timerCallbackExecuted = true; }));
+    Timer.run(expectAsync(() { timerCallbackExecuted = true; }));
 
-    scheduleMicrotask(expectAsync0(() {
+    scheduleMicrotask(expectAsync(() {
       Expect.isFalse(timerCallbackExecuted);
     }));
 
-    scheduleMicrotask(expectAsync0(() {
+    scheduleMicrotask(expectAsync(() {
       // Busy loop.
       var sum = 1;
       var sw = new Stopwatch()..start();
@@ -31,12 +31,12 @@
         sum++;
       }
       if (sum == 0) throw "bad";  // Just to use the result.
-      scheduleMicrotask(expectAsync0(() {
+      scheduleMicrotask(expectAsync(() {
         Expect.isFalse(timerCallbackExecuted);
       }));
     }));
 
-    scheduleMicrotask(expectAsync0(() {
+    scheduleMicrotask(expectAsync(() {
       Expect.isFalse(timerCallbackExecuted);
     }));
   });
diff --git a/tests/lib/async/stream_controller_async_test.dart b/tests/lib/async/stream_controller_async_test.dart
index e3c75b7..77e1919 100644
--- a/tests/lib/async/stream_controller_async_test.dart
+++ b/tests/lib/async/stream_controller_async_test.dart
@@ -8,7 +8,7 @@
 import 'dart:async';
 import 'dart:isolate';
 import "package:expect/expect.dart";
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 import 'event_helper.dart';
 import 'stream_state_helper.dart';
 
@@ -20,7 +20,7 @@
     StreamController c = new StreamController();
     Stream stream = c.stream.asBroadcastStream(onCancel: cancelSub);
     stream.fold(0, (a,b) => a + b)
-     .then(expectAsync1((int v) {
+     .then(expectAsync((int v) {
         Expect.equals(42, v);
     }));
     c.add(10);
@@ -32,7 +32,7 @@
     StreamController c = new StreamController();
     Stream stream = c.stream.asBroadcastStream(onCancel: cancelSub);
     stream.fold(0, (a,b) { throw "Fnyf!"; })
-     .catchError(expectAsync1((error) { Expect.equals("Fnyf!", error); }));
+     .catchError(expectAsync((error) { Expect.equals("Fnyf!", error); }));
     c.add(42);
   });
 }
@@ -42,7 +42,7 @@
     StreamController c = new StreamController();
     Stream stream = c.stream;
     stream.fold(0, (a,b) => a + b)
-    .then(expectAsync1((int v) { Expect.equals(42, v); }));
+    .then(expectAsync((int v) { Expect.equals(42, v); }));
     c.add(10);
     c.add(32);
     c.close();
@@ -52,7 +52,7 @@
     StreamController c = new StreamController();
     Stream stream = c.stream;
     stream.fold(0, (a,b) { throw "Fnyf!"; })
-            .catchError(expectAsync1((e) { Expect.equals("Fnyf!", e); }));
+            .catchError(expectAsync((e) { Expect.equals("Fnyf!", e); }));
     c.add(42);
   });
 
@@ -70,7 +70,7 @@
       (data) {
         counter += data;
       },
-      onDone: expectAsync0(() {
+      onDone: expectAsync(() {
         Expect.equals(3, counter);
       }));
   });
@@ -83,7 +83,7 @@
     StreamController c = new StreamController();
     Events actualEvents = new Events();
     Future f = c.stream.forEach(actualEvents.add);
-    f.then(expectAsync1((_) {
+    f.then(expectAsync((_) {
       actualEvents.close();
       Expect.listEquals(sentEvents.events, actualEvents.events);
     }));
@@ -95,7 +95,7 @@
     StreamController c = new StreamController();
     Events actualEvents = new Events();
     Future f = c.stream.forEach(actualEvents.add);
-    f.catchError(expectAsync1((error) {
+    f.catchError(expectAsync((error) {
       Expect.equals("bad", error);
       Expect.listEquals((new Events()..add(7)).events, actualEvents.events);
     }));
@@ -110,7 +110,7 @@
       if (x == 9) throw "bad";
       actualEvents.add(x);
     });
-    f.catchError(expectAsync1((error) {
+    f.catchError(expectAsync((error) {
       Expect.equals("bad", error);
       Expect.listEquals((new Events()..add(7)).events, actualEvents.events);
     }));
@@ -120,21 +120,21 @@
   test("firstWhere", () {
     StreamController c = new StreamController();
     Future f = c.stream.firstWhere((x) => (x % 3) == 0);
-    f.then(expectAsync1((v) { Expect.equals(9, v); }));
+    f.then(expectAsync((v) { Expect.equals(9, v); }));
     sentEvents.replay(c);
   });
 
   test("firstWhere 2", () {
     StreamController c = new StreamController();
     Future f = c.stream.firstWhere((x) => (x % 4) == 0);
-    f.catchError(expectAsync1((e) {}));
+    f.catchError(expectAsync((e) {}));
     sentEvents.replay(c);
   });
 
   test("firstWhere 3", () {
     StreamController c = new StreamController();
     Future f = c.stream.firstWhere((x) => (x % 4) == 0, defaultValue: () => 999);
-    f.then(expectAsync1((v) { Expect.equals(999, v); }));
+    f.then(expectAsync((v) { Expect.equals(999, v); }));
     sentEvents.replay(c);
   });
 
@@ -142,49 +142,49 @@
   test("lastWhere", () {
     StreamController c = new StreamController();
     Future f = c.stream.lastWhere((x) => (x % 3) == 0);
-    f.then(expectAsync1((v) { Expect.equals(87, v); }));
+    f.then(expectAsync((v) { Expect.equals(87, v); }));
     sentEvents.replay(c);
   });
 
   test("lastWhere 2", () {
     StreamController c = new StreamController();
     Future f = c.stream.lastWhere((x) => (x % 4) == 0);
-    f.catchError(expectAsync1((e) {}));
+    f.catchError(expectAsync((e) {}));
     sentEvents.replay(c);
   });
 
   test("lastWhere 3", () {
     StreamController c = new StreamController();
     Future f = c.stream.lastWhere((x) => (x % 4) == 0, defaultValue: () => 999);
-    f.then(expectAsync1((v) { Expect.equals(999, v); }));
+    f.then(expectAsync((v) { Expect.equals(999, v); }));
     sentEvents.replay(c);
   });
 
   test("singleWhere", () {
     StreamController c = new StreamController();
     Future f = c.stream.singleWhere((x) => (x % 9) == 0);
-    f.then(expectAsync1((v) { Expect.equals(9, v); }));
+    f.then(expectAsync((v) { Expect.equals(9, v); }));
     sentEvents.replay(c);
   });
 
   test("singleWhere 2", () {
     StreamController c = new StreamController();
     Future f = c.stream.singleWhere((x) => (x % 3) == 0);  // Matches 9 and 87..
-    f.catchError(expectAsync1((error) { Expect.isTrue(error is StateError); }));
+    f.catchError(expectAsync((error) { Expect.isTrue(error is StateError); }));
     sentEvents.replay(c);
   });
 
   test("first", () {
     StreamController c = new StreamController();
     Future f = c.stream.first;
-    f.then(expectAsync1((v) { Expect.equals(7, v);}));
+    f.then(expectAsync((v) { Expect.equals(7, v);}));
     sentEvents.replay(c);
   });
 
   test("first empty", () {
     StreamController c = new StreamController();
     Future f = c.stream.first;
-    f.catchError(expectAsync1((error) { Expect.isTrue(error is StateError); }));
+    f.catchError(expectAsync((error) { Expect.isTrue(error is StateError); }));
     Events emptyEvents = new Events()..close();
     emptyEvents.replay(c);
   });
@@ -192,7 +192,7 @@
   test("first error", () {
     StreamController c = new StreamController();
     Future f = c.stream.first;
-    f.catchError(expectAsync1((error) { Expect.equals("error", error); }));
+    f.catchError(expectAsync((error) { Expect.equals("error", error); }));
     Events errorEvents = new Events()..error("error")..close();
     errorEvents.replay(c);
   });
@@ -200,7 +200,7 @@
   test("first error 2", () {
     StreamController c = new StreamController();
     Future f = c.stream.first;
-    f.catchError(expectAsync1((error) { Expect.equals("error", error); }));
+    f.catchError(expectAsync((error) { Expect.equals("error", error); }));
     Events errorEvents = new Events()..error("error")..error("error2")..close();
     errorEvents.replay(c);
   });
@@ -208,14 +208,14 @@
   test("last", () {
     StreamController c = new StreamController();
     Future f = c.stream.last;
-    f.then(expectAsync1((v) { Expect.equals(87, v);}));
+    f.then(expectAsync((v) { Expect.equals(87, v);}));
     sentEvents.replay(c);
   });
 
   test("last empty", () {
     StreamController c = new StreamController();
     Future f = c.stream.last;
-    f.catchError(expectAsync1((error) { Expect.isTrue(error is StateError); }));
+    f.catchError(expectAsync((error) { Expect.isTrue(error is StateError); }));
     Events emptyEvents = new Events()..close();
     emptyEvents.replay(c);
   });
@@ -223,7 +223,7 @@
   test("last error", () {
     StreamController c = new StreamController();
     Future f = c.stream.last;
-    f.catchError(expectAsync1((error) { Expect.equals("error", error); }));
+    f.catchError(expectAsync((error) { Expect.equals("error", error); }));
     Events errorEvents = new Events()..error("error")..close();
     errorEvents.replay(c);
   });
@@ -231,7 +231,7 @@
   test("last error 2", () {
     StreamController c = new StreamController();
     Future f = c.stream.last;
-    f.catchError(expectAsync1((error) { Expect.equals("error", error); }));
+    f.catchError(expectAsync((error) { Expect.equals("error", error); }));
     Events errorEvents = new Events()..error("error")..error("error2")..close();
     errorEvents.replay(c);
   });
@@ -239,28 +239,28 @@
   test("elementAt", () {
     StreamController c = new StreamController();
     Future f = c.stream.elementAt(2);
-    f.then(expectAsync1((v) { Expect.equals(13, v);}));
+    f.then(expectAsync((v) { Expect.equals(13, v);}));
     sentEvents.replay(c);
   });
 
   test("elementAt 2", () {
     StreamController c = new StreamController();
     Future f = c.stream.elementAt(20);
-    f.catchError(expectAsync1((error) { Expect.isTrue(error is RangeError); }));
+    f.catchError(expectAsync((error) { Expect.isTrue(error is RangeError); }));
     sentEvents.replay(c);
   });
 
   test("drain", () {
     StreamController c = new StreamController();
     Future f = c.stream.drain();
-    f.then(expectAsync1((v) { Expect.equals(null, v);}));
+    f.then(expectAsync((v) { Expect.equals(null, v);}));
     sentEvents.replay(c);
   });
 
   test("drain error", () {
     StreamController c = new StreamController();
     Future f = c.stream.drain();
-    f.catchError(expectAsync1((error) { Expect.equals("error", error); }));
+    f.catchError(expectAsync((error) { Expect.equals("error", error); }));
     Events errorEvents = new Events()..error("error")..error("error2")..close();
     errorEvents.replay(c);
   });
@@ -367,7 +367,7 @@
     test("rethrow-$name-value", () {
       StreamController c = new StreamController();
       Stream s = streamValueTransform(c.stream, (v) { throw error; });
-      s.listen((_) { Expect.fail("unexpected value"); }, onError: expectAsync1(
+      s.listen((_) { Expect.fail("unexpected value"); }, onError: expectAsync(
           (e) { Expect.identical(error, e); }));
       c.add(null);
       c.close();
@@ -378,7 +378,7 @@
     test("rethrow-$name-error", () {
       StreamController c = new StreamController();
       Stream s = streamErrorTransform(c.stream, (e) { throw error; });
-      s.listen((_) { Expect.fail("unexpected value"); }, onError: expectAsync1(
+      s.listen((_) { Expect.fail("unexpected value"); }, onError: expectAsync(
           (e) { Expect.identical(error, e); }));
       c.addError(null);
       c.close();
@@ -390,7 +390,7 @@
       StreamController c = new StreamController();
       Future f = streamValueTransform(c.stream, (v) { throw error; });
       f.then((v) { Expect.fail("unreachable"); },
-             onError: expectAsync1((e) { Expect.identical(error, e); }));
+             onError: expectAsync((e) { Expect.identical(error, e); }));
       // Need two values to trigger compare for reduce.
       c.add(0);
       c.add(1);
@@ -570,7 +570,7 @@
 void testSink({bool sync, bool broadcast, bool asBroadcast}) {
   String type = "${sync?"S":"A"}${broadcast?"B":"S"}${asBroadcast?"aB":""}";
   test("$type-controller-sink", () {
-    var done = expectAsync0((){});
+    var done = expectAsync((){});
     var c = broadcast ? new StreamController.broadcast(sync: sync)
                       : new StreamController(sync: sync);
     var expected = new Events()
@@ -594,7 +594,7 @@
   });
 
   test("$type-controller-sink-canceled", () {
-    var done = expectAsync0((){});
+    var done = expectAsync((){});
     var c = broadcast ? new StreamController.broadcast(sync: sync)
                       : new StreamController(sync: sync);
     var expected = new Events()
@@ -629,7 +629,7 @@
   });
 
   test("$type-controller-sink-paused", () {
-    var done = expectAsync0((){});
+    var done = expectAsync((){});
     var c = broadcast ? new StreamController.broadcast(sync: sync)
                       : new StreamController(sync: sync);
     var expected = new Events()
@@ -678,7 +678,7 @@
 
   test("$type-controller-addstream-error-stop", () {
     // Check that addStream defaults to ending after the first error.
-    var done = expectAsync0((){});
+    var done = expectAsync((){});
     StreamController c = broadcast
         ? new StreamController.broadcast(sync: sync)
         : new StreamController(sync: sync);
@@ -703,7 +703,7 @@
   test("$type-controller-addstream-error-forward", () {
     // Check that addStream with cancelOnError:false passes all data and errors
     // to the controller.
-    var done = expectAsync0((){});
+    var done = expectAsync((){});
     StreamController c = broadcast
         ? new StreamController.broadcast(sync: sync)
         : new StreamController(sync: sync);
@@ -726,7 +726,7 @@
 
   test("$type-controller-addstream-twice", () {
     // Using addStream twice on the same stream
-    var done = expectAsync0((){});
+    var done = expectAsync((){});
     StreamController c = broadcast
         ? new StreamController.broadcast(sync: sync)
         : new StreamController(sync: sync);
diff --git a/tests/lib/async/stream_first_where_test.dart b/tests/lib/async/stream_first_where_test.dart
index 41d7325..2137a7a 100644
--- a/tests/lib/async/stream_first_where_test.dart
+++ b/tests/lib/async/stream_first_where_test.dart
@@ -7,7 +7,7 @@
 import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 import 'event_helper.dart';
 import 'stream_state_helper.dart';
 
@@ -22,7 +22,7 @@
   test("firstWhere with super class", () {
     StreamController c = new StreamController<B>();
     Future f = c.stream.firstWhere((x) => false, defaultValue: () => const A());
-    f.then(expectAsync1((v) { Expect.equals(const A(), v); }));
+    f.then(expectAsync((v) { Expect.equals(const A(), v); }));
     sentEvents.replay(c);
   });
 }
diff --git a/tests/lib/async/stream_from_iterable_test.dart b/tests/lib/async/stream_from_iterable_test.dart
index ad342fe..7e58453 100644
--- a/tests/lib/async/stream_from_iterable_test.dart
+++ b/tests/lib/async/stream_from_iterable_test.dart
@@ -7,7 +7,7 @@
 
 import "package:expect/expect.dart";
 import "dart:async";
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 import 'event_helper.dart';
 
 class IterableTest<T> {
@@ -19,7 +19,7 @@
       Events expected = new Events.fromIterable(iterable);
       Stream<T> stream = new Stream<T>.fromIterable(iterable);
       Events actual = new Events.capture(stream);
-      actual.onDone(expectAsync0(() {
+      actual.onDone(expectAsync(() {
         Expect.listEquals(expected.events, actual.events);
       }));
     });
@@ -39,7 +39,7 @@
   Iterable<int> iter = new Iterable.generate(25, (i) => i * 2);
 
   test("iterable-toList", () {
-    new Stream.fromIterable(iter).toList().then(expectAsync1((actual) {
+    new Stream.fromIterable(iter).toList().then(expectAsync((actual) {
       List expected = iter.toList();
       Expect.equals(25, expected.length);
       Expect.listEquals(expected, actual);
@@ -50,7 +50,7 @@
     new Stream.fromIterable(iter)
       .map((i) => i * 3)
       .toList()
-      .then(expectAsync1((actual) {
+      .then(expectAsync((actual) {
          List expected = iter.map((i) => i * 3).toList();
          Expect.listEquals(expected, actual);
       }));
@@ -67,7 +67,7 @@
       if (value == 20) {
         subscription.pause(new Future.delayed(duration, () {}));
       }
-    }, onDone: expectAsync0(() {
+    }, onDone: expectAsync(() {
       actual.close();
       Events expected = new Events.fromIterable(iter);
       Expect.listEquals(expected.events, actual.events);
@@ -89,7 +89,7 @@
     var c = new StreamController();
     var sink = c.sink;
 
-    var done = expectAsync0((){}, count: 2);
+    var done = expectAsync((){}, count: 2);
 
     // if this goes first, test failed (hanged). Swapping addStream and toList
     // made failure go away.
@@ -113,7 +113,7 @@
     var c = new StreamController();
     var sink = c.sink;
 
-    var done = expectAsync0((){}, count: 2);
+    var done = expectAsync((){}, count: 2);
 
     var data = [], errors = [];
     c.stream.listen(data.add, onError: errors.add, onDone: () {
@@ -135,7 +135,7 @@
 
     var c = new StreamController();
 
-    var done = expectAsync0((){}, count: 2);
+    var done = expectAsync((){}, count: 2);
 
     var data = [], errors = [];
     c.stream.listen(data.add, onError: errors.add, onDone: () {
diff --git a/tests/lib/async/stream_iterator_test.dart b/tests/lib/async/stream_iterator_test.dart
index 56240cc..57bd6cc 100644
--- a/tests/lib/async/stream_iterator_test.dart
+++ b/tests/lib/async/stream_iterator_test.dart
@@ -10,15 +10,15 @@
     StreamController c = new StreamController();
     Stream s = c.stream;
     StreamIterator i = new StreamIterator(s);
-    i.moveNext().then(expectAsync1((bool b) {
+    i.moveNext().then(expectAsync((bool b) {
       expect(b, isTrue);
       expect(42, i.current);
       return i.moveNext();
-    })).then(expectAsync1((bool b) {
+    })).then(expectAsync((bool b) {
       expect(b, isTrue);
       expect(37, i.current);
       return i.moveNext();
-    })).then(expectAsync1((bool b) {
+    })).then(expectAsync((bool b) {
       expect(b, isFalse);
     }));
     c.add(42);
@@ -33,15 +33,15 @@
     c.close();
     Stream s = c.stream;
     StreamIterator i = new StreamIterator(s);
-    i.moveNext().then(expectAsync1((bool b) {
+    i.moveNext().then(expectAsync((bool b) {
       expect(b, isTrue);
       expect(42, i.current);
       return i.moveNext();
-    })).then(expectAsync1((bool b) {
+    })).then(expectAsync((bool b) {
       expect(b, isTrue);
       expect(37, i.current);
       return i.moveNext();
-    })).then(expectAsync1((bool b) {
+    })).then(expectAsync((bool b) {
       expect(b, isFalse);
     }));
   });
@@ -50,16 +50,16 @@
     StreamController c = new StreamController();
     Stream s = c.stream;
     StreamIterator i = new StreamIterator(s);
-    i.moveNext().then(expectAsync1((bool b) {
+    i.moveNext().then(expectAsync((bool b) {
       expect(b, isTrue);
       expect(42, i.current);
       return i.moveNext();
     })).then((bool b) {
       fail("Result not expected");
-    }, onError: expectAsync1((e) {
+    }, onError: expectAsync((e) {
       expect("BAD", e);
       return i.moveNext();
-    })).then(expectAsync1((bool b) {
+    })).then(expectAsync((bool b) {
       expect(b, isFalse);
     }));
     c.add(42);
@@ -72,21 +72,21 @@
     StreamController c = new StreamController();
     Stream s = c.stream;
     StreamIterator i = new StreamIterator(s);
-    i.moveNext().then(expectAsync1((bool b) {
+    i.moveNext().then(expectAsync((bool b) {
       expect(b, isTrue);
       expect(42, i.current);
-      new Timer(const Duration(milliseconds:100), expectAsync0(() {
+      new Timer(const Duration(milliseconds:100), expectAsync(() {
         expect(i.current, null);
         expect(() { i.moveNext(); }, throws);
         c.add(37);
         c.close();
       }));
       return i.moveNext();
-    })).then(expectAsync1((bool b) {
+    })).then(expectAsync((bool b) {
       expect(b, isTrue);
       expect(37, i.current);
       return i.moveNext();
-    })).then(expectAsync1((bool b) {
+    })).then(expectAsync((bool b) {
       expect(b, isFalse);
     }));
     c.add(42);
diff --git a/tests/lib/async/stream_join_test.dart b/tests/lib/async/stream_join_test.dart
index b7b9f78..678502c 100644
--- a/tests/lib/async/stream_join_test.dart
+++ b/tests/lib/async/stream_join_test.dart
@@ -13,7 +13,7 @@
 main() {
   test("join-empty", () {
     StreamController c = new StreamController();
-    c.stream.join("X").then(expectAsync1(
+    c.stream.join("X").then(expectAsync(
       (String s) => expect(s, equals(""))
     ));
     c.close();
@@ -21,7 +21,7 @@
 
   test("join-single", () {
     StreamController c = new StreamController();
-    c.stream.join("X").then(expectAsync1(
+    c.stream.join("X").then(expectAsync(
       (String s) => expect(s, equals("foo"))
     ));
     c.add("foo");
@@ -30,7 +30,7 @@
 
   test("join-three", () {
     StreamController c = new StreamController();
-    c.stream.join("X").then(expectAsync1(
+    c.stream.join("X").then(expectAsync(
       (String s) => expect(s, equals("fooXbarXbaz"))
     ));
     c.add("foo");
@@ -41,7 +41,7 @@
 
   test("join-three-non-string", () {
     StreamController c = new StreamController();
-    c.stream.join("X").then(expectAsync1(
+    c.stream.join("X").then(expectAsync(
       (String s) => expect(s, equals("fooXbarXbaz"))
     ));
     c.add(new Foo("foo"));
@@ -52,7 +52,7 @@
 
   test("join-error", () {
     StreamController c = new StreamController();
-    c.stream.join("X").catchError(expectAsync1(
+    c.stream.join("X").catchError(expectAsync(
       (String s) => expect(s, equals("BAD!"))
     ));
     c.add(new Foo("foo"));
diff --git a/tests/lib/async/stream_last_where_test.dart b/tests/lib/async/stream_last_where_test.dart
index c02d608..790ae62 100644
--- a/tests/lib/async/stream_last_where_test.dart
+++ b/tests/lib/async/stream_last_where_test.dart
@@ -7,7 +7,7 @@
 import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 import 'event_helper.dart';
 import 'stream_state_helper.dart';
 
@@ -22,7 +22,7 @@
   test("lastWhere with super class", () {
     StreamController c = new StreamController<B>();
     Future f = c.stream.lastWhere((x) => false, defaultValue: () => const A());
-    f.then(expectAsync1((v) { Expect.equals(const A(), v); }));
+    f.then(expectAsync((v) { Expect.equals(const A(), v); }));
     sentEvents.replay(c);
   });
 }
diff --git a/tests/lib/async/stream_periodic2_test.dart b/tests/lib/async/stream_periodic2_test.dart
index b9a17f8..ce0bdda 100644
--- a/tests/lib/async/stream_periodic2_test.dart
+++ b/tests/lib/async/stream_periodic2_test.dart
@@ -6,7 +6,7 @@
 library dart.test.stream_from_iterable;
 
 import "dart:async";
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 main() {
   test("stream-periodic2", () {
@@ -14,7 +14,7 @@
                                         (x) => x);
     int receivedCount = 0;
     var subscription;
-    subscription = stream.listen(expectAsync1((data) {
+    subscription = stream.listen(expectAsync((data) {
       expect(data, receivedCount);
       receivedCount++;
       if (receivedCount == 5) subscription.cancel();
diff --git a/tests/lib/async/stream_periodic3_test.dart b/tests/lib/async/stream_periodic3_test.dart
index a82e556..437a8a6 100644
--- a/tests/lib/async/stream_periodic3_test.dart
+++ b/tests/lib/async/stream_periodic3_test.dart
@@ -6,7 +6,7 @@
 library dart.test.stream_from_iterable;
 
 import "dart:async";
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 // The stopwatch is more precise than the Timer.
 // Some browsers (Firefox and IE so far) can trigger too early. So we add more
@@ -19,7 +19,7 @@
     Stopwatch watch = new Stopwatch()..start();
     Stream stream = new Stream.periodic(const Duration(milliseconds: 1),
                                         (x) => x);
-    stream.take(10).listen((_) { }, onDone: expectAsync0(() {
+    stream.take(10).listen((_) { }, onDone: expectAsync(() {
       int millis = watch.elapsedMilliseconds + safetyMargin;
       expect(millis, greaterThan(10));
     }));
diff --git a/tests/lib/async/stream_periodic4_test.dart b/tests/lib/async/stream_periodic4_test.dart
index 779947b..fac4742 100644
--- a/tests/lib/async/stream_periodic4_test.dart
+++ b/tests/lib/async/stream_periodic4_test.dart
@@ -6,10 +6,10 @@
 library dart.test.stream_from_iterable;
 
 import "dart:async";
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 void runTest(period, maxElapsed, pauseDuration) {
-  Function done = expectAsync0(() { });
+  Function done = expectAsync(() { });
 
   Stopwatch watch = new Stopwatch()..start();
   Stream stream = new Stream.periodic(period, (x) => x);
diff --git a/tests/lib/async/stream_periodic5_test.dart b/tests/lib/async/stream_periodic5_test.dart
index 12a5198..46b685c 100644
--- a/tests/lib/async/stream_periodic5_test.dart
+++ b/tests/lib/async/stream_periodic5_test.dart
@@ -6,7 +6,7 @@
 library dart.test.stream_from_iterable;
 
 import "dart:async";
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 watchMs(Stopwatch watch) {
   int microsecs = watch.elapsedMicroseconds;
@@ -39,6 +39,6 @@
           subscription.resume();
         });
       } 
-    }, onDone: expectAsync0(() { }));
+    }, onDone: expectAsync(() { }));
   });
 }
diff --git a/tests/lib/async/stream_periodic_test.dart b/tests/lib/async/stream_periodic_test.dart
index 32359f6..b333966 100644
--- a/tests/lib/async/stream_periodic_test.dart
+++ b/tests/lib/async/stream_periodic_test.dart
@@ -6,14 +6,14 @@
 library dart.test.stream_from_iterable;
 
 import "dart:async";
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 main() {
   test("stream-periodic1", () {
     Stream stream = new Stream.periodic(const Duration(milliseconds: 1));
     int receivedCount = 0;
     var subscription;
-    subscription = stream.listen(expectAsync1((data) {
+    subscription = stream.listen(expectAsync((data) {
       expect(data, isNull);
       receivedCount++;
       if (receivedCount == 5) subscription.cancel();
diff --git a/tests/lib/async/stream_single_test.dart b/tests/lib/async/stream_single_test.dart
index 4c3c486..8b3174e 100644
--- a/tests/lib/async/stream_single_test.dart
+++ b/tests/lib/async/stream_single_test.dart
@@ -8,28 +8,28 @@
 import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 import 'event_helper.dart';
 
 main() {
   test("single", () {
     StreamController c = new StreamController(sync: true);
     Future f = c.stream.single;
-    f.then(expectAsync1((v) { Expect.equals(42, v);}));
+    f.then(expectAsync((v) { Expect.equals(42, v);}));
     new Events.fromIterable([42]).replay(c);
   });
 
   test("single empty", () {
     StreamController c = new StreamController(sync: true);
     Future f = c.stream.single;
-    f.catchError(expectAsync1((error) { Expect.isTrue(error is StateError); }));
+    f.catchError(expectAsync((error) { Expect.isTrue(error is StateError); }));
     new Events.fromIterable([]).replay(c);
   });
 
   test("single error", () {
     StreamController c = new StreamController(sync: true);
     Future f = c.stream.single;
-    f.catchError(expectAsync1((error) { Expect.equals("error", error); }));
+    f.catchError(expectAsync((error) { Expect.equals("error", error); }));
     Events errorEvents = new Events()..error("error")..close();
     errorEvents.replay(c);
   });
@@ -37,7 +37,7 @@
   test("single error 2", () {
     StreamController c = new StreamController(sync: true);
     Future f = c.stream.single;
-    f.catchError(expectAsync1((error) { Expect.equals("error", error); }));
+    f.catchError(expectAsync((error) { Expect.equals("error", error); }));
     Events errorEvents = new Events()..error("error")..error("error2")..close();
     errorEvents.replay(c);
   });
@@ -45,7 +45,7 @@
   test("single error 3", () {
     StreamController c = new StreamController(sync: true);
     Future f = c.stream.single;
-    f.catchError(expectAsync1((error) { Expect.equals("error", error); }));
+    f.catchError(expectAsync((error) { Expect.equals("error", error); }));
     Events errorEvents = new Events()..add(499)..error("error")..close();
     errorEvents.replay(c);
   });
diff --git a/tests/lib/async/stream_single_to_multi_subscriber_test.dart b/tests/lib/async/stream_single_to_multi_subscriber_test.dart
index 8fd37e1..766f1bd 100644
--- a/tests/lib/async/stream_single_to_multi_subscriber_test.dart
+++ b/tests/lib/async/stream_single_to_multi_subscriber_test.dart
@@ -8,7 +8,7 @@
 import "package:expect/expect.dart";
 import 'dart:async';
 import 'dart:isolate';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 import 'event_helper.dart';
 
 main() {
@@ -16,8 +16,8 @@
     StreamController c = new StreamController<int>(sync: true);
     Stream<int> multi = c.stream.asBroadcastStream();
     // Listen twice.
-    multi.listen(expectAsync1((v) => Expect.equals(42, v)));
-    multi.listen(expectAsync1((v) => Expect.equals(42, v)));
+    multi.listen(expectAsync((v) => Expect.equals(42, v)));
+    multi.listen(expectAsync((v) => Expect.equals(42, v)));
     c.add(42);
   });
 
@@ -27,10 +27,10 @@
     Events expected = new Events.fromIterable([1, 2, 3, 4, 5]);
     Events actual1 = new Events.capture(multi);
     Events actual2 = new Events.capture(multi);
-    actual1.onDone(expectAsync0(() {
+    actual1.onDone(expectAsync(() {
       Expect.listEquals(expected.events, actual1.events);
     }));
-    actual2.onDone(expectAsync0(() {
+    actual2.onDone(expectAsync(() {
       Expect.listEquals(expected.events, actual2.events);
     }));
     expected.replay(c);
@@ -42,10 +42,10 @@
     Events expected = new Events.fromIterable([1, 2, 3, 4, 5]);
     Events actual1 = new Events.capture(multi);
     Events actual2 = new Events.capture(multi);
-    actual1.onDone(expectAsync0(() {
+    actual1.onDone(expectAsync(() {
       Expect.listEquals(expected.events, actual1.events);
     }));
-    actual2.onDone(expectAsync0(() {
+    actual2.onDone(expectAsync(() {
       Expect.listEquals(expected.events, actual2.events);
     }));
     expected.replay(c);
diff --git a/tests/lib/async/stream_state_helper.dart b/tests/lib/async/stream_state_helper.dart
index f0727d6..0ba61fc 100644
--- a/tests/lib/async/stream_state_helper.dart
+++ b/tests/lib/async/stream_state_helper.dart
@@ -4,7 +4,7 @@
 
 library stream_state_helper;
 
-import "../../../pkg/unittest/lib/unittest.dart";
+import "package:unittest/unittest.dart";
 import "dart:async";
 import "dart:collection";
 
@@ -64,7 +64,7 @@
         onListen: _onListen,
         onCancel: _onCancel);
     _controllerStream = _controller.stream;
-    _onComplete = expectAsync0((){
+    _onComplete = expectAsync((){
       _onComplete = null;  // Being null marks the test as being complete.
     });
   }
@@ -78,7 +78,7 @@
         onResume: _onResume,
         onCancel: _onCancel);
     _controllerStream = _controller.stream;
-    _onComplete = expectAsync0((){
+    _onComplete = expectAsync((){
       _onComplete = null;  // Being null marks the test as being complete.
     });
   }
@@ -94,7 +94,7 @@
     _controllerStream = _controller.stream.asBroadcastStream(
         onListen: _onBroadcastListen,
         onCancel: _onBroadcastCancel);
-    _onComplete = expectAsync0((){
+    _onComplete = expectAsync((){
       _onComplete = null;  // Being null marks the test as being complete.
     });
   }
@@ -373,11 +373,11 @@
   Function _action;
   StackTrace _stackTrace;
   Event(void action())
-      : _action = (action == null) ? null : expectAsync0(action) {
+      : _action = (action == null) ? null : expectAsync(action) {
     try { throw 0; } catch (_, s) { _stackTrace = s; }
   }
   Event.broadcast(void action(StreamSubscription sub))
-      : _action = (action == null) ? null : expectAsync1(action) {
+      : _action = (action == null) ? null : expectAsync(action) {
     try { throw 0; } catch (_, s) { _stackTrace = s; }
   }
 
diff --git a/tests/lib/async/stream_state_nonzero_timer_test.dart b/tests/lib/async/stream_state_nonzero_timer_test.dart
index 34175de..2aac000 100644
--- a/tests/lib/async/stream_state_nonzero_timer_test.dart
+++ b/tests/lib/async/stream_state_nonzero_timer_test.dart
@@ -8,7 +8,7 @@
 library stream_state_nonzero_timer_test;
 
 import "dart:async";
-import "../../../pkg/unittest/lib/unittest.dart";
+import "package:unittest/unittest.dart";
 import "stream_state_helper.dart";
 
 const ms5 = const Duration(milliseconds: 5);
diff --git a/tests/lib/async/stream_state_test.dart b/tests/lib/async/stream_state_test.dart
index acf6904..61c4470 100644
--- a/tests/lib/async/stream_state_test.dart
+++ b/tests/lib/async/stream_state_test.dart
@@ -5,7 +5,7 @@
 // Test the event/callback protocol of the stream implementations.
 library stream_state_test;
 
-import "../../../pkg/unittest/lib/unittest.dart";
+import "package:unittest/unittest.dart";
 import "stream_state_helper.dart";
 
 const ms5 = const Duration(milliseconds: 5);
diff --git a/tests/lib/async/stream_subscription_as_future_test.dart b/tests/lib/async/stream_subscription_as_future_test.dart
index 3c2c082..ef868e2 100644
--- a/tests/lib/async/stream_subscription_as_future_test.dart
+++ b/tests/lib/async/stream_subscription_as_future_test.dart
@@ -7,14 +7,14 @@
 
 import "package:expect/expect.dart";
 import 'dart:async';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 main() {
   test("subscription.asStream success", () {
     Stream stream = new Stream.fromIterable([1, 2, 3]);
     var output = [];
     var subscription = stream.listen((x) { output.add(x); });
-    subscription.asFuture(output).then(expectAsync1((o) {
+    subscription.asFuture(output).then(expectAsync((o) {
       Expect.listEquals([1, 2, 3], o);
     }));
   });
@@ -26,7 +26,7 @@
     Stream stream = controller.stream;
     var output = [];
     var subscription = stream.listen((x) { output.add(x); });
-    subscription.asFuture(output).then(expectAsync1((o) {
+    subscription.asFuture(output).then(expectAsync((o) {
       Expect.listEquals([1, 2, 3], o);
     }));
   });
@@ -35,7 +35,7 @@
     Stream stream = new Stream.fromIterable([1, 2, 3]).map((x) => x);
     var output = [];
     var subscription = stream.listen((x) { output.add(x); });
-    subscription.asFuture(output).then(expectAsync1((o) {
+    subscription.asFuture(output).then(expectAsync((o) {
       Expect.listEquals([1, 2, 3], o);
     }));
   });
@@ -48,7 +48,7 @@
     Stream stream = controller.stream;
     var output = [];
     var subscription = stream.listen((x) { output.add(x); });
-    subscription.asFuture(output).catchError(expectAsync1((error) {
+    subscription.asFuture(output).catchError(expectAsync((error) {
       Expect.equals(error, "foo");
     }));
   });
@@ -61,7 +61,7 @@
       });
     var output = [];
     var subscription = stream.listen((x) { output.add(x); });
-    subscription.asFuture(output).catchError(expectAsync1((error) {
+    subscription.asFuture(output).catchError(expectAsync((error) {
       Expect.equals(error, "foo");
     }));
   });
diff --git a/tests/lib/async/stream_timeout_test.dart b/tests/lib/async/stream_timeout_test.dart
index e06ba67..eac7100 100644
--- a/tests/lib/async/stream_timeout_test.dart
+++ b/tests/lib/async/stream_timeout_test.dart
@@ -13,7 +13,7 @@
     StreamController c = new StreamController();
     Stream tos = c.stream.timeout(ms5);
     expect(tos.isBroadcast, false);
-    tos.handleError(expectAsync2((e, s) {
+    tos.handleError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
       expect(s, null);
     })).listen((v){ fail("Unexpected event"); });
@@ -27,9 +27,9 @@
       sink.close();
     });
     expect(tos.isBroadcast, false);
-    tos.listen(expectAsync1((v) { expect(v, 42); }),
-               onError: expectAsync2((e, s) { expect(e, "ERROR"); }),
-               onDone: expectAsync0((){}));
+    tos.listen(expectAsync((v) { expect(v, 42); }),
+               onError: expectAsync((e, s) { expect(e, "ERROR"); }),
+               onDone: expectAsync((){}));
   });
 
   test("stream no timeout", () {
@@ -41,7 +41,7 @@
                  ctr++;
                },
                onError: (e, s) { fail("No error expected"); },
-               onDone: expectAsync0(() {
+               onDone: expectAsync(() {
                  expect(ctr, 2);
                }));
     expect(tos.isBroadcast, false);
@@ -57,7 +57,7 @@
                  expect(v, 42);
                  ctr++;
                },
-               onError: expectAsync2((e, s) {
+               onError: expectAsync((e, s) {
                  expect(ctr, 2);
                  expect(e, new isInstanceOf<TimeoutException>());
                }));
@@ -68,7 +68,7 @@
     StreamController c = new StreamController.broadcast();
     Stream tos = c.stream.timeout(ms5);
     expect(tos.isBroadcast, false);
-    tos.handleError(expectAsync2((e, s) {
+    tos.handleError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
       expect(s, null);
     })).listen((v){ fail("Unexpected event"); });
@@ -78,7 +78,7 @@
     StreamController c = new StreamController.broadcast();
     Stream tos = c.stream.asBroadcastStream().timeout(ms5);
     expect(tos.isBroadcast, false);
-    tos.handleError(expectAsync2((e, s) {
+    tos.handleError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
       expect(s, null);
     })).listen((v){ fail("Unexpected event"); });
@@ -88,7 +88,7 @@
     StreamController c = new StreamController();
     Stream tos = c.stream.map((x) => 2 * x).timeout(ms5);
     expect(tos.isBroadcast, false);
-    tos.handleError(expectAsync2((e, s) {
+    tos.handleError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
       expect(s, null);
     })).listen((v){ fail("Unexpected event"); });
@@ -121,7 +121,7 @@
     });
     sw.start();
 
-    tos.listen((v) { expect(v, 42);}, onDone: expectAsync0((){}));
+    tos.listen((v) { expect(v, 42);}, onDone: expectAsync((){}));
   });
 
   test("errors prevent timeout", () {
@@ -155,7 +155,7 @@
       onError: (e, s) {
         expect(e, "ERROR");
       },
-      onDone: expectAsync0((){}));
+      onDone: expectAsync((){}));
   });
 
   test("closing prevents timeout", () {
@@ -163,7 +163,7 @@
     Stream tos = c.stream.timeout(twoSecs, onTimeout: (_) {
       fail("Timeout not prevented by close");
     });
-    tos.listen((_) {}, onDone: expectAsync0((){}));
+    tos.listen((_) {}, onDone: expectAsync((){}));
     c.close();
   });
 
@@ -172,7 +172,7 @@
     Stream tos = c.stream.timeout(ms5, onTimeout: (_) {
       fail("Timeout not prevented by close");
     });
-    var subscription = tos.listen((_) {}, onDone: expectAsync0((){}));
+    var subscription = tos.listen((_) {}, onDone: expectAsync((){}));
     subscription.pause();
     new Timer(twoSecs, () {
       c.close();
diff --git a/tests/lib/async/stream_transform_test.dart b/tests/lib/async/stream_transform_test.dart
index 40c480c..15e21d1 100644
--- a/tests/lib/async/stream_transform_test.dart
+++ b/tests/lib/async/stream_transform_test.dart
@@ -6,7 +6,7 @@
 
 import "package:expect/expect.dart";
 import 'dart:async';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 import 'event_helper.dart';
 
 
@@ -16,7 +16,7 @@
   test("simpleDone", () {
     StreamController c = new StreamController(sync: true);
     Stream out = c.stream.handleError((x){}).handleError((x){});
-    out.listen((v){}, onDone: expectAsync0(() {}));
+    out.listen((v){}, onDone: expectAsync(() {}));
     // Should not throw.
     c.close();
   });
@@ -27,7 +27,7 @@
     Events input = new Events.fromIterable([1, 2, 3, 4, 5, 6, 7]);
     Events actual = new Events.capture(
         c.stream.map((x) => x * 2).where((x) => x > 5).skip(2).take(2));
-    actual.onDone(expectAsync0(() {
+    actual.onDone(expectAsync(() {
       Expect.listEquals(expected.events, actual.events);
     }));
     input.replay(c);
@@ -39,7 +39,7 @@
     Events input = new Events.fromIterable([1, 2, 3, 4, 5, 6, 7]);
     Events actual = new Events.capture(
         c.stream.map((x) => x * 2).where((x) => x > 5).skip(2).take(2));
-    actual.onDone(expectAsync0(() {
+    actual.onDone(expectAsync(() {
       Expect.listEquals(expected.events, actual.events);
     }));
     actual.pause();
@@ -53,7 +53,7 @@
       .transform(new StreamTransformer.fromHandlers(
                      handleData: (element, sink) { sink.add(element); },
                      handleDone: (sink) { sink.close(); }))
-      .listen(expectAsync1((e) => expect(e, equals("foo"))));
+      .listen(expectAsync((e) => expect(e, equals("foo"))));
 
     controller.add("foo");
     // Should not crash.
diff --git a/tests/lib/async/timer_cancel1_test.dart b/tests/lib/async/timer_cancel1_test.dart
index c964b15..3a35357 100644
--- a/tests/lib/async/timer_cancel1_test.dart
+++ b/tests/lib/async/timer_cancel1_test.dart
@@ -4,7 +4,7 @@
 
 library timer_cancel1_test;
 import 'dart:async';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 main() {
   // Test that a timeout handler can cancel another.
@@ -21,8 +21,8 @@
     }
 
     cancelerTimer = new Timer(const Duration(milliseconds: 1),
-                              expectAsync0(handler));
+                              expectAsync(handler));
     canceleeTimer = new Timer(const Duration(milliseconds: 1000),
-                              expectAsync0(unreachable, count: 0));
+                              expectAsync(unreachable, count: 0));
   });
 }
diff --git a/tests/lib/async/timer_cancel2_test.dart b/tests/lib/async/timer_cancel2_test.dart
index 5908109..6e8edd3 100644
--- a/tests/lib/async/timer_cancel2_test.dart
+++ b/tests/lib/async/timer_cancel2_test.dart
@@ -5,7 +5,7 @@
 library timer_cancel2_test;
 
 import 'dart:async';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 main() {
   // Test that a timeout handler can cancel itself.
@@ -17,6 +17,6 @@
     }
 
     cancelTimer = new Timer.periodic(const Duration(milliseconds: 1),
-                                     expectAsync1(cancelHandler));
+                                     expectAsync(cancelHandler));
   });
 }
diff --git a/tests/lib/async/timer_cancel_test.dart b/tests/lib/async/timer_cancel_test.dart
index 25c459b..4d17fc4 100644
--- a/tests/lib/async/timer_cancel_test.dart
+++ b/tests/lib/async/timer_cancel_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:async';
 import 'dart:isolate';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 main() {
   final ms = const Duration(milliseconds: 1);
@@ -28,17 +28,17 @@
       expect(repeatTimer, 1);
     }
 
-    cancelTimer = new Timer(ms * 1000, expectAsync0(unreachable, count: 0));
+    cancelTimer = new Timer(ms * 1000, expectAsync(unreachable, count: 0));
     cancelTimer.cancel();
-    new Timer(ms * 1000, expectAsync0(handler));
-    cancelTimer = new Timer(ms * 2000, expectAsync0(unreachable, count: 0));
+    new Timer(ms * 1000, expectAsync(handler));
+    cancelTimer = new Timer(ms * 2000, expectAsync(unreachable, count: 0));
     repeatTimer = 0;
-    new Timer.periodic(ms * 1500, expectAsync1(repeatHandler));
+    new Timer.periodic(ms * 1500, expectAsync(repeatHandler));
   });
 
   test("cancel timer with same time", () {
     var t2;
-    var t1 = new Timer(ms * 0, expectAsync0(() => t2.cancel()));
-    t2 = new Timer(ms * 0, expectAsync0(t1.cancel, count: 0));
+    var t1 = new Timer(ms * 0, expectAsync(() => t2.cancel()));
+    t2 = new Timer(ms * 0, expectAsync(t1.cancel, count: 0));
   });
 }
diff --git a/tests/lib/async/timer_isActive_test.dart b/tests/lib/async/timer_isActive_test.dart
index e9ecda1..8df8a04b 100644
--- a/tests/lib/async/timer_isActive_test.dart
+++ b/tests/lib/async/timer_isActive_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 main() {
 
@@ -11,7 +11,7 @@
     Timer t;
 
     t = new Timer(const Duration(seconds: 1),
-                  expectAsync0(() => expect(t.isActive, equals(false))));
+                  expectAsync(() => expect(t.isActive, equals(false))));
     expect(t.isActive, equals(true));
   });
 
@@ -29,14 +29,14 @@
     }
 
     t = new Timer.periodic(new Duration(milliseconds: 1),
-                           expectAsync1(checkActive, count: 3));
+                           expectAsync(checkActive, count: 3));
     expect(t.isActive, equals(true));
   });
 
   test("timer cancel test", () {
     Timer timer = new Timer(const Duration(seconds: 1),
                             () => fail("Should not be reached."));
-    Timer.run(expectAsync0(() {
+    Timer.run(expectAsync(() {
       expect(timer.isActive, equals(true));
       timer.cancel();
       expect(timer.isActive, equals(false));
diff --git a/tests/lib/async/timer_isolate_test.dart b/tests/lib/async/timer_isolate_test.dart
index 1e0cb9b..7513dad 100644
--- a/tests/lib/async/timer_isolate_test.dart
+++ b/tests/lib/async/timer_isolate_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:isolate';
 import 'dart:async';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 const Duration TIMEOUT = const Duration(milliseconds: 100);
 
@@ -28,7 +28,7 @@
 
     ReceivePort port = new ReceivePort();
 
-    port.first.then(expectAsync1((msg) {
+    port.first.then(expectAsync((msg) {
       expect("timer_fired", msg);
       int endTime = (new DateTime.now()).millisecondsSinceEpoch;
       expect(endTime - startTime + safetyMargin, greaterThanOrEqualTo(TIMEOUT.inMilliseconds));
diff --git a/tests/lib/async/timer_repeat_test.dart b/tests/lib/async/timer_repeat_test.dart
index e523ed4..e963c5a 100644
--- a/tests/lib/async/timer_repeat_test.dart
+++ b/tests/lib/async/timer_repeat_test.dart
@@ -5,7 +5,7 @@
 library timer_repeat_test;
 
 import 'dart:async';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 const Duration TIMEOUT = const Duration(milliseconds: 500);
 const int ITERATIONS = 5;
@@ -30,6 +30,6 @@
     iteration = 0;
     startTime = new DateTime.now().millisecondsSinceEpoch;
     timer = new Timer.periodic(TIMEOUT,
-        expectAsync1(timeoutHandler, count: ITERATIONS));
+        expectAsync(timeoutHandler, count: ITERATIONS));
   });
 }
diff --git a/tests/lib/async/timer_test.dart b/tests/lib/async/timer_test.dart
index 057d3a7..fc7ee87 100644
--- a/tests/lib/async/timer_test.dart
+++ b/tests/lib/async/timer_test.dart
@@ -5,7 +5,7 @@
 library timer_test;
 
 import 'dart:async';
-import '../../../pkg/unittest/lib/unittest.dart';
+import 'package:unittest/unittest.dart';
 
 const int STARTTIMEOUT = 1050;
 const int DECREASE = 200;
@@ -28,7 +28,7 @@
     timeout = timeout - DECREASE;
     Duration duration = new Duration(milliseconds: timeout);
     startTime = (new DateTime.now()).millisecondsSinceEpoch;
-    new Timer(duration, expectAsync0(timeoutHandler));
+    new Timer(duration, expectAsync(timeoutHandler));
   }
 }
 
@@ -38,6 +38,6 @@
     timeout = STARTTIMEOUT;
     Duration duration = new Duration(milliseconds: timeout);
     startTime = (new DateTime.now()).millisecondsSinceEpoch;
-    new Timer(duration, expectAsync0(timeoutHandler));
+    new Timer(duration, expectAsync(timeoutHandler));
   });
 }
diff --git a/tests/lib/convert/json_lib_test.dart b/tests/lib/convert/json_lib_test.dart
index f820273..1226f7b 100644
--- a/tests/lib/convert/json_lib_test.dart
+++ b/tests/lib/convert/json_lib_test.dart
@@ -81,9 +81,8 @@
     expect(JSON.encode(null), equals('null'));
     expect(JSON.encode(' hi there" bob '), equals('" hi there\\" bob "'));
     expect(JSON.encode('hi\\there'), equals('"hi\\\\there"'));
-    // TODO(devoncarew): these tests break the dartium build
-    //expect(JSON.encode('hi\nthere'), equals('"hi\\nthere"'));
-    //expect(JSON.encode('hi\r\nthere'), equals('"hi\\r\\nthere"'));
+    expect(JSON.encode('hi\nthere'), equals('"hi\\nthere"'));
+    expect(JSON.encode('hi\r\nthere'), equals('"hi\\r\\nthere"'));
     expect(JSON.encode(''), equals('""'));
 
     // Lists.
diff --git a/tests/lib/convert/json_pretty_test.dart b/tests/lib/convert/json_pretty_test.dart
new file mode 100644
index 0000000..0679ff4
--- /dev/null
+++ b/tests/lib/convert/json_pretty_test.dart
@@ -0,0 +1,114 @@
+// 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 json_pretty_test;
+
+import 'dart:convert';
+
+import 'package:matcher/matcher.dart';
+
+void _testIndentWithNullChar() {
+  var encoder = const JsonEncoder.withIndent('\x00');
+  var encoded = encoder.convert([[],[[]]]);
+  expect(encoded, "[\n\x00[],\n\x00[\n\x00\x00[]\n\x00]\n]");
+}
+
+void main() {
+  _testIndentWithNullChar();
+
+  _expect(null, 'null');
+
+  _expect([[],[[]]], '''
+[
+  [],
+  [
+    []
+  ]
+]''');
+
+  _expect([1, 2, 3, 4], '''
+[
+  1,
+  2,
+  3,
+  4
+]''');
+
+  _expect([true, null, 'hello', 42.42],
+      '''
+[
+  true,
+  null,
+  "hello",
+  42.42
+]''');
+
+  _expect({"hello": [], "goodbye": {} } ,
+'''{
+  "hello": [],
+  "goodbye": {}
+}''');
+
+  _expect(["test", 1, 2, 33234.324, true, false, null, {
+      "test1": "test2",
+      "test3": "test4",
+      "grace": 5,
+      "shanna": [0, 1, 2]
+    }, {
+      "lib": "app.dart",
+      "src": ["foo.dart", "bar.dart"]
+    }],
+        '''[
+  "test",
+  1,
+  2,
+  33234.324,
+  true,
+  false,
+  null,
+  {
+    "test1": "test2",
+    "test3": "test4",
+    "grace": 5,
+    "shanna": [
+      0,
+      1,
+      2
+    ]
+  },
+  {
+    "lib": "app.dart",
+    "src": [
+      "foo.dart",
+      "bar.dart"
+    ]
+  }
+]''');
+}
+
+void _expect(Object object, String expected) {
+  var encoder = const JsonEncoder.withIndent('  ');
+  var prettyOutput = encoder.convert(object);
+
+  expect(prettyOutput, expected);
+
+  encoder = const JsonEncoder.withIndent('');
+
+  var flatOutput = encoder.convert(object);
+
+  var flatExpected = const LineSplitter().convert(expected)
+      .map((line) => line.trimLeft())
+      .join('\n');
+
+  expect(flatOutput, flatExpected);
+
+  var compactOutput = JSON.encode(object);
+
+  encoder = const JsonEncoder.withIndent(null);
+  expect(encoder.convert(object), compactOutput);
+
+  var prettyDecoded = JSON.decode(prettyOutput);
+
+  expect(JSON.encode(prettyDecoded), compactOutput);
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index f55445e..461eff2 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -59,11 +59,13 @@
 mirrors/instantiate_abstract_class_test: RuntimeError # Issue 6490
 mirrors/invoke_test: RuntimeError # Issue 11954
 mirrors/invoke_call_on_closure_test: RuntimeError # 6490
-mirrors/invoke_call_through_getter_previously_accessed_test: RuntimeError # Issue 15138
-mirrors/invoke_call_through_getter_test: RuntimeError # Issue 15138
-mirrors/invoke_call_through_implicit_getter_previously_accessed_test: RuntimeError # Issue 15138
-mirrors/invoke_call_through_implicit_getter_test: RuntimeError # Issue 15138
-mirrors/invoke_closurization_test/static: RuntimeError # Issue 13002. When updating this status, please remove the "///" lines in the test.
+mirrors/invoke_call_through_getter_test/named: RuntimeError # Issue 12863. When updating the status, remove the "///" in the test.
+mirrors/invoke_call_through_getter_test/getter_call_stub: RuntimeError # Issue 17451. When updating the status, remove the "///" in the test.
+mirrors/invoke_call_through_getter_previously_accessed_test/named: RuntimeError # Issue 12863. When updating the status, remove the "///" in the test.
+mirrors/invoke_call_through_getter_previously_accessed_test/getter_call_stub: RuntimeError # Issue 17451. When updating the status, remove the "///" in the test.
+mirrors/invoke_call_through_implicit_getter_previously_accessed_test/named: RuntimeError # Issue 12863. When updating the status, remove the "///" in the test.
+mirrors/invoke_call_through_implicit_getter_previously_accessed_test/getter_call_stub: RuntimeError # Issue 17451. When updating the status, remove the "///" in the test.
+mirrors/invoke_call_through_implicit_getter_test: RuntimeError # Issue 17638
 mirrors/invoke_named_test/none: RuntimeError # Issue 12863
 mirrors/invoke_private_test: CompileTimeError # Issue 12164
 mirrors/invoke_private_wrong_library_test: CompileTimeError # Issue 12164
@@ -89,10 +91,11 @@
 mirrors/method_mirror_source_test : RuntimeError # Issue 6490
 mirrors/method_mirror_source_line_ending_test : RuntimeError # Issue 6490
 mirrors/method_mirror_location_test: RuntimeError # Issue 6490
-mirrors/mirrors_test: RuntimeError # TODO(ahe): I'm working on fixing this.
+mirrors/mirrors_test: RuntimeError # TODO(ahe): I'm working on fixing this. When removing this line please change the "endsWith" to "/mirrors_test.dart".
 mirrors/mixin_test: RuntimeError # Issue 12464
 mirrors/mixin_application_test/none: RuntimeError # Issue 12464
 mirrors/parameter_test/none: RuntimeError # Issue 6490
+mirrors/parameter_of_mixin_app_constructor_test: RuntimeError # Issue 6490
 mirrors/private_symbol_test: CompileTimeError # Issue 13597
 mirrors/proxy_type_test: RuntimeError # Issue 13842
 mirrors/redirecting_factory_test/none: RuntimeError # Issue 6490
@@ -178,6 +181,7 @@
 [ $compiler == dart2js && $checked ]
 convert/utf85_test: Pass, Slow # Issue 12029.
 mirrors/metadata_nested_constructor_call_test/none: RuntimeError # Issue 17187
+mirrors/metadata_scope_test/none: RuntimeError # Issue 17187
 
 [ $compiler == dart2js ]
 convert/chunked_conversion_utf88_test: Slow, Pass
@@ -204,7 +208,7 @@
 async/schedule_microtask6_test: Fail             # Issue 10957 - may be related to issue 10910
 
 [ $compiler == dart2dart && $minified ]
-convert/json_lib_test: Fail                      # Issue 10961
+convert/json_lib_test: Fail # Issue 10961
 
 [ $compiler == dart2js && $minified ]
 mirrors/typedef_test/01: Fail # http://dartbug.com/6490
@@ -255,6 +259,8 @@
 
 async/timer_not_available_test: SkipByDesign # only meant to test when there is no way to implement timer (currently only in d8)
 
+mirrors/mirrors_nsm_test/vm: Fail # Issue 18042
+
 [ $compiler == none && ( $runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 async/schedule_microtask6_test: Fail # Issue 10910
 mirrors/immutable_collections_test: Pass, Slow # Dartium debug uses -O0
@@ -280,6 +286,9 @@
 convert/chunked_conversion_utf88_test: Pass, Slow # Issue 12644.
 convert/utf85_test: Pass, Slow # Issue 12644.
 
+[ $arch == simarm64 ]
+*: Skip
+
 [ $compiler == none && $runtime == dartium ]
 async/schedule_microtask5_test: Pass, Timeout # Issue 13719: Please triage this failure.
 async/timer_cancel2_test: Pass, Timeout # Issue 13719: Please triage this failure.
@@ -317,6 +326,7 @@
 mirrors/removed_api_test: StaticWarning, OK # Deliberately refers to undeclared members.
 
 mirrors/deferred_mirrors_metadata_test: Fail # Issue 17522
+mirrors/metadata_scope_test/01: MissingCompileTimeError # Issue 17894
 
 [ $compiler == dart2js && $runtime == d8 && $system == windows ]
 async/*deferred*: Skip # Issue 17458
diff --git a/tests/lib/math/double_pow_test.dart b/tests/lib/math/double_pow_test.dart
index ca35db0..e8b0696 100644
--- a/tests/lib/math/double_pow_test.dart
+++ b/tests/lib/math/double_pow_test.dart
@@ -1,6 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+// VMOptions=--optimization-counter-threshold=5
 
 library math_test;
 import "package:expect/expect.dart";
@@ -53,7 +54,7 @@
   Infinity
 ];
 
-main() {
+test() {
   // Tests of pow(x, y):
   for (var d in samples) {
     // if `y` is zero (0.0 or -0.0), the result is always 1.0.
@@ -156,3 +157,6 @@
   Expect.identical(Infinity, pow(-0.0, -9223372036854775809));
 }
 
+main() {
+  for (int i = 0; i < 10; i++) test();
+}
\ No newline at end of file
diff --git a/tests/lib/math/rectangle_test.dart b/tests/lib/math/rectangle_test.dart
index 45052f6..baacd96 100644
--- a/tests/lib/math/rectangle_test.dart
+++ b/tests/lib/math/rectangle_test.dart
@@ -177,5 +177,74 @@
     expect(identical(r.width, 0.0), isTrue);
     expect(identical(r.height, 0.0), isTrue);
   });
+
+  // A NaN-value in any rectangle value means the rectange is considered
+  // empty (contains no points, doesn't intersect any other rectangle).
+  const NaN = double.NAN;
+  var isNaN = predicate((x) => x is double && x.isNaN, "NaN");
+
+  test('NaN left', () {
+    var rectangles = [
+      const Rectangle(NaN, 1, 2, 3),
+      new MutableRectangle(NaN, 1, 2, 3),
+      new Rectangle.fromPoints(new Point(NaN, 1), new Point(2, 4)),
+      new MutableRectangle.fromPoints(new Point(NaN, 1), new Point(2, 4)),
+    ];
+    for (var r in rectangles) {
+      expect(r.containsPoint(new Point(0, 1)), false);
+      expect(r.containsRectangle(new Rectangle(0, 1, 2, 3)), false);
+      expect(r.intersects(new Rectangle(0, 1, 2, 3)), false);
+      expect(r.left, isNaN);
+      expect(r.right, isNaN);
+    }
+  });
+
+  test('NaN top', () {
+    var rectangles = [
+      const Rectangle(0, NaN, 2, 3),
+      new MutableRectangle(0, NaN, 2, 3),
+      new Rectangle.fromPoints(new Point(0, NaN), new Point(2, 4)),
+      new MutableRectangle.fromPoints(new Point(0, NaN), new Point(2, 4)),
+    ];
+    for (var r in rectangles) {
+      expect(r.containsPoint(new Point(0, 1)), false);
+      expect(r.containsRectangle(new Rectangle(0, 1, 2, 3)), false);
+      expect(r.intersects(new Rectangle(0, 1, 2, 3)), false);
+      expect(r.top, isNaN);
+      expect(r.bottom, isNaN);
+    }
+  });
+
+  test('NaN width', () {
+    var rectangles = [
+      const Rectangle(0, 1, NaN, 3),
+      new MutableRectangle(0, 1, NaN, 3),
+      new Rectangle.fromPoints(new Point(0, 1), new Point(NaN, 4)),
+      new MutableRectangle.fromPoints(new Point(0, 1), new Point(NaN, 4)),
+    ];
+    for (var r in rectangles) {
+      expect(r.containsPoint(new Point(0, 1)), false);
+      expect(r.containsRectangle(new Rectangle(0, 1, 2, 3)), false);
+      expect(r.intersects(new Rectangle(0, 1, 2, 3)), false);
+      expect(r.right, isNaN);
+      expect(r.width, isNaN);
+    }
+  });
+
+  test('NaN heigth', () {
+    var rectangles = [
+      const Rectangle(0, 1, 2, NaN),
+      new MutableRectangle(0, 1, 2, NaN),
+      new Rectangle.fromPoints(new Point(0, 1), new Point(2, NaN)),
+      new MutableRectangle.fromPoints(new Point(0, 1), new Point(2, NaN)),
+    ];
+    for (var r in rectangles) {
+      expect(r.containsPoint(new Point(0, 1)), false);
+      expect(r.containsRectangle(new Rectangle(0, 1, 2, 3)), false);
+      expect(r.intersects(new Rectangle(0, 1, 2, 3)), false);
+      expect(r.bottom, isNaN);
+      expect(r.height, isNaN);
+    }
+  });
 }
 
diff --git a/tests/lib/mirrors/abstract_class_test.dart b/tests/lib/mirrors/abstract_class_test.dart
index 230097e..00e1081 100644
--- a/tests/lib/mirrors/abstract_class_test.dart
+++ b/tests/lib/mirrors/abstract_class_test.dart
@@ -130,7 +130,7 @@
 class SubNamedMA extends NamedMA {
   mixinFoo() {}
 }
-class ConcreteNamedMA = S with M;
+class ConcreteNamedMA = S with M; /// 00: static type warning
 
 abstract class NamedMA2 = S with M2;
 class SubNamedMA2 extends NamedMA2 {
@@ -159,8 +159,8 @@
   // Application is concrete.
   {
   // Mixin is abstract.
-  Expect.isFalse(reflectClass(ConcreteNamedMA).isAbstract);
-  Expect.isFalse(reflectClass(ConcreteNamedMA).superclass.isAbstract);
+  Expect.isFalse(reflectClass(ConcreteNamedMA).isAbstract); /// 00: ok
+  Expect.isFalse(reflectClass(ConcreteNamedMA).superclass.isAbstract); /// 00: ok
 
   // Mixin is concrete.
   Expect.isFalse(reflectClass(ConcreteNamedMA2).isAbstract);
diff --git a/tests/compiler/dart2js_extra/mirrors_test.dart b/tests/lib/mirrors/dart2js_mirrors_test.dart
similarity index 86%
rename from tests/compiler/dart2js_extra/mirrors_test.dart
rename to tests/lib/mirrors/dart2js_mirrors_test.dart
index cc56f5e..4ebe77c 100644
--- a/tests/compiler/dart2js_extra/mirrors_test.dart
+++ b/tests/lib/mirrors/dart2js_mirrors_test.dart
@@ -6,7 +6,7 @@
 // TODO(ahe): Remove this test.
 
 
-import '../../lib/mirrors/mirrors_test.dart' as test;
+import 'mirrors_test.dart' as test;
 
 main() {
   test.isDart2js = true;
diff --git a/tests/lib/mirrors/deferred_mirrors_metadata_lib.dart b/tests/lib/mirrors/deferred_mirrors_metadata_lib.dart
index efa29d8..b3a5d69 100644
--- a/tests/lib/mirrors/deferred_mirrors_metadata_lib.dart
+++ b/tests/lib/mirrors/deferred_mirrors_metadata_lib.dart
@@ -1,16 +1,29 @@
 library lib;
 
 import "deferred_mirrors_metadata_test.dart";
-@MirrorsUsed(targets: const ["main", "main.A", "main.B", "main.C", "lib.D"])
+@MirrorsUsed(
+    targets: const ["main", "main.A", "main.B", "main.C", "main.D", "lib.E"])
 import "dart:mirrors";
 
-@C() class D {}
+class H {
+  const H();
+}
+
+class F {
+  @H() final int f;
+}
+
+@C() class E {
+  @D() var f;
+}
 
 String foo() {
-  String c = reflectClass(D).metadata[0].invoke(#toString, []).reflectee;
+  String c = reflectClass(E).metadata[0].invoke(#toString, []).reflectee;
+  String d = reflectClass(E).declarations[#f].metadata[0]
+      .invoke(#toString, []).reflectee;
   InstanceMirror i = currentMirrorSystem().findLibrary(#main).metadata[0];
   String a = i.invoke(#toString, []).reflectee;
   String b = i.getField(#b).invoke(#toString, []).reflectee;
-  return a + b + c;
+  return a + b + c + d;
 }
 
diff --git a/tests/lib/mirrors/deferred_mirrors_metadata_test.dart b/tests/lib/mirrors/deferred_mirrors_metadata_test.dart
index be1ad57..02b007d 100644
--- a/tests/lib/mirrors/deferred_mirrors_metadata_test.dart
+++ b/tests/lib/mirrors/deferred_mirrors_metadata_test.dart
@@ -1,3 +1,7 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 @A(const B())
 library main;
 
@@ -25,10 +29,17 @@
   String toString() => "C";
 }
 
+class D {
+  const D();
+  String toString() => "D";
+}
+
 void main() {
   asyncStart();
   lib1.loadLibrary().then((_) {
-    Expect.equals("ABC", lib1.foo());
+    Expect.equals("ABCD", lib1.foo());
+    new C();
+    new D();
     asyncEnd();
   });
 }
diff --git a/tests/lib/mirrors/invoke_call_through_getter_previously_accessed_test.dart b/tests/lib/mirrors/invoke_call_through_getter_previously_accessed_test.dart
index 0f9c591..893b83c 100644
--- a/tests/lib/mirrors/invoke_call_through_getter_previously_accessed_test.dart
+++ b/tests/lib/mirrors/invoke_call_through_getter_previously_accessed_test.dart
@@ -51,14 +51,14 @@
                 im.invoke(#closure, [9, 10]).reflectee);
   Expect.equals('3 C 11 12 13 null',
                 im.invoke(#closureOpt, [11, 12, 13]).reflectee);
-  Expect.equals('4 C 14 15 null 16',
-                im.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.equals('4 C 14 15 null 16',                                        /// named: ok
+                im.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);    /// named: continued
   Expect.equals('DNU',
                 im.invoke(#doesNotExist, [17, 18]).reflectee);
-  Expect.throws(() => im.invoke(#closure, ['wrong arity']),
-                (e) => e is NoSuchMethodError);
-  Expect.throws(() => im.invoke(#notAClosure, []),
-                (e) => e is NoSuchMethodError);
+  Expect.throws(() => im.invoke(#closure, ['wrong arity']),  /// getter_call_stub: ok
+                (e) => e is NoSuchMethodError);              /// getter_call_stub: continued
+  Expect.throws(() => im.invoke(#notAClosure, []),           /// getter_call_stub: continued
+                (e) => e is NoSuchMethodError);              /// getter_call_stub: continued
 }
 
 class D {
@@ -90,8 +90,8 @@
                 cm.invoke(#closure, [9, 10]).reflectee);
   Expect.equals('3 11 12 13 null',
                 cm.invoke(#closureOpt, [11, 12, 13]).reflectee);
-  Expect.equals('4 14 15 null 16',
-                cm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.equals('4 14 15 null 16',                                         /// named: continued
+                cm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);   /// named: continued
   Expect.throws(() => cm.invoke(#closure, ['wrong arity']),
                 (e) => e is NoSuchMethodError);
 }
@@ -123,8 +123,8 @@
                 lm.invoke(#closure, [9, 10]).reflectee);
   Expect.equals('3 11 12 13 null',
                 lm.invoke(#closureOpt, [11, 12, 13]).reflectee);
-  Expect.equals('4 14 15 null 16',
-                lm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.equals('4 14 15 null 16',                                        /// named: continued
+                lm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);  /// named: continued
   Expect.throws(() => lm.invoke(#closure, ['wrong arity']),
                 (e) => e is NoSuchMethodError);
 }
diff --git a/tests/lib/mirrors/invoke_call_through_getter_test.dart b/tests/lib/mirrors/invoke_call_through_getter_test.dart
index a4afdd6..c065299 100644
--- a/tests/lib/mirrors/invoke_call_through_getter_test.dart
+++ b/tests/lib/mirrors/invoke_call_through_getter_test.dart
@@ -51,14 +51,14 @@
                 im.invoke(#closure, [9, 10]).reflectee);
   Expect.equals('3 C 11 12 13 null',
                 im.invoke(#closureOpt, [11, 12, 13]).reflectee);
-  Expect.equals('4 C 14 15 null 16',
-                im.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.equals('4 C 14 15 null 16',                                        /// named: ok
+                im.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);    /// named: continued
   Expect.equals('DNU',
                 im.invoke(#doesNotExist, [17, 18]).reflectee);
-  Expect.throws(() => im.invoke(#closure, ['wrong arity']),
-                (e) => e is NoSuchMethodError);
-  Expect.throws(() => im.invoke(#notAClosure, []),
-                (e) => e is NoSuchMethodError);
+  Expect.throws(() => im.invoke(#closure, ['wrong arity']),  /// getter_call_stub: ok
+                (e) => e is NoSuchMethodError);              /// getter_call_stub: continued
+  Expect.throws(() => im.invoke(#notAClosure, []),           /// getter_call_stub: continued
+                (e) => e is NoSuchMethodError);              /// getter_call_stub: continued
 }
 
 class D {
@@ -90,8 +90,8 @@
                 cm.invoke(#closure, [9, 10]).reflectee);
   Expect.equals('3 11 12 13 null',
                 cm.invoke(#closureOpt, [11, 12, 13]).reflectee);
-  Expect.equals('4 14 15 null 16',
-                cm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.equals('4 14 15 null 16',                                         /// named: continued
+                cm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);   /// named: continued
   Expect.throws(() => cm.invoke(#closure, ['wrong arity']),
                 (e) => e is NoSuchMethodError);
 }
@@ -123,8 +123,8 @@
                 lm.invoke(#closure, [9, 10]).reflectee);
   Expect.equals('3 11 12 13 null',
                 lm.invoke(#closureOpt, [11, 12, 13]).reflectee);
-  Expect.equals('4 14 15 null 16',
-                lm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.equals('4 14 15 null 16',                                        /// named: continued
+                lm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);  /// named: continued
   Expect.throws(() => lm.invoke(#closure, ['wrong arity']),
                 (e) => e is NoSuchMethodError);
 }
diff --git a/tests/lib/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart b/tests/lib/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart
index edda37c..a65c82d 100644
--- a/tests/lib/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart
+++ b/tests/lib/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart
@@ -57,14 +57,14 @@
                 im.invoke(#closure, [9, 10]).reflectee);
   Expect.equals('3 C 11 12 13 null',
                 im.invoke(#closureOpt, [11, 12, 13]).reflectee);
-  Expect.equals('4 C 14 15 null 16',
-                im.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.equals('4 C 14 15 null 16',                                        /// named: ok
+                im.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);    /// named: continued
   Expect.equals('DNU',
                 im.invoke(#doesNotExist, [17, 18]).reflectee);
-  Expect.throws(() => im.invoke(#closure, ['wrong arity']),
-                (e) => e is NoSuchMethodError);
-  Expect.throws(() => im.invoke(#notAClosure, []),
-                (e) => e is NoSuchMethodError);
+  Expect.throws(() => im.invoke(#closure, ['wrong arity']),  /// getter_call_stub: ok
+                (e) => e is NoSuchMethodError);              /// getter_call_stub: continued
+  Expect.throws(() => im.invoke(#notAClosure, []),           /// getter_call_stub: continued
+                (e) => e is NoSuchMethodError);              /// getter_call_stub: continued
 }
 
 class D {
@@ -96,8 +96,8 @@
                 cm.invoke(#closure, [9, 10]).reflectee);
   Expect.equals('3 11 12 13 null',
                 cm.invoke(#closureOpt, [11, 12, 13]).reflectee);
-  Expect.equals('4 14 15 null 16',
-                cm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.equals('4 14 15 null 16',                                         /// named: continued
+                cm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);   /// named: continued
   Expect.throws(() => cm.invoke(#closure, ['wrong arity']),
                 (e) => e is NoSuchMethodError);
 }
@@ -129,8 +129,8 @@
                 lm.invoke(#closure, [9, 10]).reflectee);
   Expect.equals('3 11 12 13 null',
                 lm.invoke(#closureOpt, [11, 12, 13]).reflectee);
-  Expect.equals('4 14 15 null 16',
-                lm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);
+  Expect.equals('4 14 15 null 16',                                        /// named: continued
+                lm.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);  /// named: continued
   Expect.throws(() => lm.invoke(#closure, ['wrong arity']),
                 (e) => e is NoSuchMethodError);
 }
diff --git a/tests/lib/mirrors/invoke_closurization_test.dart b/tests/lib/mirrors/invoke_closurization_test.dart
index 0b25ff0..4afaabe 100644
--- a/tests/lib/mirrors/invoke_closurization_test.dart
+++ b/tests/lib/mirrors/invoke_closurization_test.dart
@@ -24,14 +24,14 @@
   Expect.equals("A+B+C", result.reflectee('A', 'B', 'C'));
 
   ClassMirror cm = reflectClass(C);
-  result = cm.getField(#staticFunction);                             /// static: ok
-  Expect.isTrue(result.reflectee is Function, "Should be closure");  /// static: continued
-  Expect.equals("A-B-C", result.reflectee('A', 'B', 'C'));           /// static: continued
+  result = cm.getField(#staticFunction);
+  Expect.isTrue(result.reflectee is Function, "Should be closure");
+  Expect.equals("A-B-C", result.reflectee('A', 'B', 'C'));
 
   LibraryMirror lm = cm.owner;
-  result = lm.getField(#libraryFunction);                            /// static: continued
-  Expect.isTrue(result.reflectee is Function, "Should be closure");  /// static: continued
-  Expect.equals("A:B:C", result.reflectee('A', 'B', 'C'));           /// static: continued
+  result = lm.getField(#libraryFunction);
+  Expect.isTrue(result.reflectee is Function, "Should be closure");
+  Expect.equals("A:B:C", result.reflectee('A', 'B', 'C'));
 }
 
 main() {
diff --git a/tests/lib/mirrors/metadata_scope_test.dart b/tests/lib/mirrors/metadata_scope_test.dart
new file mode 100644
index 0000000..2ccf397
--- /dev/null
+++ b/tests/lib/mirrors/metadata_scope_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.metadata_scope;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+class Annotation {
+  final contents;
+  const Annotation(this.contents);
+  toString() => "Annotation($contents)";
+}
+
+// Note there is no compile-time constant 'foo' in scope. In particular, A.foo
+// is not in scope here.
+@Annotation(foo)  /// 01: compile-time error
+class A {
+  @Annotation(foo)
+  static foo() {}
+
+  @Annotation(foo)
+  static bar() {}
+}
+
+@Annotation(B.foo)
+class B {
+  @Annotation(B.foo)
+  static foo() {}
+
+  @Annotation(B.foo)
+  static bar() {}
+}
+
+baz() {}
+
+// Note the top-level function baz is in scope here, not C.baz.
+@Annotation(baz)
+class C {
+  @Annotation(baz)
+  static baz() {}
+}
+
+checkMetadata(DeclarationMirror mirror, List expectedMetadata) {
+  Expect.listEquals(expectedMetadata.map(reflect).toList(), mirror.metadata);
+}
+
+main() {
+  reflectClass(A).metadata;
+  checkMetadata(reflectClass(A).declarations[#foo], [const Annotation(A.foo)]);
+  checkMetadata(reflectClass(A).declarations[#bar], [const Annotation(A.foo)]);
+  checkMetadata(reflectClass(B), [const Annotation(B.foo)]);
+  checkMetadata(reflectClass(B).declarations[#foo], [const Annotation(B.foo)]);
+  checkMetadata(reflectClass(B).declarations[#bar], [const Annotation(B.foo)]);
+  // The top-level function baz, not C.baz.
+  checkMetadata(reflectClass(C), [const Annotation(baz)]);
+  // C.baz, not the top-level function baz.
+  checkMetadata(reflectClass(C).declarations[#baz], [const Annotation(C.baz)]);
+}
diff --git a/tests/lib/mirrors/mirrors_nsm_test.dart b/tests/lib/mirrors/mirrors_nsm_test.dart
new file mode 100644
index 0000000..88ad27c
--- /dev/null
+++ b/tests/lib/mirrors/mirrors_nsm_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library MirrorsTest;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+bool isNSMContainingFieldName(e, String fieldName, bool isSetter) {
+  print(e);
+  if (e is! NoSuchMethodError) return false;
+  String needle = fieldName;
+  if (isSetter) needle += "=";
+  return "$e".contains(needle) && ! "$e".contains(needle + "=");
+}
+
+class A {}
+
+main() {
+  var mirrors = currentMirrorSystem();
+  var libMirror = mirrors.findLibrary(#MirrorsTest);
+  Expect.throws(() => libMirror.invoke(#foo, []),
+                (e) => isNSMContainingFieldName(e, "foo", false));
+  Expect.throws(() => libMirror.getField(#foo),
+                (e) => isNSMContainingFieldName(e, "foo", false));
+  Expect.throws(() => libMirror.setField(#foo, null),             /// vm: ok
+                (e) => isNSMContainingFieldName(e, "foo", true)); /// vm: continued
+
+  var classMirror = reflect(A);
+  Expect.throws(() => classMirror.invoke(#foo, []),
+                (e) => isNSMContainingFieldName(e, "foo", false));
+  Expect.throws(() => classMirror.getField(#foo),
+                (e) => isNSMContainingFieldName(e, "foo", false));
+  Expect.throws(() => classMirror.setField(#foo, null),
+                (e) => isNSMContainingFieldName(e, "foo", true));
+
+  var instanceMirror = reflect(new A());
+  Expect.throws(() => instanceMirror.invoke(#foo, []),
+                (e) => isNSMContainingFieldName(e, "foo", false));
+  Expect.throws(() => instanceMirror.getField(#foo),
+                (e) => isNSMContainingFieldName(e, "foo", false));
+  Expect.throws(() => instanceMirror.setField(#foo, null),
+                (e) => isNSMContainingFieldName(e, "foo", true));
+
+}
diff --git a/tests/lib/mirrors/mirrors_test.dart b/tests/lib/mirrors/mirrors_test.dart
index 0dead1e..1dafef9 100644
--- a/tests/lib/mirrors/mirrors_test.dart
+++ b/tests/lib/mirrors/mirrors_test.dart
@@ -218,7 +218,9 @@
   test("Test invoke constructor", () { testInvokeConstructor(mirrors); });
   test("Test current library uri", () {
     testLibraryUri(new Class(),
-      (Uri uri) => uri.path.endsWith('/mirrors_test.dart'));
+      // TODO(floitsch): change this to "/mirrors_test.dart" when
+      // dart2js_mirrors_test.dart has been removed.
+      (Uri uri) => uri.path.endsWith('mirrors_test.dart'));
   });
   test("Test dart library uri", () {
     testLibraryUri("test", (Uri uri) => uri == Uri.parse('dart:core'));
diff --git a/tests/lib/mirrors/parameter_of_mixin_app_constructor_test.dart b/tests/lib/mirrors/parameter_of_mixin_app_constructor_test.dart
new file mode 100644
index 0000000..cbceda2
--- /dev/null
+++ b/tests/lib/mirrors/parameter_of_mixin_app_constructor_test.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.parameter_of_mixin_app_constructor;
+
+import 'dart:mirrors';
+import 'stringify.dart';
+
+class MapView {
+  final _map;
+  MapView(map) : this._map = map;
+}
+
+abstract class UnmodifiableMapMixin {
+  someFunctionality() {}
+}
+
+class UnmodifiableMapView1 extends MapView with UnmodifiableMapMixin {
+  UnmodifiableMapView1(map1) : super(map1);
+}
+
+class UnmodifiableMapView2 = MapView with UnmodifiableMapMixin;
+
+class S {
+  S(int p1, String p2);
+}
+
+class M1 { }
+class M2 { }
+class M3 { }
+
+class MorePlumbing = S with M1, M2, M3;
+
+soleConstructorOf(ClassMirror cm) {
+  return cm.declarations.values
+      .where((dm) => dm is MethodMirror && dm.isConstructor).single;
+}
+
+main() {
+  ClassMirror umv1 = reflectClass(UnmodifiableMapView1);
+  expect('[Parameter(s(map1) in s(UnmodifiableMapView1),'
+         ' type = Type(s(dynamic), top-level))]',
+         soleConstructorOf(umv1).parameters);
+  expect('[Parameter(s(map) in s(test.parameter_of_mixin_app_constructor.MapView'
+         ' with test.parameter_of_mixin_app_constructor.UnmodifiableMapMixin),'
+         ' final, type = Type(s(dynamic), top-level))]',
+         soleConstructorOf(umv1.superclass).parameters);
+  expect('[Parameter(s(map) in s(MapView),'
+         ' type = Type(s(dynamic), top-level))]',
+         soleConstructorOf(umv1.superclass.superclass).parameters);
+  expect('[]',
+         soleConstructorOf(umv1.superclass.superclass.superclass).parameters);
+
+  ClassMirror umv2 = reflectClass(UnmodifiableMapView2);
+  expect('[Parameter(s(map) in s(UnmodifiableMapView2),'
+         ' final, type = Type(s(dynamic), top-level))]',
+         soleConstructorOf(umv2).parameters);
+  expect('[Parameter(s(map) in s(MapView),'
+         ' type = Type(s(dynamic), top-level))]',
+         soleConstructorOf(umv2.superclass).parameters);
+  expect('[]',
+         soleConstructorOf(umv2.superclass.superclass).parameters);
+
+  ClassMirror mp = reflectClass(MorePlumbing);
+  expect('[Parameter(s(p1) in s(MorePlumbing),'
+         ' final, type = Type(s(dynamic), top-level)),'
+         ' Parameter(s(p2) in s(MorePlumbing),'
+         ' final, type = Type(s(dynamic), top-level))]',
+         soleConstructorOf(mp).parameters);
+  expect('[Parameter(s(p1) in s(test.parameter_of_mixin_app_constructor.S'
+         ' with test.parameter_of_mixin_app_constructor.M1,'
+         ' test.parameter_of_mixin_app_constructor.M2),'
+         ' final, type = Type(s(dynamic), top-level)),'
+         ' Parameter(s(p2) in s(test.parameter_of_mixin_app_constructor.S'
+         ' with test.parameter_of_mixin_app_constructor.M1,'
+         ' test.parameter_of_mixin_app_constructor.M2),'
+         ' final, type = Type(s(dynamic), top-level))]',
+         soleConstructorOf(mp.superclass).parameters);
+  expect('[Parameter(s(p1) in s(test.parameter_of_mixin_app_constructor.S'
+         ' with test.parameter_of_mixin_app_constructor.M1),'
+         ' final, type = Type(s(dynamic), top-level)),'
+         ' Parameter(s(p2) in s(test.parameter_of_mixin_app_constructor.S'
+         ' with test.parameter_of_mixin_app_constructor.M1),'
+         ' final, type = Type(s(dynamic), top-level))]',
+         soleConstructorOf(mp.superclass.superclass).parameters);
+  expect('[Parameter(s(p1) in s(S),'
+         ' type = Class(s(int) in s(dart.core), top-level)),'
+         ' Parameter(s(p2) in s(S),'
+         ' type = Class(s(String) in s(dart.core), top-level))]',
+         soleConstructorOf(mp.superclass.superclass.superclass).parameters);
+  expect('[]',
+         soleConstructorOf(mp.superclass.superclass.superclass.superclass).parameters);
+}
diff --git a/tests/light_unittest.dart b/tests/light_unittest.dart
index 9128ef7..fbf39af 100644
--- a/tests/light_unittest.dart
+++ b/tests/light_unittest.dart
@@ -55,14 +55,3 @@
 get throws => new Expectation((actual) => Expect.throws(actual));
 
 get isTrue => new Expectation((actual) => Expect.isTrue(actual));
-
-expectAsync1(then) {
-  asyncStart();
-  return (x) {
-    // 'then(x)' may call 'asyncStart()', so we first need to execute it, before
-    // we can call 'asyncEnd()'.
-    var result = then(x);
-    asyncEnd();
-    return result;
-  };
-}
diff --git a/tests/standalone/io/file_input_stream_test.dart b/tests/standalone/io/file_input_stream_test.dart
index 8357d53..923a44c 100644
--- a/tests/standalone/io/file_input_stream_test.dart
+++ b/tests/standalone/io/file_input_stream_test.dart
@@ -55,7 +55,7 @@
 int writeLongFileSync(File file) {
   file.createSync();
   StringBuffer buffer = new StringBuffer();
-  for (var i = 0; i < 10000; i++) {
+  for (var i = 0; i < 50000; i++) {
     buffer.write("Hello, world");
   }
   file.writeAsStringSync(buffer.toString());
diff --git a/tests/standalone/io/http_client_connect_test.dart b/tests/standalone/io/http_client_connect_test.dart
index 58835f4..b6b8e37 100644
--- a/tests/standalone/io/http_client_connect_test.dart
+++ b/tests/standalone/io/http_client_connect_test.dart
@@ -8,6 +8,7 @@
 // VMOptions=--short_socket_read --short_socket_write
 
 import 'dart:async';
+import 'dart:convert';
 import 'dart:io';
 
 import "package:async_helper/async_helper.dart";
@@ -121,6 +122,7 @@
   var completer = new Completer();
   HttpServer.bind("127.0.0.1", 0).then((server) {
     server.listen((request) {
+      request.response.bufferOutput = false;
       request.response.contentLength = 100;
       request.response.write("data");
       request.response.write("more data");
@@ -162,6 +164,52 @@
 }
 
 
+void testNoBuffer() {
+  asyncStart();
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    var response;
+    server.listen((request) {
+      response = request.response;
+      response.bufferOutput = false;
+      response.writeln('init');
+    });
+
+    var client = new HttpClient();
+    client.get("127.0.0.1", server.port, "/")
+      .then((request) => request.close())
+      .then((clientResponse) {
+        var iterator = new StreamIterator(
+            clientResponse.transform(UTF8.decoder)
+                          .transform(new LineSplitter()));
+        iterator.moveNext().then((hasValue) {
+          Expect.isTrue(hasValue);
+          Expect.equals('init', iterator.current);
+          int count = 0;
+          void run() {
+            if (count == 10) {
+              response.close();
+              iterator.moveNext().then((hasValue) {
+                Expect.isFalse(hasValue);
+                server.close();
+                asyncEnd();
+              });
+            } else {
+              response.writeln('output$count');
+              iterator.moveNext().then((hasValue) {
+                Expect.isTrue(hasValue);
+                Expect.equals('output$count', iterator.current);
+                count++;
+                run();
+              });
+            }
+          }
+          run();
+        });
+      });
+  });
+}
+
+
 void main() {
   testGetEmptyRequest();
   testGetDataRequest();
@@ -169,7 +217,7 @@
   testGetServerClose();
   testGetServerCloseNoKeepAlive();
   testGetServerForceClose();
-  // TODO(14953): This test can only run, when buffering is disabled.
-  // testGetDataServerForceClose();
+  testGetDataServerForceClose();
   testPostEmptyRequest();
+  testNoBuffer();
 }
diff --git a/tests/standalone/io/status_file_parser_test.dart b/tests/standalone/io/status_file_parser_test.dart
index 8c120c6..aabd645 100644
--- a/tests/standalone/io/status_file_parser_test.dart
+++ b/tests/standalone/io/status_file_parser_test.dart
@@ -19,7 +19,6 @@
   TestReadStatusFile("tests/dom/dom.status");
   TestReadStatusFile("tests/html/html.status");
   TestReadStatusFile("tests/isolate/isolate.status");
-  TestReadStatusFile("tests/json/json.status");
   TestReadStatusFile("tests/language/language.status");
   TestReadStatusFile("tests/standalone/standalone.status");
 }
diff --git a/tests/standalone/issue14236_source.dart b/tests/standalone/issue14236_source.dart
index 3182e48..4a55aa9 100644
--- a/tests/standalone/issue14236_source.dart
+++ b/tests/standalone/issue14236_source.dart
@@ -12,7 +12,7 @@
 // with your changes. You should understand what in your change makes
 // regeneration of the snapshot necessary.
 // Steps for regenerating:
-// 1) Swap the test and main functions below.
+// 1) Swap the test functions below.
 // 2) $ ./xcodebuild/DebugIA32/dart --package-root=./xcodebuild/DebugIA32/packages --snapshot=tests/standalone/issue14236_test.dart tests/standalone/issue14236_source.dart
 // 3) Undo changes in 1.
 
diff --git a/tests/standalone/issue14236_test.dart b/tests/standalone/issue14236_test.dart
index b837d0b..467e13a 100644
--- a/tests/standalone/issue14236_test.dart
+++ b/tests/standalone/issue14236_test.dart
Binary files differ
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 488828d..ec6f263 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -119,6 +119,9 @@
 [ $arch == mips && $mode == debug ]
 io/file_read_special_device_test: Fail # dartbug.com/17440
 
+[ $arch == simarm64 ]
+*: Skip
+
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) && $unchecked ]
 assert_test: Fail # Issue 13719: Please triage this failure.
 
diff --git a/tests/try/end_to_end_test.dart b/tests/try/end_to_end_test.dart
new file mode 100644
index 0000000..46abf8e
--- /dev/null
+++ b/tests/try/end_to_end_test.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Whitebox integration/end-to-end test of Try Dart! site.
+///
+/// This test opens Try Dart! in an iframe.  When opened the first time, Try
+/// Dart! will display a simple hello-world example, color tokens, compile the
+/// example, and run the result.  We've instrumented Try Dart! to use
+/// window.parent.postMessage when the running program prints anything. So this
+/// test just waits for a "Hello, World!" message.
+library trydart.end_to_end_test;
+
+import 'dart:html';
+import 'dart:async';
+
+// TODO(ahe): Remove this import if issue 17936 is fixed.
+import 'dart:js' as hack;
+
+import 'package:async_helper/async_helper.dart';
+
+void installErrorHandlerOn(IFrameElement iframe) {
+  // This method uses dart:js to install an error event handler on the content
+  // window of [iframe]. This is a workaround for http://dartbug.com/17936.
+  var iframeProxy = new hack.JsObject.fromBrowserObject(iframe);
+  var contentWindowProxy = iframeProxy['contentWindow'];
+  if (contentWindowProxy == null) {
+    print('No contentWindow in iframe');
+    throw 'No contentWindow in iframe';
+  }
+  contentWindowProxy.callMethod('addEventListener', ['error', (eventProxy) {
+    String filename = eventProxy['filename'];
+    int lineno = eventProxy['lineno'];
+    String message = eventProxy['message'];
+    print("Error occurred in iframe: $message");
+    new Future(() {
+      // Chrome seems to not call window.onerror when you throw in response to
+      // an error event. So we throw the error in a future.
+      throw 'Error from iframe: $filename:$lineno: $message';
+    });
+  }]);
+}
+
+void onIframeLoaded(Event event) {
+  installErrorHandlerOn(event.target);
+}
+
+void main() {
+  asyncStart();
+  window.onMessage.listen((MessageEvent e) {
+    if (e.data == 'Hello, World!\n') {
+      // Clear the DOM to work around a bug in test.dart.
+      document.body.nodes.clear();
+
+      // Clean up after ourselves.
+      window.localStorage.clear();
+
+      asyncSuccess(null);
+    } else {
+      window.console.dir(e.data);
+    }
+  });
+
+  // Clearing localStorage makes Try Dart! think it is opening for the first
+  // time.
+  window.localStorage.clear();
+
+  IFrameElement iframe = new IFrameElement()
+      ..src = '/root_build/try_dartlang_org/index.html'
+      ..style.width = '90vw'
+      ..style.height = '90vh'
+      ..onLoad.listen(onIframeLoaded);
+  document.body.append(iframe);
+  // Install an error handler both on the new iframe element, and when it has
+  // fired the load event.  That seems to matter according to some sources on
+  // stackoverflow.
+  installErrorHandlerOn(iframe);
+}
diff --git a/tests/try/paste_content_rewriting_test.dart b/tests/try/paste_content_rewriting_test.dart
index cfe9418..6241885 100644
--- a/tests/try/paste_content_rewriting_test.dart
+++ b/tests/try/paste_content_rewriting_test.dart
@@ -13,7 +13,7 @@
     InteractionManager;
 
 import '../../site/try/src/ui.dart' show
-    inputPre,
+    mainEditorPane,
     observer;
 
 import '../../site/try/src/user_option.dart' show
@@ -22,19 +22,59 @@
 import '../../pkg/expect/lib/expect.dart';
 import '../../pkg/async_helper/lib/async_helper.dart';
 
-main() {
+const Map<String, String> tests = const <String, String> {
+  '<span><p>//...</p>}</span>': '//...\n}\n',
+  'someText': 'someText\n',
+  '"\$"': '"\$"<DIAGNOSTIC>\n',
+  '"\$\$"': '"\$\$<DIAGNOSTIC>"<DIAGNOSTIC>\n',
+  '"\$\$4"': '"\$\$<DIAGNOSTIC>4<DIAGNOSTIC>"\n',
+  '"\$\$4 "': '"\$\$<DIAGNOSTIC>4<DIAGNOSTIC> "\n',
+  '1e': '1<DIAGNOSTIC>e\n',
+};
+
+List<Node> queryDiagnosticNodes() {
+  return mainEditorPane.querySelectorAll('a.diagnostic>span');
+}
+
+Future runTests() {
+  Iterator<String> keys = tests.keys.iterator;
+  keys.moveNext();
+  mainEditorPane.innerHtml = keys.current;
+
+  Future makeFuture() => new Future(() {
+    String key = keys.current;
+    print('Checking $key');
+    queryDiagnosticNodes().forEach((Node node) {
+      node.replaceWith(new Text('<DIAGNOSTIC>'));
+      observer.takeRecords(); // Discard mutations.
+    });
+    Expect.stringEquals(tests[key], mainEditorPane.text);
+    if (keys.moveNext()) {
+      key = keys.current;
+      print('Setting $key');
+      mainEditorPane.innerHtml = key;
+      return makeFuture();
+    } else {
+      // Clear the DOM to work around a bug in test.dart.
+      document.body.nodes.clear();
+      return null;
+    }
+  });
+
+  return makeFuture();
+}
+
+void main() {
   UserOption.storage = {};
 
   var interaction = new InteractionManager();
-  inputPre = new DivElement();
-  document.body.append(inputPre);
+  mainEditorPane = new DivElement();
+  document.body.append(mainEditorPane);
   observer = new MutationObserver(interaction.onMutation)
-      ..observe(inputPre, childList: true, characterData: true, subtree: true);
+      ..observe(
+          mainEditorPane, childList: true, characterData: true, subtree: true);
 
-  inputPre.innerHtml = "<span><p>//...</p>}</span>";
+  mainEditorPane.innerHtml = "<span><p>//...</p>}</span>";
 
-  asyncTest(() => new Future(() {
-    print('Welcome to the future');
-    Expect.stringEquals('//...\n}\n', inputPre.text);
-  }));
+  asyncTest(runTests);
 }
diff --git a/tests/try/try.status b/tests/try/try.status
index 1d6b071..2b285d9 100644
--- a/tests/try/try.status
+++ b/tests/try/try.status
@@ -6,5 +6,5 @@
 [ $compiler != dart2js || ($runtime != drt && $runtime != chrome) ]
 *: Skip
 
-[ $compiler == dart2js && ($runtime == drt || $runtime == chrome) ]
-paste_content_rewriting_test: Fail # http://dartbug.com/17726
+[ $csp ]
+end_to_end_test: Fail, OK # http://dartbug.com/17935
diff --git a/tests/utils/dummy_compiler_test.dart b/tests/utils/dummy_compiler_test.dart
index 54742c7..f305e9c 100644
--- a/tests/utils/dummy_compiler_test.dart
+++ b/tests/utils/dummy_compiler_test.dart
@@ -39,7 +39,10 @@
 class Dynamic_ {}
 class Null {}
 class StackTrace {}
-class LinkedHashMap {}
+class LinkedHashMap {
+  factory LinkedHashMap._empty() => null;
+  factory LinkedHashMap._literal(elements) => null;
+}
 identical(a, b) => true;
 getRuntimeTypeInfo(o) {}
 setRuntimeTypeInfo(o, i) {}
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index 5630a6f..f79ee07 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -18,3 +18,8 @@
 
 [ $compiler == dart2js && $mode == debug ]
 source_mirrors_test: Slow, Pass
+dummy_compiler_test: Slow, Pass
+source_mirrors_test: Slow, Pass
+
+[ $compiler == none && $runtime == vm && $arch == simarm64 ]
+*: Skip
diff --git a/tools/FAKE_COMMITS b/tools/FAKE_COMMITS
new file mode 100644
index 0000000..add01e9
--- /dev/null
+++ b/tools/FAKE_COMMITS
@@ -0,0 +1,7 @@
+Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+for details. All rights reserved. Use of this source code is governed by a
+BSD-style license that can be found in the LICENSE file.
+
+File for landing text only commits in the dart repo.
+
+Tracer update
diff --git a/tools/VERSION b/tools/VERSION
index d68f855..759bb9d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -25,7 +25,7 @@
 #
 CHANNEL dev
 MAJOR 1
-MINOR 3
+MINOR 4
 PATCH 0
 PRERELEASE 7
 PRERELEASE_PATCH 13
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index df7af7d..afe8f2d 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -136,20 +136,21 @@
 
 
 def NeedsXterm(compiler, runtime):
-  return runtime in ['ie9', 'ie10', 'ie11', 'chrome', 'safari', 'opera', 
+  return runtime in ['ie9', 'ie10', 'ie11', 'chrome', 'safari', 'opera',
                      'ff', 'drt', 'dartium']
 
 
-def TestStepName(name, flags):
+def TestStepName(name, runtime, flags):
   # Filter out flags with '=' as this breaks the /stats feature of the
   # build bot.
   flags = [x for x in flags if not '=' in x]
-  return ('%s tests %s' % (name, ' '.join(flags))).strip()
+  step_name = '%s-%s tests %s' % (name, runtime, ' '.join(flags))
+  return step_name.strip()
 
 
 IsFirstTestStepCall = True
 def TestStep(name, mode, system, compiler, runtime, targets, flags, arch):
-  step_name = TestStepName(name, flags)
+  step_name = TestStepName(name, runtime, flags)
   with bot.BuildStep(step_name, swallow_error=True):
     sys.stdout.flush()
     if NeedsXterm(compiler, runtime) and system == 'linux':
@@ -262,11 +263,11 @@
              unit_test_flags, arch)
 
   if compiler == 'dart2js' and runtime in ['ie10', 'ie11']:
-    TestStep("%s-%s" % (compiler, runtime), mode, system, compiler, runtime,
+    TestStep(compiler, mode, system, compiler, runtime,
              ['html', 'pkg', 'samples'], flags, arch)
   else:
     # Run the default set of test suites.
-    TestStep("%s-%s" % (compiler, runtime), mode, system, compiler,
+    TestStep(compiler, mode, system, compiler,
              runtime, [], flags, arch)
 
     if compiler == 'dart2js':
@@ -279,10 +280,10 @@
         # Run the extra tests in checked mode, but only on linux/d8.
         # Other systems have less resources and tend to time out.
         extras_flags = extras_flags + ['--host-checked']
-      TestStep("dart2js_extra", mode, system, 'dart2js', runtime, extras,
+      TestStep('dart2js_extra', mode, system, 'dart2js', runtime, extras,
                extras_flags, arch)
 
-      TestStep("try_dart", mode, system, 'dart2js', runtime, ['try'],
+      TestStep('try_dart', mode, system, 'dart2js', runtime, ['try'],
                extras_flags, arch)
 
 
diff --git a/tools/build.py b/tools/build.py
index 7fc3187..48071bd 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -11,6 +11,7 @@
 import shutil
 import subprocess
 import sys
+import time
 import utils
 
 HOST_OS = utils.GuessOS()
@@ -44,7 +45,7 @@
       default=False, action="store_true")
   result.add_option("-a", "--arch",
       help='Target architectures (comma-separated).',
-      metavar='[all,ia32,x64,simarm,arm,simmips,mips]',
+      metavar='[all,ia32,x64,simarm,arm,simmips,mips,simarm64]',
       default=utils.GuessArchitecture())
   result.add_option("--os",
     help='Target OSs (comma-separated).',
@@ -76,7 +77,7 @@
 
 def ProcessOptions(options, args):
   if options.arch == 'all':
-    options.arch = 'ia32,x64,simarm,simmips'
+    options.arch = 'ia32,x64,simarm,simmips,simarm64'
   if options.mode == 'all':
     options.mode = 'release,debug'
   if options.os == 'all':
@@ -89,7 +90,8 @@
       print "Unknown mode %s" % mode
       return False
   for arch in options.arch:
-    if not arch in ['ia32', 'x64', 'simarm', 'arm', 'simmips', 'mips']:
+    archs = ['ia32', 'x64', 'simarm', 'arm', 'simmips', 'mips', 'simarm64']
+    if not arch in archs:
       print "Unknown arch %s" % arch
       return False
   options.os = [ProcessOsOption(os) for os in options.os]
@@ -301,6 +303,42 @@
     print '\n'.join(chunk)
 
 
+def NotifyBuildDone(build_config, success, start):
+  if not success:
+    print "BUILD FAILED"
+
+  sys.stdout.flush()
+
+  # Display a notification if build time exceeded DART_BUILD_NOTIFICATION_DELAY.
+  notification_delay = float(
+    os.getenv('DART_BUILD_NOTIFICATION_DELAY', default=sys.float_info.max))
+  if (time.time() - start) < notification_delay:
+    return
+
+  if success:
+    message = 'Build succeeded.'
+  else:
+    message = 'Build failed.'
+  title = build_config
+
+  command = None
+  if HOST_OS == 'macos':
+    # Use AppleScript to display a UI non-modal notification.
+    script = 'display notification  "%s" with title "%s" sound name "Glass"' % (
+      message, title)
+    command = "osascript -e '%s' &" % script
+  elif HOST_OS == 'linux':
+    if success:
+      icon = 'dialog-information'
+    else:
+      icon = 'dialog-error'
+    command = "notify-send -i '%s' '%s' '%s' &" % (icon, message, title)
+
+  if command:
+    # Ignore return code, if this command fails, it doesn't matter.
+    os.system(command)
+
+
 def Main():
   utils.ConfigureJava()
   # Parse the options.
@@ -324,6 +362,7 @@
     for target_os in options.os:
       for mode in options.mode:
         for arch in options.arch:
+          start_time = time.time()
           os.environ['DART_BUILD_MODE'] = mode
           build_config = utils.GetBuildConf(mode, arch, target_os)
           if HOST_OS == 'macos':
@@ -404,8 +443,10 @@
             process = subprocess.Popen(args, stdin=None)
           process.wait()
           if process.returncode != 0:
-            print "BUILD FAILED"
+            NotifyBuildDone(build_config, success=False, start=start_time)
             return 1
+          else:
+            NotifyBuildDone(build_config, success=True, start=start_time)
 
   return 0
 
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index eee4c0c..fdeb28d 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -362,10 +362,4 @@
 [Suppressed]
 interface Promise {};
 
-[Suppressed]
-interface InstallEvent {};
-
-[Suppressed]
-interface InstallPhaseEvent {};
-
 Element implements GlobalEventHandlers;
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index fee093e..a86424f 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -68,6 +68,16 @@
       "@Returns('Window|=Object|Null')",
     ],
 
+    'Document.getElementsByTagName': [
+      "@Creates('NodeList|HtmlCollection')",
+      "@Returns('NodeList|HtmlCollection')",
+    ],
+
+    'Document.getElementsByClassName': [
+      "@Creates('NodeList|HtmlCollection')",
+      "@Returns('NodeList|HtmlCollection')",
+    ],
+
     # Methods returning Window can return a local window, or a cross-frame
     # window (=Object) that needs wrapping.
     'Window': [
@@ -88,6 +98,16 @@
       "@Returns('JSExtendableArray')",
     ],
 
+    'Element.getElementsByTagName': [
+      "@Creates('NodeList|HtmlCollection')",
+      "@Returns('NodeList|HtmlCollection')",
+    ],
+
+    'Element.getElementsByClassName': [
+      "@Creates('NodeList|HtmlCollection')",
+      "@Returns('NodeList|HtmlCollection')",
+    ],
+
     "ErrorEvent.error": [
       "@Creates('Null')", # Only returns values created elsewhere.
     ],
@@ -255,6 +275,16 @@
       "@annotation_Returns_SerializedScriptValue",
     ],
 
+    'ShadowRoot.getElementsByTagName': [
+      "@Creates('NodeList|HtmlCollection')",
+      "@Returns('NodeList|HtmlCollection')",
+    ],
+
+    'ShadowRoot.getElementsByClassName': [
+      "@Creates('NodeList|HtmlCollection')",
+      "@Returns('NodeList|HtmlCollection')",
+    ],
+
     'SQLResultSetRowList.item': ["@Creates('=Object')"],
 
     # Touch targets are Elements in a Document, or the Document.
diff --git a/tools/dom/scripts/databasebuilder.py b/tools/dom/scripts/databasebuilder.py
index ab04d56..1cb2d97 100755
--- a/tools/dom/scripts/databasebuilder.py
+++ b/tools/dom/scripts/databasebuilder.py
@@ -67,9 +67,7 @@
     content = f.read()
     f.close()
 
-    idl_ast = idl_parser.parse(
-      content,
-      defines=import_options.idl_defines)
+    idl_ast = idl_parser.parse(content)
     return IDLFile(idl_ast, file_name)
   except SyntaxError, e:
     raise RuntimeError('Failed to load file %s: %s: Content: %s[end]'
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index f8f98fa..c6c9b57 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -1152,7 +1152,8 @@
         suppress_interface=True),
     'GLenum': TypeData(clazz='Primitive', dart_type='int',
         native_type='unsigned'),
-    'HTMLCollection': TypeData(clazz='Interface', item_type='Node'),
+    'HTMLCollection': TypeData(clazz='Interface', item_type='Node',
+        dart_type='List<Node>'),
     'NamedNodeMap': TypeData(clazz='Interface', item_type='Node'),
     'NodeList': TypeData(clazz='Interface', item_type='Node',
                          suppress_interface=False, dart_type='List<Node>'),
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 68018b3..1b39357 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -142,7 +142,6 @@
 
 convert_to_future_members = monitored.Set(
     'htmlrenamer.converted_to_future_members', [
-  'AudioContext.decodeAudioData',
   'DataTransferItem.getAsString',
   'DirectoryEntry.getDirectory',
   'DirectoryEntry.getFile',
@@ -182,6 +181,7 @@
 # browser. They are exposed simply by placing an underscore in front of the
 # name.
 private_html_members = monitored.Set('htmlrenamer.private_html_members', [
+  'AudioContext.decodeAudioData',
   'AudioNode.connect',
   'CanvasRenderingContext2D.arc',
   'CanvasRenderingContext2D.drawImage',
diff --git a/tools/dom/scripts/idlparser.py b/tools/dom/scripts/idlparser.py
index 852d8db..f2f2d96 100755
--- a/tools/dom/scripts/idlparser.py
+++ b/tools/dom/scripts/idlparser.py
@@ -385,47 +385,14 @@
           re.compile(r'#.*'),
           re.compile(r'/\*.*?\*/', re.S))
 
-  def _pre_process(self, content, defines, includePaths):
-    """Pre-processes the content using gcc.
-
-    WebKit IDLs require pre-processing by gcc. This is done by invoking
-    gcc in a sub-process and capturing the results.
-
-    Returns:
-      The result of running gcc on the content.
-
-    Args:
-      content -- text to process.
-      defines -- an array of pre-processor defines.
-      includePaths -- an array of path strings.
-    """
-    # FIXME: Handle gcc not found, or any other processing errors
-    gcc = 'gcc'
-    cmd = [gcc, '-E', '-P', '-C', '-x', 'c++']
-    for define in defines:
-      cmd.append('-D%s' % define)
-    cmd.append('-')
-    pipe = subprocess.Popen(cmd, stdin=subprocess.PIPE,
-      stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-    (content, stderr) = pipe.communicate(content)
-    return content
-
-  def parse(self, content, defines=[], includePaths=[]):
+  def parse(self, content):
     """Parse the give content string.
 
-    The WebKit IDL syntax also allows gcc pre-processing instructions.
-    Lists of defined variables and include paths can be provided.
-
     Returns:
       An abstract syntax tree (AST).
 
     Args:
       content -- text to parse.
-      defines -- an array of pre-processor defines.
-      includePaths -- an array of path strings used by the
-        gcc pre-processor.
     """
-    if self._syntax == WEBKIT_SYNTAX:
-      content = self._pre_process(content, defines, includePaths)
 
     return self._pegparser.parse(content)
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 128882e..8a9dc68 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -239,6 +239,12 @@
     if IsPureInterface(self._interface.id) or IsCustomType(self._interface.id):
       return
 
+    interface = self._interface
+    if interface.parents:
+      supertype = '%sClassId' % interface.parents[0].type.id
+    else:
+      supertype = '-1'
+
     cpp_impl_includes = set(['"' + partial + '.h"'
                              for partial in _GetCPPPartialNames(self._interface)])
     cpp_header_handlers_emitter = emitter.Emitter()
@@ -332,7 +338,10 @@
         self._template_loader.Load('cpp_callback_implementation.template'),
         INCLUDES=self._GenerateCPPIncludes(cpp_impl_includes),
         INTERFACE=self._interface.id,
-        HANDLERS=cpp_impl_handlers_emitter.Fragments())
+        SUPER_INTERFACE=supertype,
+        HANDLERS=cpp_impl_handlers_emitter.Fragments(),
+        DART_IMPLEMENTATION_CLASS=self._interface_type_info.implementation_name(),
+        DART_IMPLEMENTATION_LIBRARY_ID='Dart%sLibraryId' % self._renamer.GetLibraryId(self._interface))
 
   def ImplementationTemplate(self):
     template = None
@@ -481,11 +490,18 @@
       return 'true'
 
   def FinishInterface(self):
+    interface = self._interface
+    if interface.parents:
+      supertype = '%sClassId' % interface.parents[0].type.id
+    else:
+      supertype = '-1'
+
     self._GenerateCPPHeader()
 
     self._cpp_impl_emitter.Emit(
         self._template_loader.Load('cpp_implementation.template'),
         INTERFACE=self._interface.id,
+        SUPER_INTERFACE=supertype,
         INCLUDES=self._GenerateCPPIncludes(self._cpp_impl_includes),
         CALLBACKS=self._cpp_definitions_emitter.Fragments(),
         RESOLVER=self._cpp_resolver_emitter.Fragments(),
@@ -589,7 +605,7 @@
       to_dart_emitter.Emit(
           '    static Dart_Handle createWrapper(DartDOMData* domData, NativeType* value)\n'
           '    {\n'
-          '        return DartDOMWrapper::createWrapper<Dart$(INTERFACE)>(domData, value);\n'
+          '        return DartDOMWrapper::createWrapper<Dart$(INTERFACE)>(domData, value, Dart$(INTERFACE)::dartClassId);\n'
           '    }\n',
           INTERFACE=self._interface.id)
 
@@ -599,9 +615,29 @@
     is_node_test = lambda interface: interface.id == 'Node'
     is_active_test = lambda interface: 'ActiveDOMObject' in interface.ext_attrs
     is_event_target_test = lambda interface: 'EventTarget' in interface.ext_attrs
+
     def TypeCheckHelper(test):
       return 'true' if any(map(test, self._database.Hierarchy(self._interface))) else 'false'
 
+    to_active_emitter = emitter.Emitter()
+    to_node_emitter = emitter.Emitter()
+    to_event_target_emitter = emitter.Emitter()
+
+    if (any(map(is_active_test, self._database.Hierarchy(self._interface)))):
+      to_active_emitter.Emit('return toNative(value);')
+    else:
+      to_active_emitter.Emit('return 0;')
+
+    if (any(map(is_node_test, self._database.Hierarchy(self._interface)))):
+      to_node_emitter.Emit('return toNative(value);')
+    else:
+      to_node_emitter.Emit('return 0;')
+
+    if (any(map(is_event_target_test, self._database.Hierarchy(self._interface)))):
+      to_event_target_emitter.Emit('return toNative(value);')
+    else:
+      to_event_target_emitter.Emit('return 0;')
+
     v8_interface_include = ''
     # V8AbstractWorker.h does not exist so we have to hard code this case.
     if self._interface.id != 'AbstractWorker':
@@ -620,6 +656,9 @@
         IS_NODE=TypeCheckHelper(is_node_test),
         IS_ACTIVE=TypeCheckHelper(is_active_test),
         IS_EVENT_TARGET=TypeCheckHelper(is_event_target_test),
+        TO_NODE=to_node_emitter.Fragments(),
+        TO_ACTIVE=to_active_emitter.Fragments(),
+        TO_EVENT_TARGET=to_event_target_emitter.Fragments(),
         TO_NATIVE=to_native_emitter.Fragments(),
         TO_DART=to_dart_emitter.Fragments())
 
@@ -1404,6 +1443,16 @@
             CLASS_NAME=os.path.splitext(os.path.basename(path))[0])
 
   def EmitClassIdTable(self, database, output_dir, type_registry, renamer):
+    def HasConverters(interface):
+      is_node_test = lambda interface: interface.id == 'Node'
+      is_active_test = lambda interface: 'ActiveDOMObject' in interface.ext_attrs
+      is_event_target_test = lambda interface: 'EventTarget' in interface.ext_attrs
+
+      return (any(map(is_node_test, database.Hierarchy(interface))) or
+              any(map(is_active_test, database.Hierarchy(interface))) or
+              any(map(is_event_target_test, database.Hierarchy(interface))))
+
+
     path = os.path.join(output_dir, 'DartWebkitClassIds.h')
     e = self._emitters.FileEmitter(path)
     e.Emit('// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file\n');
@@ -1429,25 +1478,29 @@
     e.Emit('    // New types that are not auto-generated should be added here.\n');
     e.Emit('\n');
     for interface in database.GetInterfaces():
-      interface_name = interface.id
-      e.Emit('    %sClassId,\n' % interface_name)
+      e.Emit('    %sClassId,\n' % interface.id)
     e.Emit('    NumWebkitClassIds\n');
     e.Emit('};\n');
-
-    e.Emit('typedef struct {\n');
-    e.Emit('    const char* class_name;\n');
-    e.Emit('    int library_id;\n');
-    e.Emit('    int base_class_id;\n');
-    e.Emit('    bool is_node;\n');
-    e.Emit('    bool is_active;\n');
-    e.Emit('    bool is_event;\n');
-    e.Emit('} _Classinfo;\n');
-    e.Emit('typedef _Classinfo _DartWebkitClassInfo[NumWebkitClassIds];\n');
-    e.Emit('\n');
-    e.Emit('extern _DartWebkitClassInfo DartWebkitClassInfo;\n');
-    e.Emit('\n');
-    e.Emit('} // namespace WebCore\n');
-    e.Emit('#endif // DartWebkitClassIds_h\n');
+    e.Emit('class ActiveDOMObject;\n'
+           'class EventTarget;\n'
+           'class Node;\n'
+           'typedef ActiveDOMObject* (*ToActiveDOMObject)(void* value);\n'
+           'typedef EventTarget* (*ToEventTarget)(void* value);\n'
+           'typedef Node* (*ToNode)(void* value);\n'
+           'typedef struct {\n'
+           '    const char* class_name;\n'
+           '    int library_id;\n'
+           '    int base_class_id;\n'
+           '    ToActiveDOMObject toActiveDOMObject;\n'
+           '    ToEventTarget toEventTarget;\n'
+           '    ToNode toNode;\n'
+           '} DartWrapperTypeInfo;\n'
+           'typedef DartWrapperTypeInfo _DartWebkitClassInfo[NumWebkitClassIds];\n'
+           '\n'
+           'extern _DartWebkitClassInfo DartWebkitClassInfo;\n'
+           '\n'
+           '} // namespace WebCore\n'
+           '#endif // DartWebkitClassIds_h\n');
 
     path = os.path.join(output_dir, 'DartWebkitClassIds.cpp')
     e = self._emitters.FileEmitter(path)
@@ -1457,43 +1510,77 @@
     e.Emit('// WARNING: Do not edit - generated code.\n');
     e.Emit('// See dart/tools/dom/scripts/systemnative.py\n');
     e.Emit('\n');
+    e.Emit('#include "config.h"\n');
     e.Emit('#include "DartWebkitClassIds.h"\n');
     e.Emit('\n');
     e.Emit('#include "bindings/dart/DartLibraryIds.h"\n');
-    e.Emit('\n');
-    e.Emit('namespace WebCore {\n');
-    e.Emit('\n');
-    e.Emit("_DartWebkitClassInfo DartWebkitClassInfo = {\n");
-    e.Emit('    { "_InvalidClassId", -1, -1, false, false, false },\n');
-    e.Emit('    { "_HistoryCrossFrame", DartHtmlLibraryId, -1, false, false, false },\n');
-    e.Emit('    { "_LocationCrossFrame", DartHtmlLibraryId, -1, false, false, false },\n');
-    e.Emit('    { "_DOMWindowCrossFrame", DartHtmlLibraryId, -1, false, false, true },\n');
-    e.Emit('    { "DateTime", DartCoreLibraryId, -1, false, false, false },\n');
-    e.Emit('    { "JsObject", DartJsLibraryId, -1, false, false, false },\n');
-    e.Emit('    { "JsFunction", DartJsLibraryId, _JsObjectClassId, false, false, false },\n');
-    e.Emit('    { "JsArray", DartJsLibraryId, _JsObjectClassId, false, false, false },\n');
-    e.Emit('    // New types that are not auto-generated should be added here.\n');
-    e.Emit('\n');
-    is_node_test = lambda interface: interface.id == 'Node'
-    is_active_test = lambda interface: 'ActiveDOMObject' in interface.ext_attrs
-    is_event_target_test = lambda interface: 'EventTarget' in interface.ext_attrs
-    def TypeCheckHelper(test):
-      return 'true' if any(map(test, database.Hierarchy(interface))) else 'false'
     for interface in database.GetInterfaces():
-      e.Emit("    {")
-      type_info = type_registry.TypeInfo(interface.id)
-      type_info.native_type().replace('<', '_').replace('>', '_'),
-      e.Emit(' "%s",' % type_info.implementation_name())
-      e.Emit(' Dart%sLibraryId,' % renamer.GetLibraryId(interface))
+      if HasConverters(interface):
+        e.Emit('#include "Dart%s.h"\n' % interface.id);
+    e.Emit('\n');
+
+    e.Emit('namespace WebCore {\n');
+
+    e.Emit('\n');
+
+    e.Emit('ActiveDOMObject* toNullActiveDOMObject(void* value) { return 0; }\n');
+    e.Emit('EventTarget* toNullEventTarget(void* value) { return 0; }\n');
+    e.Emit('Node* toNullNode(void* value) { return 0; }\n');
+
+    e.Emit("_DartWebkitClassInfo DartWebkitClassInfo = {\n")
+
+    e.Emit('    {\n'
+           '        "_InvalidClassId", -1, -1,\n'
+           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+           '    },\n');
+    e.Emit('    {\n'
+           '        "_HistoryCrossFrame", DartHtmlLibraryId, -1,\n'
+           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+           '    },\n');
+    e.Emit('    {\n'
+           '        "_LocationCrossFrame", DartHtmlLibraryId, -1,\n'
+           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+           '    },\n');
+    e.Emit('    {\n'
+           '        "_DOMWindowCrossFrame", DartHtmlLibraryId, -1,\n'
+           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+           '    },\n');
+    e.Emit('    {\n'
+           '        "DateTime", DartCoreLibraryId, -1,\n'
+           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+           '    },\n');
+    e.Emit('    {\n'
+           '        "JsObject", DartJsLibraryId, -1,\n'
+           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+           '    },\n');
+    e.Emit('    {\n'
+           '        "JsFunction", DartJsLibraryId, _JsObjectClassId,\n'
+           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+           '    },\n');
+    e.Emit('    {\n'
+           '        "JsArray", DartJsLibraryId, _JsObjectClassId,\n'
+           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+           '    },\n');
+    e.Emit('    // New types that are not auto-generated should be added here.\n');
+    for interface in database.GetInterfaces():
+      name = interface.id
+      type_info = type_registry.TypeInfo(name)
+      type_info.native_type().replace('<', '_').replace('>', '_')
+      e.Emit('    {\n')
+      e.Emit('        "%s", ' % type_info.implementation_name())
+      e.Emit('Dart%sLibraryId, ' % renamer.GetLibraryId(interface))
       if interface.parents:
         supertype = interface.parents[0].type.id
-        e.Emit(' %sClassId,\n' % supertype)
+        e.Emit('%sClassId,\n' % supertype)
       else:
-        e.Emit(' -1,')
-      e.Emit(" %s," % TypeCheckHelper(is_node_test))
-      e.Emit(" %s," % TypeCheckHelper(is_active_test))
-      e.Emit(" %s," % TypeCheckHelper(is_event_target_test))
-      e.Emit(" },\n")
+        e.Emit(' -1,\n')
+      if HasConverters(interface):
+        e.Emit('        Dart%s::toActiveDOMObject, Dart%s::toEventTarget,'
+               ' Dart%s::toNode\n' % (name, name, name))
+      else:
+        e.Emit('        toNullActiveDOMObject, toNullEventTarget, toNullNode\n')
+      e.Emit('    },\n')
+
     e.Emit("};\n");
     e.Emit('\n');
     e.Emit('} // namespace WebCore\n');
diff --git a/tools/dom/templates/html/dartium/cpp_header.template b/tools/dom/templates/html/dartium/cpp_header.template
index e957de6..6522325 100644
--- a/tools/dom/templates/html/dartium/cpp_header.template
+++ b/tools/dom/templates/html/dartium/cpp_header.template
@@ -18,14 +18,29 @@
 namespace WebCore {
 
 struct Dart$INTERFACE {
-    static const char* const dartImplementationClassName;
-    static const int dartImplementationLibraryId;
-    static const int dartClassId;
+    static const int dartClassId = $(INTERFACE)ClassId;
     typedef $WEBCORE_CLASS_NAME NativeType;
     static const bool isNode = $IS_NODE;
     static const bool isActive = $IS_ACTIVE;
     static const bool isEventTarget = $IS_EVENT_TARGET;
 
+    static ActiveDOMObject* toActiveDOMObject(void* value)
+    {
+        $TO_ACTIVE
+    }
+    static EventTarget* toEventTarget(void* value)
+    {
+        $TO_EVENT_TARGET
+    }
+    static Node* toNode(void* value)
+    {
+        $TO_NODE
+    }
+    static $WEBCORE_CLASS_NAME* toNative(void* value)
+    {
+        return static_cast<$WEBCORE_CLASS_NAME*>(value);
+    }
+
 $TO_NATIVE
 $TO_DART
     static Dart_Handle toDart(PassRefPtr< $WEBCORE_CLASS_NAME > value)
@@ -36,12 +51,16 @@
     {
         return createWrapper(value.get());
     }
-    static void returnToDart(Dart_NativeArguments args, PassRefPtr< $WEBCORE_CLASS_NAME > value, bool autoDartScope = true)
+    static void returnToDart(Dart_NativeArguments args,
+                             PassRefPtr< $WEBCORE_CLASS_NAME > value,
+                             bool autoDartScope = true)
     {
         return returnToDart(args, value.get(), autoDartScope);
     }
 
-    static Dart_NativeFunction resolver(Dart_Handle name, int argumentCount, bool* autoSetupScope);
+    static Dart_NativeFunction resolver(Dart_Handle name,
+                                        int argumentCount,
+                                        bool* autoSetupScope);
 };
 
 Dart_Handle $(WEBCORE_CLASS_NAME_ESCAPED)_toDart(PassRefPtr< $WEBCORE_CLASS_NAME > value);
@@ -50,6 +69,6 @@
 $DECLARATIONS
 }
 
-}
+}  // namespace WebCore
 
 #endif // Dart$(INTERFACE)_h
diff --git a/tools/dom/templates/html/dartium/cpp_implementation.template b/tools/dom/templates/html/dartium/cpp_implementation.template
index 9f978790..95cbde8 100644
--- a/tools/dom/templates/html/dartium/cpp_implementation.template
+++ b/tools/dom/templates/html/dartium/cpp_implementation.template
@@ -27,7 +27,4 @@
     return 0;
 }
 
-const char* const Dart$(INTERFACE)::dartImplementationClassName = "$DART_IMPLEMENTATION_CLASS";
-const int Dart$(INTERFACE)::dartImplementationLibraryId = $(DART_IMPLEMENTATION_LIBRARY_ID);
-const int Dart$(INTERFACE)::dartClassId = $(INTERFACE)ClassId;
-}
+}  // namespace WebCore
diff --git a/tools/dom/templates/html/impl/impl_AudioContext.darttemplate b/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
index 965b892..1d0f91e 100644
--- a/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
+++ b/tools/dom/templates/html/impl/impl_AudioContext.darttemplate
@@ -34,4 +34,18 @@
     }
   }
 $endif
+  @DomName('AudioContext.decodeAudioData')
+  Future<AudioBuffer> decodeAudioData(ByteBuffer audioData) {
+    var completer = new Completer<AudioBuffer>();
+    _decodeAudioData(audioData,
+        (value) { completer.complete(value); },
+        (error) {
+          if (error == null) {
+            completer.completeError('');
+          } else {
+            completer.completeError(error);
+          }
+        });
+    return completer.future;
+  }
 }
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index b742efd..7fd5abc 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -121,8 +121,7 @@
   }
 
   void clear() {
-    // It is unclear if we want to keep non element nodes?
-    _element.text = '';
+    _element._clearChildren();
   }
 
   Element removeAt(int index) {
diff --git a/tools/dom/templates/html/impl/impl_Node.darttemplate b/tools/dom/templates/html/impl/impl_Node.darttemplate
index bb01401..a58eefc 100644
--- a/tools/dom/templates/html/impl/impl_Node.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Node.darttemplate
@@ -138,7 +138,7 @@
   }
 
   void clear() {
-    _this.text = '';
+    _this._clearChildren();
   }
 
   void operator []=(int index, Node value) {
@@ -259,6 +259,12 @@
     }
   }
 
+  void _clearChildren() {
+    while (firstChild != null) {
+      _removeChild(firstChild);
+    }
+  }
+
   /**
    * Print out a String representation of this Node.
    */
diff --git a/tools/gyp/configurations.gypi b/tools/gyp/configurations.gypi
index 4100beb..aa3de2c 100644
--- a/tools/gyp/configurations.gypi
+++ b/tools/gyp/configurations.gypi
@@ -18,6 +18,7 @@
       ['"<(target_arch)"=="x64"', { 'dart_target_arch': 'X64', }],
       ['"<(target_arch)"=="arm"', { 'dart_target_arch': 'ARM', }],
       ['"<(target_arch)"=="simarm"', { 'dart_target_arch': 'SIMARM', }],
+      ['"<(target_arch)"=="simarm64"', { 'dart_target_arch': 'SIMARM64', }],
       ['"<(target_arch)"=="mips"', { 'dart_target_arch': 'MIPS', }],
       ['"<(target_arch)"=="simmips"', { 'dart_target_arch': 'SIMMIPS', }],
       [ 'OS=="linux"', { 'dart_target_os': 'Linux', } ],
@@ -59,6 +60,13 @@
         ]
       },
 
+      'Dart_simarm64_Base': {
+        'abstract': 1,
+        'defines': [
+          'TARGET_ARCH_ARM64',
+        ]
+      },
+
       'Dart_arm_Base': {
         'abstract': 1,
         'defines': [
@@ -150,6 +158,27 @@
         ],
       },
 
+      'DebugSIMARM64': {
+        'inherit_from': [
+          'Dart_Base', 'Dart_simarm64_Base', 'Dart_Debug',
+          'Dart_<(dart_target_os)_Base',
+          'Dart_<(dart_target_os)_simarm64_Base',
+          'Dart_<(dart_target_os)_Debug',
+        ],
+        'defines': [
+          'DEBUG',
+        ],
+      },
+
+      'ReleaseSIMARM64': {
+        'inherit_from': [
+          'Dart_Base', 'Dart_simarm64_Base', 'Dart_Release',
+          'Dart_<(dart_target_os)_Base',
+          'Dart_<(dart_target_os)_simarm64_Base',
+          'Dart_<(dart_target_os)_Release',
+        ],
+      },
+
       'DebugSIMMIPS': {
         'inherit_from': [
           'Dart_Base', 'Dart_simmips_Base', 'Dart_Debug',
diff --git a/tools/gyp/configurations_make.gypi b/tools/gyp/configurations_make.gypi
index 4f9d748..ec010c9 100644
--- a/tools/gyp/configurations_make.gypi
+++ b/tools/gyp/configurations_make.gypi
@@ -49,6 +49,15 @@
         ],
       },
 
+      'Dart_Linux_simarm64_Base': {
+        'abstract': 1,
+        'cflags': [ '-O3', '-m64', '-msse2' ],
+        'ldflags': [ '-m64', ],
+        'defines': [
+          'ARM64_FLOAT_ABI_HARD',
+        ],
+      },
+
       # ARM cross-build
       'Dart_Linux_xarm_Base': {
         'abstract': 1,
diff --git a/tools/gyp/configurations_msvs.gypi b/tools/gyp/configurations_msvs.gypi
index 130cd00..970c1ae 100644
--- a/tools/gyp/configurations_msvs.gypi
+++ b/tools/gyp/configurations_msvs.gypi
@@ -23,6 +23,9 @@
       'Dart_Win_simarm_Base': {
         'abstract': 1,
       },
+      'Dart_Win_simarm64_Base': {
+        'abstract': 1,
+      },
       'Dart_Win_simmips_Base': {
         'abstract': 1,
       },
diff --git a/tools/gyp/configurations_xcode.gypi b/tools/gyp/configurations_xcode.gypi
index 066c628..916c950 100644
--- a/tools/gyp/configurations_xcode.gypi
+++ b/tools/gyp/configurations_xcode.gypi
@@ -64,6 +64,9 @@
       'Dart_Macos_simarm_Base': {
         'abstract': 1,
       },
+      'Dart_Macos_simarm64_Base': {
+        'abstract': 1,
+      },
       'Dart_Macos_simmips_Base': {
         'abstract': 1,
       },
diff --git a/tools/status_clean.dart b/tools/status_clean.dart
index c28b1a3..18043ec 100644
--- a/tools/status_clean.dart
+++ b/tools/status_clean.dart
@@ -19,7 +19,6 @@
     ["corelib", "tests/corelib", "tests/corelib/corelib.status"],
     ["html", "tests/html", "tests/html/html.status"],
     ["isolate", "tests/isolate", "tests/isolate/isolate.status"],
-    ["json", "tests/json", "tests/json/json.status"],
     ["language", "tests/language", "tests/language/language.status"],
     ["language", "tests/language", "tests/language/language_analyzer2.status"],
     ["language","tests/language", "tests/language/language_analyzer.status"],
diff --git a/tools/test.dart b/tools/test.dart
index 3a6c14a..0c9b39b 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -58,7 +58,6 @@
     new Path('tests/corelib'),
     new Path('tests/html'),
     new Path('tests/isolate'),
-    new Path('tests/json'),
     new Path('tests/language'),
     new Path('tests/lib'),
     new Path('tests/standalone'),
diff --git a/tools/testing/dart/android.dart b/tools/testing/dart/android.dart
index 6a2fc4a..54d56ba 100644
--- a/tools/testing/dart/android.dart
+++ b/tools/testing/dart/android.dart
@@ -57,6 +57,8 @@
                     "stderr: \n ${results[1]}"
                     "exitCode: \n ${results[2]}";
         throw new Exception(error);
+      } else {
+        DebugLogger.info("Success: $executable finished");
       }
       return results[0];
     });
@@ -299,7 +301,7 @@
 }
 
 /**
- * Helper to list all adb devicess available.
+ * Helper to list all adb devices available.
  */
 class AdbHelper {
   static RegExp _deviceLineRegexp =
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 6bdc876..92166e4 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -631,7 +631,7 @@
   static const String disableScriptTimeLimit =
       'user_pref("dom.max_script_run_time", 0);';
 
-  Future _createPreferenceFile(var path) {
+  void _createPreferenceFile(var path) {
     var file = new File("${path.toString()}/user.js");
     var randomFile = file.openSync(mode: FileMode.WRITE);
     randomFile.writeStringSync(enablePopUp);
@@ -682,6 +682,8 @@
   // removed even when we have really stable system.
   BrowserTest lastTest;
   bool timeout = false;
+  Timer nextTestTimeout;
+
   BrowserTestingStatus(Browser this.browser);
 }
 
@@ -736,6 +738,9 @@
  * whenever a test completes.
  */
 class BrowserTestRunner {
+  static const int MAX_NEXT_TEST_TIMEOUTS = 10;
+  static const Duration NEXT_TEST_TIMEOUT = const Duration(seconds: 60);
+
   final Map globalConfiguration;
   final bool checkedMode; // needed for dartium
 
@@ -747,6 +752,7 @@
   int browserIdCount = 0;
 
   bool underTermination = false;
+  int numBrowserGetTestTimeouts = 0;
 
   List<BrowserTest> testQueue = new List<BrowserTest>();
   Map<String, BrowserTestingStatus> browserStatus =
@@ -793,7 +799,9 @@
           var url = testingServer.getDriverUrl(browser.id);
           var future = browser.start(url).then((success) {
             if (success) {
-              browserStatus[browser.id] = new BrowserTestingStatus(browser);
+              var status = new BrowserTestingStatus(browser);
+              browserStatus[browser.id] = status;
+              status.nextTestTimeout = createNextTestTimer(status);
             }
             return success;
           });
@@ -876,7 +884,6 @@
         throw("This should never happen, wrong test id");
       }
       testCache[testId] = status.currentTest.url;
-      Stopwatch watch = new Stopwatch()..start();
 
       // Report that the test is finished now
       var browserTestOutput = new BrowserTestOutput(
@@ -886,9 +893,9 @@
           status.browser.testBrowserOutput);
       status.currentTest.doneCallback(browserTestOutput);
 
-      watch.stop();
       status.lastTest = status.currentTest;
       status.currentTest = null;
+      status.nextTestTimeout = createNextTestTimer(status);
     } else {
       print("\nThis is bad, should never happen, handleResult no test");
       print("URL: ${status.lastTest.url}");
@@ -951,52 +958,64 @@
 
       // We don't want to start a new browser if we are terminating.
       if (underTermination) return;
-      var browser;
-      var new_id = id;
-      if (browserName == 'chromeOnAndroid') {
-        browser = new AndroidChrome(adbDeviceMapping[id]);
-      } else if (browserName == 'ContentShellOnAndroid') {
-        browser = new AndroidBrowser(adbDeviceMapping[id],
-                                     contentShellOnAndroidConfig,
-                                     checkedMode);
-      } else if (browserName == 'DartiumOnAndroid') {
-        browser = new AndroidBrowser(adbDeviceMapping[id],
-                                     dartiumOnAndroidConfig,
-                                     checkedMode);
-      } else {
-        browserStatus.remove(id);
-        browser = getInstance();
-        new_id = "BROWSER$browserIdCount";
-        browserIdCount++;
-        browserStatus[new_id] = new BrowserTestingStatus(browser);
+      restartBrowser(id);
+    });
+  }
+
+  void restartBrowser(String id) {
+    var browser;
+    var new_id = id;
+    if (browserName == 'chromeOnAndroid') {
+      browser = new AndroidChrome(adbDeviceMapping[id]);
+    } else if (browserName == 'ContentShellOnAndroid') {
+      browser = new AndroidBrowser(adbDeviceMapping[id],
+                                   contentShellOnAndroidConfig,
+                                   checkedMode);
+    } else if (browserName == 'DartiumOnAndroid') {
+      browser = new AndroidBrowser(adbDeviceMapping[id],
+                                   dartiumOnAndroidConfig,
+                                   checkedMode);
+    } else {
+      browserStatus.remove(id);
+      browser = getInstance();
+      new_id = "BROWSER$browserIdCount";
+      browserIdCount++;
+    }
+    browser.id = new_id;
+    var status = new BrowserTestingStatus(browser);
+    browserStatus[new_id] = status;
+    status.nextTestTimeout = createNextTestTimer(status);
+    browser.start(testingServer.getDriverUrl(new_id)).then((success) {
+      // We may have started terminating in the mean time.
+      if (underTermination) {
+        if (status.nextTestTimeout != null) {
+          status.nextTestTimeout.cancel();
+          status.nextTestTimeout = null;
+        }
+        browser.close().then((success) {
+         // We should never hit this, print it out.
+          if (!success) {
+            print("Could not kill browser ($id) started due to timeout");
+          }
+        });
+        return;
       }
-      browser.id = new_id;
-      browser.start(testingServer.getDriverUrl(new_id)).then((success) {
-        // We may have started terminating in the mean time.
-        if (underTermination) {
-          browser.close().then((success) {
-            // We should never hit this, print it out.
-            if (!success) {
-              print("Could not kill browser ($id) started due to timeout");
-            }
-          });
-          return;
-        }
-        if (success) {
-          browserStatus[browser.id] = new BrowserTestingStatus(browser);
-        } else {
-          // TODO(ricow): Handle this better.
-          print("This is bad, should never happen, could not start browser");
-          exit(1);
-        }
-      });
+      if (!success) {
+        // TODO(ricow): Handle this better.
+        print("This is bad, should never happen, could not start browser");
+        exit(1);
+      }
     });
   }
 
   BrowserTest getNextTest(String browserId) {
-    if (testQueue.isEmpty) return null;
     var status = browserStatus[browserId];
     if (status == null) return null;
+    if (status.nextTestTimeout != null) {
+      status.nextTestTimeout.cancel();
+      status.nextTestTimeout = null;
+    }
+    if (testQueue.isEmpty) return null;
 
     // We are currently terminating this browser, don't start a new test.
     if (status.timeout) return null;
@@ -1028,8 +1047,26 @@
   }
 
   Timer createTimeoutTimer(BrowserTest test, BrowserTestingStatus status) {
-    return new Timer(
-        new Duration(seconds: test.timeout), () { handleTimeout(status); });
+    return new Timer(new Duration(seconds: test.timeout),
+                     () { handleTimeout(status); });
+  }
+
+  Timer createNextTestTimer(BrowserTestingStatus status) {
+    return new Timer(BrowserTestRunner.NEXT_TEST_TIMEOUT,
+                     () { handleNextTestTimeout(status); });
+  }
+
+  void handleNextTestTimeout(status) {
+    DebugLogger.warning(
+        "Browser timed out before getting next test. Restarting");
+    numBrowserGetTestTimeouts++;
+    if (numBrowserGetTestTimeouts >= MAX_NEXT_TEST_TIMEOUTS) {
+      DebugLogger.error(
+          "Too many browser timeouts before getting next test. Terminating");
+      terminate().then((_) => exit(1));
+    } else {
+      status.browser.close().then((_) => restartBrowser(status.browser.id));
+    }
   }
 
   void queueTest(BrowserTest test) {
@@ -1062,6 +1099,10 @@
     testingServer.underTermination = true;
     for (BrowserTestingStatus status in browserStatus.values) {
       futures.add(status.browser.close());
+      if (status.nextTestTimeout != null) {
+        status.nextTestTimeout.cancel();
+        status.nextTestTimeout = null;
+      }
     }
     return Future.wait(futures).then((values) {
       testingServer.httpServer.close();
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 891a33b..9c7f91b 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -248,21 +248,15 @@
       CommandBuilder commandBuilder,
       List arguments,
       Map<String, String> environmentOverrides) {
-    String normalOutput = '$tempDir/out.js';
-    String cspOutput = '$tempDir/out.precompiled.js';
     return new CommandArtifact(
         <Command>[
             this.computeCompilationCommand(
-                normalOutput,
+                '$tempDir/out.js',
                 buildDir,
                 CommandBuilder.instance,
                 arguments,
                 environmentOverrides)],
-        // dart2js always produce both out.js and out.precompiled.js. To avoid
-        // recompiling the CSP version, we always tell the CompilationCommand
-        // to track the timestamp of out.js, but select which one to run based
-        // on CSP mode.
-        isCsp ? cspOutput : normalOutput,
+        '$tempDir/out.js',
         'application/javascript');
   }
 
diff --git a/tools/testing/dart/http_server.dart b/tools/testing/dart/http_server.dart
index a1e6c4d..8e942d6 100644
--- a/tools/testing/dart/http_server.dart
+++ b/tools/testing/dart/http_server.dart
@@ -97,6 +97,13 @@
     "/NonExistingFile",
     "/NonExistingFile.js",
     "/hahaURL",
+    "/UNEXISTENT",
+    "/missing.png",
+    "/NoSuchPart.dart",
+    "/Nonexistent_library.dart",
+    "/missing_file",
+    "/xxx-missing.jpeg",
+    "/does-not-exist.css"
   ];
 
   List _serverList = [];
diff --git a/tools/testing/dart/multitest.dart b/tools/testing/dart/multitest.dart
index 4116780..cc4445f 100644
--- a/tools/testing/dart/multitest.dart
+++ b/tools/testing/dart/multitest.dart
@@ -78,7 +78,8 @@
   contents = null;
   Set<String> validMultitestOutcomes = new Set<String>.from(
       ['ok', 'compile-time error', 'runtime error',
-       'static type warning', 'dynamic type error']);
+       'static type warning', 'dynamic type error',
+       'checked mode compile-time error']);
 
   List<String> testTemplate = new List<String>();
   testTemplate.add(
@@ -264,10 +265,12 @@
       bool hasRuntimeErrors = outcome.contains('runtime error');
       bool hasCompileError = outcome.contains('compile-time error');
       bool isNegativeIfChecked = outcome.contains('dynamic type error');
+      bool hasCompileErrorIfChecked = outcome.contains('checked mode compile-time error');
       doTest(multitestFilename,
              hasCompileError,
              hasRuntimeErrors,
              isNegativeIfChecked: isNegativeIfChecked,
+             hasCompileErrorIfChecked: hasCompileErrorIfChecked,
              hasStaticWarning: hasStaticWarning,
              multitestOutcome: outcome,
              multitestKey: key,
diff --git a/tools/testing/dart/scrub_status_file.dart b/tools/testing/dart/scrub_status_file.dart
deleted file mode 100644
index 4aced43..0000000
--- a/tools/testing/dart/scrub_status_file.dart
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Tool for identifying stale test lines. Used when updating co19.
- *
- * Usage:
- * [: ./tools/testing/bin/$OS/dart tools/testing/dart/scrub_status_file.dart :]
- */
-
-// TODO(ahe): Consider generalizing this.
-
-import 'dart:io';
-
-import 'status_file_parser.dart';
-
-const List<String> CO19_STATUS_FILES = const <String>[
-    'tests/co19/co19-compiler.status',
-    'tests/co19/co19-dart2dart.status',
-    'tests/co19/co19-dart2js.status',
-    'tests/co19/co19-runtime.status'];
-
-void onSectionsRead(String statusFile, List sections) {
-  for (var section in sections) {
-    for (var rule in section.testRules) {
-      String name = rule.name;
-      if (name == '*') continue;
-      String path = 'tests/co19/src/$name.dart';
-      File file = new File(path);
-      if (!file.existsSync()) {
-        print('$statusFile: $path: no such file');
-      }
-    }
-  }
-}
-
-void readStatusFile(String path) {
-  var sections = [];
-  ReadConfigurationInto(path,
-                        sections,
-                        () => onSectionsRead(path, sections));
-}
-
-void main() {
-  CO19_STATUS_FILES.forEach(readStatusFile);
-}
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index f84b3e9..15b8db2 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -10,9 +10,9 @@
 import "compiler_configuration.dart" show CompilerConfiguration;
 import "runtime_configuration.dart" show RuntimeConfiguration;
 
-List<String> defaultTestSelectors =
+const List<String> defaultTestSelectors =
     const ['samples', 'standalone', 'corelib', 'co19', 'language',
-           'isolate', 'vm', 'html', 'json', 'benchmark_smoke',
+           'isolate', 'vm', 'html', 'benchmark_smoke',
            'utils', 'lib', 'pkg', 'analyze_library'];
 
 /**
@@ -107,7 +107,8 @@
               'arch',
               'The architecture to run tests for',
               ['-a', '--arch'],
-              ['all', 'ia32', 'x64', 'simarm', 'simmips', 'arm', 'mips'],
+              ['all', 'ia32', 'x64', 'arm', 'mips',
+               'simarm', 'simarm64', 'simmips'],
               'ia32'),
           new _TestOptionSpecification(
               'system',
@@ -634,7 +635,7 @@
   List<Map> _expandConfigurations(Map configuration) {
     // Expand the pseudo-values such as 'all'.
     if (configuration['arch'] == 'all') {
-      configuration['arch'] = 'ia32,x64,simarm,simmips';
+      configuration['arch'] = 'ia32,x64,simarm,simarm64,simmips';
     }
     if (configuration['mode'] == 'all') {
       configuration['mode'] = 'debug,release';
@@ -675,7 +676,7 @@
     var selectors = configuration['selectors'];
     if (selectors is !Map) {
       if (selectors == null) {
-        selectors = new List.from(defaultTestSelectors);
+        selectors = defaultTestSelectors;
       }
       Map<String, RegExp> selectorMap = new Map<String, RegExp>();
       for (var i = 0; i < selectors.length; i++) {
diff --git a/tools/testing/dart/test_progress.dart b/tools/testing/dart/test_progress.dart
index 1564850..6bfa828 100644
--- a/tools/testing/dart/test_progress.dart
+++ b/tools/testing/dart/test_progress.dart
@@ -81,15 +81,18 @@
   output.add('Actual: ${test.result}');
   if (!test.lastCommandOutput.hasTimedOut && test.info != null) {
     if (test.commandOutputs.length != test.commands.length
-        && !test.info.hasCompileError) {
+        && !test.expectCompileError) {
       output.add('Unexpected compile-time error.');
     } else {
-      if (test.info.hasCompileError) {
+      if (test.expectCompileError) {
         output.add('Compile-time error expected.');
       }
       if (test.info.hasRuntimeError) {
         output.add('Runtime error expected.');
       }
+      if (test.configuration['checked'] && test.info.isNegativeIfChecked) {
+        output.add('Dynamic type error expected.');
+      }
     }
   }
   for (var i = 0; i < test.commands.length; i++) {
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index b5eb6f8..ed530cc 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -726,6 +726,14 @@
     }
   }
 
+  /// Returns `true` if this test case should result in a compile-time error,
+  /// either unconditionally or if the configuration is 'checked'.
+  bool get expectCompileError {
+    if (info == null) return false;
+    return info.hasCompileError ||
+        (configuration['checked'] && info.hasCompileErrorIfChecked);
+  }
+
   bool get unexpectedOutput {
     var outcome = lastCommandOutput.result(this);
     return !expectedOutcomes.any((expectation) {
@@ -1396,6 +1404,8 @@
 
     // Handle errors / missing errors
     if (testCase.info.hasCompileError) {
+      // Don't use [TestCase.expectCompileError] since the analyzer does not
+      // (currently) report checked-mode only compile time errors.
       if (errors.length > 0) {
         return Expectation.PASS;
       }
@@ -1482,7 +1492,7 @@
 
     // Multitests are handled specially
     if (testCase.info != null) {
-      if (testCase.info.hasCompileError) {
+      if (testCase.expectCompileError) {
         if (exitCode == DART_VM_EXITCODE_COMPILE_TIME_ERROR) {
           return Expectation.PASS;
         }
@@ -1539,7 +1549,7 @@
 
     // Multitests are handled specially
     if (testCase.info != null) {
-    if (testCase.info.hasCompileError) {
+    if (testCase.expectCompileError) {
         // Nonzero exit code of the compiler means compilation failed
         // TODO(kustermann): Do we have a special exit code in that case???
         if (exitCode != 0) {
@@ -2597,6 +2607,7 @@
 
   TestCaseCompleter(this.graph, this.enqueuer, this.commandQueue) {
     var eventCondition = graph.events.where;
+    bool finishedRemainingTestCases = false;
 
     // Store all the command outputs -- they will be delivered synchronously
     // (i.e. before state changes in the graph)
@@ -2604,6 +2615,7 @@
       _outputs[output.command] = output;
     }, onDone: () {
       _completeTestCasesIfPossible(new List.from(enqueuer.remainingTestCases));
+      finishedRemainingTestCases = true;
       assert(enqueuer.remainingTestCases.isEmpty);
       _checkDone();
     });
@@ -2612,7 +2624,8 @@
     // changes.
     eventCondition((event) => event is dgraph.StateChangedEvent)
         .listen((dgraph.StateChangedEvent event) {
-          if (event.from == dgraph.NodeState.Processing) {
+          if (event.from == dgraph.NodeState.Processing &&
+              !finishedRemainingTestCases ) {
             var command = event.node.userData;
 
             assert(COMPLETED_STATES.contains(event.to));
@@ -2643,7 +2656,7 @@
     }
   }
 
-  void _completeTestCasesIfPossible(Iterable<TestCase> testCases){
+  void _completeTestCasesIfPossible(Iterable<TestCase> testCases) {
     // Update TestCases with command outputs
     for (TestCase test in testCases) {
       for (var icommand in test.commands) {
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 96347c9..4a12b7a 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -48,6 +48,7 @@
                         bool hasCompileError,
                         bool hasRuntimeError,
                         {bool isNegativeIfChecked,
+                         bool hasCompileErrorIfChecked,
                          bool hasStaticWarning,
                          Set<String> multitestOutcome,
                          String multitestKey,
@@ -279,7 +280,7 @@
     if (configuration['report']) {
       SummaryReport.add(expectations);
       if (testCase.info != null &&
-          testCase.info.hasCompileError &&
+          testCase.expectCompileError &&
           TestUtils.isBrowserRuntime(configuration['runtime']) &&
           new CompilerConfiguration(configuration).hasCompiler) {
         SummaryReport.addCompileErrorSkipTest();
@@ -300,7 +301,7 @@
       String name, String dirname, Path testPath, String optionsName) {
     Path relative = testPath.relativeTo(TestUtils.dartDir());
     relative = relative.directoryPath.append(relative.filenameWithoutExtension);
-    String testUniqueName = relative.toString().replaceAll('/', '_');
+    String testUniqueName = TestUtils.getShortName(relative.toString());
     if (!optionsName.isEmpty) {
       testUniqueName = '$testUniqueName-$optionsName';
     }
@@ -342,12 +343,11 @@
   String createOutputDirectory(Path testPath, String optionsName) {
     var checked = configuration['checked'] ? '-checked' : '';
     var minified = configuration['minified'] ? '-minified' : '';
-    var csp = configuration['csp'] ? '-csp' : '';
     var sdk = configuration['use_sdk'] ? '-sdk' : '';
     var packages = configuration['use_public_packages']
         ? '-public_packages' : '';
     var dirName = "${configuration['compiler']}-${configuration['runtime']}"
-                  "$checked$minified$csp$packages$sdk";
+                  "$checked$minified$packages$sdk";
     return createGeneratedTestDirectoryHelper(
         "tests", dirName, testPath, optionsName);
   }
@@ -355,10 +355,12 @@
   String createCompilationOutputDirectory(Path testPath) {
     var checked = configuration['checked'] ? '-checked' : '';
     var minified = configuration['minified'] ? '-minified' : '';
+    var csp = configuration['csp'] ? '-csp' : '';
     var sdk = configuration['use_sdk'] ? '-sdk' : '';
     var packages = configuration['use_public_packages']
         ? '-public_packages' : '';
-    var dirName = "${configuration['compiler']}$checked$minified$packages$sdk";
+    var dirName = "${configuration['compiler']}"
+                  "$checked$minified$csp$packages$sdk";
     return createGeneratedTestDirectoryHelper(
         "compilations", dirName, testPath, "");
   }
@@ -571,13 +573,15 @@
   bool hasCompileError;
   bool hasRuntimeError;
   bool isNegativeIfChecked;
+  bool hasCompileErrorIfChecked;
   bool hasStaticWarning;
   Set<String> multitestOutcome;
   String multitestKey;
 
   TestInformation(this.filePath, this.optionsFromFile,
                   this.hasCompileError, this.hasRuntimeError,
-                  this.isNegativeIfChecked, this.hasStaticWarning,
+                  this.isNegativeIfChecked, this.hasCompileErrorIfChecked,
+                  this.hasStaticWarning,
                   this.multitestOutcome,
                   {this.multitestKey, this.originTestPath}) {
     assert(filePath.isAbsolute);
@@ -893,7 +897,7 @@
 
     Set<Expectation> expectations = testExpectations.expectations(testName);
     if (new CompilerConfiguration(configuration).hasCompiler &&
-        info.hasCompileError) {
+        expectCompileError(info)) {
       // If a compile-time error is expected, and we're testing a
       // compiler, we never need to attempt to run the program (in a
       // browser or otherwise).
@@ -949,8 +953,13 @@
     }
   }
 
+  bool expectCompileError(TestInformation info) {
+    return info.hasCompileError ||
+        (configuration['checked'] && info.hasCompileErrorIfChecked);
+  }
+
   bool isNegative(TestInformation info) {
-    bool negative = info.hasCompileError ||
+    bool negative = expectCompileError(info) ||
         (configuration['checked'] && info.isNegativeIfChecked);
     if (info.hasRuntimeError && hasRuntime) {
       negative = true;
@@ -983,7 +992,7 @@
             environmentOverrides);
     commands.addAll(compilationArtifact.commands);
 
-    if (info.hasCompileError && compilerConfiguration.hasCompiler) {
+    if (expectCompileError(info) && compilerConfiguration.hasCompiler) {
       // Do not attempt to run the compiled result. A compilation
       // error should be reported by the compilation command.
       return commands;
@@ -1014,6 +1023,7 @@
             bool hasCompileError,
             bool hasRuntimeError,
             {bool isNegativeIfChecked: false,
+             bool hasCompileErrorIfChecked: false,
              bool hasStaticWarning: false,
              Set<String> multitestOutcome: null,
              String multitestKey,
@@ -1024,6 +1034,7 @@
                                      hasCompileError,
                                      hasRuntimeError,
                                      isNegativeIfChecked,
+                                     hasCompileErrorIfChecked,
                                      hasStaticWarning,
                                      multitestOutcome,
                                      multitestKey: multitestKey,
@@ -1141,8 +1152,6 @@
 
       String dartWrapperFilename = '$tempDir/test.dart';
       String compiledDartWrapperFilename = '$compilationTempDir/test.js';
-      String precompiledDartWrapperFilename =
-          '$compilationTempDir/test.precompiled.js';
 
       String content = null;
       Path dir = filePath.directoryPath;
@@ -1191,9 +1200,6 @@
           } else {
             compiledDartWrapperFilename = '$tempDir/$nameNoExt.js';
             var jsFile = '$nameNoExt.js';
-            if (configuration['csp']) {
-              jsFile = '$nameNoExt.precompiled.js';
-            }
             htmlContents = htmlContents.replaceAll('%TEST_SCRIPTS%',
               '<script src="$jsFile"></script>');
           }
@@ -1215,9 +1221,6 @@
         String scriptPath = dartWrapperFilename;
         if (compiler != 'none') {
           scriptPath = compiledDartWrapperFilename;
-          if (configuration['csp']) {
-            scriptPath = precompiledDartWrapperFilename;
-          }
         }
         scriptPath = _createUrlPathFromFile(new Path(scriptPath));
 
@@ -1325,6 +1328,7 @@
       args.add(packageRoot);
     }
     args.add('--out=$outputFile');
+    if (configuration['csp']) args.add('--csp');
     args.add(inputFile);
     args.addAll(optionsFromFile['sharedOptions']);
     if (executable.endsWith('.dart')) {
@@ -1346,31 +1350,11 @@
     args..add('package:polymer/deploy.dart')
         ..add('--test')..add(inputFile)
         ..add('--out')..add(outputDir);
-    if (configuration['csp']) args.add('--csp');
 
     return CommandBuilder.instance.getProcessCommand(
         'polymer_deploy', dartVmBinaryFileName, args, environmentOverrides);
   }
 
-  String createGeneratedTestDirectoryHelper(
-      String name, String dirname, Path testPath, String optionsName) {
-    Path relative = testPath.relativeTo(TestUtils.dartDir());
-    relative = relative.directoryPath.append(relative.filenameWithoutExtension);
-    String testUniqueName = relative.toString().replaceAll('/', '_');
-    if (!optionsName.isEmpty) {
-      testUniqueName = '$testUniqueName-$optionsName';
-    }
-
-    Path generatedTestPath = new Path(buildDir)
-        .append('generated_$name')
-        .append(dirname)
-        .append(testUniqueName);
-
-    TestUtils.mkdirRecursive(new Path('.'), generatedTestPath);
-    return new File(generatedTestPath.toNativePath()).absolute.path
-        .replaceAll('\\', '/');
-  }
-
   String get scriptType {
     switch (configuration['compiler']) {
       case 'none':
@@ -1806,14 +1790,14 @@
           var dartBinary = new File(dartVmBinaryFileName).absolute.path;
 
           commands.add(CommandBuilder.instance.getProcessCommand(
-              "custom_build", dartBinary, ['build.dart'], null,
-              checkoutDir));
+              "custom_build", dartBinary, ['build.dart'],
+              {'PUB_CACHE': cacheDir}, checkoutDir));
 
           // We only try to deploy the application if it's a webapp.
           if (containsWebDirectory) {
             commands.add(CommandBuilder.instance.getProcessCommand(
-                 "custom_deploy", dartBinary, ['build.dart', '--deploy'], null,
-                 checkoutDir));
+                 "custom_deploy", dartBinary, ['build.dart', '--deploy'],
+                 {'PUB_CACHE': cacheDir}, checkoutDir));
           }
         } else if (containsWebDirectory)  {
           commands.add(CommandBuilder.instance.getPubCommand(
@@ -2043,7 +2027,7 @@
       'dartium',
       'ie9',
       'ie10',
-      'ie11',      
+      'ie11',
       'safari',
       'opera',
       'chrome',
@@ -2069,7 +2053,7 @@
     if (configuration['build_directory'] != '') {
       return configuration['build_directory'];
     }
-    
+
     return "${outputDir(configuration)}${configurationDir(configuration)}";
   }
 
@@ -2131,6 +2115,49 @@
     }
     return extraVmOptions;
   }
+
+  static String getShortName(String path) {
+    final PATH_REPLACEMENTS = const {
+      "tests_co19_src_WebPlatformTest1_shadow-dom_shadow-trees_":
+          "co19_shadow-trees_",
+      "tests_co19_src_WebPlatformTest1_shadow-dom_elements-and-dom-objects_":
+          "co19_shadowdom_",
+      "tests_co19_src_WebPlatformTest1_html-templates_parsing-html-"
+          "templates_additions-to-": "co19_htmltemplates_add_",
+      "tests_co19_src_WebPlatformTest1_html-templates_parsing-html-"
+          "templates_appending-to-a-template_": "co19_htmltemplates_append_",
+      "tests_co19_src_WebPlatformTest1_html-templates_parsing-html-"
+          "templates_clearing-the-stack-back-to-a-given-context_":
+          "co19_htmltemplates_clearstack_",
+      "tests_co19_src_WebPlatformTest1_html-templates_parsing-html-"
+          "templates_creating-an-element-for-the-token_":
+          "co19_htmltemplates_create_",
+      "tests_co19_src_WebPlatformTest1_html-templates_additions-to-"
+          "the-steps-to-clone-a-node_": "co19_htmltemplates_clone_",
+      "tests_co19_src_LayoutTests_fast_dom_Document_CaretRangeFromPoint_"
+      "caretRangeFromPoint-": "co19_caretrangefrompoint_",
+      "pkg_polymer_example_canonicalization_test_canonicalization": "polymer_c16n"
+    };
+
+    // Some tests are already in [build_dir]/generated_tests.
+    String GEN_TESTS = 'generated_tests/';
+    if (path.contains(GEN_TESTS)) {
+      int index = path.indexOf(GEN_TESTS) + GEN_TESTS.length;
+      path = 'multitest/${path.substring(index)}';
+    }
+    path = path.replaceAll('/', '_');
+    final int WINDOWS_SHORTEN_PATH_LIMIT = 60;
+    if (Platform.operatingSystem == 'windows' &&
+        path.length > WINDOWS_SHORTEN_PATH_LIMIT) {
+      for (var key in PATH_REPLACEMENTS.keys) {
+        if (path.startsWith(key)) {
+          path = path.replaceFirst(key, PATH_REPLACEMENTS[key]);
+          break;
+        }
+      }
+    }
+    return path;
+  }
 }
 
 class SummaryReport {
@@ -2200,5 +2227,5 @@
  * $compileErrorSkip tests are skipped on browsers due to compile-time error
 """;
     print(report);
-   }
+  }
 }
diff --git a/tools/testing/perf_testing/run_perf_tests.py b/tools/testing/perf_testing/run_perf_tests.py
index 1034e6d..194bbbc 100755
--- a/tools/testing/perf_testing/run_perf_tests.py
+++ b/tools/testing/perf_testing/run_perf_tests.py
@@ -78,6 +78,30 @@
       print stderr
     return output, stderr
 
+  def RunBrowserPerfRunnerCmd(self, browser, url_path, file_path_to_test_code,
+      trace_file, code_root=''):
+    command_list = [os.path.join(DART_REPO_LOC, utils.GetBuildRoot(
+        utils.GuessOS(), 'release', 'ia32'), 'dart-sdk', 'bin', 'dart'),
+        '--package-root=%s' % os.path.join(file_path_to_test_code, 'packages'),
+        os.path.join(file_path_to_test_code, 'packages',
+        'browser_controller', 'browser_perf_testing.dart'), '--browser',
+        browser, '--test_path=%s' % url_path]
+    if code_root != '':
+      command_list += ['--code_root=%s' % code_root]
+
+    if browser == 'dartium':
+      dartium_path = os.path.join(DART_REPO_LOC, 'client', 'tests', 'dartium')
+      if platform.system() == 'Windows':
+        dartium_path = os.path.join(dartium_path, 'chrome.exe');
+      elif platform.system() == 'Darwin':
+        dartium_path = os.path.join(dartium_path, 'Chromium.app', 'Contents',
+            'MacOS', 'Chromium')
+      else:
+        dartium_path = os.path.join(dartium_path, 'chrome')
+      command_list += ['--executable=%s' % dartium_path]
+
+    self.RunCmd(command_list, trace_file, append=True)
+
   def TimeCmd(self, cmd):
     """Determine the amount of (real) time it takes to execute a given
     command."""
@@ -176,7 +200,7 @@
       shutil.rmtree(os.path.join(os.getcwd(),
                     utils.GetBuildRoot(utils.GuessOS())),
                     onerror=TestRunner._OnRmError)
-      lines = self.RunCmd([os.path.join('.', 'tools', 'build.py'), '-m',
+      lines = self.RunCmd(['python', os.path.join('tools', 'build.py'), '-m',
                             'release', '--arch=ia32', 'create_sdk'])
 
       for line in lines:
@@ -721,16 +745,17 @@
         return
 
       # Build tests.
-      # TODO(efortuna): Make the pub functionality a separate function.
       current_path = os.getcwd()
       os.chdir(os.path.join(DART_REPO_LOC, 'samples', 'third_party',
           'dromaeo'))
-      self.test.test_runner.RunCmd([os.path.join(DART_REPO_LOC,
-          utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32'),
-          'dart-sdk', 'bin', 'pub'), 'install']) # TODO: pub upgrade?
+      # Note: This uses debug on purpose, so that we can also run performance
+      # tests on pure Dart applications in Dartium. Pub --debug simply also
+      # moves the .dart files to the build directory. To ensure effective
+      # comparison, though, ensure that minify: true is set in your transformer
+      # compilation step in your pubspec.
       stdout, _ = self.test.test_runner.RunCmd([os.path.join(DART_REPO_LOC,
           utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32'),
-          'dart-sdk', 'bin', 'pub'), 'build'])
+          'dart-sdk', 'bin', 'pub'), 'build', '--mode=debug'])
       os.chdir(current_path)
       if 'failed' in stdout:
         return
@@ -751,16 +776,9 @@
               '-dart' if version_name == 'dart_html' else '-js',
               version)])
 
-          self.test.test_runner.RunCmd(
-              [os.path.join(DART_REPO_LOC, utils.GetBuildRoot(
-               utils.GuessOS(), 'release', 'ia32'), 'dart-sdk', 'bin', 'dart'),
-               '--package-root=%s' % os.path.join(DART_REPO_LOC, 'samples',
-               'third_party', 'dromaeo', 'packages'), os.path.join(
-               DART_REPO_LOC, 'samples', 'third_party', 'dromaeo', 'packages',
-               'browser_controller', 'browser_perf_testing.dart'),
-               '--browser', browser,
-               '--test_path', url_path], self.test.trace_file,
-               append=True)
+          self.test.test_runner.RunBrowserPerfRunnerCmd(browser, url_path,
+              os.path.join(DART_REPO_LOC, 'samples', 'third_party', 'dromaeo'),
+              self.test.trace_file)
 
     @staticmethod
     def GetDromaeoUrlQuery(browser, version):
@@ -817,10 +835,121 @@
       self.CalculateGeometricMean(browser, version, revision_num)
       return upload_success
 
+class TodoMVCTester(BrowserTester):
+    @staticmethod
+    def GetVersions():
+      return ['js', 'dart2js_html', 'dart_html']
+
+    @staticmethod
+    def GetBenchmarks():
+      return ['TodoMVCstartup']
+
+class TodoMVCStartupTest(RuntimePerformanceTest):
+  """Start up TodoMVC and see how long it takes to start."""
+  def __init__(self, test_runner):
+    super(TodoMVCStartupTest, self).__init__(
+        self.Name(),
+        BrowserTester.GetBrowsers(True),
+        'browser',
+        TodoMVCTester.GetVersions(),
+        TodoMVCTester.GetBenchmarks(), test_runner,
+        self.TodoMVCStartupTester(self),
+        self.TodoMVCFileProcessor(self))
+
+  @staticmethod
+  def Name():
+    return 'todoMvcStartup'
+
+  class TodoMVCStartupTester(BrowserTester):
+    def RunTests(self):
+      """Run dromaeo in the browser."""
+      success, _, _ = self.test.test_runner.GetArchive('dartium')
+      if not success:
+        # Unable to download dartium. Try later.
+        return
+
+      dromaeo_path = os.path.join('samples', 'third_party', 'dromaeo')
+      current_path = os.getcwd()
+
+      os.chdir(os.path.join(DART_REPO_LOC, 'samples', 'third_party',
+          'todomvc_performance'))
+      self.test.test_runner.RunCmd([os.path.join(DART_REPO_LOC,
+          utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32'),
+          'dart-sdk', 'bin', 'pub'), 'build', '--mode=debug'])
+      os.chdir('js_todomvc');
+      self.test.test_runner.RunCmd([os.path.join(DART_REPO_LOC,
+          utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32'),
+          'dart-sdk', 'bin', 'pub'), 'get'])
+
+      versions = TodoMVCTester.GetVersions()
+
+      for browser in BrowserTester.GetBrowsers():
+        for version_name in versions:
+          if not self.test.IsValidCombination(browser, version_name):
+            continue
+          self.test.trace_file = os.path.join(TOP_LEVEL_DIR,
+              'tools', 'testing', 'perf_testing', self.test.result_folder_name,
+              'todoMvcStartup-%s-%s-%s' % (self.test.cur_time, browser,
+              version_name))
+          self.AddSvnRevisionToTrace(self.test.trace_file, browser)
+
+          if version_name == 'js':
+            code_root = os.path.join(DART_REPO_LOC, 'samples', 'third_party',
+                'todomvc_performance', 'js_todomvc')
+            self.test.test_runner.RunBrowserPerfRunnerCmd(browser,
+                '/code_root/index.html', code_root, self.test.trace_file,
+                code_root)
+          else:
+            self.test.test_runner.RunBrowserPerfRunnerCmd(browser,
+                '/code_root/build/web/startup-performance.html', os.path.join(
+                DART_REPO_LOC, 'samples', 'third_party', 'todomvc_performance'),
+                self.test.trace_file)
+
+  class TodoMVCFileProcessor(Processor):
+    def ProcessFile(self, afile, should_post_file):
+      """Comb through the html to find the performance results.
+      Returns: True if we successfully posted our data to storage."""
+      parts = afile.split('-')
+      browser = parts[2]
+      version = parts[3]
+
+      bench_dict = self.test.values_dict[browser][version]
+
+      f = self.OpenTraceFile(afile, should_post_file)
+      lines = f.readlines()
+      i = 0
+      revision_num = 0
+      revision_pattern = r'Revision: (\d+)'
+      result_pattern = r'The startup time is (\d+)'
+
+      upload_success = True
+      for line in lines:
+        rev = re.match(revision_pattern, line.strip().replace('"', ''))
+        if rev:
+          revision_num = int(rev.group(1))
+          continue
+
+        results = re.search(result_pattern, line)
+        if results:
+          score = float(results.group(1))
+          name = TodoMVCTester.GetBenchmarks()[0]
+          bench_dict[name] += [float(score)]
+          self.test.revision_dict[browser][version][name] += \
+              [revision_num]
+          if not self.test.test_runner.no_upload and should_post_file:
+            upload_success = upload_success and self.ReportResults(
+                name, score, browser, version, revision_num,
+                self.GetScoreType(name))
+
+      f.close()
+      self.CalculateGeometricMean(browser, version, revision_num)
+      return upload_success
+
+
 class TestBuilder(object):
   """Construct the desired test object."""
   available_suites = dict((suite.Name(), suite) for suite in [
-      DromaeoTest])
+      DromaeoTest, TodoMVCStartupTest])
 
   @staticmethod
   def MakeTest(test_name, test_runner):
diff --git a/tools/utils.py b/tools/utils.py
index 57d2c00..bbba2a4 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -220,6 +220,7 @@
   'mips': 'mips',
   'simarm': 'ia32',
   'simmips': 'ia32',
+  'simarm64': 'ia32',
 }
 
 ARCH_GUESS = GuessArchitecture()
diff --git a/utils/tests/archive/data/test-archive.tar.gz b/utils/tests/archive/data/test-archive.tar.gz
deleted file mode 100644
index a5e8336..0000000
--- a/utils/tests/archive/data/test-archive.tar.gz
+++ /dev/null
Binary files differ
diff --git a/utils/tests/archive/reader_test.dart b/utils/tests/archive/reader_test.dart
deleted file mode 100644
index e95d5dd..0000000
--- a/utils/tests/archive/reader_test.dart
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library reader_test;
-
-import 'dart:io';
-import '../../../pkg/unittest/lib/unittest.dart'
-import '../../archive/archive.dart';
-
-final String dataPath = "utils/tests/archive/data";
-
-main() {
-  test('reading a .tar.gz file', () {
-    var asyncDone = expectAsync0(() {});
-
-    var reader = new ArchiveReader();
-    reader.format.tar = true;
-    reader.filter.gzip = true;
-
-    var future = reader.openFilename("$dataPath/test-archive.tar.gz")
-      .then((input) {
-      var log = <String>[];
-      input.onEntry = (entry) => guardAsync(() {
-        log.add("Entry: ${entry.pathname}");
-        var stream = new StringInputStream(entry.openInputStream());
-        stream.onData = () => log.add("Contents: ${stream.read().trim()}");
-        stream.onClosed = () => log.add("Closed: ${entry.pathname}");
-      });
-      input.onError = registerException;
-
-      input.onClosed = () => guardAsync(() {
-        expect(log, orderedEquals([
-          "Entry: filename1",
-          "Contents: contents 1",
-          "Closed: filename1",
-
-          "Entry: filename2",
-          "Contents: contents 2",
-          "Closed: filename2",
-
-          "Entry: filename3",
-          "Contents: contents 3",
-          "Closed: filename3",
-        ]));
-      }, asyncDone);
-    });
-
-    expect(future, completes);
-  });
-
-  test('reading a .tar.gz file with readAll', () {
-    var reader = new ArchiveReader();
-    reader.format.tar = true;
-    reader.filter.gzip = true;
-
-    var future = reader.openFilename("$dataPath/test-archive.tar.gz")
-      .then((input) => input.readAll())
-      .then((entries) {
-      entries = entries
-          .map((entry) => [entry.pathname, entry.contents.trim()])
-          .toList();
-      expect(entries[0], orderedEquals(["filename1", "contents 1"]));
-      expect(entries[1], orderedEquals(["filename2", "contents 2"]));
-      expect(entries[2], orderedEquals(["filename3", "contents 3"]));
-    });
-
-    expect(future, completes);
-  });
-
-  test('reading an in-memory .tar.gz', () {
-    var asyncDone = expectAsync0(() {});
-
-    var reader = new ArchiveReader();
-    reader.format.tar = true;
-    reader.filter.gzip = true;
-
-    var future = new File("$dataPath/test-archive.tar.gz").readAsBytes()
-      .then((bytes) => reader.openData(bytes))
-      .then((input) {
-      var log = <String>[];
-      input.onEntry = (entry) => guardAsync(() {
-        log.add("Entry: ${entry.pathname}");
-        var stream = new StringInputStream(entry.openInputStream());
-        stream.onData = () => log.add("Contents: ${stream.read().trim()}");
-        stream.onClosed = () => log.add("Closed: ${entry.pathname}");
-      });
-      input.onError = registerException;
-
-      input.onClosed = () => guardAsync(() {
-        expect(log, orderedEquals([
-          "Entry: filename1",
-          "Contents: contents 1",
-          "Closed: filename1",
-
-          "Entry: filename2",
-          "Contents: contents 2",
-          "Closed: filename2",
-
-          "Entry: filename3",
-          "Contents: contents 3",
-          "Closed: filename3",
-        ]));
-      }, asyncDone);
-    });
-
-    expect(future, completes);
-  });
-
-  test("closing entries before they're read", () {
-    var asyncDone = expectAsync0(() {});
-
-    var reader = new ArchiveReader();
-    reader.format.tar = true;
-    reader.filter.gzip = true;
-
-    var future = reader.openFilename("$dataPath/test-archive.tar.gz")
-      .then((input) {
-      var log = <String>[];
-      input.onEntry = (entry) => guardAsync(() {
-        log.add("Entry: ${entry.pathname}");
-        var underlyingStream = entry.openInputStream();
-        var stream = new StringInputStream(underlyingStream);
-        stream.onData = () => log.add("Contents: ${stream.read().trim()}");
-        stream.onClosed = () => log.add("Closed: ${entry.pathname}");
-        underlyingStream.close();
-      });
-      input.onError = registerException;
-
-      input.onClosed = () => guardAsync(() {
-        expect(log, orderedEquals([
-          "Entry: filename1",
-          "Closed: filename1",
-
-          "Entry: filename2",
-          "Closed: filename2",
-
-          "Entry: filename3",
-          "Closed: filename3",
-        ]));
-      }, asyncDone);
-    });
-
-    expect(future, completes);
-  });
-
-  test("closing an archive stream before it's finished", () {
-    var asyncDone = expectAsync0(() {});
-
-    var reader = new ArchiveReader();
-    reader.format.tar = true;
-    reader.filter.gzip = true;
-
-    var future = reader.openFilename("$dataPath/test-archive.tar.gz")
-      .then((input) {
-      var count = 0;
-
-      var log = <String>[];
-      input.onEntry = (entry) => guardAsync(() {
-        count += 1;
-
-        log.add("Entry: ${entry.pathname}");
-        var underlyingStream = entry.openInputStream();
-        var stream = new StringInputStream(underlyingStream);
-        stream.onData = () => log.add("Contents: ${stream.read().trim()}");
-        stream.onClosed = () => log.add("Closed: ${entry.pathname}");
-
-        if (count == 2) {
-          input.close();
-          expect(input.closed);
-        }
-      });
-      input.onError = registerException;
-
-      input.onClosed = () {
-        expect(log, orderedEquals([
-          "Entry: filename1",
-          "Contents: contents 1",
-          "Closed: filename1",
-
-          "Entry: filename2",
-          "Closed: filename2",
-        ]));
-        asyncDone();
-      };
-    });
-
-    expect(future, completes);
-  });
-
-  test("opening a non-existent archive", () {
-    var reader = new ArchiveReader();
-    reader.format.tar = true;
-    reader.filter.gzip = true;
-
-    expect(reader.openFilename("$dataPath/non-existent.tar.gz"),
-      throwsA((e) => e is ArchiveException));
-  });
-}
-
diff --git a/utils/tests/archive/utils_test.dart b/utils/tests/archive/utils_test.dart
deleted file mode 100644
index bd51d75..0000000
--- a/utils/tests/archive/utils_test.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library utils_test;
-
-import '../../../pkg/unittest/lib/unittest.dart';
-import '../../archive/utils.dart';
-
-main() {
-  // TODO(nweiz): re-enable this once issue 4378 is fixed.
-  return;
-
-  group('attachFinalizer', () {
-    test('calls the finalizer eventually once the object is collected', () {
-      var finalized = null;
-
-      void finalizer(String data) {
-        finalized = data;
-      }
-
-      while (finalized == null) {
-        var list = [1, 2, 3];
-        attachFinalizer(list, finalizer, 'finally finalized!');
-      }
-
-      expect(finalized, equals('finally finalized!'));
-    });
-
-    test("doesn't call the finalizer while the object is in scope", () {
-      var finalized = null;
-
-      void finalizer(String data) {
-        finalized = data;
-      }
-
-      var list = [1, 2, 3];
-      attachFinalizer(list, finalizer, 'finally finalized!');
-      expect(finalized, isNull);
-    });
-  });
-}
diff --git a/utils/tests/peg/peg.status b/utils/tests/peg/peg.status
index ba6061c..24648a1 100644
--- a/utils/tests/peg/peg.status
+++ b/utils/tests/peg/peg.status
@@ -14,6 +14,9 @@
 [ $arch == simarm ]
 *: Skip
 
+[ $arch == simarm64 ]
+*: Skip
+
 [ $arch == mips ]
 *: Skip